Lines Matching refs:adapter

119 static int qlcnic_sriov_virtid_fn(struct qlcnic_adapter *adapter, int vf_id)  in qlcnic_sriov_virtid_fn()  argument
121 struct pci_dev *dev = adapter->pdev; in qlcnic_sriov_virtid_fn()
125 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_sriov_virtid_fn()
135 int qlcnic_sriov_init(struct qlcnic_adapter *adapter, int num_vfs) in qlcnic_sriov_init() argument
144 if (!qlcnic_sriov_enable_check(adapter)) in qlcnic_sriov_init()
151 adapter->ahw->sriov = sriov; in qlcnic_sriov_init()
164 dev_err(&adapter->pdev->dev, in qlcnic_sriov_init()
174 dev_err(&adapter->pdev->dev, "Cannot create async workqueue\n"); in qlcnic_sriov_init()
183 vf->adapter = adapter; in qlcnic_sriov_init()
184 vf->pci_func = qlcnic_sriov_virtid_fn(adapter, i); in qlcnic_sriov_init()
195 if (qlcnic_sriov_pf_check(adapter)) { in qlcnic_sriov_init()
207 dev_info(&adapter->pdev->dev, in qlcnic_sriov_init()
225 kfree(adapter->ahw->sriov); in qlcnic_sriov_init()
251 void __qlcnic_sriov_cleanup(struct qlcnic_adapter *adapter) in __qlcnic_sriov_cleanup() argument
253 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in __qlcnic_sriov_cleanup()
258 if (!qlcnic_sriov_enable_check(adapter)) in __qlcnic_sriov_cleanup()
277 kfree(adapter->ahw->sriov); in __qlcnic_sriov_cleanup()
280 static void qlcnic_sriov_vf_cleanup(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_cleanup() argument
282 qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); in qlcnic_sriov_vf_cleanup()
283 qlcnic_sriov_cfg_bc_intr(adapter, 0); in qlcnic_sriov_vf_cleanup()
284 __qlcnic_sriov_cleanup(adapter); in qlcnic_sriov_vf_cleanup()
287 void qlcnic_sriov_cleanup(struct qlcnic_adapter *adapter) in qlcnic_sriov_cleanup() argument
289 if (!test_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state)) in qlcnic_sriov_cleanup()
292 qlcnic_sriov_free_vlans(adapter); in qlcnic_sriov_cleanup()
294 if (qlcnic_sriov_pf_check(adapter)) in qlcnic_sriov_cleanup()
295 qlcnic_sriov_pf_cleanup(adapter); in qlcnic_sriov_cleanup()
297 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_sriov_cleanup()
298 qlcnic_sriov_vf_cleanup(adapter); in qlcnic_sriov_cleanup()
301 static int qlcnic_sriov_post_bc_msg(struct qlcnic_adapter *adapter, u32 *hdr, in qlcnic_sriov_post_bc_msg() argument
304 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_post_bc_msg()
318 err = mbx->ops->enqueue_cmd(adapter, &cmd, &timeout); in qlcnic_sriov_post_bc_msg()
320 dev_err(&adapter->pdev->dev, in qlcnic_sriov_post_bc_msg()
328 dev_err(&adapter->pdev->dev, in qlcnic_sriov_post_bc_msg()
338 static void qlcnic_sriov_vf_cfg_buff_desc(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_cfg_buff_desc() argument
340 adapter->num_rxd = QLC_DEFAULT_RCV_DESCRIPTORS_SRIOV_VF; in qlcnic_sriov_vf_cfg_buff_desc()
341 adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G; in qlcnic_sriov_vf_cfg_buff_desc()
342 adapter->num_jumbo_rxd = QLC_DEFAULT_JUMBO_RCV_DESCRIPTORS_SRIOV_VF; in qlcnic_sriov_vf_cfg_buff_desc()
343 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_sriov_vf_cfg_buff_desc()
344 adapter->num_txd = MAX_CMD_DESCRIPTORS; in qlcnic_sriov_vf_cfg_buff_desc()
345 adapter->max_rds_rings = MAX_RDS_RINGS; in qlcnic_sriov_vf_cfg_buff_desc()
348 int qlcnic_sriov_get_vf_vport_info(struct qlcnic_adapter *adapter, in qlcnic_sriov_get_vf_vport_info() argument
351 struct device *dev = &adapter->pdev->dev; in qlcnic_sriov_get_vf_vport_info()
356 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO); in qlcnic_sriov_get_vf_vport_info()
361 err = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_sriov_get_vf_vport_info()
363 dev_err(&adapter->pdev->dev, in qlcnic_sriov_get_vf_vport_info()
415 static int qlcnic_sriov_set_pvid_mode(struct qlcnic_adapter *adapter, in qlcnic_sriov_set_pvid_mode() argument
418 adapter->rx_pvid = MSW(cmd->rsp.arg[1]) & 0xffff; in qlcnic_sriov_set_pvid_mode()
419 adapter->flags &= ~QLCNIC_TAGGING_ENABLED; in qlcnic_sriov_set_pvid_mode()
423 static int qlcnic_sriov_set_guest_vlan_mode(struct qlcnic_adapter *adapter, in qlcnic_sriov_set_guest_vlan_mode() argument
426 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_set_guest_vlan_mode()
435 dev_info(&adapter->pdev->dev, "Number of allowed Guest VLANs = %d\n", in qlcnic_sriov_set_guest_vlan_mode()
438 qlcnic_sriov_alloc_vlans(adapter); in qlcnic_sriov_set_guest_vlan_mode()
455 static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter) in qlcnic_sriov_get_vf_acl() argument
457 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_get_vf_acl()
466 ret = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_sriov_get_vf_acl()
468 dev_err(&adapter->pdev->dev, "Failed to get ACL, err=%d\n", in qlcnic_sriov_get_vf_acl()
474 ret = qlcnic_sriov_set_guest_vlan_mode(adapter, &cmd); in qlcnic_sriov_get_vf_acl()
477 ret = qlcnic_sriov_set_pvid_mode(adapter, &cmd); in qlcnic_sriov_get_vf_acl()
486 static int qlcnic_sriov_vf_init_driver(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_init_driver() argument
488 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_init_driver()
492 err = qlcnic_sriov_get_vf_vport_info(adapter, &nic_info, 0); in qlcnic_sriov_vf_init_driver()
498 err = qlcnic_get_nic_info(adapter, &nic_info, ahw->pci_func); in qlcnic_sriov_vf_init_driver()
502 if (qlcnic_83xx_get_port_info(adapter)) in qlcnic_sriov_vf_init_driver()
505 qlcnic_sriov_vf_cfg_buff_desc(adapter); in qlcnic_sriov_vf_init_driver()
506 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; in qlcnic_sriov_vf_init_driver()
507 dev_info(&adapter->pdev->dev, "HAL Version: %d\n", in qlcnic_sriov_vf_init_driver()
508 adapter->ahw->fw_hal_version); in qlcnic_sriov_vf_init_driver()
518 static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter, in qlcnic_sriov_setup_vf() argument
523 adapter->flags |= QLCNIC_VLAN_FILTERING; in qlcnic_sriov_setup_vf()
524 adapter->ahw->total_nic_func = 1; in qlcnic_sriov_setup_vf()
525 INIT_LIST_HEAD(&adapter->vf_mc_list); in qlcnic_sriov_setup_vf()
527 dev_warn(&adapter->pdev->dev, in qlcnic_sriov_setup_vf()
531 qlcnic_set_tx_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_sriov_setup_vf()
532 qlcnic_set_sds_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_sriov_setup_vf()
534 err = qlcnic_setup_intr(adapter); in qlcnic_sriov_setup_vf()
536 dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n"); in qlcnic_sriov_setup_vf()
540 err = qlcnic_83xx_setup_mbx_intr(adapter); in qlcnic_sriov_setup_vf()
544 err = qlcnic_sriov_init(adapter, 1); in qlcnic_sriov_setup_vf()
548 err = qlcnic_sriov_cfg_bc_intr(adapter, 1); in qlcnic_sriov_setup_vf()
552 err = qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_INIT); in qlcnic_sriov_setup_vf()
556 err = qlcnic_sriov_vf_init_driver(adapter); in qlcnic_sriov_setup_vf()
560 err = qlcnic_sriov_get_vf_acl(adapter); in qlcnic_sriov_setup_vf()
564 err = qlcnic_setup_netdev(adapter, adapter->netdev, pci_using_dac); in qlcnic_sriov_setup_vf()
568 pci_set_drvdata(adapter->pdev, adapter); in qlcnic_sriov_setup_vf()
569 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n", in qlcnic_sriov_setup_vf()
570 adapter->netdev->name); in qlcnic_sriov_setup_vf()
572 qlcnic_schedule_work(adapter, qlcnic_sriov_vf_poll_dev_state, in qlcnic_sriov_setup_vf()
573 adapter->ahw->idc.delay); in qlcnic_sriov_setup_vf()
577 qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); in qlcnic_sriov_setup_vf()
580 qlcnic_sriov_cfg_bc_intr(adapter, 0); in qlcnic_sriov_setup_vf()
583 __qlcnic_sriov_cleanup(adapter); in qlcnic_sriov_setup_vf()
586 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_sriov_setup_vf()
589 qlcnic_teardown_intr(adapter); in qlcnic_sriov_setup_vf()
593 static int qlcnic_sriov_check_dev_ready(struct qlcnic_adapter *adapter) in qlcnic_sriov_check_dev_ready() argument
599 if (++adapter->fw_fail_cnt > QLC_BC_CMD_MAX_RETRY_CNT) in qlcnic_sriov_check_dev_ready()
601 state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE); in qlcnic_sriov_check_dev_ready()
607 int qlcnic_sriov_vf_init(struct qlcnic_adapter *adapter, int pci_using_dac) in qlcnic_sriov_vf_init() argument
609 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_init()
615 adapter->fw_fail_cnt = 0; in qlcnic_sriov_vf_init()
617 adapter->need_fw_reset = 0; in qlcnic_sriov_vf_init()
618 adapter->flags |= QLCNIC_TX_INTR_SHARED; in qlcnic_sriov_vf_init()
620 err = qlcnic_sriov_check_dev_ready(adapter); in qlcnic_sriov_vf_init()
624 err = qlcnic_sriov_setup_vf(adapter, pci_using_dac); in qlcnic_sriov_vf_init()
628 if (qlcnic_read_mac_addr(adapter)) in qlcnic_sriov_vf_init()
629 dev_warn(&adapter->pdev->dev, "failed to read mac addr\n"); in qlcnic_sriov_vf_init()
631 INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work); in qlcnic_sriov_vf_init()
633 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_init()
637 void qlcnic_sriov_vf_set_ops(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_set_ops() argument
639 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_set_ops()
642 dev_info(&adapter->pdev->dev, in qlcnic_sriov_vf_set_ops()
645 adapter->nic_ops = &qlcnic_sriov_vf_ops; in qlcnic_sriov_vf_set_ops()
646 set_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state); in qlcnic_sriov_vf_set_ops()
671 int qlcnic_sriov_func_to_index(struct qlcnic_adapter *adapter, u8 pci_func) in qlcnic_sriov_func_to_index() argument
673 struct qlcnic_vf_info *vf_info = adapter->ahw->sriov->vf_info; in qlcnic_sriov_func_to_index()
676 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_sriov_func_to_index()
679 for (i = 0; i < adapter->ahw->sriov->num_vfs; i++) { in qlcnic_sriov_func_to_index()
845 vf->adapter->need_fw_reset) in qlcnic_sriov_schedule_bc_cmd()
896 static void qlcnic_sriov_pull_bc_msg(struct qlcnic_adapter *adapter, in qlcnic_sriov_pull_bc_msg() argument
899 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_pull_bc_msg()
956 ret = qlcnic_sriov_post_bc_msg(vf->adapter, hdr, pay, in qlcnic_sriov_issue_bc_post()
969 vf->adapter->need_fw_reset) in __qlcnic_sriov_send_bc_msg()
1001 static int qlcnic_sriov_send_bc_cmd(struct qlcnic_adapter *adapter, in qlcnic_sriov_send_bc_cmd() argument
1005 int err, index = qlcnic_sriov_func_to_index(adapter, pci_func); in qlcnic_sriov_send_bc_cmd()
1010 vf = &adapter->ahw->sriov->vf_info[index]; in qlcnic_sriov_send_bc_cmd()
1015 if (qlcnic_sriov_pf_check(adapter)) in qlcnic_sriov_send_bc_cmd()
1017 if (qlcnic_sriov_vf_check(adapter) && in qlcnic_sriov_send_bc_cmd()
1030 static void __qlcnic_sriov_process_bc_cmd(struct qlcnic_adapter *adapter, in __qlcnic_sriov_process_bc_cmd() argument
1035 if (qlcnic_sriov_pf_check(adapter)) { in __qlcnic_sriov_process_bc_cmd()
1036 qlcnic_sriov_pf_process_bc_cmd(adapter, trans, cmd); in __qlcnic_sriov_process_bc_cmd()
1049 struct qlcnic_adapter *adapter = vf->adapter; in qlcnic_sriov_process_bc_cmd() local
1053 if (adapter->need_fw_reset) in qlcnic_sriov_process_bc_cmd()
1062 adapter = vf->adapter; in qlcnic_sriov_process_bc_cmd()
1068 __qlcnic_sriov_process_bc_cmd(adapter, trans, &cmd); in qlcnic_sriov_process_bc_cmd()
1077 qlcnic_sriov_schedule_bc_cmd(adapter->ahw->sriov, vf, in qlcnic_sriov_process_bc_cmd()
1100 qlcnic_sriov_pull_bc_msg(vf->adapter, in qlcnic_sriov_handle_bc_resp()
1165 qlcnic_sriov_pull_bc_msg(vf->adapter, in qlcnic_sriov_handle_pending_trans()
1190 struct qlcnic_adapter *adapter = vf->adapter; in qlcnic_sriov_handle_bc_cmd() local
1196 if (adapter->need_fw_reset) in qlcnic_sriov_handle_bc_cmd()
1217 err = qlcnic_alloc_mbx_args(&cmd, adapter, cmd_op); in qlcnic_sriov_handle_bc_cmd()
1234 qlcnic_sriov_pull_bc_msg(vf->adapter, in qlcnic_sriov_handle_bc_cmd()
1243 if (qlcnic_sriov_soft_flr_check(adapter, trans, vf)) in qlcnic_sriov_handle_bc_cmd()
1267 ptr[i - 2] = readl(QLCNIC_MBX_FW(vf->adapter->ahw, i)); in qlcnic_sriov_handle_msg_event()
1283 struct qlcnic_adapter *adapter = vf->adapter; in qlcnic_sriov_handle_flr_event() local
1285 if (qlcnic_sriov_pf_check(adapter)) in qlcnic_sriov_handle_flr_event()
1288 dev_err(&adapter->pdev->dev, in qlcnic_sriov_handle_flr_event()
1292 void qlcnic_sriov_handle_bc_event(struct qlcnic_adapter *adapter, u32 event) in qlcnic_sriov_handle_bc_event() argument
1299 sriov = adapter->ahw->sriov; in qlcnic_sriov_handle_bc_event()
1301 index = qlcnic_sriov_func_to_index(adapter, pci_func); in qlcnic_sriov_handle_bc_event()
1321 int qlcnic_sriov_cfg_bc_intr(struct qlcnic_adapter *adapter, u8 enable) in qlcnic_sriov_cfg_bc_intr() argument
1326 if (!test_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state)) in qlcnic_sriov_cfg_bc_intr()
1329 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_BC_EVENT_SETUP)) in qlcnic_sriov_cfg_bc_intr()
1335 err = qlcnic_83xx_issue_cmd(adapter, &cmd); in qlcnic_sriov_cfg_bc_intr()
1338 dev_err(&adapter->pdev->dev, in qlcnic_sriov_cfg_bc_intr()
1347 static int qlcnic_sriov_retry_bc_cmd(struct qlcnic_adapter *adapter, in qlcnic_sriov_retry_bc_cmd() argument
1353 state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE); in qlcnic_sriov_retry_bc_cmd()
1358 if (++adapter->fw_fail_cnt > max) in qlcnic_sriov_retry_bc_cmd()
1367 static int __qlcnic_sriov_issue_cmd(struct qlcnic_adapter *adapter, in __qlcnic_sriov_issue_cmd() argument
1370 struct qlcnic_hardware_context *ahw = adapter->ahw; in __qlcnic_sriov_issue_cmd()
1372 struct device *dev = &adapter->pdev->dev; in __qlcnic_sriov_issue_cmd()
1376 u16 seq = ++adapter->ahw->sriov->bc.trans_counter; in __qlcnic_sriov_issue_cmd()
1390 QLCDB(adapter, DRV, "MBX not Ready!(cmd 0x%x) for VF 0x%x\n", in __qlcnic_sriov_issue_cmd()
1395 err = qlcnic_sriov_send_bc_cmd(adapter, trans, func); in __qlcnic_sriov_issue_cmd()
1405 !qlcnic_sriov_retry_bc_cmd(adapter, trans)) in __qlcnic_sriov_issue_cmd()
1435 adapter->need_fw_reset = 1; in __qlcnic_sriov_issue_cmd()
1452 static int qlcnic_sriov_issue_cmd(struct qlcnic_adapter *adapter, in qlcnic_sriov_issue_cmd() argument
1456 return qlcnic_sriov_async_issue_cmd(adapter, cmd); in qlcnic_sriov_issue_cmd()
1458 return __qlcnic_sriov_issue_cmd(adapter, cmd); in qlcnic_sriov_issue_cmd()
1461 static int qlcnic_sriov_channel_cfg_cmd(struct qlcnic_adapter *adapter, u8 cmd_op) in qlcnic_sriov_channel_cfg_cmd() argument
1464 struct qlcnic_vf_info *vf = &adapter->ahw->sriov->vf_info[0]; in qlcnic_sriov_channel_cfg_cmd()
1471 ret = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_sriov_channel_cfg_cmd()
1473 dev_err(&adapter->pdev->dev, in qlcnic_sriov_channel_cfg_cmd()
1495 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_vf_add_mc_list() local
1496 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_vf_add_mc_list()
1501 vf = &adapter->ahw->sriov->vf_info[0]; in qlcnic_vf_add_mc_list()
1504 qlcnic_nic_add_mac(adapter, mac, 0, mac_type); in qlcnic_vf_add_mc_list()
1510 qlcnic_nic_add_mac(adapter, mac, vlan_id, in qlcnic_vf_add_mc_list()
1514 if (qlcnic_84xx_check(adapter)) in qlcnic_vf_add_mc_list()
1515 qlcnic_nic_add_mac(adapter, mac, 0, mac_type); in qlcnic_vf_add_mc_list()
1536 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_sriov_vf_set_multi() local
1537 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_set_multi()
1544 if (!test_bit(__QLCNIC_FW_ATTACHED, &adapter->state)) in qlcnic_sriov_vf_set_multi()
1548 if (!(adapter->flags & QLCNIC_PROMISC_DISABLED)) in qlcnic_sriov_vf_set_multi()
1556 qlcnic_flush_mcast_mac(adapter); in qlcnic_sriov_vf_set_multi()
1574 if (adapter->pdev->is_virtfn) { in qlcnic_sriov_vf_set_multi()
1576 !adapter->fdb_mac_learn) { in qlcnic_sriov_vf_set_multi()
1577 qlcnic_alloc_lb_filters_mem(adapter); in qlcnic_sriov_vf_set_multi()
1578 adapter->drv_mac_learn = 1; in qlcnic_sriov_vf_set_multi()
1579 adapter->rx_mac_learn = true; in qlcnic_sriov_vf_set_multi()
1581 adapter->drv_mac_learn = 0; in qlcnic_sriov_vf_set_multi()
1582 adapter->rx_mac_learn = false; in qlcnic_sriov_vf_set_multi()
1586 qlcnic_nic_set_promisc(adapter, mode); in qlcnic_sriov_vf_set_multi()
1592 struct qlcnic_adapter *adapter; in qlcnic_sriov_handle_async_issue_cmd() local
1596 adapter = entry->ptr; in qlcnic_sriov_handle_async_issue_cmd()
1598 __qlcnic_sriov_issue_cmd(adapter, cmd); in qlcnic_sriov_handle_async_issue_cmd()
1644 static int qlcnic_sriov_async_issue_cmd(struct qlcnic_adapter *adapter, in qlcnic_sriov_async_issue_cmd() argument
1648 struct qlcnic_back_channel *bc = &adapter->ahw->sriov->bc; in qlcnic_sriov_async_issue_cmd()
1650 if (adapter->need_fw_reset) in qlcnic_sriov_async_issue_cmd()
1654 adapter, cmd); in qlcnic_sriov_async_issue_cmd()
1658 static int qlcnic_sriov_vf_reinit_driver(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_reinit_driver() argument
1662 adapter->need_fw_reset = 0; in qlcnic_sriov_vf_reinit_driver()
1663 qlcnic_83xx_reinit_mbx_work(adapter->ahw->mailbox); in qlcnic_sriov_vf_reinit_driver()
1664 qlcnic_83xx_enable_mbx_interrupt(adapter); in qlcnic_sriov_vf_reinit_driver()
1666 err = qlcnic_sriov_cfg_bc_intr(adapter, 1); in qlcnic_sriov_vf_reinit_driver()
1670 err = qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_INIT); in qlcnic_sriov_vf_reinit_driver()
1674 err = qlcnic_sriov_vf_init_driver(adapter); in qlcnic_sriov_vf_reinit_driver()
1681 qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); in qlcnic_sriov_vf_reinit_driver()
1684 qlcnic_sriov_cfg_bc_intr(adapter, 0); in qlcnic_sriov_vf_reinit_driver()
1688 static void qlcnic_sriov_vf_attach(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_attach() argument
1690 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_vf_attach()
1693 if (!qlcnic_up(adapter, netdev)) in qlcnic_sriov_vf_attach()
1700 static void qlcnic_sriov_vf_detach(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_detach() argument
1702 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_detach()
1704 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_vf_detach()
1708 qlcnic_83xx_detach_mailbox_work(adapter); in qlcnic_sriov_vf_detach()
1709 qlcnic_83xx_disable_mbx_intr(adapter); in qlcnic_sriov_vf_detach()
1712 qlcnic_down(adapter, netdev); in qlcnic_sriov_vf_detach()
1722 static int qlcnic_sriov_vf_handle_dev_ready(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_handle_dev_ready() argument
1724 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_handle_dev_ready()
1725 struct device *dev = &adapter->pdev->dev; in qlcnic_sriov_vf_handle_dev_ready()
1732 if (!qlcnic_sriov_vf_reinit_driver(adapter)) { in qlcnic_sriov_vf_handle_dev_ready()
1733 qlcnic_sriov_vf_attach(adapter); in qlcnic_sriov_vf_handle_dev_ready()
1734 adapter->fw_fail_cnt = 0; in qlcnic_sriov_vf_handle_dev_ready()
1751 static int qlcnic_sriov_vf_handle_context_reset(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_handle_context_reset() argument
1753 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_handle_context_reset()
1755 struct device *dev = &adapter->pdev->dev; in qlcnic_sriov_vf_handle_context_reset()
1760 adapter->reset_ctx_cnt++; in qlcnic_sriov_vf_handle_context_reset()
1763 if (adapter->reset_ctx_cnt < 3) { in qlcnic_sriov_vf_handle_context_reset()
1764 adapter->need_fw_reset = 1; in qlcnic_sriov_vf_handle_context_reset()
1774 if (adapter->reset_ctx_cnt > QLC_83XX_VF_RESET_FAIL_THRESH) { in qlcnic_sriov_vf_handle_context_reset()
1776 adapter->tx_timeo_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1777 adapter->fw_fail_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1778 adapter->reset_ctx_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1779 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_handle_context_reset()
1787 __func__, adapter->reset_ctx_cnt, func); in qlcnic_sriov_vf_handle_context_reset()
1788 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_handle_context_reset()
1789 adapter->need_fw_reset = 1; in qlcnic_sriov_vf_handle_context_reset()
1791 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_handle_context_reset()
1792 adapter->need_fw_reset = 0; in qlcnic_sriov_vf_handle_context_reset()
1794 if (!qlcnic_sriov_vf_reinit_driver(adapter)) { in qlcnic_sriov_vf_handle_context_reset()
1795 qlcnic_sriov_vf_attach(adapter); in qlcnic_sriov_vf_handle_context_reset()
1796 adapter->tx_timeo_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1797 adapter->reset_ctx_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1798 adapter->fw_fail_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1810 static int qlcnic_sriov_vf_idc_ready_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_ready_state() argument
1812 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_idc_ready_state()
1816 ret = qlcnic_sriov_vf_handle_dev_ready(adapter); in qlcnic_sriov_vf_idc_ready_state()
1818 ret = qlcnic_sriov_vf_handle_context_reset(adapter); in qlcnic_sriov_vf_idc_ready_state()
1820 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_idc_ready_state()
1824 static int qlcnic_sriov_vf_idc_failed_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_failed_state() argument
1826 struct qlc_83xx_idc *idc = &adapter->ahw->idc; in qlcnic_sriov_vf_idc_failed_state()
1828 dev_err(&adapter->pdev->dev, "Device is in failed state\n"); in qlcnic_sriov_vf_idc_failed_state()
1830 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_idc_failed_state()
1833 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_idc_failed_state()
1838 qlcnic_sriov_vf_idc_need_quiescent_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_need_quiescent_state() argument
1840 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_sriov_vf_idc_need_quiescent_state()
1841 struct qlc_83xx_idc *idc = &adapter->ahw->idc; in qlcnic_sriov_vf_idc_need_quiescent_state()
1843 dev_info(&adapter->pdev->dev, "Device is in quiescent state\n"); in qlcnic_sriov_vf_idc_need_quiescent_state()
1845 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_idc_need_quiescent_state()
1846 adapter->tx_timeo_cnt = 0; in qlcnic_sriov_vf_idc_need_quiescent_state()
1847 adapter->reset_ctx_cnt = 0; in qlcnic_sriov_vf_idc_need_quiescent_state()
1849 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_idc_need_quiescent_state()
1855 static int qlcnic_sriov_vf_idc_init_reset_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_init_reset_state() argument
1857 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_sriov_vf_idc_init_reset_state()
1858 struct qlc_83xx_idc *idc = &adapter->ahw->idc; in qlcnic_sriov_vf_idc_init_reset_state()
1859 u8 func = adapter->ahw->pci_func; in qlcnic_sriov_vf_idc_init_reset_state()
1862 dev_err(&adapter->pdev->dev, in qlcnic_sriov_vf_idc_init_reset_state()
1864 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_idc_init_reset_state()
1865 adapter->tx_timeo_cnt = 0; in qlcnic_sriov_vf_idc_init_reset_state()
1866 adapter->reset_ctx_cnt = 0; in qlcnic_sriov_vf_idc_init_reset_state()
1868 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_idc_init_reset_state()
1873 static int qlcnic_sriov_vf_idc_unknown_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_unknown_state() argument
1875 dev_err(&adapter->pdev->dev, "%s: Device in unknown state\n", __func__); in qlcnic_sriov_vf_idc_unknown_state()
1879 static void qlcnic_sriov_vf_periodic_tasks(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_periodic_tasks() argument
1881 if (adapter->fhash.fnum) in qlcnic_sriov_vf_periodic_tasks()
1882 qlcnic_prune_lb_filters(adapter); in qlcnic_sriov_vf_periodic_tasks()
1887 struct qlcnic_adapter *adapter; in qlcnic_sriov_vf_poll_dev_state() local
1891 adapter = container_of(work, struct qlcnic_adapter, fw_work.work); in qlcnic_sriov_vf_poll_dev_state()
1892 idc = &adapter->ahw->idc; in qlcnic_sriov_vf_poll_dev_state()
1893 idc->curr_state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE); in qlcnic_sriov_vf_poll_dev_state()
1897 ret = qlcnic_sriov_vf_idc_ready_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1901 ret = qlcnic_sriov_vf_idc_init_reset_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1904 ret = qlcnic_sriov_vf_idc_need_quiescent_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1907 ret = qlcnic_sriov_vf_idc_failed_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1912 ret = qlcnic_sriov_vf_idc_unknown_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1916 qlcnic_sriov_vf_periodic_tasks(adapter); in qlcnic_sriov_vf_poll_dev_state()
1919 qlcnic_schedule_work(adapter, qlcnic_sriov_vf_poll_dev_state, in qlcnic_sriov_vf_poll_dev_state()
1923 static void qlcnic_sriov_vf_cancel_fw_work(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_cancel_fw_work() argument
1925 while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_sriov_vf_cancel_fw_work()
1928 clear_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status); in qlcnic_sriov_vf_cancel_fw_work()
1929 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_cancel_fw_work()
1930 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_sriov_vf_cancel_fw_work()
1968 static int qlcnic_sriov_validate_vlan_cfg(struct qlcnic_adapter *adapter, in qlcnic_sriov_validate_vlan_cfg() argument
1971 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_validate_vlan_cfg()
1977 vf = &adapter->ahw->sriov->vf_info[0]; in qlcnic_sriov_validate_vlan_cfg()
1983 if (qlcnic_83xx_vf_check(adapter) && vlan_exist) in qlcnic_sriov_validate_vlan_cfg()
2009 struct qlcnic_adapter *adapter = vf->adapter; in qlcnic_sriov_vlan_operation() local
2012 sriov = adapter->ahw->sriov; in qlcnic_sriov_vlan_operation()
2027 netdev_err(adapter->netdev, "Invalid VLAN operation\n"); in qlcnic_sriov_vlan_operation()
2034 int qlcnic_sriov_cfg_vf_guest_vlan(struct qlcnic_adapter *adapter, in qlcnic_sriov_cfg_vf_guest_vlan() argument
2037 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_cfg_vf_guest_vlan()
2038 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_cfg_vf_guest_vlan()
2047 vf = &adapter->ahw->sriov->vf_info[0]; in qlcnic_sriov_cfg_vf_guest_vlan()
2048 ret = qlcnic_sriov_validate_vlan_cfg(adapter, vid, enable); in qlcnic_sriov_cfg_vf_guest_vlan()
2060 ret = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_sriov_cfg_vf_guest_vlan()
2062 dev_err(&adapter->pdev->dev, in qlcnic_sriov_cfg_vf_guest_vlan()
2066 qlcnic_free_mac_list(adapter); in qlcnic_sriov_cfg_vf_guest_vlan()
2083 static void qlcnic_sriov_vf_free_mac_list(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_free_mac_list() argument
2085 struct list_head *head = &adapter->mac_list; in qlcnic_sriov_vf_free_mac_list()
2090 qlcnic_sre_macaddr_change(adapter, cur->mac_addr, cur->vlan_id, in qlcnic_sriov_vf_free_mac_list()
2100 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_sriov_vf_shutdown() local
2101 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_vf_shutdown()
2105 qlcnic_cancel_idc_work(adapter); in qlcnic_sriov_vf_shutdown()
2108 qlcnic_down(adapter, netdev); in qlcnic_sriov_vf_shutdown()
2110 qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); in qlcnic_sriov_vf_shutdown()
2111 qlcnic_sriov_cfg_bc_intr(adapter, 0); in qlcnic_sriov_vf_shutdown()
2112 qlcnic_83xx_disable_mbx_intr(adapter); in qlcnic_sriov_vf_shutdown()
2113 cancel_delayed_work_sync(&adapter->idc_aen_work); in qlcnic_sriov_vf_shutdown()
2122 static int qlcnic_sriov_vf_resume(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_resume() argument
2124 struct qlc_83xx_idc *idc = &adapter->ahw->idc; in qlcnic_sriov_vf_resume()
2125 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_vf_resume()
2129 qlcnic_83xx_enable_mbx_interrupt(adapter); in qlcnic_sriov_vf_resume()
2130 err = qlcnic_sriov_cfg_bc_intr(adapter, 1); in qlcnic_sriov_vf_resume()
2134 err = qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_INIT); in qlcnic_sriov_vf_resume()
2137 err = qlcnic_up(adapter, netdev); in qlcnic_sriov_vf_resume()
2144 qlcnic_schedule_work(adapter, qlcnic_sriov_vf_poll_dev_state, in qlcnic_sriov_vf_resume()
2149 void qlcnic_sriov_alloc_vlans(struct qlcnic_adapter *adapter) in qlcnic_sriov_alloc_vlans() argument
2151 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_alloc_vlans()
2162 void qlcnic_sriov_free_vlans(struct qlcnic_adapter *adapter) in qlcnic_sriov_free_vlans() argument
2164 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_free_vlans()