diff options
Diffstat (limited to 'drivers/net/qlcnic/qlcnic_main.c')
-rw-r--r-- | drivers/net/qlcnic/qlcnic_main.c | 158 |
1 files changed, 99 insertions, 59 deletions
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index de6f86681a3c..dde7e4403830 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
@@ -113,7 +113,7 @@ static DEFINE_PCI_DEVICE_TABLE(qlcnic_pci_tbl) = { | |||
113 | MODULE_DEVICE_TABLE(pci, qlcnic_pci_tbl); | 113 | MODULE_DEVICE_TABLE(pci, qlcnic_pci_tbl); |
114 | 114 | ||
115 | 115 | ||
116 | void | 116 | inline void |
117 | qlcnic_update_cmd_producer(struct qlcnic_adapter *adapter, | 117 | qlcnic_update_cmd_producer(struct qlcnic_adapter *adapter, |
118 | struct qlcnic_host_tx_ring *tx_ring) | 118 | struct qlcnic_host_tx_ring *tx_ring) |
119 | { | 119 | { |
@@ -169,7 +169,7 @@ qlcnic_napi_add(struct qlcnic_adapter *adapter, struct net_device *netdev) | |||
169 | { | 169 | { |
170 | int ring; | 170 | int ring; |
171 | struct qlcnic_host_sds_ring *sds_ring; | 171 | struct qlcnic_host_sds_ring *sds_ring; |
172 | struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx; | 172 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
173 | 173 | ||
174 | if (qlcnic_alloc_sds_rings(recv_ctx, adapter->max_sds_rings)) | 174 | if (qlcnic_alloc_sds_rings(recv_ctx, adapter->max_sds_rings)) |
175 | return -ENOMEM; | 175 | return -ENOMEM; |
@@ -193,14 +193,14 @@ qlcnic_napi_del(struct qlcnic_adapter *adapter) | |||
193 | { | 193 | { |
194 | int ring; | 194 | int ring; |
195 | struct qlcnic_host_sds_ring *sds_ring; | 195 | struct qlcnic_host_sds_ring *sds_ring; |
196 | struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx; | 196 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
197 | 197 | ||
198 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 198 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { |
199 | sds_ring = &recv_ctx->sds_rings[ring]; | 199 | sds_ring = &recv_ctx->sds_rings[ring]; |
200 | netif_napi_del(&sds_ring->napi); | 200 | netif_napi_del(&sds_ring->napi); |
201 | } | 201 | } |
202 | 202 | ||
203 | qlcnic_free_sds_rings(&adapter->recv_ctx); | 203 | qlcnic_free_sds_rings(adapter->recv_ctx); |
204 | } | 204 | } |
205 | 205 | ||
206 | static void | 206 | static void |
@@ -208,7 +208,7 @@ qlcnic_napi_enable(struct qlcnic_adapter *adapter) | |||
208 | { | 208 | { |
209 | int ring; | 209 | int ring; |
210 | struct qlcnic_host_sds_ring *sds_ring; | 210 | struct qlcnic_host_sds_ring *sds_ring; |
211 | struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx; | 211 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
212 | 212 | ||
213 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) | 213 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) |
214 | return; | 214 | return; |
@@ -225,7 +225,7 @@ qlcnic_napi_disable(struct qlcnic_adapter *adapter) | |||
225 | { | 225 | { |
226 | int ring; | 226 | int ring; |
227 | struct qlcnic_host_sds_ring *sds_ring; | 227 | struct qlcnic_host_sds_ring *sds_ring; |
228 | struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx; | 228 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
229 | 229 | ||
230 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) | 230 | if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) |
231 | return; | 231 | return; |
@@ -359,7 +359,7 @@ qlcnic_setup_intr(struct qlcnic_adapter *adapter) | |||
359 | struct pci_dev *pdev = adapter->pdev; | 359 | struct pci_dev *pdev = adapter->pdev; |
360 | int err, num_msix; | 360 | int err, num_msix; |
361 | 361 | ||
362 | if (adapter->rss_supported) { | 362 | if (adapter->msix_supported) { |
363 | num_msix = (num_online_cpus() >= MSIX_ENTRIES_PER_ADAPTER) ? | 363 | num_msix = (num_online_cpus() >= MSIX_ENTRIES_PER_ADAPTER) ? |
364 | MSIX_ENTRIES_PER_ADAPTER : 2; | 364 | MSIX_ENTRIES_PER_ADAPTER : 2; |
365 | } else | 365 | } else |
@@ -369,7 +369,7 @@ qlcnic_setup_intr(struct qlcnic_adapter *adapter) | |||
369 | 369 | ||
370 | adapter->flags &= ~(QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED); | 370 | adapter->flags &= ~(QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED); |
371 | 371 | ||
372 | legacy_intrp = &legacy_intr[adapter->ahw.pci_func]; | 372 | legacy_intrp = &legacy_intr[adapter->ahw->pci_func]; |
373 | 373 | ||
374 | adapter->int_vec_bit = legacy_intrp->int_vec_bit; | 374 | adapter->int_vec_bit = legacy_intrp->int_vec_bit; |
375 | adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter, | 375 | adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter, |
@@ -391,8 +391,7 @@ qlcnic_setup_intr(struct qlcnic_adapter *adapter) | |||
391 | adapter->flags |= QLCNIC_MSIX_ENABLED; | 391 | adapter->flags |= QLCNIC_MSIX_ENABLED; |
392 | qlcnic_set_msix_bit(pdev, 1); | 392 | qlcnic_set_msix_bit(pdev, 1); |
393 | 393 | ||
394 | if (adapter->rss_supported) | 394 | adapter->max_sds_rings = num_msix; |
395 | adapter->max_sds_rings = num_msix; | ||
396 | 395 | ||
397 | dev_info(&pdev->dev, "using msi-x interrupts\n"); | 396 | dev_info(&pdev->dev, "using msi-x interrupts\n"); |
398 | return; | 397 | return; |
@@ -407,7 +406,7 @@ qlcnic_setup_intr(struct qlcnic_adapter *adapter) | |||
407 | if (use_msi && !pci_enable_msi(pdev)) { | 406 | if (use_msi && !pci_enable_msi(pdev)) { |
408 | adapter->flags |= QLCNIC_MSI_ENABLED; | 407 | adapter->flags |= QLCNIC_MSI_ENABLED; |
409 | adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter, | 408 | adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter, |
410 | msi_tgt_status[adapter->ahw.pci_func]); | 409 | msi_tgt_status[adapter->ahw->pci_func]); |
411 | dev_info(&pdev->dev, "using msi interrupts\n"); | 410 | dev_info(&pdev->dev, "using msi interrupts\n"); |
412 | adapter->msix_entries[0].vector = pdev->irq; | 411 | adapter->msix_entries[0].vector = pdev->irq; |
413 | return; | 412 | return; |
@@ -429,8 +428,8 @@ qlcnic_teardown_intr(struct qlcnic_adapter *adapter) | |||
429 | static void | 428 | static void |
430 | qlcnic_cleanup_pci_map(struct qlcnic_adapter *adapter) | 429 | qlcnic_cleanup_pci_map(struct qlcnic_adapter *adapter) |
431 | { | 430 | { |
432 | if (adapter->ahw.pci_base0 != NULL) | 431 | if (adapter->ahw->pci_base0 != NULL) |
433 | iounmap(adapter->ahw.pci_base0); | 432 | iounmap(adapter->ahw->pci_base0); |
434 | } | 433 | } |
435 | 434 | ||
436 | static int | 435 | static int |
@@ -500,7 +499,7 @@ qlcnic_set_function_modes(struct qlcnic_adapter *adapter) | |||
500 | u32 ref_count; | 499 | u32 ref_count; |
501 | int i, ret = 1; | 500 | int i, ret = 1; |
502 | u32 data = QLCNIC_MGMT_FUNC; | 501 | u32 data = QLCNIC_MGMT_FUNC; |
503 | void __iomem *priv_op = adapter->ahw.pci_base0 + QLCNIC_DRV_OP_MODE; | 502 | void __iomem *priv_op = adapter->ahw->pci_base0 + QLCNIC_DRV_OP_MODE; |
504 | 503 | ||
505 | /* If other drivers are not in use set their privilege level */ | 504 | /* If other drivers are not in use set their privilege level */ |
506 | ref_count = QLCRD32(adapter, QLCNIC_CRB_DRV_ACTIVE); | 505 | ref_count = QLCRD32(adapter, QLCNIC_CRB_DRV_ACTIVE); |
@@ -512,16 +511,16 @@ qlcnic_set_function_modes(struct qlcnic_adapter *adapter) | |||
512 | for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) { | 511 | for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) { |
513 | id = i; | 512 | id = i; |
514 | if (adapter->npars[i].type != QLCNIC_TYPE_NIC || | 513 | if (adapter->npars[i].type != QLCNIC_TYPE_NIC || |
515 | id == adapter->ahw.pci_func) | 514 | id == adapter->ahw->pci_func) |
516 | continue; | 515 | continue; |
517 | data |= (qlcnic_config_npars & | 516 | data |= (qlcnic_config_npars & |
518 | QLC_DEV_SET_DRV(0xf, id)); | 517 | QLC_DEV_SET_DRV(0xf, id)); |
519 | } | 518 | } |
520 | } else { | 519 | } else { |
521 | data = readl(priv_op); | 520 | data = readl(priv_op); |
522 | data = (data & ~QLC_DEV_SET_DRV(0xf, adapter->ahw.pci_func)) | | 521 | data = (data & ~QLC_DEV_SET_DRV(0xf, adapter->ahw->pci_func)) | |
523 | (QLC_DEV_SET_DRV(QLCNIC_MGMT_FUNC, | 522 | (QLC_DEV_SET_DRV(QLCNIC_MGMT_FUNC, |
524 | adapter->ahw.pci_func)); | 523 | adapter->ahw->pci_func)); |
525 | } | 524 | } |
526 | writel(data, priv_op); | 525 | writel(data, priv_op); |
527 | qlcnic_api_unlock(adapter); | 526 | qlcnic_api_unlock(adapter); |
@@ -539,22 +538,23 @@ qlcnic_check_vf(struct qlcnic_adapter *adapter) | |||
539 | u32 op_mode, priv_level; | 538 | u32 op_mode, priv_level; |
540 | 539 | ||
541 | /* Determine FW API version */ | 540 | /* Determine FW API version */ |
542 | adapter->fw_hal_version = readl(adapter->ahw.pci_base0 + QLCNIC_FW_API); | 541 | adapter->fw_hal_version = readl(adapter->ahw->pci_base0 + |
542 | QLCNIC_FW_API); | ||
543 | 543 | ||
544 | /* Find PCI function number */ | 544 | /* Find PCI function number */ |
545 | pci_read_config_dword(adapter->pdev, QLCNIC_MSIX_TABLE_OFFSET, &func); | 545 | pci_read_config_dword(adapter->pdev, QLCNIC_MSIX_TABLE_OFFSET, &func); |
546 | msix_base_addr = adapter->ahw.pci_base0 + QLCNIC_MSIX_BASE; | 546 | msix_base_addr = adapter->ahw->pci_base0 + QLCNIC_MSIX_BASE; |
547 | msix_base = readl(msix_base_addr); | 547 | msix_base = readl(msix_base_addr); |
548 | func = (func - msix_base)/QLCNIC_MSIX_TBL_PGSIZE; | 548 | func = (func - msix_base)/QLCNIC_MSIX_TBL_PGSIZE; |
549 | adapter->ahw.pci_func = func; | 549 | adapter->ahw->pci_func = func; |
550 | 550 | ||
551 | /* Determine function privilege level */ | 551 | /* Determine function privilege level */ |
552 | priv_op = adapter->ahw.pci_base0 + QLCNIC_DRV_OP_MODE; | 552 | priv_op = adapter->ahw->pci_base0 + QLCNIC_DRV_OP_MODE; |
553 | op_mode = readl(priv_op); | 553 | op_mode = readl(priv_op); |
554 | if (op_mode == QLC_DEV_DRV_DEFAULT) | 554 | if (op_mode == QLC_DEV_DRV_DEFAULT) |
555 | priv_level = QLCNIC_MGMT_FUNC; | 555 | priv_level = QLCNIC_MGMT_FUNC; |
556 | else | 556 | else |
557 | priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw.pci_func); | 557 | priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); |
558 | 558 | ||
559 | if (priv_level == QLCNIC_NON_PRIV_FUNC) { | 559 | if (priv_level == QLCNIC_NON_PRIV_FUNC) { |
560 | adapter->op_mode = QLCNIC_NON_PRIV_FUNC; | 560 | adapter->op_mode = QLCNIC_NON_PRIV_FUNC; |
@@ -593,13 +593,14 @@ qlcnic_setup_pci_map(struct qlcnic_adapter *adapter) | |||
593 | 593 | ||
594 | dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20)); | 594 | dev_info(&pdev->dev, "%dMB memory map\n", (int)(mem_len>>20)); |
595 | 595 | ||
596 | adapter->ahw.pci_base0 = mem_ptr0; | 596 | adapter->ahw->pci_base0 = mem_ptr0; |
597 | adapter->ahw.pci_len0 = pci_len0; | 597 | adapter->ahw->pci_len0 = pci_len0; |
598 | 598 | ||
599 | qlcnic_check_vf(adapter); | 599 | qlcnic_check_vf(adapter); |
600 | 600 | ||
601 | adapter->ahw.ocm_win_crb = qlcnic_get_ioaddr(adapter, | 601 | adapter->ahw->ocm_win_crb = qlcnic_get_ioaddr(adapter, |
602 | QLCNIC_PCIX_PS_REG(PCIX_OCM_WINDOW_REG(adapter->ahw.pci_func))); | 602 | QLCNIC_PCIX_PS_REG(PCIX_OCM_WINDOW_REG( |
603 | adapter->ahw->pci_func))); | ||
603 | 604 | ||
604 | return 0; | 605 | return 0; |
605 | } | 606 | } |
@@ -641,7 +642,7 @@ qlcnic_check_options(struct qlcnic_adapter *adapter) | |||
641 | 642 | ||
642 | dev_info(&pdev->dev, "firmware v%d.%d.%d\n", | 643 | dev_info(&pdev->dev, "firmware v%d.%d.%d\n", |
643 | fw_major, fw_minor, fw_build); | 644 | fw_major, fw_minor, fw_build); |
644 | if (adapter->ahw.port_type == QLCNIC_XGBE) { | 645 | if (adapter->ahw->port_type == QLCNIC_XGBE) { |
645 | if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { | 646 | if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { |
646 | adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF; | 647 | adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF; |
647 | adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF; | 648 | adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF; |
@@ -653,7 +654,7 @@ qlcnic_check_options(struct qlcnic_adapter *adapter) | |||
653 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; | 654 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; |
654 | adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; | 655 | adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; |
655 | 656 | ||
656 | } else if (adapter->ahw.port_type == QLCNIC_GBE) { | 657 | } else if (adapter->ahw->port_type == QLCNIC_GBE) { |
657 | adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; | 658 | adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; |
658 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; | 659 | adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; |
659 | adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; | 660 | adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; |
@@ -661,7 +662,6 @@ qlcnic_check_options(struct qlcnic_adapter *adapter) | |||
661 | } | 662 | } |
662 | 663 | ||
663 | adapter->msix_supported = !!use_msi_x; | 664 | adapter->msix_supported = !!use_msi_x; |
664 | adapter->rss_supported = !!use_msi_x; | ||
665 | 665 | ||
666 | adapter->num_txd = MAX_CMD_DESCRIPTORS; | 666 | adapter->num_txd = MAX_CMD_DESCRIPTORS; |
667 | 667 | ||
@@ -674,7 +674,7 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter) | |||
674 | int err; | 674 | int err; |
675 | struct qlcnic_info nic_info; | 675 | struct qlcnic_info nic_info; |
676 | 676 | ||
677 | err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw.pci_func); | 677 | err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); |
678 | if (err) | 678 | if (err) |
679 | return err; | 679 | return err; |
680 | 680 | ||
@@ -736,7 +736,7 @@ qlcnic_set_eswitch_port_config(struct qlcnic_adapter *adapter) | |||
736 | if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) | 736 | if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) |
737 | return 0; | 737 | return 0; |
738 | 738 | ||
739 | esw_cfg.pci_func = adapter->ahw.pci_func; | 739 | esw_cfg.pci_func = adapter->ahw->pci_func; |
740 | if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg)) | 740 | if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg)) |
741 | return -EIO; | 741 | return -EIO; |
742 | qlcnic_set_vlan_config(adapter, &esw_cfg); | 742 | qlcnic_set_vlan_config(adapter, &esw_cfg); |
@@ -793,14 +793,14 @@ qlcnic_check_eswitch_mode(struct qlcnic_adapter *adapter) | |||
793 | if (adapter->flags & QLCNIC_ADAPTER_INITIALIZED) | 793 | if (adapter->flags & QLCNIC_ADAPTER_INITIALIZED) |
794 | return 0; | 794 | return 0; |
795 | 795 | ||
796 | priv_op = adapter->ahw.pci_base0 + QLCNIC_DRV_OP_MODE; | 796 | priv_op = adapter->ahw->pci_base0 + QLCNIC_DRV_OP_MODE; |
797 | op_mode = readl(priv_op); | 797 | op_mode = readl(priv_op); |
798 | priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw.pci_func); | 798 | priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); |
799 | 799 | ||
800 | if (op_mode == QLC_DEV_DRV_DEFAULT) | 800 | if (op_mode == QLC_DEV_DRV_DEFAULT) |
801 | priv_level = QLCNIC_MGMT_FUNC; | 801 | priv_level = QLCNIC_MGMT_FUNC; |
802 | else | 802 | else |
803 | priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw.pci_func); | 803 | priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); |
804 | 804 | ||
805 | if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { | 805 | if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { |
806 | if (priv_level == QLCNIC_MGMT_FUNC) { | 806 | if (priv_level == QLCNIC_MGMT_FUNC) { |
@@ -1040,7 +1040,7 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) | |||
1040 | 1040 | ||
1041 | unsigned long flags = 0; | 1041 | unsigned long flags = 0; |
1042 | struct net_device *netdev = adapter->netdev; | 1042 | struct net_device *netdev = adapter->netdev; |
1043 | struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx; | 1043 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
1044 | 1044 | ||
1045 | if (adapter->diag_test == QLCNIC_INTERRUPT_TEST) { | 1045 | if (adapter->diag_test == QLCNIC_INTERRUPT_TEST) { |
1046 | handler = qlcnic_tmp_intr; | 1046 | handler = qlcnic_tmp_intr; |
@@ -1077,7 +1077,7 @@ qlcnic_free_irq(struct qlcnic_adapter *adapter) | |||
1077 | int ring; | 1077 | int ring; |
1078 | struct qlcnic_host_sds_ring *sds_ring; | 1078 | struct qlcnic_host_sds_ring *sds_ring; |
1079 | 1079 | ||
1080 | struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx; | 1080 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
1081 | 1081 | ||
1082 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1082 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { |
1083 | sds_ring = &recv_ctx->sds_rings[ring]; | 1083 | sds_ring = &recv_ctx->sds_rings[ring]; |
@@ -1117,14 +1117,14 @@ __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) | |||
1117 | return -EIO; | 1117 | return -EIO; |
1118 | 1118 | ||
1119 | for (ring = 0; ring < adapter->max_rds_rings; ring++) { | 1119 | for (ring = 0; ring < adapter->max_rds_rings; ring++) { |
1120 | rds_ring = &adapter->recv_ctx.rds_rings[ring]; | 1120 | rds_ring = &adapter->recv_ctx->rds_rings[ring]; |
1121 | qlcnic_post_rx_buffers(adapter, ring, rds_ring); | 1121 | qlcnic_post_rx_buffers(adapter, rds_ring); |
1122 | } | 1122 | } |
1123 | 1123 | ||
1124 | qlcnic_set_multi(netdev); | 1124 | qlcnic_set_multi(netdev); |
1125 | qlcnic_fw_cmd_set_mtu(adapter, netdev->mtu); | 1125 | qlcnic_fw_cmd_set_mtu(adapter, netdev->mtu); |
1126 | 1126 | ||
1127 | adapter->ahw.linkup = 0; | 1127 | adapter->ahw->linkup = 0; |
1128 | 1128 | ||
1129 | if (adapter->max_sds_rings > 1) | 1129 | if (adapter->max_sds_rings > 1) |
1130 | qlcnic_config_rss(adapter, 1); | 1130 | qlcnic_config_rss(adapter, 1); |
@@ -1274,7 +1274,7 @@ void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings) | |||
1274 | clear_bit(__QLCNIC_DEV_UP, &adapter->state); | 1274 | clear_bit(__QLCNIC_DEV_UP, &adapter->state); |
1275 | if (adapter->diag_test == QLCNIC_INTERRUPT_TEST) { | 1275 | if (adapter->diag_test == QLCNIC_INTERRUPT_TEST) { |
1276 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1276 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { |
1277 | sds_ring = &adapter->recv_ctx.sds_rings[ring]; | 1277 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; |
1278 | qlcnic_disable_int(sds_ring); | 1278 | qlcnic_disable_int(sds_ring); |
1279 | } | 1279 | } |
1280 | } | 1280 | } |
@@ -1295,6 +1295,39 @@ out: | |||
1295 | netif_device_attach(netdev); | 1295 | netif_device_attach(netdev); |
1296 | } | 1296 | } |
1297 | 1297 | ||
1298 | static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) | ||
1299 | { | ||
1300 | int err = 0; | ||
1301 | adapter->ahw = kzalloc(sizeof(struct qlcnic_hardware_context), | ||
1302 | GFP_KERNEL); | ||
1303 | if (!adapter->ahw) { | ||
1304 | dev_err(&adapter->pdev->dev, | ||
1305 | "Failed to allocate recv ctx resources for adapter\n"); | ||
1306 | err = -ENOMEM; | ||
1307 | goto err_out; | ||
1308 | } | ||
1309 | adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context), | ||
1310 | GFP_KERNEL); | ||
1311 | if (!adapter->recv_ctx) { | ||
1312 | dev_err(&adapter->pdev->dev, | ||
1313 | "Failed to allocate recv ctx resources for adapter\n"); | ||
1314 | kfree(adapter->ahw); | ||
1315 | adapter->ahw = NULL; | ||
1316 | err = -ENOMEM; | ||
1317 | } | ||
1318 | err_out: | ||
1319 | return err; | ||
1320 | } | ||
1321 | |||
1322 | static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter) | ||
1323 | { | ||
1324 | kfree(adapter->recv_ctx); | ||
1325 | adapter->recv_ctx = NULL; | ||
1326 | |||
1327 | kfree(adapter->ahw); | ||
1328 | adapter->ahw = NULL; | ||
1329 | } | ||
1330 | |||
1298 | int qlcnic_diag_alloc_res(struct net_device *netdev, int test) | 1331 | int qlcnic_diag_alloc_res(struct net_device *netdev, int test) |
1299 | { | 1332 | { |
1300 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 1333 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
@@ -1327,13 +1360,13 @@ int qlcnic_diag_alloc_res(struct net_device *netdev, int test) | |||
1327 | } | 1360 | } |
1328 | 1361 | ||
1329 | for (ring = 0; ring < adapter->max_rds_rings; ring++) { | 1362 | for (ring = 0; ring < adapter->max_rds_rings; ring++) { |
1330 | rds_ring = &adapter->recv_ctx.rds_rings[ring]; | 1363 | rds_ring = &adapter->recv_ctx->rds_rings[ring]; |
1331 | qlcnic_post_rx_buffers(adapter, ring, rds_ring); | 1364 | qlcnic_post_rx_buffers(adapter, rds_ring); |
1332 | } | 1365 | } |
1333 | 1366 | ||
1334 | if (adapter->diag_test == QLCNIC_INTERRUPT_TEST) { | 1367 | if (adapter->diag_test == QLCNIC_INTERRUPT_TEST) { |
1335 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 1368 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { |
1336 | sds_ring = &adapter->recv_ctx.sds_rings[ring]; | 1369 | sds_ring = &adapter->recv_ctx->sds_rings[ring]; |
1337 | qlcnic_enable_int(sds_ring); | 1370 | qlcnic_enable_int(sds_ring); |
1338 | } | 1371 | } |
1339 | } | 1372 | } |
@@ -1503,23 +1536,26 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1503 | adapter = netdev_priv(netdev); | 1536 | adapter = netdev_priv(netdev); |
1504 | adapter->netdev = netdev; | 1537 | adapter->netdev = netdev; |
1505 | adapter->pdev = pdev; | 1538 | adapter->pdev = pdev; |
1506 | adapter->dev_rst_time = jiffies; | ||
1507 | 1539 | ||
1540 | if (qlcnic_alloc_adapter_resources(adapter)) | ||
1541 | goto err_out_free_netdev; | ||
1542 | |||
1543 | adapter->dev_rst_time = jiffies; | ||
1508 | revision_id = pdev->revision; | 1544 | revision_id = pdev->revision; |
1509 | adapter->ahw.revision_id = revision_id; | 1545 | adapter->ahw->revision_id = revision_id; |
1510 | 1546 | ||
1511 | rwlock_init(&adapter->ahw.crb_lock); | 1547 | rwlock_init(&adapter->ahw->crb_lock); |
1512 | mutex_init(&adapter->ahw.mem_lock); | 1548 | mutex_init(&adapter->ahw->mem_lock); |
1513 | 1549 | ||
1514 | spin_lock_init(&adapter->tx_clean_lock); | 1550 | spin_lock_init(&adapter->tx_clean_lock); |
1515 | INIT_LIST_HEAD(&adapter->mac_list); | 1551 | INIT_LIST_HEAD(&adapter->mac_list); |
1516 | 1552 | ||
1517 | err = qlcnic_setup_pci_map(adapter); | 1553 | err = qlcnic_setup_pci_map(adapter); |
1518 | if (err) | 1554 | if (err) |
1519 | goto err_out_free_netdev; | 1555 | goto err_out_free_hw; |
1520 | 1556 | ||
1521 | /* This will be reset for mezz cards */ | 1557 | /* This will be reset for mezz cards */ |
1522 | adapter->portnum = adapter->ahw.pci_func; | 1558 | adapter->portnum = adapter->ahw->pci_func; |
1523 | 1559 | ||
1524 | err = qlcnic_get_board_info(adapter); | 1560 | err = qlcnic_get_board_info(adapter); |
1525 | if (err) { | 1561 | if (err) { |
@@ -1547,7 +1583,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1547 | 1583 | ||
1548 | pr_info("%s: %s Board Chip rev 0x%x\n", | 1584 | pr_info("%s: %s Board Chip rev 0x%x\n", |
1549 | module_name(THIS_MODULE), | 1585 | module_name(THIS_MODULE), |
1550 | brd_name, adapter->ahw.revision_id); | 1586 | brd_name, adapter->ahw->revision_id); |
1551 | } | 1587 | } |
1552 | 1588 | ||
1553 | qlcnic_clear_stats(adapter); | 1589 | qlcnic_clear_stats(adapter); |
@@ -1562,7 +1598,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1562 | 1598 | ||
1563 | qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY); | 1599 | qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY); |
1564 | 1600 | ||
1565 | switch (adapter->ahw.port_type) { | 1601 | switch (adapter->ahw->port_type) { |
1566 | case QLCNIC_GBE: | 1602 | case QLCNIC_GBE: |
1567 | dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n", | 1603 | dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n", |
1568 | adapter->netdev->name); | 1604 | adapter->netdev->name); |
@@ -1587,6 +1623,9 @@ err_out_decr_ref: | |||
1587 | err_out_iounmap: | 1623 | err_out_iounmap: |
1588 | qlcnic_cleanup_pci_map(adapter); | 1624 | qlcnic_cleanup_pci_map(adapter); |
1589 | 1625 | ||
1626 | err_out_free_hw: | ||
1627 | qlcnic_free_adapter_resources(adapter); | ||
1628 | |||
1590 | err_out_free_netdev: | 1629 | err_out_free_netdev: |
1591 | free_netdev(netdev); | 1630 | free_netdev(netdev); |
1592 | 1631 | ||
@@ -1640,6 +1679,7 @@ static void __devexit qlcnic_remove(struct pci_dev *pdev) | |||
1640 | pci_disable_device(pdev); | 1679 | pci_disable_device(pdev); |
1641 | pci_set_drvdata(pdev, NULL); | 1680 | pci_set_drvdata(pdev, NULL); |
1642 | 1681 | ||
1682 | qlcnic_free_adapter_resources(adapter); | ||
1643 | free_netdev(netdev); | 1683 | free_netdev(netdev); |
1644 | } | 1684 | } |
1645 | static int __qlcnic_shutdown(struct pci_dev *pdev) | 1685 | static int __qlcnic_shutdown(struct pci_dev *pdev) |
@@ -2248,16 +2288,16 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup) | |||
2248 | { | 2288 | { |
2249 | struct net_device *netdev = adapter->netdev; | 2289 | struct net_device *netdev = adapter->netdev; |
2250 | 2290 | ||
2251 | if (adapter->ahw.linkup && !linkup) { | 2291 | if (adapter->ahw->linkup && !linkup) { |
2252 | netdev_info(netdev, "NIC Link is down\n"); | 2292 | netdev_info(netdev, "NIC Link is down\n"); |
2253 | adapter->ahw.linkup = 0; | 2293 | adapter->ahw->linkup = 0; |
2254 | if (netif_running(netdev)) { | 2294 | if (netif_running(netdev)) { |
2255 | netif_carrier_off(netdev); | 2295 | netif_carrier_off(netdev); |
2256 | netif_stop_queue(netdev); | 2296 | netif_stop_queue(netdev); |
2257 | } | 2297 | } |
2258 | } else if (!adapter->ahw.linkup && linkup) { | 2298 | } else if (!adapter->ahw->linkup && linkup) { |
2259 | netdev_info(netdev, "NIC Link is up\n"); | 2299 | netdev_info(netdev, "NIC Link is up\n"); |
2260 | adapter->ahw.linkup = 1; | 2300 | adapter->ahw->linkup = 1; |
2261 | if (netif_running(netdev)) { | 2301 | if (netif_running(netdev)) { |
2262 | netif_carrier_on(netdev); | 2302 | netif_carrier_on(netdev); |
2263 | netif_wake_queue(netdev); | 2303 | netif_wake_queue(netdev); |
@@ -2493,7 +2533,7 @@ static void qlcnic_poll_controller(struct net_device *netdev) | |||
2493 | int ring; | 2533 | int ring; |
2494 | struct qlcnic_host_sds_ring *sds_ring; | 2534 | struct qlcnic_host_sds_ring *sds_ring; |
2495 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 2535 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
2496 | struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx; | 2536 | struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; |
2497 | 2537 | ||
2498 | disable_irq(adapter->irq); | 2538 | disable_irq(adapter->irq); |
2499 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { | 2539 | for (ring = 0; ring < adapter->max_sds_rings; ring++) { |
@@ -3503,7 +3543,7 @@ validate_esw_config(struct qlcnic_adapter *adapter, | |||
3503 | u8 pci_func; | 3543 | u8 pci_func; |
3504 | int i; | 3544 | int i; |
3505 | 3545 | ||
3506 | op_mode = readl(adapter->ahw.pci_base0 + QLCNIC_DRV_OP_MODE); | 3546 | op_mode = readl(adapter->ahw->pci_base0 + QLCNIC_DRV_OP_MODE); |
3507 | 3547 | ||
3508 | for (i = 0; i < count; i++) { | 3548 | for (i = 0; i < count; i++) { |
3509 | pci_func = esw_cfg[i].pci_func; | 3549 | pci_func = esw_cfg[i].pci_func; |
@@ -3569,13 +3609,13 @@ qlcnic_sysfs_write_esw_config(struct file *file, struct kobject *kobj, | |||
3569 | if (qlcnic_config_switch_port(adapter, &esw_cfg[i])) | 3609 | if (qlcnic_config_switch_port(adapter, &esw_cfg[i])) |
3570 | return QL_STATUS_INVALID_PARAM; | 3610 | return QL_STATUS_INVALID_PARAM; |
3571 | 3611 | ||
3572 | if (adapter->ahw.pci_func != esw_cfg[i].pci_func) | 3612 | if (adapter->ahw->pci_func != esw_cfg[i].pci_func) |
3573 | continue; | 3613 | continue; |
3574 | 3614 | ||
3575 | op_mode = esw_cfg[i].op_mode; | 3615 | op_mode = esw_cfg[i].op_mode; |
3576 | qlcnic_get_eswitch_port_config(adapter, &esw_cfg[i]); | 3616 | qlcnic_get_eswitch_port_config(adapter, &esw_cfg[i]); |
3577 | esw_cfg[i].op_mode = op_mode; | 3617 | esw_cfg[i].op_mode = op_mode; |
3578 | esw_cfg[i].pci_func = adapter->ahw.pci_func; | 3618 | esw_cfg[i].pci_func = adapter->ahw->pci_func; |
3579 | 3619 | ||
3580 | switch (esw_cfg[i].op_mode) { | 3620 | switch (esw_cfg[i].op_mode) { |
3581 | case QLCNIC_PORT_DEFAULTS: | 3621 | case QLCNIC_PORT_DEFAULTS: |