On 08/09/2017 06:25 PM, yuiko.osh...@microchip.com wrote: > From: Yuiko Oshino <yuiko.osh...@microchip.com> > > Series-Changes: 3
FYI, this will end in the commit message when applied, remove it or move it below the --- . Also commit message is missing. > - All #ifdef CONFIG_DM_ETH and #endif are removed. > - The lan7x_eth_recv() is modifed to correctly support the Driver Model > and returns packet_en. > - Add mii_resolve_flowctrl_fdx() patch in the series. > > Series-Changes: 2 > - The wait_for_bit functions copy the real one. > - Uses phylib > - Unnecessary variables are removed > - All return values are checked > - Uses mii_resolve_flowctrl_fdx() from linux/mii.h > > Signed-off-by: Yuiko Oshino <yuiko.osh...@microchip.com> > --- > Add support for Microchip LAN7500, LAN7800 and LAN7850, > USB to 10/100/1000 Ethernet Controllers. > > > drivers/usb/Kconfig | 2 + > drivers/usb/eth/Kconfig | 17 ++ > drivers/usb/eth/Makefile | 2 + > drivers/usb/eth/lan75xx.c | 318 +++++++++++++++++++++++++++++ > drivers/usb/eth/lan78xx.c | 477 ++++++++++++++++++++++++++++++++++++++++++++ > drivers/usb/eth/lan7x.c | 495 > ++++++++++++++++++++++++++++++++++++++++++++++ > drivers/usb/eth/lan7x.h | 230 +++++++++++++++++++++ > 7 files changed, 1541 insertions(+) > create mode 100644 drivers/usb/eth/Kconfig > create mode 100644 drivers/usb/eth/lan75xx.c > create mode 100644 drivers/usb/eth/lan78xx.c > create mode 100644 drivers/usb/eth/lan7x.c > create mode 100644 drivers/usb/eth/lan7x.h > > diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig > index da3ec2f..62126aa 100644 > --- a/drivers/usb/Kconfig > +++ b/drivers/usb/Kconfig > @@ -94,4 +94,6 @@ endif > > source "drivers/usb/gadget/Kconfig" > > +source "drivers/usb/eth/Kconfig" > + > endif > diff --git a/drivers/usb/eth/Kconfig b/drivers/usb/eth/Kconfig > new file mode 100644 > index 0000000..14cfa26 > --- /dev/null > +++ b/drivers/usb/eth/Kconfig > @@ -0,0 +1,17 @@ > +comment "USB to Ethernet Controller Drivers" > + > +config USB_ETHER_LAN75XX > + bool "Microchip LAN75XX support" > + ---help--- > + Say Y here if you would like to support Microchip LAN75XX Hi-Speed > + USB 2.0 to 10/100/1000 Gigabit Ethernet controller. > + Supports 10Base-T/ 100Base-TX/1000Base-T. > + This driver supports the internal PHY. > + > +config USB_ETHER_LAN78XX > + bool "Microchip LAN78XX support" > + ---help--- > + Say Y here if you would like to support Microchip LAN78XX USB 3.1 > + Gen 1 to 10/100/1000 Gigabit Ethernet controller. > + Supports 10Base-T/ 100Base-TX/1000Base-T. > + This driver supports the internal PHY. > diff --git a/drivers/usb/eth/Makefile b/drivers/usb/eth/Makefile > index 4c44efc..4b935a3 100644 > --- a/drivers/usb/eth/Makefile > +++ b/drivers/usb/eth/Makefile > @@ -9,4 +9,6 @@ obj-$(CONFIG_USB_ETHER_ASIX) += asix.o > obj-$(CONFIG_USB_ETHER_ASIX88179) += asix88179.o > obj-$(CONFIG_USB_ETHER_MCS7830) += mcs7830.o > obj-$(CONFIG_USB_ETHER_SMSC95XX) += smsc95xx.o > +obj-$(CONFIG_USB_ETHER_LAN75XX) += lan7x.o lan75xx.o > +obj-$(CONFIG_USB_ETHER_LAN78XX) += lan7x.o lan78xx.o > obj-$(CONFIG_USB_ETHER_RTL8152) += r8152.o r8152_fw.o > diff --git a/drivers/usb/eth/lan75xx.c b/drivers/usb/eth/lan75xx.c > new file mode 100644 > index 0000000..a3c1411 > --- /dev/null > +++ b/drivers/usb/eth/lan75xx.c > @@ -0,0 +1,318 @@ > +/* > + * Copyright (c) 2017 Microchip Technology Inc. All rights reserved. > + * > + * SPDX-License-Identifier: GPL-2.0+ > + */ > + > +#include <dm.h> > +#include <usb.h> > +#include <linux/mii.h> > +#include "usb_ether.h" > +#include "lan7x.h" > + > +/* LAN75xx specific register/bit defines */ > +#define LAN75XX_HW_CFG_BIR BIT(7) > + > +#define LAN75XX_BURST_CAP 0x034 > + > +#define LAN75XX_BULK_IN_DLY 0x03C > + > +#define LAN75XX_RFE_CTL 0x060 > + > +#define LAN75XX_FCT_RX_CTL 0x090 > + > +#define LAN75XX_FCT_TX_CTL 0x094 > + > +#define LAN75XX_FCT_RX_FIFO_END 0x098 > + > +#define LAN75XX_FCT_TX_FIFO_END 0x09C > + > +#define LAN75XX_FCT_FLOW 0x0A0 > + > +/* MAC ADDRESS PERFECT FILTER For LAN75xx */ > +#define LAN75XX_ADDR_FILTX 0x300 > +#define LAN75XX_ADDR_FILTX_FB_VALID BIT(31) > + > +/* > + * Lan75xx infrastructure commands > + */ > +static int lan75xx_phy_gig_workaround(struct usb_device *udev, > + struct ueth_data *dev) > +{ > + int ret = 0; > + > + /* Only internal phy */ > + /* Set the phy in Gig loopback */ > + lan7x_mdio_write(udev, dev->phy_id, MII_BMCR, > + (BMCR_LOOPBACK | BMCR_SPEED1000)); > + > + /* Wait for the link up */ > + ret = lan7x_mdio_wait_for_bit(udev, "BMSR_LSTATUS", > + dev->phy_id, MII_BMSR, BMSR_LSTATUS, > + true, PHY_CONNECT_TIMEOUT_MS, 1); > + if (ret) > + return ret; > + > + /* phy reset */ > + return lan7x_pmt_phy_reset(udev, dev); > +} > + > +static int lan75xx_update_flowcontrol(struct usb_device *udev, > + struct ueth_data *dev) > +{ > + uint32_t flow = 0, fct_flow = 0; > + int ret; > + > + ret = lan7x_update_flowcontrol(udev, dev, &flow, &fct_flow); > + if (ret) > + return ret; > + > + ret = lan7x_write_reg(udev, LAN75XX_FCT_FLOW, fct_flow); > + if (ret) > + return ret; > + return lan7x_write_reg(udev, FLOW, flow); > +} > + > +static int lan75xx_read_mac(unsigned char *enetaddr, > + struct usb_device *udev) > +{ > + /* > + * Refer to the doc/README.enetaddr and doc/README.usb for > + * the U-Boot MAC address policy > + */ > + return lan7x_read_eeprom_mac(enetaddr, udev); Is this function needed ? > +} > + > +static int lan75xx_set_receive_filter(struct usb_device *udev) > +{ > + /* No multicast in u-boot */ > + return lan7x_write_reg(udev, LAN75XX_RFE_CTL, > + RFE_CTL_BCAST_EN | RFE_CTL_DA_PERFECT); > +} > + > +/* starts the TX path */ > +static void lan75xx_start_tx_path(struct usb_device *udev) > +{ > + /* Enable Tx at MAC */ > + lan7x_write_reg(udev, MAC_TX, MAC_TX_TXEN); > + > + /* Enable Tx at SCSRs */ > + lan7x_write_reg(udev, LAN75XX_FCT_TX_CTL, FCT_TX_CTL_EN); > +} > + > +/* Starts the Receive path */ > +static void lan75xx_start_rx_path(struct usb_device *udev) > +{ > + /* Enable Rx at MAC */ > + lan7x_write_reg(udev, MAC_RX, > + LAN7X_MAC_RX_MAX_SIZE_DEFAULT | > + MAC_RX_FCS_STRIP | MAC_RX_RXEN); > + > + /* Enable Rx at SCSRs */ > + lan7x_write_reg(udev, LAN75XX_FCT_RX_CTL, FCT_RX_CTL_EN); > +} > + > +static int lan75xx_basic_reset(struct usb_device *udev, > + struct ueth_data *dev, > + struct lan7x_private *priv) > +{ > + int ret; > + u32 val; > + > + ret = lan7x_basic_reset(udev, dev); > + if (ret) > + return ret; > + > + /* Keep the chip ID */ > + ret = lan7x_read_reg(udev, ID_REV, &val); > + if (ret) > + return ret; > + debug("LAN75xx ID_REV = 0x%08x\n", val); Some sort of USB bus ID would be useful in the debug message to identify the chip in case multiple are present. > + priv->chipid = (val & ID_REV_CHIP_ID_MASK) >> 16; > + > + /* Respond to the IN token with a NAK */ > + ret = lan7x_read_reg(udev, HW_CFG, &val); > + if (ret) > + return ret; > + val |= LAN75XX_HW_CFG_BIR; > + return lan7x_write_reg(udev, HW_CFG, val); > +} [...] -- Best regards, Marek Vasut _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot