Lines Matching refs:adapter

69 static void qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding);
70 static int qlcnic_can_start_firmware(struct qlcnic_adapter *adapter);
81 static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter);
96 static u32 qlcnic_vlan_tx_check(struct qlcnic_adapter *adapter) in qlcnic_vlan_tx_check() argument
98 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_vlan_tx_check()
100 if (adapter->pdev->device == PCI_DEVICE_ID_QLOGIC_QLE824X) in qlcnic_vlan_tx_check()
301 int qlcnic_read_mac_addr(struct qlcnic_adapter *adapter) in qlcnic_read_mac_addr() argument
303 struct net_device *netdev = adapter->netdev; in qlcnic_read_mac_addr()
304 struct pci_dev *pdev = adapter->pdev; in qlcnic_read_mac_addr()
308 ret = qlcnic_get_mac_address(adapter, mac_addr, in qlcnic_read_mac_addr()
309 adapter->ahw->pci_func); in qlcnic_read_mac_addr()
314 memcpy(adapter->mac_addr, netdev->dev_addr, netdev->addr_len); in qlcnic_read_mac_addr()
325 static void qlcnic_delete_adapter_mac(struct qlcnic_adapter *adapter) in qlcnic_delete_adapter_mac() argument
330 list_for_each(head, &adapter->mac_list) { in qlcnic_delete_adapter_mac()
332 if (ether_addr_equal_unaligned(adapter->mac_addr, cur->mac_addr)) { in qlcnic_delete_adapter_mac()
333 qlcnic_sre_macaddr_change(adapter, cur->mac_addr, in qlcnic_delete_adapter_mac()
344 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_set_mac() local
347 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_set_mac()
350 if ((adapter->flags & QLCNIC_MAC_OVERRIDE_DISABLED)) in qlcnic_set_mac()
356 if (ether_addr_equal_unaligned(adapter->mac_addr, addr->sa_data)) in qlcnic_set_mac()
359 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { in qlcnic_set_mac()
361 qlcnic_napi_disable(adapter); in qlcnic_set_mac()
364 qlcnic_delete_adapter_mac(adapter); in qlcnic_set_mac()
365 memcpy(adapter->mac_addr, addr->sa_data, netdev->addr_len); in qlcnic_set_mac()
367 qlcnic_set_multi(adapter->netdev); in qlcnic_set_mac()
369 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { in qlcnic_set_mac()
371 qlcnic_napi_enable(adapter); in qlcnic_set_mac()
380 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_fdb_del() local
383 if (!adapter->fdb_mac_learn) in qlcnic_fdb_del()
386 if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || in qlcnic_fdb_del()
387 qlcnic_sriov_check(adapter)) { in qlcnic_fdb_del()
391 err = qlcnic_nic_del_mac(adapter, addr); in qlcnic_fdb_del()
405 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_fdb_add() local
408 if (!adapter->fdb_mac_learn) in qlcnic_fdb_add()
411 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) && in qlcnic_fdb_add()
412 !qlcnic_sriov_check(adapter)) { in qlcnic_fdb_add()
417 if (ether_addr_equal(addr, adapter->mac_addr)) in qlcnic_fdb_add()
421 if (netdev_uc_count(netdev) < adapter->ahw->max_uc_count) in qlcnic_fdb_add()
438 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_fdb_dump() local
440 if (!adapter->fdb_mac_learn) in qlcnic_fdb_dump()
443 if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || in qlcnic_fdb_dump()
444 qlcnic_sriov_check(adapter)) in qlcnic_fdb_dump()
450 static void qlcnic_82xx_cancel_idc_work(struct qlcnic_adapter *adapter) in qlcnic_82xx_cancel_idc_work() argument
452 while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_82xx_cancel_idc_work()
455 if (!adapter->fw_work.work.func) in qlcnic_82xx_cancel_idc_work()
458 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_82xx_cancel_idc_work()
464 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_get_phys_port_id() local
465 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_get_phys_port_id()
467 if (!(adapter->flags & QLCNIC_HAS_PHYS_PORT_ID)) in qlcnic_get_phys_port_id()
480 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_add_vxlan_port() local
481 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_add_vxlan_port()
486 if (!qlcnic_encap_rx_offload(adapter) || ahw->vxlan_port) in qlcnic_add_vxlan_port()
490 adapter->flags |= QLCNIC_ADD_VXLAN_PORT; in qlcnic_add_vxlan_port()
496 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_del_vxlan_port() local
497 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_del_vxlan_port()
499 if (!qlcnic_encap_rx_offload(adapter) || !ahw->vxlan_port || in qlcnic_del_vxlan_port()
503 adapter->flags |= QLCNIC_DEL_VXLAN_PORT; in qlcnic_del_vxlan_port()
627 static int qlcnic_check_multi_tx_capability(struct qlcnic_adapter *adapter) in qlcnic_check_multi_tx_capability() argument
629 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_multi_tx_capability()
631 if (qlcnic_82xx_check(adapter) && in qlcnic_check_multi_tx_capability()
633 test_and_set_bit(__QLCNIC_MULTI_TX_UNIQUE, &adapter->state); in qlcnic_check_multi_tx_capability()
640 static int qlcnic_max_rings(struct qlcnic_adapter *adapter, u8 ring_cnt, in qlcnic_max_rings() argument
646 max_rings = adapter->max_sds_rings; in qlcnic_max_rings()
648 max_rings = adapter->max_tx_rings; in qlcnic_max_rings()
659 void qlcnic_set_tx_ring_count(struct qlcnic_adapter *adapter, u8 tx_cnt) in qlcnic_set_tx_ring_count() argument
662 if (adapter->max_tx_rings) in qlcnic_set_tx_ring_count()
663 adapter->drv_tx_rings = qlcnic_max_rings(adapter, tx_cnt, in qlcnic_set_tx_ring_count()
666 adapter->drv_tx_rings = tx_cnt; in qlcnic_set_tx_ring_count()
669 void qlcnic_set_sds_ring_count(struct qlcnic_adapter *adapter, u8 rx_cnt) in qlcnic_set_sds_ring_count() argument
672 if (adapter->max_sds_rings) in qlcnic_set_sds_ring_count()
673 adapter->drv_sds_rings = qlcnic_max_rings(adapter, rx_cnt, in qlcnic_set_sds_ring_count()
676 adapter->drv_sds_rings = rx_cnt; in qlcnic_set_sds_ring_count()
679 int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter) in qlcnic_setup_tss_rss_intr() argument
681 struct pci_dev *pdev = adapter->pdev; in qlcnic_setup_tss_rss_intr()
684 adapter->flags &= ~QLCNIC_TSS_RSS; in qlcnic_setup_tss_rss_intr()
686 if (adapter->drv_tss_rings > 0) in qlcnic_setup_tss_rss_intr()
687 num_msix += adapter->drv_tss_rings; in qlcnic_setup_tss_rss_intr()
689 num_msix += adapter->drv_tx_rings; in qlcnic_setup_tss_rss_intr()
691 if (adapter->drv_rss_rings > 0) in qlcnic_setup_tss_rss_intr()
692 num_msix += adapter->drv_rss_rings; in qlcnic_setup_tss_rss_intr()
694 num_msix += adapter->drv_sds_rings; in qlcnic_setup_tss_rss_intr()
696 if (qlcnic_83xx_check(adapter)) in qlcnic_setup_tss_rss_intr()
699 if (!adapter->msix_entries) { in qlcnic_setup_tss_rss_intr()
700 adapter->msix_entries = kcalloc(num_msix, in qlcnic_setup_tss_rss_intr()
703 if (!adapter->msix_entries) in qlcnic_setup_tss_rss_intr()
708 adapter->msix_entries[vector].entry = vector; in qlcnic_setup_tss_rss_intr()
711 err = pci_enable_msix_exact(pdev, adapter->msix_entries, num_msix); in qlcnic_setup_tss_rss_intr()
713 if (!adapter->drv_tss_rings && !adapter->drv_rss_rings) in qlcnic_setup_tss_rss_intr()
716 netdev_info(adapter->netdev, in qlcnic_setup_tss_rss_intr()
720 num_msix = adapter->drv_tx_rings + adapter->drv_sds_rings; in qlcnic_setup_tss_rss_intr()
723 adapter->drv_tss_rings = 0; in qlcnic_setup_tss_rss_intr()
724 adapter->drv_rss_rings = 0; in qlcnic_setup_tss_rss_intr()
726 if (qlcnic_83xx_check(adapter)) in qlcnic_setup_tss_rss_intr()
729 netdev_info(adapter->netdev, in qlcnic_setup_tss_rss_intr()
731 adapter->drv_tx_rings, adapter->drv_sds_rings, in qlcnic_setup_tss_rss_intr()
739 adapter->ahw->num_msix = num_msix; in qlcnic_setup_tss_rss_intr()
740 if (adapter->drv_tss_rings > 0) in qlcnic_setup_tss_rss_intr()
741 adapter->drv_tx_rings = adapter->drv_tss_rings; in qlcnic_setup_tss_rss_intr()
743 if (adapter->drv_rss_rings > 0) in qlcnic_setup_tss_rss_intr()
744 adapter->drv_sds_rings = adapter->drv_rss_rings; in qlcnic_setup_tss_rss_intr()
749 int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix) in qlcnic_enable_msix() argument
751 struct pci_dev *pdev = adapter->pdev; in qlcnic_enable_msix()
754 if (!adapter->msix_entries) { in qlcnic_enable_msix()
755 adapter->msix_entries = kcalloc(num_msix, in qlcnic_enable_msix()
758 if (!adapter->msix_entries) in qlcnic_enable_msix()
762 adapter->flags &= ~(QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED); in qlcnic_enable_msix()
764 if (adapter->ahw->msix_supported) { in qlcnic_enable_msix()
767 adapter->msix_entries[vector].entry = vector; in qlcnic_enable_msix()
770 adapter->msix_entries, 1, num_msix); in qlcnic_enable_msix()
773 adapter->flags |= QLCNIC_MSIX_ENABLED; in qlcnic_enable_msix()
774 adapter->ahw->num_msix = num_msix; in qlcnic_enable_msix()
784 if (qlcnic_82xx_check(adapter)) { in qlcnic_enable_msix()
795 if (qlcnic_82xx_check(adapter) && in qlcnic_enable_msix()
796 !qlcnic_check_multi_tx(adapter)) { in qlcnic_enable_msix()
797 adapter->drv_sds_rings = num_msix; in qlcnic_enable_msix()
798 adapter->drv_tx_rings = QLCNIC_SINGLE_RING; in qlcnic_enable_msix()
801 adapter->drv_tx_rings = num_msix / 2; in qlcnic_enable_msix()
802 adapter->drv_sds_rings = adapter->drv_tx_rings; in qlcnic_enable_msix()
822 static int qlcnic_82xx_calculate_msix_vector(struct qlcnic_adapter *adapter) in qlcnic_82xx_calculate_msix_vector() argument
826 num_msix = adapter->drv_sds_rings; in qlcnic_82xx_calculate_msix_vector()
828 if (qlcnic_check_multi_tx(adapter)) in qlcnic_82xx_calculate_msix_vector()
829 num_msix += adapter->drv_tx_rings; in qlcnic_82xx_calculate_msix_vector()
836 static int qlcnic_enable_msi_legacy(struct qlcnic_adapter *adapter) in qlcnic_enable_msi_legacy() argument
841 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_enable_msi_legacy()
842 struct pci_dev *pdev = adapter->pdev; in qlcnic_enable_msi_legacy()
845 adapter->flags |= QLCNIC_MSI_ENABLED; in qlcnic_enable_msi_legacy()
846 offset = msi_tgt_status[adapter->ahw->pci_func]; in qlcnic_enable_msi_legacy()
847 adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter->ahw, in qlcnic_enable_msi_legacy()
850 adapter->msix_entries[0].vector = pdev->irq; in qlcnic_enable_msi_legacy()
857 legacy_intrp = &legacy_intr[adapter->ahw->pci_func]; in qlcnic_enable_msi_legacy()
858 adapter->ahw->int_vec_bit = legacy_intrp->int_vec_bit; in qlcnic_enable_msi_legacy()
860 adapter->tgt_status_reg = qlcnic_get_ioaddr(ahw, offset); in qlcnic_enable_msi_legacy()
862 adapter->tgt_mask_reg = qlcnic_get_ioaddr(ahw, mask_reg); in qlcnic_enable_msi_legacy()
863 adapter->isr_int_vec = qlcnic_get_ioaddr(ahw, ISR_INT_VECTOR); in qlcnic_enable_msi_legacy()
864 adapter->crb_int_state_reg = qlcnic_get_ioaddr(ahw, ISR_INT_STATE_REG); in qlcnic_enable_msi_legacy()
866 adapter->msix_entries[0].vector = pdev->irq; in qlcnic_enable_msi_legacy()
870 static int qlcnic_82xx_setup_intr(struct qlcnic_adapter *adapter) in qlcnic_82xx_setup_intr() argument
874 if (adapter->flags & QLCNIC_TSS_RSS) { in qlcnic_82xx_setup_intr()
875 err = qlcnic_setup_tss_rss_intr(adapter); in qlcnic_82xx_setup_intr()
878 num_msix = adapter->ahw->num_msix; in qlcnic_82xx_setup_intr()
880 num_msix = qlcnic_82xx_calculate_msix_vector(adapter); in qlcnic_82xx_setup_intr()
882 err = qlcnic_enable_msix(adapter, num_msix); in qlcnic_82xx_setup_intr()
886 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { in qlcnic_82xx_setup_intr()
887 qlcnic_disable_multi_tx(adapter); in qlcnic_82xx_setup_intr()
888 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; in qlcnic_82xx_setup_intr()
890 err = qlcnic_enable_msi_legacy(adapter); in qlcnic_82xx_setup_intr()
899 int qlcnic_82xx_mq_intrpt(struct qlcnic_adapter *adapter, int op_type) in qlcnic_82xx_mq_intrpt() argument
901 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_82xx_mq_intrpt()
904 if (qlcnic_check_multi_tx(adapter) && in qlcnic_82xx_mq_intrpt()
906 (adapter->flags & QLCNIC_MSIX_ENABLED)) { in qlcnic_82xx_mq_intrpt()
918 err = qlcnic_82xx_config_intrpt(adapter, 1); in qlcnic_82xx_mq_intrpt()
920 dev_err(&adapter->pdev->dev, in qlcnic_82xx_mq_intrpt()
929 void qlcnic_teardown_intr(struct qlcnic_adapter *adapter) in qlcnic_teardown_intr() argument
931 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_teardown_intr()
932 pci_disable_msix(adapter->pdev); in qlcnic_teardown_intr()
933 if (adapter->flags & QLCNIC_MSI_ENABLED) in qlcnic_teardown_intr()
934 pci_disable_msi(adapter->pdev); in qlcnic_teardown_intr()
936 kfree(adapter->msix_entries); in qlcnic_teardown_intr()
937 adapter->msix_entries = NULL; in qlcnic_teardown_intr()
939 if (adapter->ahw->intr_tbl) { in qlcnic_teardown_intr()
940 vfree(adapter->ahw->intr_tbl); in qlcnic_teardown_intr()
941 adapter->ahw->intr_tbl = NULL; in qlcnic_teardown_intr()
951 static int qlcnic_get_act_pci_func(struct qlcnic_adapter *adapter) in qlcnic_get_act_pci_func() argument
953 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_get_act_pci_func()
957 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) { in qlcnic_get_act_pci_func()
976 ret = qlcnic_get_pci_info(adapter, pci_info); in qlcnic_get_act_pci_func()
981 static bool qlcnic_port_eswitch_cfg_capability(struct qlcnic_adapter *adapter) in qlcnic_port_eswitch_cfg_capability() argument
985 if (qlcnic_84xx_check(adapter)) { in qlcnic_port_eswitch_cfg_capability()
987 } else if (qlcnic_83xx_check(adapter)) { in qlcnic_port_eswitch_cfg_capability()
988 if (adapter->ahw->extra_capability[0] & in qlcnic_port_eswitch_cfg_capability()
998 int qlcnic_init_pci_info(struct qlcnic_adapter *adapter) in qlcnic_init_pci_info() argument
1000 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_init_pci_info()
1010 ret = qlcnic_get_pci_info(adapter, pci_info); in qlcnic_init_pci_info()
1016 adapter->npars = kzalloc(sizeof(struct qlcnic_npar_info) * in qlcnic_init_pci_info()
1018 if (!adapter->npars) { in qlcnic_init_pci_info()
1023 adapter->eswitch = kzalloc(sizeof(struct qlcnic_eswitch) * in qlcnic_init_pci_info()
1025 if (!adapter->eswitch) { in qlcnic_init_pci_info()
1035 dev_err(&adapter->pdev->dev, "%s: Invalid function 0x%x, max 0x%x\n", in qlcnic_init_pci_info()
1044 if (qlcnic_port_eswitch_cfg_capability(adapter)) { in qlcnic_init_pci_info()
1045 if (!qlcnic_83xx_set_port_eswitch_status(adapter, pfn, in qlcnic_init_pci_info()
1047 adapter->npars[j].eswitch_status = true; in qlcnic_init_pci_info()
1051 adapter->npars[j].eswitch_status = true; in qlcnic_init_pci_info()
1054 adapter->npars[j].pci_func = pfn; in qlcnic_init_pci_info()
1055 adapter->npars[j].active = (u8)pci_info[i].active; in qlcnic_init_pci_info()
1056 adapter->npars[j].type = (u8)pci_info[i].type; in qlcnic_init_pci_info()
1057 adapter->npars[j].phy_port = (u8)pci_info[i].default_port; in qlcnic_init_pci_info()
1058 adapter->npars[j].min_bw = pci_info[i].tx_min_bw; in qlcnic_init_pci_info()
1059 adapter->npars[j].max_bw = pci_info[i].tx_max_bw; in qlcnic_init_pci_info()
1061 memcpy(&adapter->npars[j].mac, &pci_info[i].mac, ETH_ALEN); in qlcnic_init_pci_info()
1068 if (!qlcnic_port_eswitch_cfg_capability(adapter)) { in qlcnic_init_pci_info()
1070 adapter->eswitch[i].flags |= QLCNIC_SWITCH_ENABLE; in qlcnic_init_pci_info()
1077 kfree(adapter->eswitch); in qlcnic_init_pci_info()
1078 adapter->eswitch = NULL; in qlcnic_init_pci_info()
1080 kfree(adapter->npars); in qlcnic_init_pci_info()
1081 adapter->npars = NULL; in qlcnic_init_pci_info()
1089 qlcnic_set_function_modes(struct qlcnic_adapter *adapter) in qlcnic_set_function_modes() argument
1094 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_set_function_modes()
1096 ret = qlcnic_api_lock(adapter); in qlcnic_set_function_modes()
1101 data = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE); in qlcnic_set_function_modes()
1104 QLC_SHARED_REG_WR32(adapter, QLCNIC_DRV_OP_MODE, data); in qlcnic_set_function_modes()
1105 qlcnic_api_unlock(adapter); in qlcnic_set_function_modes()
1110 static void qlcnic_check_vf(struct qlcnic_adapter *adapter, in qlcnic_check_vf() argument
1116 adapter->ahw->fw_hal_version = QLC_SHARED_REG_RD32(adapter, in qlcnic_check_vf()
1120 qlcnic_get_func_no(adapter); in qlcnic_check_vf()
1123 op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE); in qlcnic_check_vf()
1127 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); in qlcnic_check_vf()
1130 adapter->ahw->op_mode = QLCNIC_NON_PRIV_FUNC; in qlcnic_check_vf()
1131 dev_info(&adapter->pdev->dev, in qlcnic_check_vf()
1133 adapter->ahw->fw_hal_version); in qlcnic_check_vf()
1134 adapter->nic_ops = &qlcnic_vf_ops; in qlcnic_check_vf()
1136 adapter->nic_ops = &qlcnic_ops; in qlcnic_check_vf()
1192 static bool qlcnic_validate_subsystem_id(struct qlcnic_adapter *adapter, in qlcnic_validate_subsystem_id() argument
1195 struct pci_dev *pdev = adapter->pdev; in qlcnic_validate_subsystem_id()
1213 static void qlcnic_get_board_name(struct qlcnic_adapter *adapter, char *name) in qlcnic_get_board_name() argument
1215 struct pci_dev *pdev = adapter->pdev; in qlcnic_get_board_name()
1221 qlcnic_validate_subsystem_id(adapter, i)) { in qlcnic_get_board_name()
1228 sprintf(name, "%pM Gigabit Ethernet", adapter->mac_addr); in qlcnic_get_board_name()
1230 sprintf(name, "%pM: %s" , adapter->mac_addr, in qlcnic_get_board_name()
1235 qlcnic_check_options(struct qlcnic_adapter *adapter) in qlcnic_check_options() argument
1239 struct pci_dev *pdev = adapter->pdev; in qlcnic_check_options()
1240 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_options()
1243 prev_fw_version = adapter->fw_version; in qlcnic_check_options()
1245 fw_major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR); in qlcnic_check_options()
1246 fw_minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR); in qlcnic_check_options()
1247 fw_build = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB); in qlcnic_check_options()
1249 adapter->fw_version = QLCNIC_VERSION_CODE(fw_major, fw_minor, fw_build); in qlcnic_check_options()
1251 err = qlcnic_get_board_info(adapter); in qlcnic_check_options()
1258 adapter->fw_version > prev_fw_version) { in qlcnic_check_options()
1260 if (!qlcnic_fw_cmd_get_minidump_temp(adapter)) in qlcnic_check_options()
1269 if (adapter->ahw->port_type == QLCNIC_XGBE) { in qlcnic_check_options()
1270 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { in qlcnic_check_options()
1271 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF; in qlcnic_check_options()
1272 adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF; in qlcnic_check_options()
1274 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1275 adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1278 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1279 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1281 } else if (adapter->ahw->port_type == QLCNIC_GBE) { in qlcnic_check_options()
1282 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1283 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1284 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1285 adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1288 adapter->ahw->msix_supported = !!qlcnic_use_msi_x; in qlcnic_check_options()
1290 adapter->num_txd = MAX_CMD_DESCRIPTORS; in qlcnic_check_options()
1292 adapter->max_rds_rings = MAX_RDS_RINGS; in qlcnic_check_options()
1296 qlcnic_initialize_nic(struct qlcnic_adapter *adapter) in qlcnic_initialize_nic() argument
1302 err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); in qlcnic_initialize_nic()
1306 adapter->ahw->physical_port = (u8)nic_info.phys_port; in qlcnic_initialize_nic()
1307 adapter->ahw->switch_mode = nic_info.switch_mode; in qlcnic_initialize_nic()
1308 adapter->ahw->max_tx_ques = nic_info.max_tx_ques; in qlcnic_initialize_nic()
1309 adapter->ahw->max_rx_ques = nic_info.max_rx_ques; in qlcnic_initialize_nic()
1310 adapter->ahw->capabilities = nic_info.capabilities; in qlcnic_initialize_nic()
1312 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { in qlcnic_initialize_nic()
1314 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err); in qlcnic_initialize_nic()
1317 adapter->ahw->extra_capability[0] = temp; in qlcnic_initialize_nic()
1319 adapter->ahw->extra_capability[0] = 0; in qlcnic_initialize_nic()
1322 adapter->ahw->max_mac_filters = nic_info.max_mac_filters; in qlcnic_initialize_nic()
1323 adapter->ahw->max_mtu = nic_info.max_mtu; in qlcnic_initialize_nic()
1325 if (adapter->ahw->capabilities & BIT_6) { in qlcnic_initialize_nic()
1326 adapter->flags |= QLCNIC_ESWITCH_ENABLED; in qlcnic_initialize_nic()
1327 adapter->ahw->nic_mode = QLCNIC_VNIC_MODE; in qlcnic_initialize_nic()
1328 adapter->max_tx_rings = QLCNIC_MAX_HW_VNIC_TX_RINGS; in qlcnic_initialize_nic()
1329 adapter->max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS; in qlcnic_initialize_nic()
1331 dev_info(&adapter->pdev->dev, "vNIC mode enabled.\n"); in qlcnic_initialize_nic()
1333 adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; in qlcnic_initialize_nic()
1334 adapter->max_tx_rings = QLCNIC_MAX_HW_TX_RINGS; in qlcnic_initialize_nic()
1335 adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; in qlcnic_initialize_nic()
1336 adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; in qlcnic_initialize_nic()
1342 void qlcnic_set_vlan_config(struct qlcnic_adapter *adapter, in qlcnic_set_vlan_config() argument
1346 adapter->flags &= ~QLCNIC_TAGGING_ENABLED; in qlcnic_set_vlan_config()
1348 adapter->flags |= QLCNIC_TAGGING_ENABLED; in qlcnic_set_vlan_config()
1351 adapter->rx_pvid = esw_cfg->vlan_id; in qlcnic_set_vlan_config()
1352 adapter->tx_pvid = esw_cfg->vlan_id; in qlcnic_set_vlan_config()
1354 adapter->rx_pvid = 0; in qlcnic_set_vlan_config()
1355 adapter->tx_pvid = 0; in qlcnic_set_vlan_config()
1362 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_vlan_rx_add() local
1365 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_vlan_rx_add()
1366 err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 1); in qlcnic_vlan_rx_add()
1375 set_bit(vid, adapter->vlans); in qlcnic_vlan_rx_add()
1382 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_vlan_rx_del() local
1385 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_vlan_rx_del()
1386 err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 0); in qlcnic_vlan_rx_del()
1396 clear_bit(vid, adapter->vlans); in qlcnic_vlan_rx_del()
1400 void qlcnic_set_eswitch_port_features(struct qlcnic_adapter *adapter, in qlcnic_set_eswitch_port_features() argument
1403 adapter->flags &= ~(QLCNIC_MACSPOOF | QLCNIC_MAC_OVERRIDE_DISABLED | in qlcnic_set_eswitch_port_features()
1407 adapter->flags |= QLCNIC_MACSPOOF; in qlcnic_set_eswitch_port_features()
1410 adapter->flags |= QLCNIC_MAC_OVERRIDE_DISABLED; in qlcnic_set_eswitch_port_features()
1413 adapter->flags |= QLCNIC_PROMISC_DISABLED; in qlcnic_set_eswitch_port_features()
1416 int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *adapter) in qlcnic_set_eswitch_port_config() argument
1420 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) in qlcnic_set_eswitch_port_config()
1423 esw_cfg.pci_func = adapter->ahw->pci_func; in qlcnic_set_eswitch_port_config()
1424 if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg)) in qlcnic_set_eswitch_port_config()
1426 qlcnic_set_vlan_config(adapter, &esw_cfg); in qlcnic_set_eswitch_port_config()
1427 qlcnic_set_eswitch_port_features(adapter, &esw_cfg); in qlcnic_set_eswitch_port_config()
1428 qlcnic_set_netdev_features(adapter, &esw_cfg); in qlcnic_set_eswitch_port_config()
1433 void qlcnic_set_netdev_features(struct qlcnic_adapter *adapter, in qlcnic_set_netdev_features() argument
1436 struct net_device *netdev = adapter->netdev; in qlcnic_set_netdev_features()
1438 if (qlcnic_83xx_check(adapter)) in qlcnic_set_netdev_features()
1441 adapter->offload_flags = esw_cfg->offload_flags; in qlcnic_set_netdev_features()
1442 adapter->flags |= QLCNIC_APP_CHANGED_FLAGS; in qlcnic_set_netdev_features()
1444 adapter->flags &= ~QLCNIC_APP_CHANGED_FLAGS; in qlcnic_set_netdev_features()
1448 qlcnic_check_eswitch_mode(struct qlcnic_adapter *adapter) in qlcnic_check_eswitch_mode() argument
1453 err = qlcnic_initialize_nic(adapter); in qlcnic_check_eswitch_mode()
1457 if (adapter->flags & QLCNIC_ADAPTER_INITIALIZED) in qlcnic_check_eswitch_mode()
1460 op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE); in qlcnic_check_eswitch_mode()
1461 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); in qlcnic_check_eswitch_mode()
1466 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); in qlcnic_check_eswitch_mode()
1468 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { in qlcnic_check_eswitch_mode()
1470 adapter->ahw->op_mode = QLCNIC_MGMT_FUNC; in qlcnic_check_eswitch_mode()
1471 err = qlcnic_init_pci_info(adapter); in qlcnic_check_eswitch_mode()
1475 qlcnic_set_function_modes(adapter); in qlcnic_check_eswitch_mode()
1476 dev_info(&adapter->pdev->dev, in qlcnic_check_eswitch_mode()
1478 adapter->ahw->fw_hal_version); in qlcnic_check_eswitch_mode()
1480 adapter->ahw->op_mode = QLCNIC_PRIV_FUNC; in qlcnic_check_eswitch_mode()
1481 dev_info(&adapter->pdev->dev, in qlcnic_check_eswitch_mode()
1483 adapter->ahw->fw_hal_version); in qlcnic_check_eswitch_mode()
1486 adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; in qlcnic_check_eswitch_mode()
1489 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; in qlcnic_check_eswitch_mode()
1494 int qlcnic_set_default_offload_settings(struct qlcnic_adapter *adapter) in qlcnic_set_default_offload_settings() argument
1500 if (adapter->need_fw_reset) in qlcnic_set_default_offload_settings()
1503 for (i = 0; i < adapter->ahw->total_nic_func; i++) { in qlcnic_set_default_offload_settings()
1504 if (!adapter->npars[i].eswitch_status) in qlcnic_set_default_offload_settings()
1508 esw_cfg.pci_func = adapter->npars[i].pci_func; in qlcnic_set_default_offload_settings()
1511 if (qlcnic_82xx_check(adapter)) { in qlcnic_set_default_offload_settings()
1513 if (QLCNIC_IS_TSO_CAPABLE(adapter)) in qlcnic_set_default_offload_settings()
1516 if (qlcnic_config_switch_port(adapter, &esw_cfg)) in qlcnic_set_default_offload_settings()
1518 npar = &adapter->npars[i]; in qlcnic_set_default_offload_settings()
1532 qlcnic_reset_eswitch_config(struct qlcnic_adapter *adapter, in qlcnic_reset_eswitch_config() argument
1544 if (qlcnic_config_switch_port(adapter, &esw_cfg)) in qlcnic_reset_eswitch_config()
1548 if (qlcnic_config_switch_port(adapter, &esw_cfg)) in qlcnic_reset_eswitch_config()
1554 int qlcnic_reset_npar_config(struct qlcnic_adapter *adapter) in qlcnic_reset_npar_config() argument
1561 if (qlcnic_82xx_check(adapter)) in qlcnic_reset_npar_config()
1562 if (!adapter->need_fw_reset) in qlcnic_reset_npar_config()
1566 for (i = 0; i < adapter->ahw->total_nic_func; i++) { in qlcnic_reset_npar_config()
1567 npar = &adapter->npars[i]; in qlcnic_reset_npar_config()
1569 if (!adapter->npars[i].eswitch_status) in qlcnic_reset_npar_config()
1573 err = qlcnic_get_nic_info(adapter, &nic_info, pci_func); in qlcnic_reset_npar_config()
1578 err = qlcnic_set_nic_info(adapter, &nic_info); in qlcnic_reset_npar_config()
1583 err = qlcnic_config_port_mirroring(adapter, in qlcnic_reset_npar_config()
1589 err = qlcnic_reset_eswitch_config(adapter, npar, pci_func); in qlcnic_reset_npar_config()
1596 static int qlcnic_check_npar_opertional(struct qlcnic_adapter *adapter) in qlcnic_check_npar_opertional() argument
1601 if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC) in qlcnic_check_npar_opertional()
1604 npar_state = QLC_SHARED_REG_RD32(adapter, in qlcnic_check_npar_opertional()
1608 npar_state = QLC_SHARED_REG_RD32(adapter, in qlcnic_check_npar_opertional()
1612 dev_err(&adapter->pdev->dev, in qlcnic_check_npar_opertional()
1620 qlcnic_set_mgmt_operations(struct qlcnic_adapter *adapter) in qlcnic_set_mgmt_operations() argument
1624 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) || in qlcnic_set_mgmt_operations()
1625 adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) in qlcnic_set_mgmt_operations()
1628 err = qlcnic_set_default_offload_settings(adapter); in qlcnic_set_mgmt_operations()
1632 err = qlcnic_reset_npar_config(adapter); in qlcnic_set_mgmt_operations()
1636 qlcnic_dev_set_npar_ready(adapter); in qlcnic_set_mgmt_operations()
1641 static int qlcnic_82xx_start_firmware(struct qlcnic_adapter *adapter) in qlcnic_82xx_start_firmware() argument
1645 err = qlcnic_can_start_firmware(adapter); in qlcnic_82xx_start_firmware()
1652 qlcnic_request_firmware(adapter); in qlcnic_82xx_start_firmware()
1654 err = qlcnic_check_flash_fw_ver(adapter); in qlcnic_82xx_start_firmware()
1658 adapter->ahw->fw_type = QLCNIC_FLASH_ROMIMAGE; in qlcnic_82xx_start_firmware()
1661 err = qlcnic_need_fw_reset(adapter); in qlcnic_82xx_start_firmware()
1665 err = qlcnic_pinit_from_rom(adapter); in qlcnic_82xx_start_firmware()
1669 err = qlcnic_load_firmware(adapter); in qlcnic_82xx_start_firmware()
1673 qlcnic_release_firmware(adapter); in qlcnic_82xx_start_firmware()
1674 QLCWR32(adapter, CRB_DRIVER_VERSION, QLCNIC_DRIVER_VERSION); in qlcnic_82xx_start_firmware()
1677 err = qlcnic_check_fw_status(adapter); in qlcnic_82xx_start_firmware()
1681 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY); in qlcnic_82xx_start_firmware()
1682 qlcnic_idc_debug_info(adapter, 1); in qlcnic_82xx_start_firmware()
1683 err = qlcnic_check_eswitch_mode(adapter); in qlcnic_82xx_start_firmware()
1685 dev_err(&adapter->pdev->dev, in qlcnic_82xx_start_firmware()
1689 err = qlcnic_set_mgmt_operations(adapter); in qlcnic_82xx_start_firmware()
1693 qlcnic_check_options(adapter); in qlcnic_82xx_start_firmware()
1694 adapter->need_fw_reset = 0; in qlcnic_82xx_start_firmware()
1696 qlcnic_release_firmware(adapter); in qlcnic_82xx_start_firmware()
1700 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_FAILED); in qlcnic_82xx_start_firmware()
1701 dev_err(&adapter->pdev->dev, "Device state set to failed\n"); in qlcnic_82xx_start_firmware()
1703 qlcnic_release_firmware(adapter); in qlcnic_82xx_start_firmware()
1708 qlcnic_request_irq(struct qlcnic_adapter *adapter) in qlcnic_request_irq() argument
1716 struct net_device *netdev = adapter->netdev; in qlcnic_request_irq()
1717 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_request_irq()
1719 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_request_irq()
1720 if (qlcnic_82xx_check(adapter)) in qlcnic_request_irq()
1724 if (!QLCNIC_IS_MSI_FAMILY(adapter)) in qlcnic_request_irq()
1728 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_request_irq()
1730 else if (adapter->flags & QLCNIC_MSI_ENABLED) in qlcnic_request_irq()
1734 if (qlcnic_82xx_check(adapter)) in qlcnic_request_irq()
1740 adapter->irq = netdev->irq; in qlcnic_request_irq()
1742 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) { in qlcnic_request_irq()
1743 if (qlcnic_82xx_check(adapter) || in qlcnic_request_irq()
1744 (qlcnic_83xx_check(adapter) && in qlcnic_request_irq()
1745 (adapter->flags & QLCNIC_MSIX_ENABLED))) { in qlcnic_request_irq()
1746 num_sds_rings = adapter->drv_sds_rings; in qlcnic_request_irq()
1749 if (qlcnic_82xx_check(adapter) && in qlcnic_request_irq()
1750 !qlcnic_check_multi_tx(adapter) && in qlcnic_request_irq()
1752 if (!(adapter->flags & in qlcnic_request_irq()
1774 if ((qlcnic_82xx_check(adapter) && in qlcnic_request_irq()
1775 qlcnic_check_multi_tx(adapter)) || in qlcnic_request_irq()
1776 (qlcnic_83xx_check(adapter) && in qlcnic_request_irq()
1777 (adapter->flags & QLCNIC_MSIX_ENABLED) && in qlcnic_request_irq()
1778 !(adapter->flags & QLCNIC_TX_INTR_SHARED))) { in qlcnic_request_irq()
1780 for (ring = 0; ring < adapter->drv_tx_rings; in qlcnic_request_irq()
1782 tx_ring = &adapter->tx_ring[ring]; in qlcnic_request_irq()
1796 qlcnic_free_irq(struct qlcnic_adapter *adapter) in qlcnic_free_irq() argument
1802 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_free_irq()
1804 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) { in qlcnic_free_irq()
1805 if (qlcnic_82xx_check(adapter) || in qlcnic_free_irq()
1806 (qlcnic_83xx_check(adapter) && in qlcnic_free_irq()
1807 (adapter->flags & QLCNIC_MSIX_ENABLED))) { in qlcnic_free_irq()
1808 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_free_irq()
1813 if ((qlcnic_83xx_check(adapter) && in qlcnic_free_irq()
1814 !(adapter->flags & QLCNIC_TX_INTR_SHARED)) || in qlcnic_free_irq()
1815 (qlcnic_82xx_check(adapter) && in qlcnic_free_irq()
1816 qlcnic_check_multi_tx(adapter))) { in qlcnic_free_irq()
1817 for (ring = 0; ring < adapter->drv_tx_rings; in qlcnic_free_irq()
1819 tx_ring = &adapter->tx_ring[ring]; in qlcnic_free_irq()
1827 static void qlcnic_get_lro_mss_capability(struct qlcnic_adapter *adapter) in qlcnic_get_lro_mss_capability() argument
1831 if (qlcnic_82xx_check(adapter)) { in qlcnic_get_lro_mss_capability()
1832 if (adapter->ahw->extra_capability[0] & in qlcnic_get_lro_mss_capability()
1834 adapter->flags |= QLCNIC_FW_LRO_MSS_CAP; in qlcnic_get_lro_mss_capability()
1836 capab = adapter->ahw->capabilities; in qlcnic_get_lro_mss_capability()
1838 adapter->flags |= QLCNIC_FW_LRO_MSS_CAP; in qlcnic_get_lro_mss_capability()
1842 static int qlcnic_config_def_intr_coalesce(struct qlcnic_adapter *adapter) in qlcnic_config_def_intr_coalesce() argument
1844 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_config_def_intr_coalesce()
1850 if (qlcnic_83xx_check(adapter)) { in qlcnic_config_def_intr_coalesce()
1857 err = qlcnic_83xx_set_rx_tx_intr_coal(adapter); in qlcnic_config_def_intr_coalesce()
1863 err = qlcnic_82xx_set_rx_coalesce(adapter); in qlcnic_config_def_intr_coalesce()
1869 int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) in __qlcnic_up() argument
1874 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) in __qlcnic_up()
1877 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) in __qlcnic_up()
1880 if (qlcnic_set_eswitch_port_config(adapter)) in __qlcnic_up()
1883 qlcnic_get_lro_mss_capability(adapter); in __qlcnic_up()
1885 if (qlcnic_fw_create_ctx(adapter)) in __qlcnic_up()
1888 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in __qlcnic_up()
1889 rds_ring = &adapter->recv_ctx->rds_rings[ring]; in __qlcnic_up()
1890 qlcnic_post_rx_buffers(adapter, rds_ring, ring); in __qlcnic_up()
1894 qlcnic_fw_cmd_set_mtu(adapter, netdev->mtu); in __qlcnic_up()
1896 adapter->ahw->linkup = 0; in __qlcnic_up()
1898 if (adapter->drv_sds_rings > 1) in __qlcnic_up()
1899 qlcnic_config_rss(adapter, 1); in __qlcnic_up()
1901 qlcnic_config_def_intr_coalesce(adapter); in __qlcnic_up()
1904 qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED); in __qlcnic_up()
1906 set_bit(__QLCNIC_DEV_UP, &adapter->state); in __qlcnic_up()
1907 qlcnic_napi_enable(adapter); in __qlcnic_up()
1909 qlcnic_linkevent_request(adapter, 1); in __qlcnic_up()
1911 adapter->ahw->reset_context = 0; in __qlcnic_up()
1916 int qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) in qlcnic_up() argument
1922 err = __qlcnic_up(adapter, netdev); in qlcnic_up()
1928 void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) in __qlcnic_down() argument
1932 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) in __qlcnic_down()
1935 if (!test_and_clear_bit(__QLCNIC_DEV_UP, &adapter->state)) in __qlcnic_down()
1940 adapter->ahw->linkup = 0; in __qlcnic_down()
1943 qlcnic_free_mac_list(adapter); in __qlcnic_down()
1945 if (adapter->fhash.fnum) in __qlcnic_down()
1946 qlcnic_delete_lb_filters(adapter); in __qlcnic_down()
1948 qlcnic_nic_set_promisc(adapter, QLCNIC_NIU_NON_PROMISC_MODE); in __qlcnic_down()
1949 if (qlcnic_sriov_vf_check(adapter)) in __qlcnic_down()
1950 qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc); in __qlcnic_down()
1952 qlcnic_napi_disable(adapter); in __qlcnic_down()
1954 qlcnic_fw_destroy_ctx(adapter); in __qlcnic_down()
1955 adapter->flags &= ~QLCNIC_FW_LRO_MSS_CAP; in __qlcnic_down()
1957 qlcnic_reset_rx_buffers_list(adapter); in __qlcnic_down()
1959 for (ring = 0; ring < adapter->drv_tx_rings; ring++) in __qlcnic_down()
1960 qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]); in __qlcnic_down()
1965 void qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) in qlcnic_down() argument
1969 __qlcnic_down(adapter, netdev); in qlcnic_down()
1975 qlcnic_attach(struct qlcnic_adapter *adapter) in qlcnic_attach() argument
1977 struct net_device *netdev = adapter->netdev; in qlcnic_attach()
1978 struct pci_dev *pdev = adapter->pdev; in qlcnic_attach()
1981 if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) in qlcnic_attach()
1984 err = qlcnic_napi_add(adapter, netdev); in qlcnic_attach()
1988 err = qlcnic_alloc_sw_resources(adapter); in qlcnic_attach()
1994 err = qlcnic_alloc_hw_resources(adapter); in qlcnic_attach()
2000 err = qlcnic_request_irq(adapter); in qlcnic_attach()
2006 qlcnic_create_sysfs_entries(adapter); in qlcnic_attach()
2009 if (qlcnic_encap_rx_offload(adapter)) in qlcnic_attach()
2013 adapter->is_up = QLCNIC_ADAPTER_UP_MAGIC; in qlcnic_attach()
2017 qlcnic_free_hw_resources(adapter); in qlcnic_attach()
2019 qlcnic_free_sw_resources(adapter); in qlcnic_attach()
2021 qlcnic_napi_del(adapter); in qlcnic_attach()
2025 void qlcnic_detach(struct qlcnic_adapter *adapter) in qlcnic_detach() argument
2027 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) in qlcnic_detach()
2030 qlcnic_remove_sysfs_entries(adapter); in qlcnic_detach()
2032 qlcnic_free_hw_resources(adapter); in qlcnic_detach()
2033 qlcnic_release_rx_buffers(adapter); in qlcnic_detach()
2034 qlcnic_free_irq(adapter); in qlcnic_detach()
2035 qlcnic_napi_del(adapter); in qlcnic_detach()
2036 qlcnic_free_sw_resources(adapter); in qlcnic_detach()
2038 adapter->is_up = 0; in qlcnic_detach()
2043 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_diag_free_res() local
2045 int drv_tx_rings = adapter->drv_tx_rings; in qlcnic_diag_free_res()
2048 clear_bit(__QLCNIC_DEV_UP, &adapter->state); in qlcnic_diag_free_res()
2049 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_diag_free_res()
2050 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_diag_free_res()
2051 sds_ring = &adapter->recv_ctx->sds_rings[ring]; in qlcnic_diag_free_res()
2052 qlcnic_disable_sds_intr(adapter, sds_ring); in qlcnic_diag_free_res()
2056 qlcnic_fw_destroy_ctx(adapter); in qlcnic_diag_free_res()
2058 qlcnic_detach(adapter); in qlcnic_diag_free_res()
2060 adapter->ahw->diag_test = 0; in qlcnic_diag_free_res()
2061 adapter->drv_sds_rings = drv_sds_rings; in qlcnic_diag_free_res()
2062 adapter->drv_tx_rings = drv_tx_rings; in qlcnic_diag_free_res()
2064 if (qlcnic_attach(adapter)) in qlcnic_diag_free_res()
2068 __qlcnic_up(adapter, netdev); in qlcnic_diag_free_res()
2073 static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) in qlcnic_alloc_adapter_resources() argument
2075 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_alloc_adapter_resources()
2078 adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context), in qlcnic_alloc_adapter_resources()
2080 if (!adapter->recv_ctx) { in qlcnic_alloc_adapter_resources()
2085 if (qlcnic_83xx_check(adapter)) { in qlcnic_alloc_adapter_resources()
2098 memset(&adapter->stats, 0, sizeof(adapter->stats)); in qlcnic_alloc_adapter_resources()
2103 static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter) in qlcnic_free_adapter_resources() argument
2105 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; in qlcnic_free_adapter_resources()
2107 kfree(adapter->recv_ctx); in qlcnic_free_adapter_resources()
2108 adapter->recv_ctx = NULL; in qlcnic_free_adapter_resources()
2116 dma_free_coherent(&adapter->pdev->dev, QLC_PEX_DMA_READ_SIZE, in qlcnic_free_adapter_resources()
2121 kfree(adapter->ahw->reset.buff); in qlcnic_free_adapter_resources()
2122 adapter->ahw->fw_dump.tmpl_hdr = NULL; in qlcnic_free_adapter_resources()
2127 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_diag_alloc_res() local
2136 __qlcnic_down(adapter, netdev); in qlcnic_diag_alloc_res()
2138 qlcnic_detach(adapter); in qlcnic_diag_alloc_res()
2140 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; in qlcnic_diag_alloc_res()
2141 adapter->ahw->diag_test = test; in qlcnic_diag_alloc_res()
2142 adapter->ahw->linkup = 0; in qlcnic_diag_alloc_res()
2144 ret = qlcnic_attach(adapter); in qlcnic_diag_alloc_res()
2150 ret = qlcnic_fw_create_ctx(adapter); in qlcnic_diag_alloc_res()
2152 qlcnic_detach(adapter); in qlcnic_diag_alloc_res()
2157 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in qlcnic_diag_alloc_res()
2158 rds_ring = &adapter->recv_ctx->rds_rings[ring]; in qlcnic_diag_alloc_res()
2159 qlcnic_post_rx_buffers(adapter, rds_ring, ring); in qlcnic_diag_alloc_res()
2162 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_diag_alloc_res()
2163 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_diag_alloc_res()
2164 sds_ring = &adapter->recv_ctx->sds_rings[ring]; in qlcnic_diag_alloc_res()
2165 qlcnic_enable_sds_intr(adapter, sds_ring); in qlcnic_diag_alloc_res()
2169 if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { in qlcnic_diag_alloc_res()
2170 adapter->ahw->loopback_state = 0; in qlcnic_diag_alloc_res()
2171 qlcnic_linkevent_request(adapter, 1); in qlcnic_diag_alloc_res()
2174 set_bit(__QLCNIC_DEV_UP, &adapter->state); in qlcnic_diag_alloc_res()
2181 qlcnic_reset_hw_context(struct qlcnic_adapter *adapter) in qlcnic_reset_hw_context() argument
2183 struct net_device *netdev = adapter->netdev; in qlcnic_reset_hw_context()
2185 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_reset_hw_context()
2190 qlcnic_down(adapter, netdev); in qlcnic_reset_hw_context()
2192 qlcnic_up(adapter, netdev); in qlcnic_reset_hw_context()
2196 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_reset_hw_context()
2197 netdev_info(adapter->netdev, "%s: soft reset complete\n", __func__); in qlcnic_reset_hw_context()
2202 qlcnic_reset_context(struct qlcnic_adapter *adapter) in qlcnic_reset_context() argument
2205 struct net_device *netdev = adapter->netdev; in qlcnic_reset_context()
2207 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_reset_context()
2210 if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) { in qlcnic_reset_context()
2215 __qlcnic_down(adapter, netdev); in qlcnic_reset_context()
2217 qlcnic_detach(adapter); in qlcnic_reset_context()
2220 err = qlcnic_attach(adapter); in qlcnic_reset_context()
2222 __qlcnic_up(adapter, netdev); in qlcnic_reset_context()
2230 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_reset_context()
2234 static void qlcnic_82xx_set_mac_filter_count(struct qlcnic_adapter *adapter) in qlcnic_82xx_set_mac_filter_count() argument
2236 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_82xx_set_mac_filter_count()
2250 static int qlcnic_set_real_num_queues(struct qlcnic_adapter *adapter, in qlcnic_set_real_num_queues() argument
2253 struct net_device *netdev = adapter->netdev; in qlcnic_set_real_num_queues()
2276 qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev, in qlcnic_setup_netdev() argument
2280 struct pci_dev *pdev = adapter->pdev; in qlcnic_setup_netdev()
2282 adapter->rx_csum = 1; in qlcnic_setup_netdev()
2283 adapter->ahw->mc_enabled = 0; in qlcnic_setup_netdev()
2284 qlcnic_set_mac_filter_count(adapter); in qlcnic_setup_netdev()
2291 netdev->ethtool_ops = (qlcnic_sriov_vf_check(adapter)) ? in qlcnic_setup_netdev()
2300 if (QLCNIC_IS_TSO_CAPABLE(adapter)) { in qlcnic_setup_netdev()
2310 if (qlcnic_vlan_tx_check(adapter)) in qlcnic_setup_netdev()
2313 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_setup_netdev()
2316 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO) in qlcnic_setup_netdev()
2319 if (qlcnic_encap_tx_offload(adapter)) { in qlcnic_setup_netdev()
2329 if (qlcnic_encap_rx_offload(adapter)) in qlcnic_setup_netdev()
2334 netdev->irq = adapter->msix_entries[0].vector; in qlcnic_setup_netdev()
2336 err = qlcnic_set_real_num_queues(adapter, adapter->drv_tx_rings, in qlcnic_setup_netdev()
2337 adapter->drv_sds_rings); in qlcnic_setup_netdev()
2341 qlcnic_dcb_init_dcbnl_ops(adapter->dcb); in qlcnic_setup_netdev()
2368 void qlcnic_free_tx_rings(struct qlcnic_adapter *adapter) in qlcnic_free_tx_rings() argument
2373 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_free_tx_rings()
2374 tx_ring = &adapter->tx_ring[ring]; in qlcnic_free_tx_rings()
2380 kfree(adapter->tx_ring); in qlcnic_free_tx_rings()
2383 int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter, in qlcnic_alloc_tx_rings() argument
2390 tx_ring = kcalloc(adapter->drv_tx_rings, in qlcnic_alloc_tx_rings()
2395 adapter->tx_ring = tx_ring; in qlcnic_alloc_tx_rings()
2397 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_alloc_tx_rings()
2398 tx_ring = &adapter->tx_ring[ring]; in qlcnic_alloc_tx_rings()
2399 tx_ring->num_desc = adapter->num_txd; in qlcnic_alloc_tx_rings()
2403 qlcnic_free_tx_rings(adapter); in qlcnic_alloc_tx_rings()
2411 if (qlcnic_83xx_check(adapter) || in qlcnic_alloc_tx_rings()
2412 (qlcnic_82xx_check(adapter) && qlcnic_check_multi_tx(adapter))) { in qlcnic_alloc_tx_rings()
2413 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_alloc_tx_rings()
2414 tx_ring = &adapter->tx_ring[ring]; in qlcnic_alloc_tx_rings()
2415 tx_ring->adapter = adapter; in qlcnic_alloc_tx_rings()
2416 if (adapter->flags & QLCNIC_MSIX_ENABLED) { in qlcnic_alloc_tx_rings()
2417 index = adapter->drv_sds_rings + ring; in qlcnic_alloc_tx_rings()
2418 vector = adapter->msix_entries[index].vector; in qlcnic_alloc_tx_rings()
2427 void qlcnic_set_drv_version(struct qlcnic_adapter *adapter) in qlcnic_set_drv_version() argument
2429 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_set_drv_version()
2432 if (qlcnic_82xx_check(adapter)) in qlcnic_set_drv_version()
2434 else if (qlcnic_83xx_check(adapter)) in qlcnic_set_drv_version()
2438 qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd); in qlcnic_set_drv_version()
2442 static void qlcnic_reset_api_lock(struct qlcnic_adapter *adapter) in qlcnic_reset_api_lock() argument
2444 qlcnic_api_lock(adapter); in qlcnic_reset_api_lock()
2445 qlcnic_api_unlock(adapter); in qlcnic_reset_api_lock()
2453 struct qlcnic_adapter *adapter = NULL; in qlcnic_probe() local
2515 adapter = netdev_priv(netdev); in qlcnic_probe()
2516 adapter->netdev = netdev; in qlcnic_probe()
2517 adapter->pdev = pdev; in qlcnic_probe()
2518 adapter->ahw = ahw; in qlcnic_probe()
2520 adapter->qlcnic_wq = create_singlethread_workqueue("qlcnic"); in qlcnic_probe()
2521 if (adapter->qlcnic_wq == NULL) { in qlcnic_probe()
2527 err = qlcnic_alloc_adapter_resources(adapter); in qlcnic_probe()
2531 adapter->dev_rst_time = jiffies; in qlcnic_probe()
2533 ahw->max_vnic_func = qlcnic_get_vnic_func_count(adapter); in qlcnic_probe()
2535 adapter->fdb_mac_learn = true; in qlcnic_probe()
2537 adapter->drv_mac_learn = true; in qlcnic_probe()
2539 rwlock_init(&adapter->ahw->crb_lock); in qlcnic_probe()
2540 mutex_init(&adapter->ahw->mem_lock); in qlcnic_probe()
2542 INIT_LIST_HEAD(&adapter->mac_list); in qlcnic_probe()
2544 qlcnic_register_dcb(adapter); in qlcnic_probe()
2546 if (qlcnic_82xx_check(adapter)) { in qlcnic_probe()
2547 qlcnic_check_vf(adapter, ent); in qlcnic_probe()
2548 adapter->portnum = adapter->ahw->pci_func; in qlcnic_probe()
2549 qlcnic_reset_api_lock(adapter); in qlcnic_probe()
2550 err = qlcnic_start_firmware(adapter); in qlcnic_probe()
2558 if (adapter->ahw->msix_supported) { in qlcnic_probe()
2559 if (qlcnic_check_multi_tx_capability(adapter) == 1) in qlcnic_probe()
2560 qlcnic_set_tx_ring_count(adapter, in qlcnic_probe()
2563 qlcnic_set_tx_ring_count(adapter, in qlcnic_probe()
2565 qlcnic_set_sds_ring_count(adapter, in qlcnic_probe()
2568 qlcnic_set_tx_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_probe()
2569 qlcnic_set_sds_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_probe()
2572 err = qlcnic_setup_idc_param(adapter); in qlcnic_probe()
2576 adapter->flags |= QLCNIC_NEED_FLR; in qlcnic_probe()
2578 } else if (qlcnic_83xx_check(adapter)) { in qlcnic_probe()
2579 qlcnic_83xx_check_vf(adapter, ent); in qlcnic_probe()
2580 adapter->portnum = adapter->ahw->pci_func; in qlcnic_probe()
2581 err = qlcnic_83xx_init(adapter, pci_using_dac); in qlcnic_probe()
2600 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_probe()
2609 if (qlcnic_read_mac_addr(adapter)) in qlcnic_probe()
2612 qlcnic_read_phys_port_id(adapter); in qlcnic_probe()
2614 if (adapter->portnum == 0) { in qlcnic_probe()
2615 qlcnic_get_board_name(adapter, board_name); in qlcnic_probe()
2619 board_name, adapter->ahw->revision_id); in qlcnic_probe()
2622 if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x && in qlcnic_probe()
2627 if (qlcnic_82xx_check(adapter)) { in qlcnic_probe()
2628 qlcnic_dcb_enable(adapter->dcb); in qlcnic_probe()
2629 qlcnic_dcb_get_info(adapter->dcb); in qlcnic_probe()
2630 err = qlcnic_setup_intr(adapter); in qlcnic_probe()
2638 err = qlcnic_get_act_pci_func(adapter); in qlcnic_probe()
2642 if (adapter->portnum == 0) in qlcnic_probe()
2643 qlcnic_set_drv_version(adapter); in qlcnic_probe()
2645 err = qlcnic_setup_netdev(adapter, netdev, pci_using_dac); in qlcnic_probe()
2649 pci_set_drvdata(pdev, adapter); in qlcnic_probe()
2651 if (qlcnic_82xx_check(adapter)) in qlcnic_probe()
2652 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, in qlcnic_probe()
2655 switch (adapter->ahw->port_type) { in qlcnic_probe()
2657 dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n", in qlcnic_probe()
2658 adapter->netdev->name); in qlcnic_probe()
2661 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n", in qlcnic_probe()
2662 adapter->netdev->name); in qlcnic_probe()
2666 if (adapter->drv_mac_learn) in qlcnic_probe()
2667 qlcnic_alloc_lb_filters_mem(adapter); in qlcnic_probe()
2669 qlcnic_add_sysfs(adapter); in qlcnic_probe()
2670 qlcnic_register_hwmon_dev(adapter); in qlcnic_probe()
2674 if (qlcnic_83xx_check(adapter)) in qlcnic_probe()
2675 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_probe()
2678 qlcnic_teardown_intr(adapter); in qlcnic_probe()
2679 qlcnic_cancel_idc_work(adapter); in qlcnic_probe()
2680 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_probe()
2683 qlcnic_free_adapter_resources(adapter); in qlcnic_probe()
2686 destroy_workqueue(adapter->qlcnic_wq); in qlcnic_probe()
2705 set_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state); in qlcnic_probe()
2710 if (qlcnic_83xx_check(adapter)) in qlcnic_probe()
2711 adapter->tgt_status_reg = NULL; in qlcnic_probe()
2719 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_probe()
2723 pci_set_drvdata(pdev, adapter); in qlcnic_probe()
2724 qlcnic_add_sysfs(adapter); in qlcnic_probe()
2731 struct qlcnic_adapter *adapter; in qlcnic_remove() local
2735 adapter = pci_get_drvdata(pdev); in qlcnic_remove()
2736 if (adapter == NULL) in qlcnic_remove()
2739 netdev = adapter->netdev; in qlcnic_remove()
2741 qlcnic_cancel_idc_work(adapter); in qlcnic_remove()
2742 qlcnic_sriov_pf_disable(adapter); in qlcnic_remove()
2743 ahw = adapter->ahw; in qlcnic_remove()
2746 qlcnic_sriov_cleanup(adapter); in qlcnic_remove()
2748 if (qlcnic_83xx_check(adapter)) { in qlcnic_remove()
2749 qlcnic_83xx_initialize_nic(adapter, 0); in qlcnic_remove()
2750 cancel_delayed_work_sync(&adapter->idc_aen_work); in qlcnic_remove()
2751 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_remove()
2752 qlcnic_83xx_detach_mailbox_work(adapter); in qlcnic_remove()
2757 qlcnic_dcb_free(adapter->dcb); in qlcnic_remove()
2758 qlcnic_detach(adapter); in qlcnic_remove()
2759 kfree(adapter->npars); in qlcnic_remove()
2760 kfree(adapter->eswitch); in qlcnic_remove()
2762 if (qlcnic_82xx_check(adapter)) in qlcnic_remove()
2763 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_remove()
2765 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_remove()
2767 qlcnic_free_lb_filters_mem(adapter); in qlcnic_remove()
2769 qlcnic_teardown_intr(adapter); in qlcnic_remove()
2771 qlcnic_remove_sysfs(adapter); in qlcnic_remove()
2773 qlcnic_unregister_hwmon_dev(adapter); in qlcnic_remove()
2775 qlcnic_cleanup_pci_map(adapter->ahw); in qlcnic_remove()
2777 qlcnic_release_firmware(adapter); in qlcnic_remove()
2783 if (adapter->qlcnic_wq) { in qlcnic_remove()
2784 destroy_workqueue(adapter->qlcnic_wq); in qlcnic_remove()
2785 adapter->qlcnic_wq = NULL; in qlcnic_remove()
2788 qlcnic_free_adapter_resources(adapter); in qlcnic_remove()
2816 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_resume() local
2827 return __qlcnic_resume(adapter); in qlcnic_resume()
2833 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_open() local
2836 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) { in qlcnic_open()
2845 err = qlcnic_attach(adapter); in qlcnic_open()
2849 err = __qlcnic_up(adapter, netdev); in qlcnic_open()
2851 qlcnic_detach(adapter); in qlcnic_open()
2861 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_close() local
2863 __qlcnic_down(adapter, netdev); in qlcnic_close()
2870 void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter) in qlcnic_alloc_lb_filters_mem() argument
2874 struct net_device *netdev = adapter->netdev; in qlcnic_alloc_lb_filters_mem()
2878 if (adapter->fhash.fmax && adapter->fhash.fhead) in qlcnic_alloc_lb_filters_mem()
2881 act_pci_func = adapter->ahw->total_nic_func; in qlcnic_alloc_lb_filters_mem()
2882 spin_lock_init(&adapter->mac_learn_lock); in qlcnic_alloc_lb_filters_mem()
2883 spin_lock_init(&adapter->rx_mac_learn_lock); in qlcnic_alloc_lb_filters_mem()
2885 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_alloc_lb_filters_mem()
2887 adapter->fhash.fbucket_size = QLCNIC_VF_LB_BUCKET_SIZE; in qlcnic_alloc_lb_filters_mem()
2888 } else if (qlcnic_82xx_check(adapter)) { in qlcnic_alloc_lb_filters_mem()
2890 adapter->fhash.fbucket_size = QLCNIC_LB_BUCKET_SIZE; in qlcnic_alloc_lb_filters_mem()
2893 adapter->fhash.fbucket_size = QLC_83XX_LB_BUCKET_SIZE; in qlcnic_alloc_lb_filters_mem()
2896 head = kcalloc(adapter->fhash.fbucket_size, in qlcnic_alloc_lb_filters_mem()
2902 adapter->fhash.fmax = (filter_size / act_pci_func); in qlcnic_alloc_lb_filters_mem()
2903 adapter->fhash.fhead = head; in qlcnic_alloc_lb_filters_mem()
2906 act_pci_func, adapter->fhash.fmax); in qlcnic_alloc_lb_filters_mem()
2908 for (i = 0; i < adapter->fhash.fbucket_size; i++) in qlcnic_alloc_lb_filters_mem()
2909 INIT_HLIST_HEAD(&adapter->fhash.fhead[i]); in qlcnic_alloc_lb_filters_mem()
2911 adapter->rx_fhash.fbucket_size = adapter->fhash.fbucket_size; in qlcnic_alloc_lb_filters_mem()
2913 head = kcalloc(adapter->rx_fhash.fbucket_size, in qlcnic_alloc_lb_filters_mem()
2919 adapter->rx_fhash.fmax = (filter_size / act_pci_func); in qlcnic_alloc_lb_filters_mem()
2920 adapter->rx_fhash.fhead = head; in qlcnic_alloc_lb_filters_mem()
2922 for (i = 0; i < adapter->rx_fhash.fbucket_size; i++) in qlcnic_alloc_lb_filters_mem()
2923 INIT_HLIST_HEAD(&adapter->rx_fhash.fhead[i]); in qlcnic_alloc_lb_filters_mem()
2926 static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter) in qlcnic_free_lb_filters_mem() argument
2928 if (adapter->fhash.fmax) in qlcnic_free_lb_filters_mem()
2929 kfree(adapter->fhash.fhead); in qlcnic_free_lb_filters_mem()
2931 adapter->fhash.fhead = NULL; in qlcnic_free_lb_filters_mem()
2932 adapter->fhash.fmax = 0; in qlcnic_free_lb_filters_mem()
2934 if (adapter->rx_fhash.fmax) in qlcnic_free_lb_filters_mem()
2935 kfree(adapter->rx_fhash.fhead); in qlcnic_free_lb_filters_mem()
2937 adapter->rx_fhash.fmax = 0; in qlcnic_free_lb_filters_mem()
2938 adapter->rx_fhash.fhead = NULL; in qlcnic_free_lb_filters_mem()
2941 int qlcnic_check_temp(struct qlcnic_adapter *adapter) in qlcnic_check_temp() argument
2943 struct net_device *netdev = adapter->netdev; in qlcnic_check_temp()
2947 if (qlcnic_83xx_check(adapter)) in qlcnic_check_temp()
2948 temp = QLCRDX(adapter->ahw, QLC_83XX_ASIC_TEMP); in qlcnic_check_temp()
2950 if (qlcnic_82xx_check(adapter)) in qlcnic_check_temp()
2951 temp = QLC_SHARED_REG_RD32(adapter, QLCNIC_ASIC_TEMP); in qlcnic_check_temp()
2963 if (adapter->ahw->temp == QLCNIC_TEMP_NORMAL) { in qlcnic_check_temp()
2971 if (adapter->ahw->temp == QLCNIC_TEMP_WARN) { in qlcnic_check_temp()
2977 adapter->ahw->temp = temp_state; in qlcnic_check_temp()
2995 static void qlcnic_dump_rings(struct qlcnic_adapter *adapter) in qlcnic_dump_rings() argument
2997 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_dump_rings()
2998 struct net_device *netdev = adapter->netdev; in qlcnic_dump_rings()
3007 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in qlcnic_dump_rings()
3017 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_dump_rings()
3028 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_dump_rings()
3029 tx_ring = &adapter->tx_ring[ring]; in qlcnic_dump_rings()
3054 if (netif_msg_tx_err(adapter->ahw)) in qlcnic_dump_rings()
3062 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_tx_timeout() local
3064 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_tx_timeout()
3067 qlcnic_dump_rings(adapter); in qlcnic_tx_timeout()
3069 if (++adapter->tx_timeo_cnt >= QLCNIC_MAX_TX_TIMEOUTS || in qlcnic_tx_timeout()
3070 netif_msg_tx_err(adapter->ahw)) { in qlcnic_tx_timeout()
3072 if (qlcnic_82xx_check(adapter)) in qlcnic_tx_timeout()
3073 adapter->need_fw_reset = 1; in qlcnic_tx_timeout()
3074 else if (qlcnic_83xx_check(adapter)) in qlcnic_tx_timeout()
3075 qlcnic_83xx_idc_request_reset(adapter, in qlcnic_tx_timeout()
3079 adapter->ahw->reset_context = 1; in qlcnic_tx_timeout()
3085 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_get_stats() local
3088 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_get_stats()
3089 qlcnic_update_stats(adapter); in qlcnic_get_stats()
3091 stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts; in qlcnic_get_stats()
3092 stats->tx_packets = adapter->stats.xmitfinished; in qlcnic_get_stats()
3093 stats->rx_bytes = adapter->stats.rxbytes + adapter->stats.lrobytes; in qlcnic_get_stats()
3094 stats->tx_bytes = adapter->stats.txbytes; in qlcnic_get_stats()
3095 stats->rx_dropped = adapter->stats.rxdropped; in qlcnic_get_stats()
3096 stats->tx_dropped = adapter->stats.txdropped; in qlcnic_get_stats()
3101 static irqreturn_t qlcnic_82xx_clear_legacy_intr(struct qlcnic_adapter *adapter) in qlcnic_82xx_clear_legacy_intr() argument
3105 status = readl(adapter->isr_int_vec); in qlcnic_82xx_clear_legacy_intr()
3107 if (!(status & adapter->ahw->int_vec_bit)) in qlcnic_82xx_clear_legacy_intr()
3111 status = readl(adapter->crb_int_state_reg); in qlcnic_82xx_clear_legacy_intr()
3115 writel(0xffffffff, adapter->tgt_status_reg); in qlcnic_82xx_clear_legacy_intr()
3117 readl(adapter->isr_int_vec); in qlcnic_82xx_clear_legacy_intr()
3118 readl(adapter->isr_int_vec); in qlcnic_82xx_clear_legacy_intr()
3126 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_tmp_intr() local
3128 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_tmp_intr()
3130 else if (adapter->flags & QLCNIC_MSI_ENABLED) { in qlcnic_tmp_intr()
3131 writel(0xffffffff, adapter->tgt_status_reg); in qlcnic_tmp_intr()
3135 if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE) in qlcnic_tmp_intr()
3139 adapter->ahw->diag_cnt++; in qlcnic_tmp_intr()
3140 qlcnic_enable_sds_intr(adapter, sds_ring); in qlcnic_tmp_intr()
3147 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_intr() local
3149 if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE) in qlcnic_intr()
3160 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_msi_intr() local
3163 writel(0xffffffff, adapter->tgt_status_reg); in qlcnic_msi_intr()
3188 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_poll_controller() local
3194 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_poll_controller()
3197 recv_ctx = adapter->recv_ctx; in qlcnic_poll_controller()
3199 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_poll_controller()
3201 qlcnic_disable_sds_intr(adapter, sds_ring); in qlcnic_poll_controller()
3205 if (adapter->flags & QLCNIC_MSIX_ENABLED) { in qlcnic_poll_controller()
3209 if ((qlcnic_83xx_check(adapter) && in qlcnic_poll_controller()
3210 (adapter->flags & QLCNIC_TX_INTR_SHARED)) || in qlcnic_poll_controller()
3211 (qlcnic_82xx_check(adapter) && in qlcnic_poll_controller()
3212 !qlcnic_check_multi_tx(adapter))) in qlcnic_poll_controller()
3215 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_poll_controller()
3216 tx_ring = &adapter->tx_ring[ring]; in qlcnic_poll_controller()
3217 qlcnic_disable_tx_intr(adapter, tx_ring); in qlcnic_poll_controller()
3225 qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding) in qlcnic_idc_debug_info() argument
3229 val = adapter->portnum & 0xf; in qlcnic_idc_debug_info()
3231 val |= (jiffies - adapter->dev_rst_time) << 8; in qlcnic_idc_debug_info()
3233 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_SCRATCH, val); in qlcnic_idc_debug_info()
3234 adapter->dev_rst_time = jiffies; in qlcnic_idc_debug_info()
3238 qlcnic_set_drv_state(struct qlcnic_adapter *adapter, u8 state) in qlcnic_set_drv_state() argument
3245 if (qlcnic_api_lock(adapter)) in qlcnic_set_drv_state()
3248 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_set_drv_state()
3251 QLC_DEV_SET_RST_RDY(val, adapter->portnum); in qlcnic_set_drv_state()
3253 QLC_DEV_SET_QSCNT_RDY(val, adapter->portnum); in qlcnic_set_drv_state()
3255 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_set_drv_state()
3257 qlcnic_api_unlock(adapter); in qlcnic_set_drv_state()
3263 qlcnic_clr_drv_state(struct qlcnic_adapter *adapter) in qlcnic_clr_drv_state() argument
3267 if (qlcnic_api_lock(adapter)) in qlcnic_clr_drv_state()
3270 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_clr_drv_state()
3271 QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum); in qlcnic_clr_drv_state()
3272 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_clr_drv_state()
3274 qlcnic_api_unlock(adapter); in qlcnic_clr_drv_state()
3279 void qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8 failed) in qlcnic_clr_all_drv_state() argument
3283 if (qlcnic_api_lock(adapter)) in qlcnic_clr_all_drv_state()
3286 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE); in qlcnic_clr_all_drv_state()
3287 QLC_DEV_CLR_REF_CNT(val, adapter->portnum); in qlcnic_clr_all_drv_state()
3288 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val); in qlcnic_clr_all_drv_state()
3291 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_clr_all_drv_state()
3293 dev_info(&adapter->pdev->dev, in qlcnic_clr_all_drv_state()
3296 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_clr_all_drv_state()
3299 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_clr_all_drv_state()
3300 QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum); in qlcnic_clr_all_drv_state()
3301 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_clr_all_drv_state()
3303 qlcnic_api_unlock(adapter); in qlcnic_clr_all_drv_state()
3305 adapter->fw_fail_cnt = 0; in qlcnic_clr_all_drv_state()
3306 adapter->flags &= ~QLCNIC_FW_HANG; in qlcnic_clr_all_drv_state()
3307 clear_bit(__QLCNIC_START_FW, &adapter->state); in qlcnic_clr_all_drv_state()
3308 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_clr_all_drv_state()
3313 qlcnic_check_drv_state(struct qlcnic_adapter *adapter) in qlcnic_check_drv_state() argument
3316 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_drv_state()
3318 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_check_drv_state()
3319 act = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE); in qlcnic_check_drv_state()
3321 if (adapter->flags & QLCNIC_FW_RESET_OWNER) { in qlcnic_check_drv_state()
3333 static int qlcnic_check_idc_ver(struct qlcnic_adapter *adapter) in qlcnic_check_idc_ver() argument
3335 u32 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_IDC_VER); in qlcnic_check_idc_ver()
3338 dev_warn(&adapter->pdev->dev, "IDC Version mismatch, driver's" in qlcnic_check_idc_ver()
3346 qlcnic_can_start_firmware(struct qlcnic_adapter *adapter) in qlcnic_can_start_firmware() argument
3349 u8 dev_init_timeo = adapter->dev_init_timeo; in qlcnic_can_start_firmware()
3350 u8 portnum = adapter->portnum; in qlcnic_can_start_firmware()
3353 if (test_and_clear_bit(__QLCNIC_START_FW, &adapter->state)) in qlcnic_can_start_firmware()
3356 if (qlcnic_api_lock(adapter)) in qlcnic_can_start_firmware()
3359 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE); in qlcnic_can_start_firmware()
3362 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val); in qlcnic_can_start_firmware()
3365 prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_can_start_firmware()
3366 QLCDB(adapter, HW, "Device state = %u\n", prev_state); in qlcnic_can_start_firmware()
3370 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_can_start_firmware()
3372 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_IDC_VER, in qlcnic_can_start_firmware()
3374 qlcnic_idc_debug_info(adapter, 0); in qlcnic_can_start_firmware()
3375 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3379 ret = qlcnic_check_idc_ver(adapter); in qlcnic_can_start_firmware()
3380 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3384 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_can_start_firmware()
3386 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_can_start_firmware()
3390 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_can_start_firmware()
3392 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_can_start_firmware()
3396 dev_err(&adapter->pdev->dev, "Device in failed state.\n"); in qlcnic_can_start_firmware()
3397 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3405 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3409 prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_can_start_firmware()
3416 dev_err(&adapter->pdev->dev, in qlcnic_can_start_firmware()
3421 if (qlcnic_api_lock(adapter)) in qlcnic_can_start_firmware()
3424 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_can_start_firmware()
3426 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_can_start_firmware()
3428 ret = qlcnic_check_idc_ver(adapter); in qlcnic_can_start_firmware()
3429 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3437 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_fwinit_work() local
3442 if (qlcnic_api_lock(adapter)) in qlcnic_fwinit_work()
3445 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_fwinit_work()
3448 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3449 qlcnic_schedule_work(adapter, qlcnic_fwinit_work, in qlcnic_fwinit_work()
3454 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { in qlcnic_fwinit_work()
3455 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3461 dev_info(&adapter->pdev->dev, "Detected state change from " in qlcnic_fwinit_work()
3466 if (adapter->fw_wait_cnt++ > adapter->reset_ack_timeo) { in qlcnic_fwinit_work()
3467 dev_info(&adapter->pdev->dev, "Reset:Failed to get ack %d sec\n", in qlcnic_fwinit_work()
3468 adapter->reset_ack_timeo); in qlcnic_fwinit_work()
3472 if (!qlcnic_check_drv_state(adapter)) { in qlcnic_fwinit_work()
3474 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_fwinit_work()
3477 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_fwinit_work()
3479 set_bit(__QLCNIC_START_FW, &adapter->state); in qlcnic_fwinit_work()
3480 QLCDB(adapter, DRV, "Restarting fw\n"); in qlcnic_fwinit_work()
3481 qlcnic_idc_debug_info(adapter, 0); in qlcnic_fwinit_work()
3482 val = QLC_SHARED_REG_RD32(adapter, in qlcnic_fwinit_work()
3484 QLC_DEV_SET_RST_RDY(val, adapter->portnum); in qlcnic_fwinit_work()
3485 QLC_SHARED_REG_WR32(adapter, in qlcnic_fwinit_work()
3489 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3492 if (qlcnic_check_fw_dump_state(adapter) && in qlcnic_fwinit_work()
3493 (adapter->flags & QLCNIC_FW_RESET_OWNER)) { in qlcnic_fwinit_work()
3494 QLCDB(adapter, DRV, "Take FW dump\n"); in qlcnic_fwinit_work()
3495 qlcnic_dump_fw(adapter); in qlcnic_fwinit_work()
3496 adapter->flags |= QLCNIC_FW_HANG; in qlcnic_fwinit_work()
3500 adapter->flags &= ~QLCNIC_FW_RESET_OWNER; in qlcnic_fwinit_work()
3501 if (!adapter->nic_ops->start_firmware(adapter)) { in qlcnic_fwinit_work()
3502 qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); in qlcnic_fwinit_work()
3503 adapter->fw_wait_cnt = 0; in qlcnic_fwinit_work()
3509 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3512 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_fwinit_work()
3513 QLCDB(adapter, HW, "Func waiting: Device state=%u\n", dev_state); in qlcnic_fwinit_work()
3517 if (!qlcnic_start_firmware(adapter)) { in qlcnic_fwinit_work()
3518 qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); in qlcnic_fwinit_work()
3519 adapter->fw_wait_cnt = 0; in qlcnic_fwinit_work()
3525 qlcnic_schedule_work(adapter, in qlcnic_fwinit_work()
3531 dev_err(&adapter->pdev->dev, "Fwinit work failed state=%u " in qlcnic_fwinit_work()
3532 "fw_wait_cnt=%u\n", dev_state, adapter->fw_wait_cnt); in qlcnic_fwinit_work()
3533 netif_device_attach(adapter->netdev); in qlcnic_fwinit_work()
3534 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_fwinit_work()
3540 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_detach_work() local
3542 struct net_device *netdev = adapter->netdev; in qlcnic_detach_work()
3548 if (adapter->dev_state == QLCNIC_DEV_NEED_QUISCENT) { in qlcnic_detach_work()
3550 __qlcnic_down(adapter, netdev); in qlcnic_detach_work()
3552 qlcnic_down(adapter, netdev); in qlcnic_detach_work()
3554 status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1); in qlcnic_detach_work()
3557 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3562 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3565 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3572 if (adapter->ahw->temp == QLCNIC_TEMP_PANIC) { in qlcnic_detach_work()
3573 dev_err(&adapter->pdev->dev, "Detaching the device: temp=%d\n", in qlcnic_detach_work()
3574 adapter->ahw->temp); in qlcnic_detach_work()
3579 if (!(adapter->flags & QLCNIC_FW_RESET_OWNER)) { in qlcnic_detach_work()
3580 if (qlcnic_set_drv_state(adapter, adapter->dev_state)) { in qlcnic_detach_work()
3581 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3588 adapter->fw_wait_cnt = 0; in qlcnic_detach_work()
3590 qlcnic_schedule_work(adapter, qlcnic_fwinit_work, FW_POLL_DELAY); in qlcnic_detach_work()
3596 qlcnic_clr_all_drv_state(adapter, 1); in qlcnic_detach_work()
3601 qlcnic_set_npar_non_operational(struct qlcnic_adapter *adapter) in qlcnic_set_npar_non_operational() argument
3605 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE); in qlcnic_set_npar_non_operational()
3609 if (qlcnic_api_lock(adapter)) in qlcnic_set_npar_non_operational()
3611 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, in qlcnic_set_npar_non_operational()
3613 qlcnic_api_unlock(adapter); in qlcnic_set_npar_non_operational()
3616 static void qlcnic_82xx_dev_request_reset(struct qlcnic_adapter *adapter, in qlcnic_82xx_dev_request_reset() argument
3623 QLCWR32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, xg_val); in qlcnic_82xx_dev_request_reset()
3628 QLCWR32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, gb_val); in qlcnic_82xx_dev_request_reset()
3629 dev_info(&adapter->pdev->dev, "Pause control frames disabled" in qlcnic_82xx_dev_request_reset()
3631 adapter->need_fw_reset = 1; in qlcnic_82xx_dev_request_reset()
3633 if (qlcnic_api_lock(adapter)) in qlcnic_82xx_dev_request_reset()
3636 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_82xx_dev_request_reset()
3638 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) { in qlcnic_82xx_dev_request_reset()
3639 netdev_err(adapter->netdev, "%s: Device is in non-operational state\n", in qlcnic_82xx_dev_request_reset()
3641 qlcnic_api_unlock(adapter); in qlcnic_82xx_dev_request_reset()
3647 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_82xx_dev_request_reset()
3649 adapter->flags |= QLCNIC_FW_RESET_OWNER; in qlcnic_82xx_dev_request_reset()
3650 QLCDB(adapter, DRV, "NEED_RESET state set\n"); in qlcnic_82xx_dev_request_reset()
3651 qlcnic_idc_debug_info(adapter, 0); in qlcnic_82xx_dev_request_reset()
3654 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, in qlcnic_82xx_dev_request_reset()
3656 qlcnic_api_unlock(adapter); in qlcnic_82xx_dev_request_reset()
3661 qlcnic_dev_set_npar_ready(struct qlcnic_adapter *adapter) in qlcnic_dev_set_npar_ready() argument
3663 if (qlcnic_api_lock(adapter)) in qlcnic_dev_set_npar_ready()
3666 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, in qlcnic_dev_set_npar_ready()
3668 QLCDB(adapter, DRV, "NPAR operational state set\n"); in qlcnic_dev_set_npar_ready()
3670 qlcnic_api_unlock(adapter); in qlcnic_dev_set_npar_ready()
3673 void qlcnic_schedule_work(struct qlcnic_adapter *adapter, in qlcnic_schedule_work() argument
3676 if (test_bit(__QLCNIC_AER, &adapter->state)) in qlcnic_schedule_work()
3679 INIT_DELAYED_WORK(&adapter->fw_work, func); in qlcnic_schedule_work()
3680 queue_delayed_work(adapter->qlcnic_wq, &adapter->fw_work, in qlcnic_schedule_work()
3687 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_attach_work() local
3689 struct net_device *netdev = adapter->netdev; in qlcnic_attach_work()
3692 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) { in qlcnic_attach_work()
3693 npar_state = QLC_SHARED_REG_RD32(adapter, in qlcnic_attach_work()
3695 if (adapter->fw_wait_cnt++ > QLCNIC_DEV_NPAR_OPER_TIMEO) in qlcnic_attach_work()
3696 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_attach_work()
3698 qlcnic_schedule_work(adapter, qlcnic_attach_work, in qlcnic_attach_work()
3702 QLCDB(adapter, DRV, "Waiting for NPAR state to operational\n"); in qlcnic_attach_work()
3706 qlcnic_dcb_get_info(adapter->dcb); in qlcnic_attach_work()
3709 if (qlcnic_up(adapter, netdev)) in qlcnic_attach_work()
3717 adapter->fw_fail_cnt = 0; in qlcnic_attach_work()
3718 adapter->flags &= ~QLCNIC_FW_HANG; in qlcnic_attach_work()
3719 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_attach_work()
3720 if (adapter->portnum == 0) in qlcnic_attach_work()
3721 qlcnic_set_drv_version(adapter); in qlcnic_attach_work()
3723 if (!qlcnic_clr_drv_state(adapter)) in qlcnic_attach_work()
3724 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, in qlcnic_attach_work()
3729 qlcnic_check_health(struct qlcnic_adapter *adapter) in qlcnic_check_health() argument
3731 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_health()
3737 if (qlcnic_check_temp(adapter)) in qlcnic_check_health()
3740 if (adapter->need_fw_reset) in qlcnic_check_health()
3741 qlcnic_dev_request_reset(adapter, 0); in qlcnic_check_health()
3743 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_check_health()
3745 qlcnic_set_npar_non_operational(adapter); in qlcnic_check_health()
3746 adapter->need_fw_reset = 1; in qlcnic_check_health()
3750 heartbeat = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_ALIVE_COUNTER); in qlcnic_check_health()
3751 if (heartbeat != adapter->heartbeat) { in qlcnic_check_health()
3752 adapter->heartbeat = heartbeat; in qlcnic_check_health()
3753 adapter->fw_fail_cnt = 0; in qlcnic_check_health()
3754 if (adapter->need_fw_reset) in qlcnic_check_health()
3758 qlcnic_reset_hw_context(adapter); in qlcnic_check_health()
3763 if (++adapter->fw_fail_cnt < FW_FAIL_THRESH) in qlcnic_check_health()
3766 adapter->flags |= QLCNIC_FW_HANG; in qlcnic_check_health()
3768 qlcnic_dev_request_reset(adapter, 0); in qlcnic_check_health()
3771 clear_bit(__QLCNIC_FW_ATTACHED, &adapter->state); in qlcnic_check_health()
3773 dev_err(&adapter->pdev->dev, "firmware hang detected\n"); in qlcnic_check_health()
3774 peg_status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1); in qlcnic_check_health()
3775 dev_err(&adapter->pdev->dev, "Dumping hw/fw registers\n" in qlcnic_check_health()
3781 QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2), in qlcnic_check_health()
3782 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err), in qlcnic_check_health()
3783 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err), in qlcnic_check_health()
3784 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err), in qlcnic_check_health()
3785 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err), in qlcnic_check_health()
3786 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err)); in qlcnic_check_health()
3788 dev_err(&adapter->pdev->dev, in qlcnic_check_health()
3792 adapter->dev_state = (state == QLCNIC_DEV_NEED_QUISCENT) ? state : in qlcnic_check_health()
3796 &adapter->state)) { in qlcnic_check_health()
3798 qlcnic_schedule_work(adapter, qlcnic_detach_work, 0); in qlcnic_check_health()
3799 QLCDB(adapter, DRV, "fw recovery scheduled.\n"); in qlcnic_check_health()
3801 adapter->flags & QLCNIC_FW_RESET_OWNER) { in qlcnic_check_health()
3802 qlcnic_dump_fw(adapter); in qlcnic_check_health()
3810 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_fw_poll_work() local
3813 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_fw_poll_work()
3817 if (qlcnic_check_health(adapter)) in qlcnic_fw_poll_work()
3820 if (adapter->fhash.fnum) in qlcnic_fw_poll_work()
3821 qlcnic_prune_lb_filters(adapter); in qlcnic_fw_poll_work()
3824 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY); in qlcnic_fw_poll_work()
3851 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_attach_func() local
3852 struct net_device *netdev = adapter->netdev; in qlcnic_attach_func()
3865 if (qlcnic_api_lock(adapter)) in qlcnic_attach_func()
3868 if (adapter->ahw->op_mode != QLCNIC_NON_PRIV_FUNC && first_func) { in qlcnic_attach_func()
3869 adapter->need_fw_reset = 1; in qlcnic_attach_func()
3870 set_bit(__QLCNIC_START_FW, &adapter->state); in qlcnic_attach_func()
3871 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_attach_func()
3873 QLCDB(adapter, DRV, "Restarting fw\n"); in qlcnic_attach_func()
3875 qlcnic_api_unlock(adapter); in qlcnic_attach_func()
3877 err = qlcnic_start_firmware(adapter); in qlcnic_attach_func()
3881 qlcnic_clr_drv_state(adapter); in qlcnic_attach_func()
3882 kfree(adapter->msix_entries); in qlcnic_attach_func()
3883 adapter->msix_entries = NULL; in qlcnic_attach_func()
3884 err = qlcnic_setup_intr(adapter); in qlcnic_attach_func()
3887 kfree(adapter->msix_entries); in qlcnic_attach_func()
3893 err = qlcnic_attach(adapter); in qlcnic_attach_func()
3895 qlcnic_clr_all_drv_state(adapter, 1); in qlcnic_attach_func()
3896 clear_bit(__QLCNIC_AER, &adapter->state); in qlcnic_attach_func()
3901 err = qlcnic_up(adapter, netdev); in qlcnic_attach_func()
3915 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_82xx_io_error_detected() local
3916 struct net_device *netdev = adapter->netdev; in qlcnic_82xx_io_error_detected()
3924 set_bit(__QLCNIC_AER, &adapter->state); in qlcnic_82xx_io_error_detected()
3927 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_82xx_io_error_detected()
3930 qlcnic_down(adapter, netdev); in qlcnic_82xx_io_error_detected()
3932 qlcnic_detach(adapter); in qlcnic_82xx_io_error_detected()
3933 qlcnic_teardown_intr(adapter); in qlcnic_82xx_io_error_detected()
3935 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_82xx_io_error_detected()
3952 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_82xx_io_resume() local
3955 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_82xx_io_resume()
3957 &adapter->state)) in qlcnic_82xx_io_resume()
3958 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, in qlcnic_82xx_io_resume()
3965 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_io_error_detected() local
3966 struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops; in qlcnic_io_error_detected()
3978 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_io_slot_reset() local
3979 struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops; in qlcnic_io_slot_reset()
3991 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_io_resume() local
3992 struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops; in qlcnic_io_resume()
4002 qlcnicvf_start_firmware(struct qlcnic_adapter *adapter) in qlcnicvf_start_firmware() argument
4006 err = qlcnic_can_start_firmware(adapter); in qlcnicvf_start_firmware()
4010 err = qlcnic_check_npar_opertional(adapter); in qlcnicvf_start_firmware()
4014 err = qlcnic_initialize_nic(adapter); in qlcnicvf_start_firmware()
4018 qlcnic_check_options(adapter); in qlcnicvf_start_firmware()
4020 err = qlcnic_set_eswitch_port_config(adapter); in qlcnicvf_start_firmware()
4024 adapter->need_fw_reset = 0; in qlcnicvf_start_firmware()
4029 int qlcnic_validate_rings(struct qlcnic_adapter *adapter, __u32 ring_cnt, in qlcnic_validate_rings() argument
4032 struct net_device *netdev = adapter->netdev; in qlcnic_validate_rings()
4038 max_hw_rings = adapter->max_sds_rings; in qlcnic_validate_rings()
4039 cur_rings = adapter->drv_sds_rings; in qlcnic_validate_rings()
4042 max_hw_rings = adapter->max_tx_rings; in qlcnic_validate_rings()
4043 cur_rings = adapter->drv_tx_rings; in qlcnic_validate_rings()
4053 if (qlcnic_82xx_check(adapter) && (queue_type == QLCNIC_TX_QUEUE) && in qlcnic_validate_rings()
4054 !qlcnic_check_multi_tx(adapter)) { in qlcnic_validate_rings()
4069 int qlcnic_setup_rings(struct qlcnic_adapter *adapter) in qlcnic_setup_rings() argument
4071 struct net_device *netdev = adapter->netdev; in qlcnic_setup_rings()
4075 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_setup_rings()
4078 tx_rings = adapter->drv_tss_rings; in qlcnic_setup_rings()
4079 rx_rings = adapter->drv_rss_rings; in qlcnic_setup_rings()
4083 err = qlcnic_set_real_num_queues(adapter, tx_rings, rx_rings); in qlcnic_setup_rings()
4088 __qlcnic_down(adapter, netdev); in qlcnic_setup_rings()
4090 qlcnic_detach(adapter); in qlcnic_setup_rings()
4092 if (qlcnic_83xx_check(adapter)) { in qlcnic_setup_rings()
4093 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_setup_rings()
4094 qlcnic_83xx_enable_mbx_poll(adapter); in qlcnic_setup_rings()
4097 qlcnic_teardown_intr(adapter); in qlcnic_setup_rings()
4099 err = qlcnic_setup_intr(adapter); in qlcnic_setup_rings()
4101 kfree(adapter->msix_entries); in qlcnic_setup_rings()
4109 if ((tx_rings != adapter->drv_tx_rings) || in qlcnic_setup_rings()
4110 (rx_rings != adapter->drv_sds_rings)) { in qlcnic_setup_rings()
4111 err = qlcnic_set_real_num_queues(adapter, in qlcnic_setup_rings()
4112 adapter->drv_tx_rings, in qlcnic_setup_rings()
4113 adapter->drv_sds_rings); in qlcnic_setup_rings()
4118 if (qlcnic_83xx_check(adapter)) { in qlcnic_setup_rings()
4119 qlcnic_83xx_initialize_nic(adapter, 1); in qlcnic_setup_rings()
4120 err = qlcnic_83xx_setup_mbx_intr(adapter); in qlcnic_setup_rings()
4121 qlcnic_83xx_disable_mbx_poll(adapter); in qlcnic_setup_rings()
4123 dev_err(&adapter->pdev->dev, in qlcnic_setup_rings()
4130 err = qlcnic_attach(adapter); in qlcnic_setup_rings()
4133 err = __qlcnic_up(adapter, netdev); in qlcnic_setup_rings()
4140 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_setup_rings()
4149 qlcnic_config_indev_addr(struct qlcnic_adapter *adapter, in qlcnic_config_indev_addr() argument
4161 qlcnic_config_ipaddr(adapter, in qlcnic_config_indev_addr()
4165 qlcnic_config_ipaddr(adapter, in qlcnic_config_indev_addr()
4178 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_restore_indev_addr() local
4182 qlcnic_config_indev_addr(adapter, netdev, event); in qlcnic_restore_indev_addr()
4185 for_each_set_bit(vid, adapter->vlans, VLAN_N_VID) { in qlcnic_restore_indev_addr()
4189 qlcnic_config_indev_addr(adapter, dev, event); in qlcnic_restore_indev_addr()
4197 struct qlcnic_adapter *adapter; in qlcnic_netdev_event() local
4212 adapter = netdev_priv(dev); in qlcnic_netdev_event()
4214 if (!adapter) in qlcnic_netdev_event()
4217 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_netdev_event()
4220 qlcnic_config_indev_addr(adapter, dev, event); in qlcnic_netdev_event()
4229 struct qlcnic_adapter *adapter; in qlcnic_inetaddr_event() local
4248 adapter = netdev_priv(dev); in qlcnic_inetaddr_event()
4250 if (!adapter) in qlcnic_inetaddr_event()
4253 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_inetaddr_event()
4258 qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_UP); in qlcnic_inetaddr_event()
4262 qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_DOWN); in qlcnic_inetaddr_event()