[U-Boot] [PATCH v3 03/13] net: ftgmac100: convert to driver model

Cédric Le Goater clg at kaod.org
Tue Oct 16 05:39:20 UTC 2018


On 10/15/18 10:39 PM, Joe Hershberger wrote:
> On Wed, Oct 10, 2018 at 6:45 AM Cédric Le Goater <clg at kaod.org> wrote:
>>
>> The driver is based on the previous one and the code is only adapted
>> to fit the driver model. The support for the Faraday ftgmac100
>> controller is the same with MAC and MDIO bus support for RGMII/RMII
>> modes.
>>
>> Configuration is updated to enable compile again. At this stage, the
>> driver compiles but is not yet functional.
>>
>> Signed-off-by: Cédric Le Goater <clg at kaod.org>
>> ---
>>  include/netdev.h        |   1 -
>>  drivers/net/ftgmac100.c | 223 +++++++++++++++++++++++-----------------
>>  drivers/net/Kconfig     |  26 +++++
>>  3 files changed, 157 insertions(+), 93 deletions(-)
>>
>> diff --git a/include/netdev.h b/include/netdev.h
>> index 55001625fb92..0a1a3a2d8da2 100644
>> --- a/include/netdev.h
>> +++ b/include/netdev.h
>> @@ -43,7 +43,6 @@ int ethoc_initialize(u8 dev_num, int base_addr);
>>  int fec_initialize (bd_t *bis);
>>  int fecmxc_initialize(bd_t *bis);
>>  int fecmxc_initialize_multi(bd_t *bis, int dev_id, int phy_id, uint32_t addr);
>> -int ftgmac100_initialize(bd_t *bits);
>>  int ftmac100_initialize(bd_t *bits);
>>  int ftmac110_initialize(bd_t *bits);
>>  void gt6426x_eth_initialize(bd_t *bis);
>> diff --git a/drivers/net/ftgmac100.c b/drivers/net/ftgmac100.c
>> index c996f5f4a167..67a7c73503c5 100644
>> --- a/drivers/net/ftgmac100.c
>> +++ b/drivers/net/ftgmac100.c
>> @@ -7,15 +7,16 @@
>>   *
>>   * (C) Copyright 2010 Andes Technology
>>   * Macpaul Lin <macpaul at andestech.com>
>> + *
>> + * Copyright (C) 2018, IBM Corporation.
>>   */
>>
>> -#include <config.h>
>> -#include <common.h>
>> +#include <dm.h>
>> +#include <miiphy.h>
>>  #include <malloc.h>
>>  #include <net.h>
>> -#include <asm/io.h>
>> +#include <linux/io.h>
>>  #include <asm/dma-mapping.h>
>> -#include <linux/mii.h>
>>
>>  #include "ftgmac100.h"
>>
>> @@ -28,7 +29,19 @@
>>  /* PKTBUFSTX/PKTBUFSRX must both be power of 2 */
>>  #define PKTBUFSTX      4       /* must be power of 2 */
>>
>> +/**
>> + * struct ftgmac100_data - private data for the FTGMAC100 driver
>> + *
>> + * @iobase: The base address of the hardware registers
>> + * @txdes: The array of transmit descriptors
>> + * @rxdes: The array of receive descriptors
>> + * @tx_index: Transmit descriptor index in @txdes
>> + * @rx_index: Receive descriptor index in @rxdes
>> + * @phy_addr: The PHY interface address to use
>> + */
>>  struct ftgmac100_data {
>> +       struct ftgmac100 *iobase;
>> +
>>         ulong txdes_dma;
>>         struct ftgmac100_txdes *txdes;
>>         ulong rxdes_dma;
>> @@ -41,10 +54,10 @@ struct ftgmac100_data {
>>  /*
>>   * struct mii_bus functions
>>   */
>> -static int ftgmac100_mdiobus_read(struct eth_device *dev, int phy_addr,
>> -       int regnum)
>> +static int ftgmac100_mdiobus_read(struct ftgmac100_data *priv, int phy_addr,
>> +                                 int regnum)
>>  {
>> -       struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
>> +       struct ftgmac100 *ftgmac100 = priv->iobase;
>>         int phycr;
>>         int i;
>>
>> @@ -76,10 +89,10 @@ static int ftgmac100_mdiobus_read(struct eth_device *dev, int phy_addr,
>>         return -1;
>>  }
>>
>> -static int ftgmac100_mdiobus_write(struct eth_device *dev, int phy_addr,
>> -       int regnum, u16 value)
>> +static int ftgmac100_mdiobus_write(struct ftgmac100_data *priv, int phy_addr,
>> +                                  int regnum, u16 value)
>>  {
>> -       struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
>> +       struct ftgmac100 *ftgmac100 = priv->iobase;
>>         int phycr;
>>         int data;
>>         int i;
>> @@ -114,9 +127,10 @@ static int ftgmac100_mdiobus_write(struct eth_device *dev, int phy_addr,
>>         return -1;
>>  }
>>
>> -int ftgmac100_phy_read(struct eth_device *dev, int addr, int reg, u16 *value)
>> +int ftgmac100_phy_read(struct ftgmac100_data *priv, int addr, int reg,
>> +                      u16 *value)
>>  {
>> -       *value = ftgmac100_mdiobus_read(dev , addr, reg);
>> +       *value = ftgmac100_mdiobus_read(priv, addr, reg);
>>
>>         if (*value == -1)
>>                 return -1;
>> @@ -124,31 +138,31 @@ int ftgmac100_phy_read(struct eth_device *dev, int addr, int reg, u16 *value)
>>         return 0;
>>  }
>>
>> -int  ftgmac100_phy_write(struct eth_device *dev, int addr, int reg, u16 value)
>> +int ftgmac100_phy_write(struct ftgmac100_data *priv, int addr, int reg,
>> +                       u16 value)
>>  {
>> -       if (ftgmac100_mdiobus_write(dev, addr, reg, value) == -1)
>> +       if (ftgmac100_mdiobus_write(priv, addr, reg, value) == -1)
>>                 return -1;
>>
>>         return 0;
>>  }
>>
>> -static int ftgmac100_phy_reset(struct eth_device *dev)
>> +static int ftgmac100_phy_reset(struct ftgmac100_data *priv, struct udevice *dev)
> 
> Why does this function get a dev parameter? Seems unused.

For the printf below. later on in the pachset, the function is
completely removed, so it didn't seem important to introduce 
more changes.
 
> 
>>  {
>> -       struct ftgmac100_data *priv = dev->priv;
>>         int i;
>>         u16 status, adv;
>>
>>         adv = ADVERTISE_CSMA | ADVERTISE_ALL;
>>
>> -       ftgmac100_phy_write(dev, priv->phy_addr, MII_ADVERTISE, adv);
>> +       ftgmac100_phy_write(priv, priv->phy_addr, MII_ADVERTISE, adv);
>>
>>         printf("%s: Starting autonegotiation...\n", dev->name);
> 
> Seems like a useless print. Remove dev?>
> 
>>
>> -       ftgmac100_phy_write(dev, priv->phy_addr,
>> -               MII_BMCR, (BMCR_ANENABLE | BMCR_ANRESTART));
>> +       ftgmac100_phy_write(priv, priv->phy_addr,
>> +                           MII_BMCR, (BMCR_ANENABLE | BMCR_ANRESTART));
>>
>>         for (i = 0; i < 100000 / 100; i++) {
>> -               ftgmac100_phy_read(dev, priv->phy_addr, MII_BMSR, &status);
>> +               ftgmac100_phy_read(priv, priv->phy_addr, MII_BMSR, &status);
>>
>>                 if (status & BMSR_ANEGCOMPLETE)
>>                         break;
>> @@ -166,19 +180,17 @@ static int ftgmac100_phy_reset(struct eth_device *dev)
>>         return 1;
>>  }
>>
>> -static int ftgmac100_phy_init(struct eth_device *dev)
>> +static int ftgmac100_phy_init(struct ftgmac100_data *priv, struct udevice *dev)
> 
> Same here, why dev parameter? Only passed to reset.

The MDIO (patch 5) adds : 

    phydev = phy_connect(priv->bus, priv->phy_addr, dev, priv->phy_mode);

Nevetheless, I think we can improve the prototype of ftgmac100_phy_init()
to :

    static int ftgmac100_phy_init(struct udevice *dev) 

same for ftgmac100_mdio_init()


> 
>>  {
>> -       struct ftgmac100_data *priv = dev->priv;
>> -
>>         int phy_addr;
>>         u16 phy_id, status, adv, lpa, stat_ge;
>>         int media, speed, duplex;
>>         int i;
>>
>>         /* Check if the PHY is up to snuff... */
>> -       for (phy_addr = 0; phy_addr < CONFIG_PHY_MAX_ADDR; phy_addr++) {
>> +       for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
>>
>> -               ftgmac100_phy_read(dev, phy_addr, MII_PHYSID1, &phy_id);
>> +               ftgmac100_phy_read(priv, phy_addr, MII_PHYSID1, &phy_id);
>>
>>                 /*
>>                  * When it is unable to found PHY,
>> @@ -197,15 +209,15 @@ static int ftgmac100_phy_init(struct eth_device *dev)
>>                 return 0;
>>         }
> 
> [ ... ]
> 
> Looks good otherwise.

I will propose the prototype changes in v4.

Thanks,

C.



More information about the U-Boot mailing list