Lines Matching +full:10 +full:base +full:- +full:t1s
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 2007-2008 SMSC
59 #define PHY_HWIRQ (SMSC95XX_NR_IRQS - 1)
88 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_read_reg()
93 if (current != pdata->pm_task) in smsc95xx_read_reg()
102 ret = ret < 0 ? ret : -ENODATA; in smsc95xx_read_reg()
104 if (ret != -ENODEV) in smsc95xx_read_reg()
105 netdev_warn(dev->net, "Failed to read reg index 0x%08x: %d\n", in smsc95xx_read_reg()
119 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_write_reg()
124 if (current != pdata->pm_task) in smsc95xx_write_reg()
135 if (ret < 0 && ret != -ENODEV) in smsc95xx_write_reg()
136 netdev_warn(dev->net, "Failed to write reg index 0x%08x: %d\n", in smsc95xx_write_reg()
153 /* Ignore -ENODEV error during disconnect() */ in smsc95xx_phy_wait_not_busy()
154 if (ret == -ENODEV) in smsc95xx_phy_wait_not_busy()
156 netdev_warn(dev->net, "Error reading MII_ACCESS\n"); in smsc95xx_phy_wait_not_busy()
164 return -EIO; in smsc95xx_phy_wait_not_busy()
177 mutex_lock(&dev->phy_mutex); in smsc95xx_mdio_read()
182 netdev_warn(dev->net, "%s: MII is busy\n", __func__); in smsc95xx_mdio_read()
190 if (ret != -ENODEV) in smsc95xx_mdio_read()
191 netdev_warn(dev->net, "Error writing MII_ADDR\n"); in smsc95xx_mdio_read()
197 netdev_warn(dev->net, "Timed out reading MII reg %02X\n", idx); in smsc95xx_mdio_read()
203 if (ret != -ENODEV) in smsc95xx_mdio_read()
204 netdev_warn(dev->net, "Error reading MII_DATA\n"); in smsc95xx_mdio_read()
211 mutex_unlock(&dev->phy_mutex); in smsc95xx_mdio_read()
213 /* Ignore -ENODEV error during disconnect() */ in smsc95xx_mdio_read()
214 if (ret == -ENODEV) in smsc95xx_mdio_read()
225 mutex_lock(&dev->phy_mutex); in smsc95xx_mdio_write()
230 netdev_warn(dev->net, "%s: MII is busy\n", __func__); in smsc95xx_mdio_write()
237 if (ret != -ENODEV) in smsc95xx_mdio_write()
238 netdev_warn(dev->net, "Error writing MII_DATA\n"); in smsc95xx_mdio_write()
246 if (ret != -ENODEV) in smsc95xx_mdio_write()
247 netdev_warn(dev->net, "Error writing MII_ADDR\n"); in smsc95xx_mdio_write()
253 netdev_warn(dev->net, "Timed out writing MII reg %02X\n", idx); in smsc95xx_mdio_write()
258 mutex_unlock(&dev->phy_mutex); in smsc95xx_mdio_write()
268 dev = bus->priv; in smsc95xx_mdiobus_reset()
269 pdata = dev->driver_priv; in smsc95xx_mdiobus_reset()
271 if (pdata->is_internal_phy) in smsc95xx_mdiobus_reset()
274 mutex_lock(&dev->phy_mutex); in smsc95xx_mdiobus_reset()
293 mutex_unlock(&dev->phy_mutex); in smsc95xx_mdiobus_reset()
300 struct usbnet *dev = bus->priv; in smsc95xx_mdiobus_read()
308 struct usbnet *dev = bus->priv; in smsc95xx_mdiobus_write()
323 netdev_warn(dev->net, "Error reading E2P_CMD\n"); in smsc95xx_wait_eeprom()
333 netdev_warn(dev->net, "EEPROM read operation timeout\n"); in smsc95xx_wait_eeprom()
334 return -EIO; in smsc95xx_wait_eeprom()
349 netdev_warn(dev->net, "Error reading E2P_CMD\n"); in smsc95xx_eeprom_confirm_not_busy()
359 netdev_warn(dev->net, "EEPROM is busy\n"); in smsc95xx_eeprom_confirm_not_busy()
360 return -EIO; in smsc95xx_eeprom_confirm_not_busy()
380 netdev_warn(dev->net, "Error writing E2P_CMD\n"); in smsc95xx_read_eeprom()
390 netdev_warn(dev->net, "Error reading E2P_DATA\n"); in smsc95xx_read_eeprom()
418 netdev_warn(dev->net, "Error writing E2P_DATA\n"); in smsc95xx_write_eeprom()
432 netdev_warn(dev->net, "Error writing E2P_DATA\n"); in smsc95xx_write_eeprom()
440 netdev_warn(dev->net, "Error writing E2P_CMD\n"); in smsc95xx_write_eeprom()
469 netdev_warn(dev->net, "Error write async cmd, sts=%d\n", in smsc95xx_write_reg_async()
476 * 01 00 5E 00 00 01 -> returns bit number 31 */
485 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_set_multicast()
489 pdata->hash_hi = 0; in smsc95xx_set_multicast()
490 pdata->hash_lo = 0; in smsc95xx_set_multicast()
492 spin_lock_irqsave(&pdata->mac_cr_lock, flags); in smsc95xx_set_multicast()
494 if (dev->net->flags & IFF_PROMISC) { in smsc95xx_set_multicast()
495 netif_dbg(dev, drv, dev->net, "promiscuous mode enabled\n"); in smsc95xx_set_multicast()
496 pdata->mac_cr |= MAC_CR_PRMS_; in smsc95xx_set_multicast()
497 pdata->mac_cr &= ~(MAC_CR_MCPAS_ | MAC_CR_HPFILT_); in smsc95xx_set_multicast()
498 } else if (dev->net->flags & IFF_ALLMULTI) { in smsc95xx_set_multicast()
499 netif_dbg(dev, drv, dev->net, "receive all multicast enabled\n"); in smsc95xx_set_multicast()
500 pdata->mac_cr |= MAC_CR_MCPAS_; in smsc95xx_set_multicast()
501 pdata->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_HPFILT_); in smsc95xx_set_multicast()
502 } else if (!netdev_mc_empty(dev->net)) { in smsc95xx_set_multicast()
505 pdata->mac_cr |= MAC_CR_HPFILT_; in smsc95xx_set_multicast()
506 pdata->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_MCPAS_); in smsc95xx_set_multicast()
509 u32 bitnum = smsc95xx_hash(ha->addr); in smsc95xx_set_multicast()
512 pdata->hash_hi |= mask; in smsc95xx_set_multicast()
514 pdata->hash_lo |= mask; in smsc95xx_set_multicast()
517 netif_dbg(dev, drv, dev->net, "HASHH=0x%08X, HASHL=0x%08X\n", in smsc95xx_set_multicast()
518 pdata->hash_hi, pdata->hash_lo); in smsc95xx_set_multicast()
520 netif_dbg(dev, drv, dev->net, "receive own packets only\n"); in smsc95xx_set_multicast()
521 pdata->mac_cr &= in smsc95xx_set_multicast()
525 spin_unlock_irqrestore(&pdata->mac_cr_lock, flags); in smsc95xx_set_multicast()
528 ret = smsc95xx_write_reg_async(dev, HASHH, pdata->hash_hi); in smsc95xx_set_multicast()
530 netdev_warn(dev->net, "failed to initiate async write to HASHH\n"); in smsc95xx_set_multicast()
532 ret = smsc95xx_write_reg_async(dev, HASHL, pdata->hash_lo); in smsc95xx_set_multicast()
534 netdev_warn(dev->net, "failed to initiate async write to HASHL\n"); in smsc95xx_set_multicast()
536 ret = smsc95xx_write_reg_async(dev, MAC_CR, pdata->mac_cr); in smsc95xx_set_multicast()
538 netdev_warn(dev->net, "failed to initiate async write to MAC_CR\n"); in smsc95xx_set_multicast()
543 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_phy_update_flowcontrol()
550 if (pdata->phydev->duplex == DUPLEX_FULL) { in smsc95xx_phy_update_flowcontrol()
553 if (pdata->phydev->autoneg == AUTONEG_ENABLE && in smsc95xx_phy_update_flowcontrol()
554 pdata->pause_autoneg) { in smsc95xx_phy_update_flowcontrol()
555 phy_get_pause(pdata->phydev, &tx_pause, &rx_pause); in smsc95xx_phy_update_flowcontrol()
557 tx_pause = pdata->pause_tx; in smsc95xx_phy_update_flowcontrol()
558 rx_pause = pdata->pause_rx; in smsc95xx_phy_update_flowcontrol()
571 netif_dbg(dev, link, dev->net, "rx pause %s, tx pause %s\n", in smsc95xx_phy_update_flowcontrol()
575 netif_dbg(dev, link, dev->net, "half duplex\n"); in smsc95xx_phy_update_flowcontrol()
588 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_mac_update_fullduplex()
592 spin_lock_irqsave(&pdata->mac_cr_lock, flags); in smsc95xx_mac_update_fullduplex()
593 if (pdata->phydev->duplex != DUPLEX_FULL) { in smsc95xx_mac_update_fullduplex()
594 pdata->mac_cr &= ~MAC_CR_FDPX_; in smsc95xx_mac_update_fullduplex()
595 pdata->mac_cr |= MAC_CR_RCVOWN_; in smsc95xx_mac_update_fullduplex()
597 pdata->mac_cr &= ~MAC_CR_RCVOWN_; in smsc95xx_mac_update_fullduplex()
598 pdata->mac_cr |= MAC_CR_FDPX_; in smsc95xx_mac_update_fullduplex()
600 spin_unlock_irqrestore(&pdata->mac_cr_lock, flags); in smsc95xx_mac_update_fullduplex()
602 ret = smsc95xx_write_reg(dev, MAC_CR, pdata->mac_cr); in smsc95xx_mac_update_fullduplex()
604 if (ret != -ENODEV) in smsc95xx_mac_update_fullduplex()
605 netdev_warn(dev->net, in smsc95xx_mac_update_fullduplex()
612 netdev_warn(dev->net, "Error updating PHY flow control\n"); in smsc95xx_mac_update_fullduplex()
617 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_status()
621 if (urb->actual_length != 4) { in smsc95xx_status()
622 netdev_warn(dev->net, "unexpected urb length %d\n", in smsc95xx_status()
623 urb->actual_length); in smsc95xx_status()
627 intdata = get_unaligned_le32(urb->transfer_buffer); in smsc95xx_status()
628 netif_dbg(dev, link, dev->net, "intdata: 0x%08X\n", intdata); in smsc95xx_status()
633 generic_handle_domain_irq(pdata->irqdomain, PHY_HWIRQ); in smsc95xx_status()
635 netdev_warn(dev->net, "unexpected interrupt, intdata=0x%08X\n", in smsc95xx_status()
667 netif_dbg(dev, hw, dev->net, "COE_CR = 0x%08x\n", read_buf); in smsc95xx_set_features()
681 ee->magic = LAN95XX_EEPROM_MAGIC; in smsc95xx_ethtool_get_eeprom()
683 return smsc95xx_read_eeprom(dev, ee->offset, ee->len, data); in smsc95xx_ethtool_get_eeprom()
691 if (ee->magic != LAN95XX_EEPROM_MAGIC) { in smsc95xx_ethtool_set_eeprom()
692 netdev_warn(dev->net, "EEPROM: magic value mismatch, magic = 0x%x\n", in smsc95xx_ethtool_set_eeprom()
693 ee->magic); in smsc95xx_ethtool_set_eeprom()
694 return -EINVAL; in smsc95xx_ethtool_set_eeprom()
697 return smsc95xx_write_eeprom(dev, ee->offset, ee->len, data); in smsc95xx_ethtool_set_eeprom()
703 return COE_CR - ID_REV + sizeof(u32); in smsc95xx_ethtool_getregslen()
715 retval = smsc95xx_read_reg(dev, ID_REV, ®s->version); in smsc95xx_ethtool_getregs()
734 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_ethtool_get_wol()
736 wolinfo->supported = SUPPORTED_WAKE; in smsc95xx_ethtool_get_wol()
737 wolinfo->wolopts = pdata->wolopts; in smsc95xx_ethtool_get_wol()
744 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_ethtool_set_wol()
747 if (wolinfo->wolopts & ~SUPPORTED_WAKE) in smsc95xx_ethtool_set_wol()
748 return -EINVAL; in smsc95xx_ethtool_set_wol()
750 pdata->wolopts = wolinfo->wolopts & SUPPORTED_WAKE; in smsc95xx_ethtool_set_wol()
752 ret = device_set_wakeup_enable(&dev->udev->dev, pdata->wolopts); in smsc95xx_ethtool_set_wol()
754 netdev_warn(dev->net, "device_set_wakeup_enable error %d\n", ret); in smsc95xx_ethtool_set_wol()
761 phy_read_status(net->phydev); in smsc95xx_get_link()
762 return net->phydev->link; in smsc95xx_get_link()
781 return -EOPNOTSUPP; in smsc95xx_ethtool_get_sset_count()
792 pdata = dev->driver_priv; in smsc95xx_get_pauseparam()
794 pause->autoneg = pdata->pause_autoneg; in smsc95xx_get_pauseparam()
795 pause->rx_pause = pdata->pause_rx; in smsc95xx_get_pauseparam()
796 pause->tx_pause = pdata->pause_tx; in smsc95xx_get_pauseparam()
808 pdata = dev->driver_priv; in smsc95xx_set_pauseparam()
809 phydev = ndev->phydev; in smsc95xx_set_pauseparam()
812 return -ENODEV; in smsc95xx_set_pauseparam()
814 pdata->pause_rx = pause->rx_pause; in smsc95xx_set_pauseparam()
815 pdata->pause_tx = pause->tx_pause; in smsc95xx_set_pauseparam()
816 pdata->pause_autoneg = pause->autoneg; in smsc95xx_set_pauseparam()
818 if (pause->autoneg) { in smsc95xx_set_pauseparam()
819 pause_autoneg_rx = pause->rx_pause; in smsc95xx_set_pauseparam()
820 pause_autoneg_tx = pause->tx_pause; in smsc95xx_set_pauseparam()
826 phy_set_asym_pause(ndev->phydev, pause_autoneg_rx, pause_autoneg_tx); in smsc95xx_set_pauseparam()
827 if (phydev->link && (!pause->autoneg || in smsc95xx_set_pauseparam()
828 phydev->autoneg == AUTONEG_DISABLE)) in smsc95xx_set_pauseparam()
860 return -EINVAL; in smsc95xx_ioctl()
862 return phy_mii_ioctl(netdev->phydev, rq, cmd); in smsc95xx_ioctl()
870 if (!platform_get_ethdev_address(&dev->udev->dev, dev->net)) { in smsc95xx_init_mac_address()
871 if (is_valid_ether_addr(dev->net->dev_addr)) { in smsc95xx_init_mac_address()
873 netif_dbg(dev, ifup, dev->net, "MAC address read from the device tree\n"); in smsc95xx_init_mac_address()
880 eth_hw_addr_set(dev->net, addr); in smsc95xx_init_mac_address()
881 if (is_valid_ether_addr(dev->net->dev_addr)) { in smsc95xx_init_mac_address()
883 netif_dbg(dev, ifup, dev->net, "MAC address read from EEPROM\n"); in smsc95xx_init_mac_address()
889 eth_hw_addr_random(dev->net); in smsc95xx_init_mac_address()
890 netif_dbg(dev, ifup, dev->net, "MAC address set to eth_random_addr\n"); in smsc95xx_init_mac_address()
895 u32 addr_lo = dev->net->dev_addr[0] | dev->net->dev_addr[1] << 8 | in smsc95xx_set_mac_address()
896 dev->net->dev_addr[2] << 16 | dev->net->dev_addr[3] << 24; in smsc95xx_set_mac_address()
897 u32 addr_hi = dev->net->dev_addr[4] | dev->net->dev_addr[5] << 8; in smsc95xx_set_mac_address()
910 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_start_tx_path()
915 spin_lock_irqsave(&pdata->mac_cr_lock, flags); in smsc95xx_start_tx_path()
916 pdata->mac_cr |= MAC_CR_TXEN_; in smsc95xx_start_tx_path()
917 spin_unlock_irqrestore(&pdata->mac_cr_lock, flags); in smsc95xx_start_tx_path()
919 ret = smsc95xx_write_reg(dev, MAC_CR, pdata->mac_cr); in smsc95xx_start_tx_path()
930 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_start_rx_path()
933 spin_lock_irqsave(&pdata->mac_cr_lock, flags); in smsc95xx_start_rx_path()
934 pdata->mac_cr |= MAC_CR_RXEN_; in smsc95xx_start_rx_path()
935 spin_unlock_irqrestore(&pdata->mac_cr_lock, flags); in smsc95xx_start_rx_path()
937 return smsc95xx_write_reg(dev, MAC_CR, pdata->mac_cr); in smsc95xx_start_rx_path()
942 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_reset()
946 netif_dbg(dev, ifup, dev->net, "entering smsc95xx_reset\n"); in smsc95xx_reset()
954 msleep(10); in smsc95xx_reset()
962 netdev_warn(dev->net, "timeout waiting for completion of Lite Reset\n"); in smsc95xx_reset()
963 return -ETIMEDOUT; in smsc95xx_reset()
970 netif_dbg(dev, ifup, dev->net, "MAC Address: %pM\n", in smsc95xx_reset()
971 dev->net->dev_addr); in smsc95xx_reset()
977 netif_dbg(dev, ifup, dev->net, "Read Value from HW_CFG : 0x%08x\n", in smsc95xx_reset()
990 netif_dbg(dev, ifup, dev->net, in smsc95xx_reset()
996 dev->rx_urb_size = MAX_SINGLE_PACKET_SIZE; in smsc95xx_reset()
997 } else if (dev->udev->speed == USB_SPEED_HIGH) { in smsc95xx_reset()
999 dev->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE; in smsc95xx_reset()
1002 dev->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE; in smsc95xx_reset()
1005 netif_dbg(dev, ifup, dev->net, "rx_urb_size=%ld\n", in smsc95xx_reset()
1006 (ulong)dev->rx_urb_size); in smsc95xx_reset()
1016 netif_dbg(dev, ifup, dev->net, in smsc95xx_reset()
1028 netif_dbg(dev, ifup, dev->net, in smsc95xx_reset()
1036 netif_dbg(dev, ifup, dev->net, "Read Value from HW_CFG: 0x%08x\n", in smsc95xx_reset()
1055 netif_dbg(dev, ifup, dev->net, in smsc95xx_reset()
1065 netif_dbg(dev, ifup, dev->net, "ID_REV = 0x%08x\n", read_buf); in smsc95xx_reset()
1087 ret = smsc95xx_read_reg(dev, MAC_CR, &pdata->mac_cr); in smsc95xx_reset()
1098 ret = smsc95xx_set_features(dev->net, dev->net->features); in smsc95xx_reset()
1100 netdev_warn(dev->net, "Failed to set checksum offload features\n"); in smsc95xx_reset()
1104 smsc95xx_set_multicast(dev->net); in smsc95xx_reset()
1119 netdev_warn(dev->net, "Failed to start TX path\n"); in smsc95xx_reset()
1125 netdev_warn(dev->net, "Failed to start RX path\n"); in smsc95xx_reset()
1129 netif_dbg(dev, ifup, dev->net, "smsc95xx_reset, return 0\n"); in smsc95xx_reset()
1151 phy_print_status(net->phydev); in smsc95xx_handle_link_change()
1167 netdev_warn(dev->net, "usbnet_get_endpoints failed: %d\n", ret); in smsc95xx_bind()
1173 return -ENOMEM; in smsc95xx_bind()
1175 dev->driver_priv = pdata; in smsc95xx_bind()
1177 spin_lock_init(&pdata->mac_cr_lock); in smsc95xx_bind()
1187 dev->net->features |= NETIF_F_IP_CSUM; in smsc95xx_bind()
1189 dev->net->features |= NETIF_F_RXCSUM; in smsc95xx_bind()
1191 dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM; in smsc95xx_bind()
1192 set_bit(EVENT_NO_IP_ALIGN, &dev->flags); in smsc95xx_bind()
1202 usb_make_path(dev->udev, usb_path, sizeof(usb_path)); in smsc95xx_bind()
1203 pdata->irqfwnode = irq_domain_alloc_named_fwnode(usb_path); in smsc95xx_bind()
1204 if (!pdata->irqfwnode) { in smsc95xx_bind()
1205 ret = -ENOMEM; in smsc95xx_bind()
1209 pdata->irqdomain = irq_domain_create_linear(pdata->irqfwnode, in smsc95xx_bind()
1213 if (!pdata->irqdomain) { in smsc95xx_bind()
1214 ret = -ENOMEM; in smsc95xx_bind()
1218 phy_irq = irq_create_mapping(pdata->irqdomain, PHY_HWIRQ); in smsc95xx_bind()
1220 ret = -ENOENT; in smsc95xx_bind()
1224 pdata->irqchip = dummy_irq_chip; in smsc95xx_bind()
1225 pdata->irqchip.name = SMSC_CHIPNAME; in smsc95xx_bind()
1226 irq_set_chip_and_handler_name(phy_irq, &pdata->irqchip, in smsc95xx_bind()
1229 pdata->mdiobus = mdiobus_alloc(); in smsc95xx_bind()
1230 if (!pdata->mdiobus) { in smsc95xx_bind()
1231 ret = -ENOMEM; in smsc95xx_bind()
1239 pdata->is_internal_phy = !(val & HW_CFG_PSEL_); in smsc95xx_bind()
1240 if (pdata->is_internal_phy) in smsc95xx_bind()
1241 pdata->mdiobus->phy_mask = ~(1u << SMSC95XX_INTERNAL_PHY_ID); in smsc95xx_bind()
1243 pdata->mdiobus->priv = dev; in smsc95xx_bind()
1244 pdata->mdiobus->read = smsc95xx_mdiobus_read; in smsc95xx_bind()
1245 pdata->mdiobus->write = smsc95xx_mdiobus_write; in smsc95xx_bind()
1246 pdata->mdiobus->reset = smsc95xx_mdiobus_reset; in smsc95xx_bind()
1247 pdata->mdiobus->name = "smsc95xx-mdiobus"; in smsc95xx_bind()
1248 pdata->mdiobus->parent = &dev->udev->dev; in smsc95xx_bind()
1250 snprintf(pdata->mdiobus->id, ARRAY_SIZE(pdata->mdiobus->id), in smsc95xx_bind()
1251 "usb-%03d:%03d", dev->udev->bus->busnum, dev->udev->devnum); in smsc95xx_bind()
1253 ret = mdiobus_register(pdata->mdiobus); in smsc95xx_bind()
1255 netdev_err(dev->net, "Could not register MDIO bus\n"); in smsc95xx_bind()
1259 pdata->phydev = phy_find_first(pdata->mdiobus); in smsc95xx_bind()
1260 if (!pdata->phydev) { in smsc95xx_bind()
1261 netdev_err(dev->net, "no PHY found\n"); in smsc95xx_bind()
1262 ret = -ENODEV; in smsc95xx_bind()
1266 pdata->phydev->irq = phy_irq; in smsc95xx_bind()
1267 pdata->phydev->is_internal = pdata->is_internal_phy; in smsc95xx_bind()
1277 pdata->features = (FEATURE_8_WAKEUP_FILTERS | in smsc95xx_bind()
1281 pdata->features = FEATURE_8_WAKEUP_FILTERS; in smsc95xx_bind()
1283 dev->net->netdev_ops = &smsc95xx_netdev_ops; in smsc95xx_bind()
1284 dev->net->ethtool_ops = &smsc95xx_ethtool_ops; in smsc95xx_bind()
1285 dev->net->flags |= IFF_MULTICAST; in smsc95xx_bind()
1286 dev->net->hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM; in smsc95xx_bind()
1287 dev->net->min_mtu = ETH_MIN_MTU; in smsc95xx_bind()
1288 dev->net->max_mtu = ETH_DATA_LEN; in smsc95xx_bind()
1289 dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; in smsc95xx_bind()
1291 pdata->pause_tx = true; in smsc95xx_bind()
1292 pdata->pause_rx = true; in smsc95xx_bind()
1293 pdata->pause_autoneg = true; in smsc95xx_bind()
1294 phy_support_asym_pause(pdata->phydev); in smsc95xx_bind()
1296 ret = phy_connect_direct(dev->net, pdata->phydev, in smsc95xx_bind()
1300 netdev_err(dev->net, "can't attach PHY to %s\n", pdata->mdiobus->id); in smsc95xx_bind()
1304 phy_attached_info(dev->net->phydev); in smsc95xx_bind()
1309 mdiobus_unregister(pdata->mdiobus); in smsc95xx_bind()
1312 mdiobus_free(pdata->mdiobus); in smsc95xx_bind()
1318 irq_domain_remove(pdata->irqdomain); in smsc95xx_bind()
1321 irq_domain_free_fwnode(pdata->irqfwnode); in smsc95xx_bind()
1330 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_unbind()
1332 phy_disconnect(dev->net->phydev); in smsc95xx_unbind()
1333 mdiobus_unregister(pdata->mdiobus); in smsc95xx_unbind()
1334 mdiobus_free(pdata->mdiobus); in smsc95xx_unbind()
1335 irq_dispose_mapping(irq_find_mapping(pdata->irqdomain, PHY_HWIRQ)); in smsc95xx_unbind()
1336 irq_domain_remove(pdata->irqdomain); in smsc95xx_unbind()
1337 irq_domain_free_fwnode(pdata->irqfwnode); in smsc95xx_unbind()
1338 netif_dbg(dev, ifdown, dev->net, "free pdata\n"); in smsc95xx_unbind()
1344 phy_start(dev->net->phydev); in smsc95xx_start_phy()
1351 phy_stop(dev->net->phydev); in smsc95xx_stop()
1364 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_link_ok()
1368 ret = smsc95xx_mdio_read(dev, pdata->phydev->mdio.addr, MII_BMSR); in smsc95xx_link_ok()
1372 ret = smsc95xx_mdio_read(dev, pdata->phydev->mdio.addr, MII_BMSR); in smsc95xx_link_ok()
1381 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_enter_suspend0()
1401 if (pdata->wolopts & WAKE_PHY) in smsc95xx_enter_suspend0()
1413 pdata->suspend_flags |= SUSPEND_SUSPEND0; in smsc95xx_enter_suspend0()
1420 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_enter_suspend1()
1421 int ret, phy_id = pdata->phydev->mdio.addr; in smsc95xx_enter_suspend1()
1425 * compatibility with non-standard link partners in smsc95xx_enter_suspend1()
1427 if (pdata->features & FEATURE_PHY_NLP_CROSSOVER) in smsc95xx_enter_suspend1()
1431 /* enable energy detect power-down mode */ in smsc95xx_enter_suspend1()
1460 pdata->suspend_flags |= SUSPEND_SUSPEND1; in smsc95xx_enter_suspend1()
1467 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_enter_suspend2()
1482 pdata->suspend_flags |= SUSPEND_SUSPEND2; in smsc95xx_enter_suspend2()
1489 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_enter_suspend3()
1498 netdev_info(dev->net, "rx fifo not empty in autosuspend\n"); in smsc95xx_enter_suspend3()
1499 return -EBUSY; in smsc95xx_enter_suspend3()
1521 pdata->suspend_flags |= SUSPEND_SUSPEND3; in smsc95xx_enter_suspend3()
1528 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_autosuspend()
1530 if (!netif_running(dev->net)) { in smsc95xx_autosuspend()
1532 netdev_dbg(dev->net, "autosuspend entering SUSPEND2\n"); in smsc95xx_autosuspend()
1541 if (!(pdata->features & FEATURE_PHY_NLP_CROSSOVER)) { in smsc95xx_autosuspend()
1542 netdev_warn(dev->net, "EDPD not supported\n"); in smsc95xx_autosuspend()
1543 return -EBUSY; in smsc95xx_autosuspend()
1546 netdev_dbg(dev->net, "autosuspend entering SUSPEND1\n"); in smsc95xx_autosuspend()
1547 netdev_info(dev->net, "entering SUSPEND1 mode\n"); in smsc95xx_autosuspend()
1551 netdev_dbg(dev->net, "autosuspend entering SUSPEND3\n"); in smsc95xx_autosuspend()
1558 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_suspend()
1562 pdata->pm_task = current; in smsc95xx_suspend()
1566 netdev_warn(dev->net, "usbnet_suspend error\n"); in smsc95xx_suspend()
1567 pdata->pm_task = NULL; in smsc95xx_suspend()
1571 if (pdata->suspend_flags) { in smsc95xx_suspend()
1572 netdev_warn(dev->net, "error during last resume\n"); in smsc95xx_suspend()
1573 pdata->suspend_flags = 0; in smsc95xx_suspend()
1579 (pdata->features & FEATURE_REMOTE_WAKEUP)) { in smsc95xx_suspend()
1588 if (!(pdata->wolopts & SUPPORTED_WAKE) || in smsc95xx_suspend()
1589 !(link_up || (pdata->wolopts & WAKE_PHY))) { in smsc95xx_suspend()
1590 netdev_info(dev->net, "entering SUSPEND2 mode\n"); in smsc95xx_suspend()
1617 if (pdata->wolopts & WAKE_PHY) { in smsc95xx_suspend()
1622 netdev_info(dev->net, "entering SUSPEND1 mode\n"); in smsc95xx_suspend()
1628 if (pdata->wolopts & (WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST)) { in smsc95xx_suspend()
1634 (pdata->features & FEATURE_8_WAKEUP_FILTERS) ? in smsc95xx_suspend()
1639 netdev_warn(dev->net, "Unable to allocate filter_mask\n"); in smsc95xx_suspend()
1640 ret = -ENOMEM; in smsc95xx_suspend()
1648 if (pdata->wolopts & WAKE_BCAST) { in smsc95xx_suspend()
1650 netdev_info(dev->net, "enabling broadcast detection\n"); in smsc95xx_suspend()
1661 if (pdata->wolopts & WAKE_MCAST) { in smsc95xx_suspend()
1663 netdev_info(dev->net, "enabling multicast detection\n"); in smsc95xx_suspend()
1674 if (pdata->wolopts & WAKE_ARP) { in smsc95xx_suspend()
1676 netdev_info(dev->net, "enabling ARP detection\n"); in smsc95xx_suspend()
1687 if (pdata->wolopts & WAKE_UCAST) { in smsc95xx_suspend()
1688 netdev_info(dev->net, "enabling unicast detection\n"); in smsc95xx_suspend()
1695 crc[filter/2] |= smsc_crc(dev->net->dev_addr, ETH_ALEN, filter); in smsc95xx_suspend()
1738 if (pdata->wolopts & WAKE_MAGIC) { in smsc95xx_suspend()
1756 if (pdata->wolopts & (WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST)) { in smsc95xx_suspend()
1757 netdev_info(dev->net, "enabling pattern match wakeup\n"); in smsc95xx_suspend()
1760 netdev_info(dev->net, "disabling pattern match wakeup\n"); in smsc95xx_suspend()
1764 if (pdata->wolopts & WAKE_MAGIC) { in smsc95xx_suspend()
1765 netdev_info(dev->net, "enabling magic packet wakeup\n"); in smsc95xx_suspend()
1768 netdev_info(dev->net, "disabling magic packet wakeup\n"); in smsc95xx_suspend()
1784 if (pdata->wolopts & WAKE_PHY) in smsc95xx_suspend()
1795 netdev_info(dev->net, "entering SUSPEND0 mode\n"); in smsc95xx_suspend()
1806 pdata->pm_task = NULL; in smsc95xx_suspend()
1819 pdata = dev->driver_priv; in smsc95xx_resume()
1820 suspend_flags = pdata->suspend_flags; in smsc95xx_resume()
1822 netdev_dbg(dev->net, "resume suspend_flags=0x%02x\n", suspend_flags); in smsc95xx_resume()
1825 pdata->suspend_flags = 0; in smsc95xx_resume()
1827 pdata->pm_task = current; in smsc95xx_resume()
1830 /* clear wake-up sources */ in smsc95xx_resume()
1841 /* clear wake-up status */ in smsc95xx_resume()
1854 phy_init_hw(pdata->phydev); in smsc95xx_resume()
1858 netdev_warn(dev->net, "usbnet_resume error\n"); in smsc95xx_resume()
1861 pdata->pm_task = NULL; in smsc95xx_resume()
1868 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_reset_resume()
1871 pdata->pm_task = current; in smsc95xx_reset_resume()
1873 pdata->pm_task = NULL; in smsc95xx_reset_resume()
1882 u16 *csum_ptr = (u16 *)(skb_tail_pointer(skb) - 2); in smsc95xx_rx_csum_offload()
1884 skb->csum = (__force __wsum)get_unaligned(csum_ptr); in smsc95xx_rx_csum_offload()
1885 skb->ip_summed = CHECKSUM_COMPLETE; in smsc95xx_rx_csum_offload()
1886 skb_trim(skb, skb->len - 2); /* remove csum */ in smsc95xx_rx_csum_offload()
1892 if (skb->len < dev->net->hard_header_len) in smsc95xx_rx_fixup()
1895 while (skb->len > 0) { in smsc95xx_rx_fixup()
1901 header = get_unaligned_le32(skb->data); in smsc95xx_rx_fixup()
1903 packet = skb->data; in smsc95xx_rx_fixup()
1907 align_count = (4 - ((size + NET_IP_ALIGN) % 4)) % 4; in smsc95xx_rx_fixup()
1909 if (unlikely(size > skb->len)) { in smsc95xx_rx_fixup()
1910 netif_dbg(dev, rx_err, dev->net, in smsc95xx_rx_fixup()
1916 netif_dbg(dev, rx_err, dev->net, in smsc95xx_rx_fixup()
1918 dev->net->stats.rx_errors++; in smsc95xx_rx_fixup()
1919 dev->net->stats.rx_dropped++; in smsc95xx_rx_fixup()
1922 dev->net->stats.rx_crc_errors++; in smsc95xx_rx_fixup()
1925 dev->net->stats.rx_frame_errors++; in smsc95xx_rx_fixup()
1929 dev->net->stats.rx_length_errors++; in smsc95xx_rx_fixup()
1934 netif_dbg(dev, rx_err, dev->net, in smsc95xx_rx_fixup()
1940 if (skb->len == size) { in smsc95xx_rx_fixup()
1941 if (dev->net->features & NETIF_F_RXCSUM) in smsc95xx_rx_fixup()
1943 skb_trim(skb, skb->len - 4); /* remove fcs */ in smsc95xx_rx_fixup()
1948 ax_skb = netdev_alloc_skb_ip_align(dev->net, size); in smsc95xx_rx_fixup()
1950 netdev_warn(dev->net, "Error allocating skb\n"); in smsc95xx_rx_fixup()
1955 memcpy(ax_skb->data, packet, size); in smsc95xx_rx_fixup()
1957 if (dev->net->features & NETIF_F_RXCSUM) in smsc95xx_rx_fixup()
1959 skb_trim(ax_skb, ax_skb->len - 4); /* remove fcs */ in smsc95xx_rx_fixup()
1967 if (skb->len) in smsc95xx_rx_fixup()
1977 u16 high_16 = low_16 + skb->csum_offset; in smsc95xx_calc_csum_preamble()
1991 unsigned int len = skb->len - skb_checksum_start_offset(skb); in smsc95xx_can_tx_checksum()
1993 if (skb->len <= 45) in smsc95xx_can_tx_checksum()
1995 return skb->csum_offset < (len - (4 + 1)); in smsc95xx_can_tx_checksum()
2001 bool csum = skb->ip_summed == CHECKSUM_PARTIAL; in smsc95xx_tx_fixup()
2007 BUG_ON(skb_shinfo(skb)->nr_frags); in smsc95xx_tx_fixup()
2018 tx_cmd_b = (u32)skb->len; in smsc95xx_tx_fixup()
2023 /* workaround - hardware tx checksum does not work in smsc95xx_tx_fixup()
2026 __wsum calc = csum_partial(skb->data + csstart, in smsc95xx_tx_fixup()
2027 skb->len - csstart, 0); in smsc95xx_tx_fixup()
2028 *((__sum16 *)(skb->data + csstart in smsc95xx_tx_fixup()
2029 + skb->csum_offset)) = csum_fold(calc); in smsc95xx_tx_fixup()
2052 struct smsc95xx_priv *pdata = dev->driver_priv; in smsc95xx_manage_power()
2054 dev->intf->needs_remote_wakeup = on; in smsc95xx_manage_power()
2056 if (pdata->features & FEATURE_REMOTE_WAKEUP) in smsc95xx_manage_power()
2060 netdev_info(dev->net, "hardware isn't capable of remote wakeup\n"); in smsc95xx_manage_power()
2063 usb_autopm_get_interface_no_resume(dev->intf); in smsc95xx_manage_power()
2065 usb_autopm_put_interface(dev->intf); in smsc95xx_manage_power()
2176 /* SYSTEC USB-SPEmodule1 10BASE-T1L Ethernet Device */
2181 /* Microchip's EVB-LAN8670-USB 10BASE-T1S Ethernet Device */