Lines Matching refs:adapter

120 static int qlcnic_sriov_virtid_fn(struct qlcnic_adapter *adapter, int vf_id)  in qlcnic_sriov_virtid_fn()  argument
122 struct pci_dev *dev = adapter->pdev; in qlcnic_sriov_virtid_fn()
126 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_sriov_virtid_fn()
136 int qlcnic_sriov_init(struct qlcnic_adapter *adapter, int num_vfs) in qlcnic_sriov_init() argument
145 if (!qlcnic_sriov_enable_check(adapter)) in qlcnic_sriov_init()
152 adapter->ahw->sriov = sriov; in qlcnic_sriov_init()
165 dev_err(&adapter->pdev->dev, in qlcnic_sriov_init()
175 dev_err(&adapter->pdev->dev, "Cannot create async workqueue\n"); in qlcnic_sriov_init()
184 vf->adapter = adapter; in qlcnic_sriov_init()
185 vf->pci_func = qlcnic_sriov_virtid_fn(adapter, i); in qlcnic_sriov_init()
196 if (qlcnic_sriov_pf_check(adapter)) { in qlcnic_sriov_init()
208 dev_info(&adapter->pdev->dev, in qlcnic_sriov_init()
226 kfree(adapter->ahw->sriov); in qlcnic_sriov_init()
252 void __qlcnic_sriov_cleanup(struct qlcnic_adapter *adapter) in __qlcnic_sriov_cleanup() argument
254 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in __qlcnic_sriov_cleanup()
259 if (!qlcnic_sriov_enable_check(adapter)) in __qlcnic_sriov_cleanup()
278 kfree(adapter->ahw->sriov); in __qlcnic_sriov_cleanup()
281 static void qlcnic_sriov_vf_cleanup(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_cleanup() argument
283 qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); in qlcnic_sriov_vf_cleanup()
284 qlcnic_sriov_cfg_bc_intr(adapter, 0); in qlcnic_sriov_vf_cleanup()
285 __qlcnic_sriov_cleanup(adapter); in qlcnic_sriov_vf_cleanup()
288 void qlcnic_sriov_cleanup(struct qlcnic_adapter *adapter) in qlcnic_sriov_cleanup() argument
290 if (!test_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state)) in qlcnic_sriov_cleanup()
293 qlcnic_sriov_free_vlans(adapter); in qlcnic_sriov_cleanup()
295 if (qlcnic_sriov_pf_check(adapter)) in qlcnic_sriov_cleanup()
296 qlcnic_sriov_pf_cleanup(adapter); in qlcnic_sriov_cleanup()
298 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_sriov_cleanup()
299 qlcnic_sriov_vf_cleanup(adapter); in qlcnic_sriov_cleanup()
302 static int qlcnic_sriov_post_bc_msg(struct qlcnic_adapter *adapter, u32 *hdr, in qlcnic_sriov_post_bc_msg() argument
305 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_post_bc_msg()
319 err = mbx->ops->enqueue_cmd(adapter, &cmd, &timeout); in qlcnic_sriov_post_bc_msg()
321 dev_err(&adapter->pdev->dev, in qlcnic_sriov_post_bc_msg()
329 dev_err(&adapter->pdev->dev, in qlcnic_sriov_post_bc_msg()
339 static void qlcnic_sriov_vf_cfg_buff_desc(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_cfg_buff_desc() argument
341 adapter->num_rxd = QLC_DEFAULT_RCV_DESCRIPTORS_SRIOV_VF; in qlcnic_sriov_vf_cfg_buff_desc()
342 adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G; in qlcnic_sriov_vf_cfg_buff_desc()
343 adapter->num_jumbo_rxd = QLC_DEFAULT_JUMBO_RCV_DESCRIPTORS_SRIOV_VF; in qlcnic_sriov_vf_cfg_buff_desc()
344 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_sriov_vf_cfg_buff_desc()
345 adapter->num_txd = MAX_CMD_DESCRIPTORS; in qlcnic_sriov_vf_cfg_buff_desc()
346 adapter->max_rds_rings = MAX_RDS_RINGS; in qlcnic_sriov_vf_cfg_buff_desc()
349 int qlcnic_sriov_get_vf_vport_info(struct qlcnic_adapter *adapter, in qlcnic_sriov_get_vf_vport_info() argument
352 struct device *dev = &adapter->pdev->dev; in qlcnic_sriov_get_vf_vport_info()
357 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO); in qlcnic_sriov_get_vf_vport_info()
362 err = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_sriov_get_vf_vport_info()
364 dev_err(&adapter->pdev->dev, in qlcnic_sriov_get_vf_vport_info()
416 static int qlcnic_sriov_set_pvid_mode(struct qlcnic_adapter *adapter, in qlcnic_sriov_set_pvid_mode() argument
419 adapter->rx_pvid = MSW(cmd->rsp.arg[1]) & 0xffff; in qlcnic_sriov_set_pvid_mode()
420 adapter->flags &= ~QLCNIC_TAGGING_ENABLED; in qlcnic_sriov_set_pvid_mode()
424 static int qlcnic_sriov_set_guest_vlan_mode(struct qlcnic_adapter *adapter, in qlcnic_sriov_set_guest_vlan_mode() argument
427 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_set_guest_vlan_mode()
436 dev_info(&adapter->pdev->dev, "Number of allowed Guest VLANs = %d\n", in qlcnic_sriov_set_guest_vlan_mode()
439 qlcnic_sriov_alloc_vlans(adapter); in qlcnic_sriov_set_guest_vlan_mode()
456 static int qlcnic_sriov_get_vf_acl(struct qlcnic_adapter *adapter) in qlcnic_sriov_get_vf_acl() argument
458 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_get_vf_acl()
467 ret = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_sriov_get_vf_acl()
469 dev_err(&adapter->pdev->dev, "Failed to get ACL, err=%d\n", in qlcnic_sriov_get_vf_acl()
475 ret = qlcnic_sriov_set_guest_vlan_mode(adapter, &cmd); in qlcnic_sriov_get_vf_acl()
478 ret = qlcnic_sriov_set_pvid_mode(adapter, &cmd); in qlcnic_sriov_get_vf_acl()
487 static int qlcnic_sriov_vf_init_driver(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_init_driver() argument
489 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_init_driver()
493 err = qlcnic_sriov_get_vf_vport_info(adapter, &nic_info, 0); in qlcnic_sriov_vf_init_driver()
499 err = qlcnic_get_nic_info(adapter, &nic_info, ahw->pci_func); in qlcnic_sriov_vf_init_driver()
503 if (qlcnic_83xx_get_port_info(adapter)) in qlcnic_sriov_vf_init_driver()
506 qlcnic_sriov_vf_cfg_buff_desc(adapter); in qlcnic_sriov_vf_init_driver()
507 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; in qlcnic_sriov_vf_init_driver()
508 dev_info(&adapter->pdev->dev, "HAL Version: %d\n", in qlcnic_sriov_vf_init_driver()
509 adapter->ahw->fw_hal_version); in qlcnic_sriov_vf_init_driver()
519 static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter, in qlcnic_sriov_setup_vf() argument
524 adapter->flags |= QLCNIC_VLAN_FILTERING; in qlcnic_sriov_setup_vf()
525 adapter->ahw->total_nic_func = 1; in qlcnic_sriov_setup_vf()
526 INIT_LIST_HEAD(&adapter->vf_mc_list); in qlcnic_sriov_setup_vf()
528 dev_warn(&adapter->pdev->dev, in qlcnic_sriov_setup_vf()
532 qlcnic_set_tx_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_sriov_setup_vf()
533 qlcnic_set_sds_ring_count(adapter, QLCNIC_SINGLE_RING); in qlcnic_sriov_setup_vf()
535 err = qlcnic_setup_intr(adapter); in qlcnic_sriov_setup_vf()
537 dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n"); in qlcnic_sriov_setup_vf()
541 err = qlcnic_83xx_setup_mbx_intr(adapter); in qlcnic_sriov_setup_vf()
545 err = qlcnic_sriov_init(adapter, 1); in qlcnic_sriov_setup_vf()
549 err = qlcnic_sriov_cfg_bc_intr(adapter, 1); in qlcnic_sriov_setup_vf()
553 err = qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_INIT); in qlcnic_sriov_setup_vf()
557 err = qlcnic_sriov_vf_init_driver(adapter); in qlcnic_sriov_setup_vf()
561 err = qlcnic_sriov_get_vf_acl(adapter); in qlcnic_sriov_setup_vf()
565 err = qlcnic_setup_netdev(adapter, adapter->netdev, pci_using_dac); in qlcnic_sriov_setup_vf()
569 pci_set_drvdata(adapter->pdev, adapter); in qlcnic_sriov_setup_vf()
570 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n", in qlcnic_sriov_setup_vf()
571 adapter->netdev->name); in qlcnic_sriov_setup_vf()
573 qlcnic_schedule_work(adapter, qlcnic_sriov_vf_poll_dev_state, in qlcnic_sriov_setup_vf()
574 adapter->ahw->idc.delay); in qlcnic_sriov_setup_vf()
578 qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); in qlcnic_sriov_setup_vf()
581 qlcnic_sriov_cfg_bc_intr(adapter, 0); in qlcnic_sriov_setup_vf()
584 __qlcnic_sriov_cleanup(adapter); in qlcnic_sriov_setup_vf()
587 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_sriov_setup_vf()
590 qlcnic_teardown_intr(adapter); in qlcnic_sriov_setup_vf()
594 static int qlcnic_sriov_check_dev_ready(struct qlcnic_adapter *adapter) in qlcnic_sriov_check_dev_ready() argument
600 if (++adapter->fw_fail_cnt > QLC_BC_CMD_MAX_RETRY_CNT) in qlcnic_sriov_check_dev_ready()
602 state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE); in qlcnic_sriov_check_dev_ready()
608 int qlcnic_sriov_vf_init(struct qlcnic_adapter *adapter, int pci_using_dac) in qlcnic_sriov_vf_init() argument
610 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_init()
616 adapter->fw_fail_cnt = 0; in qlcnic_sriov_vf_init()
618 adapter->need_fw_reset = 0; in qlcnic_sriov_vf_init()
619 adapter->flags |= QLCNIC_TX_INTR_SHARED; in qlcnic_sriov_vf_init()
621 err = qlcnic_sriov_check_dev_ready(adapter); in qlcnic_sriov_vf_init()
625 err = qlcnic_sriov_setup_vf(adapter, pci_using_dac); in qlcnic_sriov_vf_init()
629 if (qlcnic_read_mac_addr(adapter)) in qlcnic_sriov_vf_init()
630 dev_warn(&adapter->pdev->dev, "failed to read mac addr\n"); in qlcnic_sriov_vf_init()
632 INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work); in qlcnic_sriov_vf_init()
634 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_init()
638 void qlcnic_sriov_vf_set_ops(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_set_ops() argument
640 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_set_ops()
643 dev_info(&adapter->pdev->dev, in qlcnic_sriov_vf_set_ops()
646 adapter->nic_ops = &qlcnic_sriov_vf_ops; in qlcnic_sriov_vf_set_ops()
647 set_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state); in qlcnic_sriov_vf_set_ops()
672 int qlcnic_sriov_func_to_index(struct qlcnic_adapter *adapter, u8 pci_func) in qlcnic_sriov_func_to_index() argument
674 struct qlcnic_vf_info *vf_info = adapter->ahw->sriov->vf_info; in qlcnic_sriov_func_to_index()
677 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_sriov_func_to_index()
680 for (i = 0; i < adapter->ahw->sriov->num_vfs; i++) { in qlcnic_sriov_func_to_index()
844 vf->adapter->need_fw_reset) in qlcnic_sriov_schedule_bc_cmd()
895 static void qlcnic_sriov_pull_bc_msg(struct qlcnic_adapter *adapter, in qlcnic_sriov_pull_bc_msg() argument
898 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_pull_bc_msg()
955 ret = qlcnic_sriov_post_bc_msg(vf->adapter, hdr, pay, in qlcnic_sriov_issue_bc_post()
968 vf->adapter->need_fw_reset) in __qlcnic_sriov_send_bc_msg()
1000 static int qlcnic_sriov_send_bc_cmd(struct qlcnic_adapter *adapter, in qlcnic_sriov_send_bc_cmd() argument
1004 int err, index = qlcnic_sriov_func_to_index(adapter, pci_func); in qlcnic_sriov_send_bc_cmd()
1009 vf = &adapter->ahw->sriov->vf_info[index]; in qlcnic_sriov_send_bc_cmd()
1014 if (qlcnic_sriov_pf_check(adapter)) in qlcnic_sriov_send_bc_cmd()
1016 if (qlcnic_sriov_vf_check(adapter) && in qlcnic_sriov_send_bc_cmd()
1029 static void __qlcnic_sriov_process_bc_cmd(struct qlcnic_adapter *adapter, in __qlcnic_sriov_process_bc_cmd() argument
1034 if (qlcnic_sriov_pf_check(adapter)) { in __qlcnic_sriov_process_bc_cmd()
1035 qlcnic_sriov_pf_process_bc_cmd(adapter, trans, cmd); in __qlcnic_sriov_process_bc_cmd()
1048 struct qlcnic_adapter *adapter = vf->adapter; in qlcnic_sriov_process_bc_cmd() local
1052 if (adapter->need_fw_reset) in qlcnic_sriov_process_bc_cmd()
1061 adapter = vf->adapter; in qlcnic_sriov_process_bc_cmd()
1067 __qlcnic_sriov_process_bc_cmd(adapter, trans, &cmd); in qlcnic_sriov_process_bc_cmd()
1076 qlcnic_sriov_schedule_bc_cmd(adapter->ahw->sriov, vf, in qlcnic_sriov_process_bc_cmd()
1099 qlcnic_sriov_pull_bc_msg(vf->adapter, in qlcnic_sriov_handle_bc_resp()
1164 qlcnic_sriov_pull_bc_msg(vf->adapter, in qlcnic_sriov_handle_pending_trans()
1189 struct qlcnic_adapter *adapter = vf->adapter; in qlcnic_sriov_handle_bc_cmd() local
1195 if (adapter->need_fw_reset) in qlcnic_sriov_handle_bc_cmd()
1216 err = qlcnic_alloc_mbx_args(&cmd, adapter, cmd_op); in qlcnic_sriov_handle_bc_cmd()
1233 qlcnic_sriov_pull_bc_msg(vf->adapter, in qlcnic_sriov_handle_bc_cmd()
1242 if (qlcnic_sriov_soft_flr_check(adapter, trans, vf)) in qlcnic_sriov_handle_bc_cmd()
1266 ptr[i - 2] = readl(QLCNIC_MBX_FW(vf->adapter->ahw, i)); in qlcnic_sriov_handle_msg_event()
1282 struct qlcnic_adapter *adapter = vf->adapter; in qlcnic_sriov_handle_flr_event() local
1284 if (qlcnic_sriov_pf_check(adapter)) in qlcnic_sriov_handle_flr_event()
1287 dev_err(&adapter->pdev->dev, in qlcnic_sriov_handle_flr_event()
1291 void qlcnic_sriov_handle_bc_event(struct qlcnic_adapter *adapter, u32 event) in qlcnic_sriov_handle_bc_event() argument
1298 sriov = adapter->ahw->sriov; in qlcnic_sriov_handle_bc_event()
1300 index = qlcnic_sriov_func_to_index(adapter, pci_func); in qlcnic_sriov_handle_bc_event()
1320 int qlcnic_sriov_cfg_bc_intr(struct qlcnic_adapter *adapter, u8 enable) in qlcnic_sriov_cfg_bc_intr() argument
1325 if (!test_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state)) in qlcnic_sriov_cfg_bc_intr()
1328 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_BC_EVENT_SETUP)) in qlcnic_sriov_cfg_bc_intr()
1334 err = qlcnic_83xx_issue_cmd(adapter, &cmd); in qlcnic_sriov_cfg_bc_intr()
1337 dev_err(&adapter->pdev->dev, in qlcnic_sriov_cfg_bc_intr()
1346 static int qlcnic_sriov_retry_bc_cmd(struct qlcnic_adapter *adapter, in qlcnic_sriov_retry_bc_cmd() argument
1352 state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE); in qlcnic_sriov_retry_bc_cmd()
1357 if (++adapter->fw_fail_cnt > max) in qlcnic_sriov_retry_bc_cmd()
1366 static int __qlcnic_sriov_issue_cmd(struct qlcnic_adapter *adapter, in __qlcnic_sriov_issue_cmd() argument
1369 struct qlcnic_hardware_context *ahw = adapter->ahw; in __qlcnic_sriov_issue_cmd()
1371 struct device *dev = &adapter->pdev->dev; in __qlcnic_sriov_issue_cmd()
1375 u16 seq = ++adapter->ahw->sriov->bc.trans_counter; in __qlcnic_sriov_issue_cmd()
1389 QLCDB(adapter, DRV, "MBX not Ready!(cmd 0x%x) for VF 0x%x\n", in __qlcnic_sriov_issue_cmd()
1394 err = qlcnic_sriov_send_bc_cmd(adapter, trans, func); in __qlcnic_sriov_issue_cmd()
1404 !qlcnic_sriov_retry_bc_cmd(adapter, trans)) in __qlcnic_sriov_issue_cmd()
1434 adapter->need_fw_reset = 1; in __qlcnic_sriov_issue_cmd()
1451 static int qlcnic_sriov_issue_cmd(struct qlcnic_adapter *adapter, in qlcnic_sriov_issue_cmd() argument
1455 return qlcnic_sriov_async_issue_cmd(adapter, cmd); in qlcnic_sriov_issue_cmd()
1457 return __qlcnic_sriov_issue_cmd(adapter, cmd); in qlcnic_sriov_issue_cmd()
1460 static int qlcnic_sriov_channel_cfg_cmd(struct qlcnic_adapter *adapter, u8 cmd_op) in qlcnic_sriov_channel_cfg_cmd() argument
1463 struct qlcnic_vf_info *vf = &adapter->ahw->sriov->vf_info[0]; in qlcnic_sriov_channel_cfg_cmd()
1470 ret = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_sriov_channel_cfg_cmd()
1472 dev_err(&adapter->pdev->dev, in qlcnic_sriov_channel_cfg_cmd()
1494 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_vf_add_mc_list() local
1495 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_vf_add_mc_list()
1500 vf = &adapter->ahw->sriov->vf_info[0]; in qlcnic_vf_add_mc_list()
1503 qlcnic_nic_add_mac(adapter, mac, 0, mac_type); in qlcnic_vf_add_mc_list()
1509 qlcnic_nic_add_mac(adapter, mac, vlan_id, in qlcnic_vf_add_mc_list()
1513 if (qlcnic_84xx_check(adapter)) in qlcnic_vf_add_mc_list()
1514 qlcnic_nic_add_mac(adapter, mac, 0, mac_type); in qlcnic_vf_add_mc_list()
1535 struct qlcnic_adapter *adapter = netdev_priv(netdev); in qlcnic_sriov_vf_set_multi() local
1536 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_set_multi()
1543 if (!test_bit(__QLCNIC_FW_ATTACHED, &adapter->state)) in qlcnic_sriov_vf_set_multi()
1547 if (!(adapter->flags & QLCNIC_PROMISC_DISABLED)) in qlcnic_sriov_vf_set_multi()
1555 qlcnic_flush_mcast_mac(adapter); in qlcnic_sriov_vf_set_multi()
1573 if (adapter->pdev->is_virtfn) { in qlcnic_sriov_vf_set_multi()
1575 !adapter->fdb_mac_learn) { in qlcnic_sriov_vf_set_multi()
1576 qlcnic_alloc_lb_filters_mem(adapter); in qlcnic_sriov_vf_set_multi()
1577 adapter->drv_mac_learn = 1; in qlcnic_sriov_vf_set_multi()
1578 adapter->rx_mac_learn = true; in qlcnic_sriov_vf_set_multi()
1580 adapter->drv_mac_learn = 0; in qlcnic_sriov_vf_set_multi()
1581 adapter->rx_mac_learn = false; in qlcnic_sriov_vf_set_multi()
1585 qlcnic_nic_set_promisc(adapter, mode); in qlcnic_sriov_vf_set_multi()
1591 struct qlcnic_adapter *adapter; in qlcnic_sriov_handle_async_issue_cmd() local
1595 adapter = entry->ptr; in qlcnic_sriov_handle_async_issue_cmd()
1597 __qlcnic_sriov_issue_cmd(adapter, cmd); in qlcnic_sriov_handle_async_issue_cmd()
1643 static int qlcnic_sriov_async_issue_cmd(struct qlcnic_adapter *adapter, in qlcnic_sriov_async_issue_cmd() argument
1647 struct qlcnic_back_channel *bc = &adapter->ahw->sriov->bc; in qlcnic_sriov_async_issue_cmd()
1649 if (adapter->need_fw_reset) in qlcnic_sriov_async_issue_cmd()
1653 adapter, cmd); in qlcnic_sriov_async_issue_cmd()
1657 static int qlcnic_sriov_vf_reinit_driver(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_reinit_driver() argument
1661 adapter->need_fw_reset = 0; in qlcnic_sriov_vf_reinit_driver()
1662 qlcnic_83xx_reinit_mbx_work(adapter->ahw->mailbox); in qlcnic_sriov_vf_reinit_driver()
1663 qlcnic_83xx_enable_mbx_interrupt(adapter); in qlcnic_sriov_vf_reinit_driver()
1665 err = qlcnic_sriov_cfg_bc_intr(adapter, 1); in qlcnic_sriov_vf_reinit_driver()
1669 err = qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_INIT); in qlcnic_sriov_vf_reinit_driver()
1673 err = qlcnic_sriov_vf_init_driver(adapter); in qlcnic_sriov_vf_reinit_driver()
1680 qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); in qlcnic_sriov_vf_reinit_driver()
1683 qlcnic_sriov_cfg_bc_intr(adapter, 0); in qlcnic_sriov_vf_reinit_driver()
1687 static void qlcnic_sriov_vf_attach(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_attach() argument
1689 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_vf_attach()
1692 if (!qlcnic_up(adapter, netdev)) in qlcnic_sriov_vf_attach()
1699 static void qlcnic_sriov_vf_detach(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_detach() argument
1701 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_detach()
1703 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_vf_detach()
1707 qlcnic_83xx_detach_mailbox_work(adapter); in qlcnic_sriov_vf_detach()
1708 qlcnic_83xx_disable_mbx_intr(adapter); in qlcnic_sriov_vf_detach()
1711 qlcnic_down(adapter, netdev); in qlcnic_sriov_vf_detach()
1721 static int qlcnic_sriov_vf_handle_dev_ready(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_handle_dev_ready() argument
1723 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_handle_dev_ready()
1724 struct device *dev = &adapter->pdev->dev; in qlcnic_sriov_vf_handle_dev_ready()
1731 if (!qlcnic_sriov_vf_reinit_driver(adapter)) { in qlcnic_sriov_vf_handle_dev_ready()
1732 qlcnic_sriov_vf_attach(adapter); in qlcnic_sriov_vf_handle_dev_ready()
1733 adapter->fw_fail_cnt = 0; in qlcnic_sriov_vf_handle_dev_ready()
1750 static int qlcnic_sriov_vf_handle_context_reset(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_handle_context_reset() argument
1752 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_handle_context_reset()
1754 struct device *dev = &adapter->pdev->dev; in qlcnic_sriov_vf_handle_context_reset()
1759 adapter->reset_ctx_cnt++; in qlcnic_sriov_vf_handle_context_reset()
1762 if (adapter->reset_ctx_cnt < 3) { in qlcnic_sriov_vf_handle_context_reset()
1763 adapter->need_fw_reset = 1; in qlcnic_sriov_vf_handle_context_reset()
1773 if (adapter->reset_ctx_cnt > QLC_83XX_VF_RESET_FAIL_THRESH) { in qlcnic_sriov_vf_handle_context_reset()
1775 adapter->tx_timeo_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1776 adapter->fw_fail_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1777 adapter->reset_ctx_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1778 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_handle_context_reset()
1786 __func__, adapter->reset_ctx_cnt, func); in qlcnic_sriov_vf_handle_context_reset()
1787 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_handle_context_reset()
1788 adapter->need_fw_reset = 1; in qlcnic_sriov_vf_handle_context_reset()
1790 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_handle_context_reset()
1791 adapter->need_fw_reset = 0; in qlcnic_sriov_vf_handle_context_reset()
1793 if (!qlcnic_sriov_vf_reinit_driver(adapter)) { in qlcnic_sriov_vf_handle_context_reset()
1794 qlcnic_sriov_vf_attach(adapter); in qlcnic_sriov_vf_handle_context_reset()
1795 adapter->tx_timeo_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1796 adapter->reset_ctx_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1797 adapter->fw_fail_cnt = 0; in qlcnic_sriov_vf_handle_context_reset()
1809 static int qlcnic_sriov_vf_idc_ready_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_ready_state() argument
1811 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_sriov_vf_idc_ready_state()
1815 ret = qlcnic_sriov_vf_handle_dev_ready(adapter); in qlcnic_sriov_vf_idc_ready_state()
1817 ret = qlcnic_sriov_vf_handle_context_reset(adapter); in qlcnic_sriov_vf_idc_ready_state()
1819 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_idc_ready_state()
1823 static int qlcnic_sriov_vf_idc_failed_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_failed_state() argument
1825 struct qlc_83xx_idc *idc = &adapter->ahw->idc; in qlcnic_sriov_vf_idc_failed_state()
1827 dev_err(&adapter->pdev->dev, "Device is in failed state\n"); in qlcnic_sriov_vf_idc_failed_state()
1829 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_idc_failed_state()
1832 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_idc_failed_state()
1837 qlcnic_sriov_vf_idc_need_quiescent_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_need_quiescent_state() argument
1839 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_sriov_vf_idc_need_quiescent_state()
1840 struct qlc_83xx_idc *idc = &adapter->ahw->idc; in qlcnic_sriov_vf_idc_need_quiescent_state()
1842 dev_info(&adapter->pdev->dev, "Device is in quiescent state\n"); in qlcnic_sriov_vf_idc_need_quiescent_state()
1844 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_idc_need_quiescent_state()
1845 adapter->tx_timeo_cnt = 0; in qlcnic_sriov_vf_idc_need_quiescent_state()
1846 adapter->reset_ctx_cnt = 0; in qlcnic_sriov_vf_idc_need_quiescent_state()
1848 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_idc_need_quiescent_state()
1854 static int qlcnic_sriov_vf_idc_init_reset_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_init_reset_state() argument
1856 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_sriov_vf_idc_init_reset_state()
1857 struct qlc_83xx_idc *idc = &adapter->ahw->idc; in qlcnic_sriov_vf_idc_init_reset_state()
1858 u8 func = adapter->ahw->pci_func; in qlcnic_sriov_vf_idc_init_reset_state()
1861 dev_err(&adapter->pdev->dev, in qlcnic_sriov_vf_idc_init_reset_state()
1863 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_idc_init_reset_state()
1864 adapter->tx_timeo_cnt = 0; in qlcnic_sriov_vf_idc_init_reset_state()
1865 adapter->reset_ctx_cnt = 0; in qlcnic_sriov_vf_idc_init_reset_state()
1867 qlcnic_sriov_vf_detach(adapter); in qlcnic_sriov_vf_idc_init_reset_state()
1872 static int qlcnic_sriov_vf_idc_unknown_state(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_idc_unknown_state() argument
1874 dev_err(&adapter->pdev->dev, "%s: Device in unknown state\n", __func__); in qlcnic_sriov_vf_idc_unknown_state()
1878 static void qlcnic_sriov_vf_periodic_tasks(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_periodic_tasks() argument
1880 if (adapter->fhash.fnum) in qlcnic_sriov_vf_periodic_tasks()
1881 qlcnic_prune_lb_filters(adapter); in qlcnic_sriov_vf_periodic_tasks()
1886 struct qlcnic_adapter *adapter; in qlcnic_sriov_vf_poll_dev_state() local
1890 adapter = container_of(work, struct qlcnic_adapter, fw_work.work); in qlcnic_sriov_vf_poll_dev_state()
1891 idc = &adapter->ahw->idc; in qlcnic_sriov_vf_poll_dev_state()
1892 idc->curr_state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE); in qlcnic_sriov_vf_poll_dev_state()
1896 ret = qlcnic_sriov_vf_idc_ready_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1900 ret = qlcnic_sriov_vf_idc_init_reset_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1903 ret = qlcnic_sriov_vf_idc_need_quiescent_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1906 ret = qlcnic_sriov_vf_idc_failed_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1911 ret = qlcnic_sriov_vf_idc_unknown_state(adapter); in qlcnic_sriov_vf_poll_dev_state()
1915 qlcnic_sriov_vf_periodic_tasks(adapter); in qlcnic_sriov_vf_poll_dev_state()
1918 qlcnic_schedule_work(adapter, qlcnic_sriov_vf_poll_dev_state, in qlcnic_sriov_vf_poll_dev_state()
1922 static void qlcnic_sriov_vf_cancel_fw_work(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_cancel_fw_work() argument
1924 while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_sriov_vf_cancel_fw_work()
1927 clear_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status); in qlcnic_sriov_vf_cancel_fw_work()
1928 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_sriov_vf_cancel_fw_work()
1929 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_sriov_vf_cancel_fw_work()
1967 static int qlcnic_sriov_validate_vlan_cfg(struct qlcnic_adapter *adapter, in qlcnic_sriov_validate_vlan_cfg() argument
1970 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_validate_vlan_cfg()
1976 vf = &adapter->ahw->sriov->vf_info[0]; in qlcnic_sriov_validate_vlan_cfg()
1982 if (qlcnic_83xx_vf_check(adapter) && vlan_exist) in qlcnic_sriov_validate_vlan_cfg()
2008 struct qlcnic_adapter *adapter = vf->adapter; in qlcnic_sriov_vlan_operation() local
2011 sriov = adapter->ahw->sriov; in qlcnic_sriov_vlan_operation()
2026 netdev_err(adapter->netdev, "Invalid VLAN operation\n"); in qlcnic_sriov_vlan_operation()
2033 int qlcnic_sriov_cfg_vf_guest_vlan(struct qlcnic_adapter *adapter, in qlcnic_sriov_cfg_vf_guest_vlan() argument
2036 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_cfg_vf_guest_vlan()
2037 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_cfg_vf_guest_vlan()
2046 vf = &adapter->ahw->sriov->vf_info[0]; in qlcnic_sriov_cfg_vf_guest_vlan()
2047 ret = qlcnic_sriov_validate_vlan_cfg(adapter, vid, enable); in qlcnic_sriov_cfg_vf_guest_vlan()
2059 ret = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_sriov_cfg_vf_guest_vlan()
2061 dev_err(&adapter->pdev->dev, in qlcnic_sriov_cfg_vf_guest_vlan()
2065 qlcnic_free_mac_list(adapter); in qlcnic_sriov_cfg_vf_guest_vlan()
2082 static void qlcnic_sriov_vf_free_mac_list(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_free_mac_list() argument
2084 struct list_head *head = &adapter->mac_list; in qlcnic_sriov_vf_free_mac_list()
2089 qlcnic_sre_macaddr_change(adapter, cur->mac_addr, cur->vlan_id, in qlcnic_sriov_vf_free_mac_list()
2099 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); in qlcnic_sriov_vf_shutdown() local
2100 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_vf_shutdown()
2104 qlcnic_cancel_idc_work(adapter); in qlcnic_sriov_vf_shutdown()
2107 qlcnic_down(adapter, netdev); in qlcnic_sriov_vf_shutdown()
2109 qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); in qlcnic_sriov_vf_shutdown()
2110 qlcnic_sriov_cfg_bc_intr(adapter, 0); in qlcnic_sriov_vf_shutdown()
2111 qlcnic_83xx_disable_mbx_intr(adapter); in qlcnic_sriov_vf_shutdown()
2112 cancel_delayed_work_sync(&adapter->idc_aen_work); in qlcnic_sriov_vf_shutdown()
2121 static int qlcnic_sriov_vf_resume(struct qlcnic_adapter *adapter) in qlcnic_sriov_vf_resume() argument
2123 struct qlc_83xx_idc *idc = &adapter->ahw->idc; in qlcnic_sriov_vf_resume()
2124 struct net_device *netdev = adapter->netdev; in qlcnic_sriov_vf_resume()
2128 qlcnic_83xx_enable_mbx_interrupt(adapter); in qlcnic_sriov_vf_resume()
2129 err = qlcnic_sriov_cfg_bc_intr(adapter, 1); in qlcnic_sriov_vf_resume()
2133 err = qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_INIT); in qlcnic_sriov_vf_resume()
2136 err = qlcnic_up(adapter, netdev); in qlcnic_sriov_vf_resume()
2143 qlcnic_schedule_work(adapter, qlcnic_sriov_vf_poll_dev_state, in qlcnic_sriov_vf_resume()
2148 void qlcnic_sriov_alloc_vlans(struct qlcnic_adapter *adapter) in qlcnic_sriov_alloc_vlans() argument
2150 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_alloc_vlans()
2161 void qlcnic_sriov_free_vlans(struct qlcnic_adapter *adapter) in qlcnic_sriov_free_vlans() argument
2163 struct qlcnic_sriov *sriov = adapter->ahw->sriov; in qlcnic_sriov_free_vlans()