Lines Matching refs:adapter
68 static void qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding);
69 static int qlcnic_can_start_firmware(struct qlcnic_adapter *adapter);
80 static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter);
95 static u32 qlcnic_vlan_tx_check(struct qlcnic_adapter *adapter) in qlcnic_vlan_tx_check() argument
97 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_vlan_tx_check()
99 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()
360 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { in qlcnic_set_mac()
362 qlcnic_napi_disable(adapter); in qlcnic_set_mac()
365 qlcnic_delete_adapter_mac(adapter); in qlcnic_set_mac()
366 memcpy(adapter->mac_addr, addr->sa_data, netdev->addr_len); in qlcnic_set_mac()
368 qlcnic_set_multi(adapter->netdev); in qlcnic_set_mac()
370 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { in qlcnic_set_mac()
372 qlcnic_napi_enable(adapter); in qlcnic_set_mac()
381 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_fdb_del() local
384 if (!adapter->fdb_mac_learn) in qlcnic_fdb_del()
387 if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || in qlcnic_fdb_del()
388 qlcnic_sriov_check(adapter)) { in qlcnic_fdb_del()
392 err = qlcnic_nic_del_mac(adapter, addr); in qlcnic_fdb_del()
406 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_fdb_add() local
409 if (!adapter->fdb_mac_learn) in qlcnic_fdb_add()
412 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) && in qlcnic_fdb_add()
413 !qlcnic_sriov_check(adapter)) { in qlcnic_fdb_add()
418 if (ether_addr_equal(addr, adapter->mac_addr)) in qlcnic_fdb_add()
422 if (netdev_uc_count(netdev) < adapter->ahw->max_uc_count) in qlcnic_fdb_add()
439 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_fdb_dump() local
441 if (!adapter->fdb_mac_learn) in qlcnic_fdb_dump()
444 if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) || in qlcnic_fdb_dump()
445 qlcnic_sriov_check(adapter)) in qlcnic_fdb_dump()
451 static void qlcnic_82xx_cancel_idc_work(struct qlcnic_adapter *adapter) in qlcnic_82xx_cancel_idc_work() argument
453 while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_82xx_cancel_idc_work()
456 if (!adapter->fw_work.work.func) in qlcnic_82xx_cancel_idc_work()
459 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_82xx_cancel_idc_work()
465 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_get_phys_port_id() local
466 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_get_phys_port_id()
468 if (!(adapter->flags & QLCNIC_HAS_PHYS_PORT_ID)) in qlcnic_get_phys_port_id()
481 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_add_vxlan_port() local
482 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_add_vxlan_port()
487 if (!qlcnic_encap_rx_offload(adapter)) in qlcnic_add_vxlan_port()
492 adapter->flags |= QLCNIC_ADD_VXLAN_PORT; in qlcnic_add_vxlan_port()
503 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_del_vxlan_port() local
504 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_del_vxlan_port()
506 if (!qlcnic_encap_rx_offload(adapter) || !ahw->vxlan_port_count || in qlcnic_del_vxlan_port()
512 adapter->flags |= QLCNIC_DEL_VXLAN_PORT; in qlcnic_del_vxlan_port()
636 static int qlcnic_check_multi_tx_capability(struct qlcnic_adapter *adapter) in qlcnic_check_multi_tx_capability() argument
638 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_multi_tx_capability()
640 if (qlcnic_82xx_check(adapter) && in qlcnic_check_multi_tx_capability()
642 test_and_set_bit(__QLCNIC_MULTI_TX_UNIQUE, &adapter->state); in qlcnic_check_multi_tx_capability()
649 static int qlcnic_max_rings(struct qlcnic_adapter *adapter, u8 ring_cnt, in qlcnic_max_rings() argument
655 max_rings = adapter->max_sds_rings; in qlcnic_max_rings()
657 max_rings = adapter->max_tx_rings; in qlcnic_max_rings()
668 void qlcnic_set_tx_ring_count(struct qlcnic_adapter *adapter, u8 tx_cnt) in qlcnic_set_tx_ring_count() argument
671 if (adapter->max_tx_rings) in qlcnic_set_tx_ring_count()
672 adapter->drv_tx_rings = qlcnic_max_rings(adapter, tx_cnt, in qlcnic_set_tx_ring_count()
675 adapter->drv_tx_rings = tx_cnt; in qlcnic_set_tx_ring_count()
678 void qlcnic_set_sds_ring_count(struct qlcnic_adapter *adapter, u8 rx_cnt) in qlcnic_set_sds_ring_count() argument
681 if (adapter->max_sds_rings) in qlcnic_set_sds_ring_count()
682 adapter->drv_sds_rings = qlcnic_max_rings(adapter, rx_cnt, in qlcnic_set_sds_ring_count()
685 adapter->drv_sds_rings = rx_cnt; in qlcnic_set_sds_ring_count()
688 int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter) in qlcnic_setup_tss_rss_intr() argument
690 struct pci_dev *pdev = adapter->pdev; in qlcnic_setup_tss_rss_intr()
693 adapter->flags &= ~QLCNIC_TSS_RSS; in qlcnic_setup_tss_rss_intr()
695 if (adapter->drv_tss_rings > 0) in qlcnic_setup_tss_rss_intr()
696 num_msix += adapter->drv_tss_rings; in qlcnic_setup_tss_rss_intr()
698 num_msix += adapter->drv_tx_rings; in qlcnic_setup_tss_rss_intr()
700 if (adapter->drv_rss_rings > 0) in qlcnic_setup_tss_rss_intr()
701 num_msix += adapter->drv_rss_rings; in qlcnic_setup_tss_rss_intr()
703 num_msix += adapter->drv_sds_rings; in qlcnic_setup_tss_rss_intr()
705 if (qlcnic_83xx_check(adapter)) in qlcnic_setup_tss_rss_intr()
708 if (!adapter->msix_entries) { in qlcnic_setup_tss_rss_intr()
709 adapter->msix_entries = kcalloc(num_msix, in qlcnic_setup_tss_rss_intr()
712 if (!adapter->msix_entries) in qlcnic_setup_tss_rss_intr()
717 adapter->msix_entries[vector].entry = vector; in qlcnic_setup_tss_rss_intr()
720 err = pci_enable_msix_exact(pdev, adapter->msix_entries, num_msix); in qlcnic_setup_tss_rss_intr()
722 if (!adapter->drv_tss_rings && !adapter->drv_rss_rings) in qlcnic_setup_tss_rss_intr()
725 netdev_info(adapter->netdev, in qlcnic_setup_tss_rss_intr()
729 num_msix = adapter->drv_tx_rings + adapter->drv_sds_rings; in qlcnic_setup_tss_rss_intr()
732 adapter->drv_tss_rings = 0; in qlcnic_setup_tss_rss_intr()
733 adapter->drv_rss_rings = 0; in qlcnic_setup_tss_rss_intr()
735 if (qlcnic_83xx_check(adapter)) in qlcnic_setup_tss_rss_intr()
738 netdev_info(adapter->netdev, in qlcnic_setup_tss_rss_intr()
740 adapter->drv_tx_rings, adapter->drv_sds_rings, in qlcnic_setup_tss_rss_intr()
748 adapter->ahw->num_msix = num_msix; in qlcnic_setup_tss_rss_intr()
749 if (adapter->drv_tss_rings > 0) in qlcnic_setup_tss_rss_intr()
750 adapter->drv_tx_rings = adapter->drv_tss_rings; in qlcnic_setup_tss_rss_intr()
752 if (adapter->drv_rss_rings > 0) in qlcnic_setup_tss_rss_intr()
753 adapter->drv_sds_rings = adapter->drv_rss_rings; in qlcnic_setup_tss_rss_intr()
758 int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix) in qlcnic_enable_msix() argument
760 struct pci_dev *pdev = adapter->pdev; in qlcnic_enable_msix()
763 if (!adapter->msix_entries) { in qlcnic_enable_msix()
764 adapter->msix_entries = kcalloc(num_msix, in qlcnic_enable_msix()
767 if (!adapter->msix_entries) in qlcnic_enable_msix()
771 adapter->flags &= ~(QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED); in qlcnic_enable_msix()
773 if (adapter->ahw->msix_supported) { in qlcnic_enable_msix()
776 adapter->msix_entries[vector].entry = vector; in qlcnic_enable_msix()
779 adapter->msix_entries, 1, num_msix); in qlcnic_enable_msix()
782 adapter->flags |= QLCNIC_MSIX_ENABLED; in qlcnic_enable_msix()
783 adapter->ahw->num_msix = num_msix; in qlcnic_enable_msix()
793 if (qlcnic_82xx_check(adapter)) { in qlcnic_enable_msix()
804 if (qlcnic_82xx_check(adapter) && in qlcnic_enable_msix()
805 !qlcnic_check_multi_tx(adapter)) { in qlcnic_enable_msix()
806 adapter->drv_sds_rings = num_msix; in qlcnic_enable_msix()
807 adapter->drv_tx_rings = QLCNIC_SINGLE_RING; in qlcnic_enable_msix()
810 adapter->drv_tx_rings = num_msix / 2; in qlcnic_enable_msix()
811 adapter->drv_sds_rings = adapter->drv_tx_rings; in qlcnic_enable_msix()
831 static int qlcnic_82xx_calculate_msix_vector(struct qlcnic_adapter *adapter) in qlcnic_82xx_calculate_msix_vector() argument
835 num_msix = adapter->drv_sds_rings; in qlcnic_82xx_calculate_msix_vector()
837 if (qlcnic_check_multi_tx(adapter)) in qlcnic_82xx_calculate_msix_vector()
838 num_msix += adapter->drv_tx_rings; in qlcnic_82xx_calculate_msix_vector()
845 static int qlcnic_enable_msi_legacy(struct qlcnic_adapter *adapter) in qlcnic_enable_msi_legacy() argument
850 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_enable_msi_legacy()
851 struct pci_dev *pdev = adapter->pdev; in qlcnic_enable_msi_legacy()
854 adapter->flags |= QLCNIC_MSI_ENABLED; in qlcnic_enable_msi_legacy()
855 offset = msi_tgt_status[adapter->ahw->pci_func]; in qlcnic_enable_msi_legacy()
856 adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter->ahw, in qlcnic_enable_msi_legacy()
859 adapter->msix_entries[0].vector = pdev->irq; in qlcnic_enable_msi_legacy()
866 legacy_intrp = &legacy_intr[adapter->ahw->pci_func]; in qlcnic_enable_msi_legacy()
867 adapter->ahw->int_vec_bit = legacy_intrp->int_vec_bit; in qlcnic_enable_msi_legacy()
869 adapter->tgt_status_reg = qlcnic_get_ioaddr(ahw, offset); in qlcnic_enable_msi_legacy()
871 adapter->tgt_mask_reg = qlcnic_get_ioaddr(ahw, mask_reg); in qlcnic_enable_msi_legacy()
872 adapter->isr_int_vec = qlcnic_get_ioaddr(ahw, ISR_INT_VECTOR); in qlcnic_enable_msi_legacy()
873 adapter->crb_int_state_reg = qlcnic_get_ioaddr(ahw, ISR_INT_STATE_REG); in qlcnic_enable_msi_legacy()
875 adapter->msix_entries[0].vector = pdev->irq; in qlcnic_enable_msi_legacy()
879 static int qlcnic_82xx_setup_intr(struct qlcnic_adapter *adapter) in qlcnic_82xx_setup_intr() argument
883 if (adapter->flags & QLCNIC_TSS_RSS) { in qlcnic_82xx_setup_intr()
884 err = qlcnic_setup_tss_rss_intr(adapter); in qlcnic_82xx_setup_intr()
887 num_msix = adapter->ahw->num_msix; in qlcnic_82xx_setup_intr()
889 num_msix = qlcnic_82xx_calculate_msix_vector(adapter); in qlcnic_82xx_setup_intr()
891 err = qlcnic_enable_msix(adapter, num_msix); in qlcnic_82xx_setup_intr()
895 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { in qlcnic_82xx_setup_intr()
896 qlcnic_disable_multi_tx(adapter); in qlcnic_82xx_setup_intr()
897 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; in qlcnic_82xx_setup_intr()
899 err = qlcnic_enable_msi_legacy(adapter); in qlcnic_82xx_setup_intr()
908 int qlcnic_82xx_mq_intrpt(struct qlcnic_adapter *adapter, int op_type) in qlcnic_82xx_mq_intrpt() argument
910 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_82xx_mq_intrpt()
913 if (qlcnic_check_multi_tx(adapter) && in qlcnic_82xx_mq_intrpt()
915 (adapter->flags & QLCNIC_MSIX_ENABLED)) { in qlcnic_82xx_mq_intrpt()
927 err = qlcnic_82xx_config_intrpt(adapter, 1); in qlcnic_82xx_mq_intrpt()
929 dev_err(&adapter->pdev->dev, in qlcnic_82xx_mq_intrpt()
938 void qlcnic_teardown_intr(struct qlcnic_adapter *adapter) in qlcnic_teardown_intr() argument
940 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_teardown_intr()
941 pci_disable_msix(adapter->pdev); in qlcnic_teardown_intr()
942 if (adapter->flags & QLCNIC_MSI_ENABLED) in qlcnic_teardown_intr()
943 pci_disable_msi(adapter->pdev); in qlcnic_teardown_intr()
945 kfree(adapter->msix_entries); in qlcnic_teardown_intr()
946 adapter->msix_entries = NULL; in qlcnic_teardown_intr()
948 if (adapter->ahw->intr_tbl) { in qlcnic_teardown_intr()
949 vfree(adapter->ahw->intr_tbl); in qlcnic_teardown_intr()
950 adapter->ahw->intr_tbl = NULL; in qlcnic_teardown_intr()
960 static int qlcnic_get_act_pci_func(struct qlcnic_adapter *adapter) in qlcnic_get_act_pci_func() argument
962 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_get_act_pci_func()
966 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) { in qlcnic_get_act_pci_func()
985 ret = qlcnic_get_pci_info(adapter, pci_info); in qlcnic_get_act_pci_func()
990 static bool qlcnic_port_eswitch_cfg_capability(struct qlcnic_adapter *adapter) in qlcnic_port_eswitch_cfg_capability() argument
994 if (qlcnic_84xx_check(adapter)) { in qlcnic_port_eswitch_cfg_capability()
996 } else if (qlcnic_83xx_check(adapter)) { in qlcnic_port_eswitch_cfg_capability()
997 if (adapter->ahw->extra_capability[0] & in qlcnic_port_eswitch_cfg_capability()
1007 int qlcnic_init_pci_info(struct qlcnic_adapter *adapter) in qlcnic_init_pci_info() argument
1009 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_init_pci_info()
1019 ret = qlcnic_get_pci_info(adapter, pci_info); in qlcnic_init_pci_info()
1025 adapter->npars = kzalloc(sizeof(struct qlcnic_npar_info) * in qlcnic_init_pci_info()
1027 if (!adapter->npars) { in qlcnic_init_pci_info()
1032 adapter->eswitch = kzalloc(sizeof(struct qlcnic_eswitch) * in qlcnic_init_pci_info()
1034 if (!adapter->eswitch) { in qlcnic_init_pci_info()
1044 dev_err(&adapter->pdev->dev, "%s: Invalid function 0x%x, max 0x%x\n", in qlcnic_init_pci_info()
1053 if (qlcnic_port_eswitch_cfg_capability(adapter)) { in qlcnic_init_pci_info()
1054 if (!qlcnic_83xx_set_port_eswitch_status(adapter, pfn, in qlcnic_init_pci_info()
1056 adapter->npars[j].eswitch_status = true; in qlcnic_init_pci_info()
1060 adapter->npars[j].eswitch_status = true; in qlcnic_init_pci_info()
1063 adapter->npars[j].pci_func = pfn; in qlcnic_init_pci_info()
1064 adapter->npars[j].active = (u8)pci_info[i].active; in qlcnic_init_pci_info()
1065 adapter->npars[j].type = (u8)pci_info[i].type; in qlcnic_init_pci_info()
1066 adapter->npars[j].phy_port = (u8)pci_info[i].default_port; in qlcnic_init_pci_info()
1067 adapter->npars[j].min_bw = pci_info[i].tx_min_bw; in qlcnic_init_pci_info()
1068 adapter->npars[j].max_bw = pci_info[i].tx_max_bw; in qlcnic_init_pci_info()
1070 memcpy(&adapter->npars[j].mac, &pci_info[i].mac, ETH_ALEN); in qlcnic_init_pci_info()
1077 if (!qlcnic_port_eswitch_cfg_capability(adapter)) { in qlcnic_init_pci_info()
1079 adapter->eswitch[i].flags |= QLCNIC_SWITCH_ENABLE; in qlcnic_init_pci_info()
1086 kfree(adapter->eswitch); in qlcnic_init_pci_info()
1087 adapter->eswitch = NULL; in qlcnic_init_pci_info()
1089 kfree(adapter->npars); in qlcnic_init_pci_info()
1090 adapter->npars = NULL; in qlcnic_init_pci_info()
1098 qlcnic_set_function_modes(struct qlcnic_adapter *adapter) in qlcnic_set_function_modes() argument
1103 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_set_function_modes()
1105 ret = qlcnic_api_lock(adapter); in qlcnic_set_function_modes()
1110 data = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE); in qlcnic_set_function_modes()
1113 QLC_SHARED_REG_WR32(adapter, QLCNIC_DRV_OP_MODE, data); in qlcnic_set_function_modes()
1114 qlcnic_api_unlock(adapter); in qlcnic_set_function_modes()
1119 static void qlcnic_check_vf(struct qlcnic_adapter *adapter, in qlcnic_check_vf() argument
1125 adapter->ahw->fw_hal_version = QLC_SHARED_REG_RD32(adapter, in qlcnic_check_vf()
1129 qlcnic_get_func_no(adapter); in qlcnic_check_vf()
1132 op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE); in qlcnic_check_vf()
1136 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); in qlcnic_check_vf()
1139 adapter->ahw->op_mode = QLCNIC_NON_PRIV_FUNC; in qlcnic_check_vf()
1140 dev_info(&adapter->pdev->dev, in qlcnic_check_vf()
1142 adapter->ahw->fw_hal_version); in qlcnic_check_vf()
1143 adapter->nic_ops = &qlcnic_vf_ops; in qlcnic_check_vf()
1145 adapter->nic_ops = &qlcnic_ops; in qlcnic_check_vf()
1202 static bool qlcnic_validate_subsystem_id(struct qlcnic_adapter *adapter, in qlcnic_validate_subsystem_id() argument
1205 struct pci_dev *pdev = adapter->pdev; in qlcnic_validate_subsystem_id()
1223 static void qlcnic_get_board_name(struct qlcnic_adapter *adapter, char *name) in qlcnic_get_board_name() argument
1225 struct pci_dev *pdev = adapter->pdev; in qlcnic_get_board_name()
1231 qlcnic_validate_subsystem_id(adapter, i)) { in qlcnic_get_board_name()
1238 sprintf(name, "%pM Gigabit Ethernet", adapter->mac_addr); in qlcnic_get_board_name()
1240 sprintf(name, "%pM: %s" , adapter->mac_addr, in qlcnic_get_board_name()
1245 qlcnic_check_options(struct qlcnic_adapter *adapter) in qlcnic_check_options() argument
1249 struct pci_dev *pdev = adapter->pdev; in qlcnic_check_options()
1250 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_options()
1253 prev_fw_version = adapter->fw_version; in qlcnic_check_options()
1255 fw_major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR); in qlcnic_check_options()
1256 fw_minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR); in qlcnic_check_options()
1257 fw_build = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB); in qlcnic_check_options()
1259 adapter->fw_version = QLCNIC_VERSION_CODE(fw_major, fw_minor, fw_build); in qlcnic_check_options()
1261 err = qlcnic_get_board_info(adapter); in qlcnic_check_options()
1268 adapter->fw_version > prev_fw_version) { in qlcnic_check_options()
1270 if (!qlcnic_fw_cmd_get_minidump_temp(adapter)) in qlcnic_check_options()
1279 if (adapter->ahw->port_type == QLCNIC_XGBE) { in qlcnic_check_options()
1280 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { in qlcnic_check_options()
1281 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF; in qlcnic_check_options()
1282 adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF; in qlcnic_check_options()
1284 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1285 adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1288 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1289 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_check_options()
1291 } else if (adapter->ahw->port_type == QLCNIC_GBE) { in qlcnic_check_options()
1292 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1293 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1294 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1295 adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G; in qlcnic_check_options()
1298 adapter->ahw->msix_supported = !!qlcnic_use_msi_x; in qlcnic_check_options()
1300 adapter->num_txd = MAX_CMD_DESCRIPTORS; in qlcnic_check_options()
1302 adapter->max_rds_rings = MAX_RDS_RINGS; in qlcnic_check_options()
1306 qlcnic_initialize_nic(struct qlcnic_adapter *adapter) in qlcnic_initialize_nic() argument
1312 err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); in qlcnic_initialize_nic()
1316 adapter->ahw->physical_port = (u8)nic_info.phys_port; in qlcnic_initialize_nic()
1317 adapter->ahw->switch_mode = nic_info.switch_mode; in qlcnic_initialize_nic()
1318 adapter->ahw->max_tx_ques = nic_info.max_tx_ques; in qlcnic_initialize_nic()
1319 adapter->ahw->max_rx_ques = nic_info.max_rx_ques; in qlcnic_initialize_nic()
1320 adapter->ahw->capabilities = nic_info.capabilities; in qlcnic_initialize_nic()
1322 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { in qlcnic_initialize_nic()
1324 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err); in qlcnic_initialize_nic()
1327 adapter->ahw->extra_capability[0] = temp; in qlcnic_initialize_nic()
1329 adapter->ahw->extra_capability[0] = 0; in qlcnic_initialize_nic()
1332 adapter->ahw->max_mac_filters = nic_info.max_mac_filters; in qlcnic_initialize_nic()
1333 adapter->ahw->max_mtu = nic_info.max_mtu; in qlcnic_initialize_nic()
1335 if (adapter->ahw->capabilities & BIT_6) { in qlcnic_initialize_nic()
1336 adapter->flags |= QLCNIC_ESWITCH_ENABLED; in qlcnic_initialize_nic()
1337 adapter->ahw->nic_mode = QLCNIC_VNIC_MODE; in qlcnic_initialize_nic()
1338 adapter->max_tx_rings = QLCNIC_MAX_HW_VNIC_TX_RINGS; in qlcnic_initialize_nic()
1339 adapter->max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS; in qlcnic_initialize_nic()
1341 dev_info(&adapter->pdev->dev, "vNIC mode enabled.\n"); in qlcnic_initialize_nic()
1343 adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; in qlcnic_initialize_nic()
1344 adapter->max_tx_rings = QLCNIC_MAX_HW_TX_RINGS; in qlcnic_initialize_nic()
1345 adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; in qlcnic_initialize_nic()
1346 adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; in qlcnic_initialize_nic()
1352 void qlcnic_set_vlan_config(struct qlcnic_adapter *adapter, in qlcnic_set_vlan_config() argument
1356 adapter->flags &= ~QLCNIC_TAGGING_ENABLED; in qlcnic_set_vlan_config()
1358 adapter->flags |= QLCNIC_TAGGING_ENABLED; in qlcnic_set_vlan_config()
1361 adapter->rx_pvid = esw_cfg->vlan_id; in qlcnic_set_vlan_config()
1362 adapter->tx_pvid = esw_cfg->vlan_id; in qlcnic_set_vlan_config()
1364 adapter->rx_pvid = 0; in qlcnic_set_vlan_config()
1365 adapter->tx_pvid = 0; in qlcnic_set_vlan_config()
1372 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_vlan_rx_add() local
1375 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_vlan_rx_add()
1376 err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 1); in qlcnic_vlan_rx_add()
1385 set_bit(vid, adapter->vlans); in qlcnic_vlan_rx_add()
1392 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_vlan_rx_del() local
1395 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_vlan_rx_del()
1396 err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 0); in qlcnic_vlan_rx_del()
1406 clear_bit(vid, adapter->vlans); in qlcnic_vlan_rx_del()
1410 void qlcnic_set_eswitch_port_features(struct qlcnic_adapter *adapter, in qlcnic_set_eswitch_port_features() argument
1413 adapter->flags &= ~(QLCNIC_MACSPOOF | QLCNIC_MAC_OVERRIDE_DISABLED | in qlcnic_set_eswitch_port_features()
1417 adapter->flags |= QLCNIC_MACSPOOF; in qlcnic_set_eswitch_port_features()
1420 adapter->flags |= QLCNIC_MAC_OVERRIDE_DISABLED; in qlcnic_set_eswitch_port_features()
1423 adapter->flags |= QLCNIC_PROMISC_DISABLED; in qlcnic_set_eswitch_port_features()
1426 int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *adapter) in qlcnic_set_eswitch_port_config() argument
1430 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) in qlcnic_set_eswitch_port_config()
1433 esw_cfg.pci_func = adapter->ahw->pci_func; in qlcnic_set_eswitch_port_config()
1434 if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg)) in qlcnic_set_eswitch_port_config()
1436 qlcnic_set_vlan_config(adapter, &esw_cfg); in qlcnic_set_eswitch_port_config()
1437 qlcnic_set_eswitch_port_features(adapter, &esw_cfg); in qlcnic_set_eswitch_port_config()
1438 qlcnic_set_netdev_features(adapter, &esw_cfg); in qlcnic_set_eswitch_port_config()
1443 void qlcnic_set_netdev_features(struct qlcnic_adapter *adapter, in qlcnic_set_netdev_features() argument
1446 struct net_device *netdev = adapter->netdev; in qlcnic_set_netdev_features()
1448 if (qlcnic_83xx_check(adapter)) in qlcnic_set_netdev_features()
1451 adapter->offload_flags = esw_cfg->offload_flags; in qlcnic_set_netdev_features()
1452 adapter->flags |= QLCNIC_APP_CHANGED_FLAGS; in qlcnic_set_netdev_features()
1454 adapter->flags &= ~QLCNIC_APP_CHANGED_FLAGS; in qlcnic_set_netdev_features()
1458 qlcnic_check_eswitch_mode(struct qlcnic_adapter *adapter) in qlcnic_check_eswitch_mode() argument
1463 err = qlcnic_initialize_nic(adapter); in qlcnic_check_eswitch_mode()
1467 if (adapter->flags & QLCNIC_ADAPTER_INITIALIZED) in qlcnic_check_eswitch_mode()
1470 op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE); in qlcnic_check_eswitch_mode()
1471 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); in qlcnic_check_eswitch_mode()
1476 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func); in qlcnic_check_eswitch_mode()
1478 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { in qlcnic_check_eswitch_mode()
1480 adapter->ahw->op_mode = QLCNIC_MGMT_FUNC; in qlcnic_check_eswitch_mode()
1481 err = qlcnic_init_pci_info(adapter); in qlcnic_check_eswitch_mode()
1485 qlcnic_set_function_modes(adapter); in qlcnic_check_eswitch_mode()
1486 dev_info(&adapter->pdev->dev, in qlcnic_check_eswitch_mode()
1488 adapter->ahw->fw_hal_version); in qlcnic_check_eswitch_mode()
1490 adapter->ahw->op_mode = QLCNIC_PRIV_FUNC; in qlcnic_check_eswitch_mode()
1491 dev_info(&adapter->pdev->dev, in qlcnic_check_eswitch_mode()
1493 adapter->ahw->fw_hal_version); in qlcnic_check_eswitch_mode()
1496 adapter->ahw->nic_mode = QLCNIC_DEFAULT_MODE; in qlcnic_check_eswitch_mode()
1499 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; in qlcnic_check_eswitch_mode()
1504 int qlcnic_set_default_offload_settings(struct qlcnic_adapter *adapter) in qlcnic_set_default_offload_settings() argument
1510 if (adapter->need_fw_reset) in qlcnic_set_default_offload_settings()
1513 for (i = 0; i < adapter->ahw->total_nic_func; i++) { in qlcnic_set_default_offload_settings()
1514 if (!adapter->npars[i].eswitch_status) in qlcnic_set_default_offload_settings()
1518 esw_cfg.pci_func = adapter->npars[i].pci_func; in qlcnic_set_default_offload_settings()
1521 if (qlcnic_82xx_check(adapter)) { in qlcnic_set_default_offload_settings()
1523 if (QLCNIC_IS_TSO_CAPABLE(adapter)) in qlcnic_set_default_offload_settings()
1526 if (qlcnic_config_switch_port(adapter, &esw_cfg)) in qlcnic_set_default_offload_settings()
1528 npar = &adapter->npars[i]; in qlcnic_set_default_offload_settings()
1542 qlcnic_reset_eswitch_config(struct qlcnic_adapter *adapter, in qlcnic_reset_eswitch_config() argument
1554 if (qlcnic_config_switch_port(adapter, &esw_cfg)) in qlcnic_reset_eswitch_config()
1558 if (qlcnic_config_switch_port(adapter, &esw_cfg)) in qlcnic_reset_eswitch_config()
1564 int qlcnic_reset_npar_config(struct qlcnic_adapter *adapter) in qlcnic_reset_npar_config() argument
1571 if (qlcnic_82xx_check(adapter)) in qlcnic_reset_npar_config()
1572 if (!adapter->need_fw_reset) in qlcnic_reset_npar_config()
1576 for (i = 0; i < adapter->ahw->total_nic_func; i++) { in qlcnic_reset_npar_config()
1577 npar = &adapter->npars[i]; in qlcnic_reset_npar_config()
1579 if (!adapter->npars[i].eswitch_status) in qlcnic_reset_npar_config()
1583 err = qlcnic_get_nic_info(adapter, &nic_info, pci_func); in qlcnic_reset_npar_config()
1588 err = qlcnic_set_nic_info(adapter, &nic_info); in qlcnic_reset_npar_config()
1593 err = qlcnic_config_port_mirroring(adapter, in qlcnic_reset_npar_config()
1599 err = qlcnic_reset_eswitch_config(adapter, npar, pci_func); in qlcnic_reset_npar_config()
1606 static int qlcnic_check_npar_opertional(struct qlcnic_adapter *adapter) in qlcnic_check_npar_opertional() argument
1611 if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC) in qlcnic_check_npar_opertional()
1614 npar_state = QLC_SHARED_REG_RD32(adapter, in qlcnic_check_npar_opertional()
1618 npar_state = QLC_SHARED_REG_RD32(adapter, in qlcnic_check_npar_opertional()
1622 dev_err(&adapter->pdev->dev, in qlcnic_check_npar_opertional()
1630 qlcnic_set_mgmt_operations(struct qlcnic_adapter *adapter) in qlcnic_set_mgmt_operations() argument
1634 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) || in qlcnic_set_mgmt_operations()
1635 adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) in qlcnic_set_mgmt_operations()
1638 err = qlcnic_set_default_offload_settings(adapter); in qlcnic_set_mgmt_operations()
1642 err = qlcnic_reset_npar_config(adapter); in qlcnic_set_mgmt_operations()
1646 qlcnic_dev_set_npar_ready(adapter); in qlcnic_set_mgmt_operations()
1651 static int qlcnic_82xx_start_firmware(struct qlcnic_adapter *adapter) in qlcnic_82xx_start_firmware() argument
1655 err = qlcnic_can_start_firmware(adapter); in qlcnic_82xx_start_firmware()
1662 qlcnic_request_firmware(adapter); in qlcnic_82xx_start_firmware()
1664 err = qlcnic_check_flash_fw_ver(adapter); in qlcnic_82xx_start_firmware()
1668 adapter->ahw->fw_type = QLCNIC_FLASH_ROMIMAGE; in qlcnic_82xx_start_firmware()
1671 err = qlcnic_need_fw_reset(adapter); in qlcnic_82xx_start_firmware()
1675 err = qlcnic_pinit_from_rom(adapter); in qlcnic_82xx_start_firmware()
1679 err = qlcnic_load_firmware(adapter); in qlcnic_82xx_start_firmware()
1683 qlcnic_release_firmware(adapter); in qlcnic_82xx_start_firmware()
1684 QLCWR32(adapter, CRB_DRIVER_VERSION, QLCNIC_DRIVER_VERSION); in qlcnic_82xx_start_firmware()
1687 err = qlcnic_check_fw_status(adapter); in qlcnic_82xx_start_firmware()
1691 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY); in qlcnic_82xx_start_firmware()
1692 qlcnic_idc_debug_info(adapter, 1); in qlcnic_82xx_start_firmware()
1693 err = qlcnic_check_eswitch_mode(adapter); in qlcnic_82xx_start_firmware()
1695 dev_err(&adapter->pdev->dev, in qlcnic_82xx_start_firmware()
1699 err = qlcnic_set_mgmt_operations(adapter); in qlcnic_82xx_start_firmware()
1703 qlcnic_check_options(adapter); in qlcnic_82xx_start_firmware()
1704 adapter->need_fw_reset = 0; in qlcnic_82xx_start_firmware()
1706 qlcnic_release_firmware(adapter); in qlcnic_82xx_start_firmware()
1710 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_FAILED); in qlcnic_82xx_start_firmware()
1711 dev_err(&adapter->pdev->dev, "Device state set to failed\n"); in qlcnic_82xx_start_firmware()
1713 qlcnic_release_firmware(adapter); in qlcnic_82xx_start_firmware()
1718 qlcnic_request_irq(struct qlcnic_adapter *adapter) in qlcnic_request_irq() argument
1726 struct net_device *netdev = adapter->netdev; in qlcnic_request_irq()
1727 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_request_irq()
1729 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_request_irq()
1730 if (qlcnic_82xx_check(adapter)) in qlcnic_request_irq()
1734 if (!QLCNIC_IS_MSI_FAMILY(adapter)) in qlcnic_request_irq()
1738 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_request_irq()
1740 else if (adapter->flags & QLCNIC_MSI_ENABLED) in qlcnic_request_irq()
1744 if (qlcnic_82xx_check(adapter)) in qlcnic_request_irq()
1750 adapter->irq = netdev->irq; in qlcnic_request_irq()
1752 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) { in qlcnic_request_irq()
1753 if (qlcnic_82xx_check(adapter) || in qlcnic_request_irq()
1754 (qlcnic_83xx_check(adapter) && in qlcnic_request_irq()
1755 (adapter->flags & QLCNIC_MSIX_ENABLED))) { in qlcnic_request_irq()
1756 num_sds_rings = adapter->drv_sds_rings; in qlcnic_request_irq()
1759 if (qlcnic_82xx_check(adapter) && in qlcnic_request_irq()
1760 !qlcnic_check_multi_tx(adapter) && in qlcnic_request_irq()
1762 if (!(adapter->flags & in qlcnic_request_irq()
1784 if ((qlcnic_82xx_check(adapter) && in qlcnic_request_irq()
1785 qlcnic_check_multi_tx(adapter)) || in qlcnic_request_irq()
1786 (qlcnic_83xx_check(adapter) && in qlcnic_request_irq()
1787 (adapter->flags & QLCNIC_MSIX_ENABLED) && in qlcnic_request_irq()
1788 !(adapter->flags & QLCNIC_TX_INTR_SHARED))) { in qlcnic_request_irq()
1790 for (ring = 0; ring < adapter->drv_tx_rings; in qlcnic_request_irq()
1792 tx_ring = &adapter->tx_ring[ring]; in qlcnic_request_irq()
1806 qlcnic_free_irq(struct qlcnic_adapter *adapter) in qlcnic_free_irq() argument
1812 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_free_irq()
1814 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) { in qlcnic_free_irq()
1815 if (qlcnic_82xx_check(adapter) || in qlcnic_free_irq()
1816 (qlcnic_83xx_check(adapter) && in qlcnic_free_irq()
1817 (adapter->flags & QLCNIC_MSIX_ENABLED))) { in qlcnic_free_irq()
1818 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_free_irq()
1823 if ((qlcnic_83xx_check(adapter) && in qlcnic_free_irq()
1824 !(adapter->flags & QLCNIC_TX_INTR_SHARED)) || in qlcnic_free_irq()
1825 (qlcnic_82xx_check(adapter) && in qlcnic_free_irq()
1826 qlcnic_check_multi_tx(adapter))) { in qlcnic_free_irq()
1827 for (ring = 0; ring < adapter->drv_tx_rings; in qlcnic_free_irq()
1829 tx_ring = &adapter->tx_ring[ring]; in qlcnic_free_irq()
1837 static void qlcnic_get_lro_mss_capability(struct qlcnic_adapter *adapter) in qlcnic_get_lro_mss_capability() argument
1841 if (qlcnic_82xx_check(adapter)) { in qlcnic_get_lro_mss_capability()
1842 if (adapter->ahw->extra_capability[0] & in qlcnic_get_lro_mss_capability()
1844 adapter->flags |= QLCNIC_FW_LRO_MSS_CAP; in qlcnic_get_lro_mss_capability()
1846 capab = adapter->ahw->capabilities; in qlcnic_get_lro_mss_capability()
1848 adapter->flags |= QLCNIC_FW_LRO_MSS_CAP; in qlcnic_get_lro_mss_capability()
1852 static int qlcnic_config_def_intr_coalesce(struct qlcnic_adapter *adapter) in qlcnic_config_def_intr_coalesce() argument
1854 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_config_def_intr_coalesce()
1860 if (qlcnic_83xx_check(adapter)) { in qlcnic_config_def_intr_coalesce()
1867 err = qlcnic_83xx_set_rx_tx_intr_coal(adapter); in qlcnic_config_def_intr_coalesce()
1873 err = qlcnic_82xx_set_rx_coalesce(adapter); in qlcnic_config_def_intr_coalesce()
1879 int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) in __qlcnic_up() argument
1884 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) in __qlcnic_up()
1887 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) in __qlcnic_up()
1890 if (qlcnic_set_eswitch_port_config(adapter)) in __qlcnic_up()
1893 qlcnic_get_lro_mss_capability(adapter); in __qlcnic_up()
1895 if (qlcnic_fw_create_ctx(adapter)) in __qlcnic_up()
1898 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in __qlcnic_up()
1899 rds_ring = &adapter->recv_ctx->rds_rings[ring]; in __qlcnic_up()
1900 qlcnic_post_rx_buffers(adapter, rds_ring, ring); in __qlcnic_up()
1904 qlcnic_fw_cmd_set_mtu(adapter, netdev->mtu); in __qlcnic_up()
1906 adapter->ahw->linkup = 0; in __qlcnic_up()
1908 if (adapter->drv_sds_rings > 1) in __qlcnic_up()
1909 qlcnic_config_rss(adapter, 1); in __qlcnic_up()
1911 qlcnic_config_def_intr_coalesce(adapter); in __qlcnic_up()
1914 qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED); in __qlcnic_up()
1916 set_bit(__QLCNIC_DEV_UP, &adapter->state); in __qlcnic_up()
1917 qlcnic_napi_enable(adapter); in __qlcnic_up()
1919 qlcnic_linkevent_request(adapter, 1); in __qlcnic_up()
1921 adapter->ahw->reset_context = 0; in __qlcnic_up()
1926 int qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev) in qlcnic_up() argument
1932 err = __qlcnic_up(adapter, netdev); in qlcnic_up()
1938 void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) in __qlcnic_down() argument
1942 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) in __qlcnic_down()
1945 if (!test_and_clear_bit(__QLCNIC_DEV_UP, &adapter->state)) in __qlcnic_down()
1950 adapter->ahw->linkup = 0; in __qlcnic_down()
1953 qlcnic_free_mac_list(adapter); in __qlcnic_down()
1955 if (adapter->fhash.fnum) in __qlcnic_down()
1956 qlcnic_delete_lb_filters(adapter); in __qlcnic_down()
1958 qlcnic_nic_set_promisc(adapter, QLCNIC_NIU_NON_PROMISC_MODE); in __qlcnic_down()
1959 if (qlcnic_sriov_vf_check(adapter)) in __qlcnic_down()
1960 qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc); in __qlcnic_down()
1962 qlcnic_napi_disable(adapter); in __qlcnic_down()
1964 qlcnic_fw_destroy_ctx(adapter); in __qlcnic_down()
1965 adapter->flags &= ~QLCNIC_FW_LRO_MSS_CAP; in __qlcnic_down()
1967 qlcnic_reset_rx_buffers_list(adapter); in __qlcnic_down()
1969 for (ring = 0; ring < adapter->drv_tx_rings; ring++) in __qlcnic_down()
1970 qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]); in __qlcnic_down()
1975 void qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) in qlcnic_down() argument
1979 __qlcnic_down(adapter, netdev); in qlcnic_down()
1985 qlcnic_attach(struct qlcnic_adapter *adapter) in qlcnic_attach() argument
1987 struct net_device *netdev = adapter->netdev; in qlcnic_attach()
1988 struct pci_dev *pdev = adapter->pdev; in qlcnic_attach()
1991 if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) in qlcnic_attach()
1994 err = qlcnic_napi_add(adapter, netdev); in qlcnic_attach()
1998 err = qlcnic_alloc_sw_resources(adapter); in qlcnic_attach()
2004 err = qlcnic_alloc_hw_resources(adapter); in qlcnic_attach()
2010 err = qlcnic_request_irq(adapter); in qlcnic_attach()
2016 qlcnic_create_sysfs_entries(adapter); in qlcnic_attach()
2019 if (qlcnic_encap_rx_offload(adapter)) in qlcnic_attach()
2023 adapter->is_up = QLCNIC_ADAPTER_UP_MAGIC; in qlcnic_attach()
2027 qlcnic_free_hw_resources(adapter); in qlcnic_attach()
2029 qlcnic_free_sw_resources(adapter); in qlcnic_attach()
2031 qlcnic_napi_del(adapter); in qlcnic_attach()
2035 void qlcnic_detach(struct qlcnic_adapter *adapter) in qlcnic_detach() argument
2037 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) in qlcnic_detach()
2040 qlcnic_remove_sysfs_entries(adapter); in qlcnic_detach()
2042 qlcnic_free_hw_resources(adapter); in qlcnic_detach()
2043 qlcnic_release_rx_buffers(adapter); in qlcnic_detach()
2044 qlcnic_free_irq(adapter); in qlcnic_detach()
2045 qlcnic_napi_del(adapter); in qlcnic_detach()
2046 qlcnic_free_sw_resources(adapter); in qlcnic_detach()
2048 adapter->is_up = 0; in qlcnic_detach()
2053 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_diag_free_res() local
2055 int drv_tx_rings = adapter->drv_tx_rings; in qlcnic_diag_free_res()
2058 clear_bit(__QLCNIC_DEV_UP, &adapter->state); in qlcnic_diag_free_res()
2059 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_diag_free_res()
2060 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_diag_free_res()
2061 sds_ring = &adapter->recv_ctx->sds_rings[ring]; in qlcnic_diag_free_res()
2062 qlcnic_disable_sds_intr(adapter, sds_ring); in qlcnic_diag_free_res()
2066 qlcnic_fw_destroy_ctx(adapter); in qlcnic_diag_free_res()
2068 qlcnic_detach(adapter); in qlcnic_diag_free_res()
2070 adapter->ahw->diag_test = 0; in qlcnic_diag_free_res()
2071 adapter->drv_sds_rings = drv_sds_rings; in qlcnic_diag_free_res()
2072 adapter->drv_tx_rings = drv_tx_rings; in qlcnic_diag_free_res()
2074 if (qlcnic_attach(adapter)) in qlcnic_diag_free_res()
2078 __qlcnic_up(adapter, netdev); in qlcnic_diag_free_res()
2083 static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) in qlcnic_alloc_adapter_resources() argument
2085 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_alloc_adapter_resources()
2088 adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context), in qlcnic_alloc_adapter_resources()
2090 if (!adapter->recv_ctx) { in qlcnic_alloc_adapter_resources()
2095 if (qlcnic_83xx_check(adapter)) { in qlcnic_alloc_adapter_resources()
2108 memset(&adapter->stats, 0, sizeof(adapter->stats)); in qlcnic_alloc_adapter_resources()
2113 static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter) in qlcnic_free_adapter_resources() argument
2115 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; in qlcnic_free_adapter_resources()
2117 kfree(adapter->recv_ctx); in qlcnic_free_adapter_resources()
2118 adapter->recv_ctx = NULL; in qlcnic_free_adapter_resources()
2126 dma_free_coherent(&adapter->pdev->dev, QLC_PEX_DMA_READ_SIZE, in qlcnic_free_adapter_resources()
2131 kfree(adapter->ahw->reset.buff); in qlcnic_free_adapter_resources()
2132 adapter->ahw->fw_dump.tmpl_hdr = NULL; in qlcnic_free_adapter_resources()
2137 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_diag_alloc_res() local
2146 __qlcnic_down(adapter, netdev); in qlcnic_diag_alloc_res()
2148 qlcnic_detach(adapter); in qlcnic_diag_alloc_res()
2150 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; in qlcnic_diag_alloc_res()
2151 adapter->ahw->diag_test = test; in qlcnic_diag_alloc_res()
2152 adapter->ahw->linkup = 0; in qlcnic_diag_alloc_res()
2154 ret = qlcnic_attach(adapter); in qlcnic_diag_alloc_res()
2160 ret = qlcnic_fw_create_ctx(adapter); in qlcnic_diag_alloc_res()
2162 qlcnic_detach(adapter); in qlcnic_diag_alloc_res()
2167 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in qlcnic_diag_alloc_res()
2168 rds_ring = &adapter->recv_ctx->rds_rings[ring]; in qlcnic_diag_alloc_res()
2169 qlcnic_post_rx_buffers(adapter, rds_ring, ring); in qlcnic_diag_alloc_res()
2172 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_diag_alloc_res()
2173 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_diag_alloc_res()
2174 sds_ring = &adapter->recv_ctx->sds_rings[ring]; in qlcnic_diag_alloc_res()
2175 qlcnic_enable_sds_intr(adapter, sds_ring); in qlcnic_diag_alloc_res()
2179 if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { in qlcnic_diag_alloc_res()
2180 adapter->ahw->loopback_state = 0; in qlcnic_diag_alloc_res()
2181 qlcnic_linkevent_request(adapter, 1); in qlcnic_diag_alloc_res()
2184 set_bit(__QLCNIC_DEV_UP, &adapter->state); in qlcnic_diag_alloc_res()
2191 qlcnic_reset_hw_context(struct qlcnic_adapter *adapter) in qlcnic_reset_hw_context() argument
2193 struct net_device *netdev = adapter->netdev; in qlcnic_reset_hw_context()
2195 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_reset_hw_context()
2200 qlcnic_down(adapter, netdev); in qlcnic_reset_hw_context()
2202 qlcnic_up(adapter, netdev); in qlcnic_reset_hw_context()
2206 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_reset_hw_context()
2207 netdev_info(adapter->netdev, "%s: soft reset complete\n", __func__); in qlcnic_reset_hw_context()
2212 qlcnic_reset_context(struct qlcnic_adapter *adapter) in qlcnic_reset_context() argument
2215 struct net_device *netdev = adapter->netdev; in qlcnic_reset_context()
2217 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_reset_context()
2220 if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) { in qlcnic_reset_context()
2225 __qlcnic_down(adapter, netdev); in qlcnic_reset_context()
2227 qlcnic_detach(adapter); in qlcnic_reset_context()
2230 err = qlcnic_attach(adapter); in qlcnic_reset_context()
2232 __qlcnic_up(adapter, netdev); in qlcnic_reset_context()
2240 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_reset_context()
2244 static void qlcnic_82xx_set_mac_filter_count(struct qlcnic_adapter *adapter) in qlcnic_82xx_set_mac_filter_count() argument
2246 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_82xx_set_mac_filter_count()
2260 static int qlcnic_set_real_num_queues(struct qlcnic_adapter *adapter, in qlcnic_set_real_num_queues() argument
2263 struct net_device *netdev = adapter->netdev; in qlcnic_set_real_num_queues()
2286 qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev, in qlcnic_setup_netdev() argument
2290 struct pci_dev *pdev = adapter->pdev; in qlcnic_setup_netdev()
2292 adapter->rx_csum = 1; in qlcnic_setup_netdev()
2293 adapter->ahw->mc_enabled = 0; in qlcnic_setup_netdev()
2294 qlcnic_set_mac_filter_count(adapter); in qlcnic_setup_netdev()
2301 netdev->ethtool_ops = (qlcnic_sriov_vf_check(adapter)) ? in qlcnic_setup_netdev()
2310 if (QLCNIC_IS_TSO_CAPABLE(adapter)) { in qlcnic_setup_netdev()
2320 if (qlcnic_vlan_tx_check(adapter)) in qlcnic_setup_netdev()
2323 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_setup_netdev()
2326 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO) in qlcnic_setup_netdev()
2329 if (qlcnic_encap_tx_offload(adapter)) { in qlcnic_setup_netdev()
2339 if (qlcnic_encap_rx_offload(adapter)) in qlcnic_setup_netdev()
2344 netdev->irq = adapter->msix_entries[0].vector; in qlcnic_setup_netdev()
2346 err = qlcnic_set_real_num_queues(adapter, adapter->drv_tx_rings, in qlcnic_setup_netdev()
2347 adapter->drv_sds_rings); in qlcnic_setup_netdev()
2351 qlcnic_dcb_init_dcbnl_ops(adapter->dcb); in qlcnic_setup_netdev()
2378 void qlcnic_free_tx_rings(struct qlcnic_adapter *adapter) in qlcnic_free_tx_rings() argument
2383 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_free_tx_rings()
2384 tx_ring = &adapter->tx_ring[ring]; in qlcnic_free_tx_rings()
2390 kfree(adapter->tx_ring); in qlcnic_free_tx_rings()
2393 int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter, in qlcnic_alloc_tx_rings() argument
2400 tx_ring = kcalloc(adapter->drv_tx_rings, in qlcnic_alloc_tx_rings()
2405 adapter->tx_ring = tx_ring; in qlcnic_alloc_tx_rings()
2407 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_alloc_tx_rings()
2408 tx_ring = &adapter->tx_ring[ring]; in qlcnic_alloc_tx_rings()
2409 tx_ring->num_desc = adapter->num_txd; in qlcnic_alloc_tx_rings()
2413 qlcnic_free_tx_rings(adapter); in qlcnic_alloc_tx_rings()
2420 if (qlcnic_83xx_check(adapter) || in qlcnic_alloc_tx_rings()
2421 (qlcnic_82xx_check(adapter) && qlcnic_check_multi_tx(adapter))) { in qlcnic_alloc_tx_rings()
2422 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_alloc_tx_rings()
2423 tx_ring = &adapter->tx_ring[ring]; in qlcnic_alloc_tx_rings()
2424 tx_ring->adapter = adapter; in qlcnic_alloc_tx_rings()
2425 if (adapter->flags & QLCNIC_MSIX_ENABLED) { in qlcnic_alloc_tx_rings()
2426 index = adapter->drv_sds_rings + ring; in qlcnic_alloc_tx_rings()
2427 vector = adapter->msix_entries[index].vector; in qlcnic_alloc_tx_rings()
2436 void qlcnic_set_drv_version(struct qlcnic_adapter *adapter) in qlcnic_set_drv_version() argument
2438 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_set_drv_version()
2441 if (qlcnic_82xx_check(adapter)) in qlcnic_set_drv_version()
2443 else if (qlcnic_83xx_check(adapter)) in qlcnic_set_drv_version()
2447 qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd); in qlcnic_set_drv_version()
2451 static void qlcnic_reset_api_lock(struct qlcnic_adapter *adapter) in qlcnic_reset_api_lock() argument
2453 qlcnic_api_lock(adapter); in qlcnic_reset_api_lock()
2454 qlcnic_api_unlock(adapter); in qlcnic_reset_api_lock()
2462 struct qlcnic_adapter *adapter = NULL; in qlcnic_probe() local
2525 adapter = netdev_priv(netdev); in qlcnic_probe()
2526 adapter->netdev = netdev; in qlcnic_probe()
2527 adapter->pdev = pdev; in qlcnic_probe()
2528 adapter->ahw = ahw; in qlcnic_probe()
2530 adapter->qlcnic_wq = create_singlethread_workqueue("qlcnic"); in qlcnic_probe()
2531 if (adapter->qlcnic_wq == NULL) { in qlcnic_probe()
2537 err = qlcnic_alloc_adapter_resources(adapter); in qlcnic_probe()
2541 adapter->dev_rst_time = jiffies; in qlcnic_probe()
2543 ahw->max_vnic_func = qlcnic_get_vnic_func_count(adapter); in qlcnic_probe()
2545 adapter->fdb_mac_learn = true; in qlcnic_probe()
2547 adapter->drv_mac_learn = true; in qlcnic_probe()
2549 rwlock_init(&adapter->ahw->crb_lock); in qlcnic_probe()
2550 mutex_init(&adapter->ahw->mem_lock); in qlcnic_probe()
2552 INIT_LIST_HEAD(&adapter->mac_list); in qlcnic_probe()
2554 qlcnic_register_dcb(adapter); in qlcnic_probe()
2556 if (qlcnic_82xx_check(adapter)) { in qlcnic_probe()
2557 qlcnic_check_vf(adapter, ent); in qlcnic_probe()
2558 adapter->portnum = adapter->ahw->pci_func; in qlcnic_probe()
2559 qlcnic_reset_api_lock(adapter); in qlcnic_probe()
2560 err = qlcnic_start_firmware(adapter); in qlcnic_probe()
2568 if (adapter->ahw->msix_supported) { in qlcnic_probe()
2569 if (qlcnic_check_multi_tx_capability(adapter) == 1) in qlcnic_probe()
2570 qlcnic_set_tx_ring_count(adapter, in qlcnic_probe()
2573 qlcnic_set_tx_ring_count(adapter, in qlcnic_probe()
2575 qlcnic_set_sds_ring_count(adapter, in qlcnic_probe()
2578 qlcnic_set_tx_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_probe()
2579 qlcnic_set_sds_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_probe()
2582 err = qlcnic_setup_idc_param(adapter); in qlcnic_probe()
2586 adapter->flags |= QLCNIC_NEED_FLR; in qlcnic_probe()
2588 } else if (qlcnic_83xx_check(adapter)) { in qlcnic_probe()
2589 qlcnic_83xx_check_vf(adapter, ent); in qlcnic_probe()
2590 adapter->portnum = adapter->ahw->pci_func; in qlcnic_probe()
2591 err = qlcnic_83xx_init(adapter, pci_using_dac); in qlcnic_probe()
2610 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_probe()
2619 if (qlcnic_read_mac_addr(adapter)) in qlcnic_probe()
2622 qlcnic_read_phys_port_id(adapter); in qlcnic_probe()
2624 if (adapter->portnum == 0) { in qlcnic_probe()
2625 qlcnic_get_board_name(adapter, board_name); in qlcnic_probe()
2629 board_name, adapter->ahw->revision_id); in qlcnic_probe()
2632 if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x && in qlcnic_probe()
2637 if (qlcnic_82xx_check(adapter)) { in qlcnic_probe()
2638 qlcnic_dcb_enable(adapter->dcb); in qlcnic_probe()
2639 qlcnic_dcb_get_info(adapter->dcb); in qlcnic_probe()
2640 err = qlcnic_setup_intr(adapter); in qlcnic_probe()
2648 err = qlcnic_get_act_pci_func(adapter); in qlcnic_probe()
2652 if (adapter->portnum == 0) in qlcnic_probe()
2653 qlcnic_set_drv_version(adapter); in qlcnic_probe()
2655 err = qlcnic_setup_netdev(adapter, netdev, pci_using_dac); in qlcnic_probe()
2659 pci_set_drvdata(pdev, adapter); in qlcnic_probe()
2661 if (qlcnic_82xx_check(adapter)) in qlcnic_probe()
2662 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, in qlcnic_probe()
2665 switch (adapter->ahw->port_type) { in qlcnic_probe()
2667 dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n", in qlcnic_probe()
2668 adapter->netdev->name); in qlcnic_probe()
2671 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n", in qlcnic_probe()
2672 adapter->netdev->name); in qlcnic_probe()
2676 if (adapter->drv_mac_learn) in qlcnic_probe()
2677 qlcnic_alloc_lb_filters_mem(adapter); in qlcnic_probe()
2679 qlcnic_add_sysfs(adapter); in qlcnic_probe()
2680 qlcnic_register_hwmon_dev(adapter); in qlcnic_probe()
2684 if (qlcnic_83xx_check(adapter)) in qlcnic_probe()
2685 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_probe()
2688 qlcnic_teardown_intr(adapter); in qlcnic_probe()
2689 qlcnic_cancel_idc_work(adapter); in qlcnic_probe()
2690 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_probe()
2693 qlcnic_free_adapter_resources(adapter); in qlcnic_probe()
2696 destroy_workqueue(adapter->qlcnic_wq); in qlcnic_probe()
2715 set_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state); in qlcnic_probe()
2720 if (qlcnic_83xx_check(adapter)) in qlcnic_probe()
2721 adapter->tgt_status_reg = NULL; in qlcnic_probe()
2729 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_probe()
2733 pci_set_drvdata(pdev, adapter); in qlcnic_probe()
2734 qlcnic_add_sysfs(adapter); in qlcnic_probe()
2741 struct qlcnic_adapter *adapter; in qlcnic_remove() local
2745 adapter = pci_get_drvdata(pdev); in qlcnic_remove()
2746 if (adapter == NULL) in qlcnic_remove()
2749 netdev = adapter->netdev; in qlcnic_remove()
2751 qlcnic_cancel_idc_work(adapter); in qlcnic_remove()
2752 qlcnic_sriov_pf_disable(adapter); in qlcnic_remove()
2753 ahw = adapter->ahw; in qlcnic_remove()
2756 qlcnic_sriov_cleanup(adapter); in qlcnic_remove()
2758 if (qlcnic_83xx_check(adapter)) { in qlcnic_remove()
2759 qlcnic_83xx_initialize_nic(adapter, 0); in qlcnic_remove()
2760 cancel_delayed_work_sync(&adapter->idc_aen_work); in qlcnic_remove()
2761 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_remove()
2762 qlcnic_83xx_detach_mailbox_work(adapter); in qlcnic_remove()
2767 qlcnic_dcb_free(adapter->dcb); in qlcnic_remove()
2768 qlcnic_detach(adapter); in qlcnic_remove()
2769 kfree(adapter->npars); in qlcnic_remove()
2770 kfree(adapter->eswitch); in qlcnic_remove()
2772 if (qlcnic_82xx_check(adapter)) in qlcnic_remove()
2773 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_remove()
2775 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_remove()
2777 qlcnic_free_lb_filters_mem(adapter); in qlcnic_remove()
2779 qlcnic_teardown_intr(adapter); in qlcnic_remove()
2781 qlcnic_remove_sysfs(adapter); in qlcnic_remove()
2783 qlcnic_unregister_hwmon_dev(adapter); in qlcnic_remove()
2785 qlcnic_cleanup_pci_map(adapter->ahw); in qlcnic_remove()
2787 qlcnic_release_firmware(adapter); in qlcnic_remove()
2793 if (adapter->qlcnic_wq) { in qlcnic_remove()
2794 destroy_workqueue(adapter->qlcnic_wq); in qlcnic_remove()
2795 adapter->qlcnic_wq = NULL; in qlcnic_remove()
2798 qlcnic_free_adapter_resources(adapter); in qlcnic_remove()
2826 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_resume() local
2837 return __qlcnic_resume(adapter); in qlcnic_resume()
2843 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_open() local
2846 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) { in qlcnic_open()
2855 err = qlcnic_attach(adapter); in qlcnic_open()
2859 err = __qlcnic_up(adapter, netdev); in qlcnic_open()
2861 qlcnic_detach(adapter); in qlcnic_open()
2871 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_close() local
2873 __qlcnic_down(adapter, netdev); in qlcnic_close()
2880 void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter) in qlcnic_alloc_lb_filters_mem() argument
2884 struct net_device *netdev = adapter->netdev; in qlcnic_alloc_lb_filters_mem()
2888 if (adapter->fhash.fmax && adapter->fhash.fhead) in qlcnic_alloc_lb_filters_mem()
2891 act_pci_func = adapter->ahw->total_nic_func; in qlcnic_alloc_lb_filters_mem()
2892 spin_lock_init(&adapter->mac_learn_lock); in qlcnic_alloc_lb_filters_mem()
2893 spin_lock_init(&adapter->rx_mac_learn_lock); in qlcnic_alloc_lb_filters_mem()
2895 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_alloc_lb_filters_mem()
2897 adapter->fhash.fbucket_size = QLCNIC_VF_LB_BUCKET_SIZE; in qlcnic_alloc_lb_filters_mem()
2898 } else if (qlcnic_82xx_check(adapter)) { in qlcnic_alloc_lb_filters_mem()
2900 adapter->fhash.fbucket_size = QLCNIC_LB_BUCKET_SIZE; in qlcnic_alloc_lb_filters_mem()
2903 adapter->fhash.fbucket_size = QLC_83XX_LB_BUCKET_SIZE; in qlcnic_alloc_lb_filters_mem()
2906 head = kcalloc(adapter->fhash.fbucket_size, in qlcnic_alloc_lb_filters_mem()
2912 adapter->fhash.fmax = (filter_size / act_pci_func); in qlcnic_alloc_lb_filters_mem()
2913 adapter->fhash.fhead = head; in qlcnic_alloc_lb_filters_mem()
2916 act_pci_func, adapter->fhash.fmax); in qlcnic_alloc_lb_filters_mem()
2918 for (i = 0; i < adapter->fhash.fbucket_size; i++) in qlcnic_alloc_lb_filters_mem()
2919 INIT_HLIST_HEAD(&adapter->fhash.fhead[i]); in qlcnic_alloc_lb_filters_mem()
2921 adapter->rx_fhash.fbucket_size = adapter->fhash.fbucket_size; in qlcnic_alloc_lb_filters_mem()
2923 head = kcalloc(adapter->rx_fhash.fbucket_size, in qlcnic_alloc_lb_filters_mem()
2929 adapter->rx_fhash.fmax = (filter_size / act_pci_func); in qlcnic_alloc_lb_filters_mem()
2930 adapter->rx_fhash.fhead = head; in qlcnic_alloc_lb_filters_mem()
2932 for (i = 0; i < adapter->rx_fhash.fbucket_size; i++) in qlcnic_alloc_lb_filters_mem()
2933 INIT_HLIST_HEAD(&adapter->rx_fhash.fhead[i]); in qlcnic_alloc_lb_filters_mem()
2936 static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter) in qlcnic_free_lb_filters_mem() argument
2938 if (adapter->fhash.fmax) in qlcnic_free_lb_filters_mem()
2939 kfree(adapter->fhash.fhead); in qlcnic_free_lb_filters_mem()
2941 adapter->fhash.fhead = NULL; in qlcnic_free_lb_filters_mem()
2942 adapter->fhash.fmax = 0; in qlcnic_free_lb_filters_mem()
2944 if (adapter->rx_fhash.fmax) in qlcnic_free_lb_filters_mem()
2945 kfree(adapter->rx_fhash.fhead); in qlcnic_free_lb_filters_mem()
2947 adapter->rx_fhash.fmax = 0; in qlcnic_free_lb_filters_mem()
2948 adapter->rx_fhash.fhead = NULL; in qlcnic_free_lb_filters_mem()
2951 int qlcnic_check_temp(struct qlcnic_adapter *adapter) in qlcnic_check_temp() argument
2953 struct net_device *netdev = adapter->netdev; in qlcnic_check_temp()
2957 if (qlcnic_83xx_check(adapter)) in qlcnic_check_temp()
2958 temp = QLCRDX(adapter->ahw, QLC_83XX_ASIC_TEMP); in qlcnic_check_temp()
2960 if (qlcnic_82xx_check(adapter)) in qlcnic_check_temp()
2961 temp = QLC_SHARED_REG_RD32(adapter, QLCNIC_ASIC_TEMP); in qlcnic_check_temp()
2973 if (adapter->ahw->temp == QLCNIC_TEMP_NORMAL) { in qlcnic_check_temp()
2981 if (adapter->ahw->temp == QLCNIC_TEMP_WARN) { in qlcnic_check_temp()
2987 adapter->ahw->temp = temp_state; in qlcnic_check_temp()
3005 static void qlcnic_dump_rings(struct qlcnic_adapter *adapter) in qlcnic_dump_rings() argument
3007 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_dump_rings()
3008 struct net_device *netdev = adapter->netdev; in qlcnic_dump_rings()
3017 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in qlcnic_dump_rings()
3027 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_dump_rings()
3038 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_dump_rings()
3039 tx_ring = &adapter->tx_ring[ring]; in qlcnic_dump_rings()
3064 if (netif_msg_tx_err(adapter->ahw)) in qlcnic_dump_rings()
3072 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_tx_timeout() local
3074 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_tx_timeout()
3077 qlcnic_dump_rings(adapter); in qlcnic_tx_timeout()
3079 if (++adapter->tx_timeo_cnt >= QLCNIC_MAX_TX_TIMEOUTS || in qlcnic_tx_timeout()
3080 netif_msg_tx_err(adapter->ahw)) { in qlcnic_tx_timeout()
3082 if (qlcnic_82xx_check(adapter)) in qlcnic_tx_timeout()
3083 adapter->need_fw_reset = 1; in qlcnic_tx_timeout()
3084 else if (qlcnic_83xx_check(adapter)) in qlcnic_tx_timeout()
3085 qlcnic_83xx_idc_request_reset(adapter, in qlcnic_tx_timeout()
3089 adapter->ahw->reset_context = 1; in qlcnic_tx_timeout()
3095 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_get_stats() local
3098 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_get_stats()
3099 qlcnic_update_stats(adapter); in qlcnic_get_stats()
3101 stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts; in qlcnic_get_stats()
3102 stats->tx_packets = adapter->stats.xmitfinished; in qlcnic_get_stats()
3103 stats->rx_bytes = adapter->stats.rxbytes + adapter->stats.lrobytes; in qlcnic_get_stats()
3104 stats->tx_bytes = adapter->stats.txbytes; in qlcnic_get_stats()
3105 stats->rx_dropped = adapter->stats.rxdropped; in qlcnic_get_stats()
3106 stats->tx_dropped = adapter->stats.txdropped; in qlcnic_get_stats()
3111 static irqreturn_t qlcnic_82xx_clear_legacy_intr(struct qlcnic_adapter *adapter) in qlcnic_82xx_clear_legacy_intr() argument
3115 status = readl(adapter->isr_int_vec); in qlcnic_82xx_clear_legacy_intr()
3117 if (!(status & adapter->ahw->int_vec_bit)) in qlcnic_82xx_clear_legacy_intr()
3121 status = readl(adapter->crb_int_state_reg); in qlcnic_82xx_clear_legacy_intr()
3125 writel(0xffffffff, adapter->tgt_status_reg); in qlcnic_82xx_clear_legacy_intr()
3127 readl(adapter->isr_int_vec); in qlcnic_82xx_clear_legacy_intr()
3128 readl(adapter->isr_int_vec); in qlcnic_82xx_clear_legacy_intr()
3136 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_tmp_intr() local
3138 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_tmp_intr()
3140 else if (adapter->flags & QLCNIC_MSI_ENABLED) { in qlcnic_tmp_intr()
3141 writel(0xffffffff, adapter->tgt_status_reg); in qlcnic_tmp_intr()
3145 if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE) in qlcnic_tmp_intr()
3149 adapter->ahw->diag_cnt++; in qlcnic_tmp_intr()
3150 qlcnic_enable_sds_intr(adapter, sds_ring); in qlcnic_tmp_intr()
3157 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_intr() local
3159 if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE) in qlcnic_intr()
3170 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_msi_intr() local
3173 writel(0xffffffff, adapter->tgt_status_reg); in qlcnic_msi_intr()
3198 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_poll_controller() local
3204 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_poll_controller()
3207 recv_ctx = adapter->recv_ctx; in qlcnic_poll_controller()
3209 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_poll_controller()
3211 qlcnic_disable_sds_intr(adapter, sds_ring); in qlcnic_poll_controller()
3215 if (adapter->flags & QLCNIC_MSIX_ENABLED) { in qlcnic_poll_controller()
3219 if ((qlcnic_83xx_check(adapter) && in qlcnic_poll_controller()
3220 (adapter->flags & QLCNIC_TX_INTR_SHARED)) || in qlcnic_poll_controller()
3221 (qlcnic_82xx_check(adapter) && in qlcnic_poll_controller()
3222 !qlcnic_check_multi_tx(adapter))) in qlcnic_poll_controller()
3225 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { in qlcnic_poll_controller()
3226 tx_ring = &adapter->tx_ring[ring]; in qlcnic_poll_controller()
3227 qlcnic_disable_tx_intr(adapter, tx_ring); in qlcnic_poll_controller()
3235 qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding) in qlcnic_idc_debug_info() argument
3239 val = adapter->portnum & 0xf; in qlcnic_idc_debug_info()
3241 val |= (jiffies - adapter->dev_rst_time) << 8; in qlcnic_idc_debug_info()
3243 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_SCRATCH, val); in qlcnic_idc_debug_info()
3244 adapter->dev_rst_time = jiffies; in qlcnic_idc_debug_info()
3248 qlcnic_set_drv_state(struct qlcnic_adapter *adapter, u8 state) in qlcnic_set_drv_state() argument
3255 if (qlcnic_api_lock(adapter)) in qlcnic_set_drv_state()
3258 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_set_drv_state()
3261 QLC_DEV_SET_RST_RDY(val, adapter->portnum); in qlcnic_set_drv_state()
3263 QLC_DEV_SET_QSCNT_RDY(val, adapter->portnum); in qlcnic_set_drv_state()
3265 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_set_drv_state()
3267 qlcnic_api_unlock(adapter); in qlcnic_set_drv_state()
3273 qlcnic_clr_drv_state(struct qlcnic_adapter *adapter) in qlcnic_clr_drv_state() argument
3277 if (qlcnic_api_lock(adapter)) in qlcnic_clr_drv_state()
3280 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_clr_drv_state()
3281 QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum); in qlcnic_clr_drv_state()
3282 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_clr_drv_state()
3284 qlcnic_api_unlock(adapter); in qlcnic_clr_drv_state()
3289 void qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8 failed) in qlcnic_clr_all_drv_state() argument
3293 if (qlcnic_api_lock(adapter)) in qlcnic_clr_all_drv_state()
3296 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE); in qlcnic_clr_all_drv_state()
3297 QLC_DEV_CLR_REF_CNT(val, adapter->portnum); in qlcnic_clr_all_drv_state()
3298 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val); in qlcnic_clr_all_drv_state()
3301 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_clr_all_drv_state()
3303 dev_info(&adapter->pdev->dev, in qlcnic_clr_all_drv_state()
3306 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_clr_all_drv_state()
3309 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_clr_all_drv_state()
3310 QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum); in qlcnic_clr_all_drv_state()
3311 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_clr_all_drv_state()
3313 qlcnic_api_unlock(adapter); in qlcnic_clr_all_drv_state()
3315 adapter->fw_fail_cnt = 0; in qlcnic_clr_all_drv_state()
3316 adapter->flags &= ~QLCNIC_FW_HANG; in qlcnic_clr_all_drv_state()
3317 clear_bit(__QLCNIC_START_FW, &adapter->state); in qlcnic_clr_all_drv_state()
3318 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_clr_all_drv_state()
3323 qlcnic_check_drv_state(struct qlcnic_adapter *adapter) in qlcnic_check_drv_state() argument
3326 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_drv_state()
3328 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_check_drv_state()
3329 act = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE); in qlcnic_check_drv_state()
3331 if (adapter->flags & QLCNIC_FW_RESET_OWNER) { in qlcnic_check_drv_state()
3343 static int qlcnic_check_idc_ver(struct qlcnic_adapter *adapter) in qlcnic_check_idc_ver() argument
3345 u32 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_IDC_VER); in qlcnic_check_idc_ver()
3348 dev_warn(&adapter->pdev->dev, "IDC Version mismatch, driver's" in qlcnic_check_idc_ver()
3356 qlcnic_can_start_firmware(struct qlcnic_adapter *adapter) in qlcnic_can_start_firmware() argument
3359 u8 dev_init_timeo = adapter->dev_init_timeo; in qlcnic_can_start_firmware()
3360 u8 portnum = adapter->portnum; in qlcnic_can_start_firmware()
3363 if (test_and_clear_bit(__QLCNIC_START_FW, &adapter->state)) in qlcnic_can_start_firmware()
3366 if (qlcnic_api_lock(adapter)) in qlcnic_can_start_firmware()
3369 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE); in qlcnic_can_start_firmware()
3372 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val); in qlcnic_can_start_firmware()
3375 prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_can_start_firmware()
3376 QLCDB(adapter, HW, "Device state = %u\n", prev_state); in qlcnic_can_start_firmware()
3380 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_can_start_firmware()
3382 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_IDC_VER, in qlcnic_can_start_firmware()
3384 qlcnic_idc_debug_info(adapter, 0); in qlcnic_can_start_firmware()
3385 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3389 ret = qlcnic_check_idc_ver(adapter); in qlcnic_can_start_firmware()
3390 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3394 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_can_start_firmware()
3396 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_can_start_firmware()
3400 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_can_start_firmware()
3402 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_can_start_firmware()
3406 dev_err(&adapter->pdev->dev, "Device in failed state.\n"); in qlcnic_can_start_firmware()
3407 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3415 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3419 prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_can_start_firmware()
3426 dev_err(&adapter->pdev->dev, in qlcnic_can_start_firmware()
3431 if (qlcnic_api_lock(adapter)) in qlcnic_can_start_firmware()
3434 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE); in qlcnic_can_start_firmware()
3436 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val); in qlcnic_can_start_firmware()
3438 ret = qlcnic_check_idc_ver(adapter); in qlcnic_can_start_firmware()
3439 qlcnic_api_unlock(adapter); in qlcnic_can_start_firmware()
3447 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_fwinit_work() local
3452 if (qlcnic_api_lock(adapter)) in qlcnic_fwinit_work()
3455 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_fwinit_work()
3458 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3459 qlcnic_schedule_work(adapter, qlcnic_fwinit_work, in qlcnic_fwinit_work()
3464 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { in qlcnic_fwinit_work()
3465 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3471 dev_info(&adapter->pdev->dev, "Detected state change from " in qlcnic_fwinit_work()
3476 if (adapter->fw_wait_cnt++ > adapter->reset_ack_timeo) { in qlcnic_fwinit_work()
3477 dev_info(&adapter->pdev->dev, "Reset:Failed to get ack %d sec\n", in qlcnic_fwinit_work()
3478 adapter->reset_ack_timeo); in qlcnic_fwinit_work()
3482 if (!qlcnic_check_drv_state(adapter)) { in qlcnic_fwinit_work()
3484 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_fwinit_work()
3487 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_fwinit_work()
3489 set_bit(__QLCNIC_START_FW, &adapter->state); in qlcnic_fwinit_work()
3490 QLCDB(adapter, DRV, "Restarting fw\n"); in qlcnic_fwinit_work()
3491 qlcnic_idc_debug_info(adapter, 0); in qlcnic_fwinit_work()
3492 val = QLC_SHARED_REG_RD32(adapter, in qlcnic_fwinit_work()
3494 QLC_DEV_SET_RST_RDY(val, adapter->portnum); in qlcnic_fwinit_work()
3495 QLC_SHARED_REG_WR32(adapter, in qlcnic_fwinit_work()
3499 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3502 if (qlcnic_check_fw_dump_state(adapter) && in qlcnic_fwinit_work()
3503 (adapter->flags & QLCNIC_FW_RESET_OWNER)) { in qlcnic_fwinit_work()
3504 QLCDB(adapter, DRV, "Take FW dump\n"); in qlcnic_fwinit_work()
3505 qlcnic_dump_fw(adapter); in qlcnic_fwinit_work()
3506 adapter->flags |= QLCNIC_FW_HANG; in qlcnic_fwinit_work()
3510 adapter->flags &= ~QLCNIC_FW_RESET_OWNER; in qlcnic_fwinit_work()
3511 if (!adapter->nic_ops->start_firmware(adapter)) { in qlcnic_fwinit_work()
3512 qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); in qlcnic_fwinit_work()
3513 adapter->fw_wait_cnt = 0; in qlcnic_fwinit_work()
3519 qlcnic_api_unlock(adapter); in qlcnic_fwinit_work()
3522 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_fwinit_work()
3523 QLCDB(adapter, HW, "Func waiting: Device state=%u\n", dev_state); in qlcnic_fwinit_work()
3527 if (!qlcnic_start_firmware(adapter)) { in qlcnic_fwinit_work()
3528 qlcnic_schedule_work(adapter, qlcnic_attach_work, 0); in qlcnic_fwinit_work()
3529 adapter->fw_wait_cnt = 0; in qlcnic_fwinit_work()
3535 qlcnic_schedule_work(adapter, in qlcnic_fwinit_work()
3541 dev_err(&adapter->pdev->dev, "Fwinit work failed state=%u " in qlcnic_fwinit_work()
3542 "fw_wait_cnt=%u\n", dev_state, adapter->fw_wait_cnt); in qlcnic_fwinit_work()
3543 netif_device_attach(adapter->netdev); in qlcnic_fwinit_work()
3544 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_fwinit_work()
3550 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_detach_work() local
3552 struct net_device *netdev = adapter->netdev; in qlcnic_detach_work()
3558 if (adapter->dev_state == QLCNIC_DEV_NEED_QUISCENT) { in qlcnic_detach_work()
3560 __qlcnic_down(adapter, netdev); in qlcnic_detach_work()
3562 qlcnic_down(adapter, netdev); in qlcnic_detach_work()
3564 status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1); in qlcnic_detach_work()
3567 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3572 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3575 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3582 if (adapter->ahw->temp == QLCNIC_TEMP_PANIC) { in qlcnic_detach_work()
3583 dev_err(&adapter->pdev->dev, "Detaching the device: temp=%d\n", in qlcnic_detach_work()
3584 adapter->ahw->temp); in qlcnic_detach_work()
3589 if (!(adapter->flags & QLCNIC_FW_RESET_OWNER)) { in qlcnic_detach_work()
3590 if (qlcnic_set_drv_state(adapter, adapter->dev_state)) { in qlcnic_detach_work()
3591 dev_err(&adapter->pdev->dev, in qlcnic_detach_work()
3598 adapter->fw_wait_cnt = 0; in qlcnic_detach_work()
3600 qlcnic_schedule_work(adapter, qlcnic_fwinit_work, FW_POLL_DELAY); in qlcnic_detach_work()
3606 qlcnic_clr_all_drv_state(adapter, 1); in qlcnic_detach_work()
3611 qlcnic_set_npar_non_operational(struct qlcnic_adapter *adapter) in qlcnic_set_npar_non_operational() argument
3615 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE); in qlcnic_set_npar_non_operational()
3619 if (qlcnic_api_lock(adapter)) in qlcnic_set_npar_non_operational()
3621 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, in qlcnic_set_npar_non_operational()
3623 qlcnic_api_unlock(adapter); in qlcnic_set_npar_non_operational()
3626 static void qlcnic_82xx_dev_request_reset(struct qlcnic_adapter *adapter, in qlcnic_82xx_dev_request_reset() argument
3633 QLCWR32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, xg_val); in qlcnic_82xx_dev_request_reset()
3638 QLCWR32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, gb_val); in qlcnic_82xx_dev_request_reset()
3639 dev_info(&adapter->pdev->dev, "Pause control frames disabled" in qlcnic_82xx_dev_request_reset()
3641 adapter->need_fw_reset = 1; in qlcnic_82xx_dev_request_reset()
3643 if (qlcnic_api_lock(adapter)) in qlcnic_82xx_dev_request_reset()
3646 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_82xx_dev_request_reset()
3648 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) { in qlcnic_82xx_dev_request_reset()
3649 netdev_err(adapter->netdev, "%s: Device is in non-operational state\n", in qlcnic_82xx_dev_request_reset()
3651 qlcnic_api_unlock(adapter); in qlcnic_82xx_dev_request_reset()
3657 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_82xx_dev_request_reset()
3659 adapter->flags |= QLCNIC_FW_RESET_OWNER; in qlcnic_82xx_dev_request_reset()
3660 QLCDB(adapter, DRV, "NEED_RESET state set\n"); in qlcnic_82xx_dev_request_reset()
3661 qlcnic_idc_debug_info(adapter, 0); in qlcnic_82xx_dev_request_reset()
3664 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, in qlcnic_82xx_dev_request_reset()
3666 qlcnic_api_unlock(adapter); in qlcnic_82xx_dev_request_reset()
3671 qlcnic_dev_set_npar_ready(struct qlcnic_adapter *adapter) in qlcnic_dev_set_npar_ready() argument
3673 if (qlcnic_api_lock(adapter)) in qlcnic_dev_set_npar_ready()
3676 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE, in qlcnic_dev_set_npar_ready()
3678 QLCDB(adapter, DRV, "NPAR operational state set\n"); in qlcnic_dev_set_npar_ready()
3680 qlcnic_api_unlock(adapter); in qlcnic_dev_set_npar_ready()
3683 void qlcnic_schedule_work(struct qlcnic_adapter *adapter, in qlcnic_schedule_work() argument
3686 if (test_bit(__QLCNIC_AER, &adapter->state)) in qlcnic_schedule_work()
3689 INIT_DELAYED_WORK(&adapter->fw_work, func); in qlcnic_schedule_work()
3690 queue_delayed_work(adapter->qlcnic_wq, &adapter->fw_work, in qlcnic_schedule_work()
3697 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_attach_work() local
3699 struct net_device *netdev = adapter->netdev; in qlcnic_attach_work()
3702 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) { in qlcnic_attach_work()
3703 npar_state = QLC_SHARED_REG_RD32(adapter, in qlcnic_attach_work()
3705 if (adapter->fw_wait_cnt++ > QLCNIC_DEV_NPAR_OPER_TIMEO) in qlcnic_attach_work()
3706 qlcnic_clr_all_drv_state(adapter, 0); in qlcnic_attach_work()
3708 qlcnic_schedule_work(adapter, qlcnic_attach_work, in qlcnic_attach_work()
3712 QLCDB(adapter, DRV, "Waiting for NPAR state to operational\n"); in qlcnic_attach_work()
3716 qlcnic_dcb_get_info(adapter->dcb); in qlcnic_attach_work()
3719 if (qlcnic_up(adapter, netdev)) in qlcnic_attach_work()
3727 adapter->fw_fail_cnt = 0; in qlcnic_attach_work()
3728 adapter->flags &= ~QLCNIC_FW_HANG; in qlcnic_attach_work()
3729 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_attach_work()
3730 if (adapter->portnum == 0) in qlcnic_attach_work()
3731 qlcnic_set_drv_version(adapter); in qlcnic_attach_work()
3733 if (!qlcnic_clr_drv_state(adapter)) in qlcnic_attach_work()
3734 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, in qlcnic_attach_work()
3739 qlcnic_check_health(struct qlcnic_adapter *adapter) in qlcnic_check_health() argument
3741 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_check_health()
3747 if (qlcnic_check_temp(adapter)) in qlcnic_check_health()
3750 if (adapter->need_fw_reset) in qlcnic_check_health()
3751 qlcnic_dev_request_reset(adapter, 0); in qlcnic_check_health()
3753 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_check_health()
3755 qlcnic_set_npar_non_operational(adapter); in qlcnic_check_health()
3756 adapter->need_fw_reset = 1; in qlcnic_check_health()
3760 heartbeat = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_ALIVE_COUNTER); in qlcnic_check_health()
3761 if (heartbeat != adapter->heartbeat) { in qlcnic_check_health()
3762 adapter->heartbeat = heartbeat; in qlcnic_check_health()
3763 adapter->fw_fail_cnt = 0; in qlcnic_check_health()
3764 if (adapter->need_fw_reset) in qlcnic_check_health()
3768 qlcnic_reset_hw_context(adapter); in qlcnic_check_health()
3773 if (++adapter->fw_fail_cnt < FW_FAIL_THRESH) in qlcnic_check_health()
3776 adapter->flags |= QLCNIC_FW_HANG; in qlcnic_check_health()
3778 qlcnic_dev_request_reset(adapter, 0); in qlcnic_check_health()
3781 clear_bit(__QLCNIC_FW_ATTACHED, &adapter->state); in qlcnic_check_health()
3783 dev_err(&adapter->pdev->dev, "firmware hang detected\n"); in qlcnic_check_health()
3784 peg_status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1); in qlcnic_check_health()
3785 dev_err(&adapter->pdev->dev, "Dumping hw/fw registers\n" in qlcnic_check_health()
3791 QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2), in qlcnic_check_health()
3792 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err), in qlcnic_check_health()
3793 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err), in qlcnic_check_health()
3794 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err), in qlcnic_check_health()
3795 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err), in qlcnic_check_health()
3796 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err)); in qlcnic_check_health()
3798 dev_err(&adapter->pdev->dev, in qlcnic_check_health()
3802 adapter->dev_state = (state == QLCNIC_DEV_NEED_QUISCENT) ? state : in qlcnic_check_health()
3806 &adapter->state)) { in qlcnic_check_health()
3808 qlcnic_schedule_work(adapter, qlcnic_detach_work, 0); in qlcnic_check_health()
3809 QLCDB(adapter, DRV, "fw recovery scheduled.\n"); in qlcnic_check_health()
3811 adapter->flags & QLCNIC_FW_RESET_OWNER) { in qlcnic_check_health()
3812 qlcnic_dump_fw(adapter); in qlcnic_check_health()
3820 struct qlcnic_adapter *adapter = container_of(work, in qlcnic_fw_poll_work() local
3823 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_fw_poll_work()
3827 if (qlcnic_check_health(adapter)) in qlcnic_fw_poll_work()
3830 if (adapter->fhash.fnum) in qlcnic_fw_poll_work()
3831 qlcnic_prune_lb_filters(adapter); in qlcnic_fw_poll_work()
3834 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY); in qlcnic_fw_poll_work()
3861 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_attach_func() local
3862 struct net_device *netdev = adapter->netdev; in qlcnic_attach_func()
3875 if (qlcnic_api_lock(adapter)) in qlcnic_attach_func()
3878 if (adapter->ahw->op_mode != QLCNIC_NON_PRIV_FUNC && first_func) { in qlcnic_attach_func()
3879 adapter->need_fw_reset = 1; in qlcnic_attach_func()
3880 set_bit(__QLCNIC_START_FW, &adapter->state); in qlcnic_attach_func()
3881 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, in qlcnic_attach_func()
3883 QLCDB(adapter, DRV, "Restarting fw\n"); in qlcnic_attach_func()
3885 qlcnic_api_unlock(adapter); in qlcnic_attach_func()
3887 err = qlcnic_start_firmware(adapter); in qlcnic_attach_func()
3891 qlcnic_clr_drv_state(adapter); in qlcnic_attach_func()
3892 kfree(adapter->msix_entries); in qlcnic_attach_func()
3893 adapter->msix_entries = NULL; in qlcnic_attach_func()
3894 err = qlcnic_setup_intr(adapter); in qlcnic_attach_func()
3897 kfree(adapter->msix_entries); in qlcnic_attach_func()
3903 err = qlcnic_attach(adapter); in qlcnic_attach_func()
3905 qlcnic_clr_all_drv_state(adapter, 1); in qlcnic_attach_func()
3906 clear_bit(__QLCNIC_AER, &adapter->state); in qlcnic_attach_func()
3911 err = qlcnic_up(adapter, netdev); in qlcnic_attach_func()
3925 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_82xx_io_error_detected() local
3926 struct net_device *netdev = adapter->netdev; in qlcnic_82xx_io_error_detected()
3934 set_bit(__QLCNIC_AER, &adapter->state); in qlcnic_82xx_io_error_detected()
3937 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_82xx_io_error_detected()
3940 qlcnic_down(adapter, netdev); in qlcnic_82xx_io_error_detected()
3942 qlcnic_detach(adapter); in qlcnic_82xx_io_error_detected()
3943 qlcnic_teardown_intr(adapter); in qlcnic_82xx_io_error_detected()
3945 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_82xx_io_error_detected()
3962 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_82xx_io_resume() local
3965 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE); in qlcnic_82xx_io_resume()
3967 &adapter->state)) in qlcnic_82xx_io_resume()
3968 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, in qlcnic_82xx_io_resume()
3975 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_io_error_detected() local
3976 struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops; in qlcnic_io_error_detected()
3988 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_io_slot_reset() local
3989 struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops; in qlcnic_io_slot_reset()
4001 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_io_resume() local
4002 struct qlcnic_hardware_ops *hw_ops = adapter->ahw->hw_ops; in qlcnic_io_resume()
4012 qlcnicvf_start_firmware(struct qlcnic_adapter *adapter) in qlcnicvf_start_firmware() argument
4016 err = qlcnic_can_start_firmware(adapter); in qlcnicvf_start_firmware()
4020 err = qlcnic_check_npar_opertional(adapter); in qlcnicvf_start_firmware()
4024 err = qlcnic_initialize_nic(adapter); in qlcnicvf_start_firmware()
4028 qlcnic_check_options(adapter); in qlcnicvf_start_firmware()
4030 err = qlcnic_set_eswitch_port_config(adapter); in qlcnicvf_start_firmware()
4034 adapter->need_fw_reset = 0; in qlcnicvf_start_firmware()
4039 int qlcnic_validate_rings(struct qlcnic_adapter *adapter, __u32 ring_cnt, in qlcnic_validate_rings() argument
4042 struct net_device *netdev = adapter->netdev; in qlcnic_validate_rings()
4048 max_hw_rings = adapter->max_sds_rings; in qlcnic_validate_rings()
4049 cur_rings = adapter->drv_sds_rings; in qlcnic_validate_rings()
4052 max_hw_rings = adapter->max_tx_rings; in qlcnic_validate_rings()
4053 cur_rings = adapter->drv_tx_rings; in qlcnic_validate_rings()
4063 if (qlcnic_82xx_check(adapter) && (queue_type == QLCNIC_TX_QUEUE) && in qlcnic_validate_rings()
4064 !qlcnic_check_multi_tx(adapter)) { in qlcnic_validate_rings()
4079 int qlcnic_setup_rings(struct qlcnic_adapter *adapter) in qlcnic_setup_rings() argument
4081 struct net_device *netdev = adapter->netdev; in qlcnic_setup_rings()
4085 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_setup_rings()
4088 tx_rings = adapter->drv_tss_rings; in qlcnic_setup_rings()
4089 rx_rings = adapter->drv_rss_rings; in qlcnic_setup_rings()
4093 err = qlcnic_set_real_num_queues(adapter, tx_rings, rx_rings); in qlcnic_setup_rings()
4098 __qlcnic_down(adapter, netdev); in qlcnic_setup_rings()
4100 qlcnic_detach(adapter); in qlcnic_setup_rings()
4102 if (qlcnic_83xx_check(adapter)) { in qlcnic_setup_rings()
4103 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_setup_rings()
4104 qlcnic_83xx_enable_mbx_poll(adapter); in qlcnic_setup_rings()
4107 qlcnic_teardown_intr(adapter); in qlcnic_setup_rings()
4109 err = qlcnic_setup_intr(adapter); in qlcnic_setup_rings()
4111 kfree(adapter->msix_entries); in qlcnic_setup_rings()
4119 if ((tx_rings != adapter->drv_tx_rings) || in qlcnic_setup_rings()
4120 (rx_rings != adapter->drv_sds_rings)) { in qlcnic_setup_rings()
4121 err = qlcnic_set_real_num_queues(adapter, in qlcnic_setup_rings()
4122 adapter->drv_tx_rings, in qlcnic_setup_rings()
4123 adapter->drv_sds_rings); in qlcnic_setup_rings()
4128 if (qlcnic_83xx_check(adapter)) { in qlcnic_setup_rings()
4129 qlcnic_83xx_initialize_nic(adapter, 1); in qlcnic_setup_rings()
4130 err = qlcnic_83xx_setup_mbx_intr(adapter); in qlcnic_setup_rings()
4131 qlcnic_83xx_disable_mbx_poll(adapter); in qlcnic_setup_rings()
4133 dev_err(&adapter->pdev->dev, in qlcnic_setup_rings()
4140 err = qlcnic_attach(adapter); in qlcnic_setup_rings()
4143 err = __qlcnic_up(adapter, netdev); in qlcnic_setup_rings()
4150 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_setup_rings()
4159 qlcnic_config_indev_addr(struct qlcnic_adapter *adapter, in qlcnic_config_indev_addr() argument
4171 qlcnic_config_ipaddr(adapter, in qlcnic_config_indev_addr()
4175 qlcnic_config_ipaddr(adapter, in qlcnic_config_indev_addr()
4188 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_restore_indev_addr() local
4192 qlcnic_config_indev_addr(adapter, netdev, event); in qlcnic_restore_indev_addr()
4195 for_each_set_bit(vid, adapter->vlans, VLAN_N_VID) { in qlcnic_restore_indev_addr()
4199 qlcnic_config_indev_addr(adapter, dev, event); in qlcnic_restore_indev_addr()
4207 struct qlcnic_adapter *adapter; in qlcnic_netdev_event() local
4222 adapter = netdev_priv(dev); in qlcnic_netdev_event()
4224 if (!adapter) in qlcnic_netdev_event()
4227 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_netdev_event()
4230 qlcnic_config_indev_addr(adapter, dev, event); in qlcnic_netdev_event()
4239 struct qlcnic_adapter *adapter; in qlcnic_inetaddr_event() local
4258 adapter = netdev_priv(dev); in qlcnic_inetaddr_event()
4260 if (!adapter) in qlcnic_inetaddr_event()
4263 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) in qlcnic_inetaddr_event()
4268 qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_UP); in qlcnic_inetaddr_event()
4272 qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_DOWN); in qlcnic_inetaddr_event()