Lines Matching +full:- +full:- +full:enable +full:- +full:safe +full:- +full:stack
1 // SPDX-License-Identifier: GPL-2.0+
6 * Copyright (C) 2007-2008 SMSC (Steve Glendinning)
106 /* Vendor-specific PHY Definitions */
177 return -EIO; in smsc95xx_write_reg()
196 return -EIO; in smsc95xx_read_reg()
215 return -ETIMEDOUT; in smsc95xx_phy_wait_not_busy()
225 return -ETIMEDOUT; in smsc95xx_mdio_read()
234 return -ETIMEDOUT; in smsc95xx_mdio_read()
277 return -ETIMEDOUT; in smsc95xx_eeprom_confirm_not_busy()
294 return -ETIMEDOUT; in smsc95xx_wait_eeprom()
325 * mii_nway_restart - restart NWay (autonegotiation) for this interface
332 int r = -1; in mii_nway_restart()
335 bmcr = smsc95xx_mdio_read(udev, dev->phy_id, MII_BMCR); in mii_nway_restart()
339 smsc95xx_mdio_write(udev, dev->phy_id, MII_BMCR, bmcr); in mii_nway_restart()
348 smsc95xx_mdio_write(udev, dev->phy_id, MII_BMCR, BMCR_RESET); in smsc95xx_phy_initialize()
349 smsc95xx_mdio_write(udev, dev->phy_id, MII_ADVERTISE, in smsc95xx_phy_initialize()
354 smsc95xx_mdio_read(udev, dev->phy_id, PHY_INT_SRC); in smsc95xx_phy_initialize()
356 smsc95xx_mdio_write(udev, dev->phy_id, PHY_INT_MASK, in smsc95xx_phy_initialize()
382 * address is not safe. Just return an error. in smsc95xx_init_mac_address()
386 return -ENXIO; in smsc95xx_init_mac_address()
408 priv->have_hwaddr = 1; in smsc95xx_write_hwaddr_common()
413 /* Enable or disable Tx & Rx checksum offload engines */
442 /* No multicast in u-boot */ in smsc95xx_set_multicast()
443 priv->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_MCPAS_ | MAC_CR_HPFILT_); in smsc95xx_set_multicast()
452 /* Enable Tx at MAC */ in smsc95xx_start_tx_path()
453 priv->mac_cr |= MAC_CR_TXEN_; in smsc95xx_start_tx_path()
455 smsc95xx_write_reg(udev, MAC_CR, priv->mac_cr); in smsc95xx_start_tx_path()
457 /* Enable Tx at SCSRs */ in smsc95xx_start_tx_path()
466 priv->mac_cr |= MAC_CR_RXEN_; in smsc95xx_start_rx_path()
467 smsc95xx_write_reg(udev, MAC_CR, priv->mac_cr); in smsc95xx_start_rx_path()
483 dev->phy_id = SMSC95XX_INTERNAL_PHY_ID; /* fixed phy id */ in smsc95xx_init_common()
501 return -ETIMEDOUT; in smsc95xx_init_common()
519 return -ETIMEDOUT; in smsc95xx_init_common()
522 if (!priv->have_hwaddr && smsc95xx_init_mac_address(enetaddr, udev) == in smsc95xx_init_common()
524 priv->have_hwaddr = 1; in smsc95xx_init_common()
526 if (!priv->have_hwaddr) { in smsc95xx_init_common()
527 puts("Error: SMSC95xx: No MAC address set - set usbethaddr\n"); in smsc95xx_init_common()
528 return -EADDRNOTAVAIL; in smsc95xx_init_common()
535 if (dev->pusb_dev->speed == USB_SPEED_HIGH) { in smsc95xx_init_common()
537 priv->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE; in smsc95xx_init_common()
540 priv->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE; in smsc95xx_init_common()
544 priv->rx_urb_size = MAX_SINGLE_PACKET_SIZE; in smsc95xx_init_common()
546 debug("rx_urb_size=%ld\n", (ulong)priv->rx_urb_size); in smsc95xx_init_common()
619 ret = smsc95xx_read_reg(udev, MAC_CR, &priv->mac_cr); in smsc95xx_init_common()
644 /* enable PHY interrupts */ in smsc95xx_init_common()
656 link_detected = smsc95xx_mdio_read(udev, dev->phy_id, MII_BMSR) in smsc95xx_init_common()
670 return -EIO; in smsc95xx_init_common()
687 return -ENOSPC; in smsc95xx_send_common()
699 err = usb_bulk_msg(dev->pusb_dev, in smsc95xx_send_common()
700 usb_sndbulkpipe(dev->pusb_dev, dev->ep_out), in smsc95xx_send_common()
718 struct ueth_data *dev = (struct ueth_data *)eth->priv; in smsc95xx_init()
719 struct usb_device *udev = dev->pusb_dev; in smsc95xx_init()
721 (struct smsc95xx_private *)dev->dev_priv; in smsc95xx_init()
723 return smsc95xx_init_common(udev, dev, priv, eth->enetaddr); in smsc95xx_init()
728 struct ueth_data *dev = (struct ueth_data *)eth->priv; in smsc95xx_send()
735 struct ueth_data *dev = (struct ueth_data *)eth->priv; in smsc95xx_recv()
744 err = usb_bulk_msg(dev->pusb_dev, in smsc95xx_recv()
745 usb_rcvbulkpipe(dev->pusb_dev, dev->ep_in), in smsc95xx_recv()
752 return -err; in smsc95xx_recv()
756 return -ENOSPC; in smsc95xx_recv()
767 return -EIO; in smsc95xx_recv()
773 return -EIO; in smsc95xx_recv()
777 if (packet_len > actual_len - sizeof(packet_len)) { in smsc95xx_recv()
779 return -EIO; in smsc95xx_recv()
782 /* Notify net stack */ in smsc95xx_recv()
784 packet_len - 4); in smsc95xx_recv()
787 actual_len -= sizeof(packet_len) + packet_len; in smsc95xx_recv()
789 cur_buf_align = (ulong)buf_ptr - (ulong)recv_buf; in smsc95xx_recv()
792 int align = 4 - (cur_buf_align & 0x03); in smsc95xx_recv()
794 actual_len -= align; in smsc95xx_recv()
808 struct ueth_data *dev = eth->priv; in smsc95xx_write_hwaddr()
809 struct usb_device *udev = dev->pusb_dev; in smsc95xx_write_hwaddr()
810 struct smsc95xx_private *priv = dev->dev_priv; in smsc95xx_write_hwaddr()
812 return smsc95xx_write_hwaddr_common(udev, priv, eth->enetaddr); in smsc95xx_write_hwaddr()
834 { 0x0000, 0x0000 } /* END - Do not remove */
846 iface = &dev->config.if_desc[ifnum]; in smsc95xx_eth_probe()
847 iface_desc = &dev->config.if_desc[ifnum].desc; in smsc95xx_eth_probe()
850 if (dev->descriptor.idVendor == smsc95xx_dongles[i].vendor && in smsc95xx_eth_probe()
851 dev->descriptor.idProduct == smsc95xx_dongles[i].product) in smsc95xx_eth_probe()
863 ss->ifnum = ifnum; in smsc95xx_eth_probe()
864 ss->pusb_dev = dev; in smsc95xx_eth_probe()
865 ss->subclass = iface_desc->bInterfaceSubClass; in smsc95xx_eth_probe()
866 ss->protocol = iface_desc->bInterfaceProtocol; in smsc95xx_eth_probe()
869 * We are expecting a minimum of 3 endpoints - in, out (bulk), and int. in smsc95xx_eth_probe()
872 for (i = 0; i < iface_desc->bNumEndpoints; i++) { in smsc95xx_eth_probe()
874 if ((iface->ep_desc[i].bmAttributes & in smsc95xx_eth_probe()
876 if (iface->ep_desc[i].bEndpointAddress & USB_DIR_IN) in smsc95xx_eth_probe()
877 ss->ep_in = in smsc95xx_eth_probe()
878 iface->ep_desc[i].bEndpointAddress & in smsc95xx_eth_probe()
881 ss->ep_out = in smsc95xx_eth_probe()
882 iface->ep_desc[i].bEndpointAddress & in smsc95xx_eth_probe()
887 if ((iface->ep_desc[i].bmAttributes & in smsc95xx_eth_probe()
889 ss->ep_int = iface->ep_desc[i].bEndpointAddress & in smsc95xx_eth_probe()
891 ss->irqinterval = iface->ep_desc[i].bInterval; in smsc95xx_eth_probe()
895 ss->ep_in, ss->ep_out, ss->ep_int); in smsc95xx_eth_probe()
898 if (usb_set_interface(dev, iface_desc->bInterfaceNumber, 0) || in smsc95xx_eth_probe()
899 !ss->ep_in || !ss->ep_out || !ss->ep_int) { in smsc95xx_eth_probe()
903 dev->privptr = (void *)ss; in smsc95xx_eth_probe()
906 ss->dev_priv = calloc(1, sizeof(struct smsc95xx_private)); in smsc95xx_eth_probe()
907 if (!ss->dev_priv) in smsc95xx_eth_probe()
921 sprintf(eth->name, "%s%d", SMSC95XX_BASE_NAME, curr_eth_dev++); in smsc95xx_eth_get_info()
922 eth->init = smsc95xx_init; in smsc95xx_eth_get_info()
923 eth->send = smsc95xx_send; in smsc95xx_eth_get_info()
924 eth->recv = smsc95xx_recv; in smsc95xx_eth_get_info()
925 eth->halt = smsc95xx_halt; in smsc95xx_eth_get_info()
926 eth->write_hwaddr = smsc95xx_write_hwaddr; in smsc95xx_eth_get_info()
927 eth->priv = ss; in smsc95xx_eth_get_info()
939 /* Driver-model Ethernet ensures we have this */ in smsc95xx_eth_start()
940 priv->have_hwaddr = 1; in smsc95xx_eth_start()
942 return smsc95xx_init_common(udev, &priv->ueth, priv, pdata->enetaddr); in smsc95xx_eth_start()
954 return smsc95xx_send_common(&priv->ueth, packet, length); in smsc95xx_eth_send()
960 struct ueth_data *ueth = &priv->ueth; in smsc95xx_eth_recv()
969 return -EAGAIN; in smsc95xx_eth_recv()
971 if (ret == -EAGAIN) in smsc95xx_eth_recv()
994 if (packet_len > len - sizeof(packet_len)) { in smsc95xx_eth_recv()
1000 return packet_len - 4; in smsc95xx_eth_recv()
1003 usb_ether_advance_rxbuf(ueth, -1); in smsc95xx_eth_recv()
1004 return -EINVAL; in smsc95xx_eth_recv()
1012 usb_ether_advance_rxbuf(&priv->ueth, sizeof(u32) + packet_len); in smsc95xx_free_pkt()
1023 return smsc95xx_write_hwaddr_common(udev, priv, pdata->enetaddr); in smsc95xx_write_hwaddr()
1032 ret = smsc95xx_init_mac_address(pdata->enetaddr, udev); in smsc95xx_read_rom_hwaddr()
1034 memset(pdata->enetaddr, 0, 6); in smsc95xx_read_rom_hwaddr()
1042 struct ueth_data *ueth = &priv->ueth; in smsc95xx_eth_probe()