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

Adam Ford aford173 at gmail.com
Fri May 31 20:38:12 UTC 2019


On Fri, May 31, 2019 at 3:11 PM Adam Ford <aford173 at gmail.com> wrote:
>
> On Fri, May 31, 2019 at 1:24 PM Adam Ford <aford173 at gmail.com> wrote:
> >
> > On Fri, May 31, 2019 at 8:32 AM Bartosz Golaszewski <brgl at bgdev.pl> 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.
> >
> > Nice job on the da850, it works perfectly.  Unfortunately, it crashes
> > the am3517_evm
> >
> > Without your patch, I am able to get an IP address, but when I apply
> > your patch and attempt an IP address, it crashes.  I tried again, but
> > I got the same result:
> >
> >
> > U-Boot 2019.07-rc3-05342-gebd2f49298 (May 31 2019 - 13:18:29 -0500)
> >
> > AM35XX-GP ES2.0, CPU-OPP2, L3-165MHz, Max CPU Clock 600 MHz
> > Model: TI AM3517 EVM (AM3517/05 TMDSEVM3517)
> > AM3517EVM Board + LPDDR/NAND
> > DRAM:  256 MiB
> > NAND:  512 MiB
> > MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
> > Loading Environment from NAND... OK
> > In:    serial at 49020000
> > Out:   serial at 49020000
> > Err:   serial at 49020000
> > OMAP die ID: 3a5c000100000000016096fa04011001
> > Net:   eth0: ethernet at 5c000000
> > Hit any key to stop autoboot:  0
> > AM3517_EVM # dhcp
> > BOOTP broadcast 1
> > data abort
> > pc : [<8ffac38e>]          lr : [<8ffabe3b>]
> > reloc pc : [<8015738e>]    lr : [<80156e3b>]
> > sp : 8df255b0  ip : 000000ff     fp : 8ffeea70
> > r10: 8ffecbc8  r9 : 8df34ec8     r8 : 00000000
> > r7 : 0000ffff  r6 : 00000fff     r5 : 00000d88  r4 : 0000ffff
> > r3 : 0000ffff  r2 : 00000156     r1 : 00000fff  r0 : 00000fff
> > Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
> > Code: 46304638 ea410a21 b2892104 bf084299 (7b2c4631)
> > Resetting CPU ...
> >
> > resetting ...
> >
> >
> > adam
>
> I got it to work 'once' so I think we might have a timing issue, but I
> am not sure.  I'm trying to enable various debug messages.  I was
> hoping it would be a simple fix, but it's not turning out that way.
>

I enabled the debug code in the bootp driver and got:

AM3517_EVM # dhcp
BOOTP broadcast 1
DHCPHandler: got packet: (src=67, dst=68, len=300) state: 3
Filtering pkt = 0
DHCPHandler: got DHCP packet: (src=67, dst=68, len=300) state: 3
DHCP: state=SELECTING bp_file: ""
TRANSITIONING TO REQUESTING STATE
dhcp_send_request_packet: Sending DHCPREQUEST
Transmitting DHCPREQUEST packet: len = 342
data abort
pc : [<8ffac476>]          lr : [<8ffabf23>]
reloc pc : [<80157476>]    lr : [<80156f23>]
sp : 8df255b0  ip : 00000005     fp : 8ffeed30


I don't know enough about the networking system to know what to do
next.  I haven't yet been able to reproduce my single successful dhcp
connection

adam


> adam
> > >
> > > Signed-off-by: Bartosz Golaszewski <bgolaszewski at baylibre.com>
> > > ---
> > >  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, 51 insertions(+), 73 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 1bc26828bf..d090c00466 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 2c2f885d43..ef9656add8 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 8c16d5c4f5..ca304ed78a 100644
> > > --- a/configs/da850evm_defconfig
> > > +++ b/configs/da850evm_defconfig
> > > @@ -60,6 +60,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 b8eac0e659..eaf5d73dd8 100644
> > > --- a/configs/da850evm_nand_defconfig
> > > +++ b/configs/da850evm_nand_defconfig
> > > @@ -60,6 +60,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 e43141844a..f93a06083e 100644
> > > --- a/configs/omapl138_lcdk_defconfig
> > > +++ b/configs/omapl138_lcdk_defconfig
> > > @@ -50,6 +50,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..4b0a98a4aa 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;
> > > @@ -742,6 +742,9 @@ static int davinci_eth_rcv_packet (struct eth_device *dev)
> > >                 }
> > >                 return (ret);
> > >         }
> > > +
> > > +       *packetp = rx_curr_desc->buffer;
> > > +
> > >         return (0);
> > >  }
> > >
> > > @@ -750,30 +753,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 +839,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);
> > > --
> > > 2.21.0
> > >


More information about the U-Boot mailing list