[U-Boot] [PATCH 2/5] smc911x: use dev->name in printfs

Mike Rapoport mike.rapoport at gmail.com
Thu Nov 12 10:13:48 CET 2009


Hi Mike,

On Thu, Nov 12, 2009 at 12:50 AM, Mike Frysinger <vapier at gentoo.org> wrote:
>
> here's my [compile] tested change as the board i have with this part isnt
> readily accessible atm ...
> -mike

I've tested your changes, MAC register dumps works Ok. I needed to
make some changes to make it work, see the comments below.

> diff --git a/examples/standalone/smc911x_eeprom.c
> b/examples/standalone/smc911x_eeprom.c
> index bf22f0a..f2a6304 100644
> --- a/examples/standalone/smc911x_eeprom.c
> +++ b/examples/standalone/smc911x_eeprom.c
> @@ -17,8 +17,8 @@
>  #include <common.h>
>  #include <exports.h>
>
> -#ifdef CONFIG_DRIVER_SMC911X
> -
> +/* the smc911x.h gets base addr through eth_device' iobase */
> +struct eth_device { const char *name; unsigned long iobase; };

Needed to add 'void *priv' needed for smc911x_detect_chip, otherwise
it does not compile with the latest U-Boot.

>  #include "../drivers/net/smc911x.h"
>
>  /**
> @@ -55,32 +55,32 @@ static void usage(void)
>  * Registers 0x00 - 0x50 are FIFOs.  The 0x50+ are the control registers
>  * and they're all 32bits long.  0xB8+ are reserved, so don't bother.
>  */
> -static void dump_regs(void)
> +static void dump_regs(struct eth_device *dev)
>  {
>        u8 i, j = 0;
>        for (i = 0x50; i < 0xB8; i += sizeof(u32))
>                printf("%02x: 0x%08x %c", i,
> -                       smc911x_reg_read(CONFIG_DRIVER_SMC911X_BASE + i),
> +                       smc911x_reg_read(dev, i),
>                        (j++ % 2 ? '\n' : ' '));
>  }
>
>  /**
>  *     do_eeprom_cmd - handle eeprom communication
>  */
> -static int do_eeprom_cmd(int cmd, u8 reg)
> +static int do_eeprom_cmd(struct eth_device *dev, int cmd, u8 reg)
>  {
> -       if (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY) {
> +       if (smc911x_reg_read(dev, E2P_CMD) & E2P_CMD_EPC_BUSY) {
>                printf("eeprom_cmd: busy at start (E2P_CMD = 0x%08x)\n",
> -                       smc911x_reg_read(E2P_CMD));
> +                       smc911x_reg_read(dev, E2P_CMD));
>                return -1;
>        }
>
> -       smc911x_reg_write(E2P_CMD, E2P_CMD_EPC_BUSY | cmd | reg);
> +       smc911x_reg_write(dev, E2P_CMD, E2P_CMD_EPC_BUSY | cmd | reg);
>
> -       while (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY)
> +       while (smc911x_reg_read(dev, E2P_CMD) & E2P_CMD_EPC_BUSY)
>                if (smsc_ctrlc()) {
>                        printf("eeprom_cmd: timeout (E2P_CMD = 0x%08x)\n",
> -                               smc911x_reg_read(E2P_CMD));
> +                               smc911x_reg_read(dev, E2P_CMD));
>                        return -1;
>                }
>
> @@ -90,37 +90,37 @@ static int do_eeprom_cmd(int cmd, u8 reg)
>  /**
>  *     read_eeprom_reg - read specified register in EEPROM
>  */
> -static u8 read_eeprom_reg(u8 reg)
> +static u8 read_eeprom_reg(struct eth_device *dev, u8 reg)
>  {
> -       int ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_READ, reg);
> -       return (ret ? : smc911x_reg_read(E2P_DATA));
> +       int ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_READ, reg);
> +       return (ret ? : smc911x_reg_read(dev, E2P_DATA));
>  }
>
>  /**
>  *     write_eeprom_reg - write specified value into specified register in EEPROM
>  */
> -static int write_eeprom_reg(u8 value, u8 reg)
> +static int write_eeprom_reg(struct eth_device *dev, u8 value, u8 reg)
>  {
>        int ret;
>
>        /* enable erasing/writing */
> -       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_EWEN, reg);
> +       ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_EWEN, reg);
>        if (ret)
>                goto done;
>
>        /* erase the eeprom reg */
> -       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_ERASE, reg);
> +       ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_ERASE, reg);
>        if (ret)
>                goto done;
>
>        /* write the eeprom reg */
> -       smc911x_reg_write(E2P_DATA, value);
> -       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_WRITE, reg);
> +       smc911x_reg_write(dev, E2P_DATA, value);
> +       ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_WRITE, reg);
>        if (ret)
>                goto done;
>
>        /* disable erasing/writing */
> -       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_EWDS, reg);
> +       ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_EWDS, reg);
>
>  done:
>        return ret;
> @@ -139,7 +139,7 @@ static char *skip_space(char *buf)
>  /**
>  *     write_stuff - handle writing of MAC registers / eeprom
>  */
> -static void write_stuff(char *line)
> +static void write_stuff(struct eth_device *dev, char *line)
>  {
>        char dest;
>        char *endp;
> @@ -182,39 +182,39 @@ static void write_stuff(char *line)
>        /* Finally, execute the command */
>        if (dest == 'E') {
>                printf("Writing EEPROM register %02x with %02x\n", reg, value);
> -               write_eeprom_reg(value, reg);
> +               write_eeprom_reg(dev, value, reg);
>        } else {
>                printf("Writing MAC register %02x with %08x\n", reg, value);
> -               smc911x_reg_write(CONFIG_DRIVER_SMC911X_BASE + reg, value);
> +               smc911x_reg_write(dev, reg, value);
>        }
>  }
>
>  /**
>  *     copy_from_eeprom - copy MAC address in eeprom to address registers
>  */
> -static void copy_from_eeprom(void)
> +static void copy_from_eeprom(struct eth_device *dev)
>  {
>        ulong addrl =
> -               read_eeprom_reg(0x01) |
> -               read_eeprom_reg(0x02) << 8 |
> -               read_eeprom_reg(0x03) << 16 |
> -               read_eeprom_reg(0x04) << 24;
> +               read_eeprom_reg(dev, 0x01) |
> +               read_eeprom_reg(dev, 0x02) << 8 |
> +               read_eeprom_reg(dev, 0x03) << 16 |
> +               read_eeprom_reg(dev, 0x04) << 24;
>        ulong addrh =
> -               read_eeprom_reg(0x05) |
> -               read_eeprom_reg(0x06) << 8;
> -       smc911x_set_mac_csr(ADDRL, addrl);
> -       smc911x_set_mac_csr(ADDRH, addrh);
> +               read_eeprom_reg(dev, 0x05) |
> +               read_eeprom_reg(dev, 0x06) << 8;
> +       smc911x_set_mac_csr(dev, ADDRL, addrl);
> +       smc911x_set_mac_csr(dev, ADDRH, addrh);
>        puts("EEPROM contents copied to MAC\n");
>  }
>
>  /**
>  *     print_macaddr - print MAC address registers and MAC address in eeprom
>  */
> -static void print_macaddr(void)
> +static void print_macaddr(struct eth_device *dev)
>  {
>        puts("Current MAC Address in MAC:     ");
> -       ulong addrl = smc911x_get_mac_csr(ADDRL);
> -       ulong addrh = smc911x_get_mac_csr(ADDRH);
> +       ulong addrl = smc911x_get_mac_csr(dev, ADDRL);
> +       ulong addrh = smc911x_get_mac_csr(dev, ADDRH);
>        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
>                (u8)(addrl), (u8)(addrl >> 8), (u8)(addrl >> 16),
>                (u8)(addrl >> 24), (u8)(addrh), (u8)(addrh >> 8));
> @@ -222,41 +222,42 @@ static void print_macaddr(void)
>        puts("Current MAC Address in EEPROM:  ");
>        int i;
>        for (i = 1; i < 6; ++i)
> -               printf("%02x:", read_eeprom_reg(i));
> -       printf("%02x\n", read_eeprom_reg(i));
> +               printf("%02x:", read_eeprom_reg(dev, i));
> +       printf("%02x\n", read_eeprom_reg(dev, i));
>  }
>
>  /**
>  *     dump_eeprom - dump the whole content of the EEPROM
>  */
> -static void dump_eeprom(void)
> +static void dump_eeprom(struct eth_device *dev)
>  {
>        int i;
>        puts("EEPROM:\n");
>        for (i = 0; i < 7; ++i)
> -               printf("%02x: 0x%02x\n", i, read_eeprom_reg(i));
> +               printf("%02x: 0x%02x\n", i, read_eeprom_reg(dev, i));
>  }
>
>  /**
>  *     smc911x_init - get the MAC/EEPROM up and ready for use
>  */
> -static int smc911x_init(void)
> +static int smc911x_init(struct eth_device *dev)
>  {
>        /* See if there is anything there */
> -       if (!smc911x_detect_chip())
> +       if (!smc911x_detect_chip(dev))

Should be if (smc911x_detect_chip(dev)) since smc911x_detect_chip
returns 0 on success.

>                return 1;
>
> -       smc911x_reset();
> +       smc911x_reset(dev);
>
>        /* Make sure we set EEDIO/EECLK to the EEPROM */
> -       if (smc911x_reg_read(GPIO_CFG) & GPIO_CFG_EEPR_EN) {
> -               while (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY)
> +       if (smc911x_reg_read(dev, GPIO_CFG) & GPIO_CFG_EEPR_EN) {
> +               while (smc911x_reg_read(dev, E2P_CMD) & E2P_CMD_EPC_BUSY)
>                        if (smsc_ctrlc()) {
>                                printf("init: timeout (E2P_CMD = 0x%08x)\n",
> -                                       smc911x_reg_read(E2P_CMD));
> +                                       smc911x_reg_read(dev, E2P_CMD));
>                                return 1;
>                        }
> -               smc911x_reg_write(GPIO_CFG, smc911x_reg_read(GPIO_CFG) &
> ~GPIO_CFG_EEPR_EN);
> +               smc911x_reg_write(dev, GPIO_CFG,
> +                       smc911x_reg_read(dev, GPIO_CFG) & ~GPIO_CFG_EEPR_EN);
>        }
>
>        return 0;
> @@ -317,6 +318,11 @@ static char *getline(void)
>  */
>  int smc911x_eeprom(int argc, char *argv[])
>  {
> +       struct eth_device dev = {
> +               .name   = __func__,
> +               .iobase = CONFIG_SMC911X_BASE,
> +       };
> +

This requires memset on arches that use C version (e.g. ARM). For my
testing I've just copied the memset from lib_generic/string.c, but
obviously it's not the correct solution.

>        /* Print the ABI version */
>        app_startup(argv);
>        if (XF_VERSION != get_version()) {
> @@ -328,7 +334,7 @@ int smc911x_eeprom(int argc, char *argv[])
>
>        /* Initialize the MAC/EEPROM somewhat */
>        puts("\n");
> -       if (smc911x_init())
> +       if (smc911x_init(&dev))
>                return 1;
>
>        /* Dump helpful usage information */
> @@ -360,11 +366,11 @@ int smc911x_eeprom(int argc, char *argv[])
>
>                /* Now parse the command */
>                switch (line[0]) {
> -               case 'W': write_stuff(line);  break;
> -               case 'D': dump_eeprom();      break;
> -               case 'M': dump_regs();        break;
> -               case 'C': copy_from_eeprom(); break;
> -               case 'P': print_macaddr();    break;
> +               case 'W': write_stuff(&dev, line); break;
> +               case 'D': dump_eeprom(&dev);       break;
> +               case 'M': dump_regs(&dev);         break;
> +               case 'C': copy_from_eeprom(&dev);  break;
> +               case 'P': print_macaddr(&dev);     break;
>                unknown_cmd:
>                default:  puts("ERROR: Unknown command!\n\n");
>                case '?':
> @@ -373,11 +379,3 @@ int smc911x_eeprom(int argc, char *argv[])
>                }
>        }
>  }
> -
> -#else
> -int smc911x_eeprom(int argc, char *argv[])
> -{
> -       puts("Not supported for this board\n");
> -       return 1;
> -}
> -#endif
>



-- 
	Sincerely Yours,
		Mike.


More information about the U-Boot mailing list