[U-Boot] [PATCH v2] net: davinci_emac: convert to using the driver model

Ramon Fried rfried.dev at gmail.com
Mon Jun 24 16:51:32 UTC 2019


On 6/24/19 5:21 PM, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bgolaszewski at baylibre.com>
>
> Now that we removed all legacy boards selecting TI_EMAC we can
> completely convert the driver code to using the driver model.
> This patch also updates all remaining users of davinci_emac.
>
> Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
> ---
> v1 -> v2:
> - moved the packetp assignment to the top of the recv() callback which fixes
>   a crash on am3517_evm
> - dropped a redundant call to net_process_received_packet(): this is already
>   called from eth core
>
> Thanks goes to Adam Ford for much appreciated testing and help.
>
> Tested on da850-lcdk and da850-evm.
>
>  arch/arm/mach-davinci/cpu.c            | 13 -----
>  arch/arm/mach-omap2/omap3/emac.c       |  3 +-
>  board/davinci/da8xxevm/da850evm.c      |  6 --
>  board/davinci/da8xxevm/omapl138_lcdk.c | 14 -----
>  board/logicpd/am3517evm/am3517evm.c    |  1 -
>  board/ti/ti816x/evm.c                  |  3 +-
>  configs/am3517_evm_defconfig           |  1 +
>  configs/da850evm_defconfig             |  1 +
>  configs/da850evm_direct_nor_defconfig  |  1 +
>  configs/da850evm_nand_defconfig        |  1 +
>  configs/omapl138_lcdk_defconfig        |  1 +
>  configs/ti816x_evm_defconfig           |  1 +
>  drivers/net/ti/davinci_emac.c          | 77 ++++++++++++++------------
>  include/netdev.h                       |  1 -
>  14 files changed, 50 insertions(+), 74 deletions(-)
>
> diff --git a/arch/arm/mach-davinci/cpu.c b/arch/arm/mach-davinci/cpu.c
> index f97ad3fc74..9fd6564d04 100644
> --- a/arch/arm/mach-davinci/cpu.c
> +++ b/arch/arm/mach-davinci/cpu.c
> @@ -5,7 +5,6 @@
>   */
>  
>  #include <common.h>
> -#include <netdev.h>
>  #include <asm/arch/hardware.h>
>  #include <asm/io.h>
>  
> @@ -90,15 +89,3 @@ int set_cpu_clk_info(void)
>  	gd->bd->bi_dsp_freq = 0;
>  	return 0;
>  }
> -
> -/*
> - * Initializes on-chip ethernet controllers.
> - * to override, implement board_eth_init()
> - */
> -int cpu_eth_init(bd_t *bis)
> -{
> -#if defined(CONFIG_DRIVER_TI_EMAC)
> -	davinci_emac_initialize();
> -#endif
> -	return 0;
> -}
> diff --git a/arch/arm/mach-omap2/omap3/emac.c b/arch/arm/mach-omap2/omap3/emac.c
> index c79e870183..fb0c9188f5 100644
> --- a/arch/arm/mach-omap2/omap3/emac.c
> +++ b/arch/arm/mach-omap2/omap3/emac.c
> @@ -7,7 +7,6 @@
>   */
>  
>  #include <common.h>
> -#include <netdev.h>
>  #include <asm/io.h>
>  #include <asm/arch/am35x_def.h>
>  
> @@ -24,5 +23,5 @@ int cpu_eth_init(bd_t *bis)
>  	reset &= ~CPGMACSS_SW_RST;
>  	writel(reset, &am35x_scm_general_regs->ip_sw_reset);
>  
> -	return davinci_emac_initialize();
> +	return 0;
>  }
> diff --git a/board/davinci/da8xxevm/da850evm.c b/board/davinci/da8xxevm/da850evm.c
> index a90b7a3538..a5c583444d 100644
> --- a/board/davinci/da8xxevm/da850evm.c
> +++ b/board/davinci/da8xxevm/da850evm.c
> @@ -13,7 +13,6 @@
>  #include <environment.h>
>  #include <i2c.h>
>  #include <net.h>
> -#include <netdev.h>
>  #include <spi.h>
>  #include <spi_flash.h>
>  #include <asm/arch/hardware.h>
> @@ -472,11 +471,6 @@ int board_eth_init(bd_t *bis)
>  	if (rmii_hw_init())
>  		printf("RMII hardware init failed!!!\n");
>  #endif
> -	if (!davinci_emac_initialize()) {
> -		printf("Error: Ethernet init failed!\n");
> -		return -1;
> -	}
> -
>  	return 0;
>  }
>  #endif /* CONFIG_DRIVER_TI_EMAC */
> diff --git a/board/davinci/da8xxevm/omapl138_lcdk.c b/board/davinci/da8xxevm/omapl138_lcdk.c
> index fe1bf44101..dd11551428 100644
> --- a/board/davinci/da8xxevm/omapl138_lcdk.c
> +++ b/board/davinci/da8xxevm/omapl138_lcdk.c
> @@ -11,7 +11,6 @@
>  #include <common.h>
>  #include <i2c.h>
>  #include <net.h>
> -#include <netdev.h>
>  #include <spi.h>
>  #include <spi_flash.h>
>  #include <asm/arch/hardware.h>
> @@ -229,19 +228,6 @@ int board_init(void)
>  
>  #ifdef CONFIG_DRIVER_TI_EMAC
>  
> -/*
> - * Initializes on-board ethernet controllers.
> - */
> -int board_eth_init(bd_t *bis)
> -{
> -	if (!davinci_emac_initialize()) {
> -		printf("Error: Ethernet init failed!\n");
> -		return -1;
> -	}
> -
> -	return 0;
> -}
> -
>  #endif /* CONFIG_DRIVER_TI_EMAC */
>  
>  #define CFG_MAC_ADDR_SPI_BUS	0
> diff --git a/board/logicpd/am3517evm/am3517evm.c b/board/logicpd/am3517evm/am3517evm.c
> index 10031a4801..bfd4e78274 100644
> --- a/board/logicpd/am3517evm/am3517evm.c
> +++ b/board/logicpd/am3517evm/am3517evm.c
> @@ -28,7 +28,6 @@
>  #include <linux/usb/gadget.h>
>  #include <linux/usb/musb.h>
>  #include <i2c.h>
> -#include <netdev.h>
>  #include "am3517evm.h"
>  
>  DECLARE_GLOBAL_DATA_PTR;
> diff --git a/board/ti/ti816x/evm.c b/board/ti/ti816x/evm.c
> index 07a084bab8..240df8cbe1 100644
> --- a/board/ti/ti816x/evm.c
> +++ b/board/ti/ti816x/evm.c
> @@ -9,7 +9,6 @@
>  #include <common.h>
>  #include <environment.h>
>  #include <spl.h>
> -#include <netdev.h>
>  #include <asm/cache.h>
>  #include <asm/io.h>
>  #include <asm/arch/clock.h>
> @@ -56,7 +55,7 @@ int board_eth_init(bd_t *bis)
>  			printf("Unable to read MAC address. Set <ethaddr>\n");
>  	}
>  
> -	return davinci_emac_initialize();
> +	return 0;
>  }
>  
>  #ifdef CONFIG_SPL_BUILD
> diff --git a/configs/am3517_evm_defconfig b/configs/am3517_evm_defconfig
> index b9f59f3291..5cb76322df 100644
> --- a/configs/am3517_evm_defconfig
> +++ b/configs/am3517_evm_defconfig
> @@ -44,6 +44,7 @@ CONFIG_SYS_NAND_BUSWIDTH_16BIT=y
>  CONFIG_SYS_NAND_U_BOOT_LOCATIONS=y
>  CONFIG_SYS_NAND_U_BOOT_OFFS=0x80000
>  CONFIG_SPL_NAND_SIMPLE=y
> +CONFIG_DM_ETH=y
>  CONFIG_MII=y
>  CONFIG_DRIVER_TI_EMAC=y
>  CONFIG_PINCTRL=y
> diff --git a/configs/da850evm_defconfig b/configs/da850evm_defconfig
> index c095058282..f7c679d3b5 100644
> --- a/configs/da850evm_defconfig
> +++ b/configs/da850evm_defconfig
> @@ -59,6 +59,7 @@ CONFIG_SF_DEFAULT_SPEED=30000000
>  CONFIG_SPI_FLASH_STMICRO=y
>  CONFIG_SPI_FLASH_WINBOND=y
>  CONFIG_SPI_FLASH_MTD=y
> +CONFIG_DM_ETH=y
>  CONFIG_MII=y
>  CONFIG_DRIVER_TI_EMAC=y
>  CONFIG_PINCTRL=y
> diff --git a/configs/da850evm_direct_nor_defconfig b/configs/da850evm_direct_nor_defconfig
> index 166e77b8e3..9b1da07384 100644
> --- a/configs/da850evm_direct_nor_defconfig
> +++ b/configs/da850evm_direct_nor_defconfig
> @@ -50,6 +50,7 @@ CONFIG_DM_SPI_FLASH=y
>  CONFIG_SPI_FLASH=y
>  CONFIG_SPI_FLASH_STMICRO=y
>  CONFIG_SPI_FLASH_WINBOND=y
> +CONFIG_DM_ETH=y
>  CONFIG_MII=y
>  CONFIG_DRIVER_TI_EMAC=y
>  CONFIG_PINCTRL=y
> diff --git a/configs/da850evm_nand_defconfig b/configs/da850evm_nand_defconfig
> index 7271016346..8f06b8592b 100644
> --- a/configs/da850evm_nand_defconfig
> +++ b/configs/da850evm_nand_defconfig
> @@ -59,6 +59,7 @@ CONFIG_SPI_FLASH=y
>  CONFIG_SPI_FLASH_STMICRO=y
>  CONFIG_SPI_FLASH_WINBOND=y
>  CONFIG_SPI_FLASH_MTD=y
> +CONFIG_DM_ETH=y
>  CONFIG_PINCTRL=y
>  CONFIG_PINCTRL_SINGLE=y
>  CONFIG_DM_SERIAL=y
> diff --git a/configs/omapl138_lcdk_defconfig b/configs/omapl138_lcdk_defconfig
> index 48f251ebb8..466ae860cd 100644
> --- a/configs/omapl138_lcdk_defconfig
> +++ b/configs/omapl138_lcdk_defconfig
> @@ -49,6 +49,7 @@ CONFIG_SPI_FLASH=y
>  CONFIG_SF_DEFAULT_SPEED=30000000
>  CONFIG_SPI_FLASH_STMICRO=y
>  CONFIG_SPI_FLASH_WINBOND=y
> +CONFIG_DM_ETH=y
>  CONFIG_MII=y
>  CONFIG_DRIVER_TI_EMAC=y
>  CONFIG_DM_SERIAL=y
> diff --git a/configs/ti816x_evm_defconfig b/configs/ti816x_evm_defconfig
> index bf877f596b..b233ab8cc9 100644
> --- a/configs/ti816x_evm_defconfig
> +++ b/configs/ti816x_evm_defconfig
> @@ -45,6 +45,7 @@ CONFIG_SYS_I2C_OMAP24XX=y
>  CONFIG_MMC_OMAP_HS=y
>  CONFIG_NAND=y
>  CONFIG_SYS_NAND_BUSWIDTH_16BIT=y
> +CONFIG_DM_ETH=y
>  CONFIG_MII=y
>  CONFIG_DRIVER_TI_EMAC=y
>  CONFIG_SYS_NS16550=y
> diff --git a/drivers/net/ti/davinci_emac.c b/drivers/net/ti/davinci_emac.c
> index 9d53984973..2bd9c51079 100644
> --- a/drivers/net/ti/davinci_emac.c
> +++ b/drivers/net/ti/davinci_emac.c
> @@ -26,7 +26,6 @@
>  #include <net.h>
>  #include <miiphy.h>
>  #include <malloc.h>
> -#include <netdev.h>
>  #include <linux/compiler.h>
>  #include <asm/arch/emac_defs.h>
>  #include <asm/io.h>
> @@ -107,8 +106,9 @@ static u_int8_t	num_phy;
>  
>  phy_t				phy[CONFIG_SYS_DAVINCI_EMAC_PHY_COUNT];
>  
> -static int davinci_eth_set_mac_addr(struct eth_device *dev)
> +static int davinci_emac_write_hwaddr(struct udevice *dev)
>  {
> +	struct eth_pdata *pdata = dev_get_platdata(dev);
>  	unsigned long		mac_hi;
>  	unsigned long		mac_lo;
>  
> @@ -118,12 +118,12 @@ static int davinci_eth_set_mac_addr(struct eth_device *dev)
>  	 *  Using channel 0 only - other channels are disabled
>  	 *  */
>  	writel(0, &adap_emac->MACINDEX);
> -	mac_hi = (dev->enetaddr[3] << 24) |
> -		 (dev->enetaddr[2] << 16) |
> -		 (dev->enetaddr[1] << 8)  |
> -		 (dev->enetaddr[0]);
> -	mac_lo = (dev->enetaddr[5] << 8) |
> -		 (dev->enetaddr[4]);
> +	mac_hi = (pdata->enetaddr[3] << 24) |
> +		 (pdata->enetaddr[2] << 16) |
> +		 (pdata->enetaddr[1] << 8)  |
> +		 (pdata->enetaddr[0]);
> +	mac_lo = (pdata->enetaddr[5] << 8) |
> +		 (pdata->enetaddr[4]);
>  
>  	writel(mac_hi, &adap_emac->MACADDRHI);
>  #if defined(DAVINCI_EMAC_VERSION2)
> @@ -411,7 +411,7 @@ static void  __attribute__((unused)) davinci_eth_gigabit_enable(int phy_addr)
>  }
>  
>  /* Eth device open */
> -static int davinci_eth_open(struct eth_device *dev, bd_t *bis)
> +static int davinci_emac_start(struct udevice *dev)
>  {
>  	dv_reg_p		addr;
>  	u_int32_t		clkdiv, cnt, mac_control;
> @@ -447,7 +447,7 @@ static int davinci_eth_open(struct eth_device *dev, bd_t *bis)
>  	writel(1, &adap_emac->TXCONTROL);
>  	writel(1, &adap_emac->RXCONTROL);
>  
> -	davinci_eth_set_mac_addr(dev);
> +	davinci_emac_write_hwaddr(dev);
>  
>  	/* Set DMA 8 TX / 8 RX Head pointers to 0 */
>  	addr = &adap_emac->TX0HDP;
> @@ -588,7 +588,7 @@ static void davinci_eth_ch_teardown(int ch)
>  }
>  
>  /* Eth device close */
> -static void davinci_eth_close(struct eth_device *dev)
> +static void davinci_emac_stop(struct udevice *dev)
>  {
>  	debug_emac("+ emac_close\n");
>  
> @@ -619,8 +619,8 @@ static int tx_send_loop = 0;
>   * This function sends a single packet on the network and returns
>   * positive number (number of bytes transmitted) or negative for error
>   */
> -static int davinci_eth_send_packet (struct eth_device *dev,
> -					void *packet, int length)
> +static int davinci_emac_send(struct udevice *dev,
> +			     void *packet, int length)
>  {
>  	int ret_status = -1;
>  	int index;
> @@ -672,7 +672,7 @@ static int davinci_eth_send_packet (struct eth_device *dev,
>  /*
>   * This function handles receipt of a packet from the network
>   */
> -static int davinci_eth_rcv_packet (struct eth_device *dev)
> +static int davinci_emac_recv(struct udevice *dev, int flags, uchar **packetp)
>  {
>  	volatile emac_desc *rx_curr_desc;
>  	volatile emac_desc *curr_desc;
> @@ -682,6 +682,7 @@ static int davinci_eth_rcv_packet (struct eth_device *dev)
>  	rx_curr_desc = emac_rx_active_head;
>  	if (!rx_curr_desc)
>  		return 0;
> +	*packetp = rx_curr_desc->buffer;
>  	status = rx_curr_desc->pkt_flag_len;
>  	if ((status & EMAC_CPPI_OWNERSHIP_BIT) == 0) {
>  		if (status & EMAC_CPPI_RX_ERROR_FRAME) {
> @@ -693,7 +694,6 @@ static int davinci_eth_rcv_packet (struct eth_device *dev)
>  				rx_curr_desc->buff_off_len & 0xffff;
>  
>  			invalidate_dcache_range(tmp, tmp + ALIGN(len, PKTALIGN));
> -			net_process_received_packet(rx_curr_desc->buffer, len);
>  			ret = len;
>  		}
>  
> @@ -742,6 +742,7 @@ static int davinci_eth_rcv_packet (struct eth_device *dev)
>  		}
>  		return (ret);
>  	}
> +
>  	return (0);
>  }
>  
> @@ -750,30 +751,12 @@ static int davinci_eth_rcv_packet (struct eth_device *dev)
>   * EMAC modules power or pin multiplexors, that is done by board_init()
>   * much earlier in bootup process. Returns 1 on success, 0 otherwise.
>   */
> -int davinci_emac_initialize(void)
> +static int davinci_emac_probe(struct udevice *dev)
>  {
>  	u_int32_t	phy_id;
>  	u_int16_t	tmp;
>  	int		i;
>  	int		ret;
> -	struct eth_device *dev;
> -
> -	dev = malloc(sizeof *dev);
> -
> -	if (dev == NULL)
> -		return -1;
> -
> -	memset(dev, 0, sizeof *dev);
> -	strcpy(dev->name, "DaVinci-EMAC");
> -
> -	dev->iobase = 0;
> -	dev->init = davinci_eth_open;
> -	dev->halt = davinci_eth_close;
> -	dev->send = davinci_eth_send_packet;
> -	dev->recv = davinci_eth_rcv_packet;
> -	dev->write_hwaddr = davinci_eth_set_mac_addr;
> -
> -	eth_register(dev);
>  
>  	davinci_eth_mdio_enable();
>  
> @@ -854,5 +837,29 @@ int davinci_emac_initialize(void)
>  			phy[i].auto_negotiate(i);
>  	}
>  #endif
> -	return(1);
> +	return 0;
>  }
> +
> +static const struct eth_ops davinci_emac_ops = {
> +	.start		= davinci_emac_start,
> +	.send		= davinci_emac_send,
> +	.recv		= davinci_emac_recv,
> +	.stop		= davinci_emac_stop,
> +	.write_hwaddr	= davinci_emac_write_hwaddr,
> +};
> +
> +static const struct udevice_id davinci_emac_ids[] = {
> +	{ .compatible = "ti,davinci-dm6467-emac" },
> +	{ .compatible = "ti,am3517-emac", },
> +	{ .compatible = "ti,dm816-emac", },
> +	{ }
> +};
> +
> +U_BOOT_DRIVER(davinci_emac) = {
> +	.name		= "davinci_emac",
> +	.id		= UCLASS_ETH,
> +	.of_match	= davinci_emac_ids,
> +	.probe		= davinci_emac_probe,
> +	.ops		= &davinci_emac_ops,
> +	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
> +};
> diff --git a/include/netdev.h b/include/netdev.h
> index 0a1a3a2d8d..a40c4adaad 100644
> --- a/include/netdev.h
> +++ b/include/netdev.h
> @@ -30,7 +30,6 @@ int bcm_sf2_eth_register(bd_t *bis, u8 dev_num);
>  int bfin_EMAC_initialize(bd_t *bis);
>  int calxedaxgmac_initialize(u32 id, ulong base_addr);
>  int cs8900_initialize(u8 dev_num, int base_addr);
> -int davinci_emac_initialize(void);
>  int dc21x4x_initialize(bd_t *bis);
>  int designware_initialize(ulong base_addr, u32 interface);
>  int dm9000_initialize(bd_t *bis);
Reviewed-By: Ramon Fried <rfried.dev at gmail.com>


More information about the U-Boot mailing list