diff options
Diffstat (limited to 'drivers/staging/slicoss')
| -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 | 1029 |
5 files changed, 480 insertions, 1133 deletions
diff --git a/drivers/staging/slicoss/README b/drivers/staging/slicoss/README index cb04a87b201..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 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/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 78578ee5955..48841e7c2f7 100644 --- a/drivers/staging/slicoss/slicoss.c +++ b/drivers/staging/slicoss/slicoss.c @@ -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,29 +135,6 @@ static DEFINE_PCI_DEVICE_TABLE(slic_pci_tbl) = { MODULE_DEVICE_TABLE(pci, slic_pci_tbl); -#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) { \ - _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); @@ -189,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) @@ -487,7 +395,7 @@ static int slic_card_download_gbrcv(struct adapter *adapter) 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; } @@ -565,7 +473,7 @@ static int slic_card_download(struct adapter *adapter) 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); @@ -655,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); } } @@ -827,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; @@ -842,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++; @@ -852,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; @@ -901,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; @@ -1061,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, @@ -1228,116 +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); + 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; + u16 *wp = eeprom; + u32 checksum = 0; - union { - char c[2]; - ushort s; - } s_util; - - 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) @@ -1415,7 +1235,7 @@ static struct slic_rspbuf *slic_rspqueue_getnext(struct adapter *adapter) 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]; @@ -1507,7 +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); + 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++; @@ -1693,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); @@ -1843,8 +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; - 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; @@ -1882,445 +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); - 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 - * @@ -2341,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, @@ -2368,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) { @@ -2392,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; } @@ -2402,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; @@ -2484,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), @@ -2500,8 +1887,7 @@ 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; } } @@ -2686,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; @@ -2700,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: @@ -2787,7 +2176,6 @@ 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; @@ -2801,19 +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; - } - 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; @@ -2839,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; } @@ -2930,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; } @@ -2943,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); @@ -3038,33 +2427,24 @@ 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 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; - 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) { @@ -3208,6 +2588,7 @@ static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) return -EFAULT; if (ecmd.cmd == ETHTOOL_GSET) { + memset(&edata, 0, sizeof(edata)); edata.supported = (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half | @@ -3318,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, @@ -3336,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) { @@ -3380,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; } } } @@ -3432,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; @@ -3460,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); @@ -3496,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) @@ -3503,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(); } } @@ -3523,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); @@ -3622,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) { @@ -3645,11 +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; } + if (i == SLIC_MAX_PORTS) + break; + if (physcard->adapter[i]->slotnumber == adapter->slotnumber) break; physcard = physcard->next; @@ -3687,7 +3062,6 @@ static int 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; @@ -3700,24 +3074,26 @@ static int 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); @@ -3752,6 +3128,7 @@ static int 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; } @@ -3762,10 +3139,10 @@ static int 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; @@ -3775,23 +3152,16 @@ static int 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) { @@ -3801,12 +3171,10 @@ static int 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: @@ -3827,19 +3195,12 @@ 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); |
