0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/gpio/consumer.h>
0014 #include <linux/io.h>
0015 #include <linux/iopoll.h>
0016 #include <linux/mii.h>
0017 #include <linux/of_mdio.h>
0018 #include <linux/pm_runtime.h>
0019 #include <linux/phy.h>
0020 #include <linux/property.h>
0021 #include <linux/slab.h>
0022
0023 #include "dwxgmac2.h"
0024 #include "stmmac.h"
0025
0026 #define MII_BUSY 0x00000001
0027 #define MII_WRITE 0x00000002
0028 #define MII_DATA_MASK GENMASK(15, 0)
0029
0030
0031 #define MII_GMAC4_GOC_SHIFT 2
0032 #define MII_GMAC4_REG_ADDR_SHIFT 16
0033 #define MII_GMAC4_WRITE (1 << MII_GMAC4_GOC_SHIFT)
0034 #define MII_GMAC4_READ (3 << MII_GMAC4_GOC_SHIFT)
0035 #define MII_GMAC4_C45E BIT(1)
0036
0037
0038 #define MII_XGMAC_SADDR BIT(18)
0039 #define MII_XGMAC_CMD_SHIFT 16
0040 #define MII_XGMAC_WRITE (1 << MII_XGMAC_CMD_SHIFT)
0041 #define MII_XGMAC_READ (3 << MII_XGMAC_CMD_SHIFT)
0042 #define MII_XGMAC_BUSY BIT(22)
0043 #define MII_XGMAC_MAX_C22ADDR 3
0044 #define MII_XGMAC_C22P_MASK GENMASK(MII_XGMAC_MAX_C22ADDR, 0)
0045 #define MII_XGMAC_PA_SHIFT 16
0046 #define MII_XGMAC_DA_SHIFT 21
0047
0048 static int stmmac_xgmac2_c45_format(struct stmmac_priv *priv, int phyaddr,
0049 int phyreg, u32 *hw_addr)
0050 {
0051 u32 tmp;
0052
0053
0054 tmp = readl(priv->ioaddr + XGMAC_MDIO_C22P);
0055 tmp &= ~BIT(phyaddr);
0056 writel(tmp, priv->ioaddr + XGMAC_MDIO_C22P);
0057
0058 *hw_addr = (phyaddr << MII_XGMAC_PA_SHIFT) | (phyreg & 0xffff);
0059 *hw_addr |= (phyreg >> MII_DEVADDR_C45_SHIFT) << MII_XGMAC_DA_SHIFT;
0060 return 0;
0061 }
0062
0063 static int stmmac_xgmac2_c22_format(struct stmmac_priv *priv, int phyaddr,
0064 int phyreg, u32 *hw_addr)
0065 {
0066 u32 tmp;
0067
0068
0069 if (phyaddr > MII_XGMAC_MAX_C22ADDR)
0070 return -ENODEV;
0071
0072
0073 tmp = readl(priv->ioaddr + XGMAC_MDIO_C22P);
0074 tmp &= ~MII_XGMAC_C22P_MASK;
0075 tmp |= BIT(phyaddr);
0076 writel(tmp, priv->ioaddr + XGMAC_MDIO_C22P);
0077
0078 *hw_addr = (phyaddr << MII_XGMAC_PA_SHIFT) | (phyreg & 0x1f);
0079 return 0;
0080 }
0081
0082 static int stmmac_xgmac2_mdio_read(struct mii_bus *bus, int phyaddr, int phyreg)
0083 {
0084 struct net_device *ndev = bus->priv;
0085 struct stmmac_priv *priv = netdev_priv(ndev);
0086 unsigned int mii_address = priv->hw->mii.addr;
0087 unsigned int mii_data = priv->hw->mii.data;
0088 u32 tmp, addr, value = MII_XGMAC_BUSY;
0089 int ret;
0090
0091 ret = pm_runtime_resume_and_get(priv->device);
0092 if (ret < 0)
0093 return ret;
0094
0095
0096 if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
0097 !(tmp & MII_XGMAC_BUSY), 100, 10000)) {
0098 ret = -EBUSY;
0099 goto err_disable_clks;
0100 }
0101
0102 if (phyreg & MII_ADDR_C45) {
0103 phyreg &= ~MII_ADDR_C45;
0104
0105 ret = stmmac_xgmac2_c45_format(priv, phyaddr, phyreg, &addr);
0106 if (ret)
0107 goto err_disable_clks;
0108 } else {
0109 ret = stmmac_xgmac2_c22_format(priv, phyaddr, phyreg, &addr);
0110 if (ret)
0111 goto err_disable_clks;
0112
0113 value |= MII_XGMAC_SADDR;
0114 }
0115
0116 value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
0117 & priv->hw->mii.clk_csr_mask;
0118 value |= MII_XGMAC_READ;
0119
0120
0121 if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
0122 !(tmp & MII_XGMAC_BUSY), 100, 10000)) {
0123 ret = -EBUSY;
0124 goto err_disable_clks;
0125 }
0126
0127
0128 writel(addr, priv->ioaddr + mii_address);
0129 writel(value, priv->ioaddr + mii_data);
0130
0131
0132 if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
0133 !(tmp & MII_XGMAC_BUSY), 100, 10000)) {
0134 ret = -EBUSY;
0135 goto err_disable_clks;
0136 }
0137
0138
0139 ret = (int)readl(priv->ioaddr + mii_data) & GENMASK(15, 0);
0140
0141 err_disable_clks:
0142 pm_runtime_put(priv->device);
0143
0144 return ret;
0145 }
0146
0147 static int stmmac_xgmac2_mdio_write(struct mii_bus *bus, int phyaddr,
0148 int phyreg, u16 phydata)
0149 {
0150 struct net_device *ndev = bus->priv;
0151 struct stmmac_priv *priv = netdev_priv(ndev);
0152 unsigned int mii_address = priv->hw->mii.addr;
0153 unsigned int mii_data = priv->hw->mii.data;
0154 u32 addr, tmp, value = MII_XGMAC_BUSY;
0155 int ret;
0156
0157 ret = pm_runtime_resume_and_get(priv->device);
0158 if (ret < 0)
0159 return ret;
0160
0161
0162 if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
0163 !(tmp & MII_XGMAC_BUSY), 100, 10000)) {
0164 ret = -EBUSY;
0165 goto err_disable_clks;
0166 }
0167
0168 if (phyreg & MII_ADDR_C45) {
0169 phyreg &= ~MII_ADDR_C45;
0170
0171 ret = stmmac_xgmac2_c45_format(priv, phyaddr, phyreg, &addr);
0172 if (ret)
0173 goto err_disable_clks;
0174 } else {
0175 ret = stmmac_xgmac2_c22_format(priv, phyaddr, phyreg, &addr);
0176 if (ret)
0177 goto err_disable_clks;
0178
0179 value |= MII_XGMAC_SADDR;
0180 }
0181
0182 value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
0183 & priv->hw->mii.clk_csr_mask;
0184 value |= phydata;
0185 value |= MII_XGMAC_WRITE;
0186
0187
0188 if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
0189 !(tmp & MII_XGMAC_BUSY), 100, 10000)) {
0190 ret = -EBUSY;
0191 goto err_disable_clks;
0192 }
0193
0194
0195 writel(addr, priv->ioaddr + mii_address);
0196 writel(value, priv->ioaddr + mii_data);
0197
0198
0199 ret = readl_poll_timeout(priv->ioaddr + mii_data, tmp,
0200 !(tmp & MII_XGMAC_BUSY), 100, 10000);
0201
0202 err_disable_clks:
0203 pm_runtime_put(priv->device);
0204
0205 return ret;
0206 }
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218 static int stmmac_mdio_read(struct mii_bus *bus, int phyaddr, int phyreg)
0219 {
0220 struct net_device *ndev = bus->priv;
0221 struct stmmac_priv *priv = netdev_priv(ndev);
0222 unsigned int mii_address = priv->hw->mii.addr;
0223 unsigned int mii_data = priv->hw->mii.data;
0224 u32 value = MII_BUSY;
0225 int data = 0;
0226 u32 v;
0227
0228 data = pm_runtime_resume_and_get(priv->device);
0229 if (data < 0)
0230 return data;
0231
0232 value |= (phyaddr << priv->hw->mii.addr_shift)
0233 & priv->hw->mii.addr_mask;
0234 value |= (phyreg << priv->hw->mii.reg_shift) & priv->hw->mii.reg_mask;
0235 value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
0236 & priv->hw->mii.clk_csr_mask;
0237 if (priv->plat->has_gmac4) {
0238 value |= MII_GMAC4_READ;
0239 if (phyreg & MII_ADDR_C45) {
0240 value |= MII_GMAC4_C45E;
0241 value &= ~priv->hw->mii.reg_mask;
0242 value |= ((phyreg >> MII_DEVADDR_C45_SHIFT) <<
0243 priv->hw->mii.reg_shift) &
0244 priv->hw->mii.reg_mask;
0245
0246 data |= (phyreg & MII_REGADDR_C45_MASK) <<
0247 MII_GMAC4_REG_ADDR_SHIFT;
0248 }
0249 }
0250
0251 if (readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
0252 100, 10000)) {
0253 data = -EBUSY;
0254 goto err_disable_clks;
0255 }
0256
0257 writel(data, priv->ioaddr + mii_data);
0258 writel(value, priv->ioaddr + mii_address);
0259
0260 if (readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
0261 100, 10000)) {
0262 data = -EBUSY;
0263 goto err_disable_clks;
0264 }
0265
0266
0267 data = (int)readl(priv->ioaddr + mii_data) & MII_DATA_MASK;
0268
0269 err_disable_clks:
0270 pm_runtime_put(priv->device);
0271
0272 return data;
0273 }
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283 static int stmmac_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg,
0284 u16 phydata)
0285 {
0286 struct net_device *ndev = bus->priv;
0287 struct stmmac_priv *priv = netdev_priv(ndev);
0288 unsigned int mii_address = priv->hw->mii.addr;
0289 unsigned int mii_data = priv->hw->mii.data;
0290 int ret, data = phydata;
0291 u32 value = MII_BUSY;
0292 u32 v;
0293
0294 ret = pm_runtime_resume_and_get(priv->device);
0295 if (ret < 0)
0296 return ret;
0297
0298 value |= (phyaddr << priv->hw->mii.addr_shift)
0299 & priv->hw->mii.addr_mask;
0300 value |= (phyreg << priv->hw->mii.reg_shift) & priv->hw->mii.reg_mask;
0301
0302 value |= (priv->clk_csr << priv->hw->mii.clk_csr_shift)
0303 & priv->hw->mii.clk_csr_mask;
0304 if (priv->plat->has_gmac4) {
0305 value |= MII_GMAC4_WRITE;
0306 if (phyreg & MII_ADDR_C45) {
0307 value |= MII_GMAC4_C45E;
0308 value &= ~priv->hw->mii.reg_mask;
0309 value |= ((phyreg >> MII_DEVADDR_C45_SHIFT) <<
0310 priv->hw->mii.reg_shift) &
0311 priv->hw->mii.reg_mask;
0312
0313 data |= (phyreg & MII_REGADDR_C45_MASK) <<
0314 MII_GMAC4_REG_ADDR_SHIFT;
0315 }
0316 } else {
0317 value |= MII_WRITE;
0318 }
0319
0320
0321 if (readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
0322 100, 10000)) {
0323 ret = -EBUSY;
0324 goto err_disable_clks;
0325 }
0326
0327
0328 writel(data, priv->ioaddr + mii_data);
0329 writel(value, priv->ioaddr + mii_address);
0330
0331
0332 ret = readl_poll_timeout(priv->ioaddr + mii_address, v, !(v & MII_BUSY),
0333 100, 10000);
0334
0335 err_disable_clks:
0336 pm_runtime_put(priv->device);
0337
0338 return ret;
0339 }
0340
0341
0342
0343
0344
0345
0346 int stmmac_mdio_reset(struct mii_bus *bus)
0347 {
0348 #if IS_ENABLED(CONFIG_STMMAC_PLATFORM)
0349 struct net_device *ndev = bus->priv;
0350 struct stmmac_priv *priv = netdev_priv(ndev);
0351 unsigned int mii_address = priv->hw->mii.addr;
0352
0353 #ifdef CONFIG_OF
0354 if (priv->device->of_node) {
0355 struct gpio_desc *reset_gpio;
0356 u32 delays[3] = { 0, 0, 0 };
0357
0358 reset_gpio = devm_gpiod_get_optional(priv->device,
0359 "snps,reset",
0360 GPIOD_OUT_LOW);
0361 if (IS_ERR(reset_gpio))
0362 return PTR_ERR(reset_gpio);
0363
0364 device_property_read_u32_array(priv->device,
0365 "snps,reset-delays-us",
0366 delays, ARRAY_SIZE(delays));
0367
0368 if (delays[0])
0369 msleep(DIV_ROUND_UP(delays[0], 1000));
0370
0371 gpiod_set_value_cansleep(reset_gpio, 1);
0372 if (delays[1])
0373 msleep(DIV_ROUND_UP(delays[1], 1000));
0374
0375 gpiod_set_value_cansleep(reset_gpio, 0);
0376 if (delays[2])
0377 msleep(DIV_ROUND_UP(delays[2], 1000));
0378 }
0379 #endif
0380
0381
0382
0383
0384
0385
0386 if (!priv->plat->has_gmac4)
0387 writel(0, priv->ioaddr + mii_address);
0388 #endif
0389 return 0;
0390 }
0391
0392 int stmmac_xpcs_setup(struct mii_bus *bus)
0393 {
0394 struct net_device *ndev = bus->priv;
0395 struct mdio_device *mdiodev;
0396 struct stmmac_priv *priv;
0397 struct dw_xpcs *xpcs;
0398 int mode, addr;
0399
0400 priv = netdev_priv(ndev);
0401 mode = priv->plat->phy_interface;
0402
0403
0404 for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
0405 mdiodev = mdio_device_create(bus, addr);
0406 if (IS_ERR(mdiodev))
0407 continue;
0408
0409 xpcs = xpcs_create(mdiodev, mode);
0410 if (IS_ERR_OR_NULL(xpcs)) {
0411 mdio_device_free(mdiodev);
0412 continue;
0413 }
0414
0415 priv->hw->xpcs = xpcs;
0416 break;
0417 }
0418
0419 if (!priv->hw->xpcs) {
0420 dev_warn(priv->device, "No xPCS found\n");
0421 return -ENODEV;
0422 }
0423
0424 return 0;
0425 }
0426
0427
0428
0429
0430
0431
0432 int stmmac_mdio_register(struct net_device *ndev)
0433 {
0434 int err = 0;
0435 struct mii_bus *new_bus;
0436 struct stmmac_priv *priv = netdev_priv(ndev);
0437 struct fwnode_handle *fwnode = of_fwnode_handle(priv->plat->phylink_node);
0438 struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data;
0439 struct device_node *mdio_node = priv->plat->mdio_node;
0440 struct device *dev = ndev->dev.parent;
0441 struct fwnode_handle *fixed_node;
0442 int addr, found, max_addr;
0443
0444 if (!mdio_bus_data)
0445 return 0;
0446
0447 new_bus = mdiobus_alloc();
0448 if (!new_bus)
0449 return -ENOMEM;
0450
0451 if (mdio_bus_data->irqs)
0452 memcpy(new_bus->irq, mdio_bus_data->irqs, sizeof(new_bus->irq));
0453
0454 new_bus->name = "stmmac";
0455
0456 if (priv->plat->has_gmac4)
0457 new_bus->probe_capabilities = MDIOBUS_C22_C45;
0458
0459 if (priv->plat->has_xgmac) {
0460 new_bus->read = &stmmac_xgmac2_mdio_read;
0461 new_bus->write = &stmmac_xgmac2_mdio_write;
0462
0463
0464 max_addr = MII_XGMAC_MAX_C22ADDR + 1;
0465
0466
0467 if (priv->plat->phy_addr > MII_XGMAC_MAX_C22ADDR)
0468 dev_err(dev, "Unsupported phy_addr (max=%d)\n",
0469 MII_XGMAC_MAX_C22ADDR);
0470 } else {
0471 new_bus->read = &stmmac_mdio_read;
0472 new_bus->write = &stmmac_mdio_write;
0473 max_addr = PHY_MAX_ADDR;
0474 }
0475
0476 if (mdio_bus_data->needs_reset)
0477 new_bus->reset = &stmmac_mdio_reset;
0478
0479 snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%x",
0480 new_bus->name, priv->plat->bus_id);
0481 new_bus->priv = ndev;
0482 new_bus->phy_mask = mdio_bus_data->phy_mask;
0483 new_bus->parent = priv->device;
0484
0485 err = of_mdiobus_register(new_bus, mdio_node);
0486 if (err != 0) {
0487 dev_err_probe(dev, err, "Cannot register the MDIO bus\n");
0488 goto bus_register_fail;
0489 }
0490
0491
0492 if (priv->plat->has_xgmac)
0493 stmmac_xgmac2_mdio_read(new_bus, 0, MII_ADDR_C45);
0494
0495
0496 if (!fwnode)
0497 fwnode = dev_fwnode(priv->device);
0498
0499 if (fwnode) {
0500 fixed_node = fwnode_get_named_child_node(fwnode, "fixed-link");
0501 if (fixed_node) {
0502 fwnode_handle_put(fixed_node);
0503 goto bus_register_done;
0504 }
0505 }
0506
0507 if (priv->plat->phy_node || mdio_node)
0508 goto bus_register_done;
0509
0510 found = 0;
0511 for (addr = 0; addr < max_addr; addr++) {
0512 struct phy_device *phydev = mdiobus_get_phy(new_bus, addr);
0513
0514 if (!phydev)
0515 continue;
0516
0517
0518
0519
0520
0521 if (!mdio_bus_data->irqs &&
0522 (mdio_bus_data->probed_phy_irq > 0)) {
0523 new_bus->irq[addr] = mdio_bus_data->probed_phy_irq;
0524 phydev->irq = mdio_bus_data->probed_phy_irq;
0525 }
0526
0527
0528
0529
0530
0531
0532 if (priv->plat->phy_addr == -1)
0533 priv->plat->phy_addr = addr;
0534
0535 phy_attached_info(phydev);
0536 found = 1;
0537 }
0538
0539 if (!found && !mdio_node) {
0540 dev_warn(dev, "No PHY found\n");
0541 err = -ENODEV;
0542 goto no_phy_found;
0543 }
0544
0545 bus_register_done:
0546 priv->mii = new_bus;
0547
0548 return 0;
0549
0550 no_phy_found:
0551 mdiobus_unregister(new_bus);
0552 bus_register_fail:
0553 mdiobus_free(new_bus);
0554 return err;
0555 }
0556
0557
0558
0559
0560
0561
0562 int stmmac_mdio_unregister(struct net_device *ndev)
0563 {
0564 struct stmmac_priv *priv = netdev_priv(ndev);
0565
0566 if (!priv->mii)
0567 return 0;
0568
0569 if (priv->hw->xpcs) {
0570 mdio_device_free(priv->hw->xpcs->mdiodev);
0571 xpcs_destroy(priv->hw->xpcs);
0572 }
0573
0574 mdiobus_unregister(priv->mii);
0575 priv->mii->priv = NULL;
0576 mdiobus_free(priv->mii);
0577 priv->mii = NULL;
0578
0579 return 0;
0580 }