Lines Matching +full:force +full:- +full:external +full:- +full:phy

1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 2004-2008 SMSC
5 * Copyright (C) 2005-2008 ARM
42 #include <linux/phy.h>
56 #define SMSC_MDIONAME "smsc911x-mdio"
57 #define SMSC_DRV_VERSION "2008-10-21"
145 #define __smsc_shift(pdata, reg) ((reg) << ((pdata)->config.shift))
149 if (pdata->config.flags & SMSC911X_USE_32BIT) in __smsc911x_reg_read()
150 return readl(pdata->ioaddr + reg); in __smsc911x_reg_read()
152 if (pdata->config.flags & SMSC911X_USE_16BIT) in __smsc911x_reg_read()
153 return ((readw(pdata->ioaddr + reg) & 0xFFFF) | in __smsc911x_reg_read()
154 ((readw(pdata->ioaddr + reg + 2) & 0xFFFF) << 16)); in __smsc911x_reg_read()
163 if (pdata->config.flags & SMSC911X_USE_32BIT) in __smsc911x_reg_read_shift()
164 return readl(pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_read_shift()
166 if (pdata->config.flags & SMSC911X_USE_16BIT) in __smsc911x_reg_read_shift()
167 return (readw(pdata->ioaddr + in __smsc911x_reg_read_shift()
169 ((readw(pdata->ioaddr + in __smsc911x_reg_read_shift()
181 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_reg_read()
182 data = pdata->ops->reg_read(pdata, reg); in smsc911x_reg_read()
183 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_reg_read()
191 if (pdata->config.flags & SMSC911X_USE_32BIT) { in __smsc911x_reg_write()
192 writel(val, pdata->ioaddr + reg); in __smsc911x_reg_write()
196 if (pdata->config.flags & SMSC911X_USE_16BIT) { in __smsc911x_reg_write()
197 writew(val & 0xFFFF, pdata->ioaddr + reg); in __smsc911x_reg_write()
198 writew((val >> 16) & 0xFFFF, pdata->ioaddr + reg + 2); in __smsc911x_reg_write()
208 if (pdata->config.flags & SMSC911X_USE_32BIT) { in __smsc911x_reg_write_shift()
209 writel(val, pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_write_shift()
213 if (pdata->config.flags & SMSC911X_USE_16BIT) { in __smsc911x_reg_write_shift()
215 pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_write_shift()
217 pdata->ioaddr + __smsc_shift(pdata, reg + 2)); in __smsc911x_reg_write_shift()
229 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_reg_write()
230 pdata->ops->reg_write(pdata, reg, val); in smsc911x_reg_write()
231 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_reg_write()
241 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_tx_writefifo()
243 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_tx_writefifo()
244 while (wordcount--) in smsc911x_tx_writefifo()
250 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_tx_writefifo()
251 iowrite32_rep(pdata->ioaddr + TX_DATA_FIFO, buf, wordcount); in smsc911x_tx_writefifo()
255 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_tx_writefifo()
256 while (wordcount--) in smsc911x_tx_writefifo()
263 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_tx_writefifo()
266 /* Writes a packet to the TX_DATA_FIFO - shifted version */
273 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_tx_writefifo_shift()
275 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_tx_writefifo_shift()
276 while (wordcount--) in smsc911x_tx_writefifo_shift()
282 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_tx_writefifo_shift()
283 iowrite32_rep(pdata->ioaddr + __smsc_shift(pdata, in smsc911x_tx_writefifo_shift()
288 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_tx_writefifo_shift()
289 while (wordcount--) in smsc911x_tx_writefifo_shift()
297 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_tx_writefifo_shift()
307 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_rx_readfifo()
309 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_rx_readfifo()
310 while (wordcount--) in smsc911x_rx_readfifo()
316 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_rx_readfifo()
317 ioread32_rep(pdata->ioaddr + RX_DATA_FIFO, buf, wordcount); in smsc911x_rx_readfifo()
321 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_rx_readfifo()
322 while (wordcount--) in smsc911x_rx_readfifo()
329 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_rx_readfifo()
332 /* Reads a packet out of the RX_DATA_FIFO - shifted version */
339 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_rx_readfifo_shift()
341 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_rx_readfifo_shift()
342 while (wordcount--) in smsc911x_rx_readfifo_shift()
348 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_rx_readfifo_shift()
349 ioread32_rep(pdata->ioaddr + __smsc_shift(pdata, in smsc911x_rx_readfifo_shift()
354 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_rx_readfifo_shift()
355 while (wordcount--) in smsc911x_rx_readfifo_shift()
363 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_rx_readfifo_shift()
375 ret = regulator_bulk_enable(ARRAY_SIZE(pdata->supplies), in smsc911x_enable_resources()
376 pdata->supplies); in smsc911x_enable_resources()
381 if (!IS_ERR(pdata->clk)) { in smsc911x_enable_resources()
382 ret = clk_prepare_enable(pdata->clk); in smsc911x_enable_resources()
399 ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies), in smsc911x_disable_resources()
400 pdata->supplies); in smsc911x_disable_resources()
402 if (!IS_ERR(pdata->clk)) in smsc911x_disable_resources()
403 clk_disable_unprepare(pdata->clk); in smsc911x_disable_resources()
412 * these are not always-on we need to request regulators to be turned on
422 pdata->supplies[0].supply = "vdd33a"; in smsc911x_request_resources()
423 pdata->supplies[1].supply = "vddvario"; in smsc911x_request_resources()
424 ret = regulator_bulk_get(&pdev->dev, in smsc911x_request_resources()
425 ARRAY_SIZE(pdata->supplies), in smsc911x_request_resources()
426 pdata->supplies); in smsc911x_request_resources()
432 if (ret == -EPROBE_DEFER) in smsc911x_request_resources()
439 pdata->reset_gpiod = devm_gpiod_get_optional(&pdev->dev, in smsc911x_request_resources()
444 pdata->clk = clk_get(&pdev->dev, NULL); in smsc911x_request_resources()
445 if (IS_ERR(pdata->clk)) in smsc911x_request_resources()
446 dev_dbg(&pdev->dev, "couldn't get clock %li\n", in smsc911x_request_resources()
447 PTR_ERR(pdata->clk)); in smsc911x_request_resources()
462 regulator_bulk_free(ARRAY_SIZE(pdata->supplies), in smsc911x_free_resources()
463 pdata->supplies); in smsc911x_free_resources()
466 if (!IS_ERR(pdata->clk)) { in smsc911x_free_resources()
467 clk_put(pdata->clk); in smsc911x_free_resources()
468 pdata->clk = NULL; in smsc911x_free_resources()
488 return -EIO; in smsc911x_mac_complete()
508 /* Workaround for hardware read-after-write restriction */ in smsc911x_mac_read()
541 /* Workaround for hardware read-after-write restriction */ in smsc911x_mac_write()
551 /* Get a phy register */
554 struct smsc911x_data *pdata = bus->priv; in smsc911x_mii_read()
559 pm_runtime_get_sync(bus->parent); in smsc911x_mii_read()
560 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_mii_read()
565 reg = -EIO; in smsc911x_mii_read()
569 /* Set the address, index & direction (read from PHY) */ in smsc911x_mii_read()
581 reg = -EIO; in smsc911x_mii_read()
584 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_mii_read()
585 pm_runtime_put(bus->parent); in smsc911x_mii_read()
589 /* Set a phy register */
593 struct smsc911x_data *pdata = bus->priv; in smsc911x_mii_write()
598 pm_runtime_get_sync(bus->parent); in smsc911x_mii_write()
599 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_mii_write()
604 reg = -EIO; in smsc911x_mii_write()
611 /* Set the address, index & direction (write to PHY) */ in smsc911x_mii_write()
624 reg = -EIO; in smsc911x_mii_write()
627 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_mii_write()
628 pm_runtime_put(bus->parent); in smsc911x_mii_write()
632 /* Switch to external phy. Assumes tx and rx are stopped. */
637 /* Disable phy clocks to the MAC */ in smsc911x_phy_enable_external()
643 /* Switch to external phy */ in smsc911x_phy_enable_external()
647 /* Enable phy clocks to the MAC */ in smsc911x_phy_enable_external()
657 /* Autodetects and enables external phy if present on supported chips.
664 if (pdata->config.flags & SMSC911X_FORCE_INTERNAL_PHY) { in smsc911x_phy_initialise_external()
665 SMSC_TRACE(pdata, hw, "Forcing internal PHY"); in smsc911x_phy_initialise_external()
666 pdata->using_extphy = 0; in smsc911x_phy_initialise_external()
667 } else if (pdata->config.flags & SMSC911X_FORCE_EXTERNAL_PHY) { in smsc911x_phy_initialise_external()
668 SMSC_TRACE(pdata, hw, "Forcing external PHY"); in smsc911x_phy_initialise_external()
670 pdata->using_extphy = 1; in smsc911x_phy_initialise_external()
673 "HW_CFG EXT_PHY_DET set, using external PHY"); in smsc911x_phy_initialise_external()
675 pdata->using_extphy = 1; in smsc911x_phy_initialise_external()
678 "HW_CFG EXT_PHY_DET clear, using internal PHY"); in smsc911x_phy_initialise_external()
679 pdata->using_extphy = 0; in smsc911x_phy_initialise_external()
722 /* Zero-out rx packet memory */ in smsc911x_phy_check_loopbackpkt()
723 memset(pdata->loopback_rx_pkt, 0, MIN_PACKET_SIZE); in smsc911x_phy_check_loopbackpkt()
726 txcmd_a = (u32)((ulong)pdata->loopback_tx_pkt & 0x03) << 16; in smsc911x_phy_check_loopbackpkt()
735 bufp = (ulong)pdata->loopback_tx_pkt & (~0x3); in smsc911x_phy_check_loopbackpkt()
737 wrsz += (u32)((ulong)pdata->loopback_tx_pkt & 0x3); in smsc911x_phy_check_loopbackpkt()
740 pdata->ops->tx_writefifo(pdata, (unsigned int *)bufp, wrsz); in smsc911x_phy_check_loopbackpkt()
747 } while ((i--) && (!status)); in smsc911x_phy_check_loopbackpkt()
765 } while ((i--) && (!status)); in smsc911x_phy_check_loopbackpkt()
779 bufp = (ulong)pdata->loopback_rx_pkt; in smsc911x_phy_check_loopbackpkt()
781 rdsz += (u32)((ulong)pdata->loopback_rx_pkt & 0x3); in smsc911x_phy_check_loopbackpkt()
784 pdata->ops->rx_readfifo(pdata, (unsigned int *)bufp, rdsz); in smsc911x_phy_check_loopbackpkt()
794 if (pdata->loopback_tx_pkt[j] in smsc911x_phy_check_loopbackpkt()
795 != pdata->loopback_rx_pkt[j]) { in smsc911x_phy_check_loopbackpkt()
811 return -EIO; in smsc911x_phy_check_loopbackpkt()
824 } while ((i--) && (temp & PMT_CTRL_PHY_RST_)); in smsc911x_phy_reset()
827 SMSC_WARN(pdata, hw, "PHY reset failed to complete"); in smsc911x_phy_reset()
828 return -EIO; in smsc911x_phy_reset()
830 /* Extra delay required because the phy may not be completed with in smsc911x_phy_reset()
841 struct phy_device *phy_dev = dev->phydev; in smsc911x_phy_loopbacktest()
842 int result = -EIO; in smsc911x_phy_loopbacktest()
847 eth_broadcast_addr(pdata->loopback_tx_pkt); in smsc911x_phy_loopbacktest()
851 pdata->loopback_tx_pkt[i] = (char)i; in smsc911x_phy_loopbacktest()
854 pdata->loopback_tx_pkt[12] = 0x00; in smsc911x_phy_loopbacktest()
855 pdata->loopback_tx_pkt[13] = 0x00; in smsc911x_phy_loopbacktest()
858 pdata->loopback_tx_pkt[i] = (char)i; in smsc911x_phy_loopbacktest()
867 (u32)((ulong)pdata->loopback_rx_pkt & 0x03) << 8); in smsc911x_phy_loopbacktest()
870 /* Set PHY to 10/FD, no ANEG, and loopback mode */ in smsc911x_phy_loopbacktest()
871 smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr, in smsc911x_phy_loopbacktest()
875 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
878 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
884 pdata->resetcount++; in smsc911x_phy_loopbacktest()
887 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
889 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
895 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
897 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
899 /* Cancel PHY loopback mode */ in smsc911x_phy_loopbacktest()
900 smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr, MII_BMCR, 0); in smsc911x_phy_loopbacktest()
911 struct net_device *ndev = pdata->dev; in smsc911x_phy_update_flowcontrol()
912 struct phy_device *phy_dev = ndev->phydev; in smsc911x_phy_update_flowcontrol()
917 if (phy_dev->duplex == DUPLEX_FULL) { in smsc911x_phy_update_flowcontrol()
941 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_update_flowcontrol()
943 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_update_flowcontrol()
949 * PHY is in polling mode, even if nothing has changed. */
953 struct phy_device *phy_dev = dev->phydev; in smsc911x_phy_adjust_link()
957 if (phy_dev->duplex != pdata->last_duplex) { in smsc911x_phy_adjust_link()
961 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_adjust_link()
963 if (phy_dev->duplex) { in smsc911x_phy_adjust_link()
973 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_adjust_link()
976 pdata->last_duplex = phy_dev->duplex; in smsc911x_phy_adjust_link()
980 if (carrier != pdata->last_carrier) { in smsc911x_phy_adjust_link()
984 if ((pdata->gpio_orig_setting & GPIO_CFG_LED1_EN_) && in smsc911x_phy_adjust_link()
985 (!pdata->using_extphy)) { in smsc911x_phy_adjust_link()
987 pdata->gpio_setting = pdata->gpio_orig_setting; in smsc911x_phy_adjust_link()
989 pdata->gpio_setting); in smsc911x_phy_adjust_link()
995 pdata->gpio_setting = smsc911x_reg_read(pdata, in smsc911x_phy_adjust_link()
997 if ((pdata->gpio_setting & GPIO_CFG_LED1_EN_) && in smsc911x_phy_adjust_link()
998 (!pdata->using_extphy)) { in smsc911x_phy_adjust_link()
999 /* Force 10/100 LED off, after saving in smsc911x_phy_adjust_link()
1001 pdata->gpio_orig_setting = pdata->gpio_setting; in smsc911x_phy_adjust_link()
1003 pdata->gpio_setting &= ~GPIO_CFG_LED1_EN_; in smsc911x_phy_adjust_link()
1004 pdata->gpio_setting |= (GPIO_CFG_GPIOBUF0_ in smsc911x_phy_adjust_link()
1008 pdata->gpio_setting); in smsc911x_phy_adjust_link()
1011 pdata->last_carrier = carrier; in smsc911x_phy_adjust_link()
1021 /* find the first phy */ in smsc911x_mii_probe()
1022 phydev = phy_find_first(pdata->mii_bus); in smsc911x_mii_probe()
1024 netdev_err(dev, "no PHY found\n"); in smsc911x_mii_probe()
1025 return -ENODEV; in smsc911x_mii_probe()
1028 SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X", in smsc911x_mii_probe()
1029 phydev->mdio.addr, phydev->phy_id); in smsc911x_mii_probe()
1032 pdata->config.phy_interface); in smsc911x_mii_probe()
1035 netdev_err(dev, "Could not attach to PHY\n"); in smsc911x_mii_probe()
1046 pdata->last_duplex = -1; in smsc911x_mii_probe()
1047 pdata->last_carrier = -1; in smsc911x_mii_probe()
1053 return -ENODEV; in smsc911x_mii_probe()
1058 SMSC_TRACE(pdata, hw, "phy initialised successfully"); in smsc911x_mii_probe()
1067 int err = -ENXIO; in smsc911x_mii_init()
1069 pdata->mii_bus = mdiobus_alloc(); in smsc911x_mii_init()
1070 if (!pdata->mii_bus) { in smsc911x_mii_init()
1071 err = -ENOMEM; in smsc911x_mii_init()
1075 pdata->mii_bus->name = SMSC_MDIONAME; in smsc911x_mii_init()
1076 snprintf(pdata->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", in smsc911x_mii_init()
1077 pdev->name, pdev->id); in smsc911x_mii_init()
1078 pdata->mii_bus->priv = pdata; in smsc911x_mii_init()
1079 pdata->mii_bus->read = smsc911x_mii_read; in smsc911x_mii_init()
1080 pdata->mii_bus->write = smsc911x_mii_write; in smsc911x_mii_init()
1082 pdata->mii_bus->parent = &pdev->dev; in smsc911x_mii_init()
1084 switch (pdata->idrev & 0xFFFF0000) { in smsc911x_mii_init()
1089 /* External PHY supported, try to autodetect */ in smsc911x_mii_init()
1093 SMSC_TRACE(pdata, hw, "External PHY is not supported, " in smsc911x_mii_init()
1094 "using internal PHY"); in smsc911x_mii_init()
1095 pdata->using_extphy = 0; in smsc911x_mii_init()
1099 if (!pdata->using_extphy) { in smsc911x_mii_init()
1101 pdata->mii_bus->phy_mask = ~(1 << 1); in smsc911x_mii_init()
1104 if (mdiobus_register(pdata->mii_bus)) { in smsc911x_mii_init()
1109 phydev = phy_find_first(pdata->mii_bus); in smsc911x_mii_init()
1111 phydev->mac_managed_pm = true; in smsc911x_mii_init()
1116 mdiobus_free(pdata->mii_bus); in smsc911x_mii_init()
1146 dev->stats.tx_errors++; in smsc911x_tx_update_txcounters()
1148 dev->stats.tx_packets++; in smsc911x_tx_update_txcounters()
1149 dev->stats.tx_bytes += (tx_stat >> 16); in smsc911x_tx_update_txcounters()
1152 dev->stats.collisions += 16; in smsc911x_tx_update_txcounters()
1153 dev->stats.tx_aborted_errors += 1; in smsc911x_tx_update_txcounters()
1155 dev->stats.collisions += in smsc911x_tx_update_txcounters()
1159 dev->stats.tx_carrier_errors += 1; in smsc911x_tx_update_txcounters()
1161 dev->stats.collisions++; in smsc911x_tx_update_txcounters()
1162 dev->stats.tx_aborted_errors++; in smsc911x_tx_update_txcounters()
1175 dev->stats.rx_errors++; in smsc911x_rx_counterrors()
1177 dev->stats.rx_crc_errors++; in smsc911x_rx_counterrors()
1184 dev->stats.rx_length_errors++; in smsc911x_rx_counterrors()
1186 dev->stats.multicast++; in smsc911x_rx_counterrors()
1201 } while ((val & RX_DP_CTRL_RX_FFWD_) && --timeout); in smsc911x_rx_fastforward()
1207 while (pktwords--) in smsc911x_rx_fastforward()
1217 struct net_device *dev = pdata->dev; in smsc911x_poll()
1229 * stop polling then re-enable rx interrupts */ in smsc911x_poll()
1252 dev->stats.rx_dropped++; in smsc911x_poll()
1262 dev->stats.rx_dropped++; in smsc911x_poll()
1266 pdata->ops->rx_readfifo(pdata, in smsc911x_poll()
1267 (unsigned int *)skb->data, pktwords); in smsc911x_poll()
1271 skb_put(skb, pktlength - 4); in smsc911x_poll()
1272 skb->protocol = eth_type_trans(skb, dev); in smsc911x_poll()
1277 dev->stats.rx_packets++; in smsc911x_poll()
1278 dev->stats.rx_bytes += (pktlength - 4); in smsc911x_poll()
1287 * 01 00 5E 00 00 01 -> returns bit number 31 */
1302 mac_cr |= pdata->set_bits_mask; in smsc911x_rx_multicast_update()
1303 mac_cr &= ~(pdata->clear_bits_mask); in smsc911x_rx_multicast_update()
1305 smsc911x_mac_write(pdata, HASHH, pdata->hashhi); in smsc911x_rx_multicast_update()
1306 smsc911x_mac_write(pdata, HASHL, pdata->hashlo); in smsc911x_rx_multicast_update()
1308 mac_cr, pdata->hashhi, pdata->hashlo); in smsc911x_rx_multicast_update()
1317 * be modified during Rx - newer devices immediately update the in smsc911x_rx_multicast_update_workaround()
1322 spin_lock(&pdata->mac_lock); in smsc911x_rx_multicast_update_workaround()
1328 /* Perform the update - safe to do now Rx has stopped */ in smsc911x_rx_multicast_update_workaround()
1331 /* Re-enable Rx */ in smsc911x_rx_multicast_update_workaround()
1336 pdata->multicast_update_pending = 0; in smsc911x_rx_multicast_update_workaround()
1338 spin_unlock(&pdata->mac_lock); in smsc911x_rx_multicast_update_workaround()
1343 struct net_device *ndev = pdata->dev; in smsc911x_phy_general_power_up()
1344 struct phy_device *phy_dev = ndev->phydev; in smsc911x_phy_general_power_up()
1350 /* If the internal PHY is in General Power-Down mode, all, except the in smsc911x_phy_general_power_up()
1351 * management interface, is powered-down and stays in that condition as in smsc911x_phy_general_power_up()
1352 * long as Phy register bit 0.11 is HIGH. in smsc911x_phy_general_power_up()
1354 * In that case, clear the bit 0.11, so the PHY powers up and we can in smsc911x_phy_general_power_up()
1355 * access to the phy registers. in smsc911x_phy_general_power_up()
1359 SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); in smsc911x_phy_general_power_up()
1363 /* If the PHY general power-down bit is not set is not necessary to in smsc911x_phy_general_power_up()
1364 * disable the general power down-mode. in smsc911x_phy_general_power_up()
1369 SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); in smsc911x_phy_general_power_up()
1381 struct net_device *ndev = pdata->dev; in smsc911x_phy_disable_energy_detect()
1382 struct phy_device *phy_dev = ndev->phydev; in smsc911x_phy_disable_energy_detect()
1391 SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); in smsc911x_phy_disable_energy_detect()
1402 SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); in smsc911x_phy_disable_energy_detect()
1405 /* Allow PHY to wakeup */ in smsc911x_phy_disable_energy_detect()
1414 struct net_device *ndev = pdata->dev; in smsc911x_phy_enable_energy_detect()
1415 struct phy_device *phy_dev = ndev->phydev; in smsc911x_phy_enable_energy_detect()
1424 SMSC_WARN(pdata, drv, "Failed reading PHY control reg"); in smsc911x_phy_enable_energy_detect()
1435 SMSC_WARN(pdata, drv, "Failed writing PHY control reg"); in smsc911x_phy_enable_energy_detect()
1451 * Make sure to power-up the PHY chip before doing a reset, otherwise in smsc911x_soft_reset()
1456 SMSC_WARN(pdata, drv, "Failed to power-up the PHY chip"); in smsc911x_soft_reset()
1461 * LAN9210/LAN9211/LAN9220/LAN9221 chips have an internal PHY that in smsc911x_soft_reset()
1462 * are initialized in a Energy Detect Power-Down mode that prevents in smsc911x_soft_reset()
1463 * the MAC chip to be software reseted. So we have to wakeup the PHY in smsc911x_soft_reset()
1466 if (pdata->generation == 4) { in smsc911x_soft_reset()
1470 SMSC_WARN(pdata, drv, "Failed to wakeup the PHY chip"); in smsc911x_soft_reset()
1475 if ((pdata->idrev & 0xFFFF0000) == LAN9250) { in smsc911x_soft_reset()
1489 } while ((--timeout) && (temp & reset_mask)); in smsc911x_soft_reset()
1493 return -EIO; in smsc911x_soft_reset()
1496 if (pdata->generation == 4) { in smsc911x_soft_reset()
1500 SMSC_WARN(pdata, drv, "Failed to wakeup the PHY chip"); in smsc911x_soft_reset()
1544 pdata->software_irq_signal = 1; in smsc911x_irqhandler()
1554 if (pdata->multicast_update_pending) in smsc911x_irqhandler()
1575 if (likely(napi_schedule_prep(&pdata->napi))) { in smsc911x_irqhandler()
1581 __napi_schedule(&pdata->napi); in smsc911x_irqhandler()
1600 pm_runtime_get_sync(dev->dev.parent); in smsc911x_open()
1602 /* find and start the given phy */ in smsc911x_open()
1603 if (!dev->phydev) { in smsc911x_open()
1606 SMSC_WARN(pdata, probe, "Error starting phy"); in smsc911x_open()
1622 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1624 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1629 --timeout) { in smsc911x_open()
1641 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1642 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_open()
1643 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1651 if (pdata->config.irq_polarity) { in smsc911x_open()
1658 if (pdata->config.irq_type) { in smsc911x_open()
1659 SMSC_TRACE(pdata, ifup, "irq type: push-pull"); in smsc911x_open()
1667 SMSC_TRACE(pdata, ifup, "Testing irq handler using IRQ %d", dev->irq); in smsc911x_open()
1668 pdata->software_irq_signal = 0; in smsc911x_open()
1671 irq_flags = irq_get_trigger_type(dev->irq); in smsc911x_open()
1672 retval = request_irq(dev->irq, smsc911x_irqhandler, in smsc911x_open()
1673 irq_flags | IRQF_SHARED, dev->name, dev); in smsc911x_open()
1676 "Unable to claim requested irq: %d", dev->irq); in smsc911x_open()
1685 while (timeout--) { in smsc911x_open()
1686 if (pdata->software_irq_signal) in smsc911x_open()
1691 if (!pdata->software_irq_signal) { in smsc911x_open()
1693 dev->irq); in smsc911x_open()
1694 retval = -ENODEV; in smsc911x_open()
1698 dev->irq); in smsc911x_open()
1701 (unsigned long)pdata->ioaddr, dev->irq); in smsc911x_open()
1704 pdata->last_duplex = -1; in smsc911x_open()
1705 pdata->last_carrier = -1; in smsc911x_open()
1707 /* Bring the PHY up */ in smsc911x_open()
1708 phy_start(dev->phydev); in smsc911x_open()
1711 /* Preserve TX FIFO size and external PHY configuration */ in smsc911x_open()
1725 napi_enable(&pdata->napi); in smsc911x_open()
1731 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1735 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1743 free_irq(dev->irq, dev); in smsc911x_open()
1745 phy_disconnect(dev->phydev); in smsc911x_open()
1747 pm_runtime_put(dev->dev.parent); in smsc911x_open()
1764 napi_disable(&pdata->napi); in smsc911x_stop()
1767 dev->stats.rx_dropped += smsc911x_reg_read(pdata, RX_DROP); in smsc911x_stop()
1770 free_irq(dev->irq, dev); in smsc911x_stop()
1772 /* Bring the PHY down */ in smsc911x_stop()
1773 if (dev->phydev) { in smsc911x_stop()
1774 phy_stop(dev->phydev); in smsc911x_stop()
1775 phy_disconnect(dev->phydev); in smsc911x_stop()
1778 pm_runtime_put(dev->dev.parent); in smsc911x_stop()
1803 tx_cmd_a = (u32)((ulong)skb->data & 0x03) << 16; in smsc911x_hard_start_xmit()
1805 tx_cmd_a |= (unsigned int)skb->len; in smsc911x_hard_start_xmit()
1807 tx_cmd_b = ((unsigned int)skb->len) << 16; in smsc911x_hard_start_xmit()
1808 tx_cmd_b |= (unsigned int)skb->len; in smsc911x_hard_start_xmit()
1813 bufp = (ulong)skb->data & (~0x3); in smsc911x_hard_start_xmit()
1814 wrsz = (u32)skb->len + 3; in smsc911x_hard_start_xmit()
1815 wrsz += (u32)((ulong)skb->data & 0x3); in smsc911x_hard_start_xmit()
1818 pdata->ops->tx_writefifo(pdata, (unsigned int *)bufp, wrsz); in smsc911x_hard_start_xmit()
1819 freespace -= (skb->len + 32); in smsc911x_hard_start_xmit()
1842 dev->stats.rx_dropped += smsc911x_reg_read(pdata, RX_DROP); in smsc911x_get_stats()
1843 return &dev->stats; in smsc911x_get_stats()
1852 if (dev->flags & IFF_PROMISC) { in smsc911x_set_multicast_list()
1854 pdata->set_bits_mask = MAC_CR_PRMS_; in smsc911x_set_multicast_list()
1855 pdata->clear_bits_mask = (MAC_CR_MCPAS_ | MAC_CR_HPFILT_); in smsc911x_set_multicast_list()
1856 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1857 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1858 } else if (dev->flags & IFF_ALLMULTI) { in smsc911x_set_multicast_list()
1860 pdata->set_bits_mask = MAC_CR_MCPAS_; in smsc911x_set_multicast_list()
1861 pdata->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_HPFILT_); in smsc911x_set_multicast_list()
1862 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1863 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1870 pdata->set_bits_mask = MAC_CR_HPFILT_; in smsc911x_set_multicast_list()
1871 pdata->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_MCPAS_); in smsc911x_set_multicast_list()
1874 unsigned int bitnum = smsc911x_hash(ha->addr); in smsc911x_set_multicast_list()
1883 pdata->hashhi = hash_high; in smsc911x_set_multicast_list()
1884 pdata->hashlo = hash_low; in smsc911x_set_multicast_list()
1887 pdata->set_bits_mask = 0; in smsc911x_set_multicast_list()
1888 pdata->clear_bits_mask = in smsc911x_set_multicast_list()
1890 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1891 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1894 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_set_multicast_list()
1896 if (pdata->generation <= 1) { in smsc911x_set_multicast_list()
1897 /* Older hardware revision - cannot change these flags while in smsc911x_set_multicast_list()
1899 if (!pdata->multicast_update_pending) { in smsc911x_set_multicast_list()
1902 pdata->multicast_update_pending = 1; in smsc911x_set_multicast_list()
1914 /* Newer hardware revision - can write immediately */ in smsc911x_set_multicast_list()
1918 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_set_multicast_list()
1924 disable_irq(dev->irq); in smsc911x_poll_controller()
1926 enable_irq(dev->irq); in smsc911x_poll_controller()
1938 if (pdata->generation <= 1 && netif_running(dev)) in smsc911x_set_mac_address()
1939 return -EBUSY; in smsc911x_set_mac_address()
1941 if (!is_valid_ether_addr(addr->sa_data)) in smsc911x_set_mac_address()
1942 return -EADDRNOTAVAIL; in smsc911x_set_mac_address()
1944 eth_hw_addr_set(dev, addr->sa_data); in smsc911x_set_mac_address()
1946 spin_lock_irq(&pdata->mac_lock); in smsc911x_set_mac_address()
1947 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_set_mac_address()
1948 spin_unlock_irq(&pdata->mac_lock); in smsc911x_set_mac_address()
1950 netdev_info(dev, "MAC Address: %pM\n", dev->dev_addr); in smsc911x_set_mac_address()
1958 strscpy(info->driver, SMSC_CHIPNAME, sizeof(info->driver)); in smsc911x_ethtool_getdrvinfo()
1959 strscpy(info->version, SMSC_DRV_VERSION, sizeof(info->version)); in smsc911x_ethtool_getdrvinfo()
1960 strscpy(info->bus_info, dev_name(dev->dev.parent), in smsc911x_ethtool_getdrvinfo()
1961 sizeof(info->bus_info)); in smsc911x_ethtool_getdrvinfo()
1967 return pdata->msg_enable; in smsc911x_ethtool_getmsglevel()
1973 pdata->msg_enable = level; in smsc911x_ethtool_setmsglevel()
1978 return (((E2P_DATA - ID_REV) / 4 + 1) + (WUCSR - MAC_CR) + 1 + 32) * in smsc911x_ethtool_getregslen()
1987 struct phy_device *phy_dev = dev->phydev; in smsc911x_ethtool_getregs()
1993 regs->version = pdata->idrev; in smsc911x_ethtool_getregs()
1998 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_ethtool_getregs()
2000 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_ethtool_getregs()
2004 data[j++] = smsc911x_mii_read(phy_dev->mdio.bus, in smsc911x_ethtool_getregs()
2005 phy_dev->mdio.addr, i); in smsc911x_ethtool_getregs()
2024 return -EBUSY; in smsc911x_eeprom_send_cmd()
2033 } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (--timeout)); in smsc911x_eeprom_send_cmd()
2037 return -EAGAIN; in smsc911x_eeprom_send_cmd()
2042 return -EINVAL; in smsc911x_eeprom_send_cmd()
2076 /* Workaround for hardware read-after-write restriction */ in smsc911x_eeprom_write_location()
2100 len = min(eeprom->len, SMSC911X_EEPROM_SIZE); in smsc911x_ethtool_get_eeprom()
2104 eeprom->len = 0; in smsc911x_ethtool_get_eeprom()
2109 memcpy(data, &eeprom_data[eeprom->offset], len); in smsc911x_ethtool_get_eeprom()
2110 eeprom->len = len; in smsc911x_ethtool_get_eeprom()
2122 ret = smsc911x_eeprom_write_location(pdata, eeprom->offset, *data); in smsc911x_ethtool_set_eeprom()
2126 eeprom->len = 1; in smsc911x_ethtool_set_eeprom()
2161 /* copies the current mac address from hardware to dev->dev_addr */
2187 (unsigned long)pdata->ioaddr); in smsc911x_init()
2188 SMSC_TRACE(pdata, probe, "IRQ: %d", dev->irq); in smsc911x_init()
2189 SMSC_TRACE(pdata, probe, "PHY will be autodetected."); in smsc911x_init()
2191 spin_lock_init(&pdata->dev_lock); in smsc911x_init()
2192 spin_lock_init(&pdata->mac_lock); in smsc911x_init()
2194 if (pdata->ioaddr == NULL) { in smsc911x_init()
2195 SMSC_WARN(pdata, probe, "pdata->ioaddr: 0x00000000"); in smsc911x_init()
2196 return -ENODEV; in smsc911x_init()
2215 while (!(smsc911x_reg_read(pdata, PMT_CTRL) & mask) && --to) in smsc911x_init()
2220 return -ENODEV; in smsc911x_init()
2247 return -ENODEV; in smsc911x_init()
2251 pdata->generation = 0; in smsc911x_init()
2253 pdata->idrev = smsc911x_reg_read(pdata, ID_REV); in smsc911x_init()
2254 switch (pdata->idrev & 0xFFFF0000) { in smsc911x_init()
2261 pdata->generation = pdata->idrev & 0x0000FFFF; in smsc911x_init()
2269 pdata->generation = 3; in smsc911x_init()
2278 pdata->generation = 4; in smsc911x_init()
2283 pdata->idrev); in smsc911x_init()
2284 return -ENODEV; in smsc911x_init()
2289 pdata->idrev, pdata->generation); in smsc911x_init()
2291 if (pdata->generation == 0) in smsc911x_init()
2298 if (pdata->config.flags & SMSC911X_SAVE_MAC_ADDRESS) { in smsc911x_init()
2299 spin_lock_irq(&pdata->mac_lock); in smsc911x_init()
2301 spin_unlock_irq(&pdata->mac_lock); in smsc911x_init()
2306 return -ENODEV; in smsc911x_init()
2308 dev->flags |= IFF_MULTICAST; in smsc911x_init()
2309 netif_napi_add_weight(dev, &pdata->napi, smsc911x_poll, in smsc911x_init()
2311 dev->netdev_ops = &smsc911x_netdev_ops; in smsc911x_init()
2312 dev->ethtool_ops = &smsc911x_ethtool_ops; in smsc911x_init()
2327 BUG_ON(!pdata->ioaddr); in smsc911x_drv_remove()
2333 mdiobus_unregister(pdata->mii_bus); in smsc911x_drv_remove()
2334 mdiobus_free(pdata->mii_bus); in smsc911x_drv_remove()
2337 "smsc911x-memory"); in smsc911x_drv_remove()
2341 release_mem_region(res->start, resource_size(res)); in smsc911x_drv_remove()
2343 iounmap(pdata->ioaddr); in smsc911x_drv_remove()
2350 pm_runtime_disable(&pdev->dev); in smsc911x_drv_remove()
2381 config->phy_interface = phy_interface; in smsc911x_probe_config()
2383 device_get_mac_address(dev, config->mac); in smsc911x_probe_config()
2385 err = device_property_read_u32(dev, "reg-io-width", &width); in smsc911x_probe_config()
2386 if (err == -ENXIO) in smsc911x_probe_config()
2389 config->flags |= SMSC911X_USE_32BIT; in smsc911x_probe_config()
2391 config->flags |= SMSC911X_USE_16BIT; in smsc911x_probe_config()
2393 device_property_read_u32(dev, "reg-shift", &config->shift); in smsc911x_probe_config()
2395 if (device_property_present(dev, "smsc,irq-active-high")) in smsc911x_probe_config()
2396 config->irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH; in smsc911x_probe_config()
2398 if (device_property_present(dev, "smsc,irq-push-pull")) in smsc911x_probe_config()
2399 config->irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL; in smsc911x_probe_config()
2401 if (device_property_present(dev, "smsc,force-internal-phy")) in smsc911x_probe_config()
2402 config->flags |= SMSC911X_FORCE_INTERNAL_PHY; in smsc911x_probe_config()
2404 if (device_property_present(dev, "smsc,force-external-phy")) in smsc911x_probe_config()
2405 config->flags |= SMSC911X_FORCE_EXTERNAL_PHY; in smsc911x_probe_config()
2407 if (device_property_present(dev, "smsc,save-mac-address")) in smsc911x_probe_config()
2408 config->flags |= SMSC911X_SAVE_MAC_ADDRESS; in smsc911x_probe_config()
2417 struct smsc911x_platform_config *config = dev_get_platdata(&pdev->dev); in smsc911x_drv_probe()
2423 "smsc911x-memory"); in smsc911x_drv_probe()
2428 retval = -ENODEV; in smsc911x_drv_probe()
2434 if (irq == -EPROBE_DEFER) { in smsc911x_drv_probe()
2435 retval = -EPROBE_DEFER; in smsc911x_drv_probe()
2439 retval = -ENODEV; in smsc911x_drv_probe()
2443 if (!request_mem_region(res->start, res_size, SMSC_CHIPNAME)) { in smsc911x_drv_probe()
2444 retval = -EBUSY; in smsc911x_drv_probe()
2450 retval = -ENOMEM; in smsc911x_drv_probe()
2454 SET_NETDEV_DEV(dev, &pdev->dev); in smsc911x_drv_probe()
2457 dev->irq = irq; in smsc911x_drv_probe()
2458 pdata->ioaddr = ioremap(res->start, res_size); in smsc911x_drv_probe()
2459 if (!pdata->ioaddr) { in smsc911x_drv_probe()
2460 retval = -ENOMEM; in smsc911x_drv_probe()
2464 pdata->dev = dev; in smsc911x_drv_probe()
2465 pdata->msg_enable = ((1 << debug) - 1); in smsc911x_drv_probe()
2477 if (pdata->ioaddr == NULL) { in smsc911x_drv_probe()
2479 retval = -ENOMEM; in smsc911x_drv_probe()
2483 retval = smsc911x_probe_config(&pdata->config, &pdev->dev); in smsc911x_drv_probe()
2486 memcpy(&pdata->config, config, sizeof(pdata->config)); in smsc911x_drv_probe()
2495 /* assume standard, non-shifted, access to HW registers */ in smsc911x_drv_probe()
2496 pdata->ops = &standard_smsc911x_ops; in smsc911x_drv_probe()
2498 if (pdata->config.shift) in smsc911x_drv_probe()
2499 pdata->ops = &shifted_smsc911x_ops; in smsc911x_drv_probe()
2501 pm_runtime_enable(&pdev->dev); in smsc911x_drv_probe()
2502 pm_runtime_get_sync(&pdev->dev); in smsc911x_drv_probe()
2522 "Network interface: \"%s\"", dev->name); in smsc911x_drv_probe()
2525 spin_lock_irq(&pdata->mac_lock); in smsc911x_drv_probe()
2528 if (is_valid_ether_addr(dev->dev_addr)) { in smsc911x_drv_probe()
2529 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_drv_probe()
2532 } else if (is_valid_ether_addr(pdata->config.mac)) { in smsc911x_drv_probe()
2533 eth_hw_addr_set(dev, pdata->config.mac); in smsc911x_drv_probe()
2541 if (is_valid_ether_addr(dev->dev_addr)) { in smsc911x_drv_probe()
2548 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_drv_probe()
2554 spin_unlock_irq(&pdata->mac_lock); in smsc911x_drv_probe()
2555 pm_runtime_put(&pdev->dev); in smsc911x_drv_probe()
2557 netdev_info(dev, "MAC Address: %pM\n", dev->dev_addr); in smsc911x_drv_probe()
2562 pm_runtime_put(&pdev->dev); in smsc911x_drv_probe()
2563 pm_runtime_disable(&pdev->dev); in smsc911x_drv_probe()
2569 iounmap(pdata->ioaddr); in smsc911x_drv_probe()
2573 release_mem_region(res->start, resource_size(res)); in smsc911x_drv_probe()
2593 phy_stop(ndev->phydev); in smsc911x_suspend()
2596 /* enable wake on LAN, energy detection and the external PME in smsc911x_suspend()
2619 * data to the BYTE_TEST register will wake-up the device." in smsc911x_resume()
2624 * forbidden while this bit isn't set. Try for 100ms and return -EIO in smsc911x_resume()
2626 while (!(smsc911x_reg_read(pdata, PMT_CTRL) & PMT_CTRL_READY_) && --to) in smsc911x_resume()
2630 return -EIO; in smsc911x_resume()
2636 phy_start(ndev->phydev); in smsc911x_resume()