[U-Boot] [PATCH v3 1/2] usb: net: Add support for Microchip LAN75xx and LAN78xx

Marek Vasut marex at denx.de
Wed Aug 9 17:12:00 UTC 2017


On 08/09/2017 06:25 PM, yuiko.oshino at microchip.com wrote:
> From: Yuiko Oshino <yuiko.oshino at 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.oshino at 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


More information about the U-Boot mailing list