@ -1,5 +1,5 @@
/*
* Copyright ( C ) 2001 , 2002 , 2003 Broadcom Corporation
* Copyright ( C ) 2001 , 2002 , 2003 , 2004 Broadcom Corporation
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
@ -43,6 +43,7 @@
# define SBMAC_ETH0_HWADDR "40:00:00:00:01:00"
# define SBMAC_ETH1_HWADDR "40:00:00:00:01:01"
# define SBMAC_ETH2_HWADDR "40:00:00:00:01:02"
# define SBMAC_ETH3_HWADDR "40:00:00:00:01:03"
# endif
@ -57,7 +58,7 @@ static char version1[] __devinitdata =
# define CONFIG_SBMAC_COALESCE
# define MAX_UNITS 3 /* More are supported, limit only on options */
# define MAX_UNITS 4 /* More are supported, limit only on options */
/* Time in jiffies before concluding the transmitter is hung. */
# define TX_TIMEOUT (2*HZ)
@ -85,11 +86,11 @@ MODULE_PARM_DESC(noisy_mii, "MII status messages");
The media type is usually passed in ' options [ ] ' .
*/
# ifdef MODULE
static int options [ MAX_UNITS ] = { - 1 , - 1 , - 1 } ;
static int options [ MAX_UNITS ] = { - 1 , - 1 , - 1 , - 1 } ;
module_param_array ( options , int , NULL , S_IRUGO ) ;
MODULE_PARM_DESC ( options , " 1- " __MODULE_STRING ( MAX_UNITS ) ) ;
static int full_duplex [ MAX_UNITS ] = { - 1 , - 1 , - 1 } ;
static int full_duplex [ MAX_UNITS ] = { - 1 , - 1 , - 1 , - 1 } ;
module_param_array ( full_duplex , int , NULL , S_IRUGO ) ;
MODULE_PARM_DESC ( full_duplex , " 1- " __MODULE_STRING ( MAX_UNITS ) ) ;
# endif
@ -105,13 +106,26 @@ MODULE_PARM_DESC(int_timeout, "Timeout value");
# endif
# include <asm/sibyte/sb1250.h>
# include <asm/sibyte/sb1250_defs.h>
# if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
# include <asm/sibyte/bcm1480_regs.h>
# include <asm/sibyte/bcm1480_int.h>
# elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
# include <asm/sibyte/sb1250_regs.h>
# include <asm/sibyte/sb1250_mac.h>
# include <asm/sibyte/sb1250_dma.h>
# include <asm/sibyte/sb1250_int.h>
# else
# error invalid SiByte MAC configuation
# endif
# include <asm/sibyte/sb1250_scd.h>
# include <asm/sibyte/sb1250_mac.h>
# include <asm/sibyte/sb1250_dma.h>
# if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
# define UNIT_INT(n) (K_BCM1480_INT_MAC_0 + ((n) * 2))
# elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
# define UNIT_INT(n) (K_INT_MAC_0 + (n))
# else
# error invalid SiByte MAC configuation
# endif
/**********************************************************************
* Simple types
@ -1476,10 +1490,10 @@ static void sbmac_channel_start(struct sbmac_softc *s)
* and make sure that RD_THRSH + WR_THRSH < = 128 for pass2 and above
* Use a larger RD_THRSH for gigabit
*/
if ( periph_rev > = 2 )
th_value = 64 ;
else
if ( soc_type = = K_SYS_SOC_TYPE_BCM1250 & & periph_rev < 2 )
th_value = 28 ;
else
th_value = 64 ;
fifo = V_MAC_TX_WR_THRSH ( 4 ) | /* Must be '4' or '8' */
( ( s - > sbm_speed = = sbmac_speed_1000 )
@ -1589,13 +1603,17 @@ static void sbmac_channel_start(struct sbmac_softc *s)
* Turn on the rest of the bits in the enable register
*/
# if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
__raw_writeq ( M_MAC_RXDMA_EN0 |
M_MAC_TXDMA_EN0 , s - > sbm_macenable ) ;
# elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
__raw_writeq ( M_MAC_RXDMA_EN0 |
M_MAC_TXDMA_EN0 |
M_MAC_RX_ENABLE |
M_MAC_TX_ENABLE , s - > sbm_macenable ) ;
# else
# error invalid SiByte MAC configuation
# endif
# ifdef CONFIG_SBMAC_COALESCE
/*
@ -1786,11 +1804,12 @@ static void sbmac_set_iphdr_offset(struct sbmac_softc *sc)
reg & = ~ M_MAC_IPHDR_OFFSET | V_MAC_IPHDR_OFFSET ( 15 ) ;
__raw_writeq ( reg , sc - > sbm_rxfilter ) ;
/* read system identification to determine revision */
if ( periph_rev > = 2 ) {
sc - > rx_hw_checksum = ENABLE ;
} else {
/* BCM1250 pass1 didn't have hardware checksum. Everything
later does . */
if ( soc_type = = K_SYS_SOC_TYPE_BCM1250 & & periph_rev < 2 ) {
sc - > rx_hw_checksum = DISABLE ;
} else {
sc - > rx_hw_checksum = ENABLE ;
}
}
@ -2220,7 +2239,7 @@ static void sbmac_setmulti(struct sbmac_softc *sc)
# if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR)
# if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) || defined(SBMAC_ETH3_HWADDR)
/**********************************************************************
* SBMAC_PARSE_XDIGIT ( str )
*
@ -2792,7 +2811,7 @@ static int sbmac_close(struct net_device *dev)
# if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR)
# if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) || defined(SBMAC_ETH3_HWADDR)
static void
sbmac_setup_hwaddr ( int chan , char * addr )
{
@ -2818,25 +2837,7 @@ sbmac_init_module(void)
unsigned long port ;
int chip_max_units ;
/*
* For bringup when not using the firmware , we can pre - fill
* the MAC addresses using the environment variables
* specified in this file ( or maybe from the config file ? )
*/
# ifdef SBMAC_ETH0_HWADDR
sbmac_setup_hwaddr ( 0 , SBMAC_ETH0_HWADDR ) ;
# endif
# ifdef SBMAC_ETH1_HWADDR
sbmac_setup_hwaddr ( 1 , SBMAC_ETH1_HWADDR ) ;
# endif
# ifdef SBMAC_ETH2_HWADDR
sbmac_setup_hwaddr ( 2 , SBMAC_ETH2_HWADDR ) ;
# endif
/*
* Walk through the Ethernet controllers and find
* those who have their MAC addresses set .
*/
/* Set the number of available units based on the SOC type. */
switch ( soc_type ) {
case K_SYS_SOC_TYPE_BCM1250 :
case K_SYS_SOC_TYPE_BCM1250_ALT :
@ -2848,6 +2849,10 @@ sbmac_init_module(void)
case K_SYS_SOC_TYPE_BCM1250_ALT2 : /* Hybrid */
chip_max_units = 2 ;
break ;
case K_SYS_SOC_TYPE_BCM1x55 :
case K_SYS_SOC_TYPE_BCM1x80 :
chip_max_units = 4 ;
break ;
default :
chip_max_units = 0 ;
break ;
@ -2855,6 +2860,32 @@ sbmac_init_module(void)
if ( chip_max_units > MAX_UNITS )
chip_max_units = MAX_UNITS ;
/*
* For bringup when not using the firmware , we can pre - fill
* the MAC addresses using the environment variables
* specified in this file ( or maybe from the config file ? )
*/
# ifdef SBMAC_ETH0_HWADDR
if ( chip_max_units > 0 )
sbmac_setup_hwaddr ( 0 , SBMAC_ETH0_HWADDR ) ;
# endif
# ifdef SBMAC_ETH1_HWADDR
if ( chip_max_units > 1 )
sbmac_setup_hwaddr ( 1 , SBMAC_ETH1_HWADDR ) ;
# endif
# ifdef SBMAC_ETH2_HWADDR
if ( chip_max_units > 2 )
sbmac_setup_hwaddr ( 2 , SBMAC_ETH2_HWADDR ) ;
# endif
# ifdef SBMAC_ETH3_HWADDR
if ( chip_max_units > 3 )
sbmac_setup_hwaddr ( 3 , SBMAC_ETH3_HWADDR ) ;
# endif
/*
* Walk through the Ethernet controllers and find
* those who have their MAC addresses set .
*/
for ( idx = 0 ; idx < chip_max_units ; idx + + ) {
/*
@ -2886,7 +2917,7 @@ sbmac_init_module(void)
printk ( KERN_DEBUG " sbmac: configuring MAC at %lx \n " , port ) ;
dev - > irq = K_INT_MAC_0 + idx ;
dev - > irq = UNIT_INT ( idx ) ;
dev - > base_addr = port ;
dev - > mem_end = 0 ;
if ( sbmac_init ( dev , idx ) ) {