diff options
Diffstat (limited to 'drivers/net/myri10ge/myri10ge.c')
-rw-r--r-- | drivers/net/myri10ge/myri10ge.c | 730 |
1 files changed, 413 insertions, 317 deletions
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index ef63c8d2bd7..c91b12ea26a 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -144,11 +144,13 @@ struct myri10ge_tx_buf { | |||
144 | char *req_bytes; | 144 | char *req_bytes; |
145 | struct myri10ge_tx_buffer_state *info; | 145 | struct myri10ge_tx_buffer_state *info; |
146 | int mask; /* number of transmit slots -1 */ | 146 | int mask; /* number of transmit slots -1 */ |
147 | int boundary; /* boundary transmits cannot cross */ | ||
148 | int req ____cacheline_aligned; /* transmit slots submitted */ | 147 | int req ____cacheline_aligned; /* transmit slots submitted */ |
149 | int pkt_start; /* packets started */ | 148 | int pkt_start; /* packets started */ |
149 | int stop_queue; | ||
150 | int linearized; | ||
150 | int done ____cacheline_aligned; /* transmit slots completed */ | 151 | int done ____cacheline_aligned; /* transmit slots completed */ |
151 | int pkt_done; /* packets completed */ | 152 | int pkt_done; /* packets completed */ |
153 | int wake_queue; | ||
152 | }; | 154 | }; |
153 | 155 | ||
154 | struct myri10ge_rx_done { | 156 | struct myri10ge_rx_done { |
@@ -160,29 +162,50 @@ struct myri10ge_rx_done { | |||
160 | struct net_lro_desc lro_desc[MYRI10GE_MAX_LRO_DESCRIPTORS]; | 162 | struct net_lro_desc lro_desc[MYRI10GE_MAX_LRO_DESCRIPTORS]; |
161 | }; | 163 | }; |
162 | 164 | ||
163 | struct myri10ge_priv { | 165 | struct myri10ge_slice_netstats { |
164 | int running; /* running? */ | 166 | unsigned long rx_packets; |
165 | int csum_flag; /* rx_csums? */ | 167 | unsigned long tx_packets; |
168 | unsigned long rx_bytes; | ||
169 | unsigned long tx_bytes; | ||
170 | unsigned long rx_dropped; | ||
171 | unsigned long tx_dropped; | ||
172 | }; | ||
173 | |||
174 | struct myri10ge_slice_state { | ||
166 | struct myri10ge_tx_buf tx; /* transmit ring */ | 175 | struct myri10ge_tx_buf tx; /* transmit ring */ |
167 | struct myri10ge_rx_buf rx_small; | 176 | struct myri10ge_rx_buf rx_small; |
168 | struct myri10ge_rx_buf rx_big; | 177 | struct myri10ge_rx_buf rx_big; |
169 | struct myri10ge_rx_done rx_done; | 178 | struct myri10ge_rx_done rx_done; |
179 | struct net_device *dev; | ||
180 | struct napi_struct napi; | ||
181 | struct myri10ge_priv *mgp; | ||
182 | struct myri10ge_slice_netstats stats; | ||
183 | __be32 __iomem *irq_claim; | ||
184 | struct mcp_irq_data *fw_stats; | ||
185 | dma_addr_t fw_stats_bus; | ||
186 | int watchdog_tx_done; | ||
187 | int watchdog_tx_req; | ||
188 | }; | ||
189 | |||
190 | struct myri10ge_priv { | ||
191 | struct myri10ge_slice_state ss; | ||
192 | int tx_boundary; /* boundary transmits cannot cross */ | ||
193 | int running; /* running? */ | ||
194 | int csum_flag; /* rx_csums? */ | ||
170 | int small_bytes; | 195 | int small_bytes; |
171 | int big_bytes; | 196 | int big_bytes; |
197 | int max_intr_slots; | ||
172 | struct net_device *dev; | 198 | struct net_device *dev; |
173 | struct napi_struct napi; | ||
174 | struct net_device_stats stats; | 199 | struct net_device_stats stats; |
200 | spinlock_t stats_lock; | ||
175 | u8 __iomem *sram; | 201 | u8 __iomem *sram; |
176 | int sram_size; | 202 | int sram_size; |
177 | unsigned long board_span; | 203 | unsigned long board_span; |
178 | unsigned long iomem_base; | 204 | unsigned long iomem_base; |
179 | __be32 __iomem *irq_claim; | ||
180 | __be32 __iomem *irq_deassert; | 205 | __be32 __iomem *irq_deassert; |
181 | char *mac_addr_string; | 206 | char *mac_addr_string; |
182 | struct mcp_cmd_response *cmd; | 207 | struct mcp_cmd_response *cmd; |
183 | dma_addr_t cmd_bus; | 208 | dma_addr_t cmd_bus; |
184 | struct mcp_irq_data *fw_stats; | ||
185 | dma_addr_t fw_stats_bus; | ||
186 | struct pci_dev *pdev; | 209 | struct pci_dev *pdev; |
187 | int msi_enabled; | 210 | int msi_enabled; |
188 | u32 link_state; | 211 | u32 link_state; |
@@ -191,20 +214,16 @@ struct myri10ge_priv { | |||
191 | __be32 __iomem *intr_coal_delay_ptr; | 214 | __be32 __iomem *intr_coal_delay_ptr; |
192 | int mtrr; | 215 | int mtrr; |
193 | int wc_enabled; | 216 | int wc_enabled; |
194 | int wake_queue; | ||
195 | int stop_queue; | ||
196 | int down_cnt; | 217 | int down_cnt; |
197 | wait_queue_head_t down_wq; | 218 | wait_queue_head_t down_wq; |
198 | struct work_struct watchdog_work; | 219 | struct work_struct watchdog_work; |
199 | struct timer_list watchdog_timer; | 220 | struct timer_list watchdog_timer; |
200 | int watchdog_tx_done; | ||
201 | int watchdog_tx_req; | ||
202 | int watchdog_pause; | ||
203 | int watchdog_resets; | 221 | int watchdog_resets; |
204 | int tx_linearized; | 222 | int watchdog_pause; |
205 | int pause; | 223 | int pause; |
206 | char *fw_name; | 224 | char *fw_name; |
207 | char eeprom_strings[MYRI10GE_EEPROM_STRINGS_SIZE]; | 225 | char eeprom_strings[MYRI10GE_EEPROM_STRINGS_SIZE]; |
226 | char *product_code_string; | ||
208 | char fw_version[128]; | 227 | char fw_version[128]; |
209 | int fw_ver_major; | 228 | int fw_ver_major; |
210 | int fw_ver_minor; | 229 | int fw_ver_minor; |
@@ -228,58 +247,54 @@ static char *myri10ge_fw_aligned = "myri10ge_eth_z8e.dat"; | |||
228 | 247 | ||
229 | static char *myri10ge_fw_name = NULL; | 248 | static char *myri10ge_fw_name = NULL; |
230 | module_param(myri10ge_fw_name, charp, S_IRUGO | S_IWUSR); | 249 | module_param(myri10ge_fw_name, charp, S_IRUGO | S_IWUSR); |
231 | MODULE_PARM_DESC(myri10ge_fw_name, "Firmware image name\n"); | 250 | MODULE_PARM_DESC(myri10ge_fw_name, "Firmware image name"); |
232 | 251 | ||
233 | static int myri10ge_ecrc_enable = 1; | 252 | static int myri10ge_ecrc_enable = 1; |
234 | module_param(myri10ge_ecrc_enable, int, S_IRUGO); | 253 | module_param(myri10ge_ecrc_enable, int, S_IRUGO); |
235 | MODULE_PARM_DESC(myri10ge_ecrc_enable, "Enable Extended CRC on PCI-E\n"); | 254 | MODULE_PARM_DESC(myri10ge_ecrc_enable, "Enable Extended CRC on PCI-E"); |
236 | |||
237 | static int myri10ge_max_intr_slots = 1024; | ||
238 | module_param(myri10ge_max_intr_slots, int, S_IRUGO); | ||
239 | MODULE_PARM_DESC(myri10ge_max_intr_slots, "Interrupt queue slots\n"); | ||
240 | 255 | ||
241 | static int myri10ge_small_bytes = -1; /* -1 == auto */ | 256 | static int myri10ge_small_bytes = -1; /* -1 == auto */ |
242 | module_param(myri10ge_small_bytes, int, S_IRUGO | S_IWUSR); | 257 | module_param(myri10ge_small_bytes, int, S_IRUGO | S_IWUSR); |
243 | MODULE_PARM_DESC(myri10ge_small_bytes, "Threshold of small packets\n"); | 258 | MODULE_PARM_DESC(myri10ge_small_bytes, "Threshold of small packets"); |
244 | 259 | ||
245 | static int myri10ge_msi = 1; /* enable msi by default */ | 260 | static int myri10ge_msi = 1; /* enable msi by default */ |
246 | module_param(myri10ge_msi, int, S_IRUGO | S_IWUSR); | 261 | module_param(myri10ge_msi, int, S_IRUGO | S_IWUSR); |
247 | MODULE_PARM_DESC(myri10ge_msi, "Enable Message Signalled Interrupts\n"); | 262 | MODULE_PARM_DESC(myri10ge_msi, "Enable Message Signalled Interrupts"); |
248 | 263 | ||
249 | static int myri10ge_intr_coal_delay = 75; | 264 | static int myri10ge_intr_coal_delay = 75; |
250 | module_param(myri10ge_intr_coal_delay, int, S_IRUGO); | 265 | module_param(myri10ge_intr_coal_delay, int, S_IRUGO); |
251 | MODULE_PARM_DESC(myri10ge_intr_coal_delay, "Interrupt coalescing delay\n"); | 266 | MODULE_PARM_DESC(myri10ge_intr_coal_delay, "Interrupt coalescing delay"); |
252 | 267 | ||
253 | static int myri10ge_flow_control = 1; | 268 | static int myri10ge_flow_control = 1; |
254 | module_param(myri10ge_flow_control, int, S_IRUGO); | 269 | module_param(myri10ge_flow_control, int, S_IRUGO); |
255 | MODULE_PARM_DESC(myri10ge_flow_control, "Pause parameter\n"); | 270 | MODULE_PARM_DESC(myri10ge_flow_control, "Pause parameter"); |
256 | 271 | ||
257 | static int myri10ge_deassert_wait = 1; | 272 | static int myri10ge_deassert_wait = 1; |
258 | module_param(myri10ge_deassert_wait, int, S_IRUGO | S_IWUSR); | 273 | module_param(myri10ge_deassert_wait, int, S_IRUGO | S_IWUSR); |
259 | MODULE_PARM_DESC(myri10ge_deassert_wait, | 274 | MODULE_PARM_DESC(myri10ge_deassert_wait, |
260 | "Wait when deasserting legacy interrupts\n"); | 275 | "Wait when deasserting legacy interrupts"); |
261 | 276 | ||
262 | static int myri10ge_force_firmware = 0; | 277 | static int myri10ge_force_firmware = 0; |
263 | module_param(myri10ge_force_firmware, int, S_IRUGO); | 278 | module_param(myri10ge_force_firmware, int, S_IRUGO); |
264 | MODULE_PARM_DESC(myri10ge_force_firmware, | 279 | MODULE_PARM_DESC(myri10ge_force_firmware, |
265 | "Force firmware to assume aligned completions\n"); | 280 | "Force firmware to assume aligned completions"); |
266 | 281 | ||
267 | static int myri10ge_initial_mtu = MYRI10GE_MAX_ETHER_MTU - ETH_HLEN; | 282 | static int myri10ge_initial_mtu = MYRI10GE_MAX_ETHER_MTU - ETH_HLEN; |
268 | module_param(myri10ge_initial_mtu, int, S_IRUGO); | 283 | module_param(myri10ge_initial_mtu, int, S_IRUGO); |
269 | MODULE_PARM_DESC(myri10ge_initial_mtu, "Initial MTU\n"); | 284 | MODULE_PARM_DESC(myri10ge_initial_mtu, "Initial MTU"); |
270 | 285 | ||
271 | static int myri10ge_napi_weight = 64; | 286 | static int myri10ge_napi_weight = 64; |
272 | module_param(myri10ge_napi_weight, int, S_IRUGO); | 287 | module_param(myri10ge_napi_weight, int, S_IRUGO); |
273 | MODULE_PARM_DESC(myri10ge_napi_weight, "Set NAPI weight\n"); | 288 | MODULE_PARM_DESC(myri10ge_napi_weight, "Set NAPI weight"); |
274 | 289 | ||
275 | static int myri10ge_watchdog_timeout = 1; | 290 | static int myri10ge_watchdog_timeout = 1; |
276 | module_param(myri10ge_watchdog_timeout, int, S_IRUGO); | 291 | module_param(myri10ge_watchdog_timeout, int, S_IRUGO); |
277 | MODULE_PARM_DESC(myri10ge_watchdog_timeout, "Set watchdog timeout\n"); | 292 | MODULE_PARM_DESC(myri10ge_watchdog_timeout, "Set watchdog timeout"); |
278 | 293 | ||
279 | static int myri10ge_max_irq_loops = 1048576; | 294 | static int myri10ge_max_irq_loops = 1048576; |
280 | module_param(myri10ge_max_irq_loops, int, S_IRUGO); | 295 | module_param(myri10ge_max_irq_loops, int, S_IRUGO); |
281 | MODULE_PARM_DESC(myri10ge_max_irq_loops, | 296 | MODULE_PARM_DESC(myri10ge_max_irq_loops, |
282 | "Set stuck legacy IRQ detection threshold\n"); | 297 | "Set stuck legacy IRQ detection threshold"); |
283 | 298 | ||
284 | #define MYRI10GE_MSG_DEFAULT NETIF_MSG_LINK | 299 | #define MYRI10GE_MSG_DEFAULT NETIF_MSG_LINK |
285 | 300 | ||
@@ -289,21 +304,22 @@ MODULE_PARM_DESC(myri10ge_debug, "Debug level (0=none,...,16=all)"); | |||
289 | 304 | ||
290 | static int myri10ge_lro = 1; | 305 | static int myri10ge_lro = 1; |
291 | module_param(myri10ge_lro, int, S_IRUGO); | 306 | module_param(myri10ge_lro, int, S_IRUGO); |
292 | MODULE_PARM_DESC(myri10ge_lro, "Enable large receive offload\n"); | 307 | MODULE_PARM_DESC(myri10ge_lro, "Enable large receive offload"); |
293 | 308 | ||
294 | static int myri10ge_lro_max_pkts = MYRI10GE_LRO_MAX_PKTS; | 309 | static int myri10ge_lro_max_pkts = MYRI10GE_LRO_MAX_PKTS; |
295 | module_param(myri10ge_lro_max_pkts, int, S_IRUGO); | 310 | module_param(myri10ge_lro_max_pkts, int, S_IRUGO); |
296 | MODULE_PARM_DESC(myri10ge_lro, "Number of LRO packets to be aggregated\n"); | 311 | MODULE_PARM_DESC(myri10ge_lro_max_pkts, |
312 | "Number of LRO packets to be aggregated"); | ||
297 | 313 | ||
298 | static int myri10ge_fill_thresh = 256; | 314 | static int myri10ge_fill_thresh = 256; |
299 | module_param(myri10ge_fill_thresh, int, S_IRUGO | S_IWUSR); | 315 | module_param(myri10ge_fill_thresh, int, S_IRUGO | S_IWUSR); |
300 | MODULE_PARM_DESC(myri10ge_fill_thresh, "Number of empty rx slots allowed\n"); | 316 | MODULE_PARM_DESC(myri10ge_fill_thresh, "Number of empty rx slots allowed"); |
301 | 317 | ||
302 | static int myri10ge_reset_recover = 1; | 318 | static int myri10ge_reset_recover = 1; |
303 | 319 | ||
304 | static int myri10ge_wcfifo = 0; | 320 | static int myri10ge_wcfifo = 0; |
305 | module_param(myri10ge_wcfifo, int, S_IRUGO); | 321 | module_param(myri10ge_wcfifo, int, S_IRUGO); |
306 | MODULE_PARM_DESC(myri10ge_wcfifo, "Enable WC Fifo when WC is enabled\n"); | 322 | MODULE_PARM_DESC(myri10ge_wcfifo, "Enable WC Fifo when WC is enabled"); |
307 | 323 | ||
308 | #define MYRI10GE_FW_OFFSET 1024*1024 | 324 | #define MYRI10GE_FW_OFFSET 1024*1024 |
309 | #define MYRI10GE_HIGHPART_TO_U32(X) \ | 325 | #define MYRI10GE_HIGHPART_TO_U32(X) \ |
@@ -359,8 +375,10 @@ myri10ge_send_cmd(struct myri10ge_priv *mgp, u32 cmd, | |||
359 | for (sleep_total = 0; | 375 | for (sleep_total = 0; |
360 | sleep_total < 1000 | 376 | sleep_total < 1000 |
361 | && response->result == htonl(MYRI10GE_NO_RESPONSE_RESULT); | 377 | && response->result == htonl(MYRI10GE_NO_RESPONSE_RESULT); |
362 | sleep_total += 10) | 378 | sleep_total += 10) { |
363 | udelay(10); | 379 | udelay(10); |
380 | mb(); | ||
381 | } | ||
364 | } else { | 382 | } else { |
365 | /* use msleep for most command */ | 383 | /* use msleep for most command */ |
366 | for (sleep_total = 0; | 384 | for (sleep_total = 0; |
@@ -420,6 +438,10 @@ static int myri10ge_read_mac_addr(struct myri10ge_priv *mgp) | |||
420 | ptr += 1; | 438 | ptr += 1; |
421 | } | 439 | } |
422 | } | 440 | } |
441 | if (memcmp(ptr, "PC=", 3) == 0) { | ||
442 | ptr += 3; | ||
443 | mgp->product_code_string = ptr; | ||
444 | } | ||
423 | if (memcmp((const void *)ptr, "SN=", 3) == 0) { | 445 | if (memcmp((const void *)ptr, "SN=", 3) == 0) { |
424 | ptr += 3; | 446 | ptr += 3; |
425 | mgp->serial_number = simple_strtoul(ptr, &ptr, 10); | 447 | mgp->serial_number = simple_strtoul(ptr, &ptr, 10); |
@@ -442,7 +464,7 @@ abort: | |||
442 | static void myri10ge_dummy_rdma(struct myri10ge_priv *mgp, int enable) | 464 | static void myri10ge_dummy_rdma(struct myri10ge_priv *mgp, int enable) |
443 | { | 465 | { |
444 | char __iomem *submit; | 466 | char __iomem *submit; |
445 | __be32 buf[16]; | 467 | __be32 buf[16] __attribute__ ((__aligned__(8))); |
446 | u32 dma_low, dma_high; | 468 | u32 dma_low, dma_high; |
447 | int i; | 469 | int i; |
448 | 470 | ||
@@ -609,13 +631,38 @@ static int myri10ge_adopt_running_firmware(struct myri10ge_priv *mgp) | |||
609 | return status; | 631 | return status; |
610 | } | 632 | } |
611 | 633 | ||
634 | int myri10ge_get_firmware_capabilities(struct myri10ge_priv *mgp) | ||
635 | { | ||
636 | struct myri10ge_cmd cmd; | ||
637 | int status; | ||
638 | |||
639 | /* probe for IPv6 TSO support */ | ||
640 | mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO; | ||
641 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, | ||
642 | &cmd, 0); | ||
643 | if (status == 0) { | ||
644 | mgp->max_tso6 = cmd.data0; | ||
645 | mgp->features |= NETIF_F_TSO6; | ||
646 | } | ||
647 | |||
648 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); | ||
649 | if (status != 0) { | ||
650 | dev_err(&mgp->pdev->dev, | ||
651 | "failed MXGEFW_CMD_GET_RX_RING_SIZE\n"); | ||
652 | return -ENXIO; | ||
653 | } | ||
654 | |||
655 | mgp->max_intr_slots = 2 * (cmd.data0 / sizeof(struct mcp_dma_addr)); | ||
656 | |||
657 | return 0; | ||
658 | } | ||
659 | |||
612 | static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | 660 | static int myri10ge_load_firmware(struct myri10ge_priv *mgp) |
613 | { | 661 | { |
614 | char __iomem *submit; | 662 | char __iomem *submit; |
615 | __be32 buf[16]; | 663 | __be32 buf[16] __attribute__ ((__aligned__(8))); |
616 | u32 dma_low, dma_high, size; | 664 | u32 dma_low, dma_high, size; |
617 | int status, i; | 665 | int status, i; |
618 | struct myri10ge_cmd cmd; | ||
619 | 666 | ||
620 | size = 0; | 667 | size = 0; |
621 | status = myri10ge_load_hotplug_firmware(mgp, &size); | 668 | status = myri10ge_load_hotplug_firmware(mgp, &size); |
@@ -635,7 +682,7 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
635 | } | 682 | } |
636 | dev_info(&mgp->pdev->dev, | 683 | dev_info(&mgp->pdev->dev, |
637 | "Successfully adopted running firmware\n"); | 684 | "Successfully adopted running firmware\n"); |
638 | if (mgp->tx.boundary == 4096) { | 685 | if (mgp->tx_boundary == 4096) { |
639 | dev_warn(&mgp->pdev->dev, | 686 | dev_warn(&mgp->pdev->dev, |
640 | "Using firmware currently running on NIC" | 687 | "Using firmware currently running on NIC" |
641 | ". For optimal\n"); | 688 | ". For optimal\n"); |
@@ -646,7 +693,9 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
646 | } | 693 | } |
647 | 694 | ||
648 | mgp->fw_name = "adopted"; | 695 | mgp->fw_name = "adopted"; |
649 | mgp->tx.boundary = 2048; | 696 | mgp->tx_boundary = 2048; |
697 | myri10ge_dummy_rdma(mgp, 1); | ||
698 | status = myri10ge_get_firmware_capabilities(mgp); | ||
650 | return status; | 699 | return status; |
651 | } | 700 | } |
652 | 701 | ||
@@ -681,26 +730,18 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
681 | msleep(1); | 730 | msleep(1); |
682 | mb(); | 731 | mb(); |
683 | i = 0; | 732 | i = 0; |
684 | while (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA && i < 20) { | 733 | while (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA && i < 9) { |
685 | msleep(1); | 734 | msleep(1 << i); |
686 | i++; | 735 | i++; |
687 | } | 736 | } |
688 | if (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA) { | 737 | if (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA) { |
689 | dev_err(&mgp->pdev->dev, "handoff failed\n"); | 738 | dev_err(&mgp->pdev->dev, "handoff failed\n"); |
690 | return -ENXIO; | 739 | return -ENXIO; |
691 | } | 740 | } |
692 | dev_info(&mgp->pdev->dev, "handoff confirmed\n"); | ||
693 | myri10ge_dummy_rdma(mgp, 1); | 741 | myri10ge_dummy_rdma(mgp, 1); |
742 | status = myri10ge_get_firmware_capabilities(mgp); | ||
694 | 743 | ||
695 | /* probe for IPv6 TSO support */ | 744 | return status; |
696 | mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO; | ||
697 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, | ||
698 | &cmd, 0); | ||
699 | if (status == 0) { | ||
700 | mgp->max_tso6 = cmd.data0; | ||
701 | mgp->features |= NETIF_F_TSO6; | ||
702 | } | ||
703 | return 0; | ||
704 | } | 745 | } |
705 | 746 | ||
706 | static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr) | 747 | static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr) |
@@ -772,7 +813,7 @@ static int myri10ge_dma_test(struct myri10ge_priv *mgp, int test_type) | |||
772 | * transfers took to complete. | 813 | * transfers took to complete. |
773 | */ | 814 | */ |
774 | 815 | ||
775 | len = mgp->tx.boundary; | 816 | len = mgp->tx_boundary; |
776 | 817 | ||
777 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus); | 818 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus); |
778 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus); | 819 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus); |
@@ -834,17 +875,17 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
834 | 875 | ||
835 | /* Now exchange information about interrupts */ | 876 | /* Now exchange information about interrupts */ |
836 | 877 | ||
837 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); | 878 | bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry); |
838 | memset(mgp->rx_done.entry, 0, bytes); | 879 | memset(mgp->ss.rx_done.entry, 0, bytes); |
839 | cmd.data0 = (u32) bytes; | 880 | cmd.data0 = (u32) bytes; |
840 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_SIZE, &cmd, 0); | 881 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_SIZE, &cmd, 0); |
841 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->rx_done.bus); | 882 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->ss.rx_done.bus); |
842 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->rx_done.bus); | 883 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->ss.rx_done.bus); |
843 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_DMA, &cmd, 0); | 884 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_DMA, &cmd, 0); |
844 | 885 | ||
845 | status |= | 886 | status |= |
846 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_ACK_OFFSET, &cmd, 0); | 887 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_ACK_OFFSET, &cmd, 0); |
847 | mgp->irq_claim = (__iomem __be32 *) (mgp->sram + cmd.data0); | 888 | mgp->ss.irq_claim = (__iomem __be32 *) (mgp->sram + cmd.data0); |
848 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET, | 889 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET, |
849 | &cmd, 0); | 890 | &cmd, 0); |
850 | mgp->irq_deassert = (__iomem __be32 *) (mgp->sram + cmd.data0); | 891 | mgp->irq_deassert = (__iomem __be32 *) (mgp->sram + cmd.data0); |
@@ -858,17 +899,17 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
858 | } | 899 | } |
859 | put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr); | 900 | put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr); |
860 | 901 | ||
861 | memset(mgp->rx_done.entry, 0, bytes); | 902 | memset(mgp->ss.rx_done.entry, 0, bytes); |
862 | 903 | ||
863 | /* reset mcp/driver shared state back to 0 */ | 904 | /* reset mcp/driver shared state back to 0 */ |
864 | mgp->tx.req = 0; | 905 | mgp->ss.tx.req = 0; |
865 | mgp->tx.done = 0; | 906 | mgp->ss.tx.done = 0; |
866 | mgp->tx.pkt_start = 0; | 907 | mgp->ss.tx.pkt_start = 0; |
867 | mgp->tx.pkt_done = 0; | 908 | mgp->ss.tx.pkt_done = 0; |
868 | mgp->rx_big.cnt = 0; | 909 | mgp->ss.rx_big.cnt = 0; |
869 | mgp->rx_small.cnt = 0; | 910 | mgp->ss.rx_small.cnt = 0; |
870 | mgp->rx_done.idx = 0; | 911 | mgp->ss.rx_done.idx = 0; |
871 | mgp->rx_done.cnt = 0; | 912 | mgp->ss.rx_done.cnt = 0; |
872 | mgp->link_changes = 0; | 913 | mgp->link_changes = 0; |
873 | status = myri10ge_update_mac_address(mgp, mgp->dev->dev_addr); | 914 | status = myri10ge_update_mac_address(mgp, mgp->dev->dev_addr); |
874 | myri10ge_change_pause(mgp, mgp->pause); | 915 | myri10ge_change_pause(mgp, mgp->pause); |
@@ -1020,9 +1061,10 @@ myri10ge_unmap_rx_page(struct pci_dev *pdev, | |||
1020 | * page into an skb */ | 1061 | * page into an skb */ |
1021 | 1062 | ||
1022 | static inline int | 1063 | static inline int |
1023 | myri10ge_rx_done(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx, | 1064 | myri10ge_rx_done(struct myri10ge_slice_state *ss, struct myri10ge_rx_buf *rx, |
1024 | int bytes, int len, __wsum csum) | 1065 | int bytes, int len, __wsum csum) |
1025 | { | 1066 | { |
1067 | struct myri10ge_priv *mgp = ss->mgp; | ||
1026 | struct sk_buff *skb; | 1068 | struct sk_buff *skb; |
1027 | struct skb_frag_struct rx_frags[MYRI10GE_MAX_FRAGS_PER_FRAME]; | 1069 | struct skb_frag_struct rx_frags[MYRI10GE_MAX_FRAGS_PER_FRAME]; |
1028 | int i, idx, hlen, remainder; | 1070 | int i, idx, hlen, remainder; |
@@ -1052,11 +1094,10 @@ myri10ge_rx_done(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx, | |||
1052 | rx_frags[0].page_offset += MXGEFW_PAD; | 1094 | rx_frags[0].page_offset += MXGEFW_PAD; |
1053 | rx_frags[0].size -= MXGEFW_PAD; | 1095 | rx_frags[0].size -= MXGEFW_PAD; |
1054 | len -= MXGEFW_PAD; | 1096 | len -= MXGEFW_PAD; |
1055 | lro_receive_frags(&mgp->rx_done.lro_mgr, rx_frags, | 1097 | lro_receive_frags(&ss->rx_done.lro_mgr, rx_frags, |
1056 | len, len, | 1098 | len, len, |
1057 | /* opaque, will come back in get_frag_header */ | 1099 | /* opaque, will come back in get_frag_header */ |
1058 | (void *)(__force unsigned long)csum, | 1100 | (void *)(__force unsigned long)csum, csum); |
1059 | csum); | ||
1060 | return 1; | 1101 | return 1; |
1061 | } | 1102 | } |
1062 | 1103 | ||
@@ -1096,10 +1137,11 @@ myri10ge_rx_done(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx, | |||
1096 | return 1; | 1137 | return 1; |
1097 | } | 1138 | } |
1098 | 1139 | ||
1099 | static inline void myri10ge_tx_done(struct myri10ge_priv *mgp, int mcp_index) | 1140 | static inline void |
1141 | myri10ge_tx_done(struct myri10ge_slice_state *ss, int mcp_index) | ||
1100 | { | 1142 | { |
1101 | struct pci_dev *pdev = mgp->pdev; | 1143 | struct pci_dev *pdev = ss->mgp->pdev; |
1102 | struct myri10ge_tx_buf *tx = &mgp->tx; | 1144 | struct myri10ge_tx_buf *tx = &ss->tx; |
1103 | struct sk_buff *skb; | 1145 | struct sk_buff *skb; |
1104 | int idx, len; | 1146 | int idx, len; |
1105 | 1147 | ||
@@ -1117,8 +1159,8 @@ static inline void myri10ge_tx_done(struct myri10ge_priv *mgp, int mcp_index) | |||
1117 | len = pci_unmap_len(&tx->info[idx], len); | 1159 | len = pci_unmap_len(&tx->info[idx], len); |
1118 | pci_unmap_len_set(&tx->info[idx], len, 0); | 1160 | pci_unmap_len_set(&tx->info[idx], len, 0); |
1119 | if (skb) { | 1161 | if (skb) { |
1120 | mgp->stats.tx_bytes += skb->len; | 1162 | ss->stats.tx_bytes += skb->len; |
1121 | mgp->stats.tx_packets++; | 1163 | ss->stats.tx_packets++; |
1122 | dev_kfree_skb_irq(skb); | 1164 | dev_kfree_skb_irq(skb); |
1123 | if (len) | 1165 | if (len) |
1124 | pci_unmap_single(pdev, | 1166 | pci_unmap_single(pdev, |
@@ -1134,16 +1176,18 @@ static inline void myri10ge_tx_done(struct myri10ge_priv *mgp, int mcp_index) | |||
1134 | } | 1176 | } |
1135 | } | 1177 | } |
1136 | /* start the queue if we've stopped it */ | 1178 | /* start the queue if we've stopped it */ |
1137 | if (netif_queue_stopped(mgp->dev) | 1179 | if (netif_queue_stopped(ss->dev) |
1138 | && tx->req - tx->done < (tx->mask >> 1)) { | 1180 | && tx->req - tx->done < (tx->mask >> 1)) { |
1139 | mgp->wake_queue++; | 1181 | tx->wake_queue++; |
1140 | netif_wake_queue(mgp->dev); | 1182 | netif_wake_queue(ss->dev); |
1141 | } | 1183 | } |
1142 | } | 1184 | } |
1143 | 1185 | ||
1144 | static inline int myri10ge_clean_rx_done(struct myri10ge_priv *mgp, int budget) | 1186 | static inline int |
1187 | myri10ge_clean_rx_done(struct myri10ge_slice_state *ss, int budget) | ||
1145 | { | 1188 | { |
1146 | struct myri10ge_rx_done *rx_done = &mgp->rx_done; | 1189 | struct myri10ge_rx_done *rx_done = &ss->rx_done; |
1190 | struct myri10ge_priv *mgp = ss->mgp; | ||
1147 | unsigned long rx_bytes = 0; | 1191 | unsigned long rx_bytes = 0; |
1148 | unsigned long rx_packets = 0; | 1192 | unsigned long rx_packets = 0; |
1149 | unsigned long rx_ok; | 1193 | unsigned long rx_ok; |
@@ -1159,40 +1203,40 @@ static inline int myri10ge_clean_rx_done(struct myri10ge_priv *mgp, int budget) | |||
1159 | rx_done->entry[idx].length = 0; | 1203 | rx_done->entry[idx].length = 0; |
1160 | checksum = csum_unfold(rx_done->entry[idx].checksum); | 1204 | checksum = csum_unfold(rx_done->entry[idx].checksum); |
1161 | if (length <= mgp->small_bytes) | 1205 | if (length <= mgp->small_bytes) |
1162 | rx_ok = myri10ge_rx_done(mgp, &mgp->rx_small, | 1206 | rx_ok = myri10ge_rx_done(ss, &ss->rx_small, |
1163 | mgp->small_bytes, | 1207 | mgp->small_bytes, |
1164 | length, checksum); | 1208 | length, checksum); |
1165 | else | 1209 | else |
1166 | rx_ok = myri10ge_rx_done(mgp, &mgp->rx_big, | 1210 | rx_ok = myri10ge_rx_done(ss, &ss->rx_big, |
1167 | mgp->big_bytes, | 1211 | mgp->big_bytes, |
1168 | length, checksum); | 1212 | length, checksum); |
1169 | rx_packets += rx_ok; | 1213 | rx_packets += rx_ok; |
1170 | rx_bytes += rx_ok * (unsigned long)length; | 1214 | rx_bytes += rx_ok * (unsigned long)length; |
1171 | cnt++; | 1215 | cnt++; |
1172 | idx = cnt & (myri10ge_max_intr_slots - 1); | 1216 | idx = cnt & (mgp->max_intr_slots - 1); |
1173 | work_done++; | 1217 | work_done++; |
1174 | } | 1218 | } |
1175 | rx_done->idx = idx; | 1219 | rx_done->idx = idx; |
1176 | rx_done->cnt = cnt; | 1220 | rx_done->cnt = cnt; |
1177 | mgp->stats.rx_packets += rx_packets; | 1221 | ss->stats.rx_packets += rx_packets; |
1178 | mgp->stats.rx_bytes += rx_bytes; | 1222 | ss->stats.rx_bytes += rx_bytes; |
1179 | 1223 | ||
1180 | if (myri10ge_lro) | 1224 | if (myri10ge_lro) |
1181 | lro_flush_all(&rx_done->lro_mgr); | 1225 | lro_flush_all(&rx_done->lro_mgr); |
1182 | 1226 | ||
1183 | /* restock receive rings if needed */ | 1227 | /* restock receive rings if needed */ |
1184 | if (mgp->rx_small.fill_cnt - mgp->rx_small.cnt < myri10ge_fill_thresh) | 1228 | if (ss->rx_small.fill_cnt - ss->rx_small.cnt < myri10ge_fill_thresh) |
1185 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_small, | 1229 | myri10ge_alloc_rx_pages(mgp, &ss->rx_small, |
1186 | mgp->small_bytes + MXGEFW_PAD, 0); | 1230 | mgp->small_bytes + MXGEFW_PAD, 0); |
1187 | if (mgp->rx_big.fill_cnt - mgp->rx_big.cnt < myri10ge_fill_thresh) | 1231 | if (ss->rx_big.fill_cnt - ss->rx_big.cnt < myri10ge_fill_thresh) |
1188 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_big, mgp->big_bytes, 0); | 1232 | myri10ge_alloc_rx_pages(mgp, &ss->rx_big, mgp->big_bytes, 0); |
1189 | 1233 | ||
1190 | return work_done; | 1234 | return work_done; |
1191 | } | 1235 | } |
1192 | 1236 | ||
1193 | static inline void myri10ge_check_statblock(struct myri10ge_priv *mgp) | 1237 | static inline void myri10ge_check_statblock(struct myri10ge_priv *mgp) |
1194 | { | 1238 | { |
1195 | struct mcp_irq_data *stats = mgp->fw_stats; | 1239 | struct mcp_irq_data *stats = mgp->ss.fw_stats; |
1196 | 1240 | ||
1197 | if (unlikely(stats->stats_updated)) { | 1241 | if (unlikely(stats->stats_updated)) { |
1198 | unsigned link_up = ntohl(stats->link_up); | 1242 | unsigned link_up = ntohl(stats->link_up); |
@@ -1219,9 +1263,9 @@ static inline void myri10ge_check_statblock(struct myri10ge_priv *mgp) | |||
1219 | } | 1263 | } |
1220 | } | 1264 | } |
1221 | if (mgp->rdma_tags_available != | 1265 | if (mgp->rdma_tags_available != |
1222 | ntohl(mgp->fw_stats->rdma_tags_available)) { | 1266 | ntohl(stats->rdma_tags_available)) { |
1223 | mgp->rdma_tags_available = | 1267 | mgp->rdma_tags_available = |
1224 | ntohl(mgp->fw_stats->rdma_tags_available); | 1268 | ntohl(stats->rdma_tags_available); |
1225 | printk(KERN_WARNING "myri10ge: %s: RDMA timed out! " | 1269 | printk(KERN_WARNING "myri10ge: %s: RDMA timed out! " |
1226 | "%d tags left\n", mgp->dev->name, | 1270 | "%d tags left\n", mgp->dev->name, |
1227 | mgp->rdma_tags_available); | 1271 | mgp->rdma_tags_available); |
@@ -1234,26 +1278,27 @@ static inline void myri10ge_check_statblock(struct myri10ge_priv *mgp) | |||
1234 | 1278 | ||
1235 | static int myri10ge_poll(struct napi_struct *napi, int budget) | 1279 | static int myri10ge_poll(struct napi_struct *napi, int budget) |
1236 | { | 1280 | { |
1237 | struct myri10ge_priv *mgp = | 1281 | struct myri10ge_slice_state *ss = |
1238 | container_of(napi, struct myri10ge_priv, napi); | 1282 | container_of(napi, struct myri10ge_slice_state, napi); |
1239 | struct net_device *netdev = mgp->dev; | 1283 | struct net_device *netdev = ss->mgp->dev; |
1240 | int work_done; | 1284 | int work_done; |
1241 | 1285 | ||
1242 | /* process as many rx events as NAPI will allow */ | 1286 | /* process as many rx events as NAPI will allow */ |
1243 | work_done = myri10ge_clean_rx_done(mgp, budget); | 1287 | work_done = myri10ge_clean_rx_done(ss, budget); |
1244 | 1288 | ||
1245 | if (work_done < budget) { | 1289 | if (work_done < budget) { |
1246 | netif_rx_complete(netdev, napi); | 1290 | netif_rx_complete(netdev, napi); |
1247 | put_be32(htonl(3), mgp->irq_claim); | 1291 | put_be32(htonl(3), ss->irq_claim); |
1248 | } | 1292 | } |
1249 | return work_done; | 1293 | return work_done; |
1250 | } | 1294 | } |
1251 | 1295 | ||
1252 | static irqreturn_t myri10ge_intr(int irq, void *arg) | 1296 | static irqreturn_t myri10ge_intr(int irq, void *arg) |
1253 | { | 1297 | { |
1254 | struct myri10ge_priv *mgp = arg; | 1298 | struct myri10ge_slice_state *ss = arg; |
1255 | struct mcp_irq_data *stats = mgp->fw_stats; | 1299 | struct myri10ge_priv *mgp = ss->mgp; |
1256 | struct myri10ge_tx_buf *tx = &mgp->tx; | 1300 | struct mcp_irq_data *stats = ss->fw_stats; |
1301 | struct myri10ge_tx_buf *tx = &ss->tx; | ||
1257 | u32 send_done_count; | 1302 | u32 send_done_count; |
1258 | int i; | 1303 | int i; |
1259 | 1304 | ||
@@ -1264,7 +1309,7 @@ static irqreturn_t myri10ge_intr(int irq, void *arg) | |||
1264 | /* low bit indicates receives are present, so schedule | 1309 | /* low bit indicates receives are present, so schedule |
1265 | * napi poll handler */ | 1310 | * napi poll handler */ |
1266 | if (stats->valid & 1) | 1311 | if (stats->valid & 1) |
1267 | netif_rx_schedule(mgp->dev, &mgp->napi); | 1312 | netif_rx_schedule(ss->dev, &ss->napi); |
1268 | 1313 | ||
1269 | if (!mgp->msi_enabled) { | 1314 | if (!mgp->msi_enabled) { |
1270 | put_be32(0, mgp->irq_deassert); | 1315 | put_be32(0, mgp->irq_deassert); |
@@ -1281,7 +1326,7 @@ static irqreturn_t myri10ge_intr(int irq, void *arg) | |||
1281 | /* check for transmit completes and receives */ | 1326 | /* check for transmit completes and receives */ |
1282 | send_done_count = ntohl(stats->send_done_count); | 1327 | send_done_count = ntohl(stats->send_done_count); |
1283 | if (send_done_count != tx->pkt_done) | 1328 | if (send_done_count != tx->pkt_done) |
1284 | myri10ge_tx_done(mgp, (int)send_done_count); | 1329 | myri10ge_tx_done(ss, (int)send_done_count); |
1285 | if (unlikely(i > myri10ge_max_irq_loops)) { | 1330 | if (unlikely(i > myri10ge_max_irq_loops)) { |
1286 | printk(KERN_WARNING "myri10ge: %s: irq stuck?\n", | 1331 | printk(KERN_WARNING "myri10ge: %s: irq stuck?\n", |
1287 | mgp->dev->name); | 1332 | mgp->dev->name); |
@@ -1296,16 +1341,46 @@ static irqreturn_t myri10ge_intr(int irq, void *arg) | |||
1296 | 1341 | ||
1297 | myri10ge_check_statblock(mgp); | 1342 | myri10ge_check_statblock(mgp); |
1298 | 1343 | ||
1299 | put_be32(htonl(3), mgp->irq_claim + 1); | 1344 | put_be32(htonl(3), ss->irq_claim + 1); |
1300 | return (IRQ_HANDLED); | 1345 | return (IRQ_HANDLED); |
1301 | } | 1346 | } |
1302 | 1347 | ||
1303 | static int | 1348 | static int |
1304 | myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) | 1349 | myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) |
1305 | { | 1350 | { |
1351 | struct myri10ge_priv *mgp = netdev_priv(netdev); | ||
1352 | char *ptr; | ||
1353 | int i; | ||
1354 | |||
1306 | cmd->autoneg = AUTONEG_DISABLE; | 1355 | cmd->autoneg = AUTONEG_DISABLE; |
1307 | cmd->speed = SPEED_10000; | 1356 | cmd->speed = SPEED_10000; |
1308 | cmd->duplex = DUPLEX_FULL; | 1357 | cmd->duplex = DUPLEX_FULL; |
1358 | |||
1359 | /* | ||
1360 | * parse the product code to deterimine the interface type | ||
1361 | * (CX4, XFP, Quad Ribbon Fiber) by looking at the character | ||
1362 | * after the 3rd dash in the driver's cached copy of the | ||
1363 | * EEPROM's product code string. | ||
1364 | */ | ||
1365 | ptr = mgp->product_code_string; | ||
1366 | if (ptr == NULL) { | ||
1367 | printk(KERN_ERR "myri10ge: %s: Missing product code\n", | ||
1368 | netdev->name); | ||
1369 | return 0; | ||
1370 | } | ||
1371 | for (i = 0; i < 3; i++, ptr++) { | ||
1372 | ptr = strchr(ptr, '-'); | ||
1373 | if (ptr == NULL) { | ||
1374 | printk(KERN_ERR "myri10ge: %s: Invalid product " | ||
1375 | "code %s\n", netdev->name, | ||
1376 | mgp->product_code_string); | ||
1377 | return 0; | ||
1378 | } | ||
1379 | } | ||
1380 | if (*ptr == 'R' || *ptr == 'Q') { | ||
1381 | /* We've found either an XFP or quad ribbon fiber */ | ||
1382 | cmd->port = PORT_FIBRE; | ||
1383 | } | ||
1309 | return 0; | 1384 | return 0; |
1310 | } | 1385 | } |
1311 | 1386 | ||
@@ -1324,6 +1399,7 @@ static int | |||
1324 | myri10ge_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coal) | 1399 | myri10ge_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coal) |
1325 | { | 1400 | { |
1326 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1401 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1402 | |||
1327 | coal->rx_coalesce_usecs = mgp->intr_coal_delay; | 1403 | coal->rx_coalesce_usecs = mgp->intr_coal_delay; |
1328 | return 0; | 1404 | return 0; |
1329 | } | 1405 | } |
@@ -1370,10 +1446,10 @@ myri10ge_get_ringparam(struct net_device *netdev, | |||
1370 | { | 1446 | { |
1371 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1447 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1372 | 1448 | ||
1373 | ring->rx_mini_max_pending = mgp->rx_small.mask + 1; | 1449 | ring->rx_mini_max_pending = mgp->ss.rx_small.mask + 1; |
1374 | ring->rx_max_pending = mgp->rx_big.mask + 1; | 1450 | ring->rx_max_pending = mgp->ss.rx_big.mask + 1; |
1375 | ring->rx_jumbo_max_pending = 0; | 1451 | ring->rx_jumbo_max_pending = 0; |
1376 | ring->tx_max_pending = mgp->rx_small.mask + 1; | 1452 | ring->tx_max_pending = mgp->ss.rx_small.mask + 1; |
1377 | ring->rx_mini_pending = ring->rx_mini_max_pending; | 1453 | ring->rx_mini_pending = ring->rx_mini_max_pending; |
1378 | ring->rx_pending = ring->rx_max_pending; | 1454 | ring->rx_pending = ring->rx_max_pending; |
1379 | ring->rx_jumbo_pending = ring->rx_jumbo_max_pending; | 1455 | ring->rx_jumbo_pending = ring->rx_jumbo_max_pending; |
@@ -1383,6 +1459,7 @@ myri10ge_get_ringparam(struct net_device *netdev, | |||
1383 | static u32 myri10ge_get_rx_csum(struct net_device *netdev) | 1459 | static u32 myri10ge_get_rx_csum(struct net_device *netdev) |
1384 | { | 1460 | { |
1385 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1461 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1462 | |||
1386 | if (mgp->csum_flag) | 1463 | if (mgp->csum_flag) |
1387 | return 1; | 1464 | return 1; |
1388 | else | 1465 | else |
@@ -1392,6 +1469,7 @@ static u32 myri10ge_get_rx_csum(struct net_device *netdev) | |||
1392 | static int myri10ge_set_rx_csum(struct net_device *netdev, u32 csum_enabled) | 1469 | static int myri10ge_set_rx_csum(struct net_device *netdev, u32 csum_enabled) |
1393 | { | 1470 | { |
1394 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1471 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1472 | |||
1395 | if (csum_enabled) | 1473 | if (csum_enabled) |
1396 | mgp->csum_flag = MXGEFW_FLAGS_CKSUM; | 1474 | mgp->csum_flag = MXGEFW_FLAGS_CKSUM; |
1397 | else | 1475 | else |
@@ -1411,7 +1489,7 @@ static int myri10ge_set_tso(struct net_device *netdev, u32 tso_enabled) | |||
1411 | return 0; | 1489 | return 0; |
1412 | } | 1490 | } |
1413 | 1491 | ||
1414 | static const char myri10ge_gstrings_stats[][ETH_GSTRING_LEN] = { | 1492 | static const char myri10ge_gstrings_main_stats[][ETH_GSTRING_LEN] = { |
1415 | "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors", | 1493 | "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors", |
1416 | "tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions", | 1494 | "tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions", |
1417 | "rx_length_errors", "rx_over_errors", "rx_crc_errors", | 1495 | "rx_length_errors", "rx_over_errors", "rx_crc_errors", |
@@ -1421,28 +1499,39 @@ static const char myri10ge_gstrings_stats[][ETH_GSTRING_LEN] = { | |||
1421 | /* device-specific stats */ | 1499 | /* device-specific stats */ |
1422 | "tx_boundary", "WC", "irq", "MSI", | 1500 | "tx_boundary", "WC", "irq", "MSI", |
1423 | "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", | 1501 | "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", |
1424 | "serial_number", "tx_pkt_start", "tx_pkt_done", | 1502 | "serial_number", "watchdog_resets", |
1425 | "tx_req", "tx_done", "rx_small_cnt", "rx_big_cnt", | ||
1426 | "wake_queue", "stop_queue", "watchdog_resets", "tx_linearized", | ||
1427 | "link_changes", "link_up", "dropped_link_overflow", | 1503 | "link_changes", "link_up", "dropped_link_overflow", |
1428 | "dropped_link_error_or_filtered", | 1504 | "dropped_link_error_or_filtered", |
1429 | "dropped_pause", "dropped_bad_phy", "dropped_bad_crc32", | 1505 | "dropped_pause", "dropped_bad_phy", "dropped_bad_crc32", |
1430 | "dropped_unicast_filtered", "dropped_multicast_filtered", | 1506 | "dropped_unicast_filtered", "dropped_multicast_filtered", |
1431 | "dropped_runt", "dropped_overrun", "dropped_no_small_buffer", | 1507 | "dropped_runt", "dropped_overrun", "dropped_no_small_buffer", |
1432 | "dropped_no_big_buffer", "LRO aggregated", "LRO flushed", | 1508 | "dropped_no_big_buffer" |
1509 | }; | ||
1510 | |||
1511 | static const char myri10ge_gstrings_slice_stats[][ETH_GSTRING_LEN] = { | ||
1512 | "----------- slice ---------", | ||
1513 | "tx_pkt_start", "tx_pkt_done", "tx_req", "tx_done", | ||
1514 | "rx_small_cnt", "rx_big_cnt", | ||
1515 | "wake_queue", "stop_queue", "tx_linearized", "LRO aggregated", | ||
1516 | "LRO flushed", | ||
1433 | "LRO avg aggr", "LRO no_desc" | 1517 | "LRO avg aggr", "LRO no_desc" |
1434 | }; | 1518 | }; |
1435 | 1519 | ||
1436 | #define MYRI10GE_NET_STATS_LEN 21 | 1520 | #define MYRI10GE_NET_STATS_LEN 21 |
1437 | #define MYRI10GE_STATS_LEN ARRAY_SIZE(myri10ge_gstrings_stats) | 1521 | #define MYRI10GE_MAIN_STATS_LEN ARRAY_SIZE(myri10ge_gstrings_main_stats) |
1522 | #define MYRI10GE_SLICE_STATS_LEN ARRAY_SIZE(myri10ge_gstrings_slice_stats) | ||
1438 | 1523 | ||
1439 | static void | 1524 | static void |
1440 | myri10ge_get_strings(struct net_device *netdev, u32 stringset, u8 * data) | 1525 | myri10ge_get_strings(struct net_device *netdev, u32 stringset, u8 * data) |
1441 | { | 1526 | { |
1442 | switch (stringset) { | 1527 | switch (stringset) { |
1443 | case ETH_SS_STATS: | 1528 | case ETH_SS_STATS: |
1444 | memcpy(data, *myri10ge_gstrings_stats, | 1529 | memcpy(data, *myri10ge_gstrings_main_stats, |
1445 | sizeof(myri10ge_gstrings_stats)); | 1530 | sizeof(myri10ge_gstrings_main_stats)); |
1531 | data += sizeof(myri10ge_gstrings_main_stats); | ||
1532 | memcpy(data, *myri10ge_gstrings_slice_stats, | ||
1533 | sizeof(myri10ge_gstrings_slice_stats)); | ||
1534 | data += sizeof(myri10ge_gstrings_slice_stats); | ||
1446 | break; | 1535 | break; |
1447 | } | 1536 | } |
1448 | } | 1537 | } |
@@ -1451,7 +1540,7 @@ static int myri10ge_get_sset_count(struct net_device *netdev, int sset) | |||
1451 | { | 1540 | { |
1452 | switch (sset) { | 1541 | switch (sset) { |
1453 | case ETH_SS_STATS: | 1542 | case ETH_SS_STATS: |
1454 | return MYRI10GE_STATS_LEN; | 1543 | return MYRI10GE_MAIN_STATS_LEN + MYRI10GE_SLICE_STATS_LEN; |
1455 | default: | 1544 | default: |
1456 | return -EOPNOTSUPP; | 1545 | return -EOPNOTSUPP; |
1457 | } | 1546 | } |
@@ -1462,12 +1551,13 @@ myri10ge_get_ethtool_stats(struct net_device *netdev, | |||
1462 | struct ethtool_stats *stats, u64 * data) | 1551 | struct ethtool_stats *stats, u64 * data) |
1463 | { | 1552 | { |
1464 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1553 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1554 | struct myri10ge_slice_state *ss; | ||
1465 | int i; | 1555 | int i; |
1466 | 1556 | ||
1467 | for (i = 0; i < MYRI10GE_NET_STATS_LEN; i++) | 1557 | for (i = 0; i < MYRI10GE_NET_STATS_LEN; i++) |
1468 | data[i] = ((unsigned long *)&mgp->stats)[i]; | 1558 | data[i] = ((unsigned long *)&mgp->stats)[i]; |
1469 | 1559 | ||
1470 | data[i++] = (unsigned int)mgp->tx.boundary; | 1560 | data[i++] = (unsigned int)mgp->tx_boundary; |
1471 | data[i++] = (unsigned int)mgp->wc_enabled; | 1561 | data[i++] = (unsigned int)mgp->wc_enabled; |
1472 | data[i++] = (unsigned int)mgp->pdev->irq; | 1562 | data[i++] = (unsigned int)mgp->pdev->irq; |
1473 | data[i++] = (unsigned int)mgp->msi_enabled; | 1563 | data[i++] = (unsigned int)mgp->msi_enabled; |
@@ -1475,40 +1565,44 @@ myri10ge_get_ethtool_stats(struct net_device *netdev, | |||
1475 | data[i++] = (unsigned int)mgp->write_dma; | 1565 | data[i++] = (unsigned int)mgp->write_dma; |
1476 | data[i++] = (unsigned int)mgp->read_write_dma; | 1566 | data[i++] = (unsigned int)mgp->read_write_dma; |
1477 | data[i++] = (unsigned int)mgp->serial_number; | 1567 | data[i++] = (unsigned int)mgp->serial_number; |
1478 | data[i++] = (unsigned int)mgp->tx.pkt_start; | ||
1479 | data[i++] = (unsigned int)mgp->tx.pkt_done; | ||
1480 | data[i++] = (unsigned int)mgp->tx.req; | ||
1481 | data[i++] = (unsigned int)mgp->tx.done; | ||
1482 | data[i++] = (unsigned int)mgp->rx_small.cnt; | ||
1483 | data[i++] = (unsigned int)mgp->rx_big.cnt; | ||
1484 | data[i++] = (unsigned int)mgp->wake_queue; | ||
1485 | data[i++] = (unsigned int)mgp->stop_queue; | ||
1486 | data[i++] = (unsigned int)mgp->watchdog_resets; | 1568 | data[i++] = (unsigned int)mgp->watchdog_resets; |
1487 | data[i++] = (unsigned int)mgp->tx_linearized; | ||
1488 | data[i++] = (unsigned int)mgp->link_changes; | 1569 | data[i++] = (unsigned int)mgp->link_changes; |
1489 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->link_up); | 1570 | |
1490 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_link_overflow); | 1571 | /* firmware stats are useful only in the first slice */ |
1491 | data[i++] = | 1572 | ss = &mgp->ss; |
1492 | (unsigned int)ntohl(mgp->fw_stats->dropped_link_error_or_filtered); | 1573 | data[i++] = (unsigned int)ntohl(ss->fw_stats->link_up); |
1493 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_pause); | 1574 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_link_overflow); |
1494 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_bad_phy); | ||
1495 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_bad_crc32); | ||
1496 | data[i++] = | 1575 | data[i++] = |
1497 | (unsigned int)ntohl(mgp->fw_stats->dropped_unicast_filtered); | 1576 | (unsigned int)ntohl(ss->fw_stats->dropped_link_error_or_filtered); |
1577 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_pause); | ||
1578 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_bad_phy); | ||
1579 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_bad_crc32); | ||
1580 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_unicast_filtered); | ||
1498 | data[i++] = | 1581 | data[i++] = |
1499 | (unsigned int)ntohl(mgp->fw_stats->dropped_multicast_filtered); | 1582 | (unsigned int)ntohl(ss->fw_stats->dropped_multicast_filtered); |
1500 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_runt); | 1583 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_runt); |
1501 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_overrun); | 1584 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_overrun); |
1502 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_no_small_buffer); | 1585 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_no_small_buffer); |
1503 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_no_big_buffer); | 1586 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_no_big_buffer); |
1504 | data[i++] = mgp->rx_done.lro_mgr.stats.aggregated; | 1587 | |
1505 | data[i++] = mgp->rx_done.lro_mgr.stats.flushed; | 1588 | data[i++] = 0; |
1506 | if (mgp->rx_done.lro_mgr.stats.flushed) | 1589 | data[i++] = (unsigned int)ss->tx.pkt_start; |
1507 | data[i++] = mgp->rx_done.lro_mgr.stats.aggregated / | 1590 | data[i++] = (unsigned int)ss->tx.pkt_done; |
1508 | mgp->rx_done.lro_mgr.stats.flushed; | 1591 | data[i++] = (unsigned int)ss->tx.req; |
1592 | data[i++] = (unsigned int)ss->tx.done; | ||
1593 | data[i++] = (unsigned int)ss->rx_small.cnt; | ||
1594 | data[i++] = (unsigned int)ss->rx_big.cnt; | ||
1595 | data[i++] = (unsigned int)ss->tx.wake_queue; | ||
1596 | data[i++] = (unsigned int)ss->tx.stop_queue; | ||
1597 | data[i++] = (unsigned int)ss->tx.linearized; | ||
1598 | data[i++] = ss->rx_done.lro_mgr.stats.aggregated; | ||
1599 | data[i++] = ss->rx_done.lro_mgr.stats.flushed; | ||
1600 | if (ss->rx_done.lro_mgr.stats.flushed) | ||
1601 | data[i++] = ss->rx_done.lro_mgr.stats.aggregated / | ||
1602 | ss->rx_done.lro_mgr.stats.flushed; | ||
1509 | else | 1603 | else |
1510 | data[i++] = 0; | 1604 | data[i++] = 0; |
1511 | data[i++] = mgp->rx_done.lro_mgr.stats.no_desc; | 1605 | data[i++] = ss->rx_done.lro_mgr.stats.no_desc; |
1512 | } | 1606 | } |
1513 | 1607 | ||
1514 | static void myri10ge_set_msglevel(struct net_device *netdev, u32 value) | 1608 | static void myri10ge_set_msglevel(struct net_device *netdev, u32 value) |
@@ -1544,19 +1638,17 @@ static const struct ethtool_ops myri10ge_ethtool_ops = { | |||
1544 | .get_msglevel = myri10ge_get_msglevel | 1638 | .get_msglevel = myri10ge_get_msglevel |
1545 | }; | 1639 | }; |
1546 | 1640 | ||
1547 | static int myri10ge_allocate_rings(struct net_device *dev) | 1641 | static int myri10ge_allocate_rings(struct myri10ge_slice_state *ss) |
1548 | { | 1642 | { |
1549 | struct myri10ge_priv *mgp; | 1643 | struct myri10ge_priv *mgp = ss->mgp; |
1550 | struct myri10ge_cmd cmd; | 1644 | struct myri10ge_cmd cmd; |
1645 | struct net_device *dev = mgp->dev; | ||
1551 | int tx_ring_size, rx_ring_size; | 1646 | int tx_ring_size, rx_ring_size; |
1552 | int tx_ring_entries, rx_ring_entries; | 1647 | int tx_ring_entries, rx_ring_entries; |
1553 | int i, status; | 1648 | int i, status; |
1554 | size_t bytes; | 1649 | size_t bytes; |
1555 | 1650 | ||
1556 | mgp = netdev_priv(dev); | ||
1557 | |||
1558 | /* get ring sizes */ | 1651 | /* get ring sizes */ |
1559 | |||
1560 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_RING_SIZE, &cmd, 0); | 1652 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_RING_SIZE, &cmd, 0); |
1561 | tx_ring_size = cmd.data0; | 1653 | tx_ring_size = cmd.data0; |
1562 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); | 1654 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); |
@@ -1566,144 +1658,142 @@ static int myri10ge_allocate_rings(struct net_device *dev) | |||
1566 | 1658 | ||
1567 | tx_ring_entries = tx_ring_size / sizeof(struct mcp_kreq_ether_send); | 1659 | tx_ring_entries = tx_ring_size / sizeof(struct mcp_kreq_ether_send); |
1568 | rx_ring_entries = rx_ring_size / sizeof(struct mcp_dma_addr); | 1660 | rx_ring_entries = rx_ring_size / sizeof(struct mcp_dma_addr); |
1569 | mgp->tx.mask = tx_ring_entries - 1; | 1661 | ss->tx.mask = tx_ring_entries - 1; |
1570 | mgp->rx_small.mask = mgp->rx_big.mask = rx_ring_entries - 1; | 1662 | ss->rx_small.mask = ss->rx_big.mask = rx_ring_entries - 1; |
1571 | 1663 | ||
1572 | status = -ENOMEM; | 1664 | status = -ENOMEM; |
1573 | 1665 | ||
1574 | /* allocate the host shadow rings */ | 1666 | /* allocate the host shadow rings */ |
1575 | 1667 | ||
1576 | bytes = 8 + (MYRI10GE_MAX_SEND_DESC_TSO + 4) | 1668 | bytes = 8 + (MYRI10GE_MAX_SEND_DESC_TSO + 4) |
1577 | * sizeof(*mgp->tx.req_list); | 1669 | * sizeof(*ss->tx.req_list); |
1578 | mgp->tx.req_bytes = kzalloc(bytes, GFP_KERNEL); | 1670 | ss->tx.req_bytes = kzalloc(bytes, GFP_KERNEL); |
1579 | if (mgp->tx.req_bytes == NULL) | 1671 | if (ss->tx.req_bytes == NULL) |
1580 | goto abort_with_nothing; | 1672 | goto abort_with_nothing; |
1581 | 1673 | ||
1582 | /* ensure req_list entries are aligned to 8 bytes */ | 1674 | /* ensure req_list entries are aligned to 8 bytes */ |
1583 | mgp->tx.req_list = (struct mcp_kreq_ether_send *) | 1675 | ss->tx.req_list = (struct mcp_kreq_ether_send *) |
1584 | ALIGN((unsigned long)mgp->tx.req_bytes, 8); | 1676 | ALIGN((unsigned long)ss->tx.req_bytes, 8); |
1585 | 1677 | ||
1586 | bytes = rx_ring_entries * sizeof(*mgp->rx_small.shadow); | 1678 | bytes = rx_ring_entries * sizeof(*ss->rx_small.shadow); |
1587 | mgp->rx_small.shadow = kzalloc(bytes, GFP_KERNEL); | 1679 | ss->rx_small.shadow = kzalloc(bytes, GFP_KERNEL); |
1588 | if (mgp->rx_small.shadow == NULL) | 1680 | if (ss->rx_small.shadow == NULL) |
1589 | goto abort_with_tx_req_bytes; | 1681 | goto abort_with_tx_req_bytes; |
1590 | 1682 | ||
1591 | bytes = rx_ring_entries * sizeof(*mgp->rx_big.shadow); | 1683 | bytes = rx_ring_entries * sizeof(*ss->rx_big.shadow); |
1592 | mgp->rx_big.shadow = kzalloc(bytes, GFP_KERNEL); | 1684 | ss->rx_big.shadow = kzalloc(bytes, GFP_KERNEL); |
1593 | if (mgp->rx_big.shadow == NULL) | 1685 | if (ss->rx_big.shadow == NULL) |
1594 | goto abort_with_rx_small_shadow; | 1686 | goto abort_with_rx_small_shadow; |
1595 | 1687 | ||
1596 | /* allocate the host info rings */ | 1688 | /* allocate the host info rings */ |
1597 | 1689 | ||
1598 | bytes = tx_ring_entries * sizeof(*mgp->tx.info); | 1690 | bytes = tx_ring_entries * sizeof(*ss->tx.info); |
1599 | mgp->tx.info = kzalloc(bytes, GFP_KERNEL); | 1691 | ss->tx.info = kzalloc(bytes, GFP_KERNEL); |
1600 | if (mgp->tx.info == NULL) | 1692 | if (ss->tx.info == NULL) |
1601 | goto abort_with_rx_big_shadow; | 1693 | goto abort_with_rx_big_shadow; |
1602 | 1694 | ||
1603 | bytes = rx_ring_entries * sizeof(*mgp->rx_small.info); | 1695 | bytes = rx_ring_entries * sizeof(*ss->rx_small.info); |
1604 | mgp->rx_small.info = kzalloc(bytes, GFP_KERNEL); | 1696 | ss->rx_small.info = kzalloc(bytes, GFP_KERNEL); |
1605 | if (mgp->rx_small.info == NULL) | 1697 | if (ss->rx_small.info == NULL) |
1606 | goto abort_with_tx_info; | 1698 | goto abort_with_tx_info; |
1607 | 1699 | ||
1608 | bytes = rx_ring_entries * sizeof(*mgp->rx_big.info); | 1700 | bytes = rx_ring_entries * sizeof(*ss->rx_big.info); |
1609 | mgp->rx_big.info = kzalloc(bytes, GFP_KERNEL); | 1701 | ss->rx_big.info = kzalloc(bytes, GFP_KERNEL); |
1610 | if (mgp->rx_big.info == NULL) | 1702 | if (ss->rx_big.info == NULL) |
1611 | goto abort_with_rx_small_info; | 1703 | goto abort_with_rx_small_info; |
1612 | 1704 | ||
1613 | /* Fill the receive rings */ | 1705 | /* Fill the receive rings */ |
1614 | mgp->rx_big.cnt = 0; | 1706 | ss->rx_big.cnt = 0; |
1615 | mgp->rx_small.cnt = 0; | 1707 | ss->rx_small.cnt = 0; |
1616 | mgp->rx_big.fill_cnt = 0; | 1708 | ss->rx_big.fill_cnt = 0; |
1617 | mgp->rx_small.fill_cnt = 0; | 1709 | ss->rx_small.fill_cnt = 0; |
1618 | mgp->rx_small.page_offset = MYRI10GE_ALLOC_SIZE; | 1710 | ss->rx_small.page_offset = MYRI10GE_ALLOC_SIZE; |
1619 | mgp->rx_big.page_offset = MYRI10GE_ALLOC_SIZE; | 1711 | ss->rx_big.page_offset = MYRI10GE_ALLOC_SIZE; |
1620 | mgp->rx_small.watchdog_needed = 0; | 1712 | ss->rx_small.watchdog_needed = 0; |
1621 | mgp->rx_big.watchdog_needed = 0; | 1713 | ss->rx_big.watchdog_needed = 0; |
1622 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_small, | 1714 | myri10ge_alloc_rx_pages(mgp, &ss->rx_small, |
1623 | mgp->small_bytes + MXGEFW_PAD, 0); | 1715 | mgp->small_bytes + MXGEFW_PAD, 0); |
1624 | 1716 | ||
1625 | if (mgp->rx_small.fill_cnt < mgp->rx_small.mask + 1) { | 1717 | if (ss->rx_small.fill_cnt < ss->rx_small.mask + 1) { |
1626 | printk(KERN_ERR "myri10ge: %s: alloced only %d small bufs\n", | 1718 | printk(KERN_ERR "myri10ge: %s: alloced only %d small bufs\n", |
1627 | dev->name, mgp->rx_small.fill_cnt); | 1719 | dev->name, ss->rx_small.fill_cnt); |
1628 | goto abort_with_rx_small_ring; | 1720 | goto abort_with_rx_small_ring; |
1629 | } | 1721 | } |
1630 | 1722 | ||
1631 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_big, mgp->big_bytes, 0); | 1723 | myri10ge_alloc_rx_pages(mgp, &ss->rx_big, mgp->big_bytes, 0); |
1632 | if (mgp->rx_big.fill_cnt < mgp->rx_big.mask + 1) { | 1724 | if (ss->rx_big.fill_cnt < ss->rx_big.mask + 1) { |
1633 | printk(KERN_ERR "myri10ge: %s: alloced only %d big bufs\n", | 1725 | printk(KERN_ERR "myri10ge: %s: alloced only %d big bufs\n", |
1634 | dev->name, mgp->rx_big.fill_cnt); | 1726 | dev->name, ss->rx_big.fill_cnt); |
1635 | goto abort_with_rx_big_ring; | 1727 | goto abort_with_rx_big_ring; |
1636 | } | 1728 | } |
1637 | 1729 | ||
1638 | return 0; | 1730 | return 0; |
1639 | 1731 | ||
1640 | abort_with_rx_big_ring: | 1732 | abort_with_rx_big_ring: |
1641 | for (i = mgp->rx_big.cnt; i < mgp->rx_big.fill_cnt; i++) { | 1733 | for (i = ss->rx_big.cnt; i < ss->rx_big.fill_cnt; i++) { |
1642 | int idx = i & mgp->rx_big.mask; | 1734 | int idx = i & ss->rx_big.mask; |
1643 | myri10ge_unmap_rx_page(mgp->pdev, &mgp->rx_big.info[idx], | 1735 | myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_big.info[idx], |
1644 | mgp->big_bytes); | 1736 | mgp->big_bytes); |
1645 | put_page(mgp->rx_big.info[idx].page); | 1737 | put_page(ss->rx_big.info[idx].page); |
1646 | } | 1738 | } |
1647 | 1739 | ||
1648 | abort_with_rx_small_ring: | 1740 | abort_with_rx_small_ring: |
1649 | for (i = mgp->rx_small.cnt; i < mgp->rx_small.fill_cnt; i++) { | 1741 | for (i = ss->rx_small.cnt; i < ss->rx_small.fill_cnt; i++) { |
1650 | int idx = i & mgp->rx_small.mask; | 1742 | int idx = i & ss->rx_small.mask; |
1651 | myri10ge_unmap_rx_page(mgp->pdev, &mgp->rx_small.info[idx], | 1743 | myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_small.info[idx], |
1652 | mgp->small_bytes + MXGEFW_PAD); | 1744 | mgp->small_bytes + MXGEFW_PAD); |
1653 | put_page(mgp->rx_small.info[idx].page); | 1745 | put_page(ss->rx_small.info[idx].page); |
1654 | } | 1746 | } |
1655 | 1747 | ||
1656 | kfree(mgp->rx_big.info); | 1748 | kfree(ss->rx_big.info); |
1657 | 1749 | ||
1658 | abort_with_rx_small_info: | 1750 | abort_with_rx_small_info: |
1659 | kfree(mgp->rx_small.info); | 1751 | kfree(ss->rx_small.info); |
1660 | 1752 | ||
1661 | abort_with_tx_info: | 1753 | abort_with_tx_info: |
1662 | kfree(mgp->tx.info); | 1754 | kfree(ss->tx.info); |
1663 | 1755 | ||
1664 | abort_with_rx_big_shadow: | 1756 | abort_with_rx_big_shadow: |
1665 | kfree(mgp->rx_big.shadow); | 1757 | kfree(ss->rx_big.shadow); |
1666 | 1758 | ||
1667 | abort_with_rx_small_shadow: | 1759 | abort_with_rx_small_shadow: |
1668 | kfree(mgp->rx_small.shadow); | 1760 | kfree(ss->rx_small.shadow); |
1669 | 1761 | ||
1670 | abort_with_tx_req_bytes: | 1762 | abort_with_tx_req_bytes: |
1671 | kfree(mgp->tx.req_bytes); | 1763 | kfree(ss->tx.req_bytes); |
1672 | mgp->tx.req_bytes = NULL; | 1764 | ss->tx.req_bytes = NULL; |
1673 | mgp->tx.req_list = NULL; | 1765 | ss->tx.req_list = NULL; |
1674 | 1766 | ||
1675 | abort_with_nothing: | 1767 | abort_with_nothing: |
1676 | return status; | 1768 | return status; |
1677 | } | 1769 | } |
1678 | 1770 | ||
1679 | static void myri10ge_free_rings(struct net_device *dev) | 1771 | static void myri10ge_free_rings(struct myri10ge_slice_state *ss) |
1680 | { | 1772 | { |
1681 | struct myri10ge_priv *mgp; | 1773 | struct myri10ge_priv *mgp = ss->mgp; |
1682 | struct sk_buff *skb; | 1774 | struct sk_buff *skb; |
1683 | struct myri10ge_tx_buf *tx; | 1775 | struct myri10ge_tx_buf *tx; |
1684 | int i, len, idx; | 1776 | int i, len, idx; |
1685 | 1777 | ||
1686 | mgp = netdev_priv(dev); | 1778 | for (i = ss->rx_big.cnt; i < ss->rx_big.fill_cnt; i++) { |
1687 | 1779 | idx = i & ss->rx_big.mask; | |
1688 | for (i = mgp->rx_big.cnt; i < mgp->rx_big.fill_cnt; i++) { | 1780 | if (i == ss->rx_big.fill_cnt - 1) |
1689 | idx = i & mgp->rx_big.mask; | 1781 | ss->rx_big.info[idx].page_offset = MYRI10GE_ALLOC_SIZE; |
1690 | if (i == mgp->rx_big.fill_cnt - 1) | 1782 | myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_big.info[idx], |
1691 | mgp->rx_big.info[idx].page_offset = MYRI10GE_ALLOC_SIZE; | ||
1692 | myri10ge_unmap_rx_page(mgp->pdev, &mgp->rx_big.info[idx], | ||
1693 | mgp->big_bytes); | 1783 | mgp->big_bytes); |
1694 | put_page(mgp->rx_big.info[idx].page); | 1784 | put_page(ss->rx_big.info[idx].page); |
1695 | } | 1785 | } |
1696 | 1786 | ||
1697 | for (i = mgp->rx_small.cnt; i < mgp->rx_small.fill_cnt; i++) { | 1787 | for (i = ss->rx_small.cnt; i < ss->rx_small.fill_cnt; i++) { |
1698 | idx = i & mgp->rx_small.mask; | 1788 | idx = i & ss->rx_small.mask; |
1699 | if (i == mgp->rx_small.fill_cnt - 1) | 1789 | if (i == ss->rx_small.fill_cnt - 1) |
1700 | mgp->rx_small.info[idx].page_offset = | 1790 | ss->rx_small.info[idx].page_offset = |
1701 | MYRI10GE_ALLOC_SIZE; | 1791 | MYRI10GE_ALLOC_SIZE; |
1702 | myri10ge_unmap_rx_page(mgp->pdev, &mgp->rx_small.info[idx], | 1792 | myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_small.info[idx], |
1703 | mgp->small_bytes + MXGEFW_PAD); | 1793 | mgp->small_bytes + MXGEFW_PAD); |
1704 | put_page(mgp->rx_small.info[idx].page); | 1794 | put_page(ss->rx_small.info[idx].page); |
1705 | } | 1795 | } |
1706 | tx = &mgp->tx; | 1796 | tx = &ss->tx; |
1707 | while (tx->done != tx->req) { | 1797 | while (tx->done != tx->req) { |
1708 | idx = tx->done & tx->mask; | 1798 | idx = tx->done & tx->mask; |
1709 | skb = tx->info[idx].skb; | 1799 | skb = tx->info[idx].skb; |
@@ -1714,7 +1804,7 @@ static void myri10ge_free_rings(struct net_device *dev) | |||
1714 | len = pci_unmap_len(&tx->info[idx], len); | 1804 | len = pci_unmap_len(&tx->info[idx], len); |
1715 | pci_unmap_len_set(&tx->info[idx], len, 0); | 1805 | pci_unmap_len_set(&tx->info[idx], len, 0); |
1716 | if (skb) { | 1806 | if (skb) { |
1717 | mgp->stats.tx_dropped++; | 1807 | ss->stats.tx_dropped++; |
1718 | dev_kfree_skb_any(skb); | 1808 | dev_kfree_skb_any(skb); |
1719 | if (len) | 1809 | if (len) |
1720 | pci_unmap_single(mgp->pdev, | 1810 | pci_unmap_single(mgp->pdev, |
@@ -1729,19 +1819,19 @@ static void myri10ge_free_rings(struct net_device *dev) | |||
1729 | PCI_DMA_TODEVICE); | 1819 | PCI_DMA_TODEVICE); |
1730 | } | 1820 | } |
1731 | } | 1821 | } |
1732 | kfree(mgp->rx_big.info); | 1822 | kfree(ss->rx_big.info); |
1733 | 1823 | ||
1734 | kfree(mgp->rx_small.info); | 1824 | kfree(ss->rx_small.info); |
1735 | 1825 | ||
1736 | kfree(mgp->tx.info); | 1826 | kfree(ss->tx.info); |
1737 | 1827 | ||
1738 | kfree(mgp->rx_big.shadow); | 1828 | kfree(ss->rx_big.shadow); |
1739 | 1829 | ||
1740 | kfree(mgp->rx_small.shadow); | 1830 | kfree(ss->rx_small.shadow); |
1741 | 1831 | ||
1742 | kfree(mgp->tx.req_bytes); | 1832 | kfree(ss->tx.req_bytes); |
1743 | mgp->tx.req_bytes = NULL; | 1833 | ss->tx.req_bytes = NULL; |
1744 | mgp->tx.req_list = NULL; | 1834 | ss->tx.req_list = NULL; |
1745 | } | 1835 | } |
1746 | 1836 | ||
1747 | static int myri10ge_request_irq(struct myri10ge_priv *mgp) | 1837 | static int myri10ge_request_irq(struct myri10ge_priv *mgp) |
@@ -1840,13 +1930,11 @@ myri10ge_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr, | |||
1840 | 1930 | ||
1841 | static int myri10ge_open(struct net_device *dev) | 1931 | static int myri10ge_open(struct net_device *dev) |
1842 | { | 1932 | { |
1843 | struct myri10ge_priv *mgp; | 1933 | struct myri10ge_priv *mgp = netdev_priv(dev); |
1844 | struct myri10ge_cmd cmd; | 1934 | struct myri10ge_cmd cmd; |
1845 | struct net_lro_mgr *lro_mgr; | 1935 | struct net_lro_mgr *lro_mgr; |
1846 | int status, big_pow2; | 1936 | int status, big_pow2; |
1847 | 1937 | ||
1848 | mgp = netdev_priv(dev); | ||
1849 | |||
1850 | if (mgp->running != MYRI10GE_ETH_STOPPED) | 1938 | if (mgp->running != MYRI10GE_ETH_STOPPED) |
1851 | return -EBUSY; | 1939 | return -EBUSY; |
1852 | 1940 | ||
@@ -1883,16 +1971,16 @@ static int myri10ge_open(struct net_device *dev) | |||
1883 | /* get the lanai pointers to the send and receive rings */ | 1971 | /* get the lanai pointers to the send and receive rings */ |
1884 | 1972 | ||
1885 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_OFFSET, &cmd, 0); | 1973 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_OFFSET, &cmd, 0); |
1886 | mgp->tx.lanai = | 1974 | mgp->ss.tx.lanai = |
1887 | (struct mcp_kreq_ether_send __iomem *)(mgp->sram + cmd.data0); | 1975 | (struct mcp_kreq_ether_send __iomem *)(mgp->sram + cmd.data0); |
1888 | 1976 | ||
1889 | status |= | 1977 | status |= |
1890 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SMALL_RX_OFFSET, &cmd, 0); | 1978 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SMALL_RX_OFFSET, &cmd, 0); |
1891 | mgp->rx_small.lanai = | 1979 | mgp->ss.rx_small.lanai = |
1892 | (struct mcp_kreq_ether_recv __iomem *)(mgp->sram + cmd.data0); | 1980 | (struct mcp_kreq_ether_recv __iomem *)(mgp->sram + cmd.data0); |
1893 | 1981 | ||
1894 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_BIG_RX_OFFSET, &cmd, 0); | 1982 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_BIG_RX_OFFSET, &cmd, 0); |
1895 | mgp->rx_big.lanai = | 1983 | mgp->ss.rx_big.lanai = |
1896 | (struct mcp_kreq_ether_recv __iomem *)(mgp->sram + cmd.data0); | 1984 | (struct mcp_kreq_ether_recv __iomem *)(mgp->sram + cmd.data0); |
1897 | 1985 | ||
1898 | if (status != 0) { | 1986 | if (status != 0) { |
@@ -1904,15 +1992,15 @@ static int myri10ge_open(struct net_device *dev) | |||
1904 | } | 1992 | } |
1905 | 1993 | ||
1906 | if (myri10ge_wcfifo && mgp->wc_enabled) { | 1994 | if (myri10ge_wcfifo && mgp->wc_enabled) { |
1907 | mgp->tx.wc_fifo = (u8 __iomem *) mgp->sram + MXGEFW_ETH_SEND_4; | 1995 | mgp->ss.tx.wc_fifo = (u8 __iomem *) mgp->sram + MXGEFW_ETH_SEND_4; |
1908 | mgp->rx_small.wc_fifo = | 1996 | mgp->ss.rx_small.wc_fifo = |
1909 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_SMALL; | 1997 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_SMALL; |
1910 | mgp->rx_big.wc_fifo = | 1998 | mgp->ss.rx_big.wc_fifo = |
1911 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_BIG; | 1999 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_BIG; |
1912 | } else { | 2000 | } else { |
1913 | mgp->tx.wc_fifo = NULL; | 2001 | mgp->ss.tx.wc_fifo = NULL; |
1914 | mgp->rx_small.wc_fifo = NULL; | 2002 | mgp->ss.rx_small.wc_fifo = NULL; |
1915 | mgp->rx_big.wc_fifo = NULL; | 2003 | mgp->ss.rx_big.wc_fifo = NULL; |
1916 | } | 2004 | } |
1917 | 2005 | ||
1918 | /* Firmware needs the big buff size as a power of 2. Lie and | 2006 | /* Firmware needs the big buff size as a power of 2. Lie and |
@@ -1929,7 +2017,7 @@ static int myri10ge_open(struct net_device *dev) | |||
1929 | mgp->big_bytes = big_pow2; | 2017 | mgp->big_bytes = big_pow2; |
1930 | } | 2018 | } |
1931 | 2019 | ||
1932 | status = myri10ge_allocate_rings(dev); | 2020 | status = myri10ge_allocate_rings(&mgp->ss); |
1933 | if (status != 0) | 2021 | if (status != 0) |
1934 | goto abort_with_irq; | 2022 | goto abort_with_irq; |
1935 | 2023 | ||
@@ -1948,12 +2036,12 @@ static int myri10ge_open(struct net_device *dev) | |||
1948 | goto abort_with_rings; | 2036 | goto abort_with_rings; |
1949 | } | 2037 | } |
1950 | 2038 | ||
1951 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->fw_stats_bus); | 2039 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->ss.fw_stats_bus); |
1952 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->fw_stats_bus); | 2040 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->ss.fw_stats_bus); |
1953 | cmd.data2 = sizeof(struct mcp_irq_data); | 2041 | cmd.data2 = sizeof(struct mcp_irq_data); |
1954 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_STATS_DMA_V2, &cmd, 0); | 2042 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_STATS_DMA_V2, &cmd, 0); |
1955 | if (status == -ENOSYS) { | 2043 | if (status == -ENOSYS) { |
1956 | dma_addr_t bus = mgp->fw_stats_bus; | 2044 | dma_addr_t bus = mgp->ss.fw_stats_bus; |
1957 | bus += offsetof(struct mcp_irq_data, send_done_count); | 2045 | bus += offsetof(struct mcp_irq_data, send_done_count); |
1958 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(bus); | 2046 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(bus); |
1959 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(bus); | 2047 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(bus); |
@@ -1974,20 +2062,20 @@ static int myri10ge_open(struct net_device *dev) | |||
1974 | mgp->link_state = ~0U; | 2062 | mgp->link_state = ~0U; |
1975 | mgp->rdma_tags_available = 15; | 2063 | mgp->rdma_tags_available = 15; |
1976 | 2064 | ||
1977 | lro_mgr = &mgp->rx_done.lro_mgr; | 2065 | lro_mgr = &mgp->ss.rx_done.lro_mgr; |
1978 | lro_mgr->dev = dev; | 2066 | lro_mgr->dev = dev; |
1979 | lro_mgr->features = LRO_F_NAPI; | 2067 | lro_mgr->features = LRO_F_NAPI; |
1980 | lro_mgr->ip_summed = CHECKSUM_COMPLETE; | 2068 | lro_mgr->ip_summed = CHECKSUM_COMPLETE; |
1981 | lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY; | 2069 | lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY; |
1982 | lro_mgr->max_desc = MYRI10GE_MAX_LRO_DESCRIPTORS; | 2070 | lro_mgr->max_desc = MYRI10GE_MAX_LRO_DESCRIPTORS; |
1983 | lro_mgr->lro_arr = mgp->rx_done.lro_desc; | 2071 | lro_mgr->lro_arr = mgp->ss.rx_done.lro_desc; |
1984 | lro_mgr->get_frag_header = myri10ge_get_frag_header; | 2072 | lro_mgr->get_frag_header = myri10ge_get_frag_header; |
1985 | lro_mgr->max_aggr = myri10ge_lro_max_pkts; | 2073 | lro_mgr->max_aggr = myri10ge_lro_max_pkts; |
1986 | lro_mgr->frag_align_pad = 2; | 2074 | lro_mgr->frag_align_pad = 2; |
1987 | if (lro_mgr->max_aggr > MAX_SKB_FRAGS) | 2075 | if (lro_mgr->max_aggr > MAX_SKB_FRAGS) |
1988 | lro_mgr->max_aggr = MAX_SKB_FRAGS; | 2076 | lro_mgr->max_aggr = MAX_SKB_FRAGS; |
1989 | 2077 | ||
1990 | napi_enable(&mgp->napi); /* must happen prior to any irq */ | 2078 | napi_enable(&mgp->ss.napi); /* must happen prior to any irq */ |
1991 | 2079 | ||
1992 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_ETHERNET_UP, &cmd, 0); | 2080 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_ETHERNET_UP, &cmd, 0); |
1993 | if (status) { | 2081 | if (status) { |
@@ -1996,8 +2084,8 @@ static int myri10ge_open(struct net_device *dev) | |||
1996 | goto abort_with_rings; | 2084 | goto abort_with_rings; |
1997 | } | 2085 | } |
1998 | 2086 | ||
1999 | mgp->wake_queue = 0; | 2087 | mgp->ss.tx.wake_queue = 0; |
2000 | mgp->stop_queue = 0; | 2088 | mgp->ss.tx.stop_queue = 0; |
2001 | mgp->running = MYRI10GE_ETH_RUNNING; | 2089 | mgp->running = MYRI10GE_ETH_RUNNING; |
2002 | mgp->watchdog_timer.expires = jiffies + myri10ge_watchdog_timeout * HZ; | 2090 | mgp->watchdog_timer.expires = jiffies + myri10ge_watchdog_timeout * HZ; |
2003 | add_timer(&mgp->watchdog_timer); | 2091 | add_timer(&mgp->watchdog_timer); |
@@ -2005,7 +2093,7 @@ static int myri10ge_open(struct net_device *dev) | |||
2005 | return 0; | 2093 | return 0; |
2006 | 2094 | ||
2007 | abort_with_rings: | 2095 | abort_with_rings: |
2008 | myri10ge_free_rings(dev); | 2096 | myri10ge_free_rings(&mgp->ss); |
2009 | 2097 | ||
2010 | abort_with_irq: | 2098 | abort_with_irq: |
2011 | myri10ge_free_irq(mgp); | 2099 | myri10ge_free_irq(mgp); |
@@ -2017,21 +2105,19 @@ abort_with_nothing: | |||
2017 | 2105 | ||
2018 | static int myri10ge_close(struct net_device *dev) | 2106 | static int myri10ge_close(struct net_device *dev) |
2019 | { | 2107 | { |
2020 | struct myri10ge_priv *mgp; | 2108 | struct myri10ge_priv *mgp = netdev_priv(dev); |
2021 | struct myri10ge_cmd cmd; | 2109 | struct myri10ge_cmd cmd; |
2022 | int status, old_down_cnt; | 2110 | int status, old_down_cnt; |
2023 | 2111 | ||
2024 | mgp = netdev_priv(dev); | ||
2025 | |||
2026 | if (mgp->running != MYRI10GE_ETH_RUNNING) | 2112 | if (mgp->running != MYRI10GE_ETH_RUNNING) |
2027 | return 0; | 2113 | return 0; |
2028 | 2114 | ||
2029 | if (mgp->tx.req_bytes == NULL) | 2115 | if (mgp->ss.tx.req_bytes == NULL) |
2030 | return 0; | 2116 | return 0; |
2031 | 2117 | ||
2032 | del_timer_sync(&mgp->watchdog_timer); | 2118 | del_timer_sync(&mgp->watchdog_timer); |
2033 | mgp->running = MYRI10GE_ETH_STOPPING; | 2119 | mgp->running = MYRI10GE_ETH_STOPPING; |
2034 | napi_disable(&mgp->napi); | 2120 | napi_disable(&mgp->ss.napi); |
2035 | netif_carrier_off(dev); | 2121 | netif_carrier_off(dev); |
2036 | netif_stop_queue(dev); | 2122 | netif_stop_queue(dev); |
2037 | old_down_cnt = mgp->down_cnt; | 2123 | old_down_cnt = mgp->down_cnt; |
@@ -2047,7 +2133,7 @@ static int myri10ge_close(struct net_device *dev) | |||
2047 | 2133 | ||
2048 | netif_tx_disable(dev); | 2134 | netif_tx_disable(dev); |
2049 | myri10ge_free_irq(mgp); | 2135 | myri10ge_free_irq(mgp); |
2050 | myri10ge_free_rings(dev); | 2136 | myri10ge_free_rings(&mgp->ss); |
2051 | 2137 | ||
2052 | mgp->running = MYRI10GE_ETH_STOPPED; | 2138 | mgp->running = MYRI10GE_ETH_STOPPED; |
2053 | return 0; | 2139 | return 0; |
@@ -2143,7 +2229,7 @@ myri10ge_submit_req_wc(struct myri10ge_tx_buf *tx, | |||
2143 | 2229 | ||
2144 | /* | 2230 | /* |
2145 | * Transmit a packet. We need to split the packet so that a single | 2231 | * Transmit a packet. We need to split the packet so that a single |
2146 | * segment does not cross myri10ge->tx.boundary, so this makes segment | 2232 | * segment does not cross myri10ge->tx_boundary, so this makes segment |
2147 | * counting tricky. So rather than try to count segments up front, we | 2233 | * counting tricky. So rather than try to count segments up front, we |
2148 | * just give up if there are too few segments to hold a reasonably | 2234 | * just give up if there are too few segments to hold a reasonably |
2149 | * fragmented packet currently available. If we run | 2235 | * fragmented packet currently available. If we run |
@@ -2154,8 +2240,9 @@ myri10ge_submit_req_wc(struct myri10ge_tx_buf *tx, | |||
2154 | static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev) | 2240 | static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev) |
2155 | { | 2241 | { |
2156 | struct myri10ge_priv *mgp = netdev_priv(dev); | 2242 | struct myri10ge_priv *mgp = netdev_priv(dev); |
2243 | struct myri10ge_slice_state *ss; | ||
2157 | struct mcp_kreq_ether_send *req; | 2244 | struct mcp_kreq_ether_send *req; |
2158 | struct myri10ge_tx_buf *tx = &mgp->tx; | 2245 | struct myri10ge_tx_buf *tx; |
2159 | struct skb_frag_struct *frag; | 2246 | struct skb_frag_struct *frag; |
2160 | dma_addr_t bus; | 2247 | dma_addr_t bus; |
2161 | u32 low; | 2248 | u32 low; |
@@ -2166,6 +2253,9 @@ static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2166 | int cum_len, seglen, boundary, rdma_count; | 2253 | int cum_len, seglen, boundary, rdma_count; |
2167 | u8 flags, odd_flag; | 2254 | u8 flags, odd_flag; |
2168 | 2255 | ||
2256 | /* always transmit through slot 0 */ | ||
2257 | ss = &mgp->ss; | ||
2258 | tx = &ss->tx; | ||
2169 | again: | 2259 | again: |
2170 | req = tx->req_list; | 2260 | req = tx->req_list; |
2171 | avail = tx->mask - 1 - (tx->req - tx->done); | 2261 | avail = tx->mask - 1 - (tx->req - tx->done); |
@@ -2180,7 +2270,7 @@ again: | |||
2180 | 2270 | ||
2181 | if ((unlikely(avail < max_segments))) { | 2271 | if ((unlikely(avail < max_segments))) { |
2182 | /* we are out of transmit resources */ | 2272 | /* we are out of transmit resources */ |
2183 | mgp->stop_queue++; | 2273 | tx->stop_queue++; |
2184 | netif_stop_queue(dev); | 2274 | netif_stop_queue(dev); |
2185 | return 1; | 2275 | return 1; |
2186 | } | 2276 | } |
@@ -2242,7 +2332,7 @@ again: | |||
2242 | if (skb_padto(skb, ETH_ZLEN)) { | 2332 | if (skb_padto(skb, ETH_ZLEN)) { |
2243 | /* The packet is gone, so we must | 2333 | /* The packet is gone, so we must |
2244 | * return 0 */ | 2334 | * return 0 */ |
2245 | mgp->stats.tx_dropped += 1; | 2335 | ss->stats.tx_dropped += 1; |
2246 | return 0; | 2336 | return 0; |
2247 | } | 2337 | } |
2248 | /* adjust the len to account for the zero pad | 2338 | /* adjust the len to account for the zero pad |
@@ -2284,7 +2374,7 @@ again: | |||
2284 | 2374 | ||
2285 | while (1) { | 2375 | while (1) { |
2286 | /* Break the SKB or Fragment up into pieces which | 2376 | /* Break the SKB or Fragment up into pieces which |
2287 | * do not cross mgp->tx.boundary */ | 2377 | * do not cross mgp->tx_boundary */ |
2288 | low = MYRI10GE_LOWPART_TO_U32(bus); | 2378 | low = MYRI10GE_LOWPART_TO_U32(bus); |
2289 | high_swapped = htonl(MYRI10GE_HIGHPART_TO_U32(bus)); | 2379 | high_swapped = htonl(MYRI10GE_HIGHPART_TO_U32(bus)); |
2290 | while (len) { | 2380 | while (len) { |
@@ -2294,7 +2384,8 @@ again: | |||
2294 | if (unlikely(count == max_segments)) | 2384 | if (unlikely(count == max_segments)) |
2295 | goto abort_linearize; | 2385 | goto abort_linearize; |
2296 | 2386 | ||
2297 | boundary = (low + tx->boundary) & ~(tx->boundary - 1); | 2387 | boundary = |
2388 | (low + mgp->tx_boundary) & ~(mgp->tx_boundary - 1); | ||
2298 | seglen = boundary - low; | 2389 | seglen = boundary - low; |
2299 | if (seglen > len) | 2390 | if (seglen > len) |
2300 | seglen = len; | 2391 | seglen = len; |
@@ -2378,7 +2469,7 @@ again: | |||
2378 | myri10ge_submit_req_wc(tx, tx->req_list, count); | 2469 | myri10ge_submit_req_wc(tx, tx->req_list, count); |
2379 | tx->pkt_start++; | 2470 | tx->pkt_start++; |
2380 | if ((avail - count) < MXGEFW_MAX_SEND_DESC) { | 2471 | if ((avail - count) < MXGEFW_MAX_SEND_DESC) { |
2381 | mgp->stop_queue++; | 2472 | tx->stop_queue++; |
2382 | netif_stop_queue(dev); | 2473 | netif_stop_queue(dev); |
2383 | } | 2474 | } |
2384 | dev->trans_start = jiffies; | 2475 | dev->trans_start = jiffies; |
@@ -2420,12 +2511,12 @@ abort_linearize: | |||
2420 | if (skb_linearize(skb)) | 2511 | if (skb_linearize(skb)) |
2421 | goto drop; | 2512 | goto drop; |
2422 | 2513 | ||
2423 | mgp->tx_linearized++; | 2514 | tx->linearized++; |
2424 | goto again; | 2515 | goto again; |
2425 | 2516 | ||
2426 | drop: | 2517 | drop: |
2427 | dev_kfree_skb_any(skb); | 2518 | dev_kfree_skb_any(skb); |
2428 | mgp->stats.tx_dropped += 1; | 2519 | ss->stats.tx_dropped += 1; |
2429 | return 0; | 2520 | return 0; |
2430 | 2521 | ||
2431 | } | 2522 | } |
@@ -2433,7 +2524,7 @@ drop: | |||
2433 | static int myri10ge_sw_tso(struct sk_buff *skb, struct net_device *dev) | 2524 | static int myri10ge_sw_tso(struct sk_buff *skb, struct net_device *dev) |
2434 | { | 2525 | { |
2435 | struct sk_buff *segs, *curr; | 2526 | struct sk_buff *segs, *curr; |
2436 | struct myri10ge_priv *mgp = dev->priv; | 2527 | struct myri10ge_priv *mgp = netdev_priv(dev); |
2437 | int status; | 2528 | int status; |
2438 | 2529 | ||
2439 | segs = skb_gso_segment(skb, dev->features & ~NETIF_F_TSO6); | 2530 | segs = skb_gso_segment(skb, dev->features & ~NETIF_F_TSO6); |
@@ -2473,14 +2564,13 @@ static struct net_device_stats *myri10ge_get_stats(struct net_device *dev) | |||
2473 | 2564 | ||
2474 | static void myri10ge_set_multicast_list(struct net_device *dev) | 2565 | static void myri10ge_set_multicast_list(struct net_device *dev) |
2475 | { | 2566 | { |
2567 | struct myri10ge_priv *mgp = netdev_priv(dev); | ||
2476 | struct myri10ge_cmd cmd; | 2568 | struct myri10ge_cmd cmd; |
2477 | struct myri10ge_priv *mgp; | ||
2478 | struct dev_mc_list *mc_list; | 2569 | struct dev_mc_list *mc_list; |
2479 | __be32 data[2] = { 0, 0 }; | 2570 | __be32 data[2] = { 0, 0 }; |
2480 | int err; | 2571 | int err; |
2481 | DECLARE_MAC_BUF(mac); | 2572 | DECLARE_MAC_BUF(mac); |
2482 | 2573 | ||
2483 | mgp = netdev_priv(dev); | ||
2484 | /* can be called from atomic contexts, | 2574 | /* can be called from atomic contexts, |
2485 | * pass 1 to force atomicity in myri10ge_send_cmd() */ | 2575 | * pass 1 to force atomicity in myri10ge_send_cmd() */ |
2486 | myri10ge_change_promisc(mgp, dev->flags & IFF_PROMISC, 1); | 2576 | myri10ge_change_promisc(mgp, dev->flags & IFF_PROMISC, 1); |
@@ -2616,13 +2706,14 @@ static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) | |||
2616 | ext_type = (val & PCI_EXP_FLAGS_TYPE) >> 4; | 2706 | ext_type = (val & PCI_EXP_FLAGS_TYPE) >> 4; |
2617 | if (ext_type != PCI_EXP_TYPE_ROOT_PORT) { | 2707 | if (ext_type != PCI_EXP_TYPE_ROOT_PORT) { |
2618 | if (myri10ge_ecrc_enable > 1) { | 2708 | if (myri10ge_ecrc_enable > 1) { |
2619 | struct pci_dev *old_bridge = bridge; | 2709 | struct pci_dev *prev_bridge, *old_bridge = bridge; |
2620 | 2710 | ||
2621 | /* Walk the hierarchy up to the root port | 2711 | /* Walk the hierarchy up to the root port |
2622 | * where ECRC has to be enabled */ | 2712 | * where ECRC has to be enabled */ |
2623 | do { | 2713 | do { |
2714 | prev_bridge = bridge; | ||
2624 | bridge = bridge->bus->self; | 2715 | bridge = bridge->bus->self; |
2625 | if (!bridge) { | 2716 | if (!bridge || prev_bridge == bridge) { |
2626 | dev_err(dev, | 2717 | dev_err(dev, |
2627 | "Failed to find root port" | 2718 | "Failed to find root port" |
2628 | " to force ECRC\n"); | 2719 | " to force ECRC\n"); |
@@ -2681,9 +2772,9 @@ static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) | |||
2681 | * already been enabled, then it must use a firmware image which works | 2772 | * already been enabled, then it must use a firmware image which works |
2682 | * around unaligned completion packets (myri10ge_ethp_z8e.dat), and it | 2773 | * around unaligned completion packets (myri10ge_ethp_z8e.dat), and it |
2683 | * should also ensure that it never gives the device a Read-DMA which is | 2774 | * should also ensure that it never gives the device a Read-DMA which is |
2684 | * larger than 2KB by setting the tx.boundary to 2KB. If ECRC is | 2775 | * larger than 2KB by setting the tx_boundary to 2KB. If ECRC is |
2685 | * enabled, then the driver should use the aligned (myri10ge_eth_z8e.dat) | 2776 | * enabled, then the driver should use the aligned (myri10ge_eth_z8e.dat) |
2686 | * firmware image, and set tx.boundary to 4KB. | 2777 | * firmware image, and set tx_boundary to 4KB. |
2687 | */ | 2778 | */ |
2688 | 2779 | ||
2689 | static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) | 2780 | static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) |
@@ -2692,7 +2783,7 @@ static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) | |||
2692 | struct device *dev = &pdev->dev; | 2783 | struct device *dev = &pdev->dev; |
2693 | int status; | 2784 | int status; |
2694 | 2785 | ||
2695 | mgp->tx.boundary = 4096; | 2786 | mgp->tx_boundary = 4096; |
2696 | /* | 2787 | /* |
2697 | * Verify the max read request size was set to 4KB | 2788 | * Verify the max read request size was set to 4KB |
2698 | * before trying the test with 4KB. | 2789 | * before trying the test with 4KB. |
@@ -2704,7 +2795,7 @@ static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) | |||
2704 | } | 2795 | } |
2705 | if (status != 4096) { | 2796 | if (status != 4096) { |
2706 | dev_warn(dev, "Max Read Request size != 4096 (%d)\n", status); | 2797 | dev_warn(dev, "Max Read Request size != 4096 (%d)\n", status); |
2707 | mgp->tx.boundary = 2048; | 2798 | mgp->tx_boundary = 2048; |
2708 | } | 2799 | } |
2709 | /* | 2800 | /* |
2710 | * load the optimized firmware (which assumes aligned PCIe | 2801 | * load the optimized firmware (which assumes aligned PCIe |
@@ -2737,7 +2828,7 @@ static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) | |||
2737 | "Please install up to date fw\n"); | 2828 | "Please install up to date fw\n"); |
2738 | abort: | 2829 | abort: |
2739 | /* fall back to using the unaligned firmware */ | 2830 | /* fall back to using the unaligned firmware */ |
2740 | mgp->tx.boundary = 2048; | 2831 | mgp->tx_boundary = 2048; |
2741 | mgp->fw_name = myri10ge_fw_unaligned; | 2832 | mgp->fw_name = myri10ge_fw_unaligned; |
2742 | 2833 | ||
2743 | } | 2834 | } |
@@ -2758,7 +2849,7 @@ static void myri10ge_select_firmware(struct myri10ge_priv *mgp) | |||
2758 | if (link_width < 8) { | 2849 | if (link_width < 8) { |
2759 | dev_info(&mgp->pdev->dev, "PCIE x%d Link\n", | 2850 | dev_info(&mgp->pdev->dev, "PCIE x%d Link\n", |
2760 | link_width); | 2851 | link_width); |
2761 | mgp->tx.boundary = 4096; | 2852 | mgp->tx_boundary = 4096; |
2762 | mgp->fw_name = myri10ge_fw_aligned; | 2853 | mgp->fw_name = myri10ge_fw_aligned; |
2763 | } else { | 2854 | } else { |
2764 | myri10ge_firmware_probe(mgp); | 2855 | myri10ge_firmware_probe(mgp); |
@@ -2767,12 +2858,12 @@ static void myri10ge_select_firmware(struct myri10ge_priv *mgp) | |||
2767 | if (myri10ge_force_firmware == 1) { | 2858 | if (myri10ge_force_firmware == 1) { |
2768 | dev_info(&mgp->pdev->dev, | 2859 | dev_info(&mgp->pdev->dev, |
2769 | "Assuming aligned completions (forced)\n"); | 2860 | "Assuming aligned completions (forced)\n"); |
2770 | mgp->tx.boundary = 4096; | 2861 | mgp->tx_boundary = 4096; |
2771 | mgp->fw_name = myri10ge_fw_aligned; | 2862 | mgp->fw_name = myri10ge_fw_aligned; |
2772 | } else { | 2863 | } else { |
2773 | dev_info(&mgp->pdev->dev, | 2864 | dev_info(&mgp->pdev->dev, |
2774 | "Assuming unaligned completions (forced)\n"); | 2865 | "Assuming unaligned completions (forced)\n"); |
2775 | mgp->tx.boundary = 2048; | 2866 | mgp->tx_boundary = 2048; |
2776 | mgp->fw_name = myri10ge_fw_unaligned; | 2867 | mgp->fw_name = myri10ge_fw_unaligned; |
2777 | } | 2868 | } |
2778 | } | 2869 | } |
@@ -2889,6 +2980,7 @@ static void myri10ge_watchdog(struct work_struct *work) | |||
2889 | { | 2980 | { |
2890 | struct myri10ge_priv *mgp = | 2981 | struct myri10ge_priv *mgp = |
2891 | container_of(work, struct myri10ge_priv, watchdog_work); | 2982 | container_of(work, struct myri10ge_priv, watchdog_work); |
2983 | struct myri10ge_tx_buf *tx; | ||
2892 | u32 reboot; | 2984 | u32 reboot; |
2893 | int status; | 2985 | int status; |
2894 | u16 cmd, vendor; | 2986 | u16 cmd, vendor; |
@@ -2938,15 +3030,16 @@ static void myri10ge_watchdog(struct work_struct *work) | |||
2938 | 3030 | ||
2939 | printk(KERN_ERR "myri10ge: %s: device timeout, resetting\n", | 3031 | printk(KERN_ERR "myri10ge: %s: device timeout, resetting\n", |
2940 | mgp->dev->name); | 3032 | mgp->dev->name); |
3033 | tx = &mgp->ss.tx; | ||
2941 | printk(KERN_INFO "myri10ge: %s: %d %d %d %d %d\n", | 3034 | printk(KERN_INFO "myri10ge: %s: %d %d %d %d %d\n", |
2942 | mgp->dev->name, mgp->tx.req, mgp->tx.done, | 3035 | mgp->dev->name, tx->req, tx->done, |
2943 | mgp->tx.pkt_start, mgp->tx.pkt_done, | 3036 | tx->pkt_start, tx->pkt_done, |
2944 | (int)ntohl(mgp->fw_stats->send_done_count)); | 3037 | (int)ntohl(mgp->ss.fw_stats->send_done_count)); |
2945 | msleep(2000); | 3038 | msleep(2000); |
2946 | printk(KERN_INFO "myri10ge: %s: %d %d %d %d %d\n", | 3039 | printk(KERN_INFO "myri10ge: %s: %d %d %d %d %d\n", |
2947 | mgp->dev->name, mgp->tx.req, mgp->tx.done, | 3040 | mgp->dev->name, tx->req, tx->done, |
2948 | mgp->tx.pkt_start, mgp->tx.pkt_done, | 3041 | tx->pkt_start, tx->pkt_done, |
2949 | (int)ntohl(mgp->fw_stats->send_done_count)); | 3042 | (int)ntohl(mgp->ss.fw_stats->send_done_count)); |
2950 | } | 3043 | } |
2951 | rtnl_lock(); | 3044 | rtnl_lock(); |
2952 | myri10ge_close(mgp->dev); | 3045 | myri10ge_close(mgp->dev); |
@@ -2969,28 +3062,31 @@ static void myri10ge_watchdog(struct work_struct *work) | |||
2969 | static void myri10ge_watchdog_timer(unsigned long arg) | 3062 | static void myri10ge_watchdog_timer(unsigned long arg) |
2970 | { | 3063 | { |
2971 | struct myri10ge_priv *mgp; | 3064 | struct myri10ge_priv *mgp; |
3065 | struct myri10ge_slice_state *ss; | ||
2972 | u32 rx_pause_cnt; | 3066 | u32 rx_pause_cnt; |
2973 | 3067 | ||
2974 | mgp = (struct myri10ge_priv *)arg; | 3068 | mgp = (struct myri10ge_priv *)arg; |
2975 | 3069 | ||
2976 | if (mgp->rx_small.watchdog_needed) { | 3070 | rx_pause_cnt = ntohl(mgp->ss.fw_stats->dropped_pause); |
2977 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_small, | 3071 | |
3072 | ss = &mgp->ss; | ||
3073 | if (ss->rx_small.watchdog_needed) { | ||
3074 | myri10ge_alloc_rx_pages(mgp, &ss->rx_small, | ||
2978 | mgp->small_bytes + MXGEFW_PAD, 1); | 3075 | mgp->small_bytes + MXGEFW_PAD, 1); |
2979 | if (mgp->rx_small.fill_cnt - mgp->rx_small.cnt >= | 3076 | if (ss->rx_small.fill_cnt - ss->rx_small.cnt >= |
2980 | myri10ge_fill_thresh) | 3077 | myri10ge_fill_thresh) |
2981 | mgp->rx_small.watchdog_needed = 0; | 3078 | ss->rx_small.watchdog_needed = 0; |
2982 | } | 3079 | } |
2983 | if (mgp->rx_big.watchdog_needed) { | 3080 | if (ss->rx_big.watchdog_needed) { |
2984 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_big, mgp->big_bytes, 1); | 3081 | myri10ge_alloc_rx_pages(mgp, &ss->rx_big, mgp->big_bytes, 1); |
2985 | if (mgp->rx_big.fill_cnt - mgp->rx_big.cnt >= | 3082 | if (ss->rx_big.fill_cnt - ss->rx_big.cnt >= |
2986 | myri10ge_fill_thresh) | 3083 | myri10ge_fill_thresh) |
2987 | mgp->rx_big.watchdog_needed = 0; | 3084 | ss->rx_big.watchdog_needed = 0; |
2988 | } | 3085 | } |
2989 | rx_pause_cnt = ntohl(mgp->fw_stats->dropped_pause); | ||
2990 | 3086 | ||
2991 | if (mgp->tx.req != mgp->tx.done && | 3087 | if (ss->tx.req != ss->tx.done && |
2992 | mgp->tx.done == mgp->watchdog_tx_done && | 3088 | ss->tx.done == ss->watchdog_tx_done && |
2993 | mgp->watchdog_tx_req != mgp->watchdog_tx_done) { | 3089 | ss->watchdog_tx_req != ss->watchdog_tx_done) { |
2994 | /* nic seems like it might be stuck.. */ | 3090 | /* nic seems like it might be stuck.. */ |
2995 | if (rx_pause_cnt != mgp->watchdog_pause) { | 3091 | if (rx_pause_cnt != mgp->watchdog_pause) { |
2996 | if (net_ratelimit()) | 3092 | if (net_ratelimit()) |
@@ -3005,8 +3101,8 @@ static void myri10ge_watchdog_timer(unsigned long arg) | |||
3005 | /* rearm timer */ | 3101 | /* rearm timer */ |
3006 | mod_timer(&mgp->watchdog_timer, | 3102 | mod_timer(&mgp->watchdog_timer, |
3007 | jiffies + myri10ge_watchdog_timeout * HZ); | 3103 | jiffies + myri10ge_watchdog_timeout * HZ); |
3008 | mgp->watchdog_tx_done = mgp->tx.done; | 3104 | ss->watchdog_tx_done = ss->tx.done; |
3009 | mgp->watchdog_tx_req = mgp->tx.req; | 3105 | ss->watchdog_tx_req = ss->tx.req; |
3010 | mgp->watchdog_pause = rx_pause_cnt; | 3106 | mgp->watchdog_pause = rx_pause_cnt; |
3011 | } | 3107 | } |
3012 | 3108 | ||
@@ -3030,7 +3126,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3030 | 3126 | ||
3031 | mgp = netdev_priv(netdev); | 3127 | mgp = netdev_priv(netdev); |
3032 | mgp->dev = netdev; | 3128 | mgp->dev = netdev; |
3033 | netif_napi_add(netdev, &mgp->napi, myri10ge_poll, myri10ge_napi_weight); | 3129 | netif_napi_add(netdev, &mgp->ss.napi, myri10ge_poll, myri10ge_napi_weight); |
3034 | mgp->pdev = pdev; | 3130 | mgp->pdev = pdev; |
3035 | mgp->csum_flag = MXGEFW_FLAGS_CKSUM; | 3131 | mgp->csum_flag = MXGEFW_FLAGS_CKSUM; |
3036 | mgp->pause = myri10ge_flow_control; | 3132 | mgp->pause = myri10ge_flow_control; |
@@ -3076,9 +3172,9 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3076 | if (mgp->cmd == NULL) | 3172 | if (mgp->cmd == NULL) |
3077 | goto abort_with_netdev; | 3173 | goto abort_with_netdev; |
3078 | 3174 | ||
3079 | mgp->fw_stats = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->fw_stats), | 3175 | mgp->ss.fw_stats = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->ss.fw_stats), |
3080 | &mgp->fw_stats_bus, GFP_KERNEL); | 3176 | &mgp->ss.fw_stats_bus, GFP_KERNEL); |
3081 | if (mgp->fw_stats == NULL) | 3177 | if (mgp->ss.fw_stats == NULL) |
3082 | goto abort_with_cmd; | 3178 | goto abort_with_cmd; |
3083 | 3179 | ||
3084 | mgp->board_span = pci_resource_len(pdev, 0); | 3180 | mgp->board_span = pci_resource_len(pdev, 0); |
@@ -3118,12 +3214,12 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3118 | netdev->dev_addr[i] = mgp->mac_addr[i]; | 3214 | netdev->dev_addr[i] = mgp->mac_addr[i]; |
3119 | 3215 | ||
3120 | /* allocate rx done ring */ | 3216 | /* allocate rx done ring */ |
3121 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); | 3217 | bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry); |
3122 | mgp->rx_done.entry = dma_alloc_coherent(&pdev->dev, bytes, | 3218 | mgp->ss.rx_done.entry = dma_alloc_coherent(&pdev->dev, bytes, |
3123 | &mgp->rx_done.bus, GFP_KERNEL); | 3219 | &mgp->ss.rx_done.bus, GFP_KERNEL); |
3124 | if (mgp->rx_done.entry == NULL) | 3220 | if (mgp->ss.rx_done.entry == NULL) |
3125 | goto abort_with_ioremap; | 3221 | goto abort_with_ioremap; |
3126 | memset(mgp->rx_done.entry, 0, bytes); | 3222 | memset(mgp->ss.rx_done.entry, 0, bytes); |
3127 | 3223 | ||
3128 | myri10ge_select_firmware(mgp); | 3224 | myri10ge_select_firmware(mgp); |
3129 | 3225 | ||
@@ -3183,7 +3279,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3183 | } | 3279 | } |
3184 | dev_info(dev, "%s IRQ %d, tx bndry %d, fw %s, WC %s\n", | 3280 | dev_info(dev, "%s IRQ %d, tx bndry %d, fw %s, WC %s\n", |
3185 | (mgp->msi_enabled ? "MSI" : "xPIC"), | 3281 | (mgp->msi_enabled ? "MSI" : "xPIC"), |
3186 | netdev->irq, mgp->tx.boundary, mgp->fw_name, | 3282 | netdev->irq, mgp->tx_boundary, mgp->fw_name, |
3187 | (mgp->wc_enabled ? "Enabled" : "Disabled")); | 3283 | (mgp->wc_enabled ? "Enabled" : "Disabled")); |
3188 | 3284 | ||
3189 | return 0; | 3285 | return 0; |
@@ -3195,9 +3291,9 @@ abort_with_firmware: | |||
3195 | myri10ge_dummy_rdma(mgp, 0); | 3291 | myri10ge_dummy_rdma(mgp, 0); |
3196 | 3292 | ||
3197 | abort_with_rx_done: | 3293 | abort_with_rx_done: |
3198 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); | 3294 | bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry); |
3199 | dma_free_coherent(&pdev->dev, bytes, | 3295 | dma_free_coherent(&pdev->dev, bytes, |
3200 | mgp->rx_done.entry, mgp->rx_done.bus); | 3296 | mgp->ss.rx_done.entry, mgp->ss.rx_done.bus); |
3201 | 3297 | ||
3202 | abort_with_ioremap: | 3298 | abort_with_ioremap: |
3203 | iounmap(mgp->sram); | 3299 | iounmap(mgp->sram); |
@@ -3207,8 +3303,8 @@ abort_with_wc: | |||
3207 | if (mgp->mtrr >= 0) | 3303 | if (mgp->mtrr >= 0) |
3208 | mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); | 3304 | mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); |
3209 | #endif | 3305 | #endif |
3210 | dma_free_coherent(&pdev->dev, sizeof(*mgp->fw_stats), | 3306 | dma_free_coherent(&pdev->dev, sizeof(*mgp->ss.fw_stats), |
3211 | mgp->fw_stats, mgp->fw_stats_bus); | 3307 | mgp->ss.fw_stats, mgp->ss.fw_stats_bus); |
3212 | 3308 | ||
3213 | abort_with_cmd: | 3309 | abort_with_cmd: |
3214 | dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), | 3310 | dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), |
@@ -3246,9 +3342,9 @@ static void myri10ge_remove(struct pci_dev *pdev) | |||
3246 | /* avoid a memory leak */ | 3342 | /* avoid a memory leak */ |
3247 | pci_restore_state(pdev); | 3343 | pci_restore_state(pdev); |
3248 | 3344 | ||
3249 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); | 3345 | bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry); |
3250 | dma_free_coherent(&pdev->dev, bytes, | 3346 | dma_free_coherent(&pdev->dev, bytes, |
3251 | mgp->rx_done.entry, mgp->rx_done.bus); | 3347 | mgp->ss.rx_done.entry, mgp->ss.rx_done.bus); |
3252 | 3348 | ||
3253 | iounmap(mgp->sram); | 3349 | iounmap(mgp->sram); |
3254 | 3350 | ||
@@ -3256,8 +3352,8 @@ static void myri10ge_remove(struct pci_dev *pdev) | |||
3256 | if (mgp->mtrr >= 0) | 3352 | if (mgp->mtrr >= 0) |
3257 | mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); | 3353 | mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); |
3258 | #endif | 3354 | #endif |
3259 | dma_free_coherent(&pdev->dev, sizeof(*mgp->fw_stats), | 3355 | dma_free_coherent(&pdev->dev, sizeof(*mgp->ss.fw_stats), |
3260 | mgp->fw_stats, mgp->fw_stats_bus); | 3356 | mgp->ss.fw_stats, mgp->ss.fw_stats_bus); |
3261 | 3357 | ||
3262 | dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), | 3358 | dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), |
3263 | mgp->cmd, mgp->cmd_bus); | 3359 | mgp->cmd, mgp->cmd_bus); |