Lines Matching +full:auto +full:- +full:retry

1 // SPDX-License-Identifier: GPL-2.0-or-later
9 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com>
11 * Copyright (c) 2002-2003 TiVo Inc.
15 * 2010-12-19: add 7832 USB PID ("functionality same as MCS7830"),
19 * - support HIF_REG_CONFIG_SLEEPMODE/HIF_REG_CONFIG_TXENABLE (via autopm?)
20 * - implement ethtool_ops get_pauseparam/set_pauseparam
22 * - implement get_eeprom/[set_eeprom]
23 * - switch PHY on/off on ifup/ifdown (perhaps in usbnet.c, via MII)
24 * - mcs7830_get_regs() handling is weird: for rev 2 we return 32 regs,
26 * - anything else?
95 MCS7830_RX_ALIGNMENT_ERROR = 0x04, /* non-even number of nibbles */
107 static const char driver_name[] = "MOSCHIP usb-ethernet driver";
118 return -ENODATA; in mcs7830_get_reg()
160 return -EBUSY; in mcs7830_set_mac_address()
162 if (!is_valid_ether_addr(addr->sa_data)) in mcs7830_set_mac_address()
163 return -EADDRNOTAVAIL; in mcs7830_set_mac_address()
165 ret = mcs7830_hif_set_mac_address(dev, addr->sa_data); in mcs7830_set_mac_address()
170 /* it worked --> adopt it on netdev side */ in mcs7830_set_mac_address()
171 eth_hw_addr_set(netdev, addr->sa_data); in mcs7830_set_mac_address()
187 mutex_lock(&dev->phy_mutex); in mcs7830_read_phy()
198 ret = -EIO; in mcs7830_read_phy()
209 dev_dbg(&dev->udev->dev, "read PHY reg %02x: %04x (%d tries)\n", in mcs7830_read_phy()
212 mutex_unlock(&dev->phy_mutex); in mcs7830_read_phy()
227 mutex_lock(&dev->phy_mutex); in mcs7830_write_phy()
245 ret = -EIO; in mcs7830_write_phy()
252 dev_dbg(&dev->udev->dev, "write PHY reg %02x: %04x (%d tries)\n", in mcs7830_write_phy()
255 mutex_unlock(&dev->phy_mutex); in mcs7830_write_phy()
272 /* Enable Auto Neg */ in mcs7830_set_autoneg()
275 /* Restart Auto Neg (Keep the Enable Auto Neg Bit Set) */ in mcs7830_set_autoneg()
302 int retry; in mcs7830_rev_C_fixup() local
304 for (retry = 0; retry < 2; retry++) { in mcs7830_rev_C_fixup()
306 dev_info(&dev->udev->dev, "applying rev.C fixup\n"); in mcs7830_rev_C_fixup()
331 return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); in mcs7830_ioctl()
336 return (struct mcs7830_data *)&dev->data; in mcs7830_get_data()
343 sizeof data->multi_filter, in mcs7830_hif_update_multicast_hash()
344 data->multi_filter); in mcs7830_hif_update_multicast_hash()
349 /* implementation specific to data->config in mcs7830_hif_update_config()
350 (argument needs to be heap-based anyway - USB DMA!) */ in mcs7830_hif_update_config()
352 mcs7830_set_reg_async(dev, HIF_REG_CONFIG, 1, &data->config); in mcs7830_hif_update_config()
360 memset(data->multi_filter, 0, sizeof data->multi_filter); in mcs7830_data_set_multicast()
362 data->config = HIF_REG_CONFIG_TXENABLE; in mcs7830_data_set_multicast()
365 data->config |= HIF_REG_CONFIG_ALLMULTICAST; in mcs7830_data_set_multicast()
367 if (net->flags & IFF_PROMISC) { in mcs7830_data_set_multicast()
368 data->config |= HIF_REG_CONFIG_PROMISCUOUS; in mcs7830_data_set_multicast()
369 } else if (net->flags & IFF_ALLMULTI || in mcs7830_data_set_multicast()
371 data->config |= HIF_REG_CONFIG_ALLMULTICAST; in mcs7830_data_set_multicast()
375 /* We use the 20 byte dev->data in mcs7830_data_set_multicast()
384 crc_bits = ether_crc(ETH_ALEN, ha->addr) >> 26; in mcs7830_data_set_multicast()
385 data->multi_filter[crc_bits >> 3] |= 1 << (crc_bits & 7); in mcs7830_data_set_multicast()
394 /* re-configure known MAC (suspend case etc.) */ in mcs7830_apply_base_config()
395 ret = mcs7830_hif_set_mac_address(dev, dev->net->dev_addr); in mcs7830_apply_base_config()
397 dev_info(&dev->udev->dev, "Cannot set MAC address\n"); in mcs7830_apply_base_config()
404 dev_info(&dev->udev->dev, "Cannot set autoneg\n"); in mcs7830_apply_base_config()
450 regs->version = mcs7830_get_rev(dev); in mcs7830_get_regs()
451 mcs7830_get_reg(dev, 0, regs->len, data); in mcs7830_get_regs()
483 struct net_device *net = dev->net; in mcs7830_bind()
486 int retry; in mcs7830_bind() local
489 ret = -EINVAL; in mcs7830_bind()
490 for (retry = 0; retry < 5 && ret; retry++) in mcs7830_bind()
493 dev_warn(&dev->udev->dev, "Cannot read MAC address\n"); in mcs7830_bind()
504 net->ethtool_ops = &mcs7830_ethtool_ops; in mcs7830_bind()
505 net->netdev_ops = &mcs7830_netdev_ops; in mcs7830_bind()
508 dev->rx_urb_size = ETH_FRAME_LEN + 1; in mcs7830_bind()
510 dev->mii.mdio_read = mcs7830_mdio_read; in mcs7830_bind()
511 dev->mii.mdio_write = mcs7830_mdio_write; in mcs7830_bind()
512 dev->mii.dev = net; in mcs7830_bind()
513 dev->mii.phy_id_mask = 0x3f; in mcs7830_bind()
514 dev->mii.reg_num_mask = 0x1f; in mcs7830_bind()
515 dev->mii.phy_id = *((u8 *) net->dev_addr + 1); in mcs7830_bind()
528 if (skb->len < dev->net->hard_header_len) { in mcs7830_rx_fixup()
529 dev_err(&dev->udev->dev, "unexpected tiny rx frame\n"); in mcs7830_rx_fixup()
533 skb_trim(skb, skb->len - 1); in mcs7830_rx_fixup()
534 status = skb->data[skb->len]; in mcs7830_rx_fixup()
537 dev_dbg(&dev->udev->dev, "rx fixup status %x\n", status); in mcs7830_rx_fixup()
541 dev->net->stats.rx_errors++; in mcs7830_rx_fixup()
546 dev->net->stats.rx_length_errors++; in mcs7830_rx_fixup()
548 dev->net->stats.rx_frame_errors++; in mcs7830_rx_fixup()
550 dev->net->stats.rx_crc_errors++; in mcs7830_rx_fixup()
553 return skb->len > 0; in mcs7830_rx_fixup()
558 u8 *buf = urb->transfer_buffer; in mcs7830_status()
561 if (urb->actual_length < 16) in mcs7830_status()
565 link_changed = netif_carrier_ok(dev->net) != link; in mcs7830_status()
568 netdev_dbg(dev->net, "Link Status is: %d\n", link); in mcs7830_status()
573 .description = "MOSCHIP 7830/7832/7730 usb-NET adapter",
583 .description = "Sitecom LN-30 usb-NET adapter",
615 /* YES, this function is successful enough that ethtool -d in mcs7830_reset_resume()
616 does show same output pre-/post-suspend */ in mcs7830_reset_resume()