Lines Matching refs:adapter

62 static void qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding);
63 static int qlcnic_can_start_firmware(struct qlcnic_adapter *adapter);
74 static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter);
89 static u32 qlcnic_vlan_tx_check(struct qlcnic_adapter *adapter) in qlcnic_vlan_tx_check() argument
91 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_vlan_tx_check()
93 if (adapter->pdev->device == PCI_DEVICE_ID_QLOGIC_QLE824X) in qlcnic_vlan_tx_check()
295 int qlcnic_read_mac_addr(struct qlcnic_adapter *adapter) in qlcnic_read_mac_addr() argument
297 struct net_device *netdev = adapter->netdev; in qlcnic_read_mac_addr()
298 struct pci_dev *pdev = adapter->pdev; in qlcnic_read_mac_addr()
302 ret = qlcnic_get_mac_address(adapter, mac_addr, in qlcnic_read_mac_addr()
303 adapter->ahw->pci_func); in qlcnic_read_mac_addr()
308 memcpy(adapter->mac_addr, netdev->dev_addr, netdev->addr_len); in qlcnic_read_mac_addr()
319 static void qlcnic_delete_adapter_mac(struct qlcnic_adapter *adapter) in qlcnic_delete_adapter_mac() argument
323 list_for_each_entry(cur, &adapter->mac_list, list) { in qlcnic_delete_adapter_mac()
324 if (ether_addr_equal_unaligned(adapter->mac_addr, cur->mac_addr)) { in qlcnic_delete_adapter_mac()
325 qlcnic_sre_macaddr_change(adapter, cur->mac_addr, in qlcnic_delete_adapter_mac()
336 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_set_mac() local
339 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_set_mac()
342 if ((adapter->flags & QLCNIC_MAC_OVERRIDE_DISABLED)) in qlcnic_set_mac()
348 if (ether_addr_equal_unaligned(adapter->mac_addr, addr->sa_data) && in qlcnic_set_mac()
352 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { in qlcnic_set_mac()
354 qlcnic_napi_disable(adapter); in qlcnic_set_mac()
357 qlcnic_delete_adapter_mac(adapter); in qlcnic_set_mac()
358 memcpy(adapter->mac_addr, addr->sa_data, netdev->addr_len); in qlcnic_set_mac()
360 qlcnic_set_multi(adapter->netdev); in qlcnic_set_mac()
362 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { in qlcnic_set_mac()
364 qlcnic_napi_enable(adapter); in qlcnic_set_mac()
374 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_fdb_del() local
377 if (!adapter->fdb_mac_learn) in qlcnic_fdb_del()
380 if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || in qlcnic_fdb_del()
381 qlcnic_sriov_check(adapter)) { in qlcnic_fdb_del()
385 err = qlcnic_nic_del_mac(adapter, addr); in qlcnic_fdb_del()
400 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_fdb_add() local
403 if (!adapter->fdb_mac_learn) in qlcnic_fdb_add()
406 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) && in qlcnic_fdb_add()
407 !qlcnic_sriov_check(adapter)) { in qlcnic_fdb_add()
412 if (ether_addr_equal(addr, adapter->mac_addr)) in qlcnic_fdb_add()
416 if (netdev_uc_count(netdev) < adapter->ahw->max_uc_count) in qlcnic_fdb_add()
433 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_fdb_dump() local
436 if (!adapter->fdb_mac_learn) in qlcnic_fdb_dump()
439 if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || in qlcnic_fdb_dump()
440 qlcnic_sriov_check(adapter)) in qlcnic_fdb_dump()
446 static void qlcnic_82xx_cancel_idc_work(struct qlcnic_adapter *adapter) in qlcnic_82xx_cancel_idc_work() argument
448 while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_82xx_cancel_idc_work()
451 if (!adapter->fw_work.work.func) in qlcnic_82xx_cancel_idc_work()
454 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_82xx_cancel_idc_work()
460 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_get_phys_port_id() local
461 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_get_phys_port_id()
463 if (!(adapter->flags & QLCNIC_HAS_PHYS_PORT_ID)) in qlcnic_get_phys_port_id()
474 struct qlcnic_adapter *adapter = netdev_priv(dev); in qlcnic_udp_tunnel_sync() local
480 err = qlcnic_set_vxlan_port(adapter, ntohs(ti.port)); in qlcnic_udp_tunnel_sync()
485 return qlcnic_set_vxlan_parsing(adapter, ntohs(ti.port)); in qlcnic_udp_tunnel_sync()
611 static int qlcnic_check_multi_tx_capability(struct qlcnic_adapter *adapter) in qlcnic_check_multi_tx_capability() argument
613 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_multi_tx_capability()
615 if (qlcnic_82xx_check(adapter) && in qlcnic_check_multi_tx_capability()
617 test_and_set_bit(__QLCNIC_MULTI_TX_UNIQUE, &adapter->state); in qlcnic_check_multi_tx_capability()
624 static int qlcnic_max_rings(struct qlcnic_adapter *adapter, u8 ring_cnt, in qlcnic_max_rings() argument
630 max_rings = adapter->max_sds_rings; in qlcnic_max_rings()
632 max_rings = adapter->max_tx_rings; in qlcnic_max_rings()
643 void qlcnic_set_tx_ring_count(struct qlcnic_adapter *adapter, u8 tx_cnt) in qlcnic_set_tx_ring_count() argument
646 if (adapter->max_tx_rings) in qlcnic_set_tx_ring_count()
647 adapter->drv_tx_rings = qlcnic_max_rings(adapter, tx_cnt, in qlcnic_set_tx_ring_count()
650 adapter->drv_tx_rings = tx_cnt; in qlcnic_set_tx_ring_count()
653 void qlcnic_set_sds_ring_count(struct qlcnic_adapter *adapter, u8 rx_cnt) in qlcnic_set_sds_ring_count() argument
656 if (adapter->max_sds_rings) in qlcnic_set_sds_ring_count()
657 adapter->drv_sds_rings = qlcnic_max_rings(adapter, rx_cnt, in qlcnic_set_sds_ring_count()
660 adapter->drv_sds_rings = rx_cnt; in qlcnic_set_sds_ring_count()
663 int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter) in qlcnic_setup_tss_rss_intr() argument
665 struct pci_dev *pdev = adapter->pdev; in qlcnic_setup_tss_rss_intr()
668 adapter->flags &= ~QLCNIC_TSS_RSS; in qlcnic_setup_tss_rss_intr()
670 if (adapter->drv_tss_rings > 0) in qlcnic_setup_tss_rss_intr()
671 num_msix += adapter->drv_tss_rings; in qlcnic_setup_tss_rss_intr()
673 num_msix += adapter->drv_tx_rings; in qlcnic_setup_tss_rss_intr()
675 if (adapter->drv_rss_rings > 0) in qlcnic_setup_tss_rss_intr()
676 num_msix += adapter->drv_rss_rings; in qlcnic_setup_tss_rss_intr()
678 num_msix += adapter->drv_sds_rings; in qlcnic_setup_tss_rss_intr()
680 if (qlcnic_83xx_check(adapter)) in qlcnic_setup_tss_rss_intr()
683 if (!adapter->msix_entries) { in qlcnic_setup_tss_rss_intr()
684 adapter->msix_entries = kcalloc(num_msix, in qlcnic_setup_tss_rss_intr()
687 if (!adapter->msix_entries) in qlcnic_setup_tss_rss_intr()
692 adapter->msix_entries[vector].entry = vector; in qlcnic_setup_tss_rss_intr()
695 err = pci_enable_msix_exact(pdev, adapter->msix_entries, num_msix); in qlcnic_setup_tss_rss_intr()
697 if (!adapter->drv_tss_rings && !adapter->drv_rss_rings) in qlcnic_setup_tss_rss_intr()
700 netdev_info(adapter->netdev, in qlcnic_setup_tss_rss_intr()
704 num_msix = adapter->drv_tx_rings + adapter->drv_sds_rings; in qlcnic_setup_tss_rss_intr()
707 adapter->drv_tss_rings = 0; in qlcnic_setup_tss_rss_intr()
708 adapter->drv_rss_rings = 0; in qlcnic_setup_tss_rss_intr()
710 if (qlcnic_83xx_check(adapter)) in qlcnic_setup_tss_rss_intr()
713 netdev_info(adapter->netdev, in qlcnic_setup_tss_rss_intr()
715 adapter->drv_tx_rings, adapter->drv_sds_rings, in qlcnic_setup_tss_rss_intr()
723 adapter->ahw->num_msix = num_msix; in qlcnic_setup_tss_rss_intr()
724 if (adapter->drv_tss_rings > 0) in qlcnic_setup_tss_rss_intr()
725 adapter->drv_tx_rings = adapter->drv_tss_rings; in qlcnic_setup_tss_rss_intr()
727 if (adapter->drv_rss_rings > 0) in qlcnic_setup_tss_rss_intr()
728 adapter->drv_sds_rings = adapter->drv_rss_rings; in qlcnic_setup_tss_rss_intr()
733 int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix) in qlcnic_enable_msix() argument
735 struct pci_dev *pdev = adapter->pdev; in qlcnic_enable_msix()
738 if (!adapter->msix_entries) { in qlcnic_enable_msix()
739 adapter->msix_entries = kcalloc(num_msix, in qlcnic_enable_msix()
742 if (!adapter->msix_entries) in qlcnic_enable_msix()
746 adapter->flags &= ~(QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED); in qlcnic_enable_msix()
748 if (adapter->ahw->msix_supported) { in qlcnic_enable_msix()
751 adapter->msix_entries[vector].entry = vector; in qlcnic_enable_msix()
754 adapter->msix_entries, 1, num_msix); in qlcnic_enable_msix()
757 adapter->flags |= QLCNIC_MSIX_ENABLED; in qlcnic_enable_msix()
758 adapter->ahw->num_msix = num_msix; in qlcnic_enable_msix()
768 if (qlcnic_82xx_check(adapter)) { in qlcnic_enable_msix()
779 if (qlcnic_82xx_check(adapter) && in qlcnic_enable_msix()
780 !qlcnic_check_multi_tx(adapter)) { in qlcnic_enable_msix()
781 adapter->drv_sds_rings = num_msix; in qlcnic_enable_msix()
782 adapter->drv_tx_rings = QLCNIC_SINGLE_RING; in qlcnic_enable_msix()
785 adapter->drv_tx_rings = num_msix / 2; in qlcnic_enable_msix()
786 adapter->drv_sds_rings = adapter->drv_tx_rings; in qlcnic_enable_msix()
806 static int qlcnic_82xx_calculate_msix_vector(struct qlcnic_adapter *adapter) in qlcnic_82xx_calculate_msix_vector() argument
810 num_msix = adapter->drv_sds_rings; in qlcnic_82xx_calculate_msix_vector()
812 if (qlcnic_check_multi_tx(adapter)) in qlcnic_82xx_calculate_msix_vector()
813 num_msix += adapter->drv_tx_rings; in qlcnic_82xx_calculate_msix_vector()
820 static int qlcnic_enable_msi_legacy(struct qlcnic_adapter *adapter) in qlcnic_enable_msi_legacy() argument
825 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_enable_msi_legacy()
826 struct pci_dev *pdev = adapter->pdev; in qlcnic_enable_msi_legacy()
829 adapter->flags |= QLCNIC_MSI_ENABLED; in qlcnic_enable_msi_legacy()
830 offset = msi_tgt_status[adapter->ahw->pci_func]; in qlcnic_enable_msi_legacy()
831 adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter->ahw, in qlcnic_enable_msi_legacy()
834 adapter->msix_entries[0].vector = pdev->irq; in qlcnic_enable_msi_legacy()
841 legacy_intrp = &legacy_intr[adapter->ahw->pci_func]; in qlcnic_enable_msi_legacy()
842 adapter->ahw->int_vec_bit = legacy_intrp->int_vec_bit; in qlcnic_enable_msi_legacy()
844 adapter->tgt_status_reg = qlcnic_get_ioaddr(ahw, offset); in qlcnic_enable_msi_legacy()
846 adapter->tgt_mask_reg = qlcnic_get_ioaddr(ahw, mask_reg); in qlcnic_enable_msi_legacy()
847 adapter->isr_int_vec = qlcnic_get_ioaddr(ahw, ISR_INT_VECTOR); in qlcnic_enable_msi_legacy()
848 adapter->crb_int_state_reg = qlcnic_get_ioaddr(ahw, ISR_INT_STATE_REG); in qlcnic_enable_msi_legacy()
850 adapter->msix_entries[0].vector = pdev->irq; in qlcnic_enable_msi_legacy()
854 static int qlcnic_82xx_setup_intr(struct qlcnic_adapter *adapter) in qlcnic_82xx_setup_intr() argument
858 if (adapter->flags & QLCNIC_TSS_RSS) { in qlcnic_82xx_setup_intr()
859 err = qlcnic_setup_tss_rss_intr(adapter); in qlcnic_82xx_setup_intr()
862 num_msix = adapter->ahw->num_msix; in qlcnic_82xx_setup_intr()
864 num_msix = qlcnic_82xx_calculate_msix_vector(adapter); in qlcnic_82xx_setup_intr()
866 err = qlcnic_enable_msix(adapter, num_msix); in qlcnic_82xx_setup_intr()
870 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { in qlcnic_82xx_setup_intr()
871 qlcnic_disable_multi_tx(adapter); in qlcnic_82xx_setup_intr()
872 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; in qlcnic_82xx_setup_intr()
874 err = qlcnic_enable_msi_legacy(adapter); in qlcnic_82xx_setup_intr()
883 int qlcnic_82xx_mq_intrpt(struct qlcnic_adapter *adapter, int op_type) in qlcnic_82xx_mq_intrpt() argument
885 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_82xx_mq_intrpt()
888 if (qlcnic_check_multi_tx(adapter) && in qlcnic_82xx_mq_intrpt()
890 (adapter->flags & QLCNIC_MSIX_ENABLED)) { in qlcnic_82xx_mq_intrpt()
903 err = qlcnic_82xx_config_intrpt(adapter, 1); in qlcnic_82xx_mq_intrpt()
905 dev_err(&adapter->pdev->dev, in qlcnic_82xx_mq_intrpt()
914 void qlcnic_teardown_intr(struct qlcnic_adapter *adapter) in qlcnic_teardown_intr() argument
916 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_teardown_intr()
917 pci_disable_msix(adapter->pdev); in qlcnic_teardown_intr()
918 if (adapter->flags & QLCNIC_MSI_ENABLED) in qlcnic_teardown_intr()
919 pci_disable_msi(adapter->pdev); in qlcnic_teardown_intr()
921 kfree(adapter->msix_entries); in qlcnic_teardown_intr()
922 adapter->msix_entries = NULL; in qlcnic_teardown_intr()
924 if (adapter->ahw->intr_tbl) { in qlcnic_teardown_intr()
925 vfree(adapter->ahw->intr_tbl); in qlcnic_teardown_intr()
926 adapter->ahw->intr_tbl = NULL; in qlcnic_teardown_intr()
936 static int qlcnic_get_act_pci_func(struct qlcnic_adapter *adapter) in qlcnic_get_act_pci_func() argument
938 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_get_act_pci_func()
942 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) { in qlcnic_get_act_pci_func()
961 ret = qlcnic_get_pci_info(adapter, pci_info); in qlcnic_get_act_pci_func()
966 static bool qlcnic_port_eswitch_cfg_capability(struct qlcnic_adapter *adapter) in qlcnic_port_eswitch_cfg_capability() argument
970 if (qlcnic_84xx_check(adapter)) { in qlcnic_port_eswitch_cfg_capability()
972 } else if (qlcnic_83xx_check(adapter)) { in qlcnic_port_eswitch_cfg_capability()
973 if (adapter->ahw->extra_capability[0] & in qlcnic_port_eswitch_cfg_capability()
983 int qlcnic_init_pci_info(struct qlcnic_adapter *adapter) in qlcnic_init_pci_info() argument
985 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_init_pci_info()
995 ret = qlcnic_get_pci_info(adapter, pci_info); in qlcnic_init_pci_info()
1001 adapter->npars = kcalloc(act_pci_func, in qlcnic_init_pci_info()
1004 if (!adapter->npars) { in qlcnic_init_pci_info()
1009 adapter->eswitch = kcalloc(QLCNIC_NIU_MAX_XG_PORTS, in qlcnic_init_pci_info()
1012 if (!adapter->eswitch) { in qlcnic_init_pci_info()
1022 dev_err(&adapter->pdev->dev, "%s: Invalid function 0x%x, max 0x%x\n", in qlcnic_init_pci_info()
1031 if (qlcnic_port_eswitch_cfg_capability(adapter)) { in qlcnic_init_pci_info()
1032 if (!qlcnic_83xx_set_port_eswitch_status(adapter, pfn, in qlcnic_init_pci_info()
1034 adapter->npars[j].eswitch_status = true; in qlcnic_init_pci_info()
1038 adapter->npars[j].eswitch_status = true; in qlcnic_init_pci_info()
1041 adapter->npars[j].pci_func = pfn; in qlcnic_init_pci_info()
1042 adapter->npars[j].active = (u8)pci_info[i].active; in qlcnic_init_pci_info()
1043 adapter->npars[j].type = (u8)pci_info[i].type; in qlcnic_init_pci_info()
1044 adapter->npars[j].phy_port = (u8)pci_info[i].default_port; in qlcnic_init_pci_info()
1045 adapter->npars[j].min_bw = pci_info[i].tx_min_bw; in qlcnic_init_pci_info()
1046 adapter->npars[j].max_bw = pci_info[i].tx_max_bw; in qlcnic_init_pci_info()
1048 memcpy(&adapter->npars[j].mac, &pci_info[i].mac, ETH_ALEN); in qlcnic_init_pci_info()
1055 if (!qlcnic_port_eswitch_cfg_capability(adapter)) { in qlcnic_init_pci_info()
1057 adapter->eswitch[i].flags |= QLCNIC_SWITCH_ENABLE; in qlcnic_init_pci_info()
1064 kfree(adapter->eswitch); in qlcnic_init_pci_info()
1065 adapter->eswitch = NULL; in qlcnic_init_pci_info()
1067 kfree(adapter->npars); in qlcnic_init_pci_info()
1068 adapter->npars = NULL; in qlcnic_init_pci_info()
1076 qlcnic_set_function_modes(struct qlcnic_adapter *adapter) in qlcnic_set_function_modes() argument
1081 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_set_function_modes()
1083 ret = qlcnic_api_lock(adapter); in qlcnic_set_function_modes()
1088 data = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE); in qlcnic_set_function_modes()
1091 QLC_SHARED_REG_WR32(adapter, QLCNIC_DRV_OP_MODE, data); in qlcnic_set_function_modes()
1092 qlcnic_api_unlock(adapter); in qlcnic_set_function_modes()
1097 static void qlcnic_check_vf(struct qlcnic_adapter *adapter, in qlcnic_check_vf() argument
1103 adapter->ahw->fw_hal_version = QLC_SHARED_REG_RD32(adapter, in qlcnic_check_vf()
1107 qlcnic_get_func_no(adapter); in qlcnic_check_vf()
1110 op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE); in qlcnic_check_vf()
1114 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); in qlcnic_check_vf()
1117 adapter->ahw->op_mode = QLCNIC_NON_PRIV_FUNC; in qlcnic_check_vf()
1118 dev_info(&adapter->pdev->dev, in qlcnic_check_vf()
1120 adapter->ahw->fw_hal_version); in qlcnic_check_vf()
1121 adapter->nic_ops = &qlcnic_vf_ops; in qlcnic_check_vf()
1123 adapter->nic_ops = &qlcnic_ops; in qlcnic_check_vf()
1180 static bool qlcnic_validate_subsystem_id(struct qlcnic_adapter *adapter, in qlcnic_validate_subsystem_id() argument
1183 struct pci_dev *pdev = adapter->pdev; in qlcnic_validate_subsystem_id()
1201 static void qlcnic_get_board_name(struct qlcnic_adapter *adapter, char *name) in qlcnic_get_board_name() argument
1203 struct pci_dev *pdev = adapter->pdev; in qlcnic_get_board_name()
1209 qlcnic_validate_subsystem_id(adapter, i)) { in qlcnic_get_board_name()
1216 sprintf(name, "%pM Gigabit Ethernet", adapter->mac_addr); in qlcnic_get_board_name()
1218 sprintf(name, "%pM: %s" , adapter->mac_addr, in qlcnic_get_board_name()
1223 qlcnic_check_options(struct qlcnic_adapter *adapter) in qlcnic_check_options() argument
1227 struct pci_dev *pdev = adapter->pdev; in qlcnic_check_options()
1228 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_options()
1231 prev_fw_version = adapter->fw_version; in qlcnic_check_options()
1233 fw_major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR); in qlcnic_check_options()
1234 fw_minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR); in qlcnic_check_options()
1235 fw_build = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB); in qlcnic_check_options()
1237 adapter->fw_version = QLCNIC_VERSION_CODE(fw_major, fw_minor, fw_build); in qlcnic_check_options()
1239 err = qlcnic_get_board_info(adapter); in qlcnic_check_options()
1246 adapter->fw_version > prev_fw_version) { in qlcnic_check_options()
1248 if (!qlcnic_fw_cmd_get_minidump_temp(adapter)) in qlcnic_check_options()
1257 if (adapter->ahw->port_type == QLCNIC_XGBE) { in qlcnic_check_options()
1258 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { in qlcnic_check_options()
1259 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF; in qlcnic_check_options()
1260 adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF; in qlcnic_check_options()
1262 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1263 adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1266 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1267 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1269 } else if (adapter->ahw->port_type == QLCNIC_GBE) { in qlcnic_check_options()
1270 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1271 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1272 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1273 adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1276 adapter->ahw->msix_supported = !!qlcnic_use_msi_x; in qlcnic_check_options()
1278 adapter->num_txd = MAX_CMD_DESCRIPTORS; in qlcnic_check_options()
1280 adapter->max_rds_rings = MAX_RDS_RINGS; in qlcnic_check_options()
1284 qlcnic_initialize_nic(struct qlcnic_adapter *adapter) in qlcnic_initialize_nic() argument
1290 err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); in qlcnic_initialize_nic()
1294 adapter->ahw->physical_port = (u8)nic_info.phys_port; in qlcnic_initialize_nic()
1295 adapter->ahw->switch_mode = nic_info.switch_mode; in qlcnic_initialize_nic()
1296 adapter->ahw->max_tx_ques = nic_info.max_tx_ques; in qlcnic_initialize_nic()
1297 adapter->ahw->max_rx_ques = nic_info.max_rx_ques; in qlcnic_initialize_nic()
1298 adapter->ahw->capabilities = nic_info.capabilities; in qlcnic_initialize_nic()
1300 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { in qlcnic_initialize_nic()
1302 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err); in qlcnic_initialize_nic()
1305 adapter->ahw->extra_capability[0] = temp; in qlcnic_initialize_nic()
1307 adapter->ahw->extra_capability[0] = 0; in qlcnic_initialize_nic()
1310 adapter->ahw->max_mac_filters = nic_info.max_mac_filters; in qlcnic_initialize_nic()
1311 adapter->ahw->max_mtu = nic_info.max_mtu; in qlcnic_initialize_nic()
1313 if (adapter->ahw->capabilities & BIT_6) { in qlcnic_initialize_nic()
1314 adapter->flags |= QLCNIC_ESWITCH_ENABLED; in qlcnic_initialize_nic()
1315 adapter->ahw->nic_mode = QLCNIC_VNIC_MODE; in qlcnic_initialize_nic()
1316 adapter->max_tx_rings = QLCNIC_MAX_HW_VNIC_TX_RINGS; in qlcnic_initialize_nic()
1317 adapter->max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS; in qlcnic_initialize_nic()
1319 dev_info(&adapter->pdev->dev, "vNIC mode enabled.\n"); in qlcnic_initialize_nic()
1321 adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; in qlcnic_initialize_nic()
1322 adapter->max_tx_rings = QLCNIC_MAX_HW_TX_RINGS; in qlcnic_initialize_nic()
1323 adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; in qlcnic_initialize_nic()
1324 adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; in qlcnic_initialize_nic()
1330 void qlcnic_set_vlan_config(struct qlcnic_adapter *adapter, in qlcnic_set_vlan_config() argument
1334 adapter->flags &= ~QLCNIC_TAGGING_ENABLED; in qlcnic_set_vlan_config()
1336 adapter->flags |= QLCNIC_TAGGING_ENABLED; in qlcnic_set_vlan_config()
1339 adapter->rx_pvid = esw_cfg->vlan_id; in qlcnic_set_vlan_config()
1340 adapter->tx_pvid = esw_cfg->vlan_id; in qlcnic_set_vlan_config()
1342 adapter->rx_pvid = 0; in qlcnic_set_vlan_config()
1343 adapter->tx_pvid = 0; in qlcnic_set_vlan_config()
1350 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_vlan_rx_add() local
1353 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_vlan_rx_add()
1354 err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 1); in qlcnic_vlan_rx_add()
1363 set_bit(vid, adapter->vlans); in qlcnic_vlan_rx_add()
1370 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_vlan_rx_del() local
1373 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_vlan_rx_del()
1374 err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 0); in qlcnic_vlan_rx_del()
1384 clear_bit(vid, adapter->vlans); in qlcnic_vlan_rx_del()
1388 void qlcnic_set_eswitch_port_features(struct qlcnic_adapter *adapter, in qlcnic_set_eswitch_port_features() argument
1391 adapter->flags &= ~(QLCNIC_MACSPOOF | QLCNIC_MAC_OVERRIDE_DISABLED | in qlcnic_set_eswitch_port_features()
1395 adapter->flags |= QLCNIC_MACSPOOF; in qlcnic_set_eswitch_port_features()
1398 adapter->flags |= QLCNIC_MAC_OVERRIDE_DISABLED; in qlcnic_set_eswitch_port_features()
1401 adapter->flags |= QLCNIC_PROMISC_DISABLED; in qlcnic_set_eswitch_port_features()
1404 int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *adapter) in qlcnic_set_eswitch_port_config() argument
1408 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) in qlcnic_set_eswitch_port_config()
1411 esw_cfg.pci_func = adapter->ahw->pci_func; in qlcnic_set_eswitch_port_config()
1412 if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg)) in qlcnic_set_eswitch_port_config()
1414 qlcnic_set_vlan_config(adapter, &esw_cfg); in qlcnic_set_eswitch_port_config()
1415 qlcnic_set_eswitch_port_features(adapter, &esw_cfg); in qlcnic_set_eswitch_port_config()
1416 qlcnic_set_netdev_features(adapter, &esw_cfg); in qlcnic_set_eswitch_port_config()
1421 void qlcnic_set_netdev_features(struct qlcnic_adapter *adapter, in qlcnic_set_netdev_features() argument
1424 struct net_device *netdev = adapter->netdev; in qlcnic_set_netdev_features()
1426 if (qlcnic_83xx_check(adapter)) in qlcnic_set_netdev_features()
1429 adapter->offload_flags = esw_cfg->offload_flags; in qlcnic_set_netdev_features()
1430 adapter->flags |= QLCNIC_APP_CHANGED_FLAGS; in qlcnic_set_netdev_features()
1432 adapter->flags &= ~QLCNIC_APP_CHANGED_FLAGS; in qlcnic_set_netdev_features()
1436 qlcnic_check_eswitch_mode(struct qlcnic_adapter *adapter) in qlcnic_check_eswitch_mode() argument
1441 err = qlcnic_initialize_nic(adapter); in qlcnic_check_eswitch_mode()
1445 if (adapter->flags & QLCNIC_ADAPTER_INITIALIZED) in qlcnic_check_eswitch_mode()
1448 op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE); in qlcnic_check_eswitch_mode()
1449 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); in qlcnic_check_eswitch_mode()
1454 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); in qlcnic_check_eswitch_mode()
1456 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { in qlcnic_check_eswitch_mode()
1458 adapter->ahw->op_mode = QLCNIC_MGMT_FUNC; in qlcnic_check_eswitch_mode()
1459 err = qlcnic_init_pci_info(adapter); in qlcnic_check_eswitch_mode()
1463 qlcnic_set_function_modes(adapter); in qlcnic_check_eswitch_mode()
1464 dev_info(&adapter->pdev->dev, in qlcnic_check_eswitch_mode()
1466 adapter->ahw->fw_hal_version); in qlcnic_check_eswitch_mode()
1468 adapter->ahw->op_mode = QLCNIC_PRIV_FUNC; in qlcnic_check_eswitch_mode()
1469 dev_info(&adapter->pdev->dev, in qlcnic_check_eswitch_mode()
1471 adapter->ahw->fw_hal_version); in qlcnic_check_eswitch_mode()
1474 adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; in qlcnic_check_eswitch_mode()
1477 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; in qlcnic_check_eswitch_mode()
1482 int qlcnic_set_default_offload_settings(struct qlcnic_adapter *adapter) in qlcnic_set_default_offload_settings() argument
1488 if (adapter->need_fw_reset) in qlcnic_set_default_offload_settings()
1491 for (i = 0; i < adapter->ahw->total_nic_func; i++) { in qlcnic_set_default_offload_settings()
1492 if (!adapter->npars[i].eswitch_status) in qlcnic_set_default_offload_settings()
1496 esw_cfg.pci_func = adapter->npars[i].pci_func; in qlcnic_set_default_offload_settings()
1499 if (qlcnic_82xx_check(adapter)) { in qlcnic_set_default_offload_settings()
1501 if (QLCNIC_IS_TSO_CAPABLE(adapter)) in qlcnic_set_default_offload_settings()
1504 if (qlcnic_config_switch_port(adapter, &esw_cfg)) in qlcnic_set_default_offload_settings()
1506 npar = &adapter->npars[i]; in qlcnic_set_default_offload_settings()
1520 qlcnic_reset_eswitch_config(struct qlcnic_adapter *adapter, in qlcnic_reset_eswitch_config() argument
1532 if (qlcnic_config_switch_port(adapter, &esw_cfg)) in qlcnic_reset_eswitch_config()
1536 if (qlcnic_config_switch_port(adapter, &esw_cfg)) in qlcnic_reset_eswitch_config()
1542 int qlcnic_reset_npar_config(struct qlcnic_adapter *adapter) in qlcnic_reset_npar_config() argument
1549 if (qlcnic_82xx_check(adapter)) in qlcnic_reset_npar_config()
1550 if (!adapter->need_fw_reset) in qlcnic_reset_npar_config()
1554 for (i = 0; i < adapter->ahw->total_nic_func; i++) { in qlcnic_reset_npar_config()
1555 npar = &adapter->npars[i]; in qlcnic_reset_npar_config()
1557 if (!adapter->npars[i].eswitch_status) in qlcnic_reset_npar_config()
1561 err = qlcnic_get_nic_info(adapter, &nic_info, pci_func); in qlcnic_reset_npar_config()
1566 err = qlcnic_set_nic_info(adapter, &nic_info); in qlcnic_reset_npar_config()
1571 err = qlcnic_config_port_mirroring(adapter, in qlcnic_reset_npar_config()
1577 err = qlcnic_reset_eswitch_config(adapter, npar, pci_func); in qlcnic_reset_npar_config()
1584 static int qlcnic_check_npar_opertional(struct qlcnic_adapter *adapter) in qlcnic_check_npar_opertional() argument
1589 if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC) in qlcnic_check_npar_opertional()
1592 npar_state = QLC_SHARED_REG_RD32(adapter, in qlcnic_check_npar_opertional()
1596 npar_state = QLC_SHARED_REG_RD32(adapter, in qlcnic_check_npar_opertional()
1600 dev_err(&adapter->pdev->dev, in qlcnic_check_npar_opertional()
1608 qlcnic_set_mgmt_operations(struct qlcnic_adapter *adapter) in qlcnic_set_mgmt_operations() argument
1612 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) || in qlcnic_set_mgmt_operations()
1613 adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) in qlcnic_set_mgmt_operations()
1616 err = qlcnic_set_default_offload_settings(adapter); in qlcnic_set_mgmt_operations()
1620 err = qlcnic_reset_npar_config(adapter); in qlcnic_set_mgmt_operations()
1624 qlcnic_dev_set_npar_ready(adapter); in qlcnic_set_mgmt_operations()
1629 static int qlcnic_82xx_start_firmware(struct qlcnic_adapter *adapter) in qlcnic_82xx_start_firmware() argument
1633 err = qlcnic_can_start_firmware(adapter); in qlcnic_82xx_start_firmware()
1640 qlcnic_request_firmware(adapter); in qlcnic_82xx_start_firmware()
1642 err = qlcnic_check_flash_fw_ver(adapter); in qlcnic_82xx_start_firmware()
1646 adapter->ahw->fw_type = QLCNIC_FLASH_ROMIMAGE; in qlcnic_82xx_start_firmware()
1649 err = qlcnic_need_fw_reset(adapter); in qlcnic_82xx_start_firmware()
1653 err = qlcnic_pinit_from_rom(adapter); in qlcnic_82xx_start_firmware()
1657 err = qlcnic_load_firmware(adapter); in qlcnic_82xx_start_firmware()
1661 qlcnic_release_firmware(adapter); in qlcnic_82xx_start_firmware()
1662 QLCWR32(adapter, CRB_DRIVER_VERSION, QLCNIC_DRIVER_VERSION); in qlcnic_82xx_start_firmware()
1665 err = qlcnic_check_fw_status(adapter); in qlcnic_82xx_start_firmware()
1669 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY); in qlcnic_82xx_start_firmware()
1670 qlcnic_idc_debug_info(adapter, 1); in qlcnic_82xx_start_firmware()
1671 err = qlcnic_check_eswitch_mode(adapter); in qlcnic_82xx_start_firmware()
1673 dev_err(&adapter->pdev->dev, in qlcnic_82xx_start_firmware()
1677 err = qlcnic_set_mgmt_operations(adapter); in qlcnic_82xx_start_firmware()
1681 qlcnic_check_options(adapter); in qlcnic_82xx_start_firmware()
1682 adapter->need_fw_reset = 0; in qlcnic_82xx_start_firmware()
1684 qlcnic_release_firmware(adapter); in qlcnic_82xx_start_firmware()
1688 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_FAILED); in qlcnic_82xx_start_firmware()
1689 dev_err(&adapter->pdev->dev, "Device state set to failed\n"); in qlcnic_82xx_start_firmware()
1691 qlcnic_release_firmware(adapter); in qlcnic_82xx_start_firmware()
1696 qlcnic_request_irq(struct qlcnic_adapter *adapter) in qlcnic_request_irq() argument
1704 struct net_device *netdev = adapter->netdev; in qlcnic_request_irq()
1705 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_request_irq()
1707 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_request_irq()
1708 if (qlcnic_82xx_check(adapter)) in qlcnic_request_irq()
1712 if (!QLCNIC_IS_MSI_FAMILY(adapter)) in qlcnic_request_irq()
1716 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_request_irq()
1718 else if (adapter->flags & QLCNIC_MSI_ENABLED) in qlcnic_request_irq()
1722 if (qlcnic_82xx_check(adapter)) in qlcnic_request_irq()
1728 adapter->irq = netdev->irq; in qlcnic_request_irq()
1730 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) { in qlcnic_request_irq()
1731 if (qlcnic_82xx_check(adapter) || in qlcnic_request_irq()
1732 (qlcnic_83xx_check(adapter) && in qlcnic_request_irq()
1733 (adapter->flags & QLCNIC_MSIX_ENABLED))) { in qlcnic_request_irq()
1734 num_sds_rings = adapter->drv_sds_rings; in qlcnic_request_irq()
1737 if (qlcnic_82xx_check(adapter) && in qlcnic_request_irq()
1738 !qlcnic_check_multi_tx(adapter) && in qlcnic_request_irq()
1740 if (!(adapter->flags & in qlcnic_request_irq()
1762 if ((qlcnic_82xx_check(adapter) && in qlcnic_request_irq()
1763 qlcnic_check_multi_tx(adapter)) || in qlcnic_request_irq()
1764 (qlcnic_83xx_check(adapter) && in qlcnic_request_irq()
1765 (adapter->flags & QLCNIC_MSIX_ENABLED) && in qlcnic_request_irq()
1766 !(adapter->flags & QLCNIC_TX_INTR_SHARED))) { in qlcnic_request_irq()
1768 for (ring = 0; ring < adapter->drv_tx_rings; in qlcnic_request_irq()
1770 tx_ring = &adapter->tx_ring[ring]; in qlcnic_request_irq()
1784 qlcnic_free_irq(struct qlcnic_adapter *adapter) in qlcnic_free_irq() argument
1790 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_free_irq()
1792 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) { in qlcnic_free_irq()
1793 if (qlcnic_82xx_check(adapter) || in qlcnic_free_irq()
1794 (qlcnic_83xx_check(adapter) && in qlcnic_free_irq()
1795 (adapter->flags & QLCNIC_MSIX_ENABLED))) { in qlcnic_free_irq()
1796 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_free_irq()
1801 if ((qlcnic_83xx_check(adapter) && in qlcnic_free_irq()
1802 !(adapter->flags & QLCNIC_TX_INTR_SHARED)) || in qlcnic_free_irq()
1803 (qlcnic_82xx_check(adapter) && in qlcnic_free_irq()
1804 qlcnic_check_multi_tx(adapter))) { in qlcnic_free_irq()
1805 for (ring = 0; ring < adapter->drv_tx_rings; in qlcnic_free_irq()
1807 tx_ring = &adapter->tx_ring[ring]; in qlcnic_free_irq()
1815 static void qlcnic_get_lro_mss_capability(struct qlcnic_adapter *adapter) in qlcnic_get_lro_mss_capability() argument
1819 if (qlcnic_82xx_check(adapter)) { in qlcnic_get_lro_mss_capability()
1820 if (adapter->ahw->extra_capability[0] & in qlcnic_get_lro_mss_capability()
1822 adapter->flags |= QLCNIC_FW_LRO_MSS_CAP; in qlcnic_get_lro_mss_capability()
1824 capab = adapter->ahw->capabilities; in qlcnic_get_lro_mss_capability()
1826 adapter->flags |= QLCNIC_FW_LRO_MSS_CAP; in qlcnic_get_lro_mss_capability()
1830 static int qlcnic_config_def_intr_coalesce(struct qlcnic_adapter *adapter) in qlcnic_config_def_intr_coalesce() argument
1832 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_config_def_intr_coalesce()
1838 if (qlcnic_83xx_check(adapter)) { in qlcnic_config_def_intr_coalesce()
1845 err = qlcnic_83xx_set_rx_tx_intr_coal(adapter); in qlcnic_config_def_intr_coalesce()
1851 err = qlcnic_82xx_set_rx_coalesce(adapter); in qlcnic_config_def_intr_coalesce()
1857 int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) in __qlcnic_up() argument
1862 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) in __qlcnic_up()
1865 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) in __qlcnic_up()
1868 if (qlcnic_set_eswitch_port_config(adapter)) in __qlcnic_up()
1871 qlcnic_get_lro_mss_capability(adapter); in __qlcnic_up()
1873 if (qlcnic_fw_create_ctx(adapter)) in __qlcnic_up()
1876 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in __qlcnic_up()
1877 rds_ring = &adapter->recv_ctx->rds_rings[ring]; in __qlcnic_up()
1878 qlcnic_post_rx_buffers(adapter, rds_ring, ring); in __qlcnic_up()
1882 qlcnic_fw_cmd_set_mtu(adapter, netdev->mtu); in __qlcnic_up()
1884 adapter->ahw->linkup = 0; in __qlcnic_up()
1886 if (adapter->drv_sds_rings > 1) in __qlcnic_up()
1887 qlcnic_config_rss(adapter, 1); in __qlcnic_up()
1889 qlcnic_config_def_intr_coalesce(adapter); in __qlcnic_up()
1892 qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED); in __qlcnic_up()
1894 set_bit(__QLCNIC_DEV_UP, &adapter->state); in __qlcnic_up()
1895 qlcnic_napi_enable(adapter); in __qlcnic_up()
1897 qlcnic_linkevent_request(adapter, 1); in __qlcnic_up()
1899 adapter->ahw->reset_context = 0; in __qlcnic_up()
1904 int qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) in qlcnic_up() argument
1910 err = __qlcnic_up(adapter, netdev); in qlcnic_up()
1916 void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) in __qlcnic_down() argument
1920 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) in __qlcnic_down()
1923 if (!test_and_clear_bit(__QLCNIC_DEV_UP, &adapter->state)) in __qlcnic_down()
1928 adapter->ahw->linkup = 0; in __qlcnic_down()
1931 qlcnic_free_mac_list(adapter); in __qlcnic_down()
1933 if (adapter->fhash.fnum) in __qlcnic_down()
1934 qlcnic_delete_lb_filters(adapter); in __qlcnic_down()
1936 qlcnic_nic_set_promisc(adapter, QLCNIC_NIU_NON_PROMISC_MODE); in __qlcnic_down()
1937 if (qlcnic_sriov_vf_check(adapter)) in __qlcnic_down()
1938 qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc); in __qlcnic_down()
1940 qlcnic_napi_disable(adapter); in __qlcnic_down()
1942 qlcnic_fw_destroy_ctx(adapter); in __qlcnic_down()
1943 adapter->flags &= ~QLCNIC_FW_LRO_MSS_CAP; in __qlcnic_down()
1945 qlcnic_reset_rx_buffers_list(adapter); in __qlcnic_down()
1947 for (ring = 0; ring < adapter->drv_tx_rings; ring++) in __qlcnic_down()
1948 qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]); in __qlcnic_down()
1953 void qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) in qlcnic_down() argument
1957 __qlcnic_down(adapter, netdev); in qlcnic_down()
1963 qlcnic_attach(struct qlcnic_adapter *adapter) in qlcnic_attach() argument
1965 struct net_device *netdev = adapter->netdev; in qlcnic_attach()
1966 struct pci_dev *pdev = adapter->pdev; in qlcnic_attach()
1969 if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) in qlcnic_attach()
1972 err = qlcnic_napi_add(adapter, netdev); in qlcnic_attach()
1976 err = qlcnic_alloc_sw_resources(adapter); in qlcnic_attach()
1982 err = qlcnic_alloc_hw_resources(adapter); in qlcnic_attach()
1988 err = qlcnic_request_irq(adapter); in qlcnic_attach()
1994 qlcnic_create_sysfs_entries(adapter); in qlcnic_attach()
1996 if (qlcnic_encap_rx_offload(adapter)) in qlcnic_attach()
1999 adapter->is_up = QLCNIC_ADAPTER_UP_MAGIC; in qlcnic_attach()
2003 qlcnic_free_hw_resources(adapter); in qlcnic_attach()
2005 qlcnic_free_sw_resources(adapter); in qlcnic_attach()
2007 qlcnic_napi_del(adapter); in qlcnic_attach()
2011 void qlcnic_detach(struct qlcnic_adapter *adapter) in qlcnic_detach() argument
2013 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) in qlcnic_detach()
2016 qlcnic_remove_sysfs_entries(adapter); in qlcnic_detach()
2018 qlcnic_free_hw_resources(adapter); in qlcnic_detach()
2019 qlcnic_release_rx_buffers(adapter); in qlcnic_detach()
2020 qlcnic_free_irq(adapter); in qlcnic_detach()
2021 qlcnic_napi_del(adapter); in qlcnic_detach()
2022 qlcnic_free_sw_resources(adapter); in qlcnic_detach()
2024 adapter->is_up = 0; in qlcnic_detach()
2029 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_diag_free_res() local
2031 int drv_tx_rings = adapter->drv_tx_rings; in qlcnic_diag_free_res()
2034 clear_bit(__QLCNIC_DEV_UP, &adapter->state); in qlcnic_diag_free_res()
2035 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_diag_free_res()
2036 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_diag_free_res()
2037 sds_ring = &adapter->recv_ctx->sds_rings[ring]; in qlcnic_diag_free_res()
2038 qlcnic_disable_sds_intr(adapter, sds_ring); in qlcnic_diag_free_res()
2042 qlcnic_fw_destroy_ctx(adapter); in qlcnic_diag_free_res()
2044 qlcnic_detach(adapter); in qlcnic_diag_free_res()
2046 adapter->ahw->diag_test = 0; in qlcnic_diag_free_res()
2047 adapter->drv_sds_rings = drv_sds_rings; in qlcnic_diag_free_res()
2048 adapter->drv_tx_rings = drv_tx_rings; in qlcnic_diag_free_res()
2050 if (qlcnic_attach(adapter)) in qlcnic_diag_free_res()
2054 __qlcnic_up(adapter, netdev); in qlcnic_diag_free_res()
2059 static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) in qlcnic_alloc_adapter_resources() argument
2061 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_alloc_adapter_resources()
2064 adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context), in qlcnic_alloc_adapter_resources()
2066 if (!adapter->recv_ctx) { in qlcnic_alloc_adapter_resources()
2071 if (qlcnic_83xx_check(adapter)) { in qlcnic_alloc_adapter_resources()
2084 memset(&adapter->stats, 0, sizeof(adapter->stats)); in qlcnic_alloc_adapter_resources()
2089 static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter) in qlcnic_free_adapter_resources() argument
2091 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; in qlcnic_free_adapter_resources()
2093 kfree(adapter->recv_ctx); in qlcnic_free_adapter_resources()
2094 adapter->recv_ctx = NULL; in qlcnic_free_adapter_resources()
2102 dma_free_coherent(&adapter->pdev->dev, QLC_PEX_DMA_READ_SIZE, in qlcnic_free_adapter_resources()
2107 kfree(adapter->ahw->reset.buff); in qlcnic_free_adapter_resources()
2108 adapter->ahw->fw_dump.tmpl_hdr = NULL; in qlcnic_free_adapter_resources()
2113 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_diag_alloc_res() local
2122 __qlcnic_down(adapter, netdev); in qlcnic_diag_alloc_res()
2124 qlcnic_detach(adapter); in qlcnic_diag_alloc_res()
2126 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; in qlcnic_diag_alloc_res()
2127 adapter->ahw->diag_test = test; in qlcnic_diag_alloc_res()
2128 adapter->ahw->linkup = 0; in qlcnic_diag_alloc_res()
2130 ret = qlcnic_attach(adapter); in qlcnic_diag_alloc_res()
2136 ret = qlcnic_fw_create_ctx(adapter); in qlcnic_diag_alloc_res()
2138 qlcnic_detach(adapter); in qlcnic_diag_alloc_res()
2143 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in qlcnic_diag_alloc_res()
2144 rds_ring = &adapter->recv_ctx->rds_rings[ring]; in qlcnic_diag_alloc_res()
2145 qlcnic_post_rx_buffers(adapter, rds_ring, ring); in qlcnic_diag_alloc_res()
2148 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_diag_alloc_res()
2149 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_diag_alloc_res()
2150 sds_ring = &adapter->recv_ctx->sds_rings[ring]; in qlcnic_diag_alloc_res()
2151 qlcnic_enable_sds_intr(adapter, sds_ring); in qlcnic_diag_alloc_res()
2155 if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { in qlcnic_diag_alloc_res()
2156 adapter->ahw->loopback_state = 0; in qlcnic_diag_alloc_res()
2157 qlcnic_linkevent_request(adapter, 1); in qlcnic_diag_alloc_res()
2160 set_bit(__QLCNIC_DEV_UP, &adapter->state); in qlcnic_diag_alloc_res()
2167 qlcnic_reset_hw_context(struct qlcnic_adapter *adapter) in qlcnic_reset_hw_context() argument
2169 struct net_device *netdev = adapter->netdev; in qlcnic_reset_hw_context()
2171 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_reset_hw_context()
2176 qlcnic_down(adapter, netdev); in qlcnic_reset_hw_context()
2178 qlcnic_up(adapter, netdev); in qlcnic_reset_hw_context()
2182 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_reset_hw_context()
2183 netdev_info(adapter->netdev, "%s: soft reset complete\n", __func__); in qlcnic_reset_hw_context()
2188 qlcnic_reset_context(struct qlcnic_adapter *adapter) in qlcnic_reset_context() argument
2191 struct net_device *netdev = adapter->netdev; in qlcnic_reset_context()
2193 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_reset_context()
2196 if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) { in qlcnic_reset_context()
2201 __qlcnic_down(adapter, netdev); in qlcnic_reset_context()
2203 qlcnic_detach(adapter); in qlcnic_reset_context()
2206 err = qlcnic_attach(adapter); in qlcnic_reset_context()
2208 __qlcnic_up(adapter, netdev); in qlcnic_reset_context()
2216 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_reset_context()
2220 static void qlcnic_82xx_set_mac_filter_count(struct qlcnic_adapter *adapter) in qlcnic_82xx_set_mac_filter_count() argument
2222 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_82xx_set_mac_filter_count()
2236 static int qlcnic_set_real_num_queues(struct qlcnic_adapter *adapter, in qlcnic_set_real_num_queues() argument
2239 struct net_device *netdev = adapter->netdev; in qlcnic_set_real_num_queues()
2262 qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev) in qlcnic_setup_netdev() argument
2265 struct pci_dev *pdev = adapter->pdev; in qlcnic_setup_netdev()
2267 adapter->rx_csum = 1; in qlcnic_setup_netdev()
2268 adapter->ahw->mc_enabled = 0; in qlcnic_setup_netdev()
2269 qlcnic_set_mac_filter_count(adapter); in qlcnic_setup_netdev()
2276 netdev->ethtool_ops = (qlcnic_sriov_vf_check(adapter)) ? in qlcnic_setup_netdev()
2285 if (QLCNIC_IS_TSO_CAPABLE(adapter)) { in qlcnic_setup_netdev()
2290 if (qlcnic_vlan_tx_check(adapter)) in qlcnic_setup_netdev()
2293 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_setup_netdev()
2296 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO) in qlcnic_setup_netdev()
2299 if (qlcnic_encap_tx_offload(adapter)) { in qlcnic_setup_netdev()
2309 if (qlcnic_encap_rx_offload(adapter)) { in qlcnic_setup_netdev()
2317 netdev->irq = adapter->msix_entries[0].vector; in qlcnic_setup_netdev()
2323 err = qlcnic_set_real_num_queues(adapter, adapter->drv_tx_rings, in qlcnic_setup_netdev()
2324 adapter->drv_sds_rings); in qlcnic_setup_netdev()
2328 qlcnic_dcb_init_dcbnl_ops(adapter->dcb); in qlcnic_setup_netdev()
2339 void qlcnic_free_tx_rings(struct qlcnic_adapter *adapter) in qlcnic_free_tx_rings() argument
2344 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_free_tx_rings()
2345 tx_ring = &adapter->tx_ring[ring]; in qlcnic_free_tx_rings()
2351 kfree(adapter->tx_ring); in qlcnic_free_tx_rings()
2354 int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter, in qlcnic_alloc_tx_rings() argument
2361 tx_ring = kcalloc(adapter->drv_tx_rings, in qlcnic_alloc_tx_rings()
2366 adapter->tx_ring = tx_ring; in qlcnic_alloc_tx_rings()
2368 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_alloc_tx_rings()
2369 tx_ring = &adapter->tx_ring[ring]; in qlcnic_alloc_tx_rings()
2370 tx_ring->num_desc = adapter->num_txd; in qlcnic_alloc_tx_rings()
2374 qlcnic_free_tx_rings(adapter); in qlcnic_alloc_tx_rings()
2381 if (qlcnic_83xx_check(adapter) || in qlcnic_alloc_tx_rings()
2382 (qlcnic_82xx_check(adapter) && qlcnic_check_multi_tx(adapter))) { in qlcnic_alloc_tx_rings()
2383 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_alloc_tx_rings()
2384 tx_ring = &adapter->tx_ring[ring]; in qlcnic_alloc_tx_rings()
2385 tx_ring->adapter = adapter; in qlcnic_alloc_tx_rings()
2386 if (adapter->flags & QLCNIC_MSIX_ENABLED) { in qlcnic_alloc_tx_rings()
2387 index = adapter->drv_sds_rings + ring; in qlcnic_alloc_tx_rings()
2388 vector = adapter->msix_entries[index].vector; in qlcnic_alloc_tx_rings()
2397 void qlcnic_set_drv_version(struct qlcnic_adapter *adapter) in qlcnic_set_drv_version() argument
2399 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_set_drv_version()
2402 if (qlcnic_82xx_check(adapter)) in qlcnic_set_drv_version()
2404 else if (qlcnic_83xx_check(adapter)) in qlcnic_set_drv_version()
2408 qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd); in qlcnic_set_drv_version()
2412 static void qlcnic_reset_api_lock(struct qlcnic_adapter *adapter) in qlcnic_reset_api_lock() argument
2414 qlcnic_api_lock(adapter); in qlcnic_reset_api_lock()
2415 qlcnic_api_unlock(adapter); in qlcnic_reset_api_lock()
2423 struct qlcnic_adapter *adapter = NULL; in qlcnic_probe() local
2489 adapter = netdev_priv(netdev); in qlcnic_probe()
2490 adapter->netdev = netdev; in qlcnic_probe()
2491 adapter->pdev = pdev; in qlcnic_probe()
2492 adapter->ahw = ahw; in qlcnic_probe()
2494 adapter->qlcnic_wq = create_singlethread_workqueue("qlcnic"); in qlcnic_probe()
2495 if (adapter->qlcnic_wq == NULL) { in qlcnic_probe()
2501 err = qlcnic_alloc_adapter_resources(adapter); in qlcnic_probe()
2505 adapter->dev_rst_time = jiffies; in qlcnic_probe()
2507 ahw->max_vnic_func = qlcnic_get_vnic_func_count(adapter); in qlcnic_probe()
2509 adapter->fdb_mac_learn = true; in qlcnic_probe()
2511 adapter->drv_mac_learn = true; in qlcnic_probe()
2513 rwlock_init(&adapter->ahw->crb_lock); in qlcnic_probe()
2514 mutex_init(&adapter->ahw->mem_lock); in qlcnic_probe()
2516 INIT_LIST_HEAD(&adapter->mac_list); in qlcnic_probe()
2518 qlcnic_register_dcb(adapter); in qlcnic_probe()
2520 if (qlcnic_82xx_check(adapter)) { in qlcnic_probe()
2521 qlcnic_check_vf(adapter, ent); in qlcnic_probe()
2522 adapter->portnum = adapter->ahw->pci_func; in qlcnic_probe()
2523 qlcnic_reset_api_lock(adapter); in qlcnic_probe()
2524 err = qlcnic_start_firmware(adapter); in qlcnic_probe()
2532 if (adapter->ahw->msix_supported) { in qlcnic_probe()
2533 if (qlcnic_check_multi_tx_capability(adapter) == 1) in qlcnic_probe()
2534 qlcnic_set_tx_ring_count(adapter, in qlcnic_probe()
2537 qlcnic_set_tx_ring_count(adapter, in qlcnic_probe()
2539 qlcnic_set_sds_ring_count(adapter, in qlcnic_probe()
2542 qlcnic_set_tx_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_probe()
2543 qlcnic_set_sds_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_probe()
2546 err = qlcnic_setup_idc_param(adapter); in qlcnic_probe()
2550 adapter->flags |= QLCNIC_NEED_FLR; in qlcnic_probe()
2552 } else if (qlcnic_83xx_check(adapter)) { in qlcnic_probe()
2553 qlcnic_83xx_check_vf(adapter, ent); in qlcnic_probe()
2554 adapter->portnum = adapter->ahw->pci_func; in qlcnic_probe()
2555 err = qlcnic_83xx_init(adapter); in qlcnic_probe()
2574 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_probe()
2583 if (qlcnic_read_mac_addr(adapter)) in qlcnic_probe()
2586 qlcnic_read_phys_port_id(adapter); in qlcnic_probe()
2588 if (adapter->portnum == 0) { in qlcnic_probe()
2589 qlcnic_get_board_name(adapter, board_name); in qlcnic_probe()
2593 board_name, adapter->ahw->revision_id); in qlcnic_probe()
2596 if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x && in qlcnic_probe()
2601 if (qlcnic_82xx_check(adapter)) { in qlcnic_probe()
2602 err = qlcnic_dcb_enable(adapter->dcb); in qlcnic_probe()
2604 qlcnic_dcb_free(adapter->dcb); in qlcnic_probe()
2609 qlcnic_dcb_get_info(adapter->dcb); in qlcnic_probe()
2610 err = qlcnic_setup_intr(adapter); in qlcnic_probe()
2618 err = qlcnic_get_act_pci_func(adapter); in qlcnic_probe()
2622 if (adapter->portnum == 0) in qlcnic_probe()
2623 qlcnic_set_drv_version(adapter); in qlcnic_probe()
2625 err = qlcnic_setup_netdev(adapter, netdev); in qlcnic_probe()
2629 pci_set_drvdata(pdev, adapter); in qlcnic_probe()
2631 if (qlcnic_82xx_check(adapter)) in qlcnic_probe()
2632 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, in qlcnic_probe()
2635 switch (adapter->ahw->port_type) { in qlcnic_probe()
2637 dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n", in qlcnic_probe()
2638 adapter->netdev->name); in qlcnic_probe()
2641 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n", in qlcnic_probe()
2642 adapter->netdev->name); in qlcnic_probe()
2646 if (adapter->drv_mac_learn) in qlcnic_probe()
2647 qlcnic_alloc_lb_filters_mem(adapter); in qlcnic_probe()
2649 qlcnic_add_sysfs(adapter); in qlcnic_probe()
2650 qlcnic_register_hwmon_dev(adapter); in qlcnic_probe()
2654 if (qlcnic_83xx_check(adapter)) in qlcnic_probe()
2655 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_probe()
2658 qlcnic_teardown_intr(adapter); in qlcnic_probe()
2659 qlcnic_cancel_idc_work(adapter); in qlcnic_probe()
2660 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_probe()
2663 qlcnic_free_adapter_resources(adapter); in qlcnic_probe()
2666 destroy_workqueue(adapter->qlcnic_wq); in qlcnic_probe()
2686 set_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state); in qlcnic_probe()
2691 if (qlcnic_83xx_check(adapter)) in qlcnic_probe()
2692 adapter->tgt_status_reg = NULL; in qlcnic_probe()
2700 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_probe()
2704 pci_set_drvdata(pdev, adapter); in qlcnic_probe()
2705 qlcnic_add_sysfs(adapter); in qlcnic_probe()
2712 struct qlcnic_adapter *adapter; in qlcnic_remove() local
2716 adapter = pci_get_drvdata(pdev); in qlcnic_remove()
2717 if (adapter == NULL) in qlcnic_remove()
2720 netdev = adapter->netdev; in qlcnic_remove()
2722 qlcnic_cancel_idc_work(adapter); in qlcnic_remove()
2723 qlcnic_sriov_pf_disable(adapter); in qlcnic_remove()
2724 ahw = adapter->ahw; in qlcnic_remove()
2727 qlcnic_sriov_cleanup(adapter); in qlcnic_remove()
2729 if (qlcnic_83xx_check(adapter)) { in qlcnic_remove()
2730 qlcnic_83xx_initialize_nic(adapter, 0); in qlcnic_remove()
2731 cancel_delayed_work_sync(&adapter->idc_aen_work); in qlcnic_remove()
2732 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_remove()
2733 qlcnic_83xx_detach_mailbox_work(adapter); in qlcnic_remove()
2738 qlcnic_dcb_free(adapter->dcb); in qlcnic_remove()
2739 qlcnic_detach(adapter); in qlcnic_remove()
2740 kfree(adapter->npars); in qlcnic_remove()
2741 kfree(adapter->eswitch); in qlcnic_remove()
2743 if (qlcnic_82xx_check(adapter)) in qlcnic_remove()
2744 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_remove()
2746 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_remove()
2748 qlcnic_free_lb_filters_mem(adapter); in qlcnic_remove()
2750 qlcnic_teardown_intr(adapter); in qlcnic_remove()
2752 qlcnic_remove_sysfs(adapter); in qlcnic_remove()
2754 qlcnic_unregister_hwmon_dev(adapter); in qlcnic_remove()
2756 qlcnic_cleanup_pci_map(adapter->ahw); in qlcnic_remove()
2758 qlcnic_release_firmware(adapter); in qlcnic_remove()
2764 if (adapter->qlcnic_wq) { in qlcnic_remove()
2765 destroy_workqueue(adapter->qlcnic_wq); in qlcnic_remove()
2766 adapter->qlcnic_wq = NULL; in qlcnic_remove()
2769 qlcnic_free_adapter_resources(adapter); in qlcnic_remove()
2789 struct qlcnic_adapter *adapter = dev_get_drvdata(dev_d); in qlcnic_resume() local
2791 return __qlcnic_resume(adapter); in qlcnic_resume()
2796 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_open() local
2799 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) { in qlcnic_open()
2808 err = qlcnic_attach(adapter); in qlcnic_open()
2812 err = __qlcnic_up(adapter, netdev); in qlcnic_open()
2814 qlcnic_detach(adapter); in qlcnic_open()
2824 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_close() local
2826 __qlcnic_down(adapter, netdev); in qlcnic_close()
2833 void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter) in qlcnic_alloc_lb_filters_mem() argument
2837 struct net_device *netdev = adapter->netdev; in qlcnic_alloc_lb_filters_mem()
2841 if (adapter->fhash.fmax && adapter->fhash.fhead) in qlcnic_alloc_lb_filters_mem()
2844 act_pci_func = adapter->ahw->total_nic_func; in qlcnic_alloc_lb_filters_mem()
2845 spin_lock_init(&adapter->mac_learn_lock); in qlcnic_alloc_lb_filters_mem()
2846 spin_lock_init(&adapter->rx_mac_learn_lock); in qlcnic_alloc_lb_filters_mem()
2848 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_alloc_lb_filters_mem()
2850 adapter->fhash.fbucket_size = QLCNIC_VF_LB_BUCKET_SIZE; in qlcnic_alloc_lb_filters_mem()
2851 } else if (qlcnic_82xx_check(adapter)) { in qlcnic_alloc_lb_filters_mem()
2853 adapter->fhash.fbucket_size = QLCNIC_LB_BUCKET_SIZE; in qlcnic_alloc_lb_filters_mem()
2856 adapter->fhash.fbucket_size = QLC_83XX_LB_BUCKET_SIZE; in qlcnic_alloc_lb_filters_mem()
2859 head = kcalloc(adapter->fhash.fbucket_size, in qlcnic_alloc_lb_filters_mem()
2865 adapter->fhash.fmax = (filter_size / act_pci_func); in qlcnic_alloc_lb_filters_mem()
2866 adapter->fhash.fhead = head; in qlcnic_alloc_lb_filters_mem()
2869 act_pci_func, adapter->fhash.fmax); in qlcnic_alloc_lb_filters_mem()
2871 for (i = 0; i < adapter->fhash.fbucket_size; i++) in qlcnic_alloc_lb_filters_mem()
2872 INIT_HLIST_HEAD(&adapter->fhash.fhead[i]); in qlcnic_alloc_lb_filters_mem()
2874 adapter->rx_fhash.fbucket_size = adapter->fhash.fbucket_size; in qlcnic_alloc_lb_filters_mem()
2876 head = kcalloc(adapter->rx_fhash.fbucket_size, in qlcnic_alloc_lb_filters_mem()
2882 adapter->rx_fhash.fmax = (filter_size / act_pci_func); in qlcnic_alloc_lb_filters_mem()
2883 adapter->rx_fhash.fhead = head; in qlcnic_alloc_lb_filters_mem()
2885 for (i = 0; i < adapter->rx_fhash.fbucket_size; i++) in qlcnic_alloc_lb_filters_mem()
2886 INIT_HLIST_HEAD(&adapter->rx_fhash.fhead[i]); in qlcnic_alloc_lb_filters_mem()
2889 static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter) in qlcnic_free_lb_filters_mem() argument
2891 if (adapter->fhash.fmax) in qlcnic_free_lb_filters_mem()
2892 kfree(adapter->fhash.fhead); in qlcnic_free_lb_filters_mem()
2894 adapter->fhash.fhead = NULL; in qlcnic_free_lb_filters_mem()
2895 adapter->fhash.fmax = 0; in qlcnic_free_lb_filters_mem()
2897 if (adapter->rx_fhash.fmax) in qlcnic_free_lb_filters_mem()
2898 kfree(adapter->rx_fhash.fhead); in qlcnic_free_lb_filters_mem()
2900 adapter->rx_fhash.fmax = 0; in qlcnic_free_lb_filters_mem()
2901 adapter->rx_fhash.fhead = NULL; in qlcnic_free_lb_filters_mem()
2904 int qlcnic_check_temp(struct qlcnic_adapter *adapter) in qlcnic_check_temp() argument
2906 struct net_device *netdev = adapter->netdev; in qlcnic_check_temp()
2910 if (qlcnic_83xx_check(adapter)) in qlcnic_check_temp()
2911 temp = QLCRDX(adapter->ahw, QLC_83XX_ASIC_TEMP); in qlcnic_check_temp()
2913 if (qlcnic_82xx_check(adapter)) in qlcnic_check_temp()
2914 temp = QLC_SHARED_REG_RD32(adapter, QLCNIC_ASIC_TEMP); in qlcnic_check_temp()
2926 if (adapter->ahw->temp == QLCNIC_TEMP_NORMAL) { in qlcnic_check_temp()
2934 if (adapter->ahw->temp == QLCNIC_TEMP_WARN) { in qlcnic_check_temp()
2940 adapter->ahw->temp = temp_state; in qlcnic_check_temp()
2956 static void qlcnic_dump_rings(struct qlcnic_adapter *adapter) in qlcnic_dump_rings() argument
2958 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_dump_rings()
2959 struct net_device *netdev = adapter->netdev; in qlcnic_dump_rings()
2968 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in qlcnic_dump_rings()
2978 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_dump_rings()
2989 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_dump_rings()
2990 tx_ring = &adapter->tx_ring[ring]; in qlcnic_dump_rings()
3015 if (netif_msg_tx_err(adapter->ahw)) in qlcnic_dump_rings()
3023 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_tx_timeout() local
3025 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_tx_timeout()
3028 qlcnic_dump_rings(adapter); in qlcnic_tx_timeout()
3030 if (++adapter->tx_timeo_cnt >= QLCNIC_MAX_TX_TIMEOUTS || in qlcnic_tx_timeout()
3031 netif_msg_tx_err(adapter->ahw)) { in qlcnic_tx_timeout()
3033 if (qlcnic_82xx_check(adapter)) in qlcnic_tx_timeout()
3034 adapter->need_fw_reset = 1; in qlcnic_tx_timeout()
3035 else if (qlcnic_83xx_check(adapter)) in qlcnic_tx_timeout()
3036 qlcnic_83xx_idc_request_reset(adapter, in qlcnic_tx_timeout()
3040 adapter->ahw->reset_context = 1; in qlcnic_tx_timeout()
3046 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_get_stats() local
3049 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_get_stats()
3050 qlcnic_update_stats(adapter); in qlcnic_get_stats()
3052 stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts; in qlcnic_get_stats()
3053 stats->tx_packets = adapter->stats.xmitfinished; in qlcnic_get_stats()
3054 stats->rx_bytes = adapter->stats.rxbytes + adapter->stats.lrobytes; in qlcnic_get_stats()
3055 stats->tx_bytes = adapter->stats.txbytes; in qlcnic_get_stats()
3056 stats->rx_dropped = adapter->stats.rxdropped; in qlcnic_get_stats()
3057 stats->tx_dropped = adapter->stats.txdropped; in qlcnic_get_stats()
3062 static irqreturn_t qlcnic_82xx_clear_legacy_intr(struct qlcnic_adapter *adapter) in qlcnic_82xx_clear_legacy_intr() argument
3066 status = readl(adapter->isr_int_vec); in qlcnic_82xx_clear_legacy_intr()
3068 if (!(status & adapter->ahw->int_vec_bit)) in qlcnic_82xx_clear_legacy_intr()
3072 status = readl(adapter->crb_int_state_reg); in qlcnic_82xx_clear_legacy_intr()
3076 writel(0xffffffff, adapter->tgt_status_reg); in qlcnic_82xx_clear_legacy_intr()
3078 readl(adapter->isr_int_vec); in qlcnic_82xx_clear_legacy_intr()
3079 readl(adapter->isr_int_vec); in qlcnic_82xx_clear_legacy_intr()
3087 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_tmp_intr() local
3089 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_tmp_intr()
3091 else if (adapter->flags & QLCNIC_MSI_ENABLED) { in qlcnic_tmp_intr()
3092 writel(0xffffffff, adapter->tgt_status_reg); in qlcnic_tmp_intr()
3096 if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE) in qlcnic_tmp_intr()
3100 adapter->ahw->diag_cnt++; in qlcnic_tmp_intr()
3101 qlcnic_enable_sds_intr(adapter, sds_ring); in qlcnic_tmp_intr()
3108 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_intr() local
3110 if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE) in qlcnic_intr()
3121 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_msi_intr() local
3124 writel(0xffffffff, adapter->tgt_status_reg); in qlcnic_msi_intr()
3147 qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding) in qlcnic_idc_debug_info() argument
3151 val = adapter->portnum & 0xf; in qlcnic_idc_debug_info()
3153 val |= (jiffies - adapter->dev_rst_time) << 8; in qlcnic_idc_debug_info()
3155 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_SCRATCH, val); in qlcnic_idc_debug_info()
3156 adapter->dev_rst_time = jiffies; in qlcnic_idc_debug_info()
3160 qlcnic_set_drv_state(struct qlcnic_adapter *adapter, u8 state) in qlcnic_set_drv_state() argument
3167 if (qlcnic_api_lock(adapter)) in qlcnic_set_drv_state()
3170 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_set_drv_state()
3173 QLC_DEV_SET_RST_RDY(val, adapter->portnum); in qlcnic_set_drv_state()
3175 QLC_DEV_SET_QSCNT_RDY(val, adapter->portnum); in qlcnic_set_drv_state()
3177 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_set_drv_state()
3179 qlcnic_api_unlock(adapter); in qlcnic_set_drv_state()
3185 qlcnic_clr_drv_state(struct qlcnic_adapter *adapter) in qlcnic_clr_drv_state() argument
3189 if (qlcnic_api_lock(adapter)) in qlcnic_clr_drv_state()
3192 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_clr_drv_state()
3193 QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum); in qlcnic_clr_drv_state()
3194 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_clr_drv_state()
3196 qlcnic_api_unlock(adapter); in qlcnic_clr_drv_state()
3201 void qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8 failed) in qlcnic_clr_all_drv_state() argument
3205 if (qlcnic_api_lock(adapter)) in qlcnic_clr_all_drv_state()
3208 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE); in qlcnic_clr_all_drv_state()
3209 QLC_DEV_CLR_REF_CNT(val, adapter->portnum); in qlcnic_clr_all_drv_state()
3210 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val); in qlcnic_clr_all_drv_state()
3213 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_clr_all_drv_state()
3215 dev_info(&adapter->pdev->dev, in qlcnic_clr_all_drv_state()
3218 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_clr_all_drv_state()
3221 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_clr_all_drv_state()
3222 QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum); in qlcnic_clr_all_drv_state()
3223 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_clr_all_drv_state()
3225 qlcnic_api_unlock(adapter); in qlcnic_clr_all_drv_state()
3227 adapter->fw_fail_cnt = 0; in qlcnic_clr_all_drv_state()
3228 adapter->flags &= ~QLCNIC_FW_HANG; in qlcnic_clr_all_drv_state()
3229 clear_bit(__QLCNIC_START_FW, &adapter->state); in qlcnic_clr_all_drv_state()
3230 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_clr_all_drv_state()
3235 qlcnic_check_drv_state(struct qlcnic_adapter *adapter) in qlcnic_check_drv_state() argument
3238 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_drv_state()
3240 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_check_drv_state()
3241 act = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE); in qlcnic_check_drv_state()
3243 if (adapter->flags & QLCNIC_FW_RESET_OWNER) { in qlcnic_check_drv_state()
3255 static int qlcnic_check_idc_ver(struct qlcnic_adapter *adapter) in qlcnic_check_idc_ver() argument
3257 u32 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_IDC_VER); in qlcnic_check_idc_ver()
3260 dev_warn(&adapter->pdev->dev, "IDC Version mismatch, driver's" in qlcnic_check_idc_ver()
3268 qlcnic_can_start_firmware(struct qlcnic_adapter *adapter) in qlcnic_can_start_firmware() argument
3271 u8 dev_init_timeo = adapter->dev_init_timeo; in qlcnic_can_start_firmware()
3272 u8 portnum = adapter->portnum; in qlcnic_can_start_firmware()
3275 if (test_and_clear_bit(__QLCNIC_START_FW, &adapter->state)) in qlcnic_can_start_firmware()
3278 if (qlcnic_api_lock(adapter)) in qlcnic_can_start_firmware()
3281 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE); in qlcnic_can_start_firmware()
3284 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val); in qlcnic_can_start_firmware()
3287 prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_can_start_firmware()
3288 QLCDB(adapter, HW, "Device state = %u\n", prev_state); in qlcnic_can_start_firmware()
3292 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_can_start_firmware()
3294 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_IDC_VER, in qlcnic_can_start_firmware()
3296 qlcnic_idc_debug_info(adapter, 0); in qlcnic_can_start_firmware()
3297 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3301 ret = qlcnic_check_idc_ver(adapter); in qlcnic_can_start_firmware()
3302 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3306 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_can_start_firmware()
3308 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_can_start_firmware()
3312 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_can_start_firmware()
3314 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_can_start_firmware()
3318 dev_err(&adapter->pdev->dev, "Device in failed state.\n"); in qlcnic_can_start_firmware()
3319 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3327 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3331 prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_can_start_firmware()
3335 dev_err(&adapter->pdev->dev, in qlcnic_can_start_firmware()
3340 if (qlcnic_api_lock(adapter)) in qlcnic_can_start_firmware()
3343 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_can_start_firmware()
3345 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_can_start_firmware()
3347 ret = qlcnic_check_idc_ver(adapter); in qlcnic_can_start_firmware()
3348 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3356 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_fwinit_work() local
3361 if (qlcnic_api_lock(adapter)) in qlcnic_fwinit_work()
3364 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_fwinit_work()
3367 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3368 qlcnic_schedule_work(adapter, qlcnic_fwinit_work, in qlcnic_fwinit_work()
3373 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { in qlcnic_fwinit_work()
3374 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3380 dev_info(&adapter->pdev->dev, "Detected state change from " in qlcnic_fwinit_work()
3385 if (adapter->fw_wait_cnt++ > adapter->reset_ack_timeo) { in qlcnic_fwinit_work()
3386 dev_info(&adapter->pdev->dev, "Reset:Failed to get ack %d sec\n", in qlcnic_fwinit_work()
3387 adapter->reset_ack_timeo); in qlcnic_fwinit_work()
3391 if (!qlcnic_check_drv_state(adapter)) { in qlcnic_fwinit_work()
3393 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_fwinit_work()
3396 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_fwinit_work()
3398 set_bit(__QLCNIC_START_FW, &adapter->state); in qlcnic_fwinit_work()
3399 QLCDB(adapter, DRV, "Restarting fw\n"); in qlcnic_fwinit_work()
3400 qlcnic_idc_debug_info(adapter, 0); in qlcnic_fwinit_work()
3401 val = QLC_SHARED_REG_RD32(adapter, in qlcnic_fwinit_work()
3403 QLC_DEV_SET_RST_RDY(val, adapter->portnum); in qlcnic_fwinit_work()
3404 QLC_SHARED_REG_WR32(adapter, in qlcnic_fwinit_work()
3408 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3411 if (qlcnic_check_fw_dump_state(adapter) && in qlcnic_fwinit_work()
3412 (adapter->flags & QLCNIC_FW_RESET_OWNER)) { in qlcnic_fwinit_work()
3413 QLCDB(adapter, DRV, "Take FW dump\n"); in qlcnic_fwinit_work()
3414 qlcnic_dump_fw(adapter); in qlcnic_fwinit_work()
3415 adapter->flags |= QLCNIC_FW_HANG; in qlcnic_fwinit_work()
3419 adapter->flags &= ~QLCNIC_FW_RESET_OWNER; in qlcnic_fwinit_work()
3420 if (!adapter->nic_ops->start_firmware(adapter)) { in qlcnic_fwinit_work()
3421 qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); in qlcnic_fwinit_work()
3422 adapter->fw_wait_cnt = 0; in qlcnic_fwinit_work()
3428 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3431 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_fwinit_work()
3432 QLCDB(adapter, HW, "Func waiting: Device state=%u\n", dev_state); in qlcnic_fwinit_work()
3436 if (!qlcnic_start_firmware(adapter)) { in qlcnic_fwinit_work()
3437 qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); in qlcnic_fwinit_work()
3438 adapter->fw_wait_cnt = 0; in qlcnic_fwinit_work()
3445 qlcnic_schedule_work(adapter, in qlcnic_fwinit_work()
3451 dev_err(&adapter->pdev->dev, "Fwinit work failed state=%u " in qlcnic_fwinit_work()
3452 "fw_wait_cnt=%u\n", dev_state, adapter->fw_wait_cnt); in qlcnic_fwinit_work()
3453 netif_device_attach(adapter->netdev); in qlcnic_fwinit_work()
3454 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_fwinit_work()
3460 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_detach_work() local
3462 struct net_device *netdev = adapter->netdev; in qlcnic_detach_work()
3468 if (adapter->dev_state == QLCNIC_DEV_NEED_QUISCENT) { in qlcnic_detach_work()
3470 __qlcnic_down(adapter, netdev); in qlcnic_detach_work()
3472 qlcnic_down(adapter, netdev); in qlcnic_detach_work()
3474 status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1); in qlcnic_detach_work()
3477 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3482 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3485 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3492 if (adapter->ahw->temp == QLCNIC_TEMP_PANIC) { in qlcnic_detach_work()
3493 dev_err(&adapter->pdev->dev, "Detaching the device: temp=%d\n", in qlcnic_detach_work()
3494 adapter->ahw->temp); in qlcnic_detach_work()
3499 if (!(adapter->flags & QLCNIC_FW_RESET_OWNER)) { in qlcnic_detach_work()
3500 if (qlcnic_set_drv_state(adapter, adapter->dev_state)) { in qlcnic_detach_work()
3501 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3508 adapter->fw_wait_cnt = 0; in qlcnic_detach_work()
3510 qlcnic_schedule_work(adapter, qlcnic_fwinit_work, FW_POLL_DELAY); in qlcnic_detach_work()
3516 qlcnic_clr_all_drv_state(adapter, 1); in qlcnic_detach_work()
3521 qlcnic_set_npar_non_operational(struct qlcnic_adapter *adapter) in qlcnic_set_npar_non_operational() argument
3525 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE); in qlcnic_set_npar_non_operational()
3529 if (qlcnic_api_lock(adapter)) in qlcnic_set_npar_non_operational()
3531 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, in qlcnic_set_npar_non_operational()
3533 qlcnic_api_unlock(adapter); in qlcnic_set_npar_non_operational()
3536 static void qlcnic_82xx_dev_request_reset(struct qlcnic_adapter *adapter, in qlcnic_82xx_dev_request_reset() argument
3543 QLCWR32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, xg_val); in qlcnic_82xx_dev_request_reset()
3548 QLCWR32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, gb_val); in qlcnic_82xx_dev_request_reset()
3549 dev_info(&adapter->pdev->dev, "Pause control frames disabled" in qlcnic_82xx_dev_request_reset()
3551 adapter->need_fw_reset = 1; in qlcnic_82xx_dev_request_reset()
3553 if (qlcnic_api_lock(adapter)) in qlcnic_82xx_dev_request_reset()
3556 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_82xx_dev_request_reset()
3558 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) { in qlcnic_82xx_dev_request_reset()
3559 netdev_err(adapter->netdev, "%s: Device is in non-operational state\n", in qlcnic_82xx_dev_request_reset()
3561 qlcnic_api_unlock(adapter); in qlcnic_82xx_dev_request_reset()
3567 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_82xx_dev_request_reset()
3569 adapter->flags |= QLCNIC_FW_RESET_OWNER; in qlcnic_82xx_dev_request_reset()
3570 QLCDB(adapter, DRV, "NEED_RESET state set\n"); in qlcnic_82xx_dev_request_reset()
3571 qlcnic_idc_debug_info(adapter, 0); in qlcnic_82xx_dev_request_reset()
3574 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, in qlcnic_82xx_dev_request_reset()
3576 qlcnic_api_unlock(adapter); in qlcnic_82xx_dev_request_reset()
3581 qlcnic_dev_set_npar_ready(struct qlcnic_adapter *adapter) in qlcnic_dev_set_npar_ready() argument
3583 if (qlcnic_api_lock(adapter)) in qlcnic_dev_set_npar_ready()
3586 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, in qlcnic_dev_set_npar_ready()
3588 QLCDB(adapter, DRV, "NPAR operational state set\n"); in qlcnic_dev_set_npar_ready()
3590 qlcnic_api_unlock(adapter); in qlcnic_dev_set_npar_ready()
3593 void qlcnic_schedule_work(struct qlcnic_adapter *adapter, in qlcnic_schedule_work() argument
3596 if (test_bit(__QLCNIC_AER, &adapter->state)) in qlcnic_schedule_work()
3599 INIT_DELAYED_WORK(&adapter->fw_work, func); in qlcnic_schedule_work()
3600 queue_delayed_work(adapter->qlcnic_wq, &adapter->fw_work, in qlcnic_schedule_work()
3607 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_attach_work() local
3609 struct net_device *netdev = adapter->netdev; in qlcnic_attach_work()
3612 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) { in qlcnic_attach_work()
3613 npar_state = QLC_SHARED_REG_RD32(adapter, in qlcnic_attach_work()
3615 if (adapter->fw_wait_cnt++ > QLCNIC_DEV_NPAR_OPER_TIMEO) in qlcnic_attach_work()
3616 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_attach_work()
3618 qlcnic_schedule_work(adapter, qlcnic_attach_work, in qlcnic_attach_work()
3622 QLCDB(adapter, DRV, "Waiting for NPAR state to operational\n"); in qlcnic_attach_work()
3626 qlcnic_dcb_get_info(adapter->dcb); in qlcnic_attach_work()
3629 if (qlcnic_up(adapter, netdev)) in qlcnic_attach_work()
3637 adapter->fw_fail_cnt = 0; in qlcnic_attach_work()
3638 adapter->flags &= ~QLCNIC_FW_HANG; in qlcnic_attach_work()
3639 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_attach_work()
3640 if (adapter->portnum == 0) in qlcnic_attach_work()
3641 qlcnic_set_drv_version(adapter); in qlcnic_attach_work()
3643 if (!qlcnic_clr_drv_state(adapter)) in qlcnic_attach_work()
3644 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, in qlcnic_attach_work()
3649 qlcnic_check_health(struct qlcnic_adapter *adapter) in qlcnic_check_health() argument
3651 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_health()
3657 if (qlcnic_check_temp(adapter)) in qlcnic_check_health()
3660 if (adapter->need_fw_reset) in qlcnic_check_health()
3661 qlcnic_dev_request_reset(adapter, 0); in qlcnic_check_health()
3663 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_check_health()
3665 qlcnic_set_npar_non_operational(adapter); in qlcnic_check_health()
3666 adapter->need_fw_reset = 1; in qlcnic_check_health()
3670 heartbeat = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_ALIVE_COUNTER); in qlcnic_check_health()
3671 if (heartbeat != adapter->heartbeat) { in qlcnic_check_health()
3672 adapter->heartbeat = heartbeat; in qlcnic_check_health()
3673 adapter->fw_fail_cnt = 0; in qlcnic_check_health()
3674 if (adapter->need_fw_reset) in qlcnic_check_health()
3678 qlcnic_reset_hw_context(adapter); in qlcnic_check_health()
3683 if (++adapter->fw_fail_cnt < FW_FAIL_THRESH) in qlcnic_check_health()
3686 adapter->flags |= QLCNIC_FW_HANG; in qlcnic_check_health()
3688 qlcnic_dev_request_reset(adapter, 0); in qlcnic_check_health()
3691 clear_bit(__QLCNIC_FW_ATTACHED, &adapter->state); in qlcnic_check_health()
3693 dev_err(&adapter->pdev->dev, "firmware hang detected\n"); in qlcnic_check_health()
3694 peg_status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1); in qlcnic_check_health()
3695 dev_err(&adapter->pdev->dev, "Dumping hw/fw registers\n" in qlcnic_check_health()
3701 QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2), in qlcnic_check_health()
3702 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err), in qlcnic_check_health()
3703 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err), in qlcnic_check_health()
3704 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err), in qlcnic_check_health()
3705 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err), in qlcnic_check_health()
3706 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err)); in qlcnic_check_health()
3708 dev_err(&adapter->pdev->dev, in qlcnic_check_health()
3712 adapter->dev_state = (state == QLCNIC_DEV_NEED_QUISCENT) ? state : in qlcnic_check_health()
3716 &adapter->state)) { in qlcnic_check_health()
3718 qlcnic_schedule_work(adapter, qlcnic_detach_work, 0); in qlcnic_check_health()
3719 QLCDB(adapter, DRV, "fw recovery scheduled.\n"); in qlcnic_check_health()
3721 adapter->flags & QLCNIC_FW_RESET_OWNER) { in qlcnic_check_health()
3722 qlcnic_dump_fw(adapter); in qlcnic_check_health()
3730 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_fw_poll_work() local
3733 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_fw_poll_work()
3737 if (qlcnic_check_health(adapter)) in qlcnic_fw_poll_work()
3740 if (adapter->fhash.fnum) in qlcnic_fw_poll_work()
3741 qlcnic_prune_lb_filters(adapter); in qlcnic_fw_poll_work()
3744 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY); in qlcnic_fw_poll_work()
3771 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_attach_func() local
3772 struct net_device *netdev = adapter->netdev; in qlcnic_attach_func()
3785 if (qlcnic_api_lock(adapter)) in qlcnic_attach_func()
3788 if (adapter->ahw->op_mode != QLCNIC_NON_PRIV_FUNC && first_func) { in qlcnic_attach_func()
3789 adapter->need_fw_reset = 1; in qlcnic_attach_func()
3790 set_bit(__QLCNIC_START_FW, &adapter->state); in qlcnic_attach_func()
3791 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_attach_func()
3793 QLCDB(adapter, DRV, "Restarting fw\n"); in qlcnic_attach_func()
3795 qlcnic_api_unlock(adapter); in qlcnic_attach_func()
3797 err = qlcnic_start_firmware(adapter); in qlcnic_attach_func()
3801 qlcnic_clr_drv_state(adapter); in qlcnic_attach_func()
3802 kfree(adapter->msix_entries); in qlcnic_attach_func()
3803 adapter->msix_entries = NULL; in qlcnic_attach_func()
3804 err = qlcnic_setup_intr(adapter); in qlcnic_attach_func()
3807 kfree(adapter->msix_entries); in qlcnic_attach_func()
3813 err = qlcnic_attach(adapter); in qlcnic_attach_func()
3815 qlcnic_clr_all_drv_state(adapter, 1); in qlcnic_attach_func()
3816 clear_bit(__QLCNIC_AER, &adapter->state); in qlcnic_attach_func()
3821 err = qlcnic_up(adapter, netdev); in qlcnic_attach_func()
3835 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_82xx_io_error_detected() local
3836 struct net_device *netdev = adapter->netdev; in qlcnic_82xx_io_error_detected()
3844 set_bit(__QLCNIC_AER, &adapter->state); in qlcnic_82xx_io_error_detected()
3847 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_82xx_io_error_detected()
3850 qlcnic_down(adapter, netdev); in qlcnic_82xx_io_error_detected()
3852 qlcnic_detach(adapter); in qlcnic_82xx_io_error_detected()
3853 qlcnic_teardown_intr(adapter); in qlcnic_82xx_io_error_detected()
3855 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_82xx_io_error_detected()
3878 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_82xx_io_resume() local
3880 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_82xx_io_resume()
3882 &adapter->state)) in qlcnic_82xx_io_resume()
3883 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, in qlcnic_82xx_io_resume()
3890 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_io_error_detected() local
3891 struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops; in qlcnic_io_error_detected()
3903 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_io_slot_reset() local
3904 struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops; in qlcnic_io_slot_reset()
3916 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_io_resume() local
3917 struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops; in qlcnic_io_resume()
3927 qlcnicvf_start_firmware(struct qlcnic_adapter *adapter) in qlcnicvf_start_firmware() argument
3931 err = qlcnic_can_start_firmware(adapter); in qlcnicvf_start_firmware()
3935 err = qlcnic_check_npar_opertional(adapter); in qlcnicvf_start_firmware()
3939 err = qlcnic_initialize_nic(adapter); in qlcnicvf_start_firmware()
3943 qlcnic_check_options(adapter); in qlcnicvf_start_firmware()
3945 err = qlcnic_set_eswitch_port_config(adapter); in qlcnicvf_start_firmware()
3949 adapter->need_fw_reset = 0; in qlcnicvf_start_firmware()
3954 int qlcnic_validate_rings(struct qlcnic_adapter *adapter, __u32 ring_cnt, in qlcnic_validate_rings() argument
3957 struct net_device *netdev = adapter->netdev; in qlcnic_validate_rings()
3971 if (qlcnic_82xx_check(adapter) && (queue_type == QLCNIC_TX_QUEUE) && in qlcnic_validate_rings()
3972 !qlcnic_check_multi_tx(adapter)) { in qlcnic_validate_rings()
3987 int qlcnic_setup_rings(struct qlcnic_adapter *adapter) in qlcnic_setup_rings() argument
3989 struct net_device *netdev = adapter->netdev; in qlcnic_setup_rings()
3993 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_setup_rings()
3996 tx_rings = adapter->drv_tss_rings; in qlcnic_setup_rings()
3997 rx_rings = adapter->drv_rss_rings; in qlcnic_setup_rings()
4001 err = qlcnic_set_real_num_queues(adapter, tx_rings, rx_rings); in qlcnic_setup_rings()
4006 __qlcnic_down(adapter, netdev); in qlcnic_setup_rings()
4008 qlcnic_detach(adapter); in qlcnic_setup_rings()
4010 if (qlcnic_83xx_check(adapter)) { in qlcnic_setup_rings()
4011 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_setup_rings()
4012 qlcnic_83xx_enable_mbx_poll(adapter); in qlcnic_setup_rings()
4015 qlcnic_teardown_intr(adapter); in qlcnic_setup_rings()
4017 err = qlcnic_setup_intr(adapter); in qlcnic_setup_rings()
4019 kfree(adapter->msix_entries); in qlcnic_setup_rings()
4027 if ((tx_rings != adapter->drv_tx_rings) || in qlcnic_setup_rings()
4028 (rx_rings != adapter->drv_sds_rings)) { in qlcnic_setup_rings()
4029 err = qlcnic_set_real_num_queues(adapter, in qlcnic_setup_rings()
4030 adapter->drv_tx_rings, in qlcnic_setup_rings()
4031 adapter->drv_sds_rings); in qlcnic_setup_rings()
4036 if (qlcnic_83xx_check(adapter)) { in qlcnic_setup_rings()
4037 qlcnic_83xx_initialize_nic(adapter, 1); in qlcnic_setup_rings()
4038 err = qlcnic_83xx_setup_mbx_intr(adapter); in qlcnic_setup_rings()
4039 qlcnic_83xx_disable_mbx_poll(adapter); in qlcnic_setup_rings()
4041 dev_err(&adapter->pdev->dev, in qlcnic_setup_rings()
4048 err = qlcnic_attach(adapter); in qlcnic_setup_rings()
4051 err = __qlcnic_up(adapter, netdev); in qlcnic_setup_rings()
4058 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_setup_rings()
4067 qlcnic_config_indev_addr(struct qlcnic_adapter *adapter, in qlcnic_config_indev_addr() argument
4080 qlcnic_config_ipaddr(adapter, in qlcnic_config_indev_addr()
4084 qlcnic_config_ipaddr(adapter, in qlcnic_config_indev_addr()
4097 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_restore_indev_addr() local
4101 qlcnic_config_indev_addr(adapter, netdev, event); in qlcnic_restore_indev_addr()
4104 for_each_set_bit(vid, adapter->vlans, VLAN_N_VID) { in qlcnic_restore_indev_addr()
4108 qlcnic_config_indev_addr(adapter, dev, event); in qlcnic_restore_indev_addr()
4116 struct qlcnic_adapter *adapter; in qlcnic_netdev_event() local
4131 adapter = netdev_priv(dev); in qlcnic_netdev_event()
4133 if (!adapter) in qlcnic_netdev_event()
4136 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_netdev_event()
4139 qlcnic_config_indev_addr(adapter, dev, event); in qlcnic_netdev_event()
4148 struct qlcnic_adapter *adapter; in qlcnic_inetaddr_event() local
4167 adapter = netdev_priv(dev); in qlcnic_inetaddr_event()
4169 if (!adapter) in qlcnic_inetaddr_event()
4172 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_inetaddr_event()
4177 qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_UP); in qlcnic_inetaddr_event()
4181 qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_DOWN); in qlcnic_inetaddr_event()