Lines Matching +full:probe +full:- +full:reset

1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 2004-2008 SMSC
5 * Copyright (C) 2005-2008 ARM
56 #define SMSC_MDIONAME "smsc911x-mdio"
57 #define SMSC_DRV_VERSION "2008-10-21"
94 /* device configuration (copied from platform_data during probe) */
138 /* Reset GPIO */
146 #define __smsc_shift(pdata, reg) ((reg) << ((pdata)->config.shift))
150 if (pdata->config.flags & SMSC911X_USE_32BIT) in __smsc911x_reg_read()
151 return readl(pdata->ioaddr + reg); in __smsc911x_reg_read()
153 if (pdata->config.flags & SMSC911X_USE_16BIT) in __smsc911x_reg_read()
154 return ((readw(pdata->ioaddr + reg) & 0xFFFF) | in __smsc911x_reg_read()
155 ((readw(pdata->ioaddr + reg + 2) & 0xFFFF) << 16)); in __smsc911x_reg_read()
164 if (pdata->config.flags & SMSC911X_USE_32BIT) in __smsc911x_reg_read_shift()
165 return readl(pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_read_shift()
167 if (pdata->config.flags & SMSC911X_USE_16BIT) in __smsc911x_reg_read_shift()
168 return (readw(pdata->ioaddr + in __smsc911x_reg_read_shift()
170 ((readw(pdata->ioaddr + in __smsc911x_reg_read_shift()
182 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_reg_read()
183 data = pdata->ops->reg_read(pdata, reg); in smsc911x_reg_read()
184 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_reg_read()
192 if (pdata->config.flags & SMSC911X_USE_32BIT) { in __smsc911x_reg_write()
193 writel(val, pdata->ioaddr + reg); in __smsc911x_reg_write()
197 if (pdata->config.flags & SMSC911X_USE_16BIT) { in __smsc911x_reg_write()
198 writew(val & 0xFFFF, pdata->ioaddr + reg); in __smsc911x_reg_write()
199 writew((val >> 16) & 0xFFFF, pdata->ioaddr + reg + 2); in __smsc911x_reg_write()
209 if (pdata->config.flags & SMSC911X_USE_32BIT) { in __smsc911x_reg_write_shift()
210 writel(val, pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_write_shift()
214 if (pdata->config.flags & SMSC911X_USE_16BIT) { in __smsc911x_reg_write_shift()
216 pdata->ioaddr + __smsc_shift(pdata, reg)); in __smsc911x_reg_write_shift()
218 pdata->ioaddr + __smsc_shift(pdata, reg + 2)); in __smsc911x_reg_write_shift()
230 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_reg_write()
231 pdata->ops->reg_write(pdata, reg, val); in smsc911x_reg_write()
232 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_reg_write()
242 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_tx_writefifo()
244 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_tx_writefifo()
245 while (wordcount--) in smsc911x_tx_writefifo()
251 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_tx_writefifo()
252 iowrite32_rep(pdata->ioaddr + TX_DATA_FIFO, buf, wordcount); in smsc911x_tx_writefifo()
256 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_tx_writefifo()
257 while (wordcount--) in smsc911x_tx_writefifo()
264 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_tx_writefifo()
267 /* Writes a packet to the TX_DATA_FIFO - shifted version */
274 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_tx_writefifo_shift()
276 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_tx_writefifo_shift()
277 while (wordcount--) in smsc911x_tx_writefifo_shift()
283 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_tx_writefifo_shift()
284 iowrite32_rep(pdata->ioaddr + __smsc_shift(pdata, in smsc911x_tx_writefifo_shift()
289 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_tx_writefifo_shift()
290 while (wordcount--) in smsc911x_tx_writefifo_shift()
298 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_tx_writefifo_shift()
308 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_rx_readfifo()
310 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_rx_readfifo()
311 while (wordcount--) in smsc911x_rx_readfifo()
317 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_rx_readfifo()
318 ioread32_rep(pdata->ioaddr + RX_DATA_FIFO, buf, wordcount); in smsc911x_rx_readfifo()
322 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_rx_readfifo()
323 while (wordcount--) in smsc911x_rx_readfifo()
330 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_rx_readfifo()
333 /* Reads a packet out of the RX_DATA_FIFO - shifted version */
340 spin_lock_irqsave(&pdata->dev_lock, flags); in smsc911x_rx_readfifo_shift()
342 if (pdata->config.flags & SMSC911X_SWAP_FIFO) { in smsc911x_rx_readfifo_shift()
343 while (wordcount--) in smsc911x_rx_readfifo_shift()
349 if (pdata->config.flags & SMSC911X_USE_32BIT) { in smsc911x_rx_readfifo_shift()
350 ioread32_rep(pdata->ioaddr + __smsc_shift(pdata, in smsc911x_rx_readfifo_shift()
355 if (pdata->config.flags & SMSC911X_USE_16BIT) { in smsc911x_rx_readfifo_shift()
356 while (wordcount--) in smsc911x_rx_readfifo_shift()
364 spin_unlock_irqrestore(&pdata->dev_lock, flags); in smsc911x_rx_readfifo_shift()
376 ret = regulator_bulk_enable(ARRAY_SIZE(pdata->supplies), in smsc911x_enable_resources()
377 pdata->supplies); in smsc911x_enable_resources()
382 if (!IS_ERR(pdata->clk)) { in smsc911x_enable_resources()
383 ret = clk_prepare_enable(pdata->clk); in smsc911x_enable_resources()
400 ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies), in smsc911x_disable_resources()
401 pdata->supplies); in smsc911x_disable_resources()
403 if (!IS_ERR(pdata->clk)) in smsc911x_disable_resources()
404 clk_disable_unprepare(pdata->clk); in smsc911x_disable_resources()
413 * these are not always-on we need to request regulators to be turned on
423 pdata->supplies[0].supply = "vdd33a"; in smsc911x_request_resources()
424 pdata->supplies[1].supply = "vddvario"; in smsc911x_request_resources()
425 ret = regulator_bulk_get(&pdev->dev, in smsc911x_request_resources()
426 ARRAY_SIZE(pdata->supplies), in smsc911x_request_resources()
427 pdata->supplies); in smsc911x_request_resources()
433 if (ret == -EPROBE_DEFER) in smsc911x_request_resources()
439 /* Request optional RESET GPIO */ in smsc911x_request_resources()
440 pdata->reset_gpiod = devm_gpiod_get_optional(&pdev->dev, in smsc911x_request_resources()
441 "reset", in smsc911x_request_resources()
445 pdata->clk = clk_get(&pdev->dev, NULL); in smsc911x_request_resources()
446 if (IS_ERR(pdata->clk)) in smsc911x_request_resources()
447 dev_dbg(&pdev->dev, "couldn't get clock %li\n", in smsc911x_request_resources()
448 PTR_ERR(pdata->clk)); in smsc911x_request_resources()
463 regulator_bulk_free(ARRAY_SIZE(pdata->supplies), in smsc911x_free_resources()
464 pdata->supplies); in smsc911x_free_resources()
467 if (!IS_ERR(pdata->clk)) { in smsc911x_free_resources()
468 clk_put(pdata->clk); in smsc911x_free_resources()
469 pdata->clk = NULL; in smsc911x_free_resources()
489 return -EIO; in smsc911x_mac_complete()
509 /* Workaround for hardware read-after-write restriction */ in smsc911x_mac_read()
542 /* Workaround for hardware read-after-write restriction */ in smsc911x_mac_write()
555 struct smsc911x_data *pdata = bus->priv; in smsc911x_mii_read()
560 pm_runtime_get_sync(bus->parent); in smsc911x_mii_read()
561 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_mii_read()
566 reg = -EIO; in smsc911x_mii_read()
582 reg = -EIO; in smsc911x_mii_read()
585 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_mii_read()
586 pm_runtime_put(bus->parent); in smsc911x_mii_read()
594 struct smsc911x_data *pdata = bus->priv; in smsc911x_mii_write()
599 pm_runtime_get_sync(bus->parent); in smsc911x_mii_write()
600 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_mii_write()
605 reg = -EIO; in smsc911x_mii_write()
625 reg = -EIO; in smsc911x_mii_write()
628 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_mii_write()
629 pm_runtime_put(bus->parent); in smsc911x_mii_write()
665 if (pdata->config.flags & SMSC911X_FORCE_INTERNAL_PHY) { in smsc911x_phy_initialise_external()
667 pdata->using_extphy = 0; in smsc911x_phy_initialise_external()
668 } else if (pdata->config.flags & SMSC911X_FORCE_EXTERNAL_PHY) { in smsc911x_phy_initialise_external()
671 pdata->using_extphy = 1; in smsc911x_phy_initialise_external()
676 pdata->using_extphy = 1; in smsc911x_phy_initialise_external()
680 pdata->using_extphy = 0; in smsc911x_phy_initialise_external()
723 /* Zero-out rx packet memory */ in smsc911x_phy_check_loopbackpkt()
724 memset(pdata->loopback_rx_pkt, 0, MIN_PACKET_SIZE); in smsc911x_phy_check_loopbackpkt()
727 txcmd_a = (u32)((ulong)pdata->loopback_tx_pkt & 0x03) << 16; in smsc911x_phy_check_loopbackpkt()
736 bufp = (ulong)pdata->loopback_tx_pkt & (~0x3); in smsc911x_phy_check_loopbackpkt()
738 wrsz += (u32)((ulong)pdata->loopback_tx_pkt & 0x3); in smsc911x_phy_check_loopbackpkt()
741 pdata->ops->tx_writefifo(pdata, (unsigned int *)bufp, wrsz); in smsc911x_phy_check_loopbackpkt()
748 } while ((i--) && (!status)); in smsc911x_phy_check_loopbackpkt()
766 } while ((i--) && (!status)); in smsc911x_phy_check_loopbackpkt()
780 bufp = (ulong)pdata->loopback_rx_pkt; in smsc911x_phy_check_loopbackpkt()
782 rdsz += (u32)((ulong)pdata->loopback_rx_pkt & 0x3); in smsc911x_phy_check_loopbackpkt()
785 pdata->ops->rx_readfifo(pdata, (unsigned int *)bufp, rdsz); in smsc911x_phy_check_loopbackpkt()
795 if (pdata->loopback_tx_pkt[j] in smsc911x_phy_check_loopbackpkt()
796 != pdata->loopback_rx_pkt[j]) { in smsc911x_phy_check_loopbackpkt()
812 return -EIO; in smsc911x_phy_check_loopbackpkt()
825 } while ((i--) && (temp & PMT_CTRL_PHY_RST_)); in smsc911x_phy_reset()
828 SMSC_WARN(pdata, hw, "PHY reset failed to complete"); in smsc911x_phy_reset()
829 return -EIO; in smsc911x_phy_reset()
832 * its reset when BMCR_RESET is cleared. Specs say 256 uS is in smsc911x_phy_reset()
842 struct phy_device *phy_dev = dev->phydev; in smsc911x_phy_loopbacktest()
843 int result = -EIO; in smsc911x_phy_loopbacktest()
848 eth_broadcast_addr(pdata->loopback_tx_pkt); in smsc911x_phy_loopbacktest()
852 pdata->loopback_tx_pkt[i] = (char)i; in smsc911x_phy_loopbacktest()
855 pdata->loopback_tx_pkt[12] = 0x00; in smsc911x_phy_loopbacktest()
856 pdata->loopback_tx_pkt[13] = 0x00; in smsc911x_phy_loopbacktest()
859 pdata->loopback_tx_pkt[i] = (char)i; in smsc911x_phy_loopbacktest()
868 (u32)((ulong)pdata->loopback_rx_pkt & 0x03) << 8); in smsc911x_phy_loopbacktest()
872 smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr, in smsc911x_phy_loopbacktest()
876 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
879 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
885 pdata->resetcount++; in smsc911x_phy_loopbacktest()
888 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
890 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
896 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
898 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_loopbacktest()
901 smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr, MII_BMCR, 0); in smsc911x_phy_loopbacktest()
912 struct net_device *ndev = pdata->dev; in smsc911x_phy_update_flowcontrol()
913 struct phy_device *phy_dev = ndev->phydev; in smsc911x_phy_update_flowcontrol()
918 if (phy_dev->duplex == DUPLEX_FULL) { in smsc911x_phy_update_flowcontrol()
942 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_update_flowcontrol()
944 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_update_flowcontrol()
954 struct phy_device *phy_dev = dev->phydev; in smsc911x_phy_adjust_link()
958 if (phy_dev->duplex != pdata->last_duplex) { in smsc911x_phy_adjust_link()
962 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_phy_adjust_link()
964 if (phy_dev->duplex) { in smsc911x_phy_adjust_link()
974 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_phy_adjust_link()
977 pdata->last_duplex = phy_dev->duplex; in smsc911x_phy_adjust_link()
981 if (carrier != pdata->last_carrier) { in smsc911x_phy_adjust_link()
985 if ((pdata->gpio_orig_setting & GPIO_CFG_LED1_EN_) && in smsc911x_phy_adjust_link()
986 (!pdata->using_extphy)) { in smsc911x_phy_adjust_link()
988 pdata->gpio_setting = pdata->gpio_orig_setting; in smsc911x_phy_adjust_link()
990 pdata->gpio_setting); in smsc911x_phy_adjust_link()
996 pdata->gpio_setting = smsc911x_reg_read(pdata, in smsc911x_phy_adjust_link()
998 if ((pdata->gpio_setting & GPIO_CFG_LED1_EN_) && in smsc911x_phy_adjust_link()
999 (!pdata->using_extphy)) { in smsc911x_phy_adjust_link()
1002 pdata->gpio_orig_setting = pdata->gpio_setting; in smsc911x_phy_adjust_link()
1004 pdata->gpio_setting &= ~GPIO_CFG_LED1_EN_; in smsc911x_phy_adjust_link()
1005 pdata->gpio_setting |= (GPIO_CFG_GPIOBUF0_ in smsc911x_phy_adjust_link()
1009 pdata->gpio_setting); in smsc911x_phy_adjust_link()
1012 pdata->last_carrier = carrier; in smsc911x_phy_adjust_link()
1023 phydev = phy_find_first(pdata->mii_bus); in smsc911x_mii_probe()
1026 return -ENODEV; in smsc911x_mii_probe()
1029 SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X", in smsc911x_mii_probe()
1030 phydev->mdio.addr, phydev->phy_id); in smsc911x_mii_probe()
1033 pdata->config.phy_interface); in smsc911x_mii_probe()
1047 pdata->last_duplex = -1; in smsc911x_mii_probe()
1048 pdata->last_carrier = -1; in smsc911x_mii_probe()
1054 return -ENODEV; in smsc911x_mii_probe()
1068 int err = -ENXIO; in smsc911x_mii_init()
1070 pdata->mii_bus = mdiobus_alloc(); in smsc911x_mii_init()
1071 if (!pdata->mii_bus) { in smsc911x_mii_init()
1072 err = -ENOMEM; in smsc911x_mii_init()
1076 pdata->mii_bus->name = SMSC_MDIONAME; in smsc911x_mii_init()
1077 snprintf(pdata->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", in smsc911x_mii_init()
1078 pdev->name, pdev->id); in smsc911x_mii_init()
1079 pdata->mii_bus->priv = pdata; in smsc911x_mii_init()
1080 pdata->mii_bus->read = smsc911x_mii_read; in smsc911x_mii_init()
1081 pdata->mii_bus->write = smsc911x_mii_write; in smsc911x_mii_init()
1083 pdata->mii_bus->parent = &pdev->dev; in smsc911x_mii_init()
1085 switch (pdata->idrev & 0xFFFF0000) { in smsc911x_mii_init()
1096 pdata->using_extphy = 0; in smsc911x_mii_init()
1100 if (!pdata->using_extphy) { in smsc911x_mii_init()
1102 pdata->mii_bus->phy_mask = ~(1 << 1); in smsc911x_mii_init()
1105 if (mdiobus_register(pdata->mii_bus)) { in smsc911x_mii_init()
1106 SMSC_WARN(pdata, probe, "Error registering mii bus"); in smsc911x_mii_init()
1110 phydev = phy_find_first(pdata->mii_bus); in smsc911x_mii_init()
1112 phydev->mac_managed_pm = true; in smsc911x_mii_init()
1117 mdiobus_free(pdata->mii_bus); in smsc911x_mii_init()
1147 dev->stats.tx_errors++; in smsc911x_tx_update_txcounters()
1149 dev->stats.tx_packets++; in smsc911x_tx_update_txcounters()
1150 dev->stats.tx_bytes += (tx_stat >> 16); in smsc911x_tx_update_txcounters()
1153 dev->stats.collisions += 16; in smsc911x_tx_update_txcounters()
1154 dev->stats.tx_aborted_errors += 1; in smsc911x_tx_update_txcounters()
1156 dev->stats.collisions += in smsc911x_tx_update_txcounters()
1160 dev->stats.tx_carrier_errors += 1; in smsc911x_tx_update_txcounters()
1162 dev->stats.collisions++; in smsc911x_tx_update_txcounters()
1163 dev->stats.tx_aborted_errors++; in smsc911x_tx_update_txcounters()
1176 dev->stats.rx_errors++; in smsc911x_rx_counterrors()
1178 dev->stats.rx_crc_errors++; in smsc911x_rx_counterrors()
1185 dev->stats.rx_length_errors++; in smsc911x_rx_counterrors()
1187 dev->stats.multicast++; in smsc911x_rx_counterrors()
1202 } while ((val & RX_DP_CTRL_RX_FFWD_) && --timeout); in smsc911x_rx_fastforward()
1208 while (pktwords--) in smsc911x_rx_fastforward()
1218 struct net_device *dev = pdata->dev; in smsc911x_poll()
1230 * stop polling then re-enable rx interrupts */ in smsc911x_poll()
1253 dev->stats.rx_dropped++; in smsc911x_poll()
1263 dev->stats.rx_dropped++; in smsc911x_poll()
1267 pdata->ops->rx_readfifo(pdata, in smsc911x_poll()
1268 (unsigned int *)skb->data, pktwords); in smsc911x_poll()
1272 skb_put(skb, pktlength - 4); in smsc911x_poll()
1273 skb->protocol = eth_type_trans(skb, dev); in smsc911x_poll()
1278 dev->stats.rx_packets++; in smsc911x_poll()
1279 dev->stats.rx_bytes += (pktlength - 4); in smsc911x_poll()
1288 * 01 00 5E 00 00 01 -> returns bit number 31 */
1303 mac_cr |= pdata->set_bits_mask; in smsc911x_rx_multicast_update()
1304 mac_cr &= ~(pdata->clear_bits_mask); in smsc911x_rx_multicast_update()
1306 smsc911x_mac_write(pdata, HASHH, pdata->hashhi); in smsc911x_rx_multicast_update()
1307 smsc911x_mac_write(pdata, HASHL, pdata->hashlo); in smsc911x_rx_multicast_update()
1309 mac_cr, pdata->hashhi, pdata->hashlo); in smsc911x_rx_multicast_update()
1318 * be modified during Rx - newer devices immediately update the in smsc911x_rx_multicast_update_workaround()
1323 spin_lock(&pdata->mac_lock); in smsc911x_rx_multicast_update_workaround()
1329 /* Perform the update - safe to do now Rx has stopped */ in smsc911x_rx_multicast_update_workaround()
1332 /* Re-enable Rx */ in smsc911x_rx_multicast_update_workaround()
1337 pdata->multicast_update_pending = 0; in smsc911x_rx_multicast_update_workaround()
1339 spin_unlock(&pdata->mac_lock); in smsc911x_rx_multicast_update_workaround()
1344 struct net_device *ndev = pdata->dev; in smsc911x_phy_general_power_up()
1345 struct phy_device *phy_dev = ndev->phydev; in smsc911x_phy_general_power_up()
1351 /* If the internal PHY is in General Power-Down mode, all, except the in smsc911x_phy_general_power_up()
1352 * management interface, is powered-down and stays in that condition as in smsc911x_phy_general_power_up()
1364 /* If the PHY general power-down bit is not set is not necessary to in smsc911x_phy_general_power_up()
1365 * disable the general power down-mode. in smsc911x_phy_general_power_up()
1382 struct net_device *ndev = pdata->dev; in smsc911x_phy_disable_energy_detect()
1383 struct phy_device *phy_dev = ndev->phydev; in smsc911x_phy_disable_energy_detect()
1415 struct net_device *ndev = pdata->dev; in smsc911x_phy_enable_energy_detect()
1416 struct phy_device *phy_dev = ndev->phydev; in smsc911x_phy_enable_energy_detect()
1452 * Make sure to power-up the PHY chip before doing a reset, otherwise in smsc911x_soft_reset()
1453 * the reset fails. in smsc911x_soft_reset()
1457 SMSC_WARN(pdata, drv, "Failed to power-up the PHY chip"); in smsc911x_soft_reset()
1463 * are initialized in a Energy Detect Power-Down mode that prevents in smsc911x_soft_reset()
1467 if (pdata->generation == 4) { in smsc911x_soft_reset()
1476 if ((pdata->idrev & 0xFFFF0000) == LAN9250) { in smsc911x_soft_reset()
1477 /* special reset for LAN9250 */ in smsc911x_soft_reset()
1482 /* Reset the LAN911x */ in smsc911x_soft_reset()
1485 /* verify reset bit is cleared */ in smsc911x_soft_reset()
1490 } while ((--timeout) && (temp & reset_mask)); in smsc911x_soft_reset()
1493 SMSC_WARN(pdata, drv, "Failed to complete reset"); in smsc911x_soft_reset()
1494 return -EIO; in smsc911x_soft_reset()
1497 if (pdata->generation == 4) { in smsc911x_soft_reset()
1545 pdata->software_irq_signal = 1; in smsc911x_irqhandler()
1555 if (pdata->multicast_update_pending) in smsc911x_irqhandler()
1576 if (likely(napi_schedule_prep(&pdata->napi))) { in smsc911x_irqhandler()
1582 __napi_schedule(&pdata->napi); in smsc911x_irqhandler()
1601 pm_runtime_get_sync(dev->dev.parent); in smsc911x_open()
1604 if (!dev->phydev) { in smsc911x_open()
1607 SMSC_WARN(pdata, probe, "Error starting phy"); in smsc911x_open()
1612 /* Reset the LAN911x */ in smsc911x_open()
1615 SMSC_WARN(pdata, hw, "soft reset failed"); in smsc911x_open()
1623 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1625 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1630 --timeout) { in smsc911x_open()
1640 /* The soft reset above cleared the device's MAC address, in smsc911x_open()
1641 * restore it from local copy (set in probe) */ in smsc911x_open()
1642 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1643 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_open()
1644 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1652 if (pdata->config.irq_polarity) { in smsc911x_open()
1659 if (pdata->config.irq_type) { in smsc911x_open()
1660 SMSC_TRACE(pdata, ifup, "irq type: push-pull"); in smsc911x_open()
1668 SMSC_TRACE(pdata, ifup, "Testing irq handler using IRQ %d", dev->irq); in smsc911x_open()
1669 pdata->software_irq_signal = 0; in smsc911x_open()
1672 irq_flags = irq_get_trigger_type(dev->irq); in smsc911x_open()
1673 retval = request_irq(dev->irq, smsc911x_irqhandler, in smsc911x_open()
1674 irq_flags | IRQF_SHARED, dev->name, dev); in smsc911x_open()
1676 SMSC_WARN(pdata, probe, in smsc911x_open()
1677 "Unable to claim requested irq: %d", dev->irq); in smsc911x_open()
1686 while (timeout--) { in smsc911x_open()
1687 if (pdata->software_irq_signal) in smsc911x_open()
1692 if (!pdata->software_irq_signal) { in smsc911x_open()
1694 dev->irq); in smsc911x_open()
1695 retval = -ENODEV; in smsc911x_open()
1699 dev->irq); in smsc911x_open()
1702 (unsigned long)pdata->ioaddr, dev->irq); in smsc911x_open()
1704 /* Reset the last known duplex and carrier */ in smsc911x_open()
1705 pdata->last_duplex = -1; in smsc911x_open()
1706 pdata->last_carrier = -1; in smsc911x_open()
1709 phy_start(dev->phydev); in smsc911x_open()
1726 napi_enable(&pdata->napi); in smsc911x_open()
1732 spin_lock_irq(&pdata->mac_lock); in smsc911x_open()
1736 spin_unlock_irq(&pdata->mac_lock); in smsc911x_open()
1744 free_irq(dev->irq, dev); in smsc911x_open()
1746 phy_disconnect(dev->phydev); in smsc911x_open()
1748 pm_runtime_put(dev->dev.parent); in smsc911x_open()
1765 napi_disable(&pdata->napi); in smsc911x_stop()
1768 dev->stats.rx_dropped += smsc911x_reg_read(pdata, RX_DROP); in smsc911x_stop()
1771 free_irq(dev->irq, dev); in smsc911x_stop()
1774 if (dev->phydev) { in smsc911x_stop()
1775 phy_stop(dev->phydev); in smsc911x_stop()
1776 phy_disconnect(dev->phydev); in smsc911x_stop()
1779 pm_runtime_put(dev->dev.parent); in smsc911x_stop()
1804 tx_cmd_a = (u32)((ulong)skb->data & 0x03) << 16; in smsc911x_hard_start_xmit()
1806 tx_cmd_a |= (unsigned int)skb->len; in smsc911x_hard_start_xmit()
1808 tx_cmd_b = ((unsigned int)skb->len) << 16; in smsc911x_hard_start_xmit()
1809 tx_cmd_b |= (unsigned int)skb->len; in smsc911x_hard_start_xmit()
1814 bufp = (ulong)skb->data & (~0x3); in smsc911x_hard_start_xmit()
1815 wrsz = (u32)skb->len + 3; in smsc911x_hard_start_xmit()
1816 wrsz += (u32)((ulong)skb->data & 0x3); in smsc911x_hard_start_xmit()
1819 pdata->ops->tx_writefifo(pdata, (unsigned int *)bufp, wrsz); in smsc911x_hard_start_xmit()
1820 freespace -= (skb->len + 32); in smsc911x_hard_start_xmit()
1843 dev->stats.rx_dropped += smsc911x_reg_read(pdata, RX_DROP); in smsc911x_get_stats()
1844 return &dev->stats; in smsc911x_get_stats()
1853 if (dev->flags & IFF_PROMISC) { in smsc911x_set_multicast_list()
1855 pdata->set_bits_mask = MAC_CR_PRMS_; in smsc911x_set_multicast_list()
1856 pdata->clear_bits_mask = (MAC_CR_MCPAS_ | MAC_CR_HPFILT_); in smsc911x_set_multicast_list()
1857 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1858 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1859 } else if (dev->flags & IFF_ALLMULTI) { in smsc911x_set_multicast_list()
1861 pdata->set_bits_mask = MAC_CR_MCPAS_; in smsc911x_set_multicast_list()
1862 pdata->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_HPFILT_); in smsc911x_set_multicast_list()
1863 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1864 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1871 pdata->set_bits_mask = MAC_CR_HPFILT_; in smsc911x_set_multicast_list()
1872 pdata->clear_bits_mask = (MAC_CR_PRMS_ | MAC_CR_MCPAS_); in smsc911x_set_multicast_list()
1875 unsigned int bitnum = smsc911x_hash(ha->addr); in smsc911x_set_multicast_list()
1884 pdata->hashhi = hash_high; in smsc911x_set_multicast_list()
1885 pdata->hashlo = hash_low; in smsc911x_set_multicast_list()
1888 pdata->set_bits_mask = 0; in smsc911x_set_multicast_list()
1889 pdata->clear_bits_mask = in smsc911x_set_multicast_list()
1891 pdata->hashhi = 0; in smsc911x_set_multicast_list()
1892 pdata->hashlo = 0; in smsc911x_set_multicast_list()
1895 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_set_multicast_list()
1897 if (pdata->generation <= 1) { in smsc911x_set_multicast_list()
1898 /* Older hardware revision - cannot change these flags while in smsc911x_set_multicast_list()
1900 if (!pdata->multicast_update_pending) { in smsc911x_set_multicast_list()
1903 pdata->multicast_update_pending = 1; in smsc911x_set_multicast_list()
1915 /* Newer hardware revision - can write immediately */ in smsc911x_set_multicast_list()
1919 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_set_multicast_list()
1925 disable_irq(dev->irq); in smsc911x_poll_controller()
1927 enable_irq(dev->irq); in smsc911x_poll_controller()
1939 if (pdata->generation <= 1 && netif_running(dev)) in smsc911x_set_mac_address()
1940 return -EBUSY; in smsc911x_set_mac_address()
1942 if (!is_valid_ether_addr(addr->sa_data)) in smsc911x_set_mac_address()
1943 return -EADDRNOTAVAIL; in smsc911x_set_mac_address()
1945 eth_hw_addr_set(dev, addr->sa_data); in smsc911x_set_mac_address()
1947 spin_lock_irq(&pdata->mac_lock); in smsc911x_set_mac_address()
1948 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_set_mac_address()
1949 spin_unlock_irq(&pdata->mac_lock); in smsc911x_set_mac_address()
1951 netdev_info(dev, "MAC Address: %pM\n", dev->dev_addr); in smsc911x_set_mac_address()
1959 strscpy(info->driver, SMSC_CHIPNAME, sizeof(info->driver)); in smsc911x_ethtool_getdrvinfo()
1960 strscpy(info->version, SMSC_DRV_VERSION, sizeof(info->version)); in smsc911x_ethtool_getdrvinfo()
1961 strscpy(info->bus_info, dev_name(dev->dev.parent), in smsc911x_ethtool_getdrvinfo()
1962 sizeof(info->bus_info)); in smsc911x_ethtool_getdrvinfo()
1968 return pdata->msg_enable; in smsc911x_ethtool_getmsglevel()
1974 pdata->msg_enable = level; in smsc911x_ethtool_setmsglevel()
1979 return (((E2P_DATA - ID_REV) / 4 + 1) + (WUCSR - MAC_CR) + 1 + 32) * in smsc911x_ethtool_getregslen()
1988 struct phy_device *phy_dev = dev->phydev; in smsc911x_ethtool_getregs()
1994 regs->version = pdata->idrev; in smsc911x_ethtool_getregs()
1999 spin_lock_irqsave(&pdata->mac_lock, flags); in smsc911x_ethtool_getregs()
2001 spin_unlock_irqrestore(&pdata->mac_lock, flags); in smsc911x_ethtool_getregs()
2005 data[j++] = smsc911x_mii_read(phy_dev->mdio.bus, in smsc911x_ethtool_getregs()
2006 phy_dev->mdio.addr, i); in smsc911x_ethtool_getregs()
2025 return -EBUSY; in smsc911x_eeprom_send_cmd()
2034 } while ((e2cmd & E2P_CMD_EPC_BUSY_) && (--timeout)); in smsc911x_eeprom_send_cmd()
2038 return -EAGAIN; in smsc911x_eeprom_send_cmd()
2043 return -EINVAL; in smsc911x_eeprom_send_cmd()
2077 /* Workaround for hardware read-after-write restriction */ in smsc911x_eeprom_write_location()
2101 len = min(eeprom->len, SMSC911X_EEPROM_SIZE); in smsc911x_ethtool_get_eeprom()
2105 eeprom->len = 0; in smsc911x_ethtool_get_eeprom()
2110 memcpy(data, &eeprom_data[eeprom->offset], len); in smsc911x_ethtool_get_eeprom()
2111 eeprom->len = len; in smsc911x_ethtool_get_eeprom()
2123 ret = smsc911x_eeprom_write_location(pdata, eeprom->offset, *data); in smsc911x_ethtool_set_eeprom()
2127 eeprom->len = 1; in smsc911x_ethtool_set_eeprom()
2162 /* copies the current mac address from hardware to dev->dev_addr */
2179 /* Initializing private device structures, only called from probe */
2186 SMSC_TRACE(pdata, probe, "Driver Parameters:"); in smsc911x_init()
2187 SMSC_TRACE(pdata, probe, "LAN base: 0x%08lX", in smsc911x_init()
2188 (unsigned long)pdata->ioaddr); in smsc911x_init()
2189 SMSC_TRACE(pdata, probe, "IRQ: %d", dev->irq); in smsc911x_init()
2190 SMSC_TRACE(pdata, probe, "PHY will be autodetected."); in smsc911x_init()
2192 spin_lock_init(&pdata->dev_lock); in smsc911x_init()
2193 spin_lock_init(&pdata->mac_lock); in smsc911x_init()
2195 if (pdata->ioaddr == NULL) { in smsc911x_init()
2196 SMSC_WARN(pdata, probe, "pdata->ioaddr: 0x00000000"); in smsc911x_init()
2197 return -ENODEV; in smsc911x_init()
2216 while (!(smsc911x_reg_read(pdata, PMT_CTRL) & mask) && --to) in smsc911x_init()
2221 return -ENODEV; in smsc911x_init()
2226 SMSC_TRACE(pdata, probe, "BYTE_TEST: 0x%08X", byte_test); in smsc911x_init()
2228 SMSC_TRACE(pdata, probe, "BYTE_TEST looks swapped, " in smsc911x_init()
2242 SMSC_WARN(pdata, probe, in smsc911x_init()
2244 SMSC_TRACE(pdata, probe, in smsc911x_init()
2248 return -ENODEV; in smsc911x_init()
2252 pdata->generation = 0; in smsc911x_init()
2254 pdata->idrev = smsc911x_reg_read(pdata, ID_REV); in smsc911x_init()
2255 switch (pdata->idrev & 0xFFFF0000) { in smsc911x_init()
2262 pdata->generation = pdata->idrev & 0x0000FFFF; in smsc911x_init()
2270 pdata->generation = 3; in smsc911x_init()
2279 pdata->generation = 4; in smsc911x_init()
2283 SMSC_WARN(pdata, probe, "LAN911x not identified, idrev: 0x%08X", in smsc911x_init()
2284 pdata->idrev); in smsc911x_init()
2285 return -ENODEV; in smsc911x_init()
2288 SMSC_TRACE(pdata, probe, in smsc911x_init()
2290 pdata->idrev, pdata->generation); in smsc911x_init()
2292 if (pdata->generation == 0) in smsc911x_init()
2293 SMSC_WARN(pdata, probe, in smsc911x_init()
2299 if (pdata->config.flags & SMSC911X_SAVE_MAC_ADDRESS) { in smsc911x_init()
2300 spin_lock_irq(&pdata->mac_lock); in smsc911x_init()
2302 spin_unlock_irq(&pdata->mac_lock); in smsc911x_init()
2305 /* Reset the LAN911x */ in smsc911x_init()
2307 return -ENODEV; in smsc911x_init()
2309 dev->flags |= IFF_MULTICAST; in smsc911x_init()
2310 netif_napi_add_weight(dev, &pdata->napi, smsc911x_poll, in smsc911x_init()
2312 dev->netdev_ops = &smsc911x_netdev_ops; in smsc911x_init()
2313 dev->ethtool_ops = &smsc911x_ethtool_ops; in smsc911x_init()
2328 BUG_ON(!pdata->ioaddr); in smsc911x_drv_remove()
2334 mdiobus_unregister(pdata->mii_bus); in smsc911x_drv_remove()
2335 mdiobus_free(pdata->mii_bus); in smsc911x_drv_remove()
2338 "smsc911x-memory"); in smsc911x_drv_remove()
2342 release_mem_region(res->start, resource_size(res)); in smsc911x_drv_remove()
2344 iounmap(pdata->ioaddr); in smsc911x_drv_remove()
2351 pm_runtime_disable(&pdev->dev); in smsc911x_drv_remove()
2380 config->phy_interface = phy_interface; in smsc911x_probe_config()
2382 device_get_mac_address(dev, config->mac); in smsc911x_probe_config()
2384 err = device_property_read_u32(dev, "reg-io-width", &width); in smsc911x_probe_config()
2385 if (err == -ENXIO) in smsc911x_probe_config()
2388 config->flags |= SMSC911X_USE_32BIT; in smsc911x_probe_config()
2390 config->flags |= SMSC911X_USE_16BIT; in smsc911x_probe_config()
2392 device_property_read_u32(dev, "reg-shift", &config->shift); in smsc911x_probe_config()
2394 if (device_property_present(dev, "smsc,irq-active-high")) in smsc911x_probe_config()
2395 config->irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH; in smsc911x_probe_config()
2397 if (device_property_present(dev, "smsc,irq-push-pull")) in smsc911x_probe_config()
2398 config->irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL; in smsc911x_probe_config()
2400 if (device_property_present(dev, "smsc,force-internal-phy")) in smsc911x_probe_config()
2401 config->flags |= SMSC911X_FORCE_INTERNAL_PHY; in smsc911x_probe_config()
2403 if (device_property_present(dev, "smsc,force-external-phy")) in smsc911x_probe_config()
2404 config->flags |= SMSC911X_FORCE_EXTERNAL_PHY; in smsc911x_probe_config()
2406 if (device_property_present(dev, "smsc,save-mac-address")) in smsc911x_probe_config()
2407 config->flags |= SMSC911X_SAVE_MAC_ADDRESS; in smsc911x_probe_config()
2416 struct smsc911x_platform_config *config = dev_get_platdata(&pdev->dev); in smsc911x_drv_probe()
2422 "smsc911x-memory"); in smsc911x_drv_probe()
2427 retval = -ENODEV; in smsc911x_drv_probe()
2433 if (irq == -EPROBE_DEFER) { in smsc911x_drv_probe()
2434 retval = -EPROBE_DEFER; in smsc911x_drv_probe()
2438 retval = -ENODEV; in smsc911x_drv_probe()
2442 if (!request_mem_region(res->start, res_size, SMSC_CHIPNAME)) { in smsc911x_drv_probe()
2443 retval = -EBUSY; in smsc911x_drv_probe()
2449 retval = -ENOMEM; in smsc911x_drv_probe()
2453 SET_NETDEV_DEV(dev, &pdev->dev); in smsc911x_drv_probe()
2456 dev->irq = irq; in smsc911x_drv_probe()
2457 pdata->ioaddr = ioremap(res->start, res_size); in smsc911x_drv_probe()
2458 if (!pdata->ioaddr) { in smsc911x_drv_probe()
2459 retval = -ENOMEM; in smsc911x_drv_probe()
2463 pdata->dev = dev; in smsc911x_drv_probe()
2464 pdata->msg_enable = ((1 << debug) - 1); in smsc911x_drv_probe()
2476 if (pdata->ioaddr == NULL) { in smsc911x_drv_probe()
2477 SMSC_WARN(pdata, probe, "Error smsc911x base address invalid"); in smsc911x_drv_probe()
2478 retval = -ENOMEM; in smsc911x_drv_probe()
2482 retval = smsc911x_probe_config(&pdata->config, &pdev->dev); in smsc911x_drv_probe()
2485 memcpy(&pdata->config, config, sizeof(pdata->config)); in smsc911x_drv_probe()
2490 SMSC_WARN(pdata, probe, "Error smsc911x config not found"); in smsc911x_drv_probe()
2494 /* assume standard, non-shifted, access to HW registers */ in smsc911x_drv_probe()
2495 pdata->ops = &standard_smsc911x_ops; in smsc911x_drv_probe()
2497 if (pdata->config.shift) in smsc911x_drv_probe()
2498 pdata->ops = &shifted_smsc911x_ops; in smsc911x_drv_probe()
2500 pm_runtime_enable(&pdev->dev); in smsc911x_drv_probe()
2501 pm_runtime_get_sync(&pdev->dev); in smsc911x_drv_probe()
2511 SMSC_WARN(pdata, probe, "Error %i initialising mii", retval); in smsc911x_drv_probe()
2517 SMSC_WARN(pdata, probe, "Error %i registering device", retval); in smsc911x_drv_probe()
2520 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2521 "Network interface: \"%s\"", dev->name); in smsc911x_drv_probe()
2524 spin_lock_irq(&pdata->mac_lock); in smsc911x_drv_probe()
2527 if (is_valid_ether_addr(dev->dev_addr)) { in smsc911x_drv_probe()
2528 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_drv_probe()
2529 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2531 } else if (is_valid_ether_addr(pdata->config.mac)) { in smsc911x_drv_probe()
2532 eth_hw_addr_set(dev, pdata->config.mac); in smsc911x_drv_probe()
2533 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2540 if (is_valid_ether_addr(dev->dev_addr)) { in smsc911x_drv_probe()
2542 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2547 smsc911x_set_hw_mac_address(pdata, dev->dev_addr); in smsc911x_drv_probe()
2548 SMSC_TRACE(pdata, probe, in smsc911x_drv_probe()
2553 spin_unlock_irq(&pdata->mac_lock); in smsc911x_drv_probe()
2554 pm_runtime_put(&pdev->dev); in smsc911x_drv_probe()
2556 netdev_info(dev, "MAC Address: %pM\n", dev->dev_addr); in smsc911x_drv_probe()
2561 pm_runtime_put(&pdev->dev); in smsc911x_drv_probe()
2562 pm_runtime_disable(&pdev->dev); in smsc911x_drv_probe()
2568 iounmap(pdata->ioaddr); in smsc911x_drv_probe()
2572 release_mem_region(res->start, resource_size(res)); in smsc911x_drv_probe()
2592 phy_stop(ndev->phydev); in smsc911x_suspend()
2618 * data to the BYTE_TEST register will wake-up the device." in smsc911x_resume()
2623 * forbidden while this bit isn't set. Try for 100ms and return -EIO in smsc911x_resume()
2625 while (!(smsc911x_reg_read(pdata, PMT_CTRL) & PMT_CTRL_READY_) && --to) in smsc911x_resume()
2629 return -EIO; in smsc911x_resume()
2635 phy_start(ndev->phydev); in smsc911x_resume()
2669 .probe = smsc911x_drv_probe,