Hi Timur,

Just some nit-picking...

Timur Tabi wrote:
> The Vitesse VSC7385 is a 5-port switch found on the Freescale MPC8349E-mITX
> and other boards.  A small firwmare must be uploaded to its on-board memory
> before it can be enabled.  This patch adds the code which uploads firmware
> (but not the firmware itself) and updates the MPC8349E-mITX, MPC8313E-RDB,
> and MPC837XE-RDB boards to use that code.
>
>   
Is this switch able to pass traffic in a default configuration without 
this firmware or is it dead?
<snip>
> diff --git a/drivers/net/Makefile b/drivers/net/Makefile
> index b9723fa..5ae7cb7 100644
> --- a/drivers/net/Makefile
> +++ b/drivers/net/Makefile
> @@ -57,6 +57,7 @@ COBJS-y += tigon3.o
>  COBJS-y += tsec.o
>  COBJS-y += tsi108_eth.o
>  COBJS-y += uli526x.o
> +COBJS-y += vsc7385.o
>  
>  COBJS        := $(COBJS-y)
>  SRCS         := $(COBJS:.o=.c)
> diff --git a/drivers/net/vsc7385.c b/drivers/net/vsc7385.c
> new file mode 100644
> index 0000000..39b077f
> --- /dev/null
> +++ b/drivers/net/vsc7385.c
>   
I'm not 100% convinced that this is network code, but my opinion isn't 
very strong and I can't really think of a better place (maybe 
device/misc or device/non_free?)
> @@ -0,0 +1,100 @@
> +/*
> + * Vitesse 7385 Switch Firmware Upload
> + *
> + * Author: Timur Tabi <[EMAIL PROTECTED]>
> + *
> + * Copyright 2008 Freescale Semiconductor, Inc.  This file is licensed
> + * under the terms of the GNU General Public License version 2.  This
> + * program is licensed "as is" without any warranty of any kind, whether
> + * express or implied.
> + *
> + * This module uploads proprietary firmware for the Vitesse VSC7385 5-port
> + * switch.
> + */
> +
> +#include <config.h>
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/errno.h>
> +
>   
I think Kim mentioned this will break some architectures. Just repeating it.
> +#ifdef CONFIG_VSC7385_ENET
> +
> +/*
> + * Upload a Vitesse VSC7385 firmware image to the hardware
> + *
> + * This function takes a pointer to a VSC7385 firmware image and a size, and
> + * uploads that firmware to the VSC7385.
> + *
> + * This firmware is typically located at a board-specific flash address,
> + * and the size is typically 8KB.
> + *
> + * The firmware is Vitesse proprietary.
> + *
> + * Further details on the register information can be obtained from Vitesse.
> + */
> +int vsc7385_upload_firmware(void *firmware, unsigned int size)
> +{
> +     u8 *fw = firmware;
> +
> +     u32 *gloreset = (u32 *) (CFG_VSC7385_BASE + 0x1c050);
> +     u32 *icpu_ctrl = (u32 *) (CFG_VSC7385_BASE + 0x1c040);
> +     u32 *icpu_addr = (u32 *) (CFG_VSC7385_BASE + 0x1c044);
> +     u32 *icpu_data = (u32 *) (CFG_VSC7385_BASE + 0x1c048);
> +     u32 *chipid = (u32 *) (CFG_VSC7385_BASE + 0x1c060);
> +     u32 *icpu_rom_map = (u32 *) (CFG_VSC7385_BASE + 0x1c070);
> +
>   
It looks to me that the data bus is 8 bits. Why are you defining 
registers as 32 bits and using 32-bit accessors?
> +     unsigned int i;
> +     int ret = 0;
> +
> +     out_be32(gloreset, 3);
> +     udelay(200);
> +
> +     out_be32(icpu_ctrl, 142);
>   
When you write to the device, can you express the value in hex? It's 
quicker for the reader (who has Vitesse datasheets, of course) to figure 
out what you're doing.
> +     udelay(20);
> +
> +     out_be32(icpu_rom_map, 1);
> +     udelay(20);
> +
> +        /* Write the firmware to I-RAM */
> +     out_be32(icpu_addr, 0);
> +     udelay(20);
> +
> +     for (i = 0; i < size; i++) {
> +             out_be32(icpu_data, fw[i]);
> +             udelay(20);
> +             if (ctrlc())
> +                     return -EINTR;
> +     }
> +
> +     /* Read back and compare */
> +     out_be32(icpu_addr, 0);
> +     udelay(20);
> +
> +     for (i = 0; i < size; i++) {
> +             u8 value;
> +
> +             value = (u8) in_be32(icpu_data);
> +             udelay(20);
> +             if (value != fw[i]) {
> +                     debug("VSC7385: Upload mismatch: address 0x%x, "
> +                              "read value 0x%x, image value 0x%x\n",
> +                              i, value, fw[i]);
> +
> +                     return -EIO;
> +             }
> +             if (ctrlc())
> +                     break;
> +     }
> +
> +     out_be32(icpu_ctrl, 11);
> +     udelay(20);
> +
> +#ifdef DEBUG
> +     printf("VSC7385: Chip ID is %08x\n", in_be32(chipid));
> +     udelay(20);
> +#endif
> +
> +     return 0;
> +}
> +
> +#endif
> diff --git a/include/configs/MPC8313ERDB.h b/include/configs/MPC8313ERDB.h
> index f12a3e6..9576fa5 100644
> --- a/include/configs/MPC8313ERDB.h
> +++ b/include/configs/MPC8313ERDB.h
> @@ -38,6 +38,14 @@
>  #define CONFIG_PCI
>  #define CONFIG_83XX_GENERIC_PCI
>  
> +#define CONFIG_MISC_INIT_R
> +
> +/*
> + * On-board devices
> + */
> +#define CONFIG_VSC7385_ENET
> +
> +
>  #ifdef CFG_66MHZ
>  #define CONFIG_83XX_CLKIN    66666667        /* in Hz */
>  #elif defined(CFG_33MHZ)
> @@ -65,6 +73,22 @@
>  #define CFG_ACR_RPTCNT               3       /* Arbiter repeat count (0-7) */
>  
>  /*
> + * Device configurations
> + */
> +
> +/* Vitesse 7385 */
> +
> +#ifdef CONFIG_VSC7385_ENET
> +
> +#define CONFIG_TSEC2
> +
> +/* The flash address and size of the VSC7385 firmware image */
> +#define CONFIG_VSC7385_IMAGE         0xFE7FE000
> +#define CONFIG_VSC7385_IMAGE_SIZE    8192
> +
> +#endif
> +
> +/*
>   * DDR Setup
>   */
>  #define CFG_DDR_BASE         0x00000000      /* DDR is system memory*/
> @@ -214,19 +238,24 @@
>  #define CFG_LBLAWBAR1_PRELIM CFG_NAND_BASE
>  #define CFG_LBLAWAR1_PRELIM  0x8000000E      /* 32KB  */
>  
> +/* local bus read write buffer mapping */
> +#define CFG_BR3_PRELIM               0xFA000801      /* map at 0xFA000000 */
>   
Like here, bits 19-20 are 01, meaning an 8-bit port
> +#define CFG_OR3_PRELIM               0xFFFF8FF7      /* 32kB */
> +#define CFG_LBLAWBAR3_PRELIM 0xFA000000
> +#define CFG_LBLAWAR3_PRELIM  0x8000000E      /* 32KB  */
> +
> +/* Vitesse 7385 */
> +
>  #define CFG_VSC7385_BASE     0xF0000000
>  
> -#define CONFIG_VSC7385_ENET                  /* VSC7385 ethernet support */
> +#ifdef CONFIG_VSC7385_ENET
> +
>  #define CFG_BR2_PRELIM               0xf0000801      /* VSC7385 Base address 
> */
>  #define CFG_OR2_PRELIM               0xfffe09ff      /* VSC7385, 128K bytes*/
>  #define CFG_LBLAWBAR2_PRELIM CFG_VSC7385_BASE/* Access window base at 
> VSC7385 base */
>  #define CFG_LBLAWAR2_PRELIM  0x80000010      /* Access window size 128K */
>  
> -/* local bus read write buffer mapping */
> -#define CFG_BR3_PRELIM               0xFA000801      /* map at 0xFA000000 */
> -#define CFG_OR3_PRELIM               0xFFFF8FF7      /* 32kB */
> -#define CFG_LBLAWBAR3_PRELIM 0xFA000000
> -#define CFG_LBLAWAR3_PRELIM  0x8000000E      /* 32KB  */
> +#endif
>  
>  /* pass open firmware flat tree */
>  #define CONFIG_OF_LIBFDT     1
> @@ -263,13 +292,6 @@
>  #define CFG_I2C_OFFSET               0x3000
>  #define CFG_I2C2_OFFSET              0x3100
>  
> -/* TSEC */
> -#define CFG_TSEC1_OFFSET     0x24000
> -#define CFG_TSEC1            (CFG_IMMR+CFG_TSEC1_OFFSET)
> -#define CFG_TSEC2_OFFSET     0x25000
> -#define CFG_TSEC2            (CFG_IMMR+CFG_TSEC2_OFFSET)
> -#define CONFIG_NET_MULTI
> -
>  /*
>   * General PCI
>   * Addresses are mapped 1-1.
> @@ -288,26 +310,31 @@
>  #define CFG_PCI_SUBSYS_VENDORID 0x1057       /* Motorola */
>  
>  /*
> - * TSEC configuration
> + * TSEC
>   */
>  #define CONFIG_TSEC_ENET             /* TSEC ethernet support */
>  
> -#ifndef CONFIG_NET_MULTI
> -#define CONFIG_NET_MULTI             1
> -#endif
> -
> -#define CONFIG_GMII                  1       /* MII PHY management */
> -#define CONFIG_TSEC1         1
> +#define CONFIG_NET_MULTI
> +#define CONFIG_GMII                  /* MII PHY management */
>  
> +#ifdef CONFIG_TSEC1
> +#define CONFIG_HAS_ETH0
>  #define CONFIG_TSEC1_NAME    "TSEC0"
> -#define CONFIG_TSEC2         1
> +#define CFG_TSEC1_OFFSET     0x24000
> +#define TSEC1_PHY_ADDR               0x1c
> +#define TSEC1_FLAGS          TSEC_GIGABIT
> +#define TSEC1_PHYIDX         0
> +#endif
> +
> +#ifdef CONFIG_TSEC2
> +#define CONFIG_HAS_ETH1
>  #define CONFIG_TSEC2_NAME    "TSEC1"
> -#define TSEC1_PHY_ADDR                       0x1c
> -#define TSEC2_PHY_ADDR                       4
> -#define TSEC1_FLAGS                  TSEC_GIGABIT
> -#define TSEC2_FLAGS                  TSEC_GIGABIT
> -#define TSEC1_PHYIDX                 0
> -#define TSEC2_PHYIDX                 0
> +#define CFG_TSEC2_OFFSET     0x25000
> +#define TSEC2_PHY_ADDR               4
> +#define TSEC2_FLAGS          TSEC_GIGABIT
> +#define TSEC2_PHYIDX         0
> +#endif
> +
>  
>  /* Options are: TSEC[0-1] */
>  #define CONFIG_ETHPRIME                      "TSEC1"
> @@ -496,10 +523,13 @@
>   */
>  #define CONFIG_ENV_OVERWRITE
>  
> +#ifdef CONFIG_HAS_ETH0
>  #define CONFIG_ETHADDR               00:E0:0C:00:95:01
> -#define CONFIG_HAS_ETH1
> -#define CONFIG_HAS_ETH0
> +#endif
> +
> +#ifdef CONFIG_HAS_ETH1
>  #define CONFIG_ETH1ADDR              00:E0:0C:00:95:02
> +#endif
>  
>  #define CONFIG_IPADDR                10.0.0.2
>  #define CONFIG_SERVERIP              10.0.0.1
> diff --git a/include/configs/MPC8349ITX.h b/include/configs/MPC8349ITX.h
> index 48c2736..0e50186 100644
> --- a/include/configs/MPC8349ITX.h
> +++ b/include/configs/MPC8349ITX.h
> @@ -68,12 +68,16 @@
>  
>  #define CFG_IMMR             0xE0000000      /* The IMMR is relocated to 
> here */
>  
> +#define CONFIG_MISC_INIT_F
> +#define CONFIG_MISC_INIT_R
>  
> -/* On-board devices */
> +/*
> + * On-board devices
> + */
>  
>  #ifdef CONFIG_MPC8349ITX
>  #define CONFIG_COMPACT_FLASH /* The CF card interface on the back of the 
> board */
> -#define CONFIG_VSC7385               /* The Vitesse 7385 5-port switch */
> +#define CONFIG_VSC7385_ENET  /* VSC7385 ethernet support */
>  #endif
>  
>  #define CONFIG_PCI
> @@ -88,9 +92,6 @@
>  /* I2C */
>  #ifdef CONFIG_HARD_I2C
>  
> -#define CONFIG_MISC_INIT_F
> -#define CONFIG_MISC_INIT_R
> -
>  #define CONFIG_FSL_I2C
>  #define CONFIG_I2C_MULTI_BUS
>  #define CONFIG_I2C_CMD_TREE
> @@ -190,6 +191,18 @@ boards, we say we have two, but don't display a message 
> if we find only one. */
>  #define CFG_FLASH_SIZE               16              /* FLASH size in MB */
>  #define CFG_FLASH_SIZE_SHIFT 4               /* log2 of the above value */
>  
> +/* Vitesse 7385 */
> +
> +#ifdef CONFIG_VSC7385_ENET
> +
> +#define CONFIG_TSEC2
> +
> +/* The flash address and size of the VSC7385 firmware image */
> +#define CONFIG_VSC7385_IMAGE         0xFEFFE000
> +#define CONFIG_VSC7385_IMAGE_SIZE    8192
> +
> +#endif
> +
>  /*
>   * BRx, ORx, LBLAWBARx, and LBLAWARx
>   */
> @@ -205,10 +218,10 @@ boards, we say we have two, but don't display a message 
> if we find only one. */
>  
>  /* Vitesse 7385 */
>  
> -#ifdef CONFIG_VSC7385
> -
>  #define CFG_VSC7385_BASE     0xF8000000
>  
> +#ifdef CONFIG_VSC7385_ENET
> +
>  #define CFG_BR1_PRELIM               (CFG_VSC7385_BASE | BR_PS_8 | BR_V)
>   
Here you use mnemonics for describing the base register settings. I know 
it's not new code, but it would be nice to be consistent
>  #define CFG_OR1_PRELIM               (OR_AM_128KB | OR_GPCM_CSNT | 
> OR_GPCM_XACS | \
>                               OR_GPCM_SCY_15 | OR_GPCM_SETA | OR_GPCM_TRLX | \
> @@ -384,7 +397,7 @@ boards, we say we have two, but don't display a message 
> if we find only one. */
>  #define CONFIG_HAS_ETH1
>  #define CONFIG_TSEC2_NAME  "TSEC1"
>  #define CFG_TSEC2_OFFSET     0x25000
> -#define CONFIG_UNKNOWN_TSEC  /* TSEC2 is proprietary */
> +
>  #define TSEC2_PHY_ADDR               4
>  #define TSEC2_PHYIDX         0
>  #define TSEC2_FLAGS          TSEC_GIGABIT
> @@ -619,11 +632,11 @@ boards, we say we have two, but don't display a message 
> if we find only one. */
>   */
>  #define CONFIG_ENV_OVERWRITE
>  
> -#ifdef CONFIG_TSEC1
> +#ifdef CONFIG_HAS_ETH0
>  #define CONFIG_ETHADDR               00:E0:0C:00:8C:01
>  #endif
>  
> -#ifdef CONFIG_TSEC2
> +#ifdef CONFIG_HAS_ETH1
>  #define CONFIG_ETH1ADDR              00:E0:0C:00:8C:02
>  #endif
>  
> diff --git a/include/configs/MPC837XERDB.h b/include/configs/MPC837XERDB.h
> index 2da4f29..066197f 100644
> --- a/include/configs/MPC837XERDB.h
> +++ b/include/configs/MPC837XERDB.h
> @@ -32,6 +32,14 @@
>  
>  #define CONFIG_PCI   1
>  
> +#define CONFIG_MISC_INIT_R
> +
> +/*
> + * On-board devices
> + */
> +#define CONFIG_TSEC_ENET             /* TSEC Ethernet support */
> +#define CONFIG_VSC7385_ENET
> +
>  /*
>   * System Clock Setup
>   */
> @@ -118,6 +126,22 @@
>  #define CFG_IMMR             0xE0000000
>  
>  /*
> + * Device configurations
> + */
> +
> +/* Vitesse 7385 */
> +
> +#ifdef CONFIG_VSC7385_ENET
> +
> +#define CONFIG_TSEC2
> +
> +/* The flash address and size of the VSC7385 firmware image */
> +#define CONFIG_VSC7385_IMAGE         0xFE7FE000
> +#define CONFIG_VSC7385_IMAGE_SIZE    8192
> +
> +#endif
> +
> +/*
>   * DDR Setup
>   */
>  #define CFG_DDR_BASE         0x00000000 /* DDR is system memory */
> @@ -251,15 +275,19 @@
>  #define CFG_FLASH_ERASE_TOUT 60000   /* Flash Erase Timeout (ms) */
>  #define CFG_FLASH_WRITE_TOUT 500     /* Flash Write Timeout (ms) */
>  
> +/* Vitesse 7385 */
> +
>  #define CFG_VSC7385_BASE     0xF0000000
>  
> -/* VSC7385 Gigabit Switch support */
> -#define CONFIG_VSC7385_ENET
> +#ifdef CONFIG_VSC7385_ENET
> +
>  #define CFG_BR2_PRELIM               0xf0000801              /* Base address 
> */
>  #define CFG_OR2_PRELIM               0xfffe09ff              /* 128K bytes*/
>  #define CFG_LBLAWBAR2_PRELIM CFG_VSC7385_BASE        /* Access Base */
>  #define CFG_LBLAWAR2_PRELIM  0x80000010              /* Access Size 128K */
>  
> +#endif
> +
>  /*
>   * Serial Port
>   */
> @@ -324,43 +352,43 @@
>  #define CONFIG_NET_MULTI
>  #define CONFIG_PCI_PNP               /* do pci plug-and-play */
>  
> -#undef CONFIG_EEPRO100
>  #undef CONFIG_PCI_SCAN_SHOW  /* show pci devices on startup */
>  #define CFG_PCI_SUBSYS_VENDORID 0x1957       /* Freescale */
>  #endif       /* CONFIG_PCI */
>  
> -#ifndef CONFIG_NET_MULTI
> -#define CONFIG_NET_MULTI     1
> -#endif
> -
>  /*
>   * TSEC
>   */
> -#define CONFIG_TSEC_ENET     /* TSEC ethernet support */
> -#define CFG_TSEC1_OFFSET     0x24000
> -#define CFG_TSEC1            (CFG_IMMR+CFG_TSEC1_OFFSET)
> -#define CFG_TSEC2_OFFSET     0x25000
> -#define CFG_TSEC2            (CFG_IMMR+CFG_TSEC2_OFFSET)
> +#ifdef CONFIG_TSEC_ENET
>  
> -/*
> - * TSEC ethernet configuration
> - */
> -#define CONFIG_GMII                  1       /* MII PHY management */
> -#define CONFIG_TSEC1                 1
> +#define CONFIG_NET_MULTI
> +#define CONFIG_GMII                  /* MII PHY management */
> +
> +#define CONFIG_TSEC1
> +
> +#ifdef CONFIG_TSEC1
> +#define CONFIG_HAS_ETH0
>  #define CONFIG_TSEC1_NAME            "TSEC0"
> -#define CONFIG_TSEC2                 1
> -#define CONFIG_TSEC2_NAME            "TSEC1"
> +#define CFG_TSEC1_OFFSET             0x24000
>  #define TSEC1_PHY_ADDR                       2
> -#define TSEC2_PHY_ADDR                       0x1c
>  #define TSEC1_FLAGS                  (TSEC_GIGABIT | TSEC_REDUCED)
> -#define TSEC2_FLAGS                  (TSEC_GIGABIT | TSEC_REDUCED)
>  #define TSEC1_PHYIDX                 0
> -#define TSEC2_PHYIDX                 0
> +#endif
>  
> +#ifdef CONFIG_TSEC2
> +#define CONFIG_HAS_ETH1
> +#define CONFIG_TSEC2_NAME            "TSEC1"
> +#define CFG_TSEC2_OFFSET             0x25000
> +#define TSEC2_PHY_ADDR                       0x1c
> +#define TSEC2_FLAGS                  (TSEC_GIGABIT | TSEC_REDUCED)
> +#define TSEC2_PHYIDX                 0
> +#endif
>  
>  /* Options are: TSEC[0-1] */
>  #define CONFIG_ETHPRIME                      "TSEC0"
>  
> +#endif
> +
>  /*
>   * Environment
>   */
> @@ -529,10 +557,13 @@
>   */
>  #define CONFIG_ENV_OVERWRITE
>  
> -#define CONFIG_HAS_ETH0                              /* add support for 
> "ethaddr" */
> -#define CONFIG_ETHADDR       00:04:9f:ef:04:01
> -#define CONFIG_HAS_ETH1                              /* add support for 
> "eth1addr" */
> -#define CONFIG_ETH1ADDR      00:04:9f:ef:04:02
> +#ifdef CONFIG_HAS_ETH0
> +#define CONFIG_ETHADDR               00:04:9f:ef:04:01
> +#endif
> +
> +#ifdef CONFIG_HAS_ETH1
> +#define CONFIG_ETH1ADDR              00:04:9f:ef:04:02
> +#endif
>  
>  #define CONFIG_IPADDR                10.0.0.2
>  #define CONFIG_SERVERIP              10.0.0.1
> diff --git a/include/vsc7385.h b/include/vsc7385.h
> new file mode 100644
> index 0000000..0432499
> --- /dev/null
> +++ b/include/vsc7385.h
> @@ -0,0 +1,13 @@
> +/*
> + * Header file for vsc7385.c
> + *
> + * Author: Timur Tabi <[EMAIL PROTECTED]>
> + *
> + * Copyright 2008 Freescale Semiconductor, Inc.  This file is licensed
> + * under the terms of the GNU General Public License version 2.  This
> + * program is licensed "as is" without any warranty of any kind, whether
> + * express or implied.
> + */
> +
> +int vsc7385_upload_firmware(void *firmware, unsigned int size);
> +
>   


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
U-Boot-Users mailing list
U-Boot-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to