diff options
-rw-r--r-- | drivers/net/netxen/netxen_nic.h | 125 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_ethtool.c | 83 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hdr.h | 8 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hw.c | 221 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hw.h | 18 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 117 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_isr.c | 87 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 526 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_niu.c | 27 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_phan_reg.h | 125 |
10 files changed, 646 insertions, 691 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index dd8ce35332f..b996cb38ecb 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
@@ -230,7 +230,9 @@ enum { | |||
230 | (((index) + (count)) & ((length) - 1)) | 230 | (((index) + (count)) & ((length) - 1)) |
231 | 231 | ||
232 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 | 232 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 |
233 | #define MPORT_MULTI_FUNCTION_MODE 0x2222 | ||
233 | 234 | ||
235 | #include "netxen_nic_phan_reg.h" | ||
234 | extern unsigned long long netxen_dma_mask; | 236 | extern unsigned long long netxen_dma_mask; |
235 | extern unsigned long last_schedule_time; | 237 | extern unsigned long last_schedule_time; |
236 | 238 | ||
@@ -703,10 +705,8 @@ extern char netxen_nic_driver_name[]; | |||
703 | #else | 705 | #else |
704 | #define DPRINTK(klevel, fmt, args...) do { \ | 706 | #define DPRINTK(klevel, fmt, args...) do { \ |
705 | printk(KERN_##klevel PFX "%s: %s: " fmt, __FUNCTION__,\ | 707 | printk(KERN_##klevel PFX "%s: %s: " fmt, __FUNCTION__,\ |
706 | (adapter != NULL && \ | 708 | (adapter != NULL && adapter->netdev != NULL) ? \ |
707 | adapter->port[0] != NULL && \ | 709 | adapter->netdev->name : NULL, \ |
708 | adapter->port[0]->netdev != NULL) ? \ | ||
709 | adapter->port[0]->netdev->name : NULL, \ | ||
710 | ## args); } while(0) | 710 | ## args); } while(0) |
711 | #endif | 711 | #endif |
712 | 712 | ||
@@ -788,17 +788,27 @@ struct netxen_hardware_context { | |||
788 | #define ETHERNET_FCS_SIZE 4 | 788 | #define ETHERNET_FCS_SIZE 4 |
789 | 789 | ||
790 | struct netxen_adapter_stats { | 790 | struct netxen_adapter_stats { |
791 | u64 ints; | 791 | u64 rcvdbadskb; |
792 | u64 hostints; | 792 | u64 xmitcalled; |
793 | u64 otherints; | 793 | u64 xmitedframes; |
794 | u64 process_rcv; | 794 | u64 xmitfinished; |
795 | u64 process_xmit; | 795 | u64 badskblen; |
796 | u64 noxmitdone; | 796 | u64 nocmddescriptor; |
797 | u64 xmitcsummed; | 797 | u64 polled; |
798 | u64 post_called; | 798 | u64 uphappy; |
799 | u64 posted; | 799 | u64 updropped; |
800 | u64 lastposted; | 800 | u64 uplcong; |
801 | u64 goodskbposts; | 801 | u64 uphcong; |
802 | u64 upmcong; | ||
803 | u64 updunno; | ||
804 | u64 skbfreed; | ||
805 | u64 txdropped; | ||
806 | u64 txnullskb; | ||
807 | u64 csummed; | ||
808 | u64 no_rcv; | ||
809 | u64 rxbytes; | ||
810 | u64 txbytes; | ||
811 | u64 ints; | ||
802 | }; | 812 | }; |
803 | 813 | ||
804 | /* | 814 | /* |
@@ -846,13 +856,19 @@ struct netxen_dummy_dma { | |||
846 | 856 | ||
847 | struct netxen_adapter { | 857 | struct netxen_adapter { |
848 | struct netxen_hardware_context ahw; | 858 | struct netxen_hardware_context ahw; |
849 | int port_count; /* Number of configured ports */ | 859 | |
850 | int active_ports; /* Number of open ports */ | 860 | struct netxen_adapter *master; |
851 | struct netxen_port *port[NETXEN_MAX_PORTS]; /* ptr to each port */ | 861 | struct net_device *netdev; |
862 | struct pci_dev *pdev; | ||
863 | unsigned char mac_addr[ETH_ALEN]; | ||
864 | int mtu; | ||
865 | int portnum; | ||
866 | |||
852 | spinlock_t tx_lock; | 867 | spinlock_t tx_lock; |
853 | spinlock_t lock; | 868 | spinlock_t lock; |
854 | struct work_struct watchdog_task; | 869 | struct work_struct watchdog_task; |
855 | struct timer_list watchdog_timer; | 870 | struct timer_list watchdog_timer; |
871 | struct work_struct tx_timeout_task; | ||
856 | 872 | ||
857 | u32 curr_window; | 873 | u32 curr_window; |
858 | 874 | ||
@@ -875,6 +891,15 @@ struct netxen_adapter { | |||
875 | u32 temp; | 891 | u32 temp; |
876 | 892 | ||
877 | struct netxen_adapter_stats stats; | 893 | struct netxen_adapter_stats stats; |
894 | |||
895 | u16 portno; | ||
896 | u16 link_speed; | ||
897 | u16 link_duplex; | ||
898 | u16 state; | ||
899 | u16 link_autoneg; | ||
900 | int rcsum; | ||
901 | int status; | ||
902 | spinlock_t stats_lock; | ||
878 | 903 | ||
879 | struct netxen_cmd_buffer *cmd_buf_arr; /* Command buffers for xmit */ | 904 | struct netxen_cmd_buffer *cmd_buf_arr; /* Command buffers for xmit */ |
880 | 905 | ||
@@ -894,62 +919,20 @@ struct netxen_adapter { | |||
894 | int (*enable_phy_interrupts) (struct netxen_adapter *, int); | 919 | int (*enable_phy_interrupts) (struct netxen_adapter *, int); |
895 | int (*disable_phy_interrupts) (struct netxen_adapter *, int); | 920 | int (*disable_phy_interrupts) (struct netxen_adapter *, int); |
896 | void (*handle_phy_intr) (struct netxen_adapter *); | 921 | void (*handle_phy_intr) (struct netxen_adapter *); |
897 | int (*macaddr_set) (struct netxen_port *, netxen_ethernet_macaddr_t); | 922 | int (*macaddr_set) (struct netxen_adapter *, netxen_ethernet_macaddr_t); |
898 | int (*set_mtu) (struct netxen_port *, int); | 923 | int (*set_mtu) (struct netxen_adapter *, int); |
899 | int (*set_promisc) (struct netxen_adapter *, int, | 924 | int (*set_promisc) (struct netxen_adapter *, netxen_niu_prom_mode_t); |
900 | netxen_niu_prom_mode_t); | 925 | int (*unset_promisc) (struct netxen_adapter *, netxen_niu_prom_mode_t); |
901 | int (*unset_promisc) (struct netxen_adapter *, int, | ||
902 | netxen_niu_prom_mode_t); | ||
903 | int (*phy_read) (struct netxen_adapter *, long phy, long reg, u32 *); | 926 | int (*phy_read) (struct netxen_adapter *, long phy, long reg, u32 *); |
904 | int (*phy_write) (struct netxen_adapter *, long phy, long reg, u32 val); | 927 | int (*phy_write) (struct netxen_adapter *, long phy, long reg, u32 val); |
905 | int (*init_port) (struct netxen_adapter *, int); | 928 | int (*init_port) (struct netxen_adapter *, int); |
906 | void (*init_niu) (struct netxen_adapter *); | 929 | void (*init_niu) (struct netxen_adapter *); |
907 | int (*stop_port) (struct netxen_adapter *, int); | 930 | int (*stop_port) (struct netxen_adapter *); |
908 | }; /* netxen_adapter structure */ | 931 | }; /* netxen_adapter structure */ |
909 | 932 | ||
910 | /* Max number of xmit producer threads that can run simultaneously */ | 933 | /* Max number of xmit producer threads that can run simultaneously */ |
911 | #define MAX_XMIT_PRODUCERS 16 | 934 | #define MAX_XMIT_PRODUCERS 16 |
912 | 935 | ||
913 | struct netxen_port_stats { | ||
914 | u64 rcvdbadskb; | ||
915 | u64 xmitcalled; | ||
916 | u64 xmitedframes; | ||
917 | u64 xmitfinished; | ||
918 | u64 badskblen; | ||
919 | u64 nocmddescriptor; | ||
920 | u64 polled; | ||
921 | u64 uphappy; | ||
922 | u64 updropped; | ||
923 | u64 uplcong; | ||
924 | u64 uphcong; | ||
925 | u64 upmcong; | ||
926 | u64 updunno; | ||
927 | u64 skbfreed; | ||
928 | u64 txdropped; | ||
929 | u64 txnullskb; | ||
930 | u64 csummed; | ||
931 | u64 no_rcv; | ||
932 | u64 rxbytes; | ||
933 | u64 txbytes; | ||
934 | }; | ||
935 | |||
936 | struct netxen_port { | ||
937 | struct netxen_adapter *adapter; | ||
938 | |||
939 | u16 portnum; /* GBE port number */ | ||
940 | u16 link_speed; | ||
941 | u16 link_duplex; | ||
942 | u16 link_autoneg; | ||
943 | |||
944 | int flags; | ||
945 | |||
946 | struct net_device *netdev; | ||
947 | struct pci_dev *pdev; | ||
948 | struct net_device_stats net_stats; | ||
949 | struct netxen_port_stats stats; | ||
950 | struct work_struct tx_timeout_task; | ||
951 | }; | ||
952 | |||
953 | #define PCI_OFFSET_FIRST_RANGE(adapter, off) \ | 936 | #define PCI_OFFSET_FIRST_RANGE(adapter, off) \ |
954 | ((adapter)->ahw.pci_base0 + (off)) | 937 | ((adapter)->ahw.pci_base0 + (off)) |
955 | #define PCI_OFFSET_SECOND_RANGE(adapter, off) \ | 938 | #define PCI_OFFSET_SECOND_RANGE(adapter, off) \ |
@@ -1011,8 +994,8 @@ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long phy, | |||
1011 | long reg, __u32 val); | 994 | long reg, __u32 val); |
1012 | 995 | ||
1013 | /* Functions available from netxen_nic_hw.c */ | 996 | /* Functions available from netxen_nic_hw.c */ |
1014 | int netxen_nic_set_mtu_xgb(struct netxen_port *port, int new_mtu); | 997 | int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu); |
1015 | int netxen_nic_set_mtu_gb(struct netxen_port *port, int new_mtu); | 998 | int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu); |
1016 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter); | 999 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter); |
1017 | void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw); | 1000 | void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw); |
1018 | void netxen_nic_reg_write(struct netxen_adapter *adapter, u64 off, u32 val); | 1001 | void netxen_nic_reg_write(struct netxen_adapter *adapter, u64 off, u32 val); |
@@ -1051,11 +1034,8 @@ int netxen_do_rom_se(struct netxen_adapter *adapter, int addr); | |||
1051 | 1034 | ||
1052 | /* Functions from netxen_nic_isr.c */ | 1035 | /* Functions from netxen_nic_isr.c */ |
1053 | void netxen_nic_isr_other(struct netxen_adapter *adapter); | 1036 | void netxen_nic_isr_other(struct netxen_adapter *adapter); |
1054 | void netxen_indicate_link_status(struct netxen_adapter *adapter, u32 port, | 1037 | void netxen_indicate_link_status(struct netxen_adapter *adapter, u32 link); |
1055 | u32 link); | 1038 | void netxen_handle_port_int(struct netxen_adapter *adapter, u32 enable); |
1056 | void netxen_handle_port_int(struct netxen_adapter *adapter, u32 port, | ||
1057 | u32 enable); | ||
1058 | void netxen_nic_stop_all_ports(struct netxen_adapter *adapter); | ||
1059 | void netxen_initialize_adapter_sw(struct netxen_adapter *adapter); | 1039 | void netxen_initialize_adapter_sw(struct netxen_adapter *adapter); |
1060 | void netxen_initialize_adapter_hw(struct netxen_adapter *adapter); | 1040 | void netxen_initialize_adapter_hw(struct netxen_adapter *adapter); |
1061 | void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, | 1041 | void *netxen_alloc(struct pci_dev *pdev, size_t sz, dma_addr_t * ptr, |
@@ -1110,6 +1090,7 @@ static inline void netxen_nic_enable_int(struct netxen_adapter *adapter) | |||
1110 | 1090 | ||
1111 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { | 1091 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { |
1112 | mask = 0xbff; | 1092 | mask = 0xbff; |
1093 | writel(0X0, NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); | ||
1113 | writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, | 1094 | writel(mask, PCI_OFFSET_SECOND_RANGE(adapter, |
1114 | ISR_INT_TARGET_MASK)); | 1095 | ISR_INT_TARGET_MASK)); |
1115 | } | 1096 | } |
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index ee1b5a24cbe..c400f264ea4 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c | |||
@@ -50,8 +50,8 @@ struct netxen_nic_stats { | |||
50 | int stat_offset; | 50 | int stat_offset; |
51 | }; | 51 | }; |
52 | 52 | ||
53 | #define NETXEN_NIC_STAT(m) sizeof(((struct netxen_port *)0)->m), \ | 53 | #define NETXEN_NIC_STAT(m) sizeof(((struct netxen_adapter *)0)->m), \ |
54 | offsetof(struct netxen_port, m) | 54 | offsetof(struct netxen_adapter, m) |
55 | 55 | ||
56 | #define NETXEN_NIC_PORT_WINDOW 0x10000 | 56 | #define NETXEN_NIC_PORT_WINDOW 0x10000 |
57 | #define NETXEN_NIC_INVALID_DATA 0xDEADBEEF | 57 | #define NETXEN_NIC_INVALID_DATA 0xDEADBEEF |
@@ -100,8 +100,7 @@ static int netxen_nic_get_eeprom_len(struct net_device *dev) | |||
100 | static void | 100 | static void |
101 | netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) | 101 | netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) |
102 | { | 102 | { |
103 | struct netxen_port *port = netdev_priv(dev); | 103 | struct netxen_adapter *adapter = netdev_priv(dev); |
104 | struct netxen_adapter *adapter = port->adapter; | ||
105 | u32 fw_major = 0; | 104 | u32 fw_major = 0; |
106 | u32 fw_minor = 0; | 105 | u32 fw_minor = 0; |
107 | u32 fw_build = 0; | 106 | u32 fw_build = 0; |
@@ -115,7 +114,7 @@ netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) | |||
115 | fw_build = readl(NETXEN_CRB_NORMALIZE(adapter, NETXEN_FW_VERSION_SUB)); | 114 | fw_build = readl(NETXEN_CRB_NORMALIZE(adapter, NETXEN_FW_VERSION_SUB)); |
116 | sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build); | 115 | sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build); |
117 | 116 | ||
118 | strncpy(drvinfo->bus_info, pci_name(port->pdev), 32); | 117 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); |
119 | drvinfo->n_stats = NETXEN_NIC_STATS_LEN; | 118 | drvinfo->n_stats = NETXEN_NIC_STATS_LEN; |
120 | drvinfo->testinfo_len = NETXEN_NIC_TEST_LEN; | 119 | drvinfo->testinfo_len = NETXEN_NIC_TEST_LEN; |
121 | drvinfo->regdump_len = NETXEN_NIC_REGS_LEN; | 120 | drvinfo->regdump_len = NETXEN_NIC_REGS_LEN; |
@@ -125,8 +124,7 @@ netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) | |||
125 | static int | 124 | static int |
126 | netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | 125 | netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) |
127 | { | 126 | { |
128 | struct netxen_port *port = netdev_priv(dev); | 127 | struct netxen_adapter *adapter = netdev_priv(dev); |
129 | struct netxen_adapter *adapter = port->adapter; | ||
130 | struct netxen_board_info *boardinfo = &adapter->ahw.boardcfg; | 128 | struct netxen_board_info *boardinfo = &adapter->ahw.boardcfg; |
131 | 129 | ||
132 | /* read which mode */ | 130 | /* read which mode */ |
@@ -146,8 +144,8 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
146 | ecmd->port = PORT_TP; | 144 | ecmd->port = PORT_TP; |
147 | 145 | ||
148 | if (netif_running(dev)) { | 146 | if (netif_running(dev)) { |
149 | ecmd->speed = port->link_speed; | 147 | ecmd->speed = adapter->link_speed; |
150 | ecmd->duplex = port->link_duplex; | 148 | ecmd->duplex = adapter->link_duplex; |
151 | } else | 149 | } else |
152 | return -EIO; /* link absent */ | 150 | return -EIO; /* link absent */ |
153 | } else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) { | 151 | } else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) { |
@@ -165,7 +163,7 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
165 | } else | 163 | } else |
166 | return -EIO; | 164 | return -EIO; |
167 | 165 | ||
168 | ecmd->phy_address = port->portnum; | 166 | ecmd->phy_address = adapter->portnum; |
169 | ecmd->transceiver = XCVR_EXTERNAL; | 167 | ecmd->transceiver = XCVR_EXTERNAL; |
170 | 168 | ||
171 | switch ((netxen_brdtype_t) boardinfo->board_type) { | 169 | switch ((netxen_brdtype_t) boardinfo->board_type) { |
@@ -179,7 +177,7 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
179 | ecmd->port = PORT_TP; | 177 | ecmd->port = PORT_TP; |
180 | ecmd->autoneg = (boardinfo->board_type == | 178 | ecmd->autoneg = (boardinfo->board_type == |
181 | NETXEN_BRDTYPE_P2_SB31_10G_CX4) ? | 179 | NETXEN_BRDTYPE_P2_SB31_10G_CX4) ? |
182 | (AUTONEG_DISABLE) : (port->link_autoneg); | 180 | (AUTONEG_DISABLE) : (adapter->link_autoneg); |
183 | break; | 181 | break; |
184 | case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ: | 182 | case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ: |
185 | case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: | 183 | case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: |
@@ -206,23 +204,22 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
206 | static int | 204 | static int |
207 | netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | 205 | netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) |
208 | { | 206 | { |
209 | struct netxen_port *port = netdev_priv(dev); | 207 | struct netxen_adapter *adapter = netdev_priv(dev); |
210 | struct netxen_adapter *adapter = port->adapter; | ||
211 | __u32 status; | 208 | __u32 status; |
212 | 209 | ||
213 | /* read which mode */ | 210 | /* read which mode */ |
214 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { | 211 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { |
215 | /* autonegotiation */ | 212 | /* autonegotiation */ |
216 | if (adapter->phy_write | 213 | if (adapter->phy_write |
217 | && adapter->phy_write(adapter, port->portnum, | 214 | && adapter->phy_write(adapter, adapter->portnum, |
218 | NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, | 215 | NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, |
219 | ecmd->autoneg) != 0) | 216 | ecmd->autoneg) != 0) |
220 | return -EIO; | 217 | return -EIO; |
221 | else | 218 | else |
222 | port->link_autoneg = ecmd->autoneg; | 219 | adapter->link_autoneg = ecmd->autoneg; |
223 | 220 | ||
224 | if (adapter->phy_read | 221 | if (adapter->phy_read |
225 | && adapter->phy_read(adapter, port->portnum, | 222 | && adapter->phy_read(adapter, adapter->portnum, |
226 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, | 223 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, |
227 | &status) != 0) | 224 | &status) != 0) |
228 | return -EIO; | 225 | return -EIO; |
@@ -245,13 +242,13 @@ netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
245 | if (ecmd->duplex == DUPLEX_FULL) | 242 | if (ecmd->duplex == DUPLEX_FULL) |
246 | netxen_set_phy_duplex(status); | 243 | netxen_set_phy_duplex(status); |
247 | if (adapter->phy_write | 244 | if (adapter->phy_write |
248 | && adapter->phy_write(adapter, port->portnum, | 245 | && adapter->phy_write(adapter, adapter->portnum, |
249 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, | 246 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, |
250 | *((int *)&status)) != 0) | 247 | *((int *)&status)) != 0) |
251 | return -EIO; | 248 | return -EIO; |
252 | else { | 249 | else { |
253 | port->link_speed = ecmd->speed; | 250 | adapter->link_speed = ecmd->speed; |
254 | port->link_duplex = ecmd->duplex; | 251 | adapter->link_duplex = ecmd->duplex; |
255 | } | 252 | } |
256 | } else | 253 | } else |
257 | return -EOPNOTSUPP; | 254 | return -EOPNOTSUPP; |
@@ -360,15 +357,14 @@ static struct netxen_niu_regs niu_registers[] = { | |||
360 | static void | 357 | static void |
361 | netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) | 358 | netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) |
362 | { | 359 | { |
363 | struct netxen_port *port = netdev_priv(dev); | 360 | struct netxen_adapter *adapter = netdev_priv(dev); |
364 | struct netxen_adapter *adapter = port->adapter; | ||
365 | __u32 mode, *regs_buff = p; | 361 | __u32 mode, *regs_buff = p; |
366 | void __iomem *addr; | 362 | void __iomem *addr; |
367 | int i, window; | 363 | int i, window; |
368 | 364 | ||
369 | memset(p, 0, NETXEN_NIC_REGS_LEN); | 365 | memset(p, 0, NETXEN_NIC_REGS_LEN); |
370 | regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) | | 366 | regs->version = (1 << 24) | (adapter->ahw.revision_id << 16) | |
371 | (port->pdev)->device; | 367 | (adapter->pdev)->device; |
372 | /* which mode */ | 368 | /* which mode */ |
373 | NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_MODE, ®s_buff[0]); | 369 | NETXEN_NIC_LOCKED_READ_REG(NETXEN_NIU_MODE, ®s_buff[0]); |
374 | mode = regs_buff[0]; | 370 | mode = regs_buff[0]; |
@@ -383,7 +379,8 @@ netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) | |||
383 | for (i = 3; niu_registers[mode].reg[i - 3] != -1; i++) { | 379 | for (i = 3; niu_registers[mode].reg[i - 3] != -1; i++) { |
384 | /* GB: port specific registers */ | 380 | /* GB: port specific registers */ |
385 | if (mode == 0 && i >= 19) | 381 | if (mode == 0 && i >= 19) |
386 | window = port->portnum * NETXEN_NIC_PORT_WINDOW; | 382 | window = adapter->portnum * |
383 | NETXEN_NIC_PORT_WINDOW; | ||
387 | 384 | ||
388 | NETXEN_NIC_LOCKED_READ_REG(niu_registers[mode]. | 385 | NETXEN_NIC_LOCKED_READ_REG(niu_registers[mode]. |
389 | reg[i - 3] + window, | 386 | reg[i - 3] + window, |
@@ -395,15 +392,14 @@ netxen_nic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) | |||
395 | 392 | ||
396 | static u32 netxen_nic_test_link(struct net_device *dev) | 393 | static u32 netxen_nic_test_link(struct net_device *dev) |
397 | { | 394 | { |
398 | struct netxen_port *port = netdev_priv(dev); | 395 | struct netxen_adapter *adapter = netdev_priv(dev); |
399 | struct netxen_adapter *adapter = port->adapter; | ||
400 | __u32 status; | 396 | __u32 status; |
401 | int val; | 397 | int val; |
402 | 398 | ||
403 | /* read which mode */ | 399 | /* read which mode */ |
404 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { | 400 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { |
405 | if (adapter->phy_read | 401 | if (adapter->phy_read |
406 | && adapter->phy_read(adapter, port->portnum, | 402 | && adapter->phy_read(adapter, adapter->portnum, |
407 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, | 403 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, |
408 | &status) != 0) | 404 | &status) != 0) |
409 | return -EIO; | 405 | return -EIO; |
@@ -422,15 +418,15 @@ static int | |||
422 | netxen_nic_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, | 418 | netxen_nic_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, |
423 | u8 * bytes) | 419 | u8 * bytes) |
424 | { | 420 | { |
425 | struct netxen_port *port = netdev_priv(dev); | 421 | struct netxen_adapter *adapter = netdev_priv(dev); |
426 | struct netxen_adapter *adapter = port->adapter; | ||
427 | int offset; | 422 | int offset; |
428 | int ret; | 423 | int ret; |
429 | 424 | ||
430 | if (eeprom->len == 0) | 425 | if (eeprom->len == 0) |
431 | return -EINVAL; | 426 | return -EINVAL; |
432 | 427 | ||
433 | eeprom->magic = (port->pdev)->vendor | ((port->pdev)->device << 16); | 428 | eeprom->magic = (adapter->pdev)->vendor | |
429 | ((adapter->pdev)->device << 16); | ||
434 | offset = eeprom->offset; | 430 | offset = eeprom->offset; |
435 | 431 | ||
436 | ret = netxen_rom_fast_read_words(adapter, offset, bytes, | 432 | ret = netxen_rom_fast_read_words(adapter, offset, bytes, |
@@ -445,8 +441,7 @@ static int | |||
445 | netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, | 441 | netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, |
446 | u8 * bytes) | 442 | u8 * bytes) |
447 | { | 443 | { |
448 | struct netxen_port *port = netdev_priv(dev); | 444 | struct netxen_adapter *adapter = netdev_priv(dev); |
449 | struct netxen_adapter *adapter = port->adapter; | ||
450 | int offset = eeprom->offset; | 445 | int offset = eeprom->offset; |
451 | static int flash_start; | 446 | static int flash_start; |
452 | static int ready_to_flash; | 447 | static int ready_to_flash; |
@@ -516,8 +511,7 @@ netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, | |||
516 | static void | 511 | static void |
517 | netxen_nic_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ring) | 512 | netxen_nic_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ring) |
518 | { | 513 | { |
519 | struct netxen_port *port = netdev_priv(dev); | 514 | struct netxen_adapter *adapter = netdev_priv(dev); |
520 | struct netxen_adapter *adapter = port->adapter; | ||
521 | int i; | 515 | int i; |
522 | 516 | ||
523 | ring->rx_pending = 0; | 517 | ring->rx_pending = 0; |
@@ -541,19 +535,18 @@ static void | |||
541 | netxen_nic_get_pauseparam(struct net_device *dev, | 535 | netxen_nic_get_pauseparam(struct net_device *dev, |
542 | struct ethtool_pauseparam *pause) | 536 | struct ethtool_pauseparam *pause) |
543 | { | 537 | { |
544 | struct netxen_port *port = netdev_priv(dev); | 538 | struct netxen_adapter *adapter = netdev_priv(dev); |
545 | struct netxen_adapter *adapter = port->adapter; | ||
546 | __u32 val; | 539 | __u32 val; |
547 | 540 | ||
548 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { | 541 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { |
549 | /* get flow control settings */ | 542 | /* get flow control settings */ |
550 | netxen_nic_read_w0(adapter, | 543 | netxen_nic_read_w0(adapter, |
551 | NETXEN_NIU_GB_MAC_CONFIG_0(port->portnum), | 544 | NETXEN_NIU_GB_MAC_CONFIG_0(adapter->portnum), |
552 | &val); | 545 | &val); |
553 | pause->rx_pause = netxen_gb_get_rx_flowctl(val); | 546 | pause->rx_pause = netxen_gb_get_rx_flowctl(val); |
554 | pause->tx_pause = netxen_gb_get_tx_flowctl(val); | 547 | pause->tx_pause = netxen_gb_get_tx_flowctl(val); |
555 | /* get autoneg settings */ | 548 | /* get autoneg settings */ |
556 | pause->autoneg = port->link_autoneg; | 549 | pause->autoneg = adapter->link_autoneg; |
557 | } | 550 | } |
558 | } | 551 | } |
559 | 552 | ||
@@ -561,8 +554,7 @@ static int | |||
561 | netxen_nic_set_pauseparam(struct net_device *dev, | 554 | netxen_nic_set_pauseparam(struct net_device *dev, |
562 | struct ethtool_pauseparam *pause) | 555 | struct ethtool_pauseparam *pause) |
563 | { | 556 | { |
564 | struct netxen_port *port = netdev_priv(dev); | 557 | struct netxen_adapter *adapter = netdev_priv(dev); |
565 | struct netxen_adapter *adapter = port->adapter; | ||
566 | __u32 val; | 558 | __u32 val; |
567 | unsigned int autoneg; | 559 | unsigned int autoneg; |
568 | 560 | ||
@@ -570,7 +562,7 @@ netxen_nic_set_pauseparam(struct net_device *dev, | |||
570 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { | 562 | if (adapter->ahw.board_type == NETXEN_NIC_GBE) { |
571 | /* set flow control */ | 563 | /* set flow control */ |
572 | netxen_nic_read_w0(adapter, | 564 | netxen_nic_read_w0(adapter, |
573 | NETXEN_NIU_GB_MAC_CONFIG_0(port->portnum), | 565 | NETXEN_NIU_GB_MAC_CONFIG_0(adapter->portnum), |
574 | (u32 *) & val); | 566 | (u32 *) & val); |
575 | if (pause->tx_pause) | 567 | if (pause->tx_pause) |
576 | netxen_gb_tx_flowctl(val); | 568 | netxen_gb_tx_flowctl(val); |
@@ -582,17 +574,17 @@ netxen_nic_set_pauseparam(struct net_device *dev, | |||
582 | netxen_gb_unset_rx_flowctl(val); | 574 | netxen_gb_unset_rx_flowctl(val); |
583 | 575 | ||
584 | netxen_nic_write_w0(adapter, | 576 | netxen_nic_write_w0(adapter, |
585 | NETXEN_NIU_GB_MAC_CONFIG_0(port->portnum), | 577 | NETXEN_NIU_GB_MAC_CONFIG_0(adapter->portnum), |
586 | *&val); | 578 | *&val); |
587 | /* set autoneg */ | 579 | /* set autoneg */ |
588 | autoneg = pause->autoneg; | 580 | autoneg = pause->autoneg; |
589 | if (adapter->phy_write | 581 | if (adapter->phy_write |
590 | && adapter->phy_write(adapter, port->portnum, | 582 | && adapter->phy_write(adapter, adapter->portnum, |
591 | NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, | 583 | NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, |
592 | autoneg) != 0) | 584 | autoneg) != 0) |
593 | return -EIO; | 585 | return -EIO; |
594 | else { | 586 | else { |
595 | port->link_autoneg = pause->autoneg; | 587 | adapter->link_autoneg = pause->autoneg; |
596 | return 0; | 588 | return 0; |
597 | } | 589 | } |
598 | } else | 590 | } else |
@@ -675,12 +667,13 @@ static void | |||
675 | netxen_nic_get_ethtool_stats(struct net_device *dev, | 667 | netxen_nic_get_ethtool_stats(struct net_device *dev, |
676 | struct ethtool_stats *stats, u64 * data) | 668 | struct ethtool_stats *stats, u64 * data) |
677 | { | 669 | { |
678 | struct netxen_port *port = netdev_priv(dev); | 670 | struct netxen_adapter *adapter = netdev_priv(dev); |
679 | int index; | 671 | int index; |
680 | 672 | ||
681 | for (index = 0; index < NETXEN_NIC_STATS_LEN; index++) { | 673 | for (index = 0; index < NETXEN_NIC_STATS_LEN; index++) { |
682 | char *p = | 674 | char *p = |
683 | (char *)port + netxen_nic_gstrings_stats[index].stat_offset; | 675 | (char *)adapter + |
676 | netxen_nic_gstrings_stats[index].stat_offset; | ||
684 | data[index] = | 677 | data[index] = |
685 | (netxen_nic_gstrings_stats[index].sizeof_stat == | 678 | (netxen_nic_gstrings_stats[index].sizeof_stat == |
686 | sizeof(u64)) ? *(u64 *) p : *(u32 *) p; | 679 | sizeof(u64)) ? *(u64 *) p : *(u32 *) p; |
diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h index fe8b675f9e7..b67a5c3ca99 100644 --- a/drivers/net/netxen/netxen_nic_hdr.h +++ b/drivers/net/netxen/netxen_nic_hdr.h | |||
@@ -649,11 +649,19 @@ enum { | |||
649 | #define PCIX_MS_WINDOW (0x10204) | 649 | #define PCIX_MS_WINDOW (0x10204) |
650 | #define PCIX_SN_WINDOW (0x10208) | 650 | #define PCIX_SN_WINDOW (0x10208) |
651 | #define PCIX_CRB_WINDOW (0x10210) | 651 | #define PCIX_CRB_WINDOW (0x10210) |
652 | #define PCIX_CRB_WINDOW_F0 (0x10210) | ||
653 | #define PCIX_CRB_WINDOW_F1 (0x10230) | ||
654 | #define PCIX_CRB_WINDOW_F2 (0x10250) | ||
655 | #define PCIX_CRB_WINDOW_F3 (0x10270) | ||
652 | 656 | ||
653 | #define PCIX_TARGET_STATUS (0x10118) | 657 | #define PCIX_TARGET_STATUS (0x10118) |
654 | #define PCIX_TARGET_MASK (0x10128) | 658 | #define PCIX_TARGET_MASK (0x10128) |
655 | 659 | ||
656 | #define PCIX_MSI_F0 (0x13000) | 660 | #define PCIX_MSI_F0 (0x13000) |
661 | #define PCIX_MSI_F1 (0x13004) | ||
662 | #define PCIX_MSI_F2 (0x13008) | ||
663 | #define PCIX_MSI_F3 (0x1300c) | ||
664 | #define PCIX_MSI_F(i) (0x13000+((i)*4)) | ||
657 | 665 | ||
658 | #define PCIX_PS_MEM_SPACE (0x90000) | 666 | #define PCIX_PS_MEM_SPACE (0x90000) |
659 | 667 | ||
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 0fba8f19076..50430911c80 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -33,10 +33,128 @@ | |||
33 | 33 | ||
34 | #include "netxen_nic.h" | 34 | #include "netxen_nic.h" |
35 | #include "netxen_nic_hw.h" | 35 | #include "netxen_nic_hw.h" |
36 | #define DEFINE_GLOBAL_RECV_CRB | ||
36 | #include "netxen_nic_phan_reg.h" | 37 | #include "netxen_nic_phan_reg.h" |
37 | 38 | ||
39 | |||
38 | #include <net/ip.h> | 40 | #include <net/ip.h> |
39 | 41 | ||
42 | struct netxen_recv_crb recv_crb_registers[] = { | ||
43 | /* | ||
44 | * Instance 0. | ||
45 | */ | ||
46 | { | ||
47 | /* rcv_desc_crb: */ | ||
48 | { | ||
49 | { | ||
50 | /* crb_rcv_producer_offset: */ | ||
51 | NETXEN_NIC_REG(0x100), | ||
52 | /* crb_rcv_consumer_offset: */ | ||
53 | NETXEN_NIC_REG(0x104), | ||
54 | /* crb_gloablrcv_ring: */ | ||
55 | NETXEN_NIC_REG(0x108), | ||
56 | /* crb_rcv_ring_size */ | ||
57 | NETXEN_NIC_REG(0x10c), | ||
58 | |||
59 | }, | ||
60 | /* Jumbo frames */ | ||
61 | { | ||
62 | /* crb_rcv_producer_offset: */ | ||
63 | NETXEN_NIC_REG(0x110), | ||
64 | /* crb_rcv_consumer_offset: */ | ||
65 | NETXEN_NIC_REG(0x114), | ||
66 | /* crb_gloablrcv_ring: */ | ||
67 | NETXEN_NIC_REG(0x118), | ||
68 | /* crb_rcv_ring_size */ | ||
69 | NETXEN_NIC_REG(0x11c), | ||
70 | }, | ||
71 | /* LRO */ | ||
72 | { | ||
73 | /* crb_rcv_producer_offset: */ | ||
74 | NETXEN_NIC_REG(0x120), | ||
75 | /* crb_rcv_consumer_offset: */ | ||
76 | NETXEN_NIC_REG(0x124), | ||
77 | /* crb_gloablrcv_ring: */ | ||
78 | NETXEN_NIC_REG(0x128), | ||
79 | /* crb_rcv_ring_size */ | ||
80 | NETXEN_NIC_REG(0x12c), | ||
81 | } | ||
82 | }, | ||
83 | /* crb_rcvstatus_ring: */ | ||
84 | NETXEN_NIC_REG(0x130), | ||
85 | /* crb_rcv_status_producer: */ | ||
86 | NETXEN_NIC_REG(0x134), | ||
87 | /* crb_rcv_status_consumer: */ | ||
88 | NETXEN_NIC_REG(0x138), | ||
89 | /* crb_rcvpeg_state: */ | ||
90 | NETXEN_NIC_REG(0x13c), | ||
91 | /* crb_status_ring_size */ | ||
92 | NETXEN_NIC_REG(0x140), | ||
93 | |||
94 | }, | ||
95 | /* | ||
96 | * Instance 1, | ||
97 | */ | ||
98 | { | ||
99 | /* rcv_desc_crb: */ | ||
100 | { | ||
101 | { | ||
102 | /* crb_rcv_producer_offset: */ | ||
103 | NETXEN_NIC_REG(0x144), | ||
104 | /* crb_rcv_consumer_offset: */ | ||
105 | NETXEN_NIC_REG(0x148), | ||
106 | /* crb_globalrcv_ring: */ | ||
107 | NETXEN_NIC_REG(0x14c), | ||
108 | /* crb_rcv_ring_size */ | ||
109 | NETXEN_NIC_REG(0x150), | ||
110 | |||
111 | }, | ||
112 | /* Jumbo frames */ | ||
113 | { | ||
114 | /* crb_rcv_producer_offset: */ | ||
115 | NETXEN_NIC_REG(0x154), | ||
116 | /* crb_rcv_consumer_offset: */ | ||
117 | NETXEN_NIC_REG(0x158), | ||
118 | /* crb_globalrcv_ring: */ | ||
119 | NETXEN_NIC_REG(0x15c), | ||
120 | /* crb_rcv_ring_size */ | ||
121 | NETXEN_NIC_REG(0x160), | ||
122 | }, | ||
123 | /* LRO */ | ||
124 | { | ||
125 | /* crb_rcv_producer_offset: */ | ||
126 | NETXEN_NIC_REG(0x164), | ||
127 | /* crb_rcv_consumer_offset: */ | ||
128 | NETXEN_NIC_REG(0x168), | ||
129 | /* crb_globalrcv_ring: */ | ||
130 | NETXEN_NIC_REG(0x16c), | ||
131 | /* crb_rcv_ring_size */ | ||
132 | NETXEN_NIC_REG(0x170), | ||
133 | } | ||
134 | |||
135 | }, | ||
136 | /* crb_rcvstatus_ring: */ | ||
137 | NETXEN_NIC_REG(0x174), | ||
138 | /* crb_rcv_status_producer: */ | ||
139 | NETXEN_NIC_REG(0x178), | ||
140 | /* crb_rcv_status_consumer: */ | ||
141 | NETXEN_NIC_REG(0x17c), | ||
142 | /* crb_rcvpeg_state: */ | ||
143 | NETXEN_NIC_REG(0x180), | ||
144 | /* crb_status_ring_size */ | ||
145 | NETXEN_NIC_REG(0x184), | ||
146 | |||
147 | }, | ||
148 | }; | ||
149 | |||
150 | u64 ctx_addr_sig_regs[][3] = { | ||
151 | {NETXEN_NIC_REG(0x188), NETXEN_NIC_REG(0x18c), NETXEN_NIC_REG(0x1c0)}, | ||
152 | {NETXEN_NIC_REG(0x190), NETXEN_NIC_REG(0x194), NETXEN_NIC_REG(0x1c4)}, | ||
153 | {NETXEN_NIC_REG(0x198), NETXEN_NIC_REG(0x19c), NETXEN_NIC_REG(0x1c8)}, | ||
154 | {NETXEN_NIC_REG(0x1a0), NETXEN_NIC_REG(0x1a4), NETXEN_NIC_REG(0x1cc)} | ||
155 | }; | ||
156 | |||
157 | |||
40 | /* PCI Windowing for DDR regions. */ | 158 | /* PCI Windowing for DDR regions. */ |
41 | 159 | ||
42 | #define ADDR_IN_RANGE(addr, low, high) \ | 160 | #define ADDR_IN_RANGE(addr, low, high) \ |
@@ -70,8 +188,7 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter); | |||
70 | 188 | ||
71 | int netxen_nic_set_mac(struct net_device *netdev, void *p) | 189 | int netxen_nic_set_mac(struct net_device *netdev, void *p) |
72 | { | 190 | { |
73 | struct netxen_port *port = netdev_priv(netdev); | 191 | struct netxen_adapter *adapter = netdev_priv(netdev); |
74 | struct netxen_adapter *adapter = port->adapter; | ||
75 | struct sockaddr *addr = p; | 192 | struct sockaddr *addr = p; |
76 | 193 | ||
77 | if (netif_running(netdev)) | 194 | if (netif_running(netdev)) |
@@ -84,7 +201,7 @@ int netxen_nic_set_mac(struct net_device *netdev, void *p) | |||
84 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | 201 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); |
85 | 202 | ||
86 | if (adapter->macaddr_set) | 203 | if (adapter->macaddr_set) |
87 | adapter->macaddr_set(port, addr->sa_data); | 204 | adapter->macaddr_set(adapter, addr->sa_data); |
88 | 205 | ||
89 | return 0; | 206 | return 0; |
90 | } | 207 | } |
@@ -94,8 +211,7 @@ int netxen_nic_set_mac(struct net_device *netdev, void *p) | |||
94 | */ | 211 | */ |
95 | void netxen_nic_set_multi(struct net_device *netdev) | 212 | void netxen_nic_set_multi(struct net_device *netdev) |
96 | { | 213 | { |
97 | struct netxen_port *port = netdev_priv(netdev); | 214 | struct netxen_adapter *adapter = netdev_priv(netdev); |
98 | struct netxen_adapter *adapter = port->adapter; | ||
99 | struct dev_mc_list *mc_ptr; | 215 | struct dev_mc_list *mc_ptr; |
100 | __u32 netxen_mac_addr_cntl_data = 0; | 216 | __u32 netxen_mac_addr_cntl_data = 0; |
101 | 217 | ||
@@ -103,14 +219,12 @@ void netxen_nic_set_multi(struct net_device *netdev) | |||
103 | if (netdev->flags & IFF_PROMISC) { | 219 | if (netdev->flags & IFF_PROMISC) { |
104 | if (adapter->set_promisc) | 220 | if (adapter->set_promisc) |
105 | adapter->set_promisc(adapter, | 221 | adapter->set_promisc(adapter, |
106 | port->portnum, | ||
107 | NETXEN_NIU_PROMISC_MODE); | 222 | NETXEN_NIU_PROMISC_MODE); |
108 | } else { | 223 | } else { |
109 | if (adapter->unset_promisc && | 224 | if (adapter->unset_promisc && |
110 | adapter->ahw.boardcfg.board_type | 225 | adapter->ahw.boardcfg.board_type |
111 | != NETXEN_BRDTYPE_P2_SB31_10G_IMEZ) | 226 | != NETXEN_BRDTYPE_P2_SB31_10G_IMEZ) |
112 | adapter->unset_promisc(adapter, | 227 | adapter->unset_promisc(adapter, |
113 | port->portnum, | ||
114 | NETXEN_NIU_NON_PROMISC_MODE); | 228 | NETXEN_NIU_NON_PROMISC_MODE); |
115 | } | 229 | } |
116 | if (adapter->ahw.board_type == NETXEN_NIC_XGBE) { | 230 | if (adapter->ahw.board_type == NETXEN_NIC_XGBE) { |
@@ -152,8 +266,7 @@ void netxen_nic_set_multi(struct net_device *netdev) | |||
152 | */ | 266 | */ |
153 | int netxen_nic_change_mtu(struct net_device *netdev, int mtu) | 267 | int netxen_nic_change_mtu(struct net_device *netdev, int mtu) |
154 | { | 268 | { |
155 | struct netxen_port *port = netdev_priv(netdev); | 269 | struct netxen_adapter *adapter = netdev_priv(netdev); |
156 | struct netxen_adapter *adapter = port->adapter; | ||
157 | int eff_mtu = mtu + NETXEN_ENET_HEADER_SIZE + NETXEN_ETH_FCS_SIZE; | 270 | int eff_mtu = mtu + NETXEN_ENET_HEADER_SIZE + NETXEN_ETH_FCS_SIZE; |
158 | 271 | ||
159 | if ((eff_mtu > NETXEN_MAX_MTU) || (eff_mtu < NETXEN_MIN_MTU)) { | 272 | if ((eff_mtu > NETXEN_MAX_MTU) || (eff_mtu < NETXEN_MIN_MTU)) { |
@@ -163,7 +276,7 @@ int netxen_nic_change_mtu(struct net_device *netdev, int mtu) | |||
163 | } | 276 | } |
164 | 277 | ||
165 | if (adapter->set_mtu) | 278 | if (adapter->set_mtu) |
166 | adapter->set_mtu(port, mtu); | 279 | adapter->set_mtu(adapter, mtu); |
167 | netdev->mtu = mtu; | 280 | netdev->mtu = mtu; |
168 | 281 | ||
169 | return 0; | 282 | return 0; |
@@ -229,7 +342,7 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter) | |||
229 | (dma_addr_t *) & adapter->ctx_desc_phys_addr, | 342 | (dma_addr_t *) & adapter->ctx_desc_phys_addr, |
230 | &adapter->ctx_desc_pdev); | 343 | &adapter->ctx_desc_pdev); |
231 | 344 | ||
232 | printk("ctx_desc_phys_addr: 0x%llx\n", | 345 | printk(KERN_INFO "ctx_desc_phys_addr: 0x%llx\n", |
233 | (unsigned long long) adapter->ctx_desc_phys_addr); | 346 | (unsigned long long) adapter->ctx_desc_phys_addr); |
234 | if (addr == NULL) { | 347 | if (addr == NULL) { |
235 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); | 348 | DPRINTK(ERR, "bad return from pci_alloc_consistent\n"); |
@@ -249,7 +362,7 @@ int netxen_nic_hw_resources(struct netxen_adapter *adapter) | |||
249 | adapter->max_tx_desc_count, | 362 | adapter->max_tx_desc_count, |
250 | (dma_addr_t *) & hw->cmd_desc_phys_addr, | 363 | (dma_addr_t *) & hw->cmd_desc_phys_addr, |
251 | &adapter->ahw.cmd_desc_pdev); | 364 | &adapter->ahw.cmd_desc_pdev); |
252 | printk("cmd_desc_phys_addr: 0x%llx\n", | 365 | printk(KERN_INFO "cmd_desc_phys_addr: 0x%llx\n", |
253 | (unsigned long long) hw->cmd_desc_phys_addr); | 366 | (unsigned long long) hw->cmd_desc_phys_addr); |
254 | 367 | ||
255 | if (addr == NULL) { | 368 | if (addr == NULL) { |
@@ -385,7 +498,6 @@ void netxen_tso_check(struct netxen_adapter *adapter, | |||
385 | return; | 498 | return; |
386 | } | 499 | } |
387 | } | 500 | } |
388 | adapter->stats.xmitcsummed++; | ||
389 | desc->tcp_hdr_offset = skb_transport_offset(skb); | 501 | desc->tcp_hdr_offset = skb_transport_offset(skb); |
390 | desc->ip_hdr_offset = skb_network_offset(skb); | 502 | desc->ip_hdr_offset = skb_network_offset(skb); |
391 | } | 503 | } |
@@ -475,7 +587,30 @@ void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw) | |||
475 | 587 | ||
476 | if (adapter->curr_window == wndw) | 588 | if (adapter->curr_window == wndw) |
477 | return; | 589 | return; |
478 | 590 | switch(adapter->portnum) { | |
591 | case 0: | ||
592 | offset = PCI_OFFSET_SECOND_RANGE(adapter, | ||
593 | NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW)); | ||
594 | break; | ||
595 | case 1: | ||
596 | offset = PCI_OFFSET_SECOND_RANGE(adapter, | ||
597 | NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW_F1)); | ||
598 | break; | ||
599 | case 2: | ||
600 | offset = PCI_OFFSET_SECOND_RANGE(adapter, | ||
601 | NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW_F2)); | ||
602 | break; | ||
603 | case 3: | ||
604 | offset = PCI_OFFSET_SECOND_RANGE(adapter, | ||
605 | NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW_F3)); | ||
606 | break; | ||
607 | default: | ||
608 | printk(KERN_INFO "Changing the window for PCI function" | ||
609 | "%d\n", adapter->portnum); | ||
610 | offset = PCI_OFFSET_SECOND_RANGE(adapter, | ||
611 | NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW)); | ||
612 | break; | ||
613 | } | ||
479 | /* | 614 | /* |
480 | * Move the CRB window. | 615 | * Move the CRB window. |
481 | * We need to write to the "direct access" region of PCI | 616 | * We need to write to the "direct access" region of PCI |
@@ -484,9 +619,6 @@ void netxen_nic_pci_change_crbwindow(struct netxen_adapter *adapter, u32 wndw) | |||
484 | * register address is received by PCI. The direct region bypasses | 619 | * register address is received by PCI. The direct region bypasses |
485 | * the CRB bus. | 620 | * the CRB bus. |
486 | */ | 621 | */ |
487 | offset = | ||
488 | PCI_OFFSET_SECOND_RANGE(adapter, | ||
489 | NETXEN_PCIX_PH_REG(PCIX_CRB_WINDOW)); | ||
490 | 622 | ||
491 | if (wndw & 0x1) | 623 | if (wndw & 0x1) |
492 | wndw = NETXEN_WINDOW_ONE; | 624 | wndw = NETXEN_WINDOW_ONE; |
@@ -810,43 +942,27 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter) | |||
810 | 942 | ||
811 | /* NIU access sections */ | 943 | /* NIU access sections */ |
812 | 944 | ||
813 | int netxen_nic_set_mtu_gb(struct netxen_port *port, int new_mtu) | 945 | int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu) |
814 | { | 946 | { |
815 | struct netxen_adapter *adapter = port->adapter; | ||
816 | netxen_nic_write_w0(adapter, | 947 | netxen_nic_write_w0(adapter, |
817 | NETXEN_NIU_GB_MAX_FRAME_SIZE(port->portnum), | 948 | NETXEN_NIU_GB_MAX_FRAME_SIZE(adapter->portnum), |
818 | new_mtu); | 949 | new_mtu); |
819 | return 0; | 950 | return 0; |
820 | } | 951 | } |
821 | 952 | ||
822 | int netxen_nic_set_mtu_xgb(struct netxen_port *port, int new_mtu) | 953 | int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu) |
823 | { | 954 | { |
824 | struct netxen_adapter *adapter = port->adapter; | ||
825 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; | 955 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; |
826 | if (port->portnum == 0) | 956 | if (adapter->portnum == 0) |
827 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu); | 957 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu); |
828 | else if (port->portnum == 1) | 958 | else if (adapter->portnum == 1) |
829 | netxen_nic_write_w0(adapter, NETXEN_NIU_XG1_MAX_FRAME_SIZE, new_mtu); | 959 | netxen_nic_write_w0(adapter, NETXEN_NIU_XG1_MAX_FRAME_SIZE, new_mtu); |
830 | return 0; | 960 | return 0; |
831 | } | 961 | } |
832 | 962 | ||
833 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter) | 963 | void netxen_nic_init_niu_gb(struct netxen_adapter *adapter) |
834 | { | 964 | { |
835 | int portno; | 965 | netxen_niu_gbe_init_port(adapter, adapter->portnum); |
836 | for (portno = 0; portno < NETXEN_NIU_MAX_GBE_PORTS; portno++) | ||
837 | netxen_niu_gbe_init_port(adapter, portno); | ||
838 | } | ||
839 | |||
840 | void netxen_nic_stop_all_ports(struct netxen_adapter *adapter) | ||
841 | { | ||
842 | int port_nr; | ||
843 | struct netxen_port *port; | ||
844 | |||
845 | for (port_nr = 0; port_nr < adapter->ahw.max_ports; port_nr++) { | ||
846 | port = adapter->port[port_nr]; | ||
847 | if (adapter->stop_port) | ||
848 | adapter->stop_port(adapter, port->portnum); | ||
849 | } | ||
850 | } | 966 | } |
851 | 967 | ||
852 | void | 968 | void |
@@ -865,9 +981,8 @@ netxen_crb_writelit_adapter(struct netxen_adapter *adapter, unsigned long off, | |||
865 | } | 981 | } |
866 | } | 982 | } |
867 | 983 | ||
868 | void netxen_nic_set_link_parameters(struct netxen_port *port) | 984 | void netxen_nic_set_link_parameters(struct netxen_adapter *adapter) |
869 | { | 985 | { |
870 | struct netxen_adapter *adapter = port->adapter; | ||
871 | __u32 status; | 986 | __u32 status; |
872 | __u32 autoneg; | 987 | __u32 autoneg; |
873 | __u32 mode; | 988 | __u32 mode; |
@@ -876,47 +991,47 @@ void netxen_nic_set_link_parameters(struct netxen_port *port) | |||
876 | if (netxen_get_niu_enable_ge(mode)) { /* Gb 10/100/1000 Mbps mode */ | 991 | if (netxen_get_niu_enable_ge(mode)) { /* Gb 10/100/1000 Mbps mode */ |
877 | if (adapter->phy_read | 992 | if (adapter->phy_read |
878 | && adapter-> | 993 | && adapter-> |
879 | phy_read(adapter, port->portnum, | 994 | phy_read(adapter, adapter->portnum, |
880 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, | 995 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, |
881 | &status) == 0) { | 996 | &status) == 0) { |
882 | if (netxen_get_phy_link(status)) { | 997 | if (netxen_get_phy_link(status)) { |
883 | switch (netxen_get_phy_speed(status)) { | 998 | switch (netxen_get_phy_speed(status)) { |
884 | case 0: | 999 | case 0: |
885 | port->link_speed = SPEED_10; | 1000 | adapter->link_speed = SPEED_10; |
886 | break; | 1001 | break; |
887 | case 1: | 1002 | case 1: |
888 | port->link_speed = SPEED_100; | 1003 | adapter->link_speed = SPEED_100; |
889 | break; | 1004 | break; |
890 | case 2: | 1005 | case 2: |
891 | port->link_speed = SPEED_1000; | 1006 | adapter->link_speed = SPEED_1000; |
892 | break; | 1007 | break; |
893 | default: | 1008 | default: |
894 | port->link_speed = -1; | 1009 | adapter->link_speed = -1; |
895 | break; | 1010 | break; |
896 | } | 1011 | } |
897 | switch (netxen_get_phy_duplex(status)) { | 1012 | switch (netxen_get_phy_duplex(status)) { |
898 | case 0: | 1013 | case 0: |
899 | port->link_duplex = DUPLEX_HALF; | 1014 | adapter->link_duplex = DUPLEX_HALF; |
900 | break; | 1015 | break; |
901 | case 1: | 1016 | case 1: |
902 | port->link_duplex = DUPLEX_FULL; | 1017 | adapter->link_duplex = DUPLEX_FULL; |
903 | break; | 1018 | break; |
904 | default: | 1019 | default: |
905 | port->link_duplex = -1; | 1020 | adapter->link_duplex = -1; |
906 | break; | 1021 | break; |
907 | } | 1022 | } |
908 | if (adapter->phy_read | 1023 | if (adapter->phy_read |
909 | && adapter-> | 1024 | && adapter-> |
910 | phy_read(adapter, port->portnum, | 1025 | phy_read(adapter, adapter->portnum, |
911 | NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, | 1026 | NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, |
912 | &autoneg) != 0) | 1027 | &autoneg) != 0) |
913 | port->link_autoneg = autoneg; | 1028 | adapter->link_autoneg = autoneg; |
914 | } else | 1029 | } else |
915 | goto link_down; | 1030 | goto link_down; |
916 | } else { | 1031 | } else { |
917 | link_down: | 1032 | link_down: |
918 | port->link_speed = -1; | 1033 | adapter->link_speed = -1; |
919 | port->link_duplex = -1; | 1034 | adapter->link_duplex = -1; |
920 | } | 1035 | } |
921 | } | 1036 | } |
922 | } | 1037 | } |
diff --git a/drivers/net/netxen/netxen_nic_hw.h b/drivers/net/netxen/netxen_nic_hw.h index ab1112eb1b0..841341d52dc 100644 --- a/drivers/net/netxen/netxen_nic_hw.h +++ b/drivers/net/netxen/netxen_nic_hw.h | |||
@@ -6,12 +6,12 @@ | |||
6 | * modify it under the terms of the GNU General Public License | 6 | * modify it under the terms of the GNU General Public License |
7 | * as published by the Free Software Foundation; either version 2 | 7 | * as published by the Free Software Foundation; either version 2 |
8 | * of the License, or (at your option) any later version. | 8 | * of the License, or (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, but | 10 | * This program is distributed in the hope that it will be useful, but |
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, | 17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, |
@@ -87,7 +87,7 @@ struct netxen_adapter; | |||
87 | *(u32 *)Y = readl((void __iomem*) addr); | 87 | *(u32 *)Y = readl((void __iomem*) addr); |
88 | 88 | ||
89 | struct netxen_port; | 89 | struct netxen_port; |
90 | void netxen_nic_set_link_parameters(struct netxen_port *port); | 90 | void netxen_nic_set_link_parameters(struct netxen_adapter *adapter); |
91 | void netxen_nic_flash_print(struct netxen_adapter *adapter); | 91 | void netxen_nic_flash_print(struct netxen_adapter *adapter); |
92 | int netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off, | 92 | int netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off, |
93 | void *data, int len); | 93 | void *data, int len); |
@@ -452,21 +452,21 @@ typedef enum { | |||
452 | ((config) |= (((val) & 0x0f) << 28)) | 452 | ((config) |= (((val) & 0x0f) << 28)) |
453 | 453 | ||
454 | /* Set promiscuous mode for a GbE interface */ | 454 | /* Set promiscuous mode for a GbE interface */ |
455 | int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, int port, | 455 | int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, |
456 | netxen_niu_prom_mode_t mode); | 456 | netxen_niu_prom_mode_t mode); |
457 | int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, | 457 | int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, |
458 | int port, netxen_niu_prom_mode_t mode); | 458 | netxen_niu_prom_mode_t mode); |
459 | 459 | ||
460 | /* get/set the MAC address for a given MAC */ | 460 | /* get/set the MAC address for a given MAC */ |
461 | int netxen_niu_macaddr_get(struct netxen_adapter *adapter, int port, | 461 | int netxen_niu_macaddr_get(struct netxen_adapter *adapter, int port, |
462 | netxen_ethernet_macaddr_t * addr); | 462 | netxen_ethernet_macaddr_t * addr); |
463 | int netxen_niu_macaddr_set(struct netxen_port *port, | 463 | int netxen_niu_macaddr_set(struct netxen_adapter *adapter, |
464 | netxen_ethernet_macaddr_t addr); | 464 | netxen_ethernet_macaddr_t addr); |
465 | 465 | ||
466 | /* XG versons */ | 466 | /* XG versons */ |
467 | int netxen_niu_xg_macaddr_get(struct netxen_adapter *adapter, int port, | 467 | int netxen_niu_xg_macaddr_get(struct netxen_adapter *adapter, int port, |
468 | netxen_ethernet_macaddr_t * addr); | 468 | netxen_ethernet_macaddr_t * addr); |
469 | int netxen_niu_xg_macaddr_set(struct netxen_port *port, | 469 | int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter, |
470 | netxen_ethernet_macaddr_t addr); | 470 | netxen_ethernet_macaddr_t addr); |
471 | 471 | ||
472 | /* Generic enable for GbE ports. Will detect the speed of the link. */ | 472 | /* Generic enable for GbE ports. Will detect the speed of the link. */ |
@@ -475,8 +475,8 @@ int netxen_niu_gbe_init_port(struct netxen_adapter *adapter, int port); | |||
475 | int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port); | 475 | int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port); |
476 | 476 | ||
477 | /* Disable a GbE interface */ | 477 | /* Disable a GbE interface */ |
478 | int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter, int port); | 478 | int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter); |
479 | 479 | ||
480 | int netxen_niu_disable_xg_port(struct netxen_adapter *adapter, int port); | 480 | int netxen_niu_disable_xg_port(struct netxen_adapter *adapter); |
481 | 481 | ||
482 | #endif /* __NETXEN_NIC_HW_H_ */ | 482 | #endif /* __NETXEN_NIC_HW_H_ */ |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 5cd40562da7..4df38c7e71a 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -139,7 +139,7 @@ int netxen_init_firmware(struct netxen_adapter *adapter) | |||
139 | return err; | 139 | return err; |
140 | } | 140 | } |
141 | /* Window 1 call */ | 141 | /* Window 1 call */ |
142 | writel(MPORT_SINGLE_FUNCTION_MODE, | 142 | writel(MPORT_MULTI_FUNCTION_MODE, |
143 | NETXEN_CRB_NORMALIZE(adapter, CRB_MPORT_MODE)); | 143 | NETXEN_CRB_NORMALIZE(adapter, CRB_MPORT_MODE)); |
144 | writel(PHAN_INITIALIZE_ACK, | 144 | writel(PHAN_INITIALIZE_ACK, |
145 | NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | 145 | NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); |
@@ -990,9 +990,7 @@ int netxen_nic_rx_has_work(struct netxen_adapter *adapter) | |||
990 | 990 | ||
991 | static inline int netxen_nic_check_temp(struct netxen_adapter *adapter) | 991 | static inline int netxen_nic_check_temp(struct netxen_adapter *adapter) |
992 | { | 992 | { |
993 | int port_num; | 993 | struct net_device *netdev = adapter->netdev; |
994 | struct netxen_port *port; | ||
995 | struct net_device *netdev; | ||
996 | uint32_t temp, temp_state, temp_val; | 994 | uint32_t temp, temp_state, temp_val; |
997 | int rv = 0; | 995 | int rv = 0; |
998 | 996 | ||
@@ -1006,14 +1004,9 @@ static inline int netxen_nic_check_temp(struct netxen_adapter *adapter) | |||
1006 | "%s: Device temperature %d degrees C exceeds" | 1004 | "%s: Device temperature %d degrees C exceeds" |
1007 | " maximum allowed. Hardware has been shut down.\n", | 1005 | " maximum allowed. Hardware has been shut down.\n", |
1008 | netxen_nic_driver_name, temp_val); | 1006 | netxen_nic_driver_name, temp_val); |
1009 | for (port_num = 0; port_num < adapter->ahw.max_ports; | ||
1010 | port_num++) { | ||
1011 | port = adapter->port[port_num]; | ||
1012 | netdev = port->netdev; | ||
1013 | 1007 | ||
1014 | netif_carrier_off(netdev); | 1008 | netif_carrier_off(netdev); |
1015 | netif_stop_queue(netdev); | 1009 | netif_stop_queue(netdev); |
1016 | } | ||
1017 | rv = 1; | 1010 | rv = 1; |
1018 | } else if (temp_state == NX_TEMP_WARN) { | 1011 | } else if (temp_state == NX_TEMP_WARN) { |
1019 | if (adapter->temp == NX_TEMP_NORMAL) { | 1012 | if (adapter->temp == NX_TEMP_NORMAL) { |
@@ -1037,8 +1030,6 @@ static inline int netxen_nic_check_temp(struct netxen_adapter *adapter) | |||
1037 | 1030 | ||
1038 | void netxen_watchdog_task(struct work_struct *work) | 1031 | void netxen_watchdog_task(struct work_struct *work) |
1039 | { | 1032 | { |
1040 | int port_num; | ||
1041 | struct netxen_port *port; | ||
1042 | struct net_device *netdev; | 1033 | struct net_device *netdev; |
1043 | struct netxen_adapter *adapter = | 1034 | struct netxen_adapter *adapter = |
1044 | container_of(work, struct netxen_adapter, watchdog_task); | 1035 | container_of(work, struct netxen_adapter, watchdog_task); |
@@ -1046,20 +1037,16 @@ void netxen_watchdog_task(struct work_struct *work) | |||
1046 | if (netxen_nic_check_temp(adapter)) | 1037 | if (netxen_nic_check_temp(adapter)) |
1047 | return; | 1038 | return; |
1048 | 1039 | ||
1049 | for (port_num = 0; port_num < adapter->ahw.max_ports; port_num++) { | 1040 | netdev = adapter->netdev; |
1050 | port = adapter->port[port_num]; | 1041 | if ((netif_running(netdev)) && !netif_carrier_ok(netdev)) { |
1051 | netdev = port->netdev; | 1042 | printk(KERN_INFO "%s port %d, %s carrier is now ok\n", |
1052 | 1043 | netxen_nic_driver_name, adapter->portnum, netdev->name); | |
1053 | if ((netif_running(netdev)) && !netif_carrier_ok(netdev)) { | 1044 | netif_carrier_on(netdev); |
1054 | printk(KERN_INFO "%s port %d, %s carrier is now ok\n", | ||
1055 | netxen_nic_driver_name, port_num, netdev->name); | ||
1056 | netif_carrier_on(netdev); | ||
1057 | } | ||
1058 | |||
1059 | if (netif_queue_stopped(netdev)) | ||
1060 | netif_wake_queue(netdev); | ||
1061 | } | 1045 | } |
1062 | 1046 | ||
1047 | if (netif_queue_stopped(netdev)) | ||
1048 | netif_wake_queue(netdev); | ||
1049 | |||
1063 | if (adapter->handle_phy_intr) | 1050 | if (adapter->handle_phy_intr) |
1064 | adapter->handle_phy_intr(adapter); | 1051 | adapter->handle_phy_intr(adapter); |
1065 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | 1052 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); |
@@ -1074,9 +1061,8 @@ void | |||
1074 | netxen_process_rcv(struct netxen_adapter *adapter, int ctxid, | 1061 | netxen_process_rcv(struct netxen_adapter *adapter, int ctxid, |
1075 | struct status_desc *desc) | 1062 | struct status_desc *desc) |
1076 | { | 1063 | { |
1077 | struct netxen_port *port = adapter->port[netxen_get_sts_port(desc)]; | 1064 | struct pci_dev *pdev = adapter->pdev; |
1078 | struct pci_dev *pdev = port->pdev; | 1065 | struct net_device *netdev = adapter->netdev; |
1079 | struct net_device *netdev = port->netdev; | ||
1080 | int index = netxen_get_sts_refhandle(desc); | 1066 | int index = netxen_get_sts_refhandle(desc); |
1081 | struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctxid]); | 1067 | struct netxen_recv_context *recv_ctx = &(adapter->recv_ctx[ctxid]); |
1082 | struct netxen_rx_buffer *buffer; | 1068 | struct netxen_rx_buffer *buffer; |
@@ -1126,7 +1112,7 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid, | |||
1126 | skb = (struct sk_buff *)buffer->skb; | 1112 | skb = (struct sk_buff *)buffer->skb; |
1127 | 1113 | ||
1128 | if (likely(netxen_get_sts_status(desc) == STATUS_CKSUM_OK)) { | 1114 | if (likely(netxen_get_sts_status(desc) == STATUS_CKSUM_OK)) { |
1129 | port->stats.csummed++; | 1115 | adapter->stats.csummed++; |
1130 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 1116 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
1131 | } | 1117 | } |
1132 | if (desc_ctx == RCV_DESC_LRO_CTXID) { | 1118 | if (desc_ctx == RCV_DESC_LRO_CTXID) { |
@@ -1146,27 +1132,27 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid, | |||
1146 | */ | 1132 | */ |
1147 | switch (ret) { | 1133 | switch (ret) { |
1148 | case NET_RX_SUCCESS: | 1134 | case NET_RX_SUCCESS: |
1149 | port->stats.uphappy++; | 1135 | adapter->stats.uphappy++; |
1150 | break; | 1136 | break; |
1151 | 1137 | ||
1152 | case NET_RX_CN_LOW: | 1138 | case NET_RX_CN_LOW: |
1153 | port->stats.uplcong++; | 1139 | adapter->stats.uplcong++; |
1154 | break; | 1140 | break; |
1155 | 1141 | ||
1156 | case NET_RX_CN_MOD: | 1142 | case NET_RX_CN_MOD: |
1157 | port->stats.upmcong++; | 1143 | adapter->stats.upmcong++; |
1158 | break; | 1144 | break; |
1159 | 1145 | ||
1160 | case NET_RX_CN_HIGH: | 1146 | case NET_RX_CN_HIGH: |
1161 | port->stats.uphcong++; | 1147 | adapter->stats.uphcong++; |
1162 | break; | 1148 | break; |
1163 | 1149 | ||
1164 | case NET_RX_DROP: | 1150 | case NET_RX_DROP: |
1165 | port->stats.updropped++; | 1151 | adapter->stats.updropped++; |
1166 | break; | 1152 | break; |
1167 | 1153 | ||
1168 | default: | 1154 | default: |
1169 | port->stats.updunno++; | 1155 | adapter->stats.updunno++; |
1170 | break; | 1156 | break; |
1171 | } | 1157 | } |
1172 | 1158 | ||
@@ -1178,14 +1164,13 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid, | |||
1178 | /* | 1164 | /* |
1179 | * We just consumed one buffer so post a buffer. | 1165 | * We just consumed one buffer so post a buffer. |
1180 | */ | 1166 | */ |
1181 | adapter->stats.post_called++; | ||
1182 | buffer->skb = NULL; | 1167 | buffer->skb = NULL; |
1183 | buffer->state = NETXEN_BUFFER_FREE; | 1168 | buffer->state = NETXEN_BUFFER_FREE; |
1184 | buffer->lro_current_frags = 0; | 1169 | buffer->lro_current_frags = 0; |
1185 | buffer->lro_expected_frags = 0; | 1170 | buffer->lro_expected_frags = 0; |
1186 | 1171 | ||
1187 | port->stats.no_rcv++; | 1172 | adapter->stats.no_rcv++; |
1188 | port->stats.rxbytes += length; | 1173 | adapter->stats.rxbytes += length; |
1189 | } | 1174 | } |
1190 | 1175 | ||
1191 | /* Process Receive status ring */ | 1176 | /* Process Receive status ring */ |
@@ -1226,7 +1211,6 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max) | |||
1226 | 1211 | ||
1227 | /* update the consumer index in phantom */ | 1212 | /* update the consumer index in phantom */ |
1228 | if (count) { | 1213 | if (count) { |
1229 | adapter->stats.process_rcv++; | ||
1230 | recv_ctx->status_rx_consumer = consumer; | 1214 | recv_ctx->status_rx_consumer = consumer; |
1231 | recv_ctx->status_rx_producer = producer; | 1215 | recv_ctx->status_rx_producer = producer; |
1232 | 1216 | ||
@@ -1249,13 +1233,10 @@ int netxen_process_cmd_ring(unsigned long data) | |||
1249 | int count1 = 0; | 1233 | int count1 = 0; |
1250 | int count2 = 0; | 1234 | int count2 = 0; |
1251 | struct netxen_cmd_buffer *buffer; | 1235 | struct netxen_cmd_buffer *buffer; |
1252 | struct netxen_port *port; /* port #1 */ | ||
1253 | struct netxen_port *nport; | ||
1254 | struct pci_dev *pdev; | 1236 | struct pci_dev *pdev; |
1255 | struct netxen_skb_frag *frag; | 1237 | struct netxen_skb_frag *frag; |
1256 | u32 i; | 1238 | u32 i; |
1257 | struct sk_buff *skb = NULL; | 1239 | struct sk_buff *skb = NULL; |
1258 | int p; | ||
1259 | int done; | 1240 | int done; |
1260 | 1241 | ||
1261 | spin_lock(&adapter->tx_lock); | 1242 | spin_lock(&adapter->tx_lock); |
@@ -1276,7 +1257,6 @@ int netxen_process_cmd_ring(unsigned long data) | |||
1276 | } | 1257 | } |
1277 | 1258 | ||
1278 | adapter->proc_cmd_buf_counter++; | 1259 | adapter->proc_cmd_buf_counter++; |
1279 | adapter->stats.process_xmit++; | ||
1280 | /* | 1260 | /* |
1281 | * Not needed - does not seem to be used anywhere. | 1261 | * Not needed - does not seem to be used anywhere. |
1282 | * adapter->cmd_consumer = consumer; | 1262 | * adapter->cmd_consumer = consumer; |
@@ -1285,8 +1265,7 @@ int netxen_process_cmd_ring(unsigned long data) | |||
1285 | 1265 | ||
1286 | while ((last_consumer != consumer) && (count1 < MAX_STATUS_HANDLE)) { | 1266 | while ((last_consumer != consumer) && (count1 < MAX_STATUS_HANDLE)) { |
1287 | buffer = &adapter->cmd_buf_arr[last_consumer]; | 1267 | buffer = &adapter->cmd_buf_arr[last_consumer]; |
1288 | port = adapter->port[buffer->port]; | 1268 | pdev = adapter->pdev; |
1289 | pdev = port->pdev; | ||
1290 | frag = &buffer->frag_array[0]; | 1269 | frag = &buffer->frag_array[0]; |
1291 | skb = buffer->skb; | 1270 | skb = buffer->skb; |
1292 | if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) { | 1271 | if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) { |
@@ -1299,24 +1278,23 @@ int netxen_process_cmd_ring(unsigned long data) | |||
1299 | PCI_DMA_TODEVICE); | 1278 | PCI_DMA_TODEVICE); |
1300 | } | 1279 | } |
1301 | 1280 | ||
1302 | port->stats.skbfreed++; | 1281 | adapter->stats.skbfreed++; |
1303 | dev_kfree_skb_any(skb); | 1282 | dev_kfree_skb_any(skb); |
1304 | skb = NULL; | 1283 | skb = NULL; |
1305 | } else if (adapter->proc_cmd_buf_counter == 1) { | 1284 | } else if (adapter->proc_cmd_buf_counter == 1) { |
1306 | port->stats.txnullskb++; | 1285 | adapter->stats.txnullskb++; |
1307 | } | 1286 | } |
1308 | if (unlikely(netif_queue_stopped(port->netdev) | 1287 | if (unlikely(netif_queue_stopped(adapter->netdev) |
1309 | && netif_carrier_ok(port->netdev)) | 1288 | && netif_carrier_ok(adapter->netdev)) |
1310 | && ((jiffies - port->netdev->trans_start) > | 1289 | && ((jiffies - adapter->netdev->trans_start) > |
1311 | port->netdev->watchdog_timeo)) { | 1290 | adapter->netdev->watchdog_timeo)) { |
1312 | SCHEDULE_WORK(&port->tx_timeout_task); | 1291 | SCHEDULE_WORK(&adapter->tx_timeout_task); |
1313 | } | 1292 | } |
1314 | 1293 | ||
1315 | last_consumer = get_next_index(last_consumer, | 1294 | last_consumer = get_next_index(last_consumer, |
1316 | adapter->max_tx_desc_count); | 1295 | adapter->max_tx_desc_count); |
1317 | count1++; | 1296 | count1++; |
1318 | } | 1297 | } |
1319 | adapter->stats.noxmitdone += count1; | ||
1320 | 1298 | ||
1321 | count2 = 0; | 1299 | count2 = 0; |
1322 | spin_lock(&adapter->tx_lock); | 1300 | spin_lock(&adapter->tx_lock); |
@@ -1336,13 +1314,10 @@ int netxen_process_cmd_ring(unsigned long data) | |||
1336 | } | 1314 | } |
1337 | } | 1315 | } |
1338 | if (count1 || count2) { | 1316 | if (count1 || count2) { |
1339 | for (p = 0; p < adapter->ahw.max_ports; p++) { | 1317 | if (netif_queue_stopped(adapter->netdev) |
1340 | nport = adapter->port[p]; | 1318 | && (adapter->flags & NETXEN_NETDEV_STATUS)) { |
1341 | if (netif_queue_stopped(nport->netdev) | 1319 | netif_wake_queue(adapter->netdev); |
1342 | && (nport->flags & NETXEN_NETDEV_STATUS)) { | 1320 | adapter->flags &= ~NETXEN_NETDEV_STATUS; |
1343 | netif_wake_queue(nport->netdev); | ||
1344 | nport->flags &= ~NETXEN_NETDEV_STATUS; | ||
1345 | } | ||
1346 | } | 1321 | } |
1347 | } | 1322 | } |
1348 | /* | 1323 | /* |
@@ -1388,7 +1363,6 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid) | |||
1388 | netxen_ctx_msg msg = 0; | 1363 | netxen_ctx_msg msg = 0; |
1389 | dma_addr_t dma; | 1364 | dma_addr_t dma; |
1390 | 1365 | ||
1391 | adapter->stats.post_called++; | ||
1392 | rcv_desc = &recv_ctx->rcv_desc[ringid]; | 1366 | rcv_desc = &recv_ctx->rcv_desc[ringid]; |
1393 | 1367 | ||
1394 | producer = rcv_desc->producer; | 1368 | producer = rcv_desc->producer; |
@@ -1441,8 +1415,6 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid) | |||
1441 | if (count) { | 1415 | if (count) { |
1442 | rcv_desc->begin_alloc = index; | 1416 | rcv_desc->begin_alloc = index; |
1443 | rcv_desc->rcv_pending += count; | 1417 | rcv_desc->rcv_pending += count; |
1444 | adapter->stats.lastposted = count; | ||
1445 | adapter->stats.posted += count; | ||
1446 | rcv_desc->producer = producer; | 1418 | rcv_desc->producer = producer; |
1447 | if (rcv_desc->rcv_free >= 32) { | 1419 | if (rcv_desc->rcv_free >= 32) { |
1448 | rcv_desc->rcv_free = 0; | 1420 | rcv_desc->rcv_free = 0; |
@@ -1450,7 +1422,8 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid) | |||
1450 | writel((producer - 1) & | 1422 | writel((producer - 1) & |
1451 | (rcv_desc->max_rx_desc_count - 1), | 1423 | (rcv_desc->max_rx_desc_count - 1), |
1452 | NETXEN_CRB_NORMALIZE(adapter, | 1424 | NETXEN_CRB_NORMALIZE(adapter, |
1453 | recv_crb_registers[0]. | 1425 | recv_crb_registers[ |
1426 | adapter->portnum]. | ||
1454 | rcv_desc_crb[ringid]. | 1427 | rcv_desc_crb[ringid]. |
1455 | crb_rcv_producer_offset)); | 1428 | crb_rcv_producer_offset)); |
1456 | /* | 1429 | /* |
@@ -1463,7 +1436,7 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid) | |||
1463 | ((producer - | 1436 | ((producer - |
1464 | 1) & (rcv_desc-> | 1437 | 1) & (rcv_desc-> |
1465 | max_rx_desc_count - 1))); | 1438 | max_rx_desc_count - 1))); |
1466 | netxen_set_msg_ctxid(msg, 0); | 1439 | netxen_set_msg_ctxid(msg, adapter->portnum); |
1467 | netxen_set_msg_opcode(msg, NETXEN_RCV_PRODUCER(ringid)); | 1440 | netxen_set_msg_opcode(msg, NETXEN_RCV_PRODUCER(ringid)); |
1468 | writel(msg, | 1441 | writel(msg, |
1469 | DB_NORMALIZE(adapter, | 1442 | DB_NORMALIZE(adapter, |
@@ -1485,7 +1458,6 @@ void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, uint32_t ctx, | |||
1485 | int count = 0; | 1458 | int count = 0; |
1486 | int index = 0; | 1459 | int index = 0; |
1487 | 1460 | ||
1488 | adapter->stats.post_called++; | ||
1489 | rcv_desc = &recv_ctx->rcv_desc[ringid]; | 1461 | rcv_desc = &recv_ctx->rcv_desc[ringid]; |
1490 | 1462 | ||
1491 | producer = rcv_desc->producer; | 1463 | producer = rcv_desc->producer; |
@@ -1532,8 +1504,6 @@ void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, uint32_t ctx, | |||
1532 | if (count) { | 1504 | if (count) { |
1533 | rcv_desc->begin_alloc = index; | 1505 | rcv_desc->begin_alloc = index; |
1534 | rcv_desc->rcv_pending += count; | 1506 | rcv_desc->rcv_pending += count; |
1535 | adapter->stats.lastposted = count; | ||
1536 | adapter->stats.posted += count; | ||
1537 | rcv_desc->producer = producer; | 1507 | rcv_desc->producer = producer; |
1538 | if (rcv_desc->rcv_free >= 32) { | 1508 | if (rcv_desc->rcv_free >= 32) { |
1539 | rcv_desc->rcv_free = 0; | 1509 | rcv_desc->rcv_free = 0; |
@@ -1541,7 +1511,8 @@ void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, uint32_t ctx, | |||
1541 | writel((producer - 1) & | 1511 | writel((producer - 1) & |
1542 | (rcv_desc->max_rx_desc_count - 1), | 1512 | (rcv_desc->max_rx_desc_count - 1), |
1543 | NETXEN_CRB_NORMALIZE(adapter, | 1513 | NETXEN_CRB_NORMALIZE(adapter, |
1544 | recv_crb_registers[0]. | 1514 | recv_crb_registers[ |
1515 | adapter->portnum]. | ||
1545 | rcv_desc_crb[ringid]. | 1516 | rcv_desc_crb[ringid]. |
1546 | crb_rcv_producer_offset)); | 1517 | crb_rcv_producer_offset)); |
1547 | wmb(); | 1518 | wmb(); |
@@ -1562,13 +1533,7 @@ int netxen_nic_tx_has_work(struct netxen_adapter *adapter) | |||
1562 | 1533 | ||
1563 | void netxen_nic_clear_stats(struct netxen_adapter *adapter) | 1534 | void netxen_nic_clear_stats(struct netxen_adapter *adapter) |
1564 | { | 1535 | { |
1565 | struct netxen_port *port; | ||
1566 | int port_num; | ||
1567 | |||
1568 | memset(&adapter->stats, 0, sizeof(adapter->stats)); | 1536 | memset(&adapter->stats, 0, sizeof(adapter->stats)); |
1569 | for (port_num = 0; port_num < adapter->ahw.max_ports; port_num++) { | 1537 | return; |
1570 | port = adapter->port[port_num]; | ||
1571 | memset(&port->stats, 0, sizeof(port->stats)); | ||
1572 | } | ||
1573 | } | 1538 | } |
1574 | 1539 | ||
diff --git a/drivers/net/netxen/netxen_nic_isr.c b/drivers/net/netxen/netxen_nic_isr.c index be366e48007..f60c9699191 100644 --- a/drivers/net/netxen/netxen_nic_isr.c +++ b/drivers/net/netxen/netxen_nic_isr.c | |||
@@ -6,12 +6,12 @@ | |||
6 | * modify it under the terms of the GNU General Public License | 6 | * modify it under the terms of the GNU General Public License |
7 | * as published by the Free Software Foundation; either version 2 | 7 | * as published by the Free Software Foundation; either version 2 |
8 | * of the License, or (at your option) any later version. | 8 | * of the License, or (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, but | 10 | * This program is distributed in the hope that it will be useful, but |
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, | 17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, |
@@ -34,6 +34,7 @@ | |||
34 | #include "netxen_nic_hw.h" | 34 | #include "netxen_nic_hw.h" |
35 | #include "netxen_nic_phan_reg.h" | 35 | #include "netxen_nic_phan_reg.h" |
36 | 36 | ||
37 | #if 0 | ||
37 | /* | 38 | /* |
38 | * netxen_nic_get_stats - Get System Network Statistics | 39 | * netxen_nic_get_stats - Get System Network Statistics |
39 | * @netdev: network interface device structure | 40 | * @netdev: network interface device structure |
@@ -41,7 +42,7 @@ | |||
41 | struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev) | 42 | struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev) |
42 | { | 43 | { |
43 | struct netxen_port *port = netdev_priv(netdev); | 44 | struct netxen_port *port = netdev_priv(netdev); |
44 | struct net_device_stats *stats = &port->net_stats; | 45 | struct net_device_stats *stats = &adapter->net_stats; |
45 | 46 | ||
46 | memset(stats, 0, sizeof(*stats)); | 47 | memset(stats, 0, sizeof(*stats)); |
47 | 48 | ||
@@ -64,11 +65,10 @@ struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev) | |||
64 | 65 | ||
65 | return stats; | 66 | return stats; |
66 | } | 67 | } |
67 | 68 | #endif | |
68 | void netxen_indicate_link_status(struct netxen_adapter *adapter, u32 portno, | 69 | void netxen_indicate_link_status(struct netxen_adapter *adapter, u32 link) |
69 | u32 link) | ||
70 | { | 70 | { |
71 | struct net_device *netdev = (adapter->port[portno])->netdev; | 71 | struct net_device *netdev = adapter->netdev; |
72 | 72 | ||
73 | if (link) | 73 | if (link) |
74 | netif_carrier_on(netdev); | 74 | netif_carrier_on(netdev); |
@@ -76,15 +76,13 @@ void netxen_indicate_link_status(struct netxen_adapter *adapter, u32 portno, | |||
76 | netif_carrier_off(netdev); | 76 | netif_carrier_off(netdev); |
77 | } | 77 | } |
78 | 78 | ||
79 | void netxen_handle_port_int(struct netxen_adapter *adapter, u32 portno, | 79 | void netxen_handle_port_int(struct netxen_adapter *adapter, u32 enable) |
80 | u32 enable) | ||
81 | { | 80 | { |
82 | __u32 int_src; | 81 | __u32 int_src; |
83 | struct netxen_port *port; | ||
84 | 82 | ||
85 | /* This should clear the interrupt source */ | 83 | /* This should clear the interrupt source */ |
86 | if (adapter->phy_read) | 84 | if (adapter->phy_read) |
87 | adapter->phy_read(adapter, portno, | 85 | adapter->phy_read(adapter, adapter->portnum, |
88 | NETXEN_NIU_GB_MII_MGMT_ADDR_INT_STATUS, | 86 | NETXEN_NIU_GB_MII_MGMT_ADDR_INT_STATUS, |
89 | &int_src); | 87 | &int_src); |
90 | if (int_src == 0) { | 88 | if (int_src == 0) { |
@@ -92,9 +90,7 @@ void netxen_handle_port_int(struct netxen_adapter *adapter, u32 portno, | |||
92 | return; | 90 | return; |
93 | } | 91 | } |
94 | if (adapter->disable_phy_interrupts) | 92 | if (adapter->disable_phy_interrupts) |
95 | adapter->disable_phy_interrupts(adapter, portno); | 93 | adapter->disable_phy_interrupts(adapter, adapter->portnum); |
96 | |||
97 | port = adapter->port[portno]; | ||
98 | 94 | ||
99 | if (netxen_get_phy_int_jabber(int_src)) | 95 | if (netxen_get_phy_int_jabber(int_src)) |
100 | DPRINTK(INFO, "Jabber interrupt \n"); | 96 | DPRINTK(INFO, "Jabber interrupt \n"); |
@@ -115,64 +111,60 @@ void netxen_handle_port_int(struct netxen_adapter *adapter, u32 portno, | |||
115 | DPRINTK(INFO, "SPEED CHANGED OR LINK STATUS CHANGED \n"); | 111 | DPRINTK(INFO, "SPEED CHANGED OR LINK STATUS CHANGED \n"); |
116 | 112 | ||
117 | if (adapter->phy_read | 113 | if (adapter->phy_read |
118 | && adapter->phy_read(adapter, portno, | 114 | && adapter->phy_read(adapter, adapter->portnum, |
119 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, | 115 | NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, |
120 | &status) == 0) { | 116 | &status) == 0) { |
121 | if (netxen_get_phy_int_link_status_changed(int_src)) { | 117 | if (netxen_get_phy_int_link_status_changed(int_src)) { |
122 | if (netxen_get_phy_link(status)) { | 118 | if (netxen_get_phy_link(status)) { |
123 | netxen_niu_gbe_init_port(adapter, | 119 | netxen_niu_gbe_init_port( |
124 | portno); | 120 | adapter, |
125 | printk("%s: %s Link UP\n", | 121 | adapter->portnum); |
122 | printk(KERN_INFO "%s: %s Link UP\n", | ||
126 | netxen_nic_driver_name, | 123 | netxen_nic_driver_name, |
127 | port->netdev->name); | 124 | adapter->netdev->name); |
128 | 125 | ||
129 | } else { | 126 | } else { |
130 | printk("%s: %s Link DOWN\n", | 127 | printk(KERN_INFO "%s: %s Link DOWN\n", |
131 | netxen_nic_driver_name, | 128 | netxen_nic_driver_name, |
132 | port->netdev->name); | 129 | adapter->netdev->name); |
133 | } | 130 | } |
134 | netxen_indicate_link_status(adapter, portno, | 131 | netxen_indicate_link_status(adapter, |
135 | netxen_get_phy_link | 132 | netxen_get_phy_link |
136 | (status)); | 133 | (status)); |
137 | } | 134 | } |
138 | } | 135 | } |
139 | } | 136 | } |
140 | if (adapter->enable_phy_interrupts) | 137 | if (adapter->enable_phy_interrupts) |
141 | adapter->enable_phy_interrupts(adapter, portno); | 138 | adapter->enable_phy_interrupts(adapter, adapter->portnum); |
142 | } | 139 | } |
143 | 140 | ||
144 | void netxen_nic_isr_other(struct netxen_adapter *adapter) | 141 | void netxen_nic_isr_other(struct netxen_adapter *adapter) |
145 | { | 142 | { |
146 | u32 portno; | 143 | int portno = adapter->portnum; |
147 | u32 val, linkup, qg_linksup; | 144 | u32 val, linkup, qg_linksup; |
148 | 145 | ||
149 | /* verify the offset */ | 146 | /* verify the offset */ |
150 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); | 147 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); |
148 | val = val >> adapter->portnum; | ||
151 | if (val == adapter->ahw.qg_linksup) | 149 | if (val == adapter->ahw.qg_linksup) |
152 | return; | 150 | return; |
153 | 151 | ||
154 | qg_linksup = adapter->ahw.qg_linksup; | 152 | qg_linksup = adapter->ahw.qg_linksup; |
155 | adapter->ahw.qg_linksup = val; | 153 | adapter->ahw.qg_linksup = val; |
156 | DPRINTK(INFO, "link update 0x%08x\n", val); | 154 | DPRINTK(INFO, "link update 0x%08x\n", val); |
157 | for (portno = 0; portno < NETXEN_NIU_MAX_GBE_PORTS; portno++) { | ||
158 | linkup = val & 1; | ||
159 | if (linkup != (qg_linksup & 1)) { | ||
160 | printk(KERN_INFO "%s: %s PORT %d link %s\n", | ||
161 | adapter->port[portno]->netdev->name, | ||
162 | netxen_nic_driver_name, portno, | ||
163 | ((linkup == 0) ? "down" : "up")); | ||
164 | netxen_indicate_link_status(adapter, portno, linkup); | ||
165 | if (linkup) | ||
166 | netxen_nic_set_link_parameters(adapter-> | ||
167 | port[portno]); | ||
168 | 155 | ||
169 | } | 156 | linkup = val & 1; |
170 | val = val >> 1; | ||
171 | qg_linksup = qg_linksup >> 1; | ||
172 | } | ||
173 | 157 | ||
174 | adapter->stats.otherints++; | 158 | if (linkup != (qg_linksup & 1)) { |
159 | printk(KERN_INFO "%s: %s PORT %d link %s\n", | ||
160 | adapter->netdev->name, | ||
161 | netxen_nic_driver_name, portno, | ||
162 | ((linkup == 0) ? "down" : "up")); | ||
163 | netxen_indicate_link_status(adapter, linkup); | ||
164 | if (linkup) | ||
165 | netxen_nic_set_link_parameters(adapter); | ||
175 | 166 | ||
167 | } | ||
176 | } | 168 | } |
177 | 169 | ||
178 | void netxen_nic_gbe_handle_phy_intr(struct netxen_adapter *adapter) | 170 | void netxen_nic_gbe_handle_phy_intr(struct netxen_adapter *adapter) |
@@ -182,26 +174,27 @@ void netxen_nic_gbe_handle_phy_intr(struct netxen_adapter *adapter) | |||
182 | 174 | ||
183 | void netxen_nic_xgbe_handle_phy_intr(struct netxen_adapter *adapter) | 175 | void netxen_nic_xgbe_handle_phy_intr(struct netxen_adapter *adapter) |
184 | { | 176 | { |
185 | struct net_device *netdev = adapter->port[0]->netdev; | 177 | struct net_device *netdev = adapter->netdev; |
186 | u32 val; | 178 | u32 val, val1; |
187 | 179 | ||
188 | /* WINDOW = 1 */ | 180 | /* WINDOW = 1 */ |
189 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); | 181 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE)); |
182 | val1 = val & 0xff; | ||
190 | 183 | ||
191 | if (adapter->ahw.xg_linkup == 1 && val != XG_LINK_UP) { | 184 | if (adapter->ahw.xg_linkup == 1 && val1 != XG_LINK_UP) { |
192 | printk(KERN_INFO "%s: %s NIC Link is down\n", | 185 | printk(KERN_INFO "%s: %s NIC Link is down\n", |
193 | netxen_nic_driver_name, netdev->name); | 186 | netxen_nic_driver_name, netdev->name); |
194 | adapter->ahw.xg_linkup = 0; | 187 | adapter->ahw.xg_linkup = 0; |
195 | /* read twice to clear sticky bits */ | 188 | /* read twice to clear sticky bits */ |
196 | /* WINDOW = 0 */ | 189 | /* WINDOW = 0 */ |
197 | netxen_nic_read_w0(adapter, NETXEN_NIU_XG_STATUS, &val); | 190 | netxen_nic_read_w0(adapter, NETXEN_NIU_XG_STATUS, &val1); |
198 | netxen_nic_read_w0(adapter, NETXEN_NIU_XG_STATUS, &val); | 191 | netxen_nic_read_w0(adapter, NETXEN_NIU_XG_STATUS, &val1); |
199 | 192 | ||
200 | if ((val & 0xffb) != 0xffb) { | 193 | if ((val & 0xffb) != 0xffb) { |
201 | printk(KERN_INFO "%s ISR: Sync/Align BAD: 0x%08x\n", | 194 | printk(KERN_INFO "%s ISR: Sync/Align BAD: 0x%08x\n", |
202 | netxen_nic_driver_name, val); | 195 | netxen_nic_driver_name, val1); |
203 | } | 196 | } |
204 | } else if (adapter->ahw.xg_linkup == 0 && val == XG_LINK_UP) { | 197 | } else if (adapter->ahw.xg_linkup == 0 && val1 == XG_LINK_UP) { |
205 | printk(KERN_INFO "%s: %s NIC Link is up\n", | 198 | printk(KERN_INFO "%s: %s NIC Link is up\n", |
206 | netxen_nic_driver_name, netdev->name); | 199 | netxen_nic_driver_name, netdev->name); |
207 | adapter->ahw.xg_linkup = 1; | 200 | adapter->ahw.xg_linkup = 1; |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index ab25c225a07..514cb393f48 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -36,7 +36,6 @@ | |||
36 | #include "netxen_nic_hw.h" | 36 | #include "netxen_nic_hw.h" |
37 | 37 | ||
38 | #include "netxen_nic.h" | 38 | #include "netxen_nic.h" |
39 | #define DEFINE_GLOBAL_RECV_CRB | ||
40 | #include "netxen_nic_phan_reg.h" | 39 | #include "netxen_nic_phan_reg.h" |
41 | 40 | ||
42 | #include <linux/dma-mapping.h> | 41 | #include <linux/dma-mapping.h> |
@@ -94,6 +93,67 @@ MODULE_DEVICE_TABLE(pci, netxen_pci_tbl); | |||
94 | struct workqueue_struct *netxen_workq; | 93 | struct workqueue_struct *netxen_workq; |
95 | static void netxen_watchdog(unsigned long); | 94 | static void netxen_watchdog(unsigned long); |
96 | 95 | ||
96 | static inline void netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, | ||
97 | uint32_t crb_producer) | ||
98 | { | ||
99 | switch (adapter->portnum) { | ||
100 | case 0: | ||
101 | writel(crb_producer, NETXEN_CRB_NORMALIZE | ||
102 | (adapter, CRB_CMD_PRODUCER_OFFSET)); | ||
103 | return; | ||
104 | case 1: | ||
105 | writel(crb_producer, NETXEN_CRB_NORMALIZE | ||
106 | (adapter, CRB_CMD_PRODUCER_OFFSET_1)); | ||
107 | return; | ||
108 | case 2: | ||
109 | writel(crb_producer, NETXEN_CRB_NORMALIZE | ||
110 | (adapter, CRB_CMD_PRODUCER_OFFSET_2)); | ||
111 | return; | ||
112 | case 3: | ||
113 | writel(crb_producer, NETXEN_CRB_NORMALIZE | ||
114 | (adapter, CRB_CMD_PRODUCER_OFFSET_3)); | ||
115 | return; | ||
116 | default: | ||
117 | printk(KERN_WARNING "We tried to update " | ||
118 | "CRB_CMD_PRODUCER_OFFSET for invalid " | ||
119 | "PCI function id %d\n", | ||
120 | adapter->portnum); | ||
121 | return; | ||
122 | } | ||
123 | } | ||
124 | |||
125 | static inline void netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter, | ||
126 | u32 crb_consumer) | ||
127 | { | ||
128 | switch (adapter->portnum) { | ||
129 | case 0: | ||
130 | writel(crb_consumer, NETXEN_CRB_NORMALIZE | ||
131 | (adapter, CRB_CMD_CONSUMER_OFFSET)); | ||
132 | return; | ||
133 | case 1: | ||
134 | writel(crb_consumer, NETXEN_CRB_NORMALIZE | ||
135 | (adapter, CRB_CMD_CONSUMER_OFFSET_1)); | ||
136 | return; | ||
137 | case 2: | ||
138 | writel(crb_consumer, NETXEN_CRB_NORMALIZE | ||
139 | (adapter, CRB_CMD_CONSUMER_OFFSET_2)); | ||
140 | return; | ||
141 | case 3: | ||
142 | writel(crb_consumer, NETXEN_CRB_NORMALIZE | ||
143 | (adapter, CRB_CMD_CONSUMER_OFFSET_3)); | ||
144 | return; | ||
145 | default: | ||
146 | printk(KERN_WARNING "We tried to update " | ||
147 | "CRB_CMD_PRODUCER_OFFSET for invalid " | ||
148 | "PCI function id %d\n", | ||
149 | adapter->portnum); | ||
150 | return; | ||
151 | } | ||
152 | } | ||
153 | |||
154 | #define ADAPTER_LIST_SIZE 12 | ||
155 | int netxen_cards_found; | ||
156 | |||
97 | /* | 157 | /* |
98 | * netxen_nic_probe() | 158 | * netxen_nic_probe() |
99 | * | 159 | * |
@@ -111,26 +171,26 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
111 | { | 171 | { |
112 | struct net_device *netdev = NULL; | 172 | struct net_device *netdev = NULL; |
113 | struct netxen_adapter *adapter = NULL; | 173 | struct netxen_adapter *adapter = NULL; |
114 | struct netxen_port *port = NULL; | ||
115 | void __iomem *mem_ptr0 = NULL; | 174 | void __iomem *mem_ptr0 = NULL; |
116 | void __iomem *mem_ptr1 = NULL; | 175 | void __iomem *mem_ptr1 = NULL; |
117 | void __iomem *mem_ptr2 = NULL; | 176 | void __iomem *mem_ptr2 = NULL; |
118 | 177 | ||
119 | u8 __iomem *db_ptr = NULL; | 178 | u8 __iomem *db_ptr = NULL; |
120 | unsigned long mem_base, mem_len, db_base, db_len; | 179 | unsigned long mem_base, mem_len, db_base, db_len; |
121 | int pci_using_dac, i, err; | 180 | int pci_using_dac, i = 0, err; |
122 | int ring; | 181 | int ring; |
123 | struct netxen_recv_context *recv_ctx = NULL; | 182 | struct netxen_recv_context *recv_ctx = NULL; |
124 | struct netxen_rcv_desc_ctx *rcv_desc = NULL; | 183 | struct netxen_rcv_desc_ctx *rcv_desc = NULL; |
125 | struct netxen_cmd_buffer *cmd_buf_arr = NULL; | 184 | struct netxen_cmd_buffer *cmd_buf_arr = NULL; |
126 | u64 mac_addr[FLASH_NUM_PORTS + 1]; | 185 | u64 mac_addr[FLASH_NUM_PORTS + 1]; |
127 | int valid_mac = 0; | 186 | static int valid_mac = 0; |
187 | static int netxen_probe_flag; | ||
188 | int pci_func_id = PCI_FUNC(pdev->devfn); | ||
128 | 189 | ||
129 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); | 190 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); |
130 | /* In current scheme, we use only PCI function 0 */ | 191 | if (pdev->class != 0x020000) { |
131 | if (PCI_FUNC(pdev->devfn) != 0) { | 192 | printk(KERN_ERR"NetXen function %d, class %x will not" |
132 | DPRINTK(ERR, "NetXen function %d will not be enabled.\n", | 193 | "be enabled.\n",pci_func_id, pdev->class); |
133 | PCI_FUNC(pdev->devfn)); | ||
134 | return -ENODEV; | 194 | return -ENODEV; |
135 | } | 195 | } |
136 | if ((err = pci_enable_device(pdev))) | 196 | if ((err = pci_enable_device(pdev))) |
@@ -157,6 +217,22 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
157 | pci_using_dac = 0; | 217 | pci_using_dac = 0; |
158 | } | 218 | } |
159 | 219 | ||
220 | |||
221 | netdev = alloc_etherdev(sizeof(struct netxen_adapter)); | ||
222 | if(!netdev) { | ||
223 | printk(KERN_ERR"%s: Failed to allocate memory for the " | ||
224 | "device block.Check system memory resource" | ||
225 | " usage.\n", netxen_nic_driver_name); | ||
226 | goto err_out_free_res; | ||
227 | } | ||
228 | |||
229 | SET_MODULE_OWNER(netdev); | ||
230 | SET_NETDEV_DEV(netdev, &pdev->dev); | ||
231 | |||
232 | adapter = netdev->priv; | ||
233 | memset(adapter, 0 , sizeof(struct netxen_adapter)); | ||
234 | |||
235 | adapter->ahw.pdev = pdev; | ||
160 | /* remap phys address */ | 236 | /* remap phys address */ |
161 | mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */ | 237 | mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */ |
162 | mem_len = pci_resource_len(pdev, 0); | 238 | mem_len = pci_resource_len(pdev, 0); |
@@ -198,23 +274,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
198 | } | 274 | } |
199 | DPRINTK(INFO, "doorbell ioremaped at %p\n", db_ptr); | 275 | DPRINTK(INFO, "doorbell ioremaped at %p\n", db_ptr); |
200 | 276 | ||
201 | /* | ||
202 | * Allocate a adapter structure which will manage all the initialization | ||
203 | * as well as the common resources for all ports... | ||
204 | * all the ports will have pointer to this adapter as well as Adapter | ||
205 | * will have pointers of all the ports structures. | ||
206 | */ | ||
207 | |||
208 | /* One adapter structure for all 4 ports.... */ | ||
209 | adapter = kzalloc(sizeof(struct netxen_adapter), GFP_KERNEL); | ||
210 | if (adapter == NULL) { | ||
211 | printk(KERN_ERR "%s: Could not allocate adapter memory:%d\n", | ||
212 | netxen_nic_driver_name, | ||
213 | (int)sizeof(struct netxen_adapter)); | ||
214 | err = -ENOMEM; | ||
215 | goto err_out_dbunmap; | ||
216 | } | ||
217 | |||
218 | adapter->max_tx_desc_count = MAX_CMD_DESCRIPTORS; | 277 | adapter->max_tx_desc_count = MAX_CMD_DESCRIPTORS; |
219 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS; | 278 | adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS; |
220 | adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS; | 279 | adapter->max_jumbo_rx_desc_count = MAX_JUMBO_RCV_DESCRIPTORS; |
@@ -222,6 +281,42 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
222 | 281 | ||
223 | pci_set_drvdata(pdev, adapter); | 282 | pci_set_drvdata(pdev, adapter); |
224 | 283 | ||
284 | adapter->netdev = netdev; | ||
285 | adapter->pdev = pdev; | ||
286 | adapter->portnum = pci_func_id; | ||
287 | |||
288 | netdev->open = netxen_nic_open; | ||
289 | netdev->stop = netxen_nic_close; | ||
290 | netdev->hard_start_xmit = netxen_nic_xmit_frame; | ||
291 | netdev->set_multicast_list = netxen_nic_set_multi; | ||
292 | netdev->set_mac_address = netxen_nic_set_mac; | ||
293 | netdev->change_mtu = netxen_nic_change_mtu; | ||
294 | netdev->tx_timeout = netxen_tx_timeout; | ||
295 | netdev->watchdog_timeo = HZ; | ||
296 | |||
297 | netxen_nic_change_mtu(netdev, netdev->mtu); | ||
298 | |||
299 | SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops); | ||
300 | netdev->poll = netxen_nic_poll; | ||
301 | netdev->weight = NETXEN_NETDEV_WEIGHT; | ||
302 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
303 | netdev->poll_controller = netxen_nic_poll_controller; | ||
304 | #endif | ||
305 | /* ScatterGather support */ | ||
306 | netdev->features = NETIF_F_SG; | ||
307 | netdev->features |= NETIF_F_IP_CSUM; | ||
308 | netdev->features |= NETIF_F_TSO; | ||
309 | |||
310 | if (pci_using_dac) | ||
311 | netdev->features |= NETIF_F_HIGHDMA; | ||
312 | |||
313 | if (pci_enable_msi(pdev)) { | ||
314 | adapter->flags &= ~NETXEN_NIC_MSI_ENABLED; | ||
315 | printk(KERN_WARNING "%s: unable to allocate MSI interrupt" | ||
316 | " error\n", netxen_nic_driver_name); | ||
317 | } else | ||
318 | adapter->flags |= NETXEN_NIC_MSI_ENABLED; | ||
319 | |||
225 | cmd_buf_arr = (struct netxen_cmd_buffer *)vmalloc(TX_RINGSIZE); | 320 | cmd_buf_arr = (struct netxen_cmd_buffer *)vmalloc(TX_RINGSIZE); |
226 | if (cmd_buf_arr == NULL) { | 321 | if (cmd_buf_arr == NULL) { |
227 | printk(KERN_ERR | 322 | printk(KERN_ERR |
@@ -288,9 +383,11 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
288 | spin_lock_init(&adapter->lock); | 383 | spin_lock_init(&adapter->lock); |
289 | netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */ | 384 | netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */ |
290 | #ifdef CONFIG_IA64 | 385 | #ifdef CONFIG_IA64 |
291 | netxen_pinit_from_rom(adapter, 0); | 386 | if(netxen_probe_flag == 0) { |
292 | udelay(500); | 387 | netxen_pinit_from_rom(adapter, 0); |
293 | netxen_load_firmware(adapter); | 388 | udelay(500); |
389 | netxen_load_firmware(adapter); | ||
390 | } | ||
294 | #endif | 391 | #endif |
295 | 392 | ||
296 | /* | 393 | /* |
@@ -304,6 +401,10 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
304 | */ | 401 | */ |
305 | netxen_initialize_adapter_hw(adapter); /* initialize the adapter */ | 402 | netxen_initialize_adapter_hw(adapter); /* initialize the adapter */ |
306 | 403 | ||
404 | if (adapter->ahw.boardcfg.board_type == NETXEN_BRDTYPE_P2_SB31_10G_IMEZ) | ||
405 | if (pci_func_id >= 2) | ||
406 | adapter->portnum = pci_func_id - 2; | ||
407 | |||
307 | netxen_initialize_adapter_ops(adapter); | 408 | netxen_initialize_adapter_ops(adapter); |
308 | 409 | ||
309 | init_timer(&adapter->watchdog_timer); | 410 | init_timer(&adapter->watchdog_timer); |
@@ -315,12 +416,8 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
315 | adapter->proc_cmd_buf_counter = 0; | 416 | adapter->proc_cmd_buf_counter = 0; |
316 | adapter->ahw.revision_id = nx_p2_id; | 417 | adapter->ahw.revision_id = nx_p2_id; |
317 | 418 | ||
318 | if (pci_enable_msi(pdev)) { | 419 | netxen_nic_update_cmd_producer(adapter, 0); |
319 | adapter->flags &= ~NETXEN_NIC_MSI_ENABLED; | 420 | netxen_nic_update_cmd_consumer(adapter, 0); |
320 | printk(KERN_WARNING "%s: unable to allocate MSI interrupt" | ||
321 | " error\n", netxen_nic_driver_name); | ||
322 | } else | ||
323 | adapter->flags |= NETXEN_NIC_MSI_ENABLED; | ||
324 | 421 | ||
325 | if (netxen_is_flash_supported(adapter) == 0 && | 422 | if (netxen_is_flash_supported(adapter) == 0 && |
326 | netxen_get_flash_mac_addr(adapter, mac_addr) == 0) | 423 | netxen_get_flash_mac_addr(adapter, mac_addr) == 0) |
@@ -328,6 +425,34 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
328 | else | 425 | else |
329 | valid_mac = 0; | 426 | valid_mac = 0; |
330 | 427 | ||
428 | if (valid_mac) { | ||
429 | unsigned char *p = (unsigned char *)&mac_addr[i]; | ||
430 | netdev->dev_addr[0] = *(p + 5); | ||
431 | netdev->dev_addr[1] = *(p + 4); | ||
432 | netdev->dev_addr[2] = *(p + 3); | ||
433 | netdev->dev_addr[3] = *(p + 2); | ||
434 | netdev->dev_addr[4] = *(p + 1); | ||
435 | netdev->dev_addr[5] = *(p + 0); | ||
436 | |||
437 | memcpy(netdev->perm_addr, netdev->dev_addr, | ||
438 | netdev->addr_len); | ||
439 | if (!is_valid_ether_addr(netdev->perm_addr)) { | ||
440 | printk(KERN_ERR "%s: Bad MAC address " | ||
441 | "%02x:%02x:%02x:%02x:%02x:%02x.\n", | ||
442 | netxen_nic_driver_name, | ||
443 | netdev->dev_addr[0], | ||
444 | netdev->dev_addr[1], | ||
445 | netdev->dev_addr[2], | ||
446 | netdev->dev_addr[3], | ||
447 | netdev->dev_addr[4], | ||
448 | netdev->dev_addr[5]); | ||
449 | } else { | ||
450 | if (adapter->macaddr_set) | ||
451 | adapter->macaddr_set(adapter, | ||
452 | netdev->dev_addr); | ||
453 | } | ||
454 | } | ||
455 | |||
331 | /* | 456 | /* |
332 | * Initialize all the CRB registers here. | 457 | * Initialize all the CRB registers here. |
333 | */ | 458 | */ |
@@ -337,140 +462,62 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
337 | 462 | ||
338 | /* do this before waking up pegs so that we have valid dummy dma addr */ | 463 | /* do this before waking up pegs so that we have valid dummy dma addr */ |
339 | err = netxen_initialize_adapter_offload(adapter); | 464 | err = netxen_initialize_adapter_offload(adapter); |
340 | if (err) { | 465 | if (err) |
341 | goto err_out_free_dev; | 466 | goto err_out_free_dev; |
342 | } | ||
343 | |||
344 | /* Unlock the HW, prompting the boot sequence */ | ||
345 | writel(1, | ||
346 | NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE)); | ||
347 | |||
348 | /* Handshake with the card before we register the devices. */ | ||
349 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | ||
350 | |||
351 | /* initialize the all the ports */ | ||
352 | adapter->active_ports = 0; | ||
353 | |||
354 | for (i = 0; i < adapter->ahw.max_ports; i++) { | ||
355 | netdev = alloc_etherdev(sizeof(struct netxen_port)); | ||
356 | if (!netdev) { | ||
357 | printk(KERN_ERR "%s: could not allocate netdev for port" | ||
358 | " %d\n", netxen_nic_driver_name, i + 1); | ||
359 | goto err_out_free_dev; | ||
360 | } | ||
361 | 467 | ||
362 | SET_MODULE_OWNER(netdev); | 468 | if (netxen_probe_flag == 0) { |
363 | SET_NETDEV_DEV(netdev, &pdev->dev); | 469 | /* Unlock the HW, prompting the boot sequence */ |
364 | 470 | writel(1, | |
365 | port = netdev_priv(netdev); | 471 | NETXEN_CRB_NORMALIZE(adapter, |
366 | port->netdev = netdev; | 472 | NETXEN_ROMUSB_GLB_PEGTUNE_DONE)); |
367 | port->pdev = pdev; | 473 | /* Handshake with the card before we register the devices. */ |
368 | port->adapter = adapter; | 474 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); |
369 | port->portnum = i; /* Gigabit port number from 0-3 */ | 475 | } |
370 | |||
371 | netdev->open = netxen_nic_open; | ||
372 | netdev->stop = netxen_nic_close; | ||
373 | netdev->hard_start_xmit = netxen_nic_xmit_frame; | ||
374 | netdev->get_stats = netxen_nic_get_stats; | ||
375 | netdev->set_multicast_list = netxen_nic_set_multi; | ||
376 | netdev->set_mac_address = netxen_nic_set_mac; | ||
377 | netdev->change_mtu = netxen_nic_change_mtu; | ||
378 | netdev->tx_timeout = netxen_tx_timeout; | ||
379 | netdev->watchdog_timeo = HZ; | ||
380 | |||
381 | netxen_nic_change_mtu(netdev, netdev->mtu); | ||
382 | |||
383 | SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops); | ||
384 | netdev->poll = netxen_nic_poll; | ||
385 | netdev->weight = NETXEN_NETDEV_WEIGHT; | ||
386 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
387 | netdev->poll_controller = netxen_nic_poll_controller; | ||
388 | #endif | ||
389 | /* ScatterGather support */ | ||
390 | netdev->features = NETIF_F_SG; | ||
391 | netdev->features |= NETIF_F_IP_CSUM; | ||
392 | netdev->features |= NETIF_F_TSO; | ||
393 | |||
394 | if (pci_using_dac) | ||
395 | netdev->features |= NETIF_F_HIGHDMA; | ||
396 | |||
397 | if (valid_mac) { | ||
398 | unsigned char *p = (unsigned char *)&mac_addr[i]; | ||
399 | netdev->dev_addr[0] = *(p + 5); | ||
400 | netdev->dev_addr[1] = *(p + 4); | ||
401 | netdev->dev_addr[2] = *(p + 3); | ||
402 | netdev->dev_addr[3] = *(p + 2); | ||
403 | netdev->dev_addr[4] = *(p + 1); | ||
404 | netdev->dev_addr[5] = *(p + 0); | ||
405 | |||
406 | memcpy(netdev->perm_addr, netdev->dev_addr, | ||
407 | netdev->addr_len); | ||
408 | if (!is_valid_ether_addr(netdev->perm_addr)) { | ||
409 | printk(KERN_ERR "%s: Bad MAC address " | ||
410 | "%02x:%02x:%02x:%02x:%02x:%02x.\n", | ||
411 | netxen_nic_driver_name, | ||
412 | netdev->dev_addr[0], | ||
413 | netdev->dev_addr[1], | ||
414 | netdev->dev_addr[2], | ||
415 | netdev->dev_addr[3], | ||
416 | netdev->dev_addr[4], | ||
417 | netdev->dev_addr[5]); | ||
418 | } else { | ||
419 | if (adapter->macaddr_set) | ||
420 | adapter->macaddr_set(port, | ||
421 | netdev->dev_addr); | ||
422 | } | ||
423 | } | ||
424 | INIT_WORK(&port->tx_timeout_task, netxen_tx_timeout_task); | ||
425 | netif_carrier_off(netdev); | ||
426 | netif_stop_queue(netdev); | ||
427 | 476 | ||
428 | if ((err = register_netdev(netdev))) { | 477 | if(netxen_probe_flag == 0) { |
429 | printk(KERN_ERR "%s: register_netdev failed port #%d" | 478 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); |
430 | " aborting\n", netxen_nic_driver_name, i + 1); | 479 | netxen_pinit_from_rom(adapter, 0); |
431 | err = -EIO; | 480 | udelay(500); |
432 | free_netdev(netdev); | 481 | netxen_load_firmware(adapter); |
433 | goto err_out_free_dev; | 482 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); |
434 | } | ||
435 | adapter->port_count++; | ||
436 | adapter->port[i] = port; | ||
437 | } | 483 | } |
438 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | ||
439 | netxen_pinit_from_rom(adapter, 0); | ||
440 | udelay(500); | ||
441 | netxen_load_firmware(adapter); | ||
442 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | ||
443 | /* | 484 | /* |
444 | * delay a while to ensure that the Pegs are up & running. | 485 | * delay a while to ensure that the Pegs are up & running. |
445 | * Otherwise, we might see some flaky behaviour. | 486 | * Otherwise, we might see some flaky behaviour. |
446 | */ | 487 | */ |
447 | udelay(100); | 488 | udelay(100); |
489 | INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task); | ||
490 | netif_carrier_off(netdev); | ||
491 | netif_stop_queue(netdev); | ||
492 | |||
493 | if((err = register_netdev(netdev))) | ||
494 | DPRINTK(1, ERR, "register_netdev failed port #%d" | ||
495 | " aborting\n", i+1); | ||
448 | 496 | ||
449 | switch (adapter->ahw.board_type) { | 497 | switch (adapter->ahw.board_type) { |
450 | case NETXEN_NIC_GBE: | 498 | case NETXEN_NIC_GBE: |
451 | printk("%s: QUAD GbE board initialized\n", | 499 | printk(KERN_INFO "%s: QUAD GbE board initialized\n", |
452 | netxen_nic_driver_name); | 500 | netxen_nic_driver_name); |
453 | break; | 501 | break; |
454 | 502 | ||
455 | case NETXEN_NIC_XGBE: | 503 | case NETXEN_NIC_XGBE: |
456 | printk("%s: XGbE board initialized\n", netxen_nic_driver_name); | 504 | printk(KERN_INFO "%s: XGbE board initialized\n", |
457 | break; | 505 | netxen_nic_driver_name); |
506 | break; | ||
458 | } | 507 | } |
459 | 508 | ||
460 | adapter->driver_mismatch = 0; | 509 | adapter->driver_mismatch = 0; |
510 | if(netxen_probe_flag == 0) | ||
511 | netxen_probe_flag ++; | ||
461 | 512 | ||
462 | return 0; | 513 | return 0; |
463 | 514 | ||
464 | err_out_free_dev: | 515 | err_out_free_dev: |
465 | if (adapter->flags & NETXEN_NIC_MSI_ENABLED) | 516 | if (adapter->flags & NETXEN_NIC_MSI_ENABLED) |
466 | pci_disable_msi(pdev); | 517 | pci_disable_msi(pdev); |
467 | for (i = 0; i < adapter->port_count; i++) { | 518 | |
468 | port = adapter->port[i]; | 519 | unregister_netdev(adapter->netdev); |
469 | if ((port) && (port->netdev)) { | 520 | free_netdev(adapter->netdev); |
470 | unregister_netdev(port->netdev); | ||
471 | free_netdev(port->netdev); | ||
472 | } | ||
473 | } | ||
474 | 521 | ||
475 | netxen_free_adapter_offload(adapter); | 522 | netxen_free_adapter_offload(adapter); |
476 | 523 | ||
@@ -491,7 +538,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
491 | pci_set_drvdata(pdev, NULL); | 538 | pci_set_drvdata(pdev, NULL); |
492 | kfree(adapter); | 539 | kfree(adapter); |
493 | 540 | ||
494 | err_out_dbunmap: | ||
495 | if (db_ptr) | 541 | if (db_ptr) |
496 | iounmap(db_ptr); | 542 | iounmap(db_ptr); |
497 | 543 | ||
@@ -513,35 +559,32 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
513 | static void __devexit netxen_nic_remove(struct pci_dev *pdev) | 559 | static void __devexit netxen_nic_remove(struct pci_dev *pdev) |
514 | { | 560 | { |
515 | struct netxen_adapter *adapter; | 561 | struct netxen_adapter *adapter; |
516 | struct netxen_port *port; | 562 | struct net_device *netdev; |
517 | struct netxen_rx_buffer *buffer; | 563 | struct netxen_rx_buffer *buffer; |
518 | struct netxen_recv_context *recv_ctx; | 564 | struct netxen_recv_context *recv_ctx; |
519 | struct netxen_rcv_desc_ctx *rcv_desc; | 565 | struct netxen_rcv_desc_ctx *rcv_desc; |
520 | int i; | 566 | int i; |
521 | int ctxid, ring; | 567 | int ctxid, ring; |
522 | 568 | ||
523 | adapter = pci_get_drvdata(pdev); | 569 | netdev = pci_get_drvdata(pdev); |
570 | adapter = netdev_priv(netdev); | ||
524 | if (adapter == NULL) | 571 | if (adapter == NULL) |
525 | return; | 572 | return; |
526 | 573 | ||
574 | if (adapter->stop_port) | ||
575 | adapter->stop_port(adapter); | ||
576 | |||
527 | if (adapter->irq) | 577 | if (adapter->irq) |
528 | free_irq(adapter->irq, adapter); | 578 | free_irq(adapter->irq, adapter); |
529 | netxen_nic_stop_all_ports(adapter); | ||
530 | /* leave the hw in the same state as reboot */ | 579 | /* leave the hw in the same state as reboot */ |
531 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | 580 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); |
532 | netxen_pinit_from_rom(adapter, 0); | 581 | netxen_pinit_from_rom(adapter, 0); |
533 | udelay(500); | ||
534 | netxen_load_firmware(adapter); | 582 | netxen_load_firmware(adapter); |
535 | netxen_free_adapter_offload(adapter); | 583 | netxen_free_adapter_offload(adapter); |
536 | 584 | ||
537 | mdelay(1000); /* Delay for a while to drain the DMA engines */ | 585 | udelay(500); |
538 | for (i = 0; i < adapter->port_count; i++) { | 586 | unregister_netdev(netdev); |
539 | port = adapter->port[i]; | 587 | free_netdev(netdev); |
540 | if ((port) && (port->netdev)) { | ||
541 | unregister_netdev(port->netdev); | ||
542 | free_netdev(port->netdev); | ||
543 | } | ||
544 | } | ||
545 | 588 | ||
546 | if ((adapter->flags & NETXEN_NIC_MSI_ENABLED)) | 589 | if ((adapter->flags & NETXEN_NIC_MSI_ENABLED)) |
547 | pci_disable_msi(pdev); | 590 | pci_disable_msi(pdev); |
@@ -585,8 +628,7 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
585 | */ | 628 | */ |
586 | static int netxen_nic_open(struct net_device *netdev) | 629 | static int netxen_nic_open(struct net_device *netdev) |
587 | { | 630 | { |
588 | struct netxen_port *port = netdev_priv(netdev); | 631 | struct netxen_adapter *adapter = (struct netxen_adapter *)netdev->priv; |
589 | struct netxen_adapter *adapter = port->adapter; | ||
590 | int err = 0; | 632 | int err = 0; |
591 | int ctx, ring; | 633 | int ctx, ring; |
592 | 634 | ||
@@ -610,9 +652,9 @@ static int netxen_nic_open(struct net_device *netdev) | |||
610 | return err; | 652 | return err; |
611 | } | 653 | } |
612 | if (adapter->init_port | 654 | if (adapter->init_port |
613 | && adapter->init_port(adapter, port->portnum) != 0) { | 655 | && adapter->init_port(adapter, adapter->portnum) != 0) { |
614 | printk(KERN_ERR "%s: Failed to initialize port %d\n", | 656 | printk(KERN_ERR "%s: Failed to initialize port %d\n", |
615 | netxen_nic_driver_name, port->portnum); | 657 | netxen_nic_driver_name, adapter->portnum); |
616 | netxen_free_hw_resources(adapter); | 658 | netxen_free_hw_resources(adapter); |
617 | return -EIO; | 659 | return -EIO; |
618 | } | 660 | } |
@@ -632,23 +674,20 @@ static int netxen_nic_open(struct net_device *netdev) | |||
632 | 674 | ||
633 | adapter->is_up = NETXEN_ADAPTER_UP_MAGIC; | 675 | adapter->is_up = NETXEN_ADAPTER_UP_MAGIC; |
634 | } | 676 | } |
635 | adapter->active_ports++; | 677 | if (!adapter->driver_mismatch) |
636 | if (adapter->active_ports == 1) { | 678 | mod_timer(&adapter->watchdog_timer, jiffies); |
637 | if (!adapter->driver_mismatch) | ||
638 | mod_timer(&adapter->watchdog_timer, jiffies); | ||
639 | 679 | ||
640 | netxen_nic_enable_int(adapter); | 680 | netxen_nic_enable_int(adapter); |
641 | } | ||
642 | 681 | ||
643 | /* Done here again so that even if phantom sw overwrote it, | 682 | /* Done here again so that even if phantom sw overwrote it, |
644 | * we set it */ | 683 | * we set it */ |
645 | if (adapter->macaddr_set) | 684 | if (adapter->macaddr_set) |
646 | adapter->macaddr_set(port, netdev->dev_addr); | 685 | adapter->macaddr_set(adapter, netdev->dev_addr); |
647 | netxen_nic_set_link_parameters(port); | 686 | netxen_nic_set_link_parameters(adapter); |
648 | 687 | ||
649 | netxen_nic_set_multi(netdev); | 688 | netxen_nic_set_multi(netdev); |
650 | if (adapter->set_mtu) | 689 | if (adapter->set_mtu) |
651 | adapter->set_mtu(port, netdev->mtu); | 690 | adapter->set_mtu(adapter, netdev->mtu); |
652 | 691 | ||
653 | if (!adapter->driver_mismatch) | 692 | if (!adapter->driver_mismatch) |
654 | netif_start_queue(netdev); | 693 | netif_start_queue(netdev); |
@@ -661,8 +700,7 @@ static int netxen_nic_open(struct net_device *netdev) | |||
661 | */ | 700 | */ |
662 | static int netxen_nic_close(struct net_device *netdev) | 701 | static int netxen_nic_close(struct net_device *netdev) |
663 | { | 702 | { |
664 | struct netxen_port *port = netdev_priv(netdev); | 703 | struct netxen_adapter *adapter = netdev_priv(netdev); |
665 | struct netxen_adapter *adapter = port->adapter; | ||
666 | int i, j; | 704 | int i, j; |
667 | struct netxen_cmd_buffer *cmd_buff; | 705 | struct netxen_cmd_buffer *cmd_buff; |
668 | struct netxen_skb_frag *buffrag; | 706 | struct netxen_skb_frag *buffrag; |
@@ -670,47 +708,43 @@ static int netxen_nic_close(struct net_device *netdev) | |||
670 | netif_carrier_off(netdev); | 708 | netif_carrier_off(netdev); |
671 | netif_stop_queue(netdev); | 709 | netif_stop_queue(netdev); |
672 | 710 | ||
673 | adapter->active_ports--; | 711 | netxen_nic_disable_int(adapter); |
674 | 712 | if (adapter->irq) | |
675 | if (!adapter->active_ports) { | 713 | free_irq(adapter->irq, adapter); |
676 | netxen_nic_disable_int(adapter); | 714 | |
677 | cmd_buff = adapter->cmd_buf_arr; | 715 | cmd_buff = adapter->cmd_buf_arr; |
678 | for (i = 0; i < adapter->max_tx_desc_count; i++) { | 716 | for (i = 0; i < adapter->max_tx_desc_count; i++) { |
679 | buffrag = cmd_buff->frag_array; | 717 | buffrag = cmd_buff->frag_array; |
718 | if (buffrag->dma) { | ||
719 | pci_unmap_single(adapter->pdev, buffrag->dma, | ||
720 | buffrag->length, PCI_DMA_TODEVICE); | ||
721 | buffrag->dma = (u64) NULL; | ||
722 | } | ||
723 | for (j = 0; j < cmd_buff->frag_count; j++) { | ||
724 | buffrag++; | ||
680 | if (buffrag->dma) { | 725 | if (buffrag->dma) { |
681 | pci_unmap_single(port->pdev, buffrag->dma, | 726 | pci_unmap_page(adapter->pdev, buffrag->dma, |
682 | buffrag->length, | 727 | buffrag->length, |
683 | PCI_DMA_TODEVICE); | 728 | PCI_DMA_TODEVICE); |
684 | buffrag->dma = (u64) NULL; | 729 | buffrag->dma = (u64) NULL; |
685 | } | 730 | } |
686 | for (j = 0; j < cmd_buff->frag_count; j++) { | ||
687 | buffrag++; | ||
688 | if (buffrag->dma) { | ||
689 | pci_unmap_page(port->pdev, | ||
690 | buffrag->dma, | ||
691 | buffrag->length, | ||
692 | PCI_DMA_TODEVICE); | ||
693 | buffrag->dma = (u64) NULL; | ||
694 | } | ||
695 | } | ||
696 | /* Free the skb we received in netxen_nic_xmit_frame */ | ||
697 | if (cmd_buff->skb) { | ||
698 | dev_kfree_skb_any(cmd_buff->skb); | ||
699 | cmd_buff->skb = NULL; | ||
700 | } | ||
701 | cmd_buff++; | ||
702 | } | 731 | } |
703 | FLUSH_SCHEDULED_WORK(); | 732 | /* Free the skb we received in netxen_nic_xmit_frame */ |
704 | del_timer_sync(&adapter->watchdog_timer); | 733 | if (cmd_buff->skb) { |
734 | dev_kfree_skb_any(cmd_buff->skb); | ||
735 | cmd_buff->skb = NULL; | ||
736 | } | ||
737 | cmd_buff++; | ||
705 | } | 738 | } |
739 | FLUSH_SCHEDULED_WORK(); | ||
740 | del_timer_sync(&adapter->watchdog_timer); | ||
706 | 741 | ||
707 | return 0; | 742 | return 0; |
708 | } | 743 | } |
709 | 744 | ||
710 | static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | 745 | static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) |
711 | { | 746 | { |
712 | struct netxen_port *port = netdev_priv(netdev); | 747 | struct netxen_adapter *adapter = netdev_priv(netdev); |
713 | struct netxen_adapter *adapter = port->adapter; | ||
714 | struct netxen_hardware_context *hw = &adapter->ahw; | 748 | struct netxen_hardware_context *hw = &adapter->ahw; |
715 | unsigned int first_seg_len = skb->len - skb->data_len; | 749 | unsigned int first_seg_len = skb->len - skb->data_len; |
716 | struct netxen_skb_frag *buffrag; | 750 | struct netxen_skb_frag *buffrag; |
@@ -728,12 +762,12 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
728 | u32 last_cmd_consumer = 0; | 762 | u32 last_cmd_consumer = 0; |
729 | int no_of_desc; | 763 | int no_of_desc; |
730 | 764 | ||
731 | port->stats.xmitcalled++; | 765 | adapter->stats.xmitcalled++; |
732 | frag_count = skb_shinfo(skb)->nr_frags + 1; | 766 | frag_count = skb_shinfo(skb)->nr_frags + 1; |
733 | 767 | ||
734 | if (unlikely(skb->len <= 0)) { | 768 | if (unlikely(skb->len <= 0)) { |
735 | dev_kfree_skb_any(skb); | 769 | dev_kfree_skb_any(skb); |
736 | port->stats.badskblen++; | 770 | adapter->stats.badskblen++; |
737 | return NETDEV_TX_OK; | 771 | return NETDEV_TX_OK; |
738 | } | 772 | } |
739 | 773 | ||
@@ -742,7 +776,7 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
742 | "too large, can handle only %d frags\n", | 776 | "too large, can handle only %d frags\n", |
743 | netxen_nic_driver_name, netdev->name, | 777 | netxen_nic_driver_name, netdev->name, |
744 | frag_count, MAX_BUFFERS_PER_CMD); | 778 | frag_count, MAX_BUFFERS_PER_CMD); |
745 | port->stats.txdropped++; | 779 | adapter->stats.txdropped++; |
746 | if ((++dropped_packet & 0xff) == 0xff) | 780 | if ((++dropped_packet & 0xff) == 0xff) |
747 | printk("%s: %s droppped packets = %d\n", | 781 | printk("%s: %s droppped packets = %d\n", |
748 | netxen_nic_driver_name, netdev->name, | 782 | netxen_nic_driver_name, netdev->name, |
@@ -759,7 +793,7 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
759 | */ | 793 | */ |
760 | retry_getting_window: | 794 | retry_getting_window: |
761 | spin_lock_bh(&adapter->tx_lock); | 795 | spin_lock_bh(&adapter->tx_lock); |
762 | if (adapter->total_threads == MAX_XMIT_PRODUCERS) { | 796 | if (adapter->total_threads >= MAX_XMIT_PRODUCERS) { |
763 | spin_unlock_bh(&adapter->tx_lock); | 797 | spin_unlock_bh(&adapter->tx_lock); |
764 | /* | 798 | /* |
765 | * Yield CPU | 799 | * Yield CPU |
@@ -792,15 +826,8 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
792 | if ((k + no_of_desc) >= | 826 | if ((k + no_of_desc) >= |
793 | ((last_cmd_consumer <= k) ? last_cmd_consumer + max_tx_desc_count : | 827 | ((last_cmd_consumer <= k) ? last_cmd_consumer + max_tx_desc_count : |
794 | last_cmd_consumer)) { | 828 | last_cmd_consumer)) { |
795 | port->stats.nocmddescriptor++; | ||
796 | DPRINTK(ERR, "No command descriptors available," | ||
797 | " producer = %d, consumer = %d count=%llu," | ||
798 | " dropping packet\n", producer, | ||
799 | adapter->last_cmd_consumer, | ||
800 | port->stats.nocmddescriptor); | ||
801 | |||
802 | netif_stop_queue(netdev); | 829 | netif_stop_queue(netdev); |
803 | port->flags |= NETXEN_NETDEV_STATUS; | 830 | adapter->flags |= NETXEN_NETDEV_STATUS; |
804 | spin_unlock_bh(&adapter->tx_lock); | 831 | spin_unlock_bh(&adapter->tx_lock); |
805 | return NETDEV_TX_BUSY; | 832 | return NETDEV_TX_BUSY; |
806 | } | 833 | } |
@@ -828,16 +855,16 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
828 | pbuf->skb = skb; | 855 | pbuf->skb = skb; |
829 | pbuf->cmd = TX_ETHER_PKT; | 856 | pbuf->cmd = TX_ETHER_PKT; |
830 | pbuf->frag_count = frag_count; | 857 | pbuf->frag_count = frag_count; |
831 | pbuf->port = port->portnum; | 858 | pbuf->port = adapter->portnum; |
832 | buffrag = &pbuf->frag_array[0]; | 859 | buffrag = &pbuf->frag_array[0]; |
833 | buffrag->dma = pci_map_single(port->pdev, skb->data, first_seg_len, | 860 | buffrag->dma = pci_map_single(adapter->pdev, skb->data, first_seg_len, |
834 | PCI_DMA_TODEVICE); | 861 | PCI_DMA_TODEVICE); |
835 | buffrag->length = first_seg_len; | 862 | buffrag->length = first_seg_len; |
836 | netxen_set_cmd_desc_totallength(hwdesc, skb->len); | 863 | netxen_set_cmd_desc_totallength(hwdesc, skb->len); |
837 | netxen_set_cmd_desc_num_of_buff(hwdesc, frag_count); | 864 | netxen_set_cmd_desc_num_of_buff(hwdesc, frag_count); |
838 | netxen_set_cmd_desc_opcode(hwdesc, TX_ETHER_PKT); | 865 | netxen_set_cmd_desc_opcode(hwdesc, TX_ETHER_PKT); |
839 | 866 | ||
840 | netxen_set_cmd_desc_port(hwdesc, port->portnum); | 867 | netxen_set_cmd_desc_port(hwdesc, adapter->portnum); |
841 | hwdesc->buffer1_length = cpu_to_le16(first_seg_len); | 868 | hwdesc->buffer1_length = cpu_to_le16(first_seg_len); |
842 | hwdesc->addr_buffer1 = cpu_to_le64(buffrag->dma); | 869 | hwdesc->addr_buffer1 = cpu_to_le64(buffrag->dma); |
843 | 870 | ||
@@ -860,7 +887,7 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
860 | offset = frag->page_offset; | 887 | offset = frag->page_offset; |
861 | 888 | ||
862 | temp_len = len; | 889 | temp_len = len; |
863 | temp_dma = pci_map_page(port->pdev, frag->page, offset, | 890 | temp_dma = pci_map_page(adapter->pdev, frag->page, offset, |
864 | len, PCI_DMA_TODEVICE); | 891 | len, PCI_DMA_TODEVICE); |
865 | 892 | ||
866 | buffrag++; | 893 | buffrag++; |
@@ -928,20 +955,19 @@ static int netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
928 | } | 955 | } |
929 | } | 956 | } |
930 | spin_lock_bh(&adapter->tx_lock); | 957 | spin_lock_bh(&adapter->tx_lock); |
931 | port->stats.txbytes += | 958 | adapter->stats.txbytes += |
932 | netxen_get_cmd_desc_totallength(&hw->cmd_desc_head[saved_producer]); | 959 | netxen_get_cmd_desc_totallength(&hw->cmd_desc_head[saved_producer]); |
933 | /* Code to update the adapter considering how many producer threads | 960 | /* Code to update the adapter considering how many producer threads |
934 | are currently working */ | 961 | are currently working */ |
935 | if ((--adapter->num_threads) == 0) { | 962 | if ((--adapter->num_threads) == 0) { |
936 | /* This is the last thread */ | 963 | /* This is the last thread */ |
937 | u32 crb_producer = adapter->cmd_producer; | 964 | u32 crb_producer = adapter->cmd_producer; |
938 | writel(crb_producer, | 965 | netxen_nic_update_cmd_producer(adapter, crb_producer); |
939 | NETXEN_CRB_NORMALIZE(adapter, CRB_CMD_PRODUCER_OFFSET)); | ||
940 | wmb(); | 966 | wmb(); |
941 | adapter->total_threads = 0; | 967 | adapter->total_threads = 0; |
942 | } | 968 | } |
943 | 969 | ||
944 | port->stats.xmitfinished++; | 970 | adapter->stats.xmitfinished++; |
945 | spin_unlock_bh(&adapter->tx_lock); | 971 | spin_unlock_bh(&adapter->tx_lock); |
946 | 972 | ||
947 | netdev->trans_start = jiffies; | 973 | netdev->trans_start = jiffies; |
@@ -961,25 +987,25 @@ static void netxen_watchdog(unsigned long v) | |||
961 | 987 | ||
962 | static void netxen_tx_timeout(struct net_device *netdev) | 988 | static void netxen_tx_timeout(struct net_device *netdev) |
963 | { | 989 | { |
964 | struct netxen_port *port = (struct netxen_port *)netdev_priv(netdev); | 990 | struct netxen_adapter *adapter = (struct netxen_adapter *) |
965 | 991 | netdev_priv(netdev); | |
966 | SCHEDULE_WORK(&port->tx_timeout_task); | 992 | SCHEDULE_WORK(&adapter->tx_timeout_task); |
967 | } | 993 | } |
968 | 994 | ||
969 | static void netxen_tx_timeout_task(struct work_struct *work) | 995 | static void netxen_tx_timeout_task(struct work_struct *work) |
970 | { | 996 | { |
971 | struct netxen_port *port = | 997 | struct netxen_adapter *adapter = |
972 | container_of(work, struct netxen_port, tx_timeout_task); | 998 | container_of(work, struct netxen_adapter, tx_timeout_task); |
973 | struct net_device *netdev = port->netdev; | 999 | struct net_device *netdev = adapter->netdev; |
974 | unsigned long flags; | 1000 | unsigned long flags; |
975 | 1001 | ||
976 | printk(KERN_ERR "%s %s: transmit timeout, resetting.\n", | 1002 | printk(KERN_ERR "%s %s: transmit timeout, resetting.\n", |
977 | netxen_nic_driver_name, netdev->name); | 1003 | netxen_nic_driver_name, netdev->name); |
978 | 1004 | ||
979 | spin_lock_irqsave(&port->adapter->lock, flags); | 1005 | spin_lock_irqsave(&adapter->lock, flags); |
980 | netxen_nic_close(netdev); | 1006 | netxen_nic_close(netdev); |
981 | netxen_nic_open(netdev); | 1007 | netxen_nic_open(netdev); |
982 | spin_unlock_irqrestore(&port->adapter->lock, flags); | 1008 | spin_unlock_irqrestore(&adapter->lock, flags); |
983 | netdev->trans_start = jiffies; | 1009 | netdev->trans_start = jiffies; |
984 | netif_wake_queue(netdev); | 1010 | netif_wake_queue(netdev); |
985 | } | 1011 | } |
@@ -991,16 +1017,14 @@ netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev) | |||
991 | 1017 | ||
992 | DPRINTK(INFO, "Entered handle ISR\n"); | 1018 | DPRINTK(INFO, "Entered handle ISR\n"); |
993 | 1019 | ||
994 | adapter->stats.ints++; | ||
995 | |||
996 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { | 1020 | if (!(adapter->flags & NETXEN_NIC_MSI_ENABLED)) { |
997 | int count = 0; | 1021 | int count = 0; |
998 | u32 mask; | 1022 | u32 mask; |
999 | mask = readl(pci_base_offset(adapter, ISR_INT_VECTOR)); | 1023 | u32 our_int = 0; |
1000 | if ((mask & 0x80) == 0) { | 1024 | our_int = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_INT_VECTOR)); |
1001 | /* not our interrupt */ | 1025 | /* not our interrupt */ |
1026 | if ((our_int & (0x80 << adapter->portnum)) == 0) | ||
1002 | return ret; | 1027 | return ret; |
1003 | } | ||
1004 | netxen_nic_disable_int(adapter); | 1028 | netxen_nic_disable_int(adapter); |
1005 | /* Window = 0 or 1 */ | 1029 | /* Window = 0 or 1 */ |
1006 | do { | 1030 | do { |
@@ -1012,7 +1036,6 @@ netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev) | |||
1012 | printk("Could not disable interrupt completely\n"); | 1036 | printk("Could not disable interrupt completely\n"); |
1013 | 1037 | ||
1014 | } | 1038 | } |
1015 | adapter->stats.hostints++; | ||
1016 | 1039 | ||
1017 | if (netxen_nic_rx_has_work(adapter) || netxen_nic_tx_has_work(adapter)) { | 1040 | if (netxen_nic_rx_has_work(adapter) || netxen_nic_tx_has_work(adapter)) { |
1018 | if (netif_rx_schedule_prep(netdev)) { | 1041 | if (netif_rx_schedule_prep(netdev)) { |
@@ -1046,33 +1069,24 @@ netxen_handle_int(struct netxen_adapter *adapter, struct net_device *netdev) | |||
1046 | irqreturn_t netxen_intr(int irq, void *data) | 1069 | irqreturn_t netxen_intr(int irq, void *data) |
1047 | { | 1070 | { |
1048 | struct netxen_adapter *adapter; | 1071 | struct netxen_adapter *adapter; |
1049 | struct netxen_port *port; | ||
1050 | struct net_device *netdev; | 1072 | struct net_device *netdev; |
1051 | int i; | ||
1052 | 1073 | ||
1053 | if (unlikely(!irq)) { | 1074 | if (unlikely(!irq)) { |
1054 | return IRQ_NONE; /* Not our interrupt */ | 1075 | return IRQ_NONE; /* Not our interrupt */ |
1055 | } | 1076 | } |
1056 | 1077 | ||
1057 | adapter = (struct netxen_adapter *)data; | 1078 | adapter = (struct netxen_adapter *)data; |
1058 | for (i = 0; i < adapter->ahw.max_ports; i++) { | 1079 | netdev = adapter->netdev; |
1059 | port = adapter->port[i]; | 1080 | /* process our status queue (for all 4 ports) */ |
1060 | netdev = port->netdev; | 1081 | if (netif_running(netdev)) |
1061 | 1082 | netxen_handle_int(adapter, netdev); | |
1062 | /* process our status queue (for all 4 ports) */ | ||
1063 | if (netif_running(netdev)) { | ||
1064 | netxen_handle_int(adapter, netdev); | ||
1065 | break; | ||
1066 | } | ||
1067 | } | ||
1068 | 1083 | ||
1069 | return IRQ_HANDLED; | 1084 | return IRQ_HANDLED; |
1070 | } | 1085 | } |
1071 | 1086 | ||
1072 | static int netxen_nic_poll(struct net_device *netdev, int *budget) | 1087 | static int netxen_nic_poll(struct net_device *netdev, int *budget) |
1073 | { | 1088 | { |
1074 | struct netxen_port *port = (struct netxen_port *)netdev_priv(netdev); | 1089 | struct netxen_adapter *adapter = netdev_priv(netdev); |
1075 | struct netxen_adapter *adapter = port->adapter; | ||
1076 | int work_to_do = min(*budget, netdev->quota); | 1090 | int work_to_do = min(*budget, netdev->quota); |
1077 | int done = 1; | 1091 | int done = 1; |
1078 | int ctx; | 1092 | int ctx; |
@@ -1080,7 +1094,6 @@ static int netxen_nic_poll(struct net_device *netdev, int *budget) | |||
1080 | int work_done = 0; | 1094 | int work_done = 0; |
1081 | 1095 | ||
1082 | DPRINTK(INFO, "polling for %d descriptors\n", *budget); | 1096 | DPRINTK(INFO, "polling for %d descriptors\n", *budget); |
1083 | port->stats.polled++; | ||
1084 | 1097 | ||
1085 | work_done = 0; | 1098 | work_done = 0; |
1086 | for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) { | 1099 | for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) { |
@@ -1124,8 +1137,7 @@ static int netxen_nic_poll(struct net_device *netdev, int *budget) | |||
1124 | #ifdef CONFIG_NET_POLL_CONTROLLER | 1137 | #ifdef CONFIG_NET_POLL_CONTROLLER |
1125 | static void netxen_nic_poll_controller(struct net_device *netdev) | 1138 | static void netxen_nic_poll_controller(struct net_device *netdev) |
1126 | { | 1139 | { |
1127 | struct netxen_port *port = netdev_priv(netdev); | 1140 | struct netxen_adapter *adapter = netdev_priv(netdev); |
1128 | struct netxen_adapter *adapter = port->adapter; | ||
1129 | disable_irq(adapter->irq); | 1141 | disable_irq(adapter->irq); |
1130 | netxen_intr(adapter->irq, adapter); | 1142 | netxen_intr(adapter->irq, adapter); |
1131 | enable_irq(adapter->irq); | 1143 | enable_irq(adapter->irq); |
diff --git a/drivers/net/netxen/netxen_nic_niu.c b/drivers/net/netxen/netxen_nic_niu.c index d5d95074e56..f6befc32aa5 100644 --- a/drivers/net/netxen/netxen_nic_niu.c +++ b/drivers/net/netxen/netxen_nic_niu.c | |||
@@ -610,13 +610,12 @@ int netxen_niu_macaddr_get(struct netxen_adapter *adapter, | |||
610 | * Set the station MAC address. | 610 | * Set the station MAC address. |
611 | * Note that the passed-in value must already be in network byte order. | 611 | * Note that the passed-in value must already be in network byte order. |
612 | */ | 612 | */ |
613 | int netxen_niu_macaddr_set(struct netxen_port *port, | 613 | int netxen_niu_macaddr_set(struct netxen_adapter *adapter, |
614 | netxen_ethernet_macaddr_t addr) | 614 | netxen_ethernet_macaddr_t addr) |
615 | { | 615 | { |
616 | u8 temp[4]; | 616 | u8 temp[4]; |
617 | u32 val; | 617 | u32 val; |
618 | struct netxen_adapter *adapter = port->adapter; | 618 | int phy = adapter->portnum; |
619 | int phy = port->portnum; | ||
620 | unsigned char mac_addr[6]; | 619 | unsigned char mac_addr[6]; |
621 | int i; | 620 | int i; |
622 | 621 | ||
@@ -642,7 +641,7 @@ int netxen_niu_macaddr_set(struct netxen_port *port, | |||
642 | 641 | ||
643 | if (i == 10) { | 642 | if (i == 10) { |
644 | printk(KERN_ERR "%s: cannot set Mac addr for %s\n", | 643 | printk(KERN_ERR "%s: cannot set Mac addr for %s\n", |
645 | netxen_nic_driver_name, port->netdev->name); | 644 | netxen_nic_driver_name, adapter->netdev->name); |
646 | printk(KERN_ERR "MAC address set: " | 645 | printk(KERN_ERR "MAC address set: " |
647 | "%02x:%02x:%02x:%02x:%02x:%02x.\n", | 646 | "%02x:%02x:%02x:%02x:%02x:%02x.\n", |
648 | addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); | 647 | addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); |
@@ -735,12 +734,10 @@ int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter, | |||
735 | } | 734 | } |
736 | 735 | ||
737 | /* Disable a GbE interface */ | 736 | /* Disable a GbE interface */ |
738 | int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter, int port) | 737 | int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter) |
739 | { | 738 | { |
740 | __u32 mac_cfg0; | 739 | __u32 mac_cfg0; |
741 | 740 | int port = adapter->portnum; | |
742 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) | ||
743 | return -EINVAL; | ||
744 | 741 | ||
745 | mac_cfg0 = 0; | 742 | mac_cfg0 = 0; |
746 | netxen_gb_soft_reset(mac_cfg0); | 743 | netxen_gb_soft_reset(mac_cfg0); |
@@ -751,13 +748,10 @@ int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter, int port) | |||
751 | } | 748 | } |
752 | 749 | ||
753 | /* Disable an XG interface */ | 750 | /* Disable an XG interface */ |
754 | int netxen_niu_disable_xg_port(struct netxen_adapter *adapter, int port) | 751 | int netxen_niu_disable_xg_port(struct netxen_adapter *adapter) |
755 | { | 752 | { |
756 | __u32 mac_cfg; | 753 | __u32 mac_cfg; |
757 | 754 | ||
758 | if (port != 0) | ||
759 | return -EINVAL; | ||
760 | |||
761 | mac_cfg = 0; | 755 | mac_cfg = 0; |
762 | netxen_xg_soft_reset(mac_cfg); | 756 | netxen_xg_soft_reset(mac_cfg); |
763 | if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XGE_CONFIG_0, | 757 | if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_XGE_CONFIG_0, |
@@ -767,10 +761,11 @@ int netxen_niu_disable_xg_port(struct netxen_adapter *adapter, int port) | |||
767 | } | 761 | } |
768 | 762 | ||
769 | /* Set promiscuous mode for a GbE interface */ | 763 | /* Set promiscuous mode for a GbE interface */ |
770 | int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, int port, | 764 | int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, |
771 | netxen_niu_prom_mode_t mode) | 765 | netxen_niu_prom_mode_t mode) |
772 | { | 766 | { |
773 | __u32 reg; | 767 | __u32 reg; |
768 | int port = adapter->portnum; | ||
774 | 769 | ||
775 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) | 770 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) |
776 | return -EINVAL; | 771 | return -EINVAL; |
@@ -824,12 +819,11 @@ int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, int port, | |||
824 | * Set the MAC address for an XG port | 819 | * Set the MAC address for an XG port |
825 | * Note that the passed-in value must already be in network byte order. | 820 | * Note that the passed-in value must already be in network byte order. |
826 | */ | 821 | */ |
827 | int netxen_niu_xg_macaddr_set(struct netxen_port *port, | 822 | int netxen_niu_xg_macaddr_set(struct netxen_adapter *adapter, |
828 | netxen_ethernet_macaddr_t addr) | 823 | netxen_ethernet_macaddr_t addr) |
829 | { | 824 | { |
830 | u8 temp[4]; | 825 | u8 temp[4]; |
831 | u32 val; | 826 | u32 val; |
832 | struct netxen_adapter *adapter = port->adapter; | ||
833 | 827 | ||
834 | temp[0] = temp[1] = 0; | 828 | temp[0] = temp[1] = 0; |
835 | memcpy(temp + 2, addr, 2); | 829 | memcpy(temp + 2, addr, 2); |
@@ -878,9 +872,10 @@ int netxen_niu_xg_macaddr_get(struct netxen_adapter *adapter, int phy, | |||
878 | } | 872 | } |
879 | 873 | ||
880 | int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, | 874 | int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, |
881 | int port, netxen_niu_prom_mode_t mode) | 875 | netxen_niu_prom_mode_t mode) |
882 | { | 876 | { |
883 | __u32 reg; | 877 | __u32 reg; |
878 | int port = adapter->portnum; | ||
884 | 879 | ||
885 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) | 880 | if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) |
886 | return -EINVAL; | 881 | return -EINVAL; |
diff --git a/drivers/net/netxen/netxen_nic_phan_reg.h b/drivers/net/netxen/netxen_nic_phan_reg.h index 0c7c94328b7..f7eb627f81c 100644 --- a/drivers/net/netxen/netxen_nic_phan_reg.h +++ b/drivers/net/netxen/netxen_nic_phan_reg.h | |||
@@ -100,6 +100,14 @@ | |||
100 | 100 | ||
101 | #define CRB_CMD_PRODUCER_OFFSET_1 NETXEN_NIC_REG(0x1ac) | 101 | #define CRB_CMD_PRODUCER_OFFSET_1 NETXEN_NIC_REG(0x1ac) |
102 | #define CRB_CMD_CONSUMER_OFFSET_1 NETXEN_NIC_REG(0x1b0) | 102 | #define CRB_CMD_CONSUMER_OFFSET_1 NETXEN_NIC_REG(0x1b0) |
103 | #define CRB_CMD_PRODUCER_OFFSET_1 NETXEN_NIC_REG(0x1ac) | ||
104 | #define CRB_CMD_CONSUMER_OFFSET_1 NETXEN_NIC_REG(0x1b0) | ||
105 | #define CRB_CMD_PRODUCER_OFFSET_2 NETXEN_NIC_REG(0x1b8) | ||
106 | #define CRB_CMD_CONSUMER_OFFSET_2 NETXEN_NIC_REG(0x1bc) | ||
107 | |||
108 | // 1c0 to 1cc used for signature reg | ||
109 | #define CRB_CMD_PRODUCER_OFFSET_3 NETXEN_NIC_REG(0x1d0) | ||
110 | #define CRB_CMD_CONSUMER_OFFSET_3 NETXEN_NIC_REG(0x1d4) | ||
103 | #define CRB_TEMP_STATE NETXEN_NIC_REG(0x1b4) | 111 | #define CRB_TEMP_STATE NETXEN_NIC_REG(0x1b4) |
104 | 112 | ||
105 | /* used for ethtool tests */ | 113 | /* used for ethtool tests */ |
@@ -139,128 +147,13 @@ struct netxen_recv_crb { | |||
139 | }; | 147 | }; |
140 | 148 | ||
141 | #if defined(DEFINE_GLOBAL_RECV_CRB) | 149 | #if defined(DEFINE_GLOBAL_RECV_CRB) |
142 | struct netxen_recv_crb recv_crb_registers[] = { | ||
143 | /* | ||
144 | * Instance 0. | ||
145 | */ | ||
146 | { | ||
147 | /* rcv_desc_crb: */ | ||
148 | { | ||
149 | { | ||
150 | /* crb_rcv_producer_offset: */ | ||
151 | NETXEN_NIC_REG(0x100), | ||
152 | /* crb_rcv_consumer_offset: */ | ||
153 | NETXEN_NIC_REG(0x104), | ||
154 | /* crb_gloablrcv_ring: */ | ||
155 | NETXEN_NIC_REG(0x108), | ||
156 | /* crb_rcv_ring_size */ | ||
157 | NETXEN_NIC_REG(0x10c), | ||
158 | |||
159 | }, | ||
160 | /* Jumbo frames */ | ||
161 | { | ||
162 | /* crb_rcv_producer_offset: */ | ||
163 | NETXEN_NIC_REG(0x110), | ||
164 | /* crb_rcv_consumer_offset: */ | ||
165 | NETXEN_NIC_REG(0x114), | ||
166 | /* crb_gloablrcv_ring: */ | ||
167 | NETXEN_NIC_REG(0x118), | ||
168 | /* crb_rcv_ring_size */ | ||
169 | NETXEN_NIC_REG(0x11c), | ||
170 | }, | ||
171 | /* LRO */ | ||
172 | { | ||
173 | /* crb_rcv_producer_offset: */ | ||
174 | NETXEN_NIC_REG(0x120), | ||
175 | /* crb_rcv_consumer_offset: */ | ||
176 | NETXEN_NIC_REG(0x124), | ||
177 | /* crb_gloablrcv_ring: */ | ||
178 | NETXEN_NIC_REG(0x128), | ||
179 | /* crb_rcv_ring_size */ | ||
180 | NETXEN_NIC_REG(0x12c), | ||
181 | } | ||
182 | }, | ||
183 | /* crb_rcvstatus_ring: */ | ||
184 | NETXEN_NIC_REG(0x130), | ||
185 | /* crb_rcv_status_producer: */ | ||
186 | NETXEN_NIC_REG(0x134), | ||
187 | /* crb_rcv_status_consumer: */ | ||
188 | NETXEN_NIC_REG(0x138), | ||
189 | /* crb_rcvpeg_state: */ | ||
190 | NETXEN_NIC_REG(0x13c), | ||
191 | /* crb_status_ring_size */ | ||
192 | NETXEN_NIC_REG(0x140), | ||
193 | |||
194 | }, | ||
195 | /* | ||
196 | * Instance 1, | ||
197 | */ | ||
198 | { | ||
199 | /* rcv_desc_crb: */ | ||
200 | { | ||
201 | { | ||
202 | /* crb_rcv_producer_offset: */ | ||
203 | NETXEN_NIC_REG(0x144), | ||
204 | /* crb_rcv_consumer_offset: */ | ||
205 | NETXEN_NIC_REG(0x148), | ||
206 | /* crb_globalrcv_ring: */ | ||
207 | NETXEN_NIC_REG(0x14c), | ||
208 | /* crb_rcv_ring_size */ | ||
209 | NETXEN_NIC_REG(0x150), | ||
210 | |||
211 | }, | ||
212 | /* Jumbo frames */ | ||
213 | { | ||
214 | /* crb_rcv_producer_offset: */ | ||
215 | NETXEN_NIC_REG(0x154), | ||
216 | /* crb_rcv_consumer_offset: */ | ||
217 | NETXEN_NIC_REG(0x158), | ||
218 | /* crb_globalrcv_ring: */ | ||
219 | NETXEN_NIC_REG(0x15c), | ||
220 | /* crb_rcv_ring_size */ | ||
221 | NETXEN_NIC_REG(0x160), | ||
222 | }, | ||
223 | /* LRO */ | ||
224 | { | ||
225 | /* crb_rcv_producer_offset: */ | ||
226 | NETXEN_NIC_REG(0x164), | ||
227 | /* crb_rcv_consumer_offset: */ | ||
228 | NETXEN_NIC_REG(0x168), | ||
229 | /* crb_globalrcv_ring: */ | ||
230 | NETXEN_NIC_REG(0x16c), | ||
231 | /* crb_rcv_ring_size */ | ||
232 | NETXEN_NIC_REG(0x170), | ||
233 | } | ||
234 | |||
235 | }, | ||
236 | /* crb_rcvstatus_ring: */ | ||
237 | NETXEN_NIC_REG(0x174), | ||
238 | /* crb_rcv_status_producer: */ | ||
239 | NETXEN_NIC_REG(0x178), | ||
240 | /* crb_rcv_status_consumer: */ | ||
241 | NETXEN_NIC_REG(0x17c), | ||
242 | /* crb_rcvpeg_state: */ | ||
243 | NETXEN_NIC_REG(0x180), | ||
244 | /* crb_status_ring_size */ | ||
245 | NETXEN_NIC_REG(0x184), | ||
246 | |||
247 | }, | ||
248 | }; | ||
249 | |||
250 | u64 ctx_addr_sig_regs[][3] = { | ||
251 | {NETXEN_NIC_REG(0x188), NETXEN_NIC_REG(0x18c), NETXEN_NIC_REG(0x1c0)}, | ||
252 | {NETXEN_NIC_REG(0x190), NETXEN_NIC_REG(0x194), NETXEN_NIC_REG(0x1c4)}, | ||
253 | {NETXEN_NIC_REG(0x198), NETXEN_NIC_REG(0x19c), NETXEN_NIC_REG(0x1c8)}, | ||
254 | {NETXEN_NIC_REG(0x1a0), NETXEN_NIC_REG(0x1a4), NETXEN_NIC_REG(0x1cc)} | ||
255 | }; | ||
256 | |||
257 | #else | 150 | #else |
258 | extern struct netxen_recv_crb recv_crb_registers[]; | 151 | extern struct netxen_recv_crb recv_crb_registers[]; |
259 | extern u64 ctx_addr_sig_regs[][3]; | 152 | extern u64 ctx_addr_sig_regs[][3]; |
153 | #endif /* DEFINE_GLOBAL_RECEIVE_CRB */ | ||
260 | #define CRB_CTX_ADDR_REG_LO (ctx_addr_sig_regs[0][0]) | 154 | #define CRB_CTX_ADDR_REG_LO (ctx_addr_sig_regs[0][0]) |
261 | #define CRB_CTX_ADDR_REG_HI (ctx_addr_sig_regs[0][2]) | 155 | #define CRB_CTX_ADDR_REG_HI (ctx_addr_sig_regs[0][2]) |
262 | #define CRB_CTX_SIGNATURE_REG (ctx_addr_sig_regs[0][1]) | 156 | #define CRB_CTX_SIGNATURE_REG (ctx_addr_sig_regs[0][1]) |
263 | #endif /* DEFINE_GLOBAL_RECEIVE_CRB */ | ||
264 | 157 | ||
265 | /* | 158 | /* |
266 | * Temperature control. | 159 | * Temperature control. |