diff options
Diffstat (limited to 'drivers/staging/slicoss')
| -rw-r--r-- | drivers/staging/slicoss/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/staging/slicoss/README | 41 | ||||
| -rw-r--r-- | drivers/staging/slicoss/TODO | 37 | ||||
| -rw-r--r-- | drivers/staging/slicoss/slic.h | 500 | ||||
| -rw-r--r-- | drivers/staging/slicoss/slichw.h | 6 | ||||
| -rw-r--r-- | drivers/staging/slicoss/slicoss.c | 1244 | 
6 files changed, 511 insertions, 1319 deletions
diff --git a/drivers/staging/slicoss/Kconfig b/drivers/staging/slicoss/Kconfig index d2993d339bc..5c2a15b42df 100644 --- a/drivers/staging/slicoss/Kconfig +++ b/drivers/staging/slicoss/Kconfig @@ -1,6 +1,6 @@  config SLICOSS  	tristate "Alacritech Gigabit IS-NIC support" -	depends on PCI && X86 && NETDEV_1000 +	depends on PCI && X86 && NET  	default n  	help  	  This driver supports Alacritech's IS-NIC gigabit ethernet cards. diff --git a/drivers/staging/slicoss/README b/drivers/staging/slicoss/README index 70f49099c06..4fa50e73ce8 100644 --- a/drivers/staging/slicoss/README +++ b/drivers/staging/slicoss/README @@ -5,44 +5,3 @@ This driver is supposed to support:  	Kalahari cards (dual and quad port PCI-e Gigabit) copper and fiber  The driver was actually tested on Oasis and Kalahari cards. - -TODO: -	- move firmware loading to request_firmware() -	- remove direct memory access of structures -	- any remaining sparse and checkpatch.pl warnings - -	- use net_device_ops -	- use dev->stats rather than adapter->stats -	- don't cast netdev_priv it is already void -	- use compare_ether_addr -	- GET RID OF MACROS -	- work on all architectures -	   - without CONFIG_X86_64 confusion -	   - do 64 bit correctly -	   - don't depend on order of union -	- get rid of ASSERT(), use BUG() instead but only where necessary -	  looks like most aren't really useful -	- no new SIOCDEVPRIVATE ioctl allowed -	- don't use module_param for configuring interrupt mitigation -	  use ethtool instead -	- reorder code to elminate use of forward declarations -	- don't keep private linked list of drivers. -	- remove all the gratiutous debug infrastructure -	- use PCI_DEVICE() -	- do ethtool correctly using ethtool_ops -	- NAPI? -	- wasted overhead of extra stats -	- state variables for things that are -	  easily availble and shouldn't be kept in card structure, cardnum, ... -	  slotnumber, events, ... -	- get rid of slic_spinlock wrapper -	- volatile == bad design => bad code -	- locking too fine grained, not designed just throw more locks -	  at problem - - -Please send patches to: -        Greg Kroah-Hartman <gregkh@suse.de> -and Cc: Lior Dotan <liodot@gmail.com> and Christopher Harrer -<charrer@alacritech.com> as well as they are also able to test out any -changes. diff --git a/drivers/staging/slicoss/TODO b/drivers/staging/slicoss/TODO new file mode 100644 index 00000000000..20cc9abdc46 --- /dev/null +++ b/drivers/staging/slicoss/TODO @@ -0,0 +1,37 @@ +TODO: +	- move firmware loading to request_firmware() +	- remove direct memory access of structures +	- any remaining sparse and checkpatch.pl warnings + +	- use net_device_ops +	- use dev->stats rather than adapter->stats +	- don't cast netdev_priv it is already void +	- GET RID OF MACROS +	- work on all architectures +	   - without CONFIG_X86_64 confusion +	   - do 64 bit correctly +	   - don't depend on order of union +	- get rid of ASSERT(), use BUG() instead but only where necessary +	  looks like most aren't really useful +	- no new SIOCDEVPRIVATE ioctl allowed +	- don't use module_param for configuring interrupt mitigation +	  use ethtool instead +	- reorder code to elminate use of forward declarations +	- don't keep private linked list of drivers. +	- use PCI_DEVICE() +	- do ethtool correctly using ethtool_ops +	- NAPI? +	- wasted overhead of extra stats +	- state variables for things that are +	  easily available and shouldn't be kept in card structure, cardnum, ... +	  slotnumber, events, ... +	- get rid of slic_spinlock wrapper +	- volatile == bad design => bad code +	- locking too fine grained, not designed just throw more locks +	  at problem + +Please send patches to: +        Greg Kroah-Hartman <gregkh@linuxfoundation.org> +and Cc: Lior Dotan <liodot@gmail.com> and Christopher Harrer +<charrer@alacritech.com> as well as they are also able to test out any +changes. diff --git a/drivers/staging/slicoss/slic.h b/drivers/staging/slicoss/slic.h index ebdcc6f91fd..3a5aa882b95 100644 --- a/drivers/staging/slicoss/slic.h +++ b/drivers/staging/slicoss/slic.h @@ -43,15 +43,15 @@  /* firmware stuff */  #define OASIS_UCODE_VERS_STRING	"1.2" -#define OASIS_UCODE_VERS_DATE  	"2006/03/27 15:10:37" -#define OASIS_UCODE_HOSTIF_ID  	3 +#define OASIS_UCODE_VERS_DATE	"2006/03/27 15:10:37" +#define OASIS_UCODE_HOSTIF_ID	3  #define MOJAVE_UCODE_VERS_STRING	"1.2" -#define MOJAVE_UCODE_VERS_DATE  	"2006/03/27 15:12:22" -#define MOJAVE_UCODE_HOSTIF_ID  	3 +#define MOJAVE_UCODE_VERS_DATE		"2006/03/27 15:12:22" +#define MOJAVE_UCODE_HOSTIF_ID		3  #define GB_RCVUCODE_VERS_STRING	"1.2" -#define GB_RCVUCODE_VERS_DATE  	"2006/03/27 15:12:15" +#define GB_RCVUCODE_VERS_DATE	"2006/03/27 15:12:15"  static u32 OasisRcvUCodeLen = 512;  static u32 GBRcvUCodeLen = 512;  #define SECTION_SIZE 65536 @@ -65,12 +65,12 @@ struct slic_spinlock {  #define SLIC_RSPQ_BUFSINPAGE      (PAGE_SIZE / SLIC_RSPBUF_SIZE)  struct slic_rspqueue { -    u32             offset; -    u32             pageindex; -    u32             num_pages; -    struct slic_rspbuf *rspbuf; -    u32 *vaddr[SLIC_RSPQ_PAGES_GB]; -    dma_addr_t          paddr[SLIC_RSPQ_PAGES_GB]; +	u32             offset; +	u32             pageindex; +	u32             num_pages; +	struct slic_rspbuf *rspbuf; +	u32 *vaddr[SLIC_RSPQ_PAGES_GB]; +	dma_addr_t          paddr[SLIC_RSPQ_PAGES_GB];  };  #define SLIC_RCVQ_EXPANSION         1 @@ -82,20 +82,20 @@ struct slic_rspqueue {  #define SLIC_RCVQ_FILLTHRESH        (SLIC_RCVQ_ENTRIES - SLIC_RCVQ_FILLENTRIES)  struct slic_rcvqueue { -    struct sk_buff    *head; -    struct sk_buff    *tail; -    u32            count; -    u32            size; -    u32            errors; +	struct sk_buff    *head; +	struct sk_buff    *tail; +	u32            count; +	u32            size; +	u32            errors;  };  struct slic_rcvbuf_info { -    u32     id; -    u32     starttime; -    u32     stoptime; -    u32     slicworld; -    u32     lasttime; -    u32     lastid; +	u32     id; +	u32     starttime; +	u32     stoptime; +	u32     slicworld; +	u32     lasttime; +	u32     lastid;  };  /*   SLIC Handle structure.  Used to restrict handle values to @@ -113,12 +113,12 @@ struct slic_handle_word {  };  struct slic_handle { -    struct slic_handle_word  token;  /* token passed between host and card*/ -    ushort                      type; -    void *address;    /* actual address of the object*/ -    ushort                      offset; -    struct slic_handle       *other_handle; -    struct slic_handle       *next; +	struct slic_handle_word  token;  /* token passed between host and card*/ +	ushort                      type; +	void *address;    /* actual address of the object*/ +	ushort                      offset; +	struct slic_handle       *other_handle; +	struct slic_handle       *next;  };  #define SLIC_HANDLE_FREE        0x0000 @@ -134,17 +134,17 @@ struct slic_handle {  #define SLIC_HOSTCMD_SIZE    512  struct slic_hostcmd { -    struct slic_host64_cmd  cmd64; -    u32                    type; -    struct sk_buff            *skb; -    u32                    paddrl; -    u32                    paddrh; -    u32                    busy; -    u32                    cmdsize; -    ushort                     numbufs; -    struct slic_handle    *pslic_handle;/* handle associated with command */ -    struct slic_hostcmd    *next; -    struct slic_hostcmd    *next_all; +	struct slic_host64_cmd  cmd64; +	u32                    type; +	struct sk_buff            *skb; +	u32                    paddrl; +	u32                    paddrh; +	u32                    busy; +	u32                    cmdsize; +	ushort                     numbufs; +	struct slic_handle    *pslic_handle;/* handle associated with command */ +	struct slic_hostcmd    *next; +	struct slic_hostcmd    *next_all;  };  #define SLIC_CMDQ_CMDSINPAGE    (PAGE_SIZE / SLIC_HOSTCMD_SIZE) @@ -228,35 +228,35 @@ struct mcast_address {  #define SLIC_CARD_STATE(x)    ((x == CARD_UP) ? "UP" : "Down")  struct slic_iface_stats { -    /* -     * Stats -     */ -    u64        xmt_bytes; -    u64        xmt_ucast; -    u64        xmt_mcast; -    u64        xmt_bcast; -    u64        xmt_errors; -    u64        xmt_discards; -    u64        xmit_collisions; -    u64        xmit_excess_xmit_collisions; -    u64        rcv_bytes; -    u64        rcv_ucast; -    u64        rcv_mcast; -    u64        rcv_bcast; -    u64        rcv_errors; -    u64        rcv_discards; +	/* +	* Stats +	*/ +	u64        xmt_bytes; +	u64        xmt_ucast; +	u64        xmt_mcast; +	u64        xmt_bcast; +	u64        xmt_errors; +	u64        xmt_discards; +	u64        xmit_collisions; +	u64        xmit_excess_xmit_collisions; +	u64        rcv_bytes; +	u64        rcv_ucast; +	u64        rcv_mcast; +	u64        rcv_bcast; +	u64        rcv_errors; +	u64        rcv_discards;  };  struct sliccp_stats { -    u64        xmit_tcp_segs; -    u64        xmit_tcp_bytes; -    u64        rcv_tcp_segs; -    u64        rcv_tcp_bytes; +	u64        xmit_tcp_segs; +	u64        xmit_tcp_bytes; +	u64        rcv_tcp_segs; +	u64        rcv_tcp_bytes;  };  struct slicnet_stats { -    struct sliccp_stats        tcp; -    struct slic_iface_stats      iface; +	struct sliccp_stats        tcp; +	struct slic_iface_stats      iface;  };  #define SLIC_LOADTIMER_PERIOD     1 @@ -285,51 +285,49 @@ struct slicnet_stats {  #define SLIC_INTAGG_5GB           100  struct ether_header { -    unsigned char    ether_dhost[6]; -    unsigned char    ether_shost[6]; -    ushort   ether_type; +	unsigned char    ether_dhost[6]; +	unsigned char    ether_shost[6]; +	ushort   ether_type;  };  struct sliccard { -    uint              busnumber; -    uint              slotnumber; -    uint              state; -    uint              cardnum; -    uint              card_size; -    uint              adapters_activated; -    uint              adapters_allocated; -    uint              adapters_sleeping; -    uint              gennumber; -    u32           events; -    u32           loadlevel_current; -    u32           load; -    uint              reset_in_progress; -    u32           pingstatus; -    u32           bad_pingstatus; -    struct timer_list loadtimer; -    u32           loadtimerset; -    uint              config_set; -    struct slic_config  config; -    struct dentry      *debugfs_dir; -    struct dentry      *debugfs_cardinfo; -    struct adapter  *master; -    struct adapter  *adapter[SLIC_MAX_PORTS]; -    struct sliccard *next; -    u32             error_interrupts; -    u32             error_rmiss_interrupts; -    u32             rcv_interrupts; -    u32             xmit_interrupts; -    u32             num_isrs; -    u32             false_interrupts; -    u32             max_isr_rcvs; -    u32             max_isr_xmits; -    u32             rcv_interrupt_yields; -    u32             tx_packets; -    u32             debug_ix; -    ushort              reg_type[32]; -    ushort              reg_offset[32]; -    u32             reg_value[32]; -    u32             reg_valueh[32]; +	uint              busnumber; +	uint              slotnumber; +	uint              state; +	uint              cardnum; +	uint              card_size; +	uint              adapters_activated; +	uint              adapters_allocated; +	uint              adapters_sleeping; +	uint              gennumber; +	u32           events; +	u32           loadlevel_current; +	u32           load; +	uint              reset_in_progress; +	u32           pingstatus; +	u32           bad_pingstatus; +	struct timer_list loadtimer; +	u32           loadtimerset; +	uint              config_set; +	struct slic_config  config; +	struct adapter  *master; +	struct adapter  *adapter[SLIC_MAX_PORTS]; +	struct sliccard *next; +	u32             error_interrupts; +	u32             error_rmiss_interrupts; +	u32             rcv_interrupts; +	u32             xmit_interrupts; +	u32             num_isrs; +	u32             false_interrupts; +	u32             max_isr_rcvs; +	u32             max_isr_xmits; +	u32             rcv_interrupt_yields; +	u32             tx_packets; +	u32             debug_ix; +	ushort              reg_type[32]; +	ushort              reg_offset[32]; +	u32             reg_value[32]; +	u32             reg_valueh[32];  };  #define NUM_CFG_SPACES      2 @@ -337,182 +335,174 @@ struct sliccard {  #define NUM_CFG_REG_ULONGS  (NUM_CFG_REGS / sizeof(u32))  struct physcard { -    struct adapter  *adapter[SLIC_MAX_PORTS]; -    struct physcard *next; -    uint                adapters_allocd; +	struct adapter  *adapter[SLIC_MAX_PORTS]; +	struct physcard *next; +	uint                adapters_allocd; - /*  the following is not currently needed -    u32               bridge_busnum; -    u32               bridge_cfg[NUM_CFG_SPACES][NUM_CFG_REG_ULONGS]; - */ +/*  the following is not currently needed +	u32              bridge_busnum; +	u32              bridge_cfg[NUM_CFG_SPACES][NUM_CFG_REG_ULONGS]; +*/  };  struct base_driver { -    struct slic_spinlock driver_lock; -    u32              num_slic_cards; -    u32              num_slic_ports; -    u32              num_slic_ports_active; -    u32              dynamic_intagg; -    struct sliccard  *slic_card; -    struct physcard  *phys_card; -    uint                 cardnuminuse[SLIC_MAX_CARDS]; +	struct slic_spinlock driver_lock; +	u32              num_slic_cards; +	u32              num_slic_ports; +	u32              num_slic_ports_active; +	u32              dynamic_intagg; +	struct sliccard  *slic_card; +	struct physcard  *phys_card; +	uint                 cardnuminuse[SLIC_MAX_CARDS];  };  struct slic_shmem { -    volatile u32          isr; -    volatile u32          linkstatus; -    volatile struct slic_stats     inicstats; -}; - -struct slic_reg_params { -    u32       linkspeed; -    u32       linkduplex; -    u32       fail_on_bad_eeprom; +	volatile u32          isr; +	volatile u32          linkstatus; +	volatile struct slic_stats     inicstats;  };  struct slic_upr { -    uint               adapter; -    u32            upr_request; -    u32            upr_data; -    u32            upr_data_h; -    u32            upr_buffer; -    u32            upr_buffer_h; -    struct slic_upr *next; +	uint               adapter; +	u32            upr_request; +	u32            upr_data; +	u32            upr_data_h; +	u32            upr_buffer; +	u32            upr_buffer_h; +	struct slic_upr *next;  };  struct slic_ifevents { -    uint        oflow802; -    uint        uflow802; -    uint        Tprtoflow; -    uint        rcvearly; -    uint        Bufov; -    uint        Carre; -    uint        Longe; -    uint        Invp; -    uint        Crc; -    uint        Drbl; -    uint        Code; -    uint        IpHlen; -    uint        IpLen; -    uint        IpCsum; -    uint        TpCsum; -    uint        TpHlen; +	uint        oflow802; +	uint        uflow802; +	uint        Tprtoflow; +	uint        rcvearly; +	uint        Bufov; +	uint        Carre; +	uint        Longe; +	uint        Invp; +	uint        Crc; +	uint        Drbl; +	uint        Code; +	uint        IpHlen; +	uint        IpLen; +	uint        IpCsum; +	uint        TpCsum; +	uint        TpHlen;  };  struct adapter { -    void *ifp; -    struct sliccard *card; -    uint                port; -    struct physcard *physcard; -    uint                physport; -    uint                cardindex; -    uint                card_size; -    uint                chipid; -    struct net_device  *netdev; -    struct net_device  *next_netdevice; -    struct slic_spinlock     adapter_lock; -    struct slic_spinlock     reset_lock; -    struct pci_dev     *pcidev; -    uint                busnumber; -    uint                slotnumber; -    uint                functionnumber; -    ushort              vendid; -    ushort              devid; -    ushort              subsysid; -    u32             irq; -    void __iomem *memorybase; -    u32             memorylength; -    u32             drambase; -    u32             dramlength; -    uint                queues_initialized; -    uint                allocated; -    uint                activated; -    u32             intrregistered; -    uint                isp_initialized; -    uint                gennumber; -    u32             curaddrupper; -    struct slic_shmem      *pshmem; -    dma_addr_t          phys_shmem; -    u32             isrcopy; -    __iomem struct slic_regs       *slic_regs; -    unsigned char               state; -    unsigned char               linkstate; -    unsigned char               linkspeed; -    unsigned char               linkduplex; -    uint                flags; -    unsigned char               macaddr[6]; -    unsigned char               currmacaddr[6]; -    u32             macopts; -    ushort              devflags_prev; -    u64             mcastmask; -    struct mcast_address   *mcastaddrs; -    struct slic_upr   *upr_list; -    uint                upr_busy; -    struct timer_list   pingtimer; -    u32             pingtimerset; -    struct timer_list   loadtimer; -    u32             loadtimerset; -    struct dentry      *debugfs_entry; -    struct slic_spinlock     upr_lock; -    struct slic_spinlock     bit64reglock; -    struct slic_rspqueue     rspqueue; -    struct slic_rcvqueue     rcvqueue; -    struct slic_cmdqueue     cmdq_free; -    struct slic_cmdqueue     cmdq_done; -    struct slic_cmdqueue     cmdq_all; -    struct slic_cmdqmem      cmdqmem; -    /* -     *  SLIC Handles -    */ -    struct slic_handle slic_handles[SLIC_CMDQ_MAXCMDS+1]; /* Object handles*/ -    struct slic_handle *pfree_slic_handles;          /* Free object handles*/ -    struct slic_spinlock     handle_lock;           /* Object handle list lock*/ -    ushort              slic_handle_ix; - -    u32             xmitq_full; -    u32             all_reg_writes; -    u32             icr_reg_writes; -    u32             isr_reg_writes; -    u32             error_interrupts; -    u32             error_rmiss_interrupts; -    u32             rx_errors; -    u32             rcv_drops; -    u32             rcv_interrupts; -    u32             xmit_interrupts; -    u32             linkevent_interrupts; -    u32             upr_interrupts; -    u32             num_isrs; -    u32             false_interrupts; -    u32             tx_packets; -    u32             xmit_completes; -    u32             tx_drops; -    u32             rcv_broadcasts; -    u32             rcv_multicasts; -    u32             rcv_unicasts; -    u32             max_isr_rcvs; -    u32             max_isr_xmits; -    u32             rcv_interrupt_yields; -    u32             intagg_period; -    struct inicpm_state    *inicpm_info; -    void *pinicpm_info; -    struct slic_reg_params   reg_params; -    struct slic_ifevents  if_events; -    struct slic_stats        inicstats_prev; -    struct slicnet_stats     slic_stats; +	void *ifp; +	struct sliccard *card; +	uint                port; +	struct physcard *physcard; +	uint                physport; +	uint                cardindex; +	uint                card_size; +	uint                chipid; +	struct net_device  *netdev; +	struct slic_spinlock     adapter_lock; +	struct slic_spinlock     reset_lock; +	struct pci_dev     *pcidev; +	uint                busnumber; +	uint                slotnumber; +	uint                functionnumber; +	ushort              vendid; +	ushort              devid; +	ushort              subsysid; +	u32             irq; +	u32             drambase; +	u32             dramlength; +	uint                queues_initialized; +	uint                allocated; +	uint                activated; +	u32             intrregistered; +	uint                isp_initialized; +	uint                gennumber; +	u32             curaddrupper; +	struct slic_shmem      *pshmem; +	dma_addr_t          phys_shmem; +	u32             isrcopy; +	__iomem struct slic_regs       *slic_regs; +	unsigned char               state; +	unsigned char               linkstate; +	unsigned char               linkspeed; +	unsigned char               linkduplex; +	uint                flags; +	unsigned char               macaddr[6]; +	unsigned char               currmacaddr[6]; +	u32             macopts; +	ushort              devflags_prev; +	u64             mcastmask; +	struct mcast_address   *mcastaddrs; +	struct slic_upr   *upr_list; +	uint                upr_busy; +	struct timer_list   pingtimer; +	u32             pingtimerset; +	struct timer_list   loadtimer; +	u32             loadtimerset; +	struct slic_spinlock     upr_lock; +	struct slic_spinlock     bit64reglock; +	struct slic_rspqueue     rspqueue; +	struct slic_rcvqueue     rcvqueue; +	struct slic_cmdqueue     cmdq_free; +	struct slic_cmdqueue     cmdq_done; +	struct slic_cmdqueue     cmdq_all; +	struct slic_cmdqmem      cmdqmem; +	/* +	*  SLIC Handles +	*/ +	/* Object handles*/ +	struct slic_handle slic_handles[SLIC_CMDQ_MAXCMDS+1]; +	/* Free object handles*/ +	struct slic_handle *pfree_slic_handles; +	/* Object handle list lock*/ +	struct slic_spinlock     handle_lock; +	ushort              slic_handle_ix; + +	u32             xmitq_full; +	u32             all_reg_writes; +	u32             icr_reg_writes; +	u32             isr_reg_writes; +	u32             error_interrupts; +	u32             error_rmiss_interrupts; +	u32             rx_errors; +	u32             rcv_drops; +	u32             rcv_interrupts; +	u32             xmit_interrupts; +	u32             linkevent_interrupts; +	u32             upr_interrupts; +	u32             num_isrs; +	u32             false_interrupts; +	u32             tx_packets; +	u32             xmit_completes; +	u32             tx_drops; +	u32             rcv_broadcasts; +	u32             rcv_multicasts; +	u32             rcv_unicasts; +	u32             max_isr_rcvs; +	u32             max_isr_xmits; +	u32             rcv_interrupt_yields; +	u32             intagg_period; +	struct inicpm_state    *inicpm_info; +	void *pinicpm_info; +	struct slic_ifevents  if_events; +	struct slic_stats        inicstats_prev; +	struct slicnet_stats     slic_stats;  };  #define UPDATE_STATS(largestat, newstat, oldstat)                        \  {                                                                        \ -    if ((newstat) < (oldstat))                                           \ -	(largestat) += ((newstat) + (0xFFFFFFFF - oldstat + 1));         \ -    else                                                                 \ -	(largestat) += ((newstat) - (oldstat));                          \ +	if ((newstat) < (oldstat))                                       \ +		(largestat) += ((newstat) + (0xFFFFFFFF - oldstat + 1)); \ +	else                                                             \ +		(largestat) += ((newstat) - (oldstat));                  \  }  #define UPDATE_STATS_GB(largestat, newstat, oldstat)                     \  {                                                                        \ -    (largestat) += ((newstat) - (oldstat));                              \ +	(largestat) += ((newstat) - (oldstat));                          \  }  #if BITS_PER_LONG == 64 diff --git a/drivers/staging/slicoss/slichw.h b/drivers/staging/slicoss/slichw.h index 6275d452967..21cd02b8b7e 100644 --- a/drivers/staging/slicoss/slichw.h +++ b/drivers/staging/slicoss/slichw.h @@ -450,7 +450,7 @@ struct slic_regs {  	u32	pad34;  #define SLIC_DBAR64		0x0108 -	u32	slic_cbar64; 	/* 64 bit Xmt Cmd buf addr regs. */ +	u32	slic_cbar64;	/* 64 bit Xmt Cmd buf addr regs. */  	u32	pad35;  #define SLIC_CBAR64		0x0110 @@ -478,11 +478,11 @@ struct slic_regs {  	u32	slic_read_xf_info;	/* Read Transformer info */  	u32	pad41; -#define SLIC_READ_XF_INFO 	0x0140 +#define SLIC_READ_XF_INFO	0x0140  	u32	slic_write_xf_info;	/* Write Transformer info */  	u32	pad42; -#define SLIC_WRITE_XF_INFO 	0x0148 +#define SLIC_WRITE_XF_INFO	0x0148  	u32	RSVD1;		/* TOE Only */  	u32	pad43; diff --git a/drivers/staging/slicoss/slicoss.c b/drivers/staging/slicoss/slicoss.c index 18f11039bb5..48841e7c2f7 100644 --- a/drivers/staging/slicoss/slicoss.c +++ b/drivers/staging/slicoss/slicoss.c @@ -47,7 +47,7 @@   *      Oasis cards (single and dual port PCI-x Gigabit) copper and fiber   *      Kalahari cards (dual and quad port PCI-e Gigabit) copper and fiber   * - * The driver was acutally tested on Oasis and Kalahari cards. + * The driver was actually tested on Oasis and Kalahari cards.   *   *   * NOTE: This is the standard, non-accelerated version of Alacritech's @@ -62,6 +62,7 @@  #define SLIC_OFFLOAD_IP_CHECKSUM		1  #define STATS_TIMER_INTERVAL			2  #define PING_TIMER_INTERVAL			    1 +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt  #include <linux/kernel.h>  #include <linux/string.h> @@ -76,10 +77,10 @@  #include <linux/bitops.h>  #include <linux/io.h>  #include <linux/netdevice.h> +#include <linux/crc32.h>  #include <linux/etherdevice.h>  #include <linux/skbuff.h>  #include <linux/delay.h> -#include <linux/debugfs.h>  #include <linux/seq_file.h>  #include <linux/kthread.h>  #include <linux/module.h> @@ -98,23 +99,15 @@  #include "slic.h"  static uint slic_first_init = 1; -static char *slic_banner = "Alacritech SLIC Technology(tm) Server "\ +static char *slic_banner = "Alacritech SLIC Technology(tm) Server "  		"and Storage Accelerator (Non-Accelerated)";  static char *slic_proc_version = "2.0.351  2006/07/14 12:26:00"; -static char *slic_product_name = "SLIC Technology(tm) Server "\ -		"and Storage Accelerator (Non-Accelerated)"; -static char *slic_vendor = "Alacritech, Inc."; - -static int slic_debug = 1; -static int debug = -1; -static struct net_device *head_netdevice;  static struct base_driver slic_global = { {}, 0, 0, 0, 1, NULL, NULL };  static int intagg_delay = 100;  static u32 dynamic_intagg;  static unsigned int rcv_count; -static struct dentry *slic_debugfs;  #define DRV_NAME          "slicoss"  #define DRV_VERSION       "2.0.1" @@ -134,7 +127,7 @@ MODULE_PARM_DESC(dynamic_intagg, "Dynamic Interrupt Aggregation Setting");  module_param(intagg_delay, int, 0);  MODULE_PARM_DESC(intagg_delay, "uSec Interrupt Aggregation Delay"); -static DEFINE_PCI_DEVICE_TABLE(slic_pci_tbl) = { +static const struct pci_device_id slic_pci_tbl[] = {  	{ PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_1GB_DEVICE_ID) },  	{ PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_2GB_DEVICE_ID) },  	{ 0 } @@ -142,56 +135,6 @@ static DEFINE_PCI_DEVICE_TABLE(slic_pci_tbl) = {  MODULE_DEVICE_TABLE(pci, slic_pci_tbl); -#ifdef ASSERT -#undef ASSERT -#endif - -static void slic_assert_fail(void) -{ -	u32 cpuid; -	u32 curr_pid; -	cpuid = smp_processor_id(); -	curr_pid = current->pid; - -	printk(KERN_ERR "%s CPU # %d ---- PID # %d\n", -	       __func__, cpuid, curr_pid); -} - -#ifndef ASSERT -#define ASSERT(a) do {							\ -	if (!(a)) {							\ -		printk(KERN_ERR "slicoss ASSERT() Failure: function %s"	\ -			"line %d\n", __func__, __LINE__);		\ -		slic_assert_fail();					\ -	}								\ -} while (0) -#endif - - -#define SLIC_GET_SLIC_HANDLE(_adapter, _pslic_handle)                   \ -{                                                                       \ -    spin_lock_irqsave(&_adapter->handle_lock.lock,                      \ -			_adapter->handle_lock.flags);                   \ -    _pslic_handle  =  _adapter->pfree_slic_handles;                     \ -    if (_pslic_handle) {                                                \ -	ASSERT(_pslic_handle->type == SLIC_HANDLE_FREE);                \ -	_adapter->pfree_slic_handles = _pslic_handle->next;             \ -    }                                                                   \ -    spin_unlock_irqrestore(&_adapter->handle_lock.lock,                 \ -			_adapter->handle_lock.flags);                   \ -} - -#define SLIC_FREE_SLIC_HANDLE(_adapter, _pslic_handle)                  \ -{                                                                       \ -    _pslic_handle->type = SLIC_HANDLE_FREE;                             \ -    spin_lock_irqsave(&_adapter->handle_lock.lock,                      \ -			_adapter->handle_lock.flags);                   \ -    _pslic_handle->next = _adapter->pfree_slic_handles;                 \ -    _adapter->pfree_slic_handles = _pslic_handle;                       \ -    spin_unlock_irqrestore(&_adapter->handle_lock.lock,                 \ -			_adapter->handle_lock.flags);                   \ -} -  static inline void slic_reg32_write(void __iomem *reg, u32 value, bool flush)  {  	writel(value, reg); @@ -216,76 +159,14 @@ static inline void slic_reg64_write(struct adapter *adapter, void __iomem *reg,  				adapter->bit64reglock.flags);  } -/* - * Functions to obtain the CRC corresponding to the destination mac address. - * This is a standard ethernet CRC in that it is a 32-bit, reflected CRC using - * the polynomial: - *   x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + - *   x^4 + x^2 + x^1. - * - * After the CRC for the 6 bytes is generated (but before the value is - * complemented), - * we must then transpose the value and return bits 30-23. - * - */ -static u32 slic_crc_table[256];	/* Table of CRCs for all possible byte values */ -static u32 slic_crc_init;	/* Is table initialized */ - -/* - *  Contruct the CRC32 table - */ -static void slic_mcast_init_crc32(void) -{ -	u32 c;		/*  CRC shit reg                 */ -	u32 e = 0;		/*  Poly X-or pattern            */ -	int i;			/*  counter                      */ -	int k;			/*  byte being shifted into crc  */ - -	static int p[] = { 0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26 }; - -	for (i = 0; i < ARRAY_SIZE(p); i++) -		e |= 1L << (31 - p[i]); - -	for (i = 1; i < 256; i++) { -		c = i; -		for (k = 8; k; k--) -			c = c & 1 ? (c >> 1) ^ e : c >> 1; -		slic_crc_table[i] = c; -	} -} - -/* - *  Return the MAC hast as described above. - */ -static unsigned char slic_mcast_get_mac_hash(char *macaddr) -{ -	u32 crc; -	char *p; -	int i; -	unsigned char machash = 0; - -	if (!slic_crc_init) { -		slic_mcast_init_crc32(); -		slic_crc_init = 1; -	} - -	crc = 0xFFFFFFFF;	/* Preload shift register, per crc-32 spec */ -	for (i = 0, p = macaddr; i < 6; ++p, ++i) -		crc = (crc >> 8) ^ slic_crc_table[(crc ^ *p) & 0xFF]; - -	/* Return bits 1-8, transposed */ -	for (i = 1; i < 9; i++) -		machash |= (((crc >> i) & 1) << (8 - i)); - -	return machash; -} -  static void slic_mcast_set_bit(struct adapter *adapter, char *address)  {  	unsigned char crcpoly;  	/* Get the CRC polynomial for the mac address */ -	crcpoly = slic_mcast_get_mac_hash(address); +	/* we use bits 1-8 (lsb), bitwise reversed, +	 * msb (= lsb bit 0 before bitrev) is automatically discarded */ +	crcpoly = (ether_crc(ETH_ALEN, address)>>23);  	/* We only have space on the SLIC for 64 entries.  Lop  	 * off the top two bits. (2^6 = 64) @@ -325,11 +206,8 @@ static void slic_timer_ping(ulong dev)  	struct adapter *adapter;  	struct sliccard *card; -	ASSERT(dev);  	adapter = netdev_priv((struct net_device *)dev); -	ASSERT(adapter);  	card = adapter->card; -	ASSERT(card);  	adapter->pingtimer.expires = jiffies + (PING_TIMER_INTERVAL * HZ);  	add_timer(&adapter->pingtimer); @@ -361,9 +239,6 @@ static void slic_link_config(struct adapter *adapter,  	if (adapter->state != ADAPT_UP)  		return; -	ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID) -	       || (adapter->devid == SLIC_2GB_DEVICE_ID)); -  	if (linkspeed > LINK_1000MB)  		linkspeed = LINK_AUTOSPEED;  	if (linkduplex > LINK_AUTOD) @@ -514,14 +389,13 @@ static int slic_card_download_gbrcv(struct adapter *adapter)  		file = "slicoss/gbrcvucode.sys";  		break;  	default: -		ASSERT(0); -		break; +		return -ENOENT;  	}  	ret = request_firmware(&fw, file, &adapter->pcidev->dev);  	if (ret) {  		dev_err(&adapter->pcidev->dev, -			"SLICOSS: Failed to load firmware %s\n", file); +			"Failed to load firmware %s\n", file);  		return ret;  	} @@ -529,15 +403,16 @@ static int slic_card_download_gbrcv(struct adapter *adapter)  	index += 4;  	switch (adapter->devid) {  	case SLIC_2GB_DEVICE_ID: -		if (rcvucodelen != OasisRcvUCodeLen) +		if (rcvucodelen != OasisRcvUCodeLen) { +			release_firmware(fw);  			return -EINVAL; +		}  		break;  	case SLIC_1GB_DEVICE_ID: -		if (rcvucodelen != GBRcvUCodeLen) +		if (rcvucodelen != GBRcvUCodeLen) { +			release_firmware(fw);  			return -EINVAL; -		break; -	default: -		ASSERT(0); +		}  		break;  	}  	/* start download */ @@ -593,18 +468,16 @@ static int slic_card_download(struct adapter *adapter)  		file = "slicoss/gbdownload.sys";  		break;  	default: -		ASSERT(0); -		break; +		return -ENOENT;  	}  	ret = request_firmware(&fw, file, &adapter->pcidev->dev);  	if (ret) {  		dev_err(&adapter->pcidev->dev, -			"SLICOSS: Failed to load firmware %s\n", file); +			"Failed to load firmware %s\n", file);  		return ret;  	}  	numsects = *(u32 *)(fw->data + index);  	index += 4; -	ASSERT(numsects <= 3);  	for (i = 0; i < numsects; i++) {  		sectsize[i] = *(u32 *)(fw->data + index);  		index += 4; @@ -690,15 +563,12 @@ static void slic_adapter_set_hwaddr(struct adapter *adapter)  		memcpy(adapter->macaddr,  		       card->config.MacInfo[adapter->functionnumber].macaddrA,  		       sizeof(struct slic_config_mac)); -		if (!(adapter->currmacaddr[0] || adapter->currmacaddr[1] || -		      adapter->currmacaddr[2] || adapter->currmacaddr[3] || -		      adapter->currmacaddr[4] || adapter->currmacaddr[5])) { -			memcpy(adapter->currmacaddr, adapter->macaddr, 6); -		} -		if (adapter->netdev) { +		if (is_zero_ether_addr(adapter->currmacaddr)) +			memcpy(adapter->currmacaddr, adapter->macaddr, +			       ETH_ALEN); +		if (adapter->netdev)  			memcpy(adapter->netdev->dev_addr, adapter->currmacaddr, -			       6); -		} +			       ETH_ALEN);  	}  } @@ -862,13 +732,11 @@ static bool slic_mac_filter(struct adapter *adapter,  {  	struct net_device *netdev = adapter->netdev;  	u32 opts = adapter->macopts; -	u32 *dhost4 = (u32 *)ðer_frame->ether_dhost[0]; -	u16 *dhost2 = (u16 *)ðer_frame->ether_dhost[4];  	if (opts & MAC_PROMISC)  		return true; -	if ((*dhost4 == 0xFFFFFFFF) && (*dhost2 == 0xFFFF)) { +	if (is_broadcast_ether_addr(ether_frame->ether_dhost)) {  		if (opts & MAC_BCAST) {  			adapter->rcv_broadcasts++;  			return true; @@ -877,7 +745,7 @@ static bool slic_mac_filter(struct adapter *adapter,  		}  	} -	if (ether_frame->ether_dhost[0] & 0x01) { +	if (is_multicast_ether_addr(ether_frame->ether_dhost)) {  		if (opts & MAC_ALLMCAST) {  			adapter->rcv_multicasts++;  			netdev->stats.multicast++; @@ -887,8 +755,8 @@ static bool slic_mac_filter(struct adapter *adapter,  			struct mcast_address *mcaddr = adapter->mcastaddrs;  			while (mcaddr) { -				if (!compare_ether_addr(mcaddr->address, -							ether_frame->ether_dhost)) { +				if (ether_addr_equal(mcaddr->address, +						     ether_frame->ether_dhost)) {  					adapter->rcv_multicasts++;  					netdev->stats.multicast++;  					return true; @@ -936,10 +804,9 @@ static void slic_timer_load_check(ulong cardaddr)  	u32 load = card->events;  	u32 level = 0; -	intagg = &adapter->slic_regs->slic_intagg; -  	if ((adapter) && (adapter->state == ADAPT_UP) &&  	    (card->state == CARD_UP) && (slic_global.dynamic_intagg)) { +		intagg = &adapter->slic_regs->slic_intagg;  		if (adapter->devid == SLIC_1GB_DEVICE_ID) {  			if (adapter->linkspeed == LINK_1000MB)  				level = 100; @@ -1060,8 +927,6 @@ static void slic_upr_start(struct adapter *adapter)  	case SLIC_UPR_PING:  		slic_reg32_write(&slic_regs->slic_ping, 1, FLUSH);  		break; -	default: -		ASSERT(0);  	}  } @@ -1098,7 +963,8 @@ static void slic_link_upr_complete(struct adapter *adapter, u32 isr)  	if ((isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) {  		struct slic_shmem *pshmem; -		pshmem = (struct slic_shmem *)adapter->phys_shmem; +		pshmem = (struct slic_shmem *)(unsigned long) +			 adapter->phys_shmem;  #if BITS_PER_LONG == 64  		slic_upr_queue_request(adapter,  				       SLIC_UPR_RLSR, @@ -1116,9 +982,6 @@ static void slic_link_upr_complete(struct adapter *adapter, u32 isr)  	if (adapter->state != ADAPT_UP)  		return; -	ASSERT((adapter->devid == SLIC_1GB_DEVICE_ID) -	       || (adapter->devid == SLIC_2GB_DEVICE_ID)); -  	linkup = linkstatus & GIG_LINKUP ? LINK_UP : LINK_DOWN;  	if (linkstatus & GIG_SPEED_1000)  		linkspeed = LINK_1000MB; @@ -1170,7 +1033,6 @@ static void slic_upr_request_complete(struct adapter *adapter, u32 isr)  	spin_lock_irqsave(&adapter->upr_lock.lock, adapter->upr_lock.flags);  	upr = adapter->upr_list;  	if (!upr) { -		ASSERT(0);  		spin_unlock_irqrestore(&adapter->upr_lock.lock,  					adapter->upr_lock.flags);  		return; @@ -1178,7 +1040,6 @@ static void slic_upr_request_complete(struct adapter *adapter, u32 isr)  	adapter->upr_list = upr->next;  	upr->next = NULL;  	adapter->upr_busy = 0; -	ASSERT(adapter->port == upr->adapter);  	switch (upr->upr_request) {  	case SLIC_UPR_STATS:  		{ @@ -1260,23 +1121,9 @@ static void slic_upr_request_complete(struct adapter *adapter, u32 isr)  		break;  	case SLIC_UPR_RCONFIG:  		break; -	case SLIC_UPR_RPHY: -		ASSERT(0); -		break; -	case SLIC_UPR_ENLB: -		ASSERT(0); -		break; -	case SLIC_UPR_ENCT: -		ASSERT(0); -		break; -	case SLIC_UPR_PDWN: -		ASSERT(0); -		break;  	case SLIC_UPR_PING:  		card->pingstatus |= (isr & ISR_PINGDSMASK);  		break; -	default: -		ASSERT(0);  	}  	kfree(upr);  	slic_upr_start(adapter); @@ -1284,117 +1131,33 @@ static void slic_upr_request_complete(struct adapter *adapter, u32 isr)  				adapter->upr_lock.flags);  } -static void slic_config_get(struct adapter *adapter, u32 config, -							u32 config_h) +static int slic_config_get(struct adapter *adapter, u32 config, u32 config_h)  { -	int status; - -	status = slic_upr_request(adapter, -				  SLIC_UPR_RCONFIG, -				  (u32) config, (u32) config_h, 0, 0); -	ASSERT(status == 0); +	return slic_upr_request(adapter, SLIC_UPR_RCONFIG, config, config_h, +				0, 0);  }  /* - *  this is here to checksum the eeprom, there is some ucode bug - *  which prevens us from using the ucode result. - *  remove this once ucode is fixed. + * Compute a checksum of the EEPROM according to RFC 1071.   */ -static ushort slic_eeprom_cksum(char *m, int len) +static u16 slic_eeprom_cksum(void *eeprom, unsigned len)  { -#define ADDCARRY(x)  (x > 65535 ? x -= 65535 : x) -#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);\ -		} - -	u16 *w; -	u32 sum = 0; -	u32 byte_swapped = 0; -	u32 w_int; - -	union { -		char c[2]; -		ushort s; -	} s_util; +	u16 *wp = eeprom; +	u32 checksum = 0; -	union { -		ushort s[2]; -		int l; -	} l_util; +	while (len > 1) { +		checksum += *(wp++); +		len -= 2; +	} -	l_util.l = 0; -	s_util.s = 0; +	if (len > 0) +		checksum += *(u8 *) wp; -	w = (u16 *)m; -#if BITS_PER_LONG == 64 -	w_int = (u32) ((ulong) w & 0x00000000FFFFFFFF); -#else -	w_int = (u32) (w); -#endif -	if ((1 & w_int) && (len > 0)) { -		REDUCE; -		sum <<= 8; -		s_util.c[0] = *(unsigned char *)w; -		w = (u16 *)((char *)w + 1); -		len--; -		byte_swapped = 1; -	} - -	/* Unroll the loop to make overhead from branches &c small. */ -	while ((len -= 32) >= 0) { -		sum += w[0]; -		sum += w[1]; -		sum += w[2]; -		sum += w[3]; -		sum += w[4]; -		sum += w[5]; -		sum += w[6]; -		sum += w[7]; -		sum += w[8]; -		sum += w[9]; -		sum += w[10]; -		sum += w[11]; -		sum += w[12]; -		sum += w[13]; -		sum += w[14]; -		sum += w[15]; -		w = (u16 *)((ulong) w + 16);	/* verify */ -	} -	len += 32; -	while ((len -= 8) >= 0) { -		sum += w[0]; -		sum += w[1]; -		sum += w[2]; -		sum += w[3]; -		w = (u16 *)((ulong) w + 4);	/* verify */ -	} -	len += 8; -	if (len != 0 || byte_swapped != 0) { -		REDUCE; -		while ((len -= 2) >= 0) -			sum += *w++;	/* verify */ -		if (byte_swapped) { -			REDUCE; -			sum <<= 8; -			byte_swapped = 0; -			if (len == -1) { -				s_util.c[1] = *(char *) w; -				sum += s_util.s; -				len = 0; -			} else { -				len = -1; -			} -		} else if (len == -1) { -			s_util.c[0] = *(char *) w; -		} +	while (checksum >> 16) +		checksum = (checksum & 0xFFFF) + ((checksum >> 16) & 0xFFFF); -		if (len == -1) { -			s_util.c[1] = 0; -			sum += s_util.s; -		} -	} -	REDUCE; -	return (ushort) sum; +	return ~checksum;  }  static void slic_rspqueue_free(struct adapter *adapter) @@ -1422,7 +1185,6 @@ static int slic_rspqueue_init(struct adapter *adapter)  	__iomem struct slic_regs *slic_regs = adapter->slic_regs;  	u32 paddrh = 0; -	ASSERT(adapter->state == ADAPT_DOWN);  	memset(rspq, 0, sizeof(struct slic_rspqueue));  	rspq->num_pages = SLIC_RSPQ_PAGES_GB; @@ -1439,14 +1201,6 @@ static int slic_rspqueue_init(struct adapter *adapter)  		}  		/* FIXME:  		 * do we really need this assertions (4K PAGE_SIZE aligned addr)? */ -#if 0 -#ifndef CONFIG_X86_64 -		ASSERT(((u32) rspq->vaddr[i] & 0xFFFFF000) == -		       (u32) rspq->vaddr[i]); -		ASSERT(((u32) rspq->paddr[i] & 0xFFFFF000) == -		       (u32) rspq->paddr[i]); -#endif -#endif  		memset(rspq->vaddr[i], 0, PAGE_SIZE);  		if (paddrh == 0) { @@ -1475,41 +1229,19 @@ static struct slic_rspbuf *slic_rspqueue_getnext(struct adapter *adapter)  		return NULL;  	buf = rspq->rspbuf; -#if BITS_PER_LONG == 32 -	ASSERT((buf->status & 0xFFFFFFE0) == 0); -#endif -	ASSERT(buf->hosthandle);  	if (++rspq->offset < SLIC_RSPQ_BUFSINPAGE) {  		rspq->rspbuf++; -#if BITS_PER_LONG == 32 -		ASSERT(((u32) rspq->rspbuf & 0xFFFFFFE0) == -		       (u32) rspq->rspbuf); -#endif  	} else { -		ASSERT(rspq->offset == SLIC_RSPQ_BUFSINPAGE);  		slic_reg64_write(adapter, &adapter->slic_regs->slic_rbar64,  			(rspq->paddr[rspq->pageindex] | SLIC_RSPQ_BUFSINPAGE),  			&adapter->slic_regs->slic_addr_upper, 0, DONT_FLUSH); -		rspq->pageindex = (++rspq->pageindex) % rspq->num_pages; +		rspq->pageindex = (rspq->pageindex + 1) % rspq->num_pages;  		rspq->offset = 0;  		rspq->rspbuf = (struct slic_rspbuf *)  						rspq->vaddr[rspq->pageindex]; -#if BITS_PER_LONG == 32 -		ASSERT(((u32) rspq->rspbuf & 0xFFFFF000) == -		       (u32) rspq->rspbuf); -#endif  	} -#if BITS_PER_LONG == 32 -	ASSERT(((u32) buf & 0xFFFFFFE0) == (u32) buf); -#endif -	return buf; -} - -static void slic_cmdqmem_init(struct adapter *adapter) -{ -	struct slic_cmdqmem *cmdqmem = &adapter->cmdqmem; -	memset(cmdqmem, 0, sizeof(struct slic_cmdqmem)); +	return buf;  }  static void slic_cmdqmem_free(struct adapter *adapter) @@ -1540,9 +1272,7 @@ static u32 *slic_cmdqmem_addpage(struct adapter *adapter)  					&cmdqmem->dma_pages[cmdqmem->pagecnt]);  	if (!pageaddr)  		return NULL; -#if BITS_PER_LONG == 32 -	ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr); -#endif +  	cmdqmem->pages[cmdqmem->pagecnt] = pageaddr;  	cmdqmem->pagecnt++;  	return pageaddr; @@ -1597,12 +1327,12 @@ static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page)  	while ((cmdcnt < SLIC_CMDQ_CMDSINPAGE) &&  	       (adapter->slic_handle_ix < 256)) {  		/* Allocate and initialize a SLIC_HANDLE for this command */ -		SLIC_GET_SLIC_HANDLE(adapter, pslic_handle); -		if (pslic_handle == NULL) -			ASSERT(0); -		ASSERT(pslic_handle == -		       &adapter->slic_handles[pslic_handle->token. -					      handle_index]); +		spin_lock_irqsave(&adapter->handle_lock.lock, +				adapter->handle_lock.flags); +		pslic_handle  =  adapter->pfree_slic_handles; +		adapter->pfree_slic_handles = pslic_handle->next; +		spin_unlock_irqrestore(&adapter->handle_lock.lock, +				adapter->handle_lock.flags);  		pslic_handle->type = SLIC_HANDLE_CMD;  		pslic_handle->address = (void *) cmd;  		pslic_handle->offset = (ushort) adapter->slic_handle_ix++; @@ -1641,20 +1371,16 @@ static int slic_cmdq_init(struct adapter *adapter)  	int i;  	u32 *pageaddr; -	ASSERT(adapter->state == ADAPT_DOWN);  	memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue));  	memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue));  	memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue));  	spin_lock_init(&adapter->cmdq_all.lock.lock);  	spin_lock_init(&adapter->cmdq_free.lock.lock);  	spin_lock_init(&adapter->cmdq_done.lock.lock); -	slic_cmdqmem_init(adapter); +	memset(&adapter->cmdqmem, 0, sizeof(struct slic_cmdqmem));  	adapter->slic_handle_ix = 1;  	for (i = 0; i < SLIC_CMDQ_INITPAGES; i++) {  		pageaddr = slic_cmdqmem_addpage(adapter); -#if BITS_PER_LONG == 32 -		ASSERT(((u32) pageaddr & 0xFFFFF000) == (u32) pageaddr); -#endif  		if (!pageaddr) {  			slic_cmdq_free(adapter);  			return -ENOMEM; @@ -1682,7 +1408,6 @@ static void slic_cmdq_reset(struct adapter *adapter)  	while (hcmd) {  		if (hcmd->busy) {  			skb = hcmd->skb; -			ASSERT(skb);  			hcmd->busy = 0;  			hcmd->skb = NULL;  			dev_kfree_skb_irq(skb); @@ -1718,7 +1443,6 @@ static void slic_cmdq_getdone(struct adapter *adapter)  	struct slic_cmdqueue *done_cmdq = &adapter->cmdq_done;  	struct slic_cmdqueue *free_cmdq = &adapter->cmdq_free; -	ASSERT(free_cmdq->head == NULL);  	spin_lock_irqsave(&done_cmdq->lock.lock, done_cmdq->lock.flags);  	free_cmdq->head = done_cmdq->head; @@ -1794,10 +1518,11 @@ retry_rcvqfill:  #endif  		skb = alloc_skb(SLIC_RCVQ_RCVBUFSIZE, GFP_ATOMIC);  		if (skb) { -			paddr = (void *)pci_map_single(adapter->pcidev, -							  skb->data, -							  SLIC_RCVQ_RCVBUFSIZE, -							  PCI_DMA_FROMDEVICE); +			paddr = (void *)(unsigned long) +				pci_map_single(adapter->pcidev, +					       skb->data, +					       SLIC_RCVQ_RCVBUFSIZE, +					       PCI_DMA_FROMDEVICE);  			paddrl = SLIC_GET_ADDR_LOW(paddr);  			paddrh = SLIC_GET_ADDR_HIGH(paddr); @@ -1884,7 +1609,6 @@ static int slic_rcvqueue_init(struct adapter *adapter)  	int i, count;  	struct slic_rcvqueue *rcvq = &adapter->rcvqueue; -	ASSERT(adapter->state == ADAPT_DOWN);  	rcvq->tail = NULL;  	rcvq->head = NULL;  	rcvq->size = SLIC_RCVQ_ENTRIES; @@ -1913,7 +1637,6 @@ static struct sk_buff *slic_rcvqueue_getnext(struct adapter *adapter)  	if (rcvq->count) {  		skb = rcvq->head;  		rcvbuf = (struct slic_rcvbuf *)skb->head; -		ASSERT(rcvbuf);  		if (rcvbuf->status & IRHDDR_SVALID) {  			rcvq->head = rcvq->head->next; @@ -1946,10 +1669,9 @@ static u32 slic_rcvqueue_reinsert(struct adapter *adapter, struct sk_buff *skb)  	struct slic_rcvbuf *rcvbuf = (struct slic_rcvbuf *)skb->head;  	struct device *dev; -	ASSERT(skb->len == SLIC_RCVBUF_HEADSIZE); - -	paddr = (void *)pci_map_single(adapter->pcidev, skb->head, -				  SLIC_RCVQ_RCVBUFSIZE, PCI_DMA_FROMDEVICE); +	paddr = (void *)(unsigned long) +		pci_map_single(adapter->pcidev, skb->head, +			       SLIC_RCVQ_RCVBUFSIZE, PCI_DMA_FROMDEVICE);  	rcvbuf->status = 0;  	skb->next = NULL; @@ -1987,446 +1709,6 @@ static u32 slic_rcvqueue_reinsert(struct adapter *adapter, struct sk_buff *skb)  	return rcvq->count;  } -static int slic_debug_card_show(struct seq_file *seq, void *v) -{ -#ifdef MOOKTODO -	int i; -	struct sliccard *card = seq->private; -	struct slic_config *config = &card->config; -	unsigned char *fru = (unsigned char *)(&card->config.atk_fru); -	unsigned char *oemfru = (unsigned char *)(&card->config.OemFru); -#endif - -	seq_printf(seq, "driver_version           : %s\n", slic_proc_version); -	seq_printf(seq, "Microcode versions:           \n"); -	seq_printf(seq, "    Gigabit (gb)         : %s %s\n", -		    MOJAVE_UCODE_VERS_STRING, MOJAVE_UCODE_VERS_DATE); -	seq_printf(seq, "    Gigabit Receiver     : %s %s\n", -		    GB_RCVUCODE_VERS_STRING, GB_RCVUCODE_VERS_DATE); -	seq_printf(seq, "Vendor                   : %s\n", slic_vendor); -	seq_printf(seq, "Product Name             : %s\n", slic_product_name); -#ifdef MOOKTODO -	seq_printf(seq, "VendorId                 : %4.4X\n", -		    config->VendorId); -	seq_printf(seq, "DeviceId                 : %4.4X\n", -		    config->DeviceId); -	seq_printf(seq, "RevisionId               : %2.2x\n", -		    config->RevisionId); -	seq_printf(seq, "Bus    #                 : %d\n", card->busnumber); -	seq_printf(seq, "Device #                 : %d\n", card->slotnumber); -	seq_printf(seq, "Interfaces               : %d\n", card->card_size); -	seq_printf(seq, "     Initialized         : %d\n", -		    card->adapters_activated); -	seq_printf(seq, "     Allocated           : %d\n", -		    card->adapters_allocated); -	ASSERT(card->card_size <= SLIC_NBR_MACS); -	for (i = 0; i < card->card_size; i++) { -		seq_printf(seq, -			   "     MAC%d : %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X\n", -			   i, config->macinfo[i].macaddrA[0], -			   config->macinfo[i].macaddrA[1], -			   config->macinfo[i].macaddrA[2], -			   config->macinfo[i].macaddrA[3], -			   config->macinfo[i].macaddrA[4], -			   config->macinfo[i].macaddrA[5]); -	} -	seq_printf(seq, "     IF  Init State Duplex/Speed irq\n"); -	seq_printf(seq, "     -------------------------------\n"); -	for (i = 0; i < card->adapters_allocated; i++) { -		struct adapter *adapter; - -		adapter = card->adapter[i]; -		if (adapter) { -			seq_printf(seq, -				    "     %d   %d   %s  %s  %s    0x%X\n", -				    adapter->physport, adapter->state, -				    SLIC_LINKSTATE(adapter->linkstate), -				    SLIC_DUPLEX(adapter->linkduplex), -				    SLIC_SPEED(adapter->linkspeed), -				    (uint) adapter->irq); -		} -	} -	seq_printf(seq, "Generation #             : %4.4X\n", card->gennumber); -	seq_printf(seq, "RcvQ max entries         : %4.4X\n", -		    SLIC_RCVQ_ENTRIES); -	seq_printf(seq, "Ping Status              : %8.8X\n", -		    card->pingstatus); -	seq_printf(seq, "Minimum grant            : %2.2x\n", -		    config->MinGrant); -	seq_printf(seq, "Maximum Latency          : %2.2x\n", config->MaxLat); -	seq_printf(seq, "PciStatus                : %4.4x\n", -		    config->Pcistatus); -	seq_printf(seq, "Debug Device Id          : %4.4x\n", -		    config->DbgDevId); -	seq_printf(seq, "DRAM ROM Function        : %4.4x\n", -		    config->DramRomFn); -	seq_printf(seq, "Network interface Pin 1  : %2.2x\n", -		    config->NetIntPin1); -	seq_printf(seq, "Network interface Pin 2  : %2.2x\n", -		    config->NetIntPin1); -	seq_printf(seq, "Network interface Pin 3  : %2.2x\n", -		    config->NetIntPin1); -	seq_printf(seq, "PM capabilities          : %4.4X\n", -		    config->PMECapab); -	seq_printf(seq, "Network Clock Controls   : %4.4X\n", -		    config->NwClkCtrls); - -	switch (config->FruFormat) { -	case ATK_FRU_FORMAT: -		{ -			seq_printf(seq, -			    "Vendor                   : Alacritech, Inc.\n"); -			seq_printf(seq, -			    "Assembly #               : %c%c%c%c%c%c\n", -				    fru[0], fru[1], fru[2], fru[3], fru[4], -				    fru[5]); -			seq_printf(seq, -				    "Revision #               : %c%c\n", -				    fru[6], fru[7]); - -			if (config->OEMFruFormat == VENDOR4_FRU_FORMAT) { -				seq_printf(seq, -					    "Serial   #               : " -					    "%c%c%c%c%c%c%c%c%c%c%c%c\n", -					    fru[8], fru[9], fru[10], -					    fru[11], fru[12], fru[13], -					    fru[16], fru[17], fru[18], -					    fru[19], fru[20], fru[21]); -			} else { -				seq_printf(seq, -					    "Serial   #               : " -					    "%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", -					    fru[8], fru[9], fru[10], -					    fru[11], fru[12], fru[13], -					    fru[14], fru[15], fru[16], -					    fru[17], fru[18], fru[19], -					    fru[20], fru[21]); -			} -			break; -		} - -	default: -		{ -			seq_printf(seq, -			    "Vendor                   : Alacritech, Inc.\n"); -			seq_printf(seq, -			    "Serial   #               : Empty FRU\n"); -			break; -		} -	} - -	switch (config->OEMFruFormat) { -	case VENDOR1_FRU_FORMAT: -		{ -			seq_printf(seq, "FRU Information:\n"); -			seq_printf(seq, "    Commodity #          : %c\n", -				    oemfru[0]); -			seq_printf(seq, -				    "    Assembly #           : %c%c%c%c\n", -				    oemfru[1], oemfru[2], oemfru[3], oemfru[4]); -			seq_printf(seq, -				    "    Revision #           : %c%c\n", -				    oemfru[5], oemfru[6]); -			seq_printf(seq, -				    "    Supplier #           : %c%c\n", -				    oemfru[7], oemfru[8]); -			seq_printf(seq, -				    "    Date                 : %c%c\n", -				    oemfru[9], oemfru[10]); -			seq_sprintf(seq, -				    "    Sequence #           : %c%c%c\n", -				    oemfru[11], oemfru[12], oemfru[13]); -			break; -		} - -	case VENDOR2_FRU_FORMAT: -		{ -			seq_printf(seq, "FRU Information:\n"); -			seq_printf(seq, -				    "    Part     #           : " -				    "%c%c%c%c%c%c%c%c\n", -				    oemfru[0], oemfru[1], oemfru[2], -				    oemfru[3], oemfru[4], oemfru[5], -				    oemfru[6], oemfru[7]); -			seq_printf(seq, -				    "    Supplier #           : %c%c%c%c%c\n", -				    oemfru[8], oemfru[9], oemfru[10], -				    oemfru[11], oemfru[12]); -			seq_printf(seq, -				    "    Date                 : %c%c%c\n", -				    oemfru[13], oemfru[14], oemfru[15]); -			seq_sprintf(seq, -				    "    Sequence #           : %c%c%c%c\n", -				    oemfru[16], oemfru[17], oemfru[18], -				    oemfru[19]); -			break; -		} - -	case VENDOR3_FRU_FORMAT: -		{ -			seq_printf(seq, "FRU Information:\n"); -		} - -	case VENDOR4_FRU_FORMAT: -		{ -			seq_printf(seq, "FRU Information:\n"); -			seq_printf(seq, -				    "    FRU Number           : " -				    "%c%c%c%c%c%c%c%c\n", -				    oemfru[0], oemfru[1], oemfru[2], -				    oemfru[3], oemfru[4], oemfru[5], -				    oemfru[6], oemfru[7]); -			seq_sprintf(seq, -				    "    Part Number          : " -				    "%c%c%c%c%c%c%c%c\n", -				    oemfru[8], oemfru[9], oemfru[10], -				    oemfru[11], oemfru[12], oemfru[13], -				    oemfru[14], oemfru[15]); -			seq_printf(seq, -				    "    EC Level             : " -				    "%c%c%c%c%c%c%c%c\n", -				    oemfru[16], oemfru[17], oemfru[18], -				    oemfru[19], oemfru[20], oemfru[21], -				    oemfru[22], oemfru[23]); -			break; -		} - -	default: -		break; -	} -#endif - -	return 0; -} - -static int slic_debug_adapter_show(struct seq_file *seq, void *v) -{ -	struct adapter *adapter = seq->private; -	struct net_device *netdev = adapter->netdev; - -	seq_printf(seq, "info: interface          : %s\n", -			    adapter->netdev->name); -	seq_printf(seq, "info: status             : %s\n", -		SLIC_LINKSTATE(adapter->linkstate)); -	seq_printf(seq, "info: port               : %d\n", -		adapter->physport); -	seq_printf(seq, "info: speed              : %s\n", -		SLIC_SPEED(adapter->linkspeed)); -	seq_printf(seq, "info: duplex             : %s\n", -		SLIC_DUPLEX(adapter->linkduplex)); -	seq_printf(seq, "info: irq                : 0x%X\n", -		(uint) adapter->irq); -	seq_printf(seq, "info: Interrupt Agg Delay: %d usec\n", -		adapter->card->loadlevel_current); -	seq_printf(seq, "info: RcvQ max entries   : %4.4X\n", -		SLIC_RCVQ_ENTRIES); -	seq_printf(seq, "info: RcvQ current       : %4.4X\n", -		    adapter->rcvqueue.count); -	seq_printf(seq, "rx stats: packets                  : %8.8lX\n", -		    netdev->stats.rx_packets); -	seq_printf(seq, "rx stats: bytes                    : %8.8lX\n", -		    netdev->stats.rx_bytes); -	seq_printf(seq, "rx stats: broadcasts               : %8.8X\n", -		    adapter->rcv_broadcasts); -	seq_printf(seq, "rx stats: multicasts               : %8.8X\n", -		    adapter->rcv_multicasts); -	seq_printf(seq, "rx stats: unicasts                 : %8.8X\n", -		    adapter->rcv_unicasts); -	seq_printf(seq, "rx stats: errors                   : %8.8X\n", -		    (u32) adapter->slic_stats.iface.rcv_errors); -	seq_printf(seq, "rx stats: Missed errors            : %8.8X\n", -		    (u32) adapter->slic_stats.iface.rcv_discards); -	seq_printf(seq, "rx stats: drops                    : %8.8X\n", -			(u32) adapter->rcv_drops); -	seq_printf(seq, "tx stats: packets                  : %8.8lX\n", -			netdev->stats.tx_packets); -	seq_printf(seq, "tx stats: bytes                    : %8.8lX\n", -			netdev->stats.tx_bytes); -	seq_printf(seq, "tx stats: errors                   : %8.8X\n", -			(u32) adapter->slic_stats.iface.xmt_errors); -	seq_printf(seq, "rx stats: multicasts               : %8.8lX\n", -			netdev->stats.multicast); -	seq_printf(seq, "tx stats: collision errors         : %8.8X\n", -			(u32) adapter->slic_stats.iface.xmit_collisions); -	seq_printf(seq, "perf: Max rcv frames/isr           : %8.8X\n", -			adapter->max_isr_rcvs); -	seq_printf(seq, "perf: Rcv interrupt yields         : %8.8X\n", -			adapter->rcv_interrupt_yields); -	seq_printf(seq, "perf: Max xmit complete/isr        : %8.8X\n", -			adapter->max_isr_xmits); -	seq_printf(seq, "perf: error interrupts             : %8.8X\n", -			adapter->error_interrupts); -	seq_printf(seq, "perf: error rmiss interrupts       : %8.8X\n", -			adapter->error_rmiss_interrupts); -	seq_printf(seq, "perf: rcv interrupts               : %8.8X\n", -			adapter->rcv_interrupts); -	seq_printf(seq, "perf: xmit interrupts              : %8.8X\n", -			adapter->xmit_interrupts); -	seq_printf(seq, "perf: link event interrupts        : %8.8X\n", -			adapter->linkevent_interrupts); -	seq_printf(seq, "perf: UPR interrupts               : %8.8X\n", -			adapter->upr_interrupts); -	seq_printf(seq, "perf: interrupt count              : %8.8X\n", -			adapter->num_isrs); -	seq_printf(seq, "perf: false interrupts             : %8.8X\n", -			adapter->false_interrupts); -	seq_printf(seq, "perf: All register writes          : %8.8X\n", -			adapter->all_reg_writes); -	seq_printf(seq, "perf: ICR register writes          : %8.8X\n", -			adapter->icr_reg_writes); -	seq_printf(seq, "perf: ISR register writes          : %8.8X\n", -			adapter->isr_reg_writes); -	seq_printf(seq, "ifevents: overflow 802 errors      : %8.8X\n", -			adapter->if_events.oflow802); -	seq_printf(seq, "ifevents: transport overflow errors: %8.8X\n", -			adapter->if_events.Tprtoflow); -	seq_printf(seq, "ifevents: underflow errors         : %8.8X\n", -			adapter->if_events.uflow802); -	seq_printf(seq, "ifevents: receive early            : %8.8X\n", -			adapter->if_events.rcvearly); -	seq_printf(seq, "ifevents: buffer overflows         : %8.8X\n", -			adapter->if_events.Bufov); -	seq_printf(seq, "ifevents: carrier errors           : %8.8X\n", -			adapter->if_events.Carre); -	seq_printf(seq, "ifevents: Long                     : %8.8X\n", -			adapter->if_events.Longe); -	seq_printf(seq, "ifevents: invalid preambles        : %8.8X\n", -			adapter->if_events.Invp); -	seq_printf(seq, "ifevents: CRC errors               : %8.8X\n", -			adapter->if_events.Crc); -	seq_printf(seq, "ifevents: dribble nibbles          : %8.8X\n", -			adapter->if_events.Drbl); -	seq_printf(seq, "ifevents: Code violations          : %8.8X\n", -			adapter->if_events.Code); -	seq_printf(seq, "ifevents: TCP checksum errors      : %8.8X\n", -			adapter->if_events.TpCsum); -	seq_printf(seq, "ifevents: TCP header short errors  : %8.8X\n", -			adapter->if_events.TpHlen); -	seq_printf(seq, "ifevents: IP checksum errors       : %8.8X\n", -			adapter->if_events.IpCsum); -	seq_printf(seq, "ifevents: IP frame incompletes     : %8.8X\n", -			adapter->if_events.IpLen); -	seq_printf(seq, "ifevents: IP headers shorts        : %8.8X\n", -			adapter->if_events.IpHlen); - -	return 0; -} -static int slic_debug_adapter_open(struct inode *inode, struct file *file) -{ -	return single_open(file, slic_debug_adapter_show, inode->i_private); -} - -static int slic_debug_card_open(struct inode *inode, struct file *file) -{ -	return single_open(file, slic_debug_card_show, inode->i_private); -} - -static const struct file_operations slic_debug_adapter_fops = { -	.owner		= THIS_MODULE, -	.open		= slic_debug_adapter_open, -	.read		= seq_read, -	.llseek		= seq_lseek, -	.release	= single_release, -}; - -static const struct file_operations slic_debug_card_fops = { -	.owner		= THIS_MODULE, -	.open		= slic_debug_card_open, -	.read		= seq_read, -	.llseek		= seq_lseek, -	.release	= single_release, -}; - -static void slic_debug_adapter_create(struct adapter *adapter) -{ -	struct dentry *d; -	char    name[7]; -	struct sliccard *card = adapter->card; - -	if (!card->debugfs_dir) -		return; - -	sprintf(name, "port%d", adapter->port); -	d = debugfs_create_file(name, S_IRUGO, -				card->debugfs_dir, adapter, -				&slic_debug_adapter_fops); -	if (!d || IS_ERR(d)) -		pr_info(PFX "%s: debugfs create failed\n", name); -	else -		adapter->debugfs_entry = d; -} - -static void slic_debug_adapter_destroy(struct adapter *adapter) -{ -	debugfs_remove(adapter->debugfs_entry); -	adapter->debugfs_entry = NULL; -} - -static void slic_debug_card_create(struct sliccard *card) -{ -	struct dentry *d; -	char    name[IFNAMSIZ]; - -	snprintf(name, sizeof(name), "slic%d", card->cardnum); -	d = debugfs_create_dir(name, slic_debugfs); -	if (!d || IS_ERR(d)) -		pr_info(PFX "%s: debugfs create dir failed\n", -				name); -	else { -		card->debugfs_dir = d; -		d = debugfs_create_file("cardinfo", S_IRUGO, -				slic_debugfs, card, -				&slic_debug_card_fops); -		if (!d || IS_ERR(d)) -			pr_info(PFX "%s: debugfs create failed\n", -					name); -		else -			card->debugfs_cardinfo = d; -	} -} - -static void slic_debug_card_destroy(struct sliccard *card) -{ -	int i; - -	for (i = 0; i < card->card_size; i++) { -		struct adapter *adapter; - -		adapter = card->adapter[i]; -		if (adapter) -			slic_debug_adapter_destroy(adapter); -	} -	if (card->debugfs_cardinfo) { -		debugfs_remove(card->debugfs_cardinfo); -		card->debugfs_cardinfo = NULL; -	} -	if (card->debugfs_dir) { -		debugfs_remove(card->debugfs_dir); -		card->debugfs_dir = NULL; -	} -} - -static void slic_debug_init(void) -{ -	struct dentry *ent; - -	ent = debugfs_create_dir("slic", NULL); -	if (!ent || IS_ERR(ent)) { -		pr_info(PFX "debugfs create directory failed\n"); -		return; -	} - -	slic_debugfs = ent; -} - -static void slic_debug_cleanup(void) -{ -	if (slic_debugfs) { -		debugfs_remove(slic_debugfs); -		slic_debugfs = NULL; -	} -} -  /*   * slic_link_event_handler -   * @@ -2447,7 +1729,7 @@ static void slic_link_event_handler(struct adapter *adapter)  		return;  	} -	pshmem = (struct slic_shmem *)adapter->phys_shmem; +	pshmem = (struct slic_shmem *)(unsigned long)adapter->phys_shmem;  #if BITS_PER_LONG == 64  	status = slic_upr_request(adapter, @@ -2460,7 +1742,6 @@ static void slic_link_event_handler(struct adapter *adapter)  		(u32) &pshmem->linkstatus,	/* no 4GB wrap guaranteed */  				  0, 0, 0);  #endif -	ASSERT(status == 0);  }  static void slic_init_cleanup(struct adapter *adapter) @@ -2475,7 +1756,7 @@ static void slic_init_cleanup(struct adapter *adapter)  				    sizeof(struct slic_shmem),  				    adapter->pshmem, adapter->phys_shmem);  		adapter->pshmem = NULL; -		adapter->phys_shmem = (dma_addr_t) NULL; +		adapter->phys_shmem = (dma_addr_t)(unsigned long)NULL;  	}  	if (adapter->pingtimerset) { @@ -2499,7 +1780,7 @@ static int slic_mcast_add_list(struct adapter *adapter, char *address)  	/* Check to see if it already exists */  	mlist = adapter->mcastaddrs;  	while (mlist) { -		if (!compare_ether_addr(mlist->address, address)) +		if (ether_addr_equal(mlist->address, address))  			return 0;  		mlist = mlist->next;  	} @@ -2509,7 +1790,7 @@ static int slic_mcast_add_list(struct adapter *adapter, char *address)  	if (mcaddr == NULL)  		return 1; -	memcpy(mcaddr->address, address, 6); +	memcpy(mcaddr->address, address, ETH_ALEN);  	mcaddr->next = adapter->mcastaddrs;  	adapter->mcastaddrs = mcaddr; @@ -2524,8 +1805,6 @@ static void slic_mcast_set_list(struct net_device *dev)  	char *addresses;  	struct netdev_hw_addr *ha; -	ASSERT(adapter); -  	netdev_for_each_mc_addr(ha, dev) {  		addresses = (char *) &ha->addr;  		status = slic_mcast_add_list(adapter, addresses); @@ -2552,7 +1831,6 @@ static void slic_mcast_set_list(struct net_device *dev)  		if (status == 0)  			slic_mcast_set_mask(adapter);  	} -	return;  }  #define  XMIT_FAIL_LINK_STATE               1 @@ -2594,8 +1872,7 @@ static void slic_xmit_fail(struct adapter *adapter,  		switch (status) {  		case XMIT_FAIL_LINK_STATE:  			dev_err(&adapter->netdev->dev, -				"reject xmit skb[%p: %x] linkstate[%s] " -				"adapter[%s:%d] card[%s:%d]\n", +				"reject xmit skb[%p: %x] linkstate[%s] adapter[%s:%d] card[%s:%d]\n",  				skb, skb->pkt_type,  				SLIC_LINKSTATE(adapter->linkstate),  				SLIC_ADAPTER_STATE(adapter->state), @@ -2610,11 +1887,8 @@ static void slic_xmit_fail(struct adapter *adapter,  			break;  		case XMIT_FAIL_HOSTCMD_FAIL:  			dev_err(&adapter->netdev->dev, -				"xmit_start skb[%p] type[%x] No host commands " -				"available\n", skb, skb->pkt_type); +				"xmit_start skb[%p] type[%x] No host commands available\n", skb, skb->pkt_type);  			break; -		default: -			ASSERT(0);  		}  	}  	dev_kfree_skb(skb); @@ -2726,7 +2000,6 @@ static void slic_rcv_handler(struct adapter *adapter)  	while ((skb = slic_rcvqueue_getnext(adapter))) {  		u32 rx_bytes; -		ASSERT(skb->head);  		rcvbuf = (struct slic_rcvbuf *)skb->head;  		adapter->card->events++;  		if (rcvbuf->status & IRHDDR_ERR) { @@ -2782,16 +2055,11 @@ static void slic_xmit_complete(struct adapter *adapter)  		 Get the complete host command buffer  		*/  		slic_handle_word.handle_token = rspbuf->hosthandle; -		ASSERT(slic_handle_word.handle_index); -		ASSERT(slic_handle_word.handle_index <= SLIC_CMDQ_MAXCMDS);  		hcmd =  		    (struct slic_hostcmd *)  			adapter->slic_handles[slic_handle_word.handle_index].  									address;  /*      hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */ -		ASSERT(hcmd); -		ASSERT(hcmd->pslic_handle == -		       &adapter->slic_handles[slic_handle_word.handle_index]);  		if (hcmd->type == SLIC_CMD_DUMB) {  			if (hcmd->skb)  				dev_kfree_skb_irq(hcmd->skb); @@ -2804,6 +2072,66 @@ static void slic_xmit_complete(struct adapter *adapter)  	adapter->max_isr_xmits = max(adapter->max_isr_xmits, frames);  } +static void slic_interrupt_card_up(u32 isr, struct adapter *adapter, +			struct net_device *dev) +{ +	if (isr & ~ISR_IO) { +		if (isr & ISR_ERR) { +			adapter->error_interrupts++; +			if (isr & ISR_RMISS) { +				int count; +				int pre_count; +				int errors; + +				struct slic_rcvqueue *rcvq = +					&adapter->rcvqueue; + +				adapter->error_rmiss_interrupts++; + +				if (!rcvq->errors) +					rcv_count = rcvq->count; +				pre_count = rcvq->count; +				errors = rcvq->errors; + +				while (rcvq->count < SLIC_RCVQ_FILLTHRESH) { +					count = slic_rcvqueue_fill(adapter); +					if (!count) +						break; +				} +			} else if (isr & ISR_XDROP) { +				dev_err(&dev->dev, +						"isr & ISR_ERR [%x] ISR_XDROP\n", isr); +			} else { +				dev_err(&dev->dev, +						"isr & ISR_ERR [%x]\n", +						isr); +			} +		} + +		if (isr & ISR_LEVENT) { +			adapter->linkevent_interrupts++; +			slic_link_event_handler(adapter); +		} + +		if ((isr & ISR_UPC) || (isr & ISR_UPCERR) || +		    (isr & ISR_UPCBSY)) { +			adapter->upr_interrupts++; +			slic_upr_request_complete(adapter, isr); +		} +	} + +	if (isr & ISR_RCV) { +		adapter->rcv_interrupts++; +		slic_rcv_handler(adapter); +	} + +	if (isr & ISR_CMD) { +		adapter->xmit_interrupts++; +		slic_xmit_complete(adapter); +	} +} + +  static irqreturn_t slic_interrupt(int irq, void *dev_id)  {  	struct net_device *dev = (struct net_device *)dev_id; @@ -2818,64 +2146,7 @@ static irqreturn_t slic_interrupt(int irq, void *dev_id)  		adapter->num_isrs++;  		switch (adapter->card->state) {  		case CARD_UP: -			if (isr & ~ISR_IO) { -				if (isr & ISR_ERR) { -					adapter->error_interrupts++; -					if (isr & ISR_RMISS) { -						int count; -						int pre_count; -						int errors; - -						struct slic_rcvqueue *rcvq = -						    &adapter->rcvqueue; - -						adapter-> -						    error_rmiss_interrupts++; -						if (!rcvq->errors) -							rcv_count = rcvq->count; -						pre_count = rcvq->count; -						errors = rcvq->errors; - -						while (rcvq->count < -						       SLIC_RCVQ_FILLTHRESH) { -							count = -							    slic_rcvqueue_fill -							    (adapter); -							if (!count) -								break; -						} -					} else if (isr & ISR_XDROP) { -						dev_err(&dev->dev, -							"isr & ISR_ERR [%x] " -							"ISR_XDROP \n", isr); -					} else { -						dev_err(&dev->dev, -							"isr & ISR_ERR [%x]\n", -							isr); -					} -				} - -				if (isr & ISR_LEVENT) { -					adapter->linkevent_interrupts++; -					slic_link_event_handler(adapter); -				} - -				if ((isr & ISR_UPC) || -				    (isr & ISR_UPCERR) || (isr & ISR_UPCBSY)) { -					adapter->upr_interrupts++; -					slic_upr_request_complete(adapter, isr); -				} -			} - -			if (isr & ISR_RCV) { -				adapter->rcv_interrupts++; -				slic_rcv_handler(adapter); -			} - -			if (isr & ISR_CMD) { -				adapter->xmit_interrupts++; -				slic_xmit_complete(adapter); -			} +			slic_interrupt_card_up(isr, adapter, dev);  			break;  		case CARD_DOWN: @@ -2885,9 +2156,6 @@ static irqreturn_t slic_interrupt(int irq, void *dev_id)  				slic_upr_request_complete(adapter, isr);  			}  			break; - -		default: -			break;  		}  		adapter->isrcopy = 0; @@ -2908,11 +2176,9 @@ static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev)  	struct adapter *adapter = netdev_priv(dev);  	struct slic_hostcmd *hcmd = NULL;  	u32 status = 0; -	u32 skbtype = NORMAL_ETHFRAME;  	void *offloadcmd = NULL;  	card = adapter->card; -	ASSERT(card);  	if ((adapter->linkstate != LINK_UP) ||  	    (adapter->state != ADAPT_UP) || (card->state != CARD_UP)) {  		status = XMIT_FAIL_LINK_STATE; @@ -2923,22 +2189,16 @@ static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev)  		goto xmit_fail;  	} -	if (skbtype == NORMAL_ETHFRAME) { -		hcmd = slic_cmdq_getfree(adapter); -		if (!hcmd) { -			adapter->xmitq_full = 1; -			status = XMIT_FAIL_HOSTCMD_FAIL; -			goto xmit_fail; -		} -		ASSERT(hcmd->pslic_handle); -		ASSERT(hcmd->cmd64.hosthandle == -		       hcmd->pslic_handle->token.handle_token); -		hcmd->skb = skb; -		hcmd->busy = 1; -		hcmd->type = SLIC_CMD_DUMB; -		if (skbtype == NORMAL_ETHFRAME) -			slic_xmit_build_request(adapter, hcmd, skb); +	hcmd = slic_cmdq_getfree(adapter); +	if (!hcmd) { +		adapter->xmitq_full = 1; +		status = XMIT_FAIL_HOSTCMD_FAIL; +		goto xmit_fail;  	} +	hcmd->skb = skb; +	hcmd->busy = 1; +	hcmd->type = SLIC_CMD_DUMB; +	slic_xmit_build_request(adapter, hcmd, skb);  	dev->stats.tx_packets++;  	dev->stats.tx_bytes += skb->len; @@ -2964,7 +2224,7 @@ static netdev_tx_t slic_xmit_start(struct sk_buff *skb, struct net_device *dev)  xmit_done:  	return NETDEV_TX_OK;  xmit_fail: -	slic_xmit_fail(adapter, skb, offloadcmd, skbtype, status); +	slic_xmit_fail(adapter, skb, offloadcmd, NORMAL_ETHFRAME, status);  	goto xmit_done;  } @@ -3025,8 +2285,6 @@ static int slic_if_init(struct adapter *adapter)  	struct slic_shmem *pshmem;  	int rc; -	ASSERT(card); -  	/* adapter should be down at this point */  	if (adapter->state != ADAPT_DOWN) {  		dev_err(&dev->dev, "%s: adapter->state != ADAPT_DOWN\n", @@ -3034,7 +2292,6 @@ static int slic_if_init(struct adapter *adapter)  		rc = -EIO;  		goto err;  	} -	ASSERT(adapter->linkstate == LINK_DOWN);  	adapter->devflags_prev = dev->flags;  	adapter->macopts = MAC_DIRECTED; @@ -3058,11 +2315,14 @@ static int slic_if_init(struct adapter *adapter)  	}  	if (!adapter->queues_initialized) { -		if ((rc = slic_rspqueue_init(adapter))) +		rc = slic_rspqueue_init(adapter); +		if (rc)  			goto err; -		if ((rc = slic_cmdq_init(adapter))) +		rc = slic_cmdq_init(adapter); +		if (rc)  			goto err; -		if ((rc = slic_rcvqueue_init(adapter))) +		rc = slic_rcvqueue_init(adapter); +		if (rc)  			goto err;  		adapter->queues_initialized = 1;  	} @@ -3071,7 +2331,8 @@ static int slic_if_init(struct adapter *adapter)  	mdelay(1);  	if (!adapter->isp_initialized) { -		pshmem = (struct slic_shmem *)adapter->phys_shmem; +		pshmem = (struct slic_shmem *)(unsigned long) +			 adapter->phys_shmem;  		spin_lock_irqsave(&adapter->bit64reglock.lock,  					adapter->bit64reglock.flags); @@ -3132,17 +2393,12 @@ static int slic_entry_open(struct net_device *dev)  {  	struct adapter *adapter = netdev_priv(dev);  	struct sliccard *card = adapter->card; -	u32 locked = 0;  	int status; -	ASSERT(adapter); -	ASSERT(card); -  	netif_stop_queue(adapter->netdev);  	spin_lock_irqsave(&slic_global.driver_lock.lock,  				slic_global.driver_lock.flags); -	locked = 1;  	if (!adapter->activated) {  		card->adapters_activated++;  		slic_global.num_slic_ports_active++; @@ -3156,57 +2412,39 @@ static int slic_entry_open(struct net_device *dev)  			slic_global.num_slic_ports_active--;  			adapter->activated = 0;  		} -		if (locked) { -			spin_unlock_irqrestore(&slic_global.driver_lock.lock, -						slic_global.driver_lock.flags); -			locked = 0; -		} -		return status; +		goto spin_unlock;  	}  	if (!card->master)  		card->master = adapter; -	if (locked) { -		spin_unlock_irqrestore(&slic_global.driver_lock.lock, -					slic_global.driver_lock.flags); -		locked = 0; -	} - -	return 0; +spin_unlock: +	spin_unlock_irqrestore(&slic_global.driver_lock.lock, +			       slic_global.driver_lock.flags); +	return status;  }  static void slic_card_cleanup(struct sliccard *card)  {  	if (card->loadtimerset) {  		card->loadtimerset = 0; -		del_timer(&card->loadtimer); +		del_timer_sync(&card->loadtimer);  	} -	slic_debug_card_destroy(card); -  	kfree(card);  } -static void __devexit slic_entry_remove(struct pci_dev *pcidev) +static void slic_entry_remove(struct pci_dev *pcidev)  {  	struct net_device *dev = pci_get_drvdata(pcidev); -	u32 mmio_start = 0; -	uint mmio_len = 0;  	struct adapter *adapter = netdev_priv(dev);  	struct sliccard *card;  	struct mcast_address *mcaddr, *mlist; -	ASSERT(adapter); -	slic_adapter_freeresources(adapter); -	slic_unmap_mmio_space(adapter);  	unregister_netdev(dev); -	mmio_start = pci_resource_start(pcidev, 0); -	mmio_len = pci_resource_len(pcidev, 0); - -	release_mem_region(mmio_start, mmio_len); +	slic_adapter_freeresources(adapter); +	slic_unmap_mmio_space(adapter); -	iounmap((void __iomem *)dev->base_addr);  	/* free multicast addresses */  	mlist = adapter->mcastaddrs;  	while (mlist) { @@ -3214,9 +2452,7 @@ static void __devexit slic_entry_remove(struct pci_dev *pcidev)  		mlist = mlist->next;  		kfree(mcaddr);  	} -	ASSERT(adapter->card);  	card = adapter->card; -	ASSERT(card->adapters_allocated);  	card->adapters_allocated--;  	adapter->allocated = 0;  	if (!card->adapters_allocated) { @@ -3226,15 +2462,14 @@ static void __devexit slic_entry_remove(struct pci_dev *pcidev)  		} else {  			while (curr_card->next != card)  				curr_card = curr_card->next; -			ASSERT(curr_card);  			curr_card->next = card->next;  		} -		ASSERT(slic_global.num_slic_cards);  		slic_global.num_slic_cards--;  		slic_card_cleanup(card);  	}  	free_netdev(dev);  	pci_release_regions(pcidev); +	pci_disable_device(pcidev);  }  static int slic_entry_halt(struct net_device *dev) @@ -3245,14 +2480,12 @@ static int slic_entry_halt(struct net_device *dev)  	spin_lock_irqsave(&slic_global.driver_lock.lock,  				slic_global.driver_lock.flags); -	ASSERT(card);  	netif_stop_queue(adapter->netdev);  	adapter->state = ADAPT_DOWN;  	adapter->linkstate = LINK_DOWN;  	adapter->upr_list = NULL;  	adapter->upr_busy = 0;  	adapter->devflags_prev = 0; -	ASSERT(card->adapter[adapter->cardindex] == adapter);  	slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);  	adapter->all_reg_writes++;  	adapter->icr_reg_writes++; @@ -3284,7 +2517,6 @@ static struct net_device_stats *slic_get_stats(struct net_device *dev)  {  	struct adapter *adapter = netdev_priv(dev); -	ASSERT(adapter);  	dev->stats.collisions = adapter->slic_stats.iface.xmit_collisions;  	dev->stats.rx_errors = adapter->slic_stats.iface.rcv_errors;  	dev->stats.tx_errors = adapter->slic_stats.iface.xmt_errors; @@ -3307,7 +2539,6 @@ static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)  	u32 data[7];  	u32 intagg; -	ASSERT(rq);  	switch (cmd) {  	case SIOCSLICSETINTAGG:  		if (copy_from_user(data, rq->ifr_data, 28)) @@ -3353,11 +2584,11 @@ static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)  		}  #endif  	case SIOCETHTOOL: -		ASSERT(adapter);  		if (copy_from_user(&ecmd, rq->ifr_data, sizeof(ecmd)))  			return -EFAULT;  		if (ecmd.cmd == ETHTOOL_GSET) { +			memset(&edata, 0, sizeof(edata));  			edata.supported = (SUPPORTED_10baseT_Half |  					   SUPPORTED_10baseT_Full |  					   SUPPORTED_100baseT_Half | @@ -3468,13 +2699,8 @@ static int slic_card_init(struct sliccard *card, struct adapter *adapter)  	/* Download the microcode */  	status = slic_card_download(adapter); - -	if (status != 0) { -		dev_err(&adapter->pcidev->dev, -			"download failed bus %d slot %d\n", -			adapter->busnumber, adapter->slotnumber); +	if (status)  		return status; -	}  	if (!card->config_set) {  		peeprom = pci_alloc_consistent(adapter->pcidev, @@ -3486,26 +2712,31 @@ static int slic_card_init(struct sliccard *card, struct adapter *adapter)  		if (!peeprom) {  			dev_err(&adapter->pcidev->dev, -				"eeprom read failed to get memory " -				"bus %d slot %d\n", adapter->busnumber, -				adapter->slotnumber); +				"Failed to allocate DMA memory for EEPROM.\n");  			return -ENOMEM;  		} else {  			memset(peeprom, 0, sizeof(struct slic_eeprom));  		}  		slic_reg32_write(&slic_regs->slic_icr, ICR_INT_OFF, FLUSH);  		mdelay(1); -		pshmem = (struct slic_shmem *)adapter->phys_shmem; +		pshmem = (struct slic_shmem *)(unsigned long) +			 adapter->phys_shmem;  		spin_lock_irqsave(&adapter->bit64reglock.lock,  					adapter->bit64reglock.flags); -		slic_reg32_write(&slic_regs->slic_addr_upper, 0, DONT_FLUSH); +		slic_reg32_write(&slic_regs->slic_addr_upper, +				 SLIC_GET_ADDR_HIGH(&pshmem->isr), DONT_FLUSH);  		slic_reg32_write(&slic_regs->slic_isp,  				 SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH);  		spin_unlock_irqrestore(&adapter->bit64reglock.lock,  					adapter->bit64reglock.flags); -		slic_config_get(adapter, phys_configl, phys_configh); +		status = slic_config_get(adapter, phys_configl, phys_configh); +		if (status) { +			dev_err(&adapter->pcidev->dev, +				"Failed to fetch config data from device.\n"); +			goto card_init_err; +		}  		for (;;) {  			if (adapter->pshmem->isr) { @@ -3530,13 +2761,13 @@ static int slic_card_init(struct sliccard *card, struct adapter *adapter)  				i++;  				if (i > 5000) {  					dev_err(&adapter->pcidev->dev, -						"%d config data fetch timed out!\n", -						adapter->port); +						"Fetch of config data timed out.\n");  					slic_reg64_write(adapter,  						&slic_regs->slic_isp, 0,  						&slic_regs->slic_addr_upper,  						0, FLUSH); -					return -EINVAL; +					status = -EINVAL; +					goto card_init_err;  				}  			}  		} @@ -3582,12 +2813,11 @@ static int slic_card_init(struct sliccard *card, struct adapter *adapter)  			/*  			    calculate the EEPROM checksum  			*/ -			calc_chksum = -			    ~slic_eeprom_cksum((char *) peeprom, -					       (eecodesize - 2)); +			calc_chksum = slic_eeprom_cksum(peeprom, +							eecodesize - 2);  			/*  			    if the ucdoe chksum flag bit worked, -			    we wouldn't need this shit +			    we wouldn't need this  			*/  			if (ee_chksum == calc_chksum)  				card->config.EepromValid = true; @@ -3610,24 +2840,20 @@ static int slic_card_init(struct sliccard *card, struct adapter *adapter)  				    sizeof(struct slic_eeprom),  				    peeprom, phys_config); -		if ((!card->config.EepromValid) && -		    (adapter->reg_params.fail_on_bad_eeprom)) { +		if (!card->config.EepromValid) {  			slic_reg64_write(adapter, &slic_regs->slic_isp, 0,  					 &slic_regs->slic_addr_upper,  					 0, FLUSH); -			dev_err(&adapter->pcidev->dev, -				"unsupported CONFIGURATION EEPROM invalid\n"); +			dev_err(&adapter->pcidev->dev, "EEPROM invalid.\n");  			return -EINVAL;  		}  		card->config_set = 1;  	} -	if (slic_card_download_gbrcv(adapter)) { -		dev_err(&adapter->pcidev->dev, -			"unable to download GB receive microcode\n"); -		return -EINVAL; -	} +	status = slic_card_download_gbrcv(adapter); +	if (status) +		return status;  	if (slic_global.dynamic_intagg)  		slic_intagg_set(adapter, 0); @@ -3646,6 +2872,11 @@ static int slic_card_init(struct sliccard *card, struct adapter *adapter)  	card->reset_in_progress = 0;  	return 0; + +card_init_err: +	pci_free_consistent(adapter->pcidev, sizeof(struct slic_eeprom), +			    peeprom, phys_config); +	return status;  }  static void slic_init_driver(void) @@ -3653,7 +2884,6 @@ static void slic_init_driver(void)  	if (slic_first_init) {  		slic_first_init = 0;  		spin_lock_init(&slic_global.driver_lock.lock); -		slic_debug_init();  	}  } @@ -3673,16 +2903,12 @@ static void slic_init_adapter(struct net_device *netdev,  	adapter->busnumber = pcidev->bus->number;  	adapter->slotnumber = ((pcidev->devfn >> 3) & 0x1F);  	adapter->functionnumber = (pcidev->devfn & 0x7); -	adapter->memorylength = pci_resource_len(pcidev, 0);  	adapter->slic_regs = (__iomem struct slic_regs *)memaddr;  	adapter->irq = pcidev->irq;  /*	adapter->netdev = netdev;*/ -	adapter->next_netdevice = head_netdevice; -	head_netdevice = netdev;  	adapter->chipid = chip_idx;  	adapter->port = 0;	/*adapter->functionnumber;*/  	adapter->cardindex = adapter->port; -	adapter->memorybase = memaddr;  	spin_lock_init(&adapter->upr_lock.lock);  	spin_lock_init(&adapter->bit64reglock.lock);  	spin_lock_init(&adapter->adapter_lock.lock); @@ -3693,7 +2919,6 @@ static void slic_init_adapter(struct net_device *netdev,  	/*  	  Initialize slic_handle array  	*/ -	ASSERT(SLIC_CMDQ_MAXCMDS <= 0xFFFF);  	/*  	 Start with 1.  0 is an invalid host handle.  	*/ @@ -3710,11 +2935,8 @@ static void slic_init_adapter(struct net_device *netdev,  					sizeof(struct slic_shmem),  					&adapter->  					phys_shmem); -	ASSERT(adapter->pshmem); - -	memset(adapter->pshmem, 0, sizeof(struct slic_shmem)); - -	return; +	if (adapter->pshmem) +		memset(adapter->pshmem, 0, sizeof(struct slic_shmem));  }  static const struct net_device_ops slic_netdev_ops = { @@ -3724,7 +2946,7 @@ static const struct net_device_ops slic_netdev_ops = {  	.ndo_do_ioctl		= slic_ioctl,  	.ndo_set_mac_address	= slic_mac_set_address,  	.ndo_get_stats		= slic_get_stats, -	.ndo_set_multicast_list	= slic_mcast_set_list, +	.ndo_set_rx_mode	= slic_mcast_set_list,  	.ndo_validate_addr	= eth_validate_addr,  	.ndo_change_mtu		= eth_change_mtu,  }; @@ -3746,8 +2968,7 @@ static u32 slic_card_locate(struct adapter *adapter)  		rdhostid_offset = SLIC_RDHOSTID_1GB;  		break;  	default: -		ASSERT(0); -		break; +		return -ENODEV;  	}  	hostid_reg = @@ -3777,8 +2998,6 @@ static u32 slic_card_locate(struct adapter *adapter)  			}  		}  		slic_global.num_slic_cards++; - -		slic_debug_card_create(card);  	} else {  		/* Card exists, find the card this adapter belongs to */  		while (card) { @@ -3788,11 +3007,9 @@ static u32 slic_card_locate(struct adapter *adapter)  		}  	} -	ASSERT(card);  	if (!card)  		return -ENXIO;  	/* Put the adapter in the card's adapter list */ -	ASSERT(card->adapter[adapter->port] == NULL);  	if (!card->adapter[adapter->port]) {  		card->adapter[adapter->port] = adapter;  		adapter->card = card; @@ -3802,12 +3019,12 @@ static u32 slic_card_locate(struct adapter *adapter)  	while (physcard) {  		for (i = 0; i < SLIC_MAX_PORTS; i++) { -			if (!physcard->adapter[i]) -				continue; -			else +			if (physcard->adapter[i])  				break;  		} -		ASSERT(i != SLIC_MAX_PORTS); +		if (i == SLIC_MAX_PORTS) +			break; +  		if (physcard->adapter[i]->slotnumber == adapter->slotnumber)  			break;  		physcard = physcard->next; @@ -3815,7 +3032,11 @@ static u32 slic_card_locate(struct adapter *adapter)  	if (!physcard) {  		/* no structure allocated for this physical card yet */  		physcard = kzalloc(sizeof(struct physcard), GFP_ATOMIC); -		ASSERT(physcard); +		if (!physcard) { +			if (card_hostid == SLIC_HOSTID_DEFAULT) +				kfree(card); +			return -ENOMEM; +		}  		physcard->next = slic_global.phys_card;  		slic_global.phys_card = physcard; @@ -3826,14 +3047,13 @@ static u32 slic_card_locate(struct adapter *adapter)  	/* Note - this is ZERO relative */  	adapter->physport = physcard->adapters_allocd - 1; -	ASSERT(physcard->adapter[adapter->physport] == NULL);  	physcard->adapter[adapter->physport] = adapter;  	adapter->physcard = physcard;  	return 0;  } -static int __devinit slic_entry_probe(struct pci_dev *pcidev, +static int slic_entry_probe(struct pci_dev *pcidev,  			       const struct pci_device_id *pci_tbl_entry)  {  	static int cards_found; @@ -3842,7 +3062,6 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,  	struct net_device *netdev;  	struct adapter *adapter;  	void __iomem *memmapped_ioaddr = NULL; -	u32 status = 0;  	ulong mmio_start = 0;  	ulong mmio_len = 0;  	struct sliccard *card = NULL; @@ -3855,24 +3074,26 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,  	if (err)  		return err; -	if (slic_debug > 0 && did_version++ == 0) { -		printk(KERN_DEBUG "%s\n", slic_banner); -		printk(KERN_DEBUG "%s\n", slic_proc_version); +	if (did_version++ == 0) { +		dev_info(&pcidev->dev, "%s\n", slic_banner); +		dev_info(&pcidev->dev, "%s\n", slic_proc_version);  	}  	if (!pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) {  		pci_using_dac = 1; -		if (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64))) { -			dev_err(&pcidev->dev, "unable to obtain 64-bit DMA for " -					"consistent allocations\n"); +		err = pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64)); +		if (err) { +			dev_err(&pcidev->dev, "unable to obtain 64-bit DMA for consistent allocations\n"); +			goto err_out_disable_pci; +		} +	} else { +		err = pci_set_dma_mask(pcidev, DMA_BIT_MASK(32)); +		if (err) { +			dev_err(&pcidev->dev, "no usable DMA configuration\n");  			goto err_out_disable_pci;  		} -	} else if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) {  		pci_using_dac = 0;  		pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32)); -	} else { -		dev_err(&pcidev->dev, "no usable DMA configuration\n"); -		goto err_out_disable_pci;  	}  	err = pci_request_regions(pcidev, DRV_NAME); @@ -3907,6 +3128,7 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,  	if (!memmapped_ioaddr) {  		dev_err(&pcidev->dev, "cannot remap MMIO region %lx @ %lx\n",  			mmio_len, mmio_start); +		err = -ENOMEM;  		goto err_out_free_netdev;  	} @@ -3917,10 +3139,10 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,  	slic_init_adapter(netdev,  			  pcidev, pci_tbl_entry, memmapped_ioaddr, cards_found); -	status = slic_card_locate(adapter); -	if (status) { +	err = slic_card_locate(adapter); +	if (err) {  		dev_err(&pcidev->dev, "cannot locate card\n"); -		goto err_out_free_mmio_region; +		goto err_out_unmap;  	}  	card = adapter->card; @@ -3930,23 +3152,16 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,  		adapter->allocated = 1;  	} -	status = slic_card_init(card, adapter); +	err = slic_card_init(card, adapter); +	if (err) +		goto err_out_unmap; -	if (status != 0) { -		card->state = CARD_FAIL; -		adapter->state = ADAPT_FAIL; -		adapter->linkstate = LINK_DOWN; -		dev_err(&pcidev->dev, "FAILED status[%x]\n", status); -	} else { -		slic_adapter_set_hwaddr(adapter); -	} +	slic_adapter_set_hwaddr(adapter); -	netdev->base_addr = (unsigned long)adapter->memorybase; +	netdev->base_addr = (unsigned long) memmapped_ioaddr;  	netdev->irq = adapter->irq;  	netdev->netdev_ops = &slic_netdev_ops; -	slic_debug_adapter_create(adapter); -  	strcpy(netdev->name, "eth%d");  	err = register_netdev(netdev);  	if (err) { @@ -3956,12 +3171,10 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,  	cards_found++; -	return status; +	return 0;  err_out_unmap:  	iounmap(memmapped_ioaddr); -err_out_free_mmio_region: -	release_mem_region(mmio_start, mmio_len);  err_out_free_netdev:  	free_netdev(netdev);  err_out_exit_slic_probe: @@ -3975,26 +3188,19 @@ static struct pci_driver slic_driver = {  	.name = DRV_NAME,  	.id_table = slic_pci_tbl,  	.probe = slic_entry_probe, -	.remove = __devexit_p(slic_entry_remove), +	.remove = slic_entry_remove,  };  static int __init slic_module_init(void)  {  	slic_init_driver(); -	if (debug >= 0 && slic_debug != debug) -		printk(KERN_DEBUG KBUILD_MODNAME ": debug level is %d.\n", -		       debug); -	if (debug >= 0) -		slic_debug = debug; -  	return pci_register_driver(&slic_driver);  }  static void __exit slic_module_cleanup(void)  {  	pci_unregister_driver(&slic_driver); -	slic_debug_cleanup();  }  module_init(slic_module_init);  | 
