Lines Matching +full:5 +full:gbase +full:- +full:x

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (c) 2009-2013 QLogic Corporation
38 #define QLC_83XX_MODULE_FIBRE_10GBASE_LRM 0x1 /* 10GBase-LRM */
39 #define QLC_83XX_MODULE_FIBRE_10GBASE_LR 0x2 /* 10GBase-LR */
40 #define QLC_83XX_MODULE_FIBRE_10GBASE_SR 0x3 /* 10GBase-SR */
50 #define QLC_83XX_MODULE_FIBRE_1000BASE_SX 0x7 /* 1000Base-SX */
51 #define QLC_83XX_MODULE_FIBRE_1000BASE_LX 0x8 /* 1000Base-LX */
52 #define QLC_83XX_MODULE_FIBRE_1000BASE_CX 0x9 /* 1000Base-CX */
53 #define QLC_83XX_MODULE_TP_1000BASE_T 0xa /* 1000Base-T*/
77 {QLCNIC_CMD_WRITE_PHY, 5, 1},
93 {QLCNIC_CMD_GET_ESWITCH_STATS, 5, 1},
96 {QLCNIC_CMD_GET_TEMP_HDR, 5, 5},
108 {QLCNIC_CMD_IDC_ACK, 5, 1},
111 {QLCNIC_CMD_SET_LED_CONFIG, 5, 1},
112 {QLCNIC_CMD_GET_LED_CONFIG, 1, 5},
262 ahw->hw_ops = &qlcnic_83xx_hw_ops; in qlcnic_83xx_register_map()
263 ahw->reg_tbl = (u32 *)qlcnic_83xx_reg_tbl; in qlcnic_83xx_register_map()
264 ahw->ext_reg_tbl = (u32 *)qlcnic_83xx_ext_reg_tbl; in qlcnic_83xx_register_map()
270 struct pci_dev *pdev = adapter->pdev; in qlcnic_83xx_get_fw_version()
275 adapter->fw_version = QLCNIC_VERSION_CODE(fw_major, fw_minor, fw_build); in qlcnic_83xx_get_fw_version()
277 dev_info(&pdev->dev, "Driver v%s, firmware version %d.%d.%d\n", in qlcnic_83xx_get_fw_version()
280 return adapter->fw_version; in qlcnic_83xx_get_fw_version()
288 base = adapter->ahw->pci_base0 + in __qlcnic_set_win_base()
289 QLC_83XX_CRB_WIN_FUNC(adapter->ahw->pci_func); in __qlcnic_set_win_base()
293 return -EIO; in __qlcnic_set_win_base()
301 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_rd_reg_indirect()
307 dev_err(&adapter->pdev->dev, in qlcnic_83xx_rd_reg_indirect()
308 "%s failed, addr = 0x%lx\n", __func__, addr); in qlcnic_83xx_rd_reg_indirect()
309 return -EIO; in qlcnic_83xx_rd_reg_indirect()
317 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_wrt_reg_indirect()
324 dev_err(&adapter->pdev->dev, in qlcnic_83xx_wrt_reg_indirect()
325 "%s failed, addr = 0x%x data = 0x%x\n", in qlcnic_83xx_wrt_reg_indirect()
333 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_enable_legacy()
335 /* MSI-X enablement failed, use legacy interrupt */ in qlcnic_83xx_enable_legacy()
336 adapter->tgt_status_reg = ahw->pci_base0 + QLC_83XX_INTX_PTR; in qlcnic_83xx_enable_legacy()
337 adapter->tgt_mask_reg = ahw->pci_base0 + QLC_83XX_INTX_MASK; in qlcnic_83xx_enable_legacy()
338 adapter->isr_int_vec = ahw->pci_base0 + QLC_83XX_INTX_TRGR; in qlcnic_83xx_enable_legacy()
339 adapter->msix_entries[0].vector = adapter->pdev->irq; in qlcnic_83xx_enable_legacy()
340 dev_info(&adapter->pdev->dev, "using legacy interrupt\n"); in qlcnic_83xx_enable_legacy()
347 num_msix = adapter->drv_sds_rings; in qlcnic_83xx_calculate_msix_vector()
349 /* account for AEN interrupt MSI-X based interrupts */ in qlcnic_83xx_calculate_msix_vector()
352 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) in qlcnic_83xx_calculate_msix_vector()
353 num_msix += adapter->drv_tx_rings; in qlcnic_83xx_calculate_msix_vector()
360 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_setup_intr()
363 if (adapter->flags & QLCNIC_TSS_RSS) { in qlcnic_83xx_setup_intr()
367 num_msix = ahw->num_msix; in qlcnic_83xx_setup_intr()
372 if (err == -ENOMEM) in qlcnic_83xx_setup_intr()
375 if (adapter->flags & QLCNIC_MSIX_ENABLED) { in qlcnic_83xx_setup_intr()
376 num_msix = ahw->num_msix; in qlcnic_83xx_setup_intr()
379 return -EINVAL; in qlcnic_83xx_setup_intr()
381 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; in qlcnic_83xx_setup_intr()
382 adapter->drv_tx_rings = QLCNIC_SINGLE_RING; in qlcnic_83xx_setup_intr()
387 ahw->intr_tbl = in qlcnic_83xx_setup_intr()
390 if (!ahw->intr_tbl) in qlcnic_83xx_setup_intr()
391 return -ENOMEM; in qlcnic_83xx_setup_intr()
393 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) { in qlcnic_83xx_setup_intr()
394 if (adapter->ahw->pci_func >= QLC_MAX_LEGACY_FUNC_SUPP) { in qlcnic_83xx_setup_intr()
395 …dev_err(&adapter->pdev->dev, "PCI function number 8 and higher are not supported with legacy inter… in qlcnic_83xx_setup_intr()
396 ahw->pci_func); in qlcnic_83xx_setup_intr()
397 return -EOPNOTSUPP; in qlcnic_83xx_setup_intr()
404 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_setup_intr()
405 ahw->intr_tbl[i].type = QLCNIC_INTRPT_MSIX; in qlcnic_83xx_setup_intr()
407 ahw->intr_tbl[i].type = QLCNIC_INTRPT_INTX; in qlcnic_83xx_setup_intr()
408 ahw->intr_tbl[i].id = i; in qlcnic_83xx_setup_intr()
409 ahw->intr_tbl[i].src = 0; in qlcnic_83xx_setup_intr()
417 writel(0, adapter->tgt_mask_reg); in qlcnic_83xx_clear_legacy_intr_mask()
422 if (adapter->tgt_mask_reg) in qlcnic_83xx_set_legacy_intr_mask()
423 writel(1, adapter->tgt_mask_reg); in qlcnic_83xx_set_legacy_intr_mask()
431 /* Mailbox in MSI-x mode and Legacy Interrupt share the same in qlcnic_83xx_enable_legacy_msix_mbx_intr()
433 * and sds_ring->crb_intr_mask has not been initialized, calculate in qlcnic_83xx_enable_legacy_msix_mbx_intr()
436 mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK); in qlcnic_83xx_enable_legacy_msix_mbx_intr()
437 writel(0, adapter->ahw->pci_base0 + mask); in qlcnic_83xx_enable_legacy_msix_mbx_intr()
444 mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK); in qlcnic_83xx_disable_mbx_intr()
445 writel(1, adapter->ahw->pci_base0 + mask); in qlcnic_83xx_disable_mbx_intr()
446 QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, 0); in qlcnic_83xx_disable_mbx_intr()
454 if (cmd->op_type == QLC_83XX_MBX_POST_BC_OP) in qlcnic_83xx_get_mbx_data()
457 for (i = 0; i < cmd->rsp.num; i++) in qlcnic_83xx_get_mbx_data()
458 cmd->rsp.arg[i] = readl(QLCNIC_MBX_FW(adapter->ahw, i)); in qlcnic_83xx_get_mbx_data()
464 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_clear_legacy_intr()
467 intr_val = readl(adapter->tgt_status_reg); in qlcnic_83xx_clear_legacy_intr()
472 if (QLC_83XX_INTX_FUNC(intr_val) != adapter->ahw->pci_func) { in qlcnic_83xx_clear_legacy_intr()
473 adapter->stats.spurious_intr++; in qlcnic_83xx_clear_legacy_intr()
480 writel_relaxed(0, adapter->isr_int_vec); in qlcnic_83xx_clear_legacy_intr()
481 intr_val = readl(adapter->isr_int_vec); in qlcnic_83xx_clear_legacy_intr()
483 intr_val = readl(adapter->tgt_status_reg); in qlcnic_83xx_clear_legacy_intr()
484 if (QLC_83XX_INTX_FUNC(intr_val) != ahw->pci_func) in qlcnic_83xx_clear_legacy_intr()
495 mbx->rsp_status = QLC_83XX_MBX_RESPONSE_ARRIVED; in qlcnic_83xx_notify_mbx_response()
496 complete(&mbx->completion); in qlcnic_83xx_notify_mbx_response()
502 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_83xx_poll_process_aen()
505 spin_lock_irqsave(&mbx->aen_lock, flags); in qlcnic_83xx_poll_process_aen()
506 resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL); in qlcnic_83xx_poll_process_aen()
510 event = readl(QLCNIC_MBX_FW(adapter->ahw, 0)); in qlcnic_83xx_poll_process_aen()
514 if (mbx->rsp_status != rsp_status) in qlcnic_83xx_poll_process_aen()
519 spin_unlock_irqrestore(&mbx->aen_lock, flags); in qlcnic_83xx_poll_process_aen()
526 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_intr()
533 if (ahw->diag_test) { in qlcnic_83xx_intr()
534 if (ahw->diag_test == QLCNIC_INTERRUPT_TEST) in qlcnic_83xx_intr()
535 ahw->diag_cnt++; in qlcnic_83xx_intr()
540 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) { in qlcnic_83xx_intr()
543 sds_ring = &adapter->recv_ctx->sds_rings[0]; in qlcnic_83xx_intr()
544 napi_schedule(&sds_ring->napi); in qlcnic_83xx_intr()
553 struct qlcnic_adapter *adapter = sds_ring->adapter; in qlcnic_83xx_tmp_intr()
555 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_tmp_intr()
558 if (adapter->nic_ops->clear_legacy_intr(adapter) == IRQ_NONE) in qlcnic_83xx_tmp_intr()
562 adapter->ahw->diag_cnt++; in qlcnic_83xx_tmp_intr()
572 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) in qlcnic_83xx_free_mbx_intr()
577 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_free_mbx_intr()
578 num_msix = adapter->ahw->num_msix - 1; in qlcnic_83xx_free_mbx_intr()
584 if (adapter->msix_entries) { in qlcnic_83xx_free_mbx_intr()
585 synchronize_irq(adapter->msix_entries[num_msix].vector); in qlcnic_83xx_free_mbx_intr()
586 free_irq(adapter->msix_entries[num_msix].vector, adapter); in qlcnic_83xx_free_mbx_intr()
597 if (!(adapter->flags & QLCNIC_MSI_ENABLED) && in qlcnic_83xx_setup_mbx_intr()
598 !(adapter->flags & QLCNIC_MSIX_ENABLED)) in qlcnic_83xx_setup_mbx_intr()
601 if (adapter->flags & QLCNIC_MSIX_ENABLED) { in qlcnic_83xx_setup_mbx_intr()
603 val = adapter->msix_entries[adapter->ahw->num_msix - 1].vector; in qlcnic_83xx_setup_mbx_intr()
604 err = request_irq(val, handler, flags, "qlcnic-MB", adapter); in qlcnic_83xx_setup_mbx_intr()
606 dev_err(&adapter->pdev->dev, in qlcnic_83xx_setup_mbx_intr()
612 val = adapter->msix_entries[0].vector; in qlcnic_83xx_setup_mbx_intr()
615 dev_err(&adapter->pdev->dev, in qlcnic_83xx_setup_mbx_intr()
630 u32 val = QLCRDX(adapter->ahw, QLCNIC_INFORMANT); in qlcnic_83xx_get_func_no()
631 adapter->ahw->pci_func = (val >> 24) & 0xff; in qlcnic_83xx_get_func_no()
639 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_cam_lock()
641 addr = ahw->pci_base0 + QLC_83XX_SEM_LOCK_FUNC(ahw->pci_func); in qlcnic_83xx_cam_lock()
647 ahw->pci_func); in qlcnic_83xx_cam_lock()
653 return -EIO; in qlcnic_83xx_cam_lock()
659 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_cam_unlock()
661 addr = ahw->pci_base0 + QLC_83XX_SEM_UNLOCK_FUNC(ahw->pci_func); in qlcnic_83xx_cam_unlock()
672 dev_err(&adapter->pdev->dev, in qlcnic_83xx_read_crb()
673 "%s: failed to acquire lock. addr offset 0x%x\n", in qlcnic_83xx_read_crb()
681 if (ret == -EIO) { in qlcnic_83xx_read_crb()
682 dev_err(&adapter->pdev->dev, in qlcnic_83xx_read_crb()
683 "%s: failed. addr offset 0x%x\n", in qlcnic_83xx_read_crb()
701 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_get_port_info()
706 dev_err(&adapter->pdev->dev, in qlcnic_83xx_get_port_info()
710 if (ahw->port_config & QLC_83XX_10G_CAPABLE) { in qlcnic_83xx_get_port_info()
711 ahw->port_type = QLCNIC_XGBE; in qlcnic_83xx_get_port_info()
712 } else if (ahw->port_config & QLC_83XX_10_CAPABLE || in qlcnic_83xx_get_port_info()
713 ahw->port_config & QLC_83XX_100_CAPABLE || in qlcnic_83xx_get_port_info()
714 ahw->port_config & QLC_83XX_1G_CAPABLE) { in qlcnic_83xx_get_port_info()
715 ahw->port_type = QLCNIC_GBE; in qlcnic_83xx_get_port_info()
717 ahw->port_type = QLCNIC_XGBE; in qlcnic_83xx_get_port_info()
720 if (QLC_83XX_AUTONEG(ahw->port_config)) in qlcnic_83xx_get_port_info()
721 ahw->link_autoneg = AUTONEG_ENABLE; in qlcnic_83xx_get_port_info()
729 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_set_mac_filter_count()
730 u16 act_pci_fn = ahw->total_nic_func; in qlcnic_83xx_set_mac_filter_count()
733 ahw->max_mc_count = QLC_83XX_MAX_MC_COUNT; in qlcnic_83xx_set_mac_filter_count()
735 count = (QLC_83XX_MAX_UC_COUNT - QLC_83XX_MAX_MC_COUNT) / in qlcnic_83xx_set_mac_filter_count()
738 count = (QLC_83XX_LB_MAX_FILTERS - QLC_83XX_MAX_MC_COUNT) / in qlcnic_83xx_set_mac_filter_count()
740 ahw->max_uc_count = count; in qlcnic_83xx_set_mac_filter_count()
747 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_enable_mbx_interrupt()
748 val = BIT_2 | ((adapter->ahw->num_msix - 1) << 8); in qlcnic_83xx_enable_mbx_interrupt()
752 QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, val); in qlcnic_83xx_enable_mbx_interrupt()
760 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_check_vf()
762 ahw->fw_hal_version = 2; in qlcnic_83xx_check_vf()
771 op_mode = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE); in qlcnic_83xx_check_vf()
776 ahw->pci_func); in qlcnic_83xx_check_vf()
779 ahw->op_mode = QLCNIC_NON_PRIV_FUNC; in qlcnic_83xx_check_vf()
780 dev_info(&adapter->pdev->dev, in qlcnic_83xx_check_vf()
782 ahw->fw_hal_version); in qlcnic_83xx_check_vf()
783 adapter->nic_ops = &qlcnic_vf_ops; in qlcnic_83xx_check_vf()
785 if (pci_find_ext_capability(adapter->pdev, in qlcnic_83xx_check_vf()
787 set_bit(__QLCNIC_SRIOV_CAPABLE, &adapter->state); in qlcnic_83xx_check_vf()
788 adapter->nic_ops = &qlcnic_83xx_ops; in qlcnic_83xx_check_vf()
802 if (cmd->op_type == QLC_83XX_MBX_POST_BC_OP) in qlcnic_dump_mbx()
805 dev_info(&adapter->pdev->dev, in qlcnic_dump_mbx()
806 "Host MBX regs(%d)\n", cmd->req.num); in qlcnic_dump_mbx()
807 for (i = 0; i < cmd->req.num; i++) { in qlcnic_dump_mbx()
810 pr_info("%08x ", cmd->req.arg[i]); in qlcnic_dump_mbx()
813 dev_info(&adapter->pdev->dev, in qlcnic_dump_mbx()
814 "FW MBX regs(%d)\n", cmd->rsp.num); in qlcnic_dump_mbx()
815 for (i = 0; i < cmd->rsp.num; i++) { in qlcnic_dump_mbx()
818 pr_info("%08x ", cmd->rsp.arg[i]); in qlcnic_dump_mbx()
826 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_poll_for_mbx_completion()
827 int opcode = LSW(cmd->req.arg[0]); in qlcnic_83xx_poll_for_mbx_completion()
830 max_loops = cmd->total_cmds * QLC_83XX_MBX_CMD_LOOP; in qlcnic_83xx_poll_for_mbx_completion()
832 for (; max_loops; max_loops--) { in qlcnic_83xx_poll_for_mbx_completion()
833 if (atomic_read(&cmd->rsp_status) == in qlcnic_83xx_poll_for_mbx_completion()
840 dev_err(&adapter->pdev->dev, in qlcnic_83xx_poll_for_mbx_completion()
841 "%s: Mailbox command timed out, cmd_op=0x%x, cmd_type=0x%x, pci_func=0x%x, op_mode=0x%x\n", in qlcnic_83xx_poll_for_mbx_completion()
842 __func__, opcode, cmd->type, ahw->pci_func, ahw->op_mode); in qlcnic_83xx_poll_for_mbx_completion()
843 flush_workqueue(ahw->mailbox->work_q); in qlcnic_83xx_poll_for_mbx_completion()
850 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_83xx_issue_cmd()
851 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_issue_cmd()
856 return -EIO; in qlcnic_83xx_issue_cmd()
858 opcode = LSW(cmd->req.arg[0]); in qlcnic_83xx_issue_cmd()
859 cmd_type = cmd->type; in qlcnic_83xx_issue_cmd()
860 err = mbx->ops->enqueue_cmd(adapter, cmd, &timeout); in qlcnic_83xx_issue_cmd()
862 dev_err(&adapter->pdev->dev, in qlcnic_83xx_issue_cmd()
863 "%s: Mailbox not available, cmd_op=0x%x, cmd_context=0x%x, pci_func=0x%x, op_mode=0x%x\n", in qlcnic_83xx_issue_cmd()
864 __func__, opcode, cmd->type, ahw->pci_func, in qlcnic_83xx_issue_cmd()
865 ahw->op_mode); in qlcnic_83xx_issue_cmd()
871 if (!wait_for_completion_timeout(&cmd->completion, timeout)) { in qlcnic_83xx_issue_cmd()
872 dev_err(&adapter->pdev->dev, in qlcnic_83xx_issue_cmd()
873 "%s: Mailbox command timed out, cmd_op=0x%x, cmd_type=0x%x, pci_func=0x%x, op_mode=0x%x\n", in qlcnic_83xx_issue_cmd()
874 __func__, opcode, cmd_type, ahw->pci_func, in qlcnic_83xx_issue_cmd()
875 ahw->op_mode); in qlcnic_83xx_issue_cmd()
876 flush_workqueue(mbx->work_q); in qlcnic_83xx_issue_cmd()
885 dev_err(&adapter->pdev->dev, in qlcnic_83xx_issue_cmd()
886 "%s: Invalid mailbox command, cmd_op=0x%x, cmd_type=0x%x, pci_func=0x%x, op_mode=0x%x\n", in qlcnic_83xx_issue_cmd()
887 __func__, opcode, cmd_type, ahw->pci_func, in qlcnic_83xx_issue_cmd()
888 ahw->op_mode); in qlcnic_83xx_issue_cmd()
892 return cmd->rsp_opcode; in qlcnic_83xx_issue_cmd()
907 mbx->op_type = QLC_83XX_FW_MBX_CMD; in qlcnic_83xx_alloc_mbx_args()
908 mbx->req.num = mbx_tbl[i].in_args; in qlcnic_83xx_alloc_mbx_args()
909 mbx->rsp.num = mbx_tbl[i].out_args; in qlcnic_83xx_alloc_mbx_args()
910 mbx->req.arg = kcalloc(mbx->req.num, sizeof(u32), in qlcnic_83xx_alloc_mbx_args()
912 if (!mbx->req.arg) in qlcnic_83xx_alloc_mbx_args()
913 return -ENOMEM; in qlcnic_83xx_alloc_mbx_args()
914 mbx->rsp.arg = kcalloc(mbx->rsp.num, sizeof(u32), in qlcnic_83xx_alloc_mbx_args()
916 if (!mbx->rsp.arg) { in qlcnic_83xx_alloc_mbx_args()
917 kfree(mbx->req.arg); in qlcnic_83xx_alloc_mbx_args()
918 mbx->req.arg = NULL; in qlcnic_83xx_alloc_mbx_args()
919 return -ENOMEM; in qlcnic_83xx_alloc_mbx_args()
921 temp = adapter->ahw->fw_hal_version << 29; in qlcnic_83xx_alloc_mbx_args()
922 mbx->req.arg[0] = (type | (mbx->req.num << 16) | temp); in qlcnic_83xx_alloc_mbx_args()
923 mbx->cmd_op = type; in qlcnic_83xx_alloc_mbx_args()
928 dev_err(&adapter->pdev->dev, "%s: Invalid mailbox command opcode 0x%x\n", in qlcnic_83xx_alloc_mbx_args()
930 return -EINVAL; in qlcnic_83xx_alloc_mbx_args()
945 cmd.req.arg[i] = adapter->ahw->mbox_aen[i]; in qlcnic_83xx_idc_aen_work()
949 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_aen_work()
957 dev_dbg(&adapter->pdev->dev, "Completion AEN:0x%x.\n", in qlcnic_83xx_handle_idc_comp_aen()
959 clear_bit(QLC_83XX_IDC_COMP_AEN, &adapter->ahw->idc.status); in qlcnic_83xx_handle_idc_comp_aen()
965 struct qlcnic_hardware_context *ahw = adapter->ahw; in __qlcnic_83xx_process_aen()
982 adapter->ahw->mbox_aen[i] = QLCNIC_MBX_RSP(event[i]); in __qlcnic_83xx_process_aen()
983 queue_delayed_work(adapter->qlcnic_wq, in __qlcnic_83xx_process_aen()
984 &adapter->idc_aen_work, 0); in __qlcnic_83xx_process_aen()
987 ahw->extend_lb_time = event[1] >> 8 & 0xf; in __qlcnic_83xx_process_aen()
993 dev_info(&adapter->pdev->dev, "SFP+ Insert AEN:0x%x.\n", in __qlcnic_83xx_process_aen()
997 dev_info(&adapter->pdev->dev, "SFP Removed AEN:0x%x.\n", in __qlcnic_83xx_process_aen()
1001 qlcnic_dcb_aen_handler(adapter->dcb, (void *)&event[1]); in __qlcnic_83xx_process_aen()
1004 dev_dbg(&adapter->pdev->dev, "Unsupported AEN:0x%x.\n", in __qlcnic_83xx_process_aen()
1015 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_process_aen()
1016 struct qlcnic_mailbox *mbx = ahw->mailbox; in qlcnic_83xx_process_aen()
1019 spin_lock_irqsave(&mbx->aen_lock, flags); in qlcnic_83xx_process_aen()
1026 if (mbx->rsp_status != rsp_status) in qlcnic_83xx_process_aen()
1030 spin_unlock_irqrestore(&mbx->aen_lock, flags); in qlcnic_83xx_process_aen()
1039 if (!test_bit(__QLCNIC_MBX_POLL_ENABLE, &adapter->state)) in qlcnic_83xx_mbx_poll_work()
1043 queue_delayed_work(adapter->qlcnic_wq, &adapter->mbx_poll_work, in qlcnic_83xx_mbx_poll_work()
1049 if (test_and_set_bit(__QLCNIC_MBX_POLL_ENABLE, &adapter->state)) in qlcnic_83xx_enable_mbx_poll()
1052 INIT_DELAYED_WORK(&adapter->mbx_poll_work, qlcnic_83xx_mbx_poll_work); in qlcnic_83xx_enable_mbx_poll()
1053 queue_delayed_work(adapter->qlcnic_wq, &adapter->mbx_poll_work, 0); in qlcnic_83xx_enable_mbx_poll()
1058 if (!test_and_clear_bit(__QLCNIC_MBX_POLL_ENABLE, &adapter->state)) in qlcnic_83xx_disable_mbx_poll()
1060 cancel_delayed_work_sync(&adapter->mbx_poll_work); in qlcnic_83xx_disable_mbx_poll()
1073 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_83xx_add_rings()
1074 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_add_rings()
1077 context_id = recv_ctx->context_id; in qlcnic_83xx_add_rings()
1078 num_sds = adapter->drv_sds_rings - QLCNIC_MAX_SDS_RINGS; in qlcnic_83xx_add_rings()
1079 err = ahw->hw_ops->alloc_mbx_args(&cmd, adapter, in qlcnic_83xx_add_rings()
1082 dev_err(&adapter->pdev->dev, in qlcnic_83xx_add_rings()
1089 /* set up status rings, mbx 2-81 */ in qlcnic_83xx_add_rings()
1091 for (i = 8; i < adapter->drv_sds_rings; i++) { in qlcnic_83xx_add_rings()
1093 sds = &recv_ctx->sds_rings[i]; in qlcnic_83xx_add_rings()
1094 sds->consumer = 0; in qlcnic_83xx_add_rings()
1095 memset(sds->desc_head, 0, STATUS_DESC_RINGSIZE(sds)); in qlcnic_83xx_add_rings()
1096 sds_mbx.phy_addr_low = LSD(sds->phys_addr); in qlcnic_83xx_add_rings()
1097 sds_mbx.phy_addr_high = MSD(sds->phys_addr); in qlcnic_83xx_add_rings()
1098 sds_mbx.sds_ring_size = sds->num_desc; in qlcnic_83xx_add_rings()
1100 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_add_rings()
1101 intrpt_id = ahw->intr_tbl[i].id; in qlcnic_83xx_add_rings()
1105 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) in qlcnic_83xx_add_rings()
1116 err = ahw->hw_ops->mbx_cmd(adapter, &cmd); in qlcnic_83xx_add_rings()
1118 dev_err(&adapter->pdev->dev, in qlcnic_83xx_add_rings()
1126 for (i = 8; i < adapter->drv_sds_rings; i++) { in qlcnic_83xx_add_rings()
1127 sds = &recv_ctx->sds_rings[i]; in qlcnic_83xx_add_rings()
1128 sds->crb_sts_consumer = ahw->pci_base0 + in qlcnic_83xx_add_rings()
1129 mbx_out->host_csmr[index]; in qlcnic_83xx_add_rings()
1130 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_add_rings()
1131 intr_mask = ahw->intr_tbl[i].src; in qlcnic_83xx_add_rings()
1135 sds->crb_intr_mask = ahw->pci_base0 + intr_mask; in qlcnic_83xx_add_rings()
1148 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_83xx_del_rx_ctx()
1159 cmd.req.arg[1] = recv_ctx->context_id | temp; in qlcnic_83xx_del_rx_ctx()
1162 dev_err(&adapter->pdev->dev, in qlcnic_83xx_del_rx_ctx()
1165 recv_ctx->state = QLCNIC_HOST_CTX_STATE_FREED; in qlcnic_83xx_del_rx_ctx()
1180 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; in qlcnic_83xx_create_rx_ctx()
1181 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_create_rx_ctx()
1182 num_rds = adapter->max_rds_rings; in qlcnic_83xx_create_rx_ctx()
1184 if (adapter->drv_sds_rings <= QLCNIC_MAX_SDS_RINGS) in qlcnic_83xx_create_rx_ctx()
1185 num_sds = adapter->drv_sds_rings; in qlcnic_83xx_create_rx_ctx()
1193 if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP) in qlcnic_83xx_create_rx_ctx()
1206 cmd.req.arg[5] = 1 | (num_rds << 5) | (num_sds << 8) | in qlcnic_83xx_create_rx_ctx()
1212 /* set up status rings, mbx 8-57/87 */ in qlcnic_83xx_create_rx_ctx()
1216 sds = &recv_ctx->sds_rings[i]; in qlcnic_83xx_create_rx_ctx()
1217 sds->consumer = 0; in qlcnic_83xx_create_rx_ctx()
1218 memset(sds->desc_head, 0, STATUS_DESC_RINGSIZE(sds)); in qlcnic_83xx_create_rx_ctx()
1219 sds_mbx.phy_addr_low = LSD(sds->phys_addr); in qlcnic_83xx_create_rx_ctx()
1220 sds_mbx.phy_addr_high = MSD(sds->phys_addr); in qlcnic_83xx_create_rx_ctx()
1221 sds_mbx.sds_ring_size = sds->num_desc; in qlcnic_83xx_create_rx_ctx()
1222 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_create_rx_ctx()
1223 intrpt_id = ahw->intr_tbl[i].id; in qlcnic_83xx_create_rx_ctx()
1226 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) in qlcnic_83xx_create_rx_ctx()
1235 /* set up receive rings, mbx 88-111/135 */ in qlcnic_83xx_create_rx_ctx()
1237 rds = &recv_ctx->rds_rings[0]; in qlcnic_83xx_create_rx_ctx()
1238 rds->producer = 0; in qlcnic_83xx_create_rx_ctx()
1240 rds_mbx.phy_addr_reg_low = LSD(rds->phys_addr); in qlcnic_83xx_create_rx_ctx()
1241 rds_mbx.phy_addr_reg_high = MSD(rds->phys_addr); in qlcnic_83xx_create_rx_ctx()
1242 rds_mbx.reg_ring_sz = rds->dma_size; in qlcnic_83xx_create_rx_ctx()
1243 rds_mbx.reg_ring_len = rds->num_desc; in qlcnic_83xx_create_rx_ctx()
1245 rds = &recv_ctx->rds_rings[1]; in qlcnic_83xx_create_rx_ctx()
1246 rds->producer = 0; in qlcnic_83xx_create_rx_ctx()
1247 rds_mbx.phy_addr_jmb_low = LSD(rds->phys_addr); in qlcnic_83xx_create_rx_ctx()
1248 rds_mbx.phy_addr_jmb_high = MSD(rds->phys_addr); in qlcnic_83xx_create_rx_ctx()
1249 rds_mbx.jmb_ring_sz = rds->dma_size; in qlcnic_83xx_create_rx_ctx()
1250 rds_mbx.jmb_ring_len = rds->num_desc; in qlcnic_83xx_create_rx_ctx()
1255 err = ahw->hw_ops->mbx_cmd(adapter, &cmd); in qlcnic_83xx_create_rx_ctx()
1257 dev_err(&adapter->pdev->dev, in qlcnic_83xx_create_rx_ctx()
1262 recv_ctx->context_id = mbx_out->ctx_id; in qlcnic_83xx_create_rx_ctx()
1263 recv_ctx->state = mbx_out->state; in qlcnic_83xx_create_rx_ctx()
1264 recv_ctx->virt_port = mbx_out->vport_id; in qlcnic_83xx_create_rx_ctx()
1265 dev_info(&adapter->pdev->dev, "Rx Context[%d] Created, state:0x%x\n", in qlcnic_83xx_create_rx_ctx()
1266 recv_ctx->context_id, recv_ctx->state); in qlcnic_83xx_create_rx_ctx()
1269 rds = &recv_ctx->rds_rings[0]; in qlcnic_83xx_create_rx_ctx()
1270 rds->crb_rcv_producer = ahw->pci_base0 + in qlcnic_83xx_create_rx_ctx()
1271 mbx_out->host_prod[0].reg_buf; in qlcnic_83xx_create_rx_ctx()
1273 rds = &recv_ctx->rds_rings[1]; in qlcnic_83xx_create_rx_ctx()
1274 rds->crb_rcv_producer = ahw->pci_base0 + in qlcnic_83xx_create_rx_ctx()
1275 mbx_out->host_prod[0].jmb_buf; in qlcnic_83xx_create_rx_ctx()
1278 sds = &recv_ctx->sds_rings[i]; in qlcnic_83xx_create_rx_ctx()
1279 sds->crb_sts_consumer = ahw->pci_base0 + in qlcnic_83xx_create_rx_ctx()
1280 mbx_out->host_csmr[i]; in qlcnic_83xx_create_rx_ctx()
1281 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_create_rx_ctx()
1282 intr_mask = ahw->intr_tbl[i].src; in qlcnic_83xx_create_rx_ctx()
1285 sds->crb_intr_mask = ahw->pci_base0 + intr_mask; in qlcnic_83xx_create_rx_ctx()
1288 if (adapter->drv_sds_rings > QLCNIC_MAX_SDS_RINGS) in qlcnic_83xx_create_rx_ctx()
1310 cmd.req.arg[1] = tx_ring->ctx_id | temp; in qlcnic_83xx_del_tx_ctx()
1312 dev_err(&adapter->pdev->dev, in qlcnic_83xx_del_tx_ctx()
1326 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_create_tx_ctx()
1330 tx->producer = 0; in qlcnic_83xx_create_tx_ctx()
1331 tx->sw_consumer = 0; in qlcnic_83xx_create_tx_ctx()
1332 *(tx->hw_consumer) = 0; in qlcnic_83xx_create_tx_ctx()
1337 mbx.phys_addr_low = LSD(tx->phys_addr); in qlcnic_83xx_create_tx_ctx()
1338 mbx.phys_addr_high = MSD(tx->phys_addr); in qlcnic_83xx_create_tx_ctx()
1339 mbx.cnsmr_index_low = LSD(tx->hw_cons_phys_addr); in qlcnic_83xx_create_tx_ctx()
1340 mbx.cnsmr_index_high = MSD(tx->hw_cons_phys_addr); in qlcnic_83xx_create_tx_ctx()
1341 mbx.size = tx->num_desc; in qlcnic_83xx_create_tx_ctx()
1342 if (adapter->flags & QLCNIC_MSIX_ENABLED) { in qlcnic_83xx_create_tx_ctx()
1343 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED)) in qlcnic_83xx_create_tx_ctx()
1344 msix_vector = adapter->drv_sds_rings + ring; in qlcnic_83xx_create_tx_ctx()
1346 msix_vector = adapter->drv_sds_rings - 1; in qlcnic_83xx_create_tx_ctx()
1347 msix_id = ahw->intr_tbl[msix_vector].id; in qlcnic_83xx_create_tx_ctx()
1352 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) in qlcnic_83xx_create_tx_ctx()
1369 cmd.req.arg[5] = QLCNIC_SINGLE_RING | temp; in qlcnic_83xx_create_tx_ctx()
1376 netdev_err(adapter->netdev, in qlcnic_83xx_create_tx_ctx()
1377 "Failed to create Tx ctx in firmware 0x%x\n", err); in qlcnic_83xx_create_tx_ctx()
1381 tx->crb_cmd_producer = ahw->pci_base0 + mbx_out->host_prod; in qlcnic_83xx_create_tx_ctx()
1382 tx->ctx_id = mbx_out->ctx_id; in qlcnic_83xx_create_tx_ctx()
1383 if ((adapter->flags & QLCNIC_MSIX_ENABLED) && in qlcnic_83xx_create_tx_ctx()
1384 !(adapter->flags & QLCNIC_TX_INTR_SHARED)) { in qlcnic_83xx_create_tx_ctx()
1385 intr_mask = ahw->intr_tbl[adapter->drv_sds_rings + ring].src; in qlcnic_83xx_create_tx_ctx()
1386 tx->crb_intr_mask = ahw->pci_base0 + intr_mask; in qlcnic_83xx_create_tx_ctx()
1388 netdev_info(adapter->netdev, in qlcnic_83xx_create_tx_ctx()
1389 "Tx Context[0x%x] Created, state:0x%x\n", in qlcnic_83xx_create_tx_ctx()
1390 tx->ctx_id, mbx_out->state); in qlcnic_83xx_create_tx_ctx()
1402 u16 adapter_state = adapter->is_up; in qlcnic_83xx_diag_alloc_res()
1413 adapter->drv_sds_rings = QLCNIC_SINGLE_RING; in qlcnic_83xx_diag_alloc_res()
1414 adapter->ahw->diag_test = test; in qlcnic_83xx_diag_alloc_res()
1415 adapter->ahw->linkup = 0; in qlcnic_83xx_diag_alloc_res()
1427 adapter->drv_sds_rings = num_sds_ring; in qlcnic_83xx_diag_alloc_res()
1434 for (ring = 0; ring < adapter->max_rds_rings; ring++) { in qlcnic_83xx_diag_alloc_res()
1435 rds_ring = &adapter->recv_ctx->rds_rings[ring]; in qlcnic_83xx_diag_alloc_res()
1439 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_83xx_diag_alloc_res()
1440 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_83xx_diag_alloc_res()
1441 sds_ring = &adapter->recv_ctx->sds_rings[ring]; in qlcnic_83xx_diag_alloc_res()
1446 if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) { in qlcnic_83xx_diag_alloc_res()
1447 adapter->ahw->loopback_state = 0; in qlcnic_83xx_diag_alloc_res()
1448 adapter->ahw->hw_ops->setup_link_event(adapter, 1); in qlcnic_83xx_diag_alloc_res()
1451 set_bit(__QLCNIC_DEV_UP, &adapter->state); in qlcnic_83xx_diag_alloc_res()
1462 clear_bit(__QLCNIC_DEV_UP, &adapter->state); in qlcnic_83xx_diag_free_res()
1463 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { in qlcnic_83xx_diag_free_res()
1464 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { in qlcnic_83xx_diag_free_res()
1465 sds_ring = &adapter->recv_ctx->sds_rings[ring]; in qlcnic_83xx_diag_free_res()
1466 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_diag_free_res()
1474 adapter->ahw->diag_test = 0; in qlcnic_83xx_diag_free_res()
1475 adapter->drv_sds_rings = drv_sds_rings; in qlcnic_83xx_diag_free_res()
1489 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_get_beacon_state()
1500 ahw->beacon_state = QLC_83XX_BEACON_OFF; in qlcnic_83xx_get_beacon_state()
1502 ahw->beacon_state = QLC_83XX_BEACON_ON; in qlcnic_83xx_get_beacon_state()
1505 netdev_err(adapter->netdev, "Get beacon state failed, err=%d\n", in qlcnic_83xx_get_beacon_state()
1530 dev_err(&adapter->pdev->dev, in qlcnic_83xx_config_led()
1535 adapter->ahw->mbox_reg[i] = cmd.rsp.arg[i+1]; in qlcnic_83xx_config_led()
1553 dev_err(&adapter->pdev->dev, in qlcnic_83xx_config_led()
1567 cmd.req.arg[1] = adapter->ahw->mbox_reg[0]; in qlcnic_83xx_config_led()
1568 cmd.req.arg[2] = adapter->ahw->mbox_reg[1]; in qlcnic_83xx_config_led()
1569 cmd.req.arg[3] = adapter->ahw->mbox_reg[2]; in qlcnic_83xx_config_led()
1571 cmd.req.arg[4] = adapter->ahw->mbox_reg[3]; in qlcnic_83xx_config_led()
1574 dev_err(&adapter->pdev->dev, in qlcnic_83xx_config_led()
1585 int err = -EIO, active = 1; in qlcnic_83xx_set_led()
1587 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { in qlcnic_83xx_set_led()
1589 "LED test is not supported in non-privileged mode\n"); in qlcnic_83xx_set_led()
1590 return -EOPNOTSUPP; in qlcnic_83xx_set_led()
1595 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) in qlcnic_83xx_set_led()
1596 return -EBUSY; in qlcnic_83xx_set_led()
1598 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_83xx_set_led()
1608 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_83xx_set_led()
1617 return -EINVAL; in qlcnic_83xx_set_led()
1621 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state); in qlcnic_83xx_set_led()
1646 if (adapter->dcb) in qlcnic_83xx_initialize_nic()
1651 dev_err(&adapter->pdev->dev, in qlcnic_83xx_initialize_nic()
1667 cmd.req.arg[1] = adapter->ahw->port_config; in qlcnic_83xx_set_port_config()
1670 dev_info(&adapter->pdev->dev, "Set Port Config failed.\n"); in qlcnic_83xx_set_port_config()
1686 dev_info(&adapter->pdev->dev, "Get Port config failed\n"); in qlcnic_83xx_get_port_config()
1688 adapter->ahw->port_config = cmd.rsp.arg[1]; in qlcnic_83xx_get_port_config()
1703 temp = adapter->recv_ctx->context_id << 16; in qlcnic_83xx_setup_link_event()
1707 dev_info(&adapter->pdev->dev, in qlcnic_83xx_setup_link_event()
1719 adapter->rx_mac_learn = true; in qlcnic_83xx_set_interface_id_promisc()
1722 *interface_id = adapter->recv_ctx->context_id << 16; in qlcnic_83xx_set_interface_id_promisc()
1732 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) in qlcnic_83xx_nic_set_promisc()
1733 return -EIO; in qlcnic_83xx_nic_set_promisc()
1737 return -ENOMEM; in qlcnic_83xx_nic_set_promisc()
1744 cmd->type = QLC_83XX_MBX_CMD_NO_WAIT; in qlcnic_83xx_nic_set_promisc()
1750 cmd->req.arg[1] = mode | temp; in qlcnic_83xx_nic_set_promisc()
1765 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_loopback_test()
1766 u8 drv_sds_rings = adapter->drv_sds_rings; in qlcnic_83xx_loopback_test()
1767 u8 drv_tx_rings = adapter->drv_tx_rings; in qlcnic_83xx_loopback_test()
1770 if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { in qlcnic_83xx_loopback_test()
1773 return -ENOTSUPP; in qlcnic_83xx_loopback_test()
1776 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { in qlcnic_83xx_loopback_test()
1778 return -EBUSY; in qlcnic_83xx_loopback_test()
1783 return -EBUSY; in qlcnic_83xx_loopback_test()
1802 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { in qlcnic_83xx_loopback_test()
1805 ret = -EBUSY; in qlcnic_83xx_loopback_test()
1811 ret = -ETIMEDOUT; in qlcnic_83xx_loopback_test()
1815 } while ((adapter->ahw->linkup && ahw->has_link_events) != 1); in qlcnic_83xx_loopback_test()
1825 adapter->drv_sds_rings = drv_sds_rings; in qlcnic_83xx_loopback_test()
1826 adapter->drv_tx_rings = drv_tx_rings; in qlcnic_83xx_loopback_test()
1834 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_extend_lb_idc_cmpltn_wait()
1837 netdev_info(adapter->netdev, "Received loopback IDC time extend event for 0x%x seconds\n", in qlcnic_extend_lb_idc_cmpltn_wait()
1838 ahw->extend_lb_time); in qlcnic_extend_lb_idc_cmpltn_wait()
1839 temp = ahw->extend_lb_time * 1000; in qlcnic_extend_lb_idc_cmpltn_wait()
1841 ahw->extend_lb_time = 0; in qlcnic_extend_lb_idc_cmpltn_wait()
1846 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_set_lb_mode()
1847 struct net_device *netdev = adapter->netdev; in qlcnic_83xx_set_lb_mode()
1851 ahw->extend_lb_time = 0; in qlcnic_83xx_set_lb_mode()
1857 config = ahw->port_config; in qlcnic_83xx_set_lb_mode()
1864 return -EINPROGRESS; in qlcnic_83xx_set_lb_mode()
1867 set_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); in qlcnic_83xx_set_lb_mode()
1870 ahw->port_config |= QLC_83XX_CFG_LOOPBACK_HSS; in qlcnic_83xx_set_lb_mode()
1872 ahw->port_config |= QLC_83XX_CFG_LOOPBACK_EXT; in qlcnic_83xx_set_lb_mode()
1877 "Failed to Set Loopback Mode = 0x%x.\n", in qlcnic_83xx_set_lb_mode()
1878 ahw->port_config); in qlcnic_83xx_set_lb_mode()
1879 ahw->port_config = config; in qlcnic_83xx_set_lb_mode()
1880 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); in qlcnic_83xx_set_lb_mode()
1888 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { in qlcnic_83xx_set_lb_mode()
1891 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); in qlcnic_83xx_set_lb_mode()
1892 return -EBUSY; in qlcnic_83xx_set_lb_mode()
1895 if (ahw->extend_lb_time) in qlcnic_83xx_set_lb_mode()
1902 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); in qlcnic_83xx_set_lb_mode()
1904 return -ETIMEDOUT; in qlcnic_83xx_set_lb_mode()
1906 } while (test_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status)); in qlcnic_83xx_set_lb_mode()
1908 qlcnic_sre_macaddr_change(adapter, adapter->mac_addr, 0, in qlcnic_83xx_set_lb_mode()
1915 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_clear_lb_mode()
1916 u32 config = ahw->port_config, max_wait_count; in qlcnic_83xx_clear_lb_mode()
1917 struct net_device *netdev = adapter->netdev; in qlcnic_83xx_clear_lb_mode()
1920 ahw->extend_lb_time = 0; in qlcnic_83xx_clear_lb_mode()
1922 set_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); in qlcnic_83xx_clear_lb_mode()
1924 ahw->port_config &= ~QLC_83XX_CFG_LOOPBACK_HSS; in qlcnic_83xx_clear_lb_mode()
1926 ahw->port_config &= ~QLC_83XX_CFG_LOOPBACK_EXT; in qlcnic_83xx_clear_lb_mode()
1931 "Failed to Clear Loopback Mode = 0x%x.\n", in qlcnic_83xx_clear_lb_mode()
1932 ahw->port_config); in qlcnic_83xx_clear_lb_mode()
1933 ahw->port_config = config; in qlcnic_83xx_clear_lb_mode()
1934 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); in qlcnic_83xx_clear_lb_mode()
1942 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { in qlcnic_83xx_clear_lb_mode()
1945 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); in qlcnic_83xx_clear_lb_mode()
1946 return -EBUSY; in qlcnic_83xx_clear_lb_mode()
1949 if (ahw->extend_lb_time) in qlcnic_83xx_clear_lb_mode()
1956 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); in qlcnic_83xx_clear_lb_mode()
1957 return -ETIMEDOUT; in qlcnic_83xx_clear_lb_mode()
1959 } while (test_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status)); in qlcnic_83xx_clear_lb_mode()
1961 qlcnic_sre_macaddr_change(adapter, adapter->mac_addr, 0, in qlcnic_83xx_clear_lb_mode()
1973 *interface_id = adapter->recv_ctx->context_id << 16; in qlcnic_83xx_set_interface_id_ipaddr()
2008 dev_err(&adapter->netdev->dev, in qlcnic_83xx_config_ipaddr()
2009 "could not notify %s IP 0x%x request\n", in qlcnic_83xx_config_ipaddr()
2024 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) in qlcnic_83xx_config_hw_lro()
2031 temp = adapter->recv_ctx->context_id << 16; in qlcnic_83xx_config_hw_lro()
2037 dev_info(&adapter->pdev->dev, "LRO config failed\n"); in qlcnic_83xx_config_hw_lro()
2057 * bits 3-0: Rsvd in qlcnic_83xx_config_rss()
2058 * 5-4: hash_type_ipv4 in qlcnic_83xx_config_rss()
2059 * 7-6: hash_type_ipv6 in qlcnic_83xx_config_rss()
2062 * 16-31: indirection table mask in qlcnic_83xx_config_rss()
2068 cmd.req.arg[1] = (adapter->recv_ctx->context_id); in qlcnic_83xx_config_rss()
2075 dev_info(&adapter->pdev->dev, "RSS config failed\n"); in qlcnic_83xx_config_rss()
2089 *interface_id = adapter->recv_ctx->context_id << 16; in qlcnic_83xx_set_interface_id_macaddr()
2101 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) in qlcnic_83xx_sre_macaddr_change()
2102 return -EIO; in qlcnic_83xx_sre_macaddr_change()
2106 return -ENOMEM; in qlcnic_83xx_sre_macaddr_change()
2112 cmd->type = QLC_83XX_MBX_CMD_NO_WAIT; in qlcnic_83xx_sre_macaddr_change()
2118 cmd->req.arg[1] = op | (1 << 8); in qlcnic_83xx_sre_macaddr_change()
2120 cmd->req.arg[1] |= temp; in qlcnic_83xx_sre_macaddr_change()
2127 mv.mac_addr5 = addr[5]; in qlcnic_83xx_sre_macaddr_change()
2128 buf = &cmd->req.arg[2]; in qlcnic_83xx_sre_macaddr_change()
2155 memcpy(&cmd->req.arg[2], mac, sizeof(u32)); in qlcnic_83xx_configure_mac()
2156 memcpy(&cmd->req.arg[3], &mac[4], sizeof(u16)); in qlcnic_83xx_configure_mac()
2159 cmd->req.arg[1] = type; in qlcnic_83xx_configure_mac()
2181 mac[i] = (u8) (mac_high >> ((1 - i) * 8)); in qlcnic_83xx_get_mac_address()
2183 mac[i] = (u8) (mac_low >> ((5 - i) * 8)); in qlcnic_83xx_get_mac_address()
2185 dev_err(&adapter->pdev->dev, "Failed to get mac address%d\n", in qlcnic_83xx_get_mac_address()
2187 err = -EIO; in qlcnic_83xx_get_mac_address()
2195 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal; in qlcnic_83xx_set_rx_intr_coal()
2204 temp = adapter->recv_ctx->context_id; in qlcnic_83xx_set_rx_intr_coal()
2206 temp = coal->rx_time_us; in qlcnic_83xx_set_rx_intr_coal()
2207 cmd.req.arg[2] = coal->rx_packets | temp << 16; in qlcnic_83xx_set_rx_intr_coal()
2208 cmd.req.arg[3] = coal->flag; in qlcnic_83xx_set_rx_intr_coal()
2212 netdev_err(adapter->netdev, in qlcnic_83xx_set_rx_intr_coal()
2222 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal; in qlcnic_83xx_set_tx_intr_coal()
2231 temp = adapter->tx_ring->ctx_id; in qlcnic_83xx_set_tx_intr_coal()
2233 temp = coal->tx_time_us; in qlcnic_83xx_set_tx_intr_coal()
2234 cmd.req.arg[2] = coal->tx_packets | temp << 16; in qlcnic_83xx_set_tx_intr_coal()
2235 cmd.req.arg[3] = coal->flag; in qlcnic_83xx_set_tx_intr_coal()
2239 netdev_err(adapter->netdev, in qlcnic_83xx_set_tx_intr_coal()
2253 netdev_err(adapter->netdev, in qlcnic_83xx_set_rx_tx_intr_coal()
2258 netdev_err(adapter->netdev, in qlcnic_83xx_set_rx_tx_intr_coal()
2267 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal; in qlcnic_83xx_config_intr_coal()
2272 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) in qlcnic_83xx_config_intr_coal()
2273 return -EIO; in qlcnic_83xx_config_intr_coal()
2275 tx_coalesce_usecs = ethcoal->tx_coalesce_usecs; in qlcnic_83xx_config_intr_coal()
2276 tx_max_frames = ethcoal->tx_max_coalesced_frames; in qlcnic_83xx_config_intr_coal()
2277 rx_coalesce_usecs = ethcoal->rx_coalesce_usecs; in qlcnic_83xx_config_intr_coal()
2278 rx_max_frames = ethcoal->rx_max_coalesced_frames; in qlcnic_83xx_config_intr_coal()
2279 coal->flag = QLCNIC_INTR_DEFAULT; in qlcnic_83xx_config_intr_coal()
2281 if ((coal->rx_time_us == rx_coalesce_usecs) && in qlcnic_83xx_config_intr_coal()
2282 (coal->rx_packets == rx_max_frames)) { in qlcnic_83xx_config_intr_coal()
2283 coal->type = QLCNIC_INTR_COAL_TYPE_TX; in qlcnic_83xx_config_intr_coal()
2284 coal->tx_time_us = tx_coalesce_usecs; in qlcnic_83xx_config_intr_coal()
2285 coal->tx_packets = tx_max_frames; in qlcnic_83xx_config_intr_coal()
2286 } else if ((coal->tx_time_us == tx_coalesce_usecs) && in qlcnic_83xx_config_intr_coal()
2287 (coal->tx_packets == tx_max_frames)) { in qlcnic_83xx_config_intr_coal()
2288 coal->type = QLCNIC_INTR_COAL_TYPE_RX; in qlcnic_83xx_config_intr_coal()
2289 coal->rx_time_us = rx_coalesce_usecs; in qlcnic_83xx_config_intr_coal()
2290 coal->rx_packets = rx_max_frames; in qlcnic_83xx_config_intr_coal()
2292 coal->type = QLCNIC_INTR_COAL_TYPE_RX_TX; in qlcnic_83xx_config_intr_coal()
2293 coal->rx_time_us = rx_coalesce_usecs; in qlcnic_83xx_config_intr_coal()
2294 coal->rx_packets = rx_max_frames; in qlcnic_83xx_config_intr_coal()
2295 coal->tx_time_us = tx_coalesce_usecs; in qlcnic_83xx_config_intr_coal()
2296 coal->tx_packets = tx_max_frames; in qlcnic_83xx_config_intr_coal()
2299 switch (coal->type) { in qlcnic_83xx_config_intr_coal()
2310 err = -EINVAL; in qlcnic_83xx_config_intr_coal()
2311 netdev_err(adapter->netdev, in qlcnic_83xx_config_intr_coal()
2322 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_handle_link_aen()
2327 ahw->link_speed = MSW(data[2]); in qlcnic_83xx_handle_link_aen()
2330 ahw->link_duplex = DUPLEX_FULL; in qlcnic_83xx_handle_link_aen()
2332 ahw->link_duplex = DUPLEX_HALF; in qlcnic_83xx_handle_link_aen()
2334 ahw->link_speed = SPEED_UNKNOWN; in qlcnic_83xx_handle_link_aen()
2335 ahw->link_duplex = DUPLEX_UNKNOWN; in qlcnic_83xx_handle_link_aen()
2338 ahw->link_autoneg = MSB(MSW(data[3])); in qlcnic_83xx_handle_link_aen()
2339 ahw->module_type = MSB(LSW(data[3])); in qlcnic_83xx_handle_link_aen()
2340 ahw->has_link_events = 1; in qlcnic_83xx_handle_link_aen()
2341 ahw->lb_mode = data[4] & QLCNIC_LB_MODE_MASK; in qlcnic_83xx_handle_link_aen()
2352 mbx = adapter->ahw->mailbox; in qlcnic_83xx_handle_aen()
2353 spin_lock_irqsave(&mbx->aen_lock, flags); in qlcnic_83xx_handle_aen()
2354 resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL); in qlcnic_83xx_handle_aen()
2358 event = readl(QLCNIC_MBX_FW(adapter->ahw, 0)); in qlcnic_83xx_handle_aen()
2362 if (mbx->rsp_status != rsp_status) in qlcnic_83xx_handle_aen()
2365 adapter->stats.mbx_spurious_intr++; in qlcnic_83xx_handle_aen()
2369 mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK); in qlcnic_83xx_handle_aen()
2370 writel(0, adapter->ahw->pci_base0 + mask); in qlcnic_83xx_handle_aen()
2371 spin_unlock_irqrestore(&mbx->aen_lock, flags); in qlcnic_83xx_handle_aen()
2378 int i, err = -EIO; in qlcnic_83xx_set_nic_info()
2381 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) { in qlcnic_83xx_set_nic_info()
2382 dev_err(&adapter->pdev->dev, in qlcnic_83xx_set_nic_info()
2392 cmd.req.arg[1] = (nic->pci_func << 16); in qlcnic_83xx_set_nic_info()
2394 cmd.req.arg[3] = nic->phys_port | (nic->switch_mode << 16); in qlcnic_83xx_set_nic_info()
2395 cmd.req.arg[4] = nic->capabilities; in qlcnic_83xx_set_nic_info()
2396 cmd.req.arg[5] = (nic->max_mac_filters & 0xFF) | ((nic->max_mtu) << 16); in qlcnic_83xx_set_nic_info()
2397 cmd.req.arg[6] = (nic->max_tx_ques) | ((nic->max_rx_ques) << 16); in qlcnic_83xx_set_nic_info()
2398 cmd.req.arg[7] = (nic->min_tx_bw) | ((nic->max_tx_bw) << 16); in qlcnic_83xx_set_nic_info()
2405 dev_err(&adapter->pdev->dev, "Failed to set nic info%d\n", in qlcnic_83xx_set_nic_info()
2407 err = -EIO; in qlcnic_83xx_set_nic_info()
2422 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_get_nic_info()
2428 if (func_id != ahw->pci_func) { in qlcnic_83xx_get_nic_info()
2432 cmd.req.arg[1] = ahw->pci_func << 16; in qlcnic_83xx_get_nic_info()
2436 dev_info(&adapter->pdev->dev, in qlcnic_83xx_get_nic_info()
2441 npar_info->op_type = cmd.rsp.arg[1]; in qlcnic_83xx_get_nic_info()
2442 npar_info->pci_func = cmd.rsp.arg[2] & 0xFFFF; in qlcnic_83xx_get_nic_info()
2443 npar_info->op_mode = (cmd.rsp.arg[2] & 0xFFFF0000) >> 16; in qlcnic_83xx_get_nic_info()
2444 npar_info->phys_port = cmd.rsp.arg[3] & 0xFFFF; in qlcnic_83xx_get_nic_info()
2445 npar_info->switch_mode = (cmd.rsp.arg[3] & 0xFFFF0000) >> 16; in qlcnic_83xx_get_nic_info()
2446 npar_info->capabilities = cmd.rsp.arg[4]; in qlcnic_83xx_get_nic_info()
2447 npar_info->max_mac_filters = cmd.rsp.arg[5] & 0xFF; in qlcnic_83xx_get_nic_info()
2448 npar_info->max_mtu = (cmd.rsp.arg[5] & 0xFFFF0000) >> 16; in qlcnic_83xx_get_nic_info()
2449 npar_info->max_tx_ques = cmd.rsp.arg[6] & 0xFFFF; in qlcnic_83xx_get_nic_info()
2450 npar_info->max_rx_ques = (cmd.rsp.arg[6] & 0xFFFF0000) >> 16; in qlcnic_83xx_get_nic_info()
2451 npar_info->min_tx_bw = cmd.rsp.arg[7] & 0xFFFF; in qlcnic_83xx_get_nic_info()
2452 npar_info->max_tx_bw = (cmd.rsp.arg[7] & 0xFFFF0000) >> 16; in qlcnic_83xx_get_nic_info()
2454 npar_info->max_bw_reg_offset = (cmd.rsp.arg[8] & 0x7FFE) >> 1; in qlcnic_83xx_get_nic_info()
2457 npar_info->max_linkspeed_reg_offset = temp; in qlcnic_83xx_get_nic_info()
2460 memcpy(ahw->extra_capability, &cmd.rsp.arg[16], in qlcnic_83xx_get_nic_info()
2461 sizeof(ahw->extra_capability)); in qlcnic_83xx_get_nic_info()
2471 struct device *dev = &adapter->pdev->dev; in qlcnic_get_pci_func_type()
2485 dev_err(dev, "%s: Unknown PCI type[%x]\n", in qlcnic_get_pci_func_type()
2487 err = -EIO; in qlcnic_get_pci_func_type()
2496 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_get_pci_info()
2497 struct device *dev = &adapter->pdev->dev; in qlcnic_83xx_get_pci_info()
2509 ahw->total_nic_func = 0; in qlcnic_83xx_get_pci_info()
2511 ahw->max_pci_func = cmd.rsp.arg[1] & 0xFF; in qlcnic_83xx_get_pci_info()
2512 for (i = 2, j = 0; j < ahw->max_vnic_func; j++, pci_info++) { in qlcnic_83xx_get_pci_info()
2513 pci_info->id = cmd.rsp.arg[i] & 0xFFFF; in qlcnic_83xx_get_pci_info()
2514 pci_info->active = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16; in qlcnic_83xx_get_pci_info()
2516 if (!pci_info->active) { in qlcnic_83xx_get_pci_info()
2520 pci_info->type = cmd.rsp.arg[i] & 0xFFFF; in qlcnic_83xx_get_pci_info()
2521 err = qlcnic_get_pci_func_type(adapter, pci_info->type, in qlcnic_83xx_get_pci_info()
2524 pci_info->default_port = temp; in qlcnic_83xx_get_pci_info()
2526 pci_info->tx_min_bw = cmd.rsp.arg[i] & 0xFFFF; in qlcnic_83xx_get_pci_info()
2528 pci_info->tx_max_bw = temp; in qlcnic_83xx_get_pci_info()
2530 memcpy(pci_info->mac, &cmd.rsp.arg[i], ETH_ALEN - 2); in qlcnic_83xx_get_pci_info()
2532 memcpy(pci_info->mac + sizeof(u32), &cmd.rsp.arg[i], 2); in qlcnic_83xx_get_pci_info()
2537 err = -EIO; in qlcnic_83xx_get_pci_info()
2540 ahw->total_nic_func = nic; in qlcnic_83xx_get_pci_info()
2541 ahw->total_pci_func = nic + fcoe + iscsi; in qlcnic_83xx_get_pci_info()
2542 if (ahw->total_nic_func == 0 || ahw->total_pci_func == 0) { in qlcnic_83xx_get_pci_info()
2543 dev_err(dev, "%s: Invalid function count: total nic func[%x], total pci func[%x]\n", in qlcnic_83xx_get_pci_info()
2544 __func__, ahw->total_nic_func, ahw->total_pci_func); in qlcnic_83xx_get_pci_info()
2545 err = -EIO; in qlcnic_83xx_get_pci_info()
2559 max_ints = adapter->ahw->num_msix - 1; in qlcnic_83xx_config_intrpt()
2567 cmd.req.arg[1] |= (adapter->ahw->pci_func << 8) | BIT_16; in qlcnic_83xx_config_intrpt()
2571 val = type | (adapter->ahw->intr_tbl[i].type << 4); in qlcnic_83xx_config_intrpt()
2572 if (adapter->ahw->intr_tbl[i].type == QLCNIC_INTRPT_MSIX) in qlcnic_83xx_config_intrpt()
2573 val |= (adapter->ahw->intr_tbl[i].id << 16); in qlcnic_83xx_config_intrpt()
2578 dev_err(&adapter->pdev->dev, in qlcnic_83xx_config_intrpt()
2579 "Failed to configure interrupts 0x%x\n", err); in qlcnic_83xx_config_intrpt()
2587 dev_info(&adapter->pdev->dev, in qlcnic_83xx_config_intrpt()
2589 adapter->ahw->intr_tbl[i].id); in qlcnic_83xx_config_intrpt()
2593 adapter->ahw->intr_tbl[i].id = MSW(val); in qlcnic_83xx_config_intrpt()
2594 adapter->ahw->intr_tbl[i].enabled = 1; in qlcnic_83xx_config_intrpt()
2596 adapter->ahw->intr_tbl[i].src = temp; in qlcnic_83xx_config_intrpt()
2598 adapter->ahw->intr_tbl[i].id = i; in qlcnic_83xx_config_intrpt()
2599 adapter->ahw->intr_tbl[i].enabled = 0; in qlcnic_83xx_config_intrpt()
2600 adapter->ahw->intr_tbl[i].src = 0; in qlcnic_83xx_config_intrpt()
2621 dev_err(&adapter->pdev->dev, in qlcnic_83xx_lock_flash()
2623 return -EIO; in qlcnic_83xx_lock_flash()
2628 QLC_SHARED_REG_WR32(adapter, QLCNIC_FLASH_LOCK_OWNER, adapter->portnum); in qlcnic_83xx_lock_flash()
2646 flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1); in qlcnic_83xx_lockless_flash_read32()
2648 dev_err(&adapter->pdev->dev, "Illegal addr = 0x%x\n", addr); in qlcnic_83xx_lockless_flash_read32()
2649 return -EIO; in qlcnic_83xx_lockless_flash_read32()
2657 if (range > (QLCNIC_FLASH_SECTOR_SIZE - 1)) { in qlcnic_83xx_lockless_flash_read32()
2663 if (err == -EIO) in qlcnic_83xx_lockless_flash_read32()
2672 if (flash_offset > (QLCNIC_FLASH_SECTOR_SIZE - 1)) { in qlcnic_83xx_lockless_flash_read32()
2686 if (err == -EIO) in qlcnic_83xx_lockless_flash_read32()
2707 if (err == -EIO) in qlcnic_83xx_poll_flash_status_reg()
2715 } while (--retries); in qlcnic_83xx_poll_flash_status_reg()
2718 return -EIO; in qlcnic_83xx_poll_flash_status_reg()
2727 cmd = adapter->ahw->fdt.write_statusreg_cmd; in qlcnic_83xx_enable_flash_write()
2731 adapter->ahw->fdt.write_enable_bits); in qlcnic_83xx_enable_flash_write()
2736 return -EIO; in qlcnic_83xx_enable_flash_write()
2747 adapter->ahw->fdt.write_statusreg_cmd)); in qlcnic_83xx_disable_flash_write()
2749 adapter->ahw->fdt.write_disable_bits); in qlcnic_83xx_disable_flash_write()
2754 return -EIO; in qlcnic_83xx_disable_flash_write()
2765 return -EIO; in qlcnic_83xx_read_flash_mfg_id()
2774 return -EIO; in qlcnic_83xx_read_flash_mfg_id()
2778 if (err == -EIO) { in qlcnic_83xx_read_flash_mfg_id()
2783 adapter->flash_mfg_id = (mfg_id & 0xFF); in qlcnic_83xx_read_flash_mfg_id()
2797 return -EIO; in qlcnic_83xx_read_flash_descriptor_table()
2799 memset(&adapter->ahw->fdt, 0, fdt_size); in qlcnic_83xx_read_flash_descriptor_table()
2801 (u8 *)&adapter->ahw->fdt, in qlcnic_83xx_read_flash_descriptor_table()
2803 qlcnic_swap32_buffer((u32 *)&adapter->ahw->fdt, count); in qlcnic_83xx_read_flash_descriptor_table()
2812 int ret = -EIO; in qlcnic_83xx_erase_flash_sector()
2815 return -EIO; in qlcnic_83xx_erase_flash_sector()
2817 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { in qlcnic_83xx_erase_flash_sector()
2821 dev_err(&adapter->pdev->dev, in qlcnic_83xx_erase_flash_sector()
2831 dev_err(&adapter->pdev->dev, in qlcnic_83xx_erase_flash_sector()
2833 return -EIO; in qlcnic_83xx_erase_flash_sector()
2842 cmd = QLC_83XX_FLASH_FDT_ERASE_DEF_SIG | adapter->ahw->fdt.erase_cmd; in qlcnic_83xx_erase_flash_sector()
2843 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) in qlcnic_83xx_erase_flash_sector()
2854 dev_err(&adapter->pdev->dev, in qlcnic_83xx_erase_flash_sector()
2856 return -EIO; in qlcnic_83xx_erase_flash_sector()
2859 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { in qlcnic_83xx_erase_flash_sector()
2863 dev_err(&adapter->pdev->dev, in qlcnic_83xx_erase_flash_sector()
2877 int ret = -EIO; in qlcnic_83xx_flash_write32()
2886 dev_err(&adapter->pdev->dev, in qlcnic_83xx_flash_write32()
2888 return -EIO; in qlcnic_83xx_flash_write32()
2898 int ret = -EIO, err = 0; in qlcnic_83xx_flash_bulk_write()
2902 dev_err(&adapter->pdev->dev, in qlcnic_83xx_flash_bulk_write()
2904 return -EIO; in qlcnic_83xx_flash_bulk_write()
2908 if (err == -EIO) in qlcnic_83xx_flash_bulk_write()
2922 dev_err(&adapter->pdev->dev, in qlcnic_83xx_flash_bulk_write()
2924 return -EIO; in qlcnic_83xx_flash_bulk_write()
2927 count--; in qlcnic_83xx_flash_bulk_write()
2930 /* Second to N-1 DWORD writes */ in qlcnic_83xx_flash_bulk_write()
2938 dev_err(&adapter->pdev->dev, in qlcnic_83xx_flash_bulk_write()
2940 return -EIO; in qlcnic_83xx_flash_bulk_write()
2942 count--; in qlcnic_83xx_flash_bulk_write()
2954 dev_err(&adapter->pdev->dev, in qlcnic_83xx_flash_bulk_write()
2956 return -EIO; in qlcnic_83xx_flash_bulk_write()
2960 if (err == -EIO) in qlcnic_83xx_flash_bulk_write()
2964 dev_err(&adapter->pdev->dev, "%s: failed at %d\n", in qlcnic_83xx_flash_bulk_write()
2968 if (err == -EIO) in qlcnic_83xx_flash_bulk_write()
2983 val = QLCRDX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK); in qlcnic_83xx_recover_driver_lock()
2988 val = val | ((adapter->portnum << 2) | in qlcnic_83xx_recover_driver_lock()
2990 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val); in qlcnic_83xx_recover_driver_lock()
2991 dev_info(&adapter->pdev->dev, in qlcnic_83xx_recover_driver_lock()
2994 val = QLCRDX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK); in qlcnic_83xx_recover_driver_lock()
2996 if (id == adapter->portnum) { in qlcnic_83xx_recover_driver_lock()
2999 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val); in qlcnic_83xx_recover_driver_lock()
3001 QLCRDX(adapter->ahw, QLC_83XX_DRV_UNLOCK); in qlcnic_83xx_recover_driver_lock()
3004 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val); in qlcnic_83xx_recover_driver_lock()
3005 dev_info(&adapter->pdev->dev, in qlcnic_83xx_recover_driver_lock()
3008 dev_info(&adapter->pdev->dev, in qlcnic_83xx_recover_driver_lock()
3013 dev_info(&adapter->pdev->dev, in qlcnic_83xx_recover_driver_lock()
3025 status = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK); in qlcnic_83xx_lock_driver()
3033 temp = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); in qlcnic_83xx_lock_driver()
3036 val = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); in qlcnic_83xx_lock_driver()
3039 dev_info(&adapter->pdev->dev, in qlcnic_83xx_lock_driver()
3046 dev_err(&adapter->pdev->dev, in qlcnic_83xx_lock_driver()
3048 return -EIO; in qlcnic_83xx_lock_driver()
3054 dev_err(&adapter->pdev->dev, in qlcnic_83xx_lock_driver()
3056 return -EIO; in qlcnic_83xx_lock_driver()
3060 val = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); in qlcnic_83xx_lock_driver()
3063 val = lock_alive_counter << 8 | adapter->portnum; in qlcnic_83xx_lock_driver()
3064 QLCWRX(adapter->ahw, QLC_83XX_DRV_LOCK_ID, val); in qlcnic_83xx_lock_driver()
3073 val = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); in qlcnic_83xx_unlock_driver()
3077 if (id != adapter->portnum) in qlcnic_83xx_unlock_driver()
3078 dev_err(&adapter->pdev->dev, in qlcnic_83xx_unlock_driver()
3080 __func__, adapter->portnum, id); in qlcnic_83xx_unlock_driver()
3083 QLCWRX(adapter->ahw, QLC_83XX_DRV_LOCK_ID, val); in qlcnic_83xx_unlock_driver()
3084 QLCRDX(adapter->ahw, QLC_83XX_DRV_UNLOCK); in qlcnic_83xx_unlock_driver()
3095 return -EIO; in qlcnic_ms_mem_write128()
3097 mutex_lock(&adapter->ahw->mem_lock); in qlcnic_ms_mem_write128()
3105 mutex_unlock(&adapter->ahw->mem_lock); in qlcnic_ms_mem_write128()
3106 return -EIO; in qlcnic_ms_mem_write128()
3128 mutex_unlock(&adapter->ahw->mem_lock); in qlcnic_ms_mem_write128()
3129 return -EIO; in qlcnic_ms_mem_write128()
3133 mutex_unlock(&adapter->ahw->mem_lock); in qlcnic_ms_mem_write128()
3146 return -EIO; in qlcnic_83xx_flash_read32()
3149 dev_err(&adapter->pdev->dev, "Illegal addr = 0x%x\n", addr); in qlcnic_83xx_flash_read32()
3151 return -EIO; in qlcnic_83xx_flash_read32()
3159 return -EIO; in qlcnic_83xx_flash_read32()
3164 if (err == -EIO) { in qlcnic_83xx_flash_read32()
3182 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_get_port_type()
3193 dev_info(&adapter->pdev->dev, in qlcnic_83xx_get_port_type()
3194 "Get Link Status Command failed: 0x%x\n", err); in qlcnic_83xx_get_port_type()
3204 ahw->port_type = QLCNIC_GBE; in qlcnic_83xx_get_port_type()
3207 ahw->port_type = QLCNIC_XGBE; in qlcnic_83xx_get_port_type()
3220 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_test_link()
3223 pci_func = adapter->portnum; in qlcnic_83xx_test_link()
3225 pci_func = ahw->pci_func; in qlcnic_83xx_test_link()
3227 state = readl(ahw->pci_base0 + QLC_83XX_LINK_STATE(pci_func)); in qlcnic_83xx_test_link()
3229 dev_info(&adapter->pdev->dev, "link state down\n"); in qlcnic_83xx_test_link()
3239 dev_info(&adapter->pdev->dev, in qlcnic_83xx_test_link()
3240 "Get Link Status Command failed: 0x%x\n", err); in qlcnic_83xx_test_link()
3246 ahw->link_speed = SPEED_10; in qlcnic_83xx_test_link()
3249 ahw->link_speed = SPEED_100; in qlcnic_83xx_test_link()
3252 ahw->link_speed = SPEED_1000; in qlcnic_83xx_test_link()
3255 ahw->link_speed = SPEED_10000; in qlcnic_83xx_test_link()
3258 ahw->link_speed = 0; in qlcnic_83xx_test_link()
3266 ahw->supported_type = PORT_FIBRE; in qlcnic_83xx_test_link()
3267 ahw->port_type = QLCNIC_XGBE; in qlcnic_83xx_test_link()
3272 ahw->supported_type = PORT_FIBRE; in qlcnic_83xx_test_link()
3273 ahw->port_type = QLCNIC_GBE; in qlcnic_83xx_test_link()
3276 ahw->supported_type = PORT_TP; in qlcnic_83xx_test_link()
3277 ahw->port_type = QLCNIC_GBE; in qlcnic_83xx_test_link()
3283 ahw->supported_type = PORT_DA; in qlcnic_83xx_test_link()
3284 ahw->port_type = QLCNIC_XGBE; in qlcnic_83xx_test_link()
3287 ahw->supported_type = PORT_OTHER; in qlcnic_83xx_test_link()
3288 ahw->port_type = QLCNIC_XGBE; in qlcnic_83xx_test_link()
3301 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_get_link_ksettings()
3306 if (!test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) { in qlcnic_83xx_get_link_ksettings()
3311 ahw->module_type = QLC_83XX_SFP_MODULE_TYPE(config); in qlcnic_83xx_get_link_ksettings()
3315 ahw->board_type = QLCNIC_BRDTYPE_83XX_10G; in qlcnic_83xx_get_link_ksettings()
3317 if (netif_running(adapter->netdev) && ahw->has_link_events) { in qlcnic_83xx_get_link_ksettings()
3318 ecmd->base.speed = ahw->link_speed; in qlcnic_83xx_get_link_ksettings()
3319 ecmd->base.duplex = ahw->link_duplex; in qlcnic_83xx_get_link_ksettings()
3320 ecmd->base.autoneg = ahw->link_autoneg; in qlcnic_83xx_get_link_ksettings()
3322 ecmd->base.speed = SPEED_UNKNOWN; in qlcnic_83xx_get_link_ksettings()
3323 ecmd->base.duplex = DUPLEX_UNKNOWN; in qlcnic_83xx_get_link_ksettings()
3324 ecmd->base.autoneg = AUTONEG_DISABLE; in qlcnic_83xx_get_link_ksettings()
3334 ecmd->link_modes.advertising); in qlcnic_83xx_get_link_ksettings()
3336 if (ecmd->base.autoneg == AUTONEG_ENABLE) { in qlcnic_83xx_get_link_ksettings()
3337 if (ahw->port_config & QLC_83XX_10_CAPABLE) in qlcnic_83xx_get_link_ksettings()
3339 if (ahw->port_config & QLC_83XX_100_CAPABLE) in qlcnic_83xx_get_link_ksettings()
3341 if (ahw->port_config & QLC_83XX_1G_CAPABLE) in qlcnic_83xx_get_link_ksettings()
3343 if (ahw->port_config & QLC_83XX_10G_CAPABLE) in qlcnic_83xx_get_link_ksettings()
3345 if (ahw->port_config & QLC_83XX_AUTONEG_ENABLE) in qlcnic_83xx_get_link_ksettings()
3348 switch (ahw->link_speed) { in qlcnic_83xx_get_link_ksettings()
3367 switch (ahw->supported_type) { in qlcnic_83xx_get_link_ksettings()
3371 ecmd->base.port = PORT_FIBRE; in qlcnic_83xx_get_link_ksettings()
3376 ecmd->base.port = PORT_TP; in qlcnic_83xx_get_link_ksettings()
3381 ecmd->base.port = PORT_DA; in qlcnic_83xx_get_link_ksettings()
3386 ecmd->base.port = PORT_OTHER; in qlcnic_83xx_get_link_ksettings()
3389 ecmd->base.phy_address = ahw->physical_port; in qlcnic_83xx_get_link_ksettings()
3391 ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.supported, in qlcnic_83xx_get_link_ksettings()
3393 ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.advertising, in qlcnic_83xx_get_link_ksettings()
3402 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_set_link_ksettings()
3403 u32 config = adapter->ahw->port_config; in qlcnic_83xx_set_link_ksettings()
3407 if (ecmd->base.duplex == DUPLEX_HALF) { in qlcnic_83xx_set_link_ksettings()
3408 netdev_info(adapter->netdev, in qlcnic_83xx_set_link_ksettings()
3410 return -EINVAL; in qlcnic_83xx_set_link_ksettings()
3413 if (ecmd->base.autoneg) { in qlcnic_83xx_set_link_ksettings()
3414 ahw->port_config |= QLC_83XX_AUTONEG_ENABLE; in qlcnic_83xx_set_link_ksettings()
3415 ahw->port_config |= (QLC_83XX_100_CAPABLE | in qlcnic_83xx_set_link_ksettings()
3419 ahw->port_config &= ~QLC_83XX_AUTONEG_ENABLE; in qlcnic_83xx_set_link_ksettings()
3420 switch (ecmd->base.speed) { in qlcnic_83xx_set_link_ksettings()
3422 ahw->port_config &= ~(QLC_83XX_100_CAPABLE | in qlcnic_83xx_set_link_ksettings()
3425 ahw->port_config |= QLC_83XX_10_CAPABLE; in qlcnic_83xx_set_link_ksettings()
3428 ahw->port_config &= ~(QLC_83XX_10_CAPABLE | in qlcnic_83xx_set_link_ksettings()
3431 ahw->port_config |= QLC_83XX_100_CAPABLE; in qlcnic_83xx_set_link_ksettings()
3434 ahw->port_config &= ~(QLC_83XX_10_CAPABLE | in qlcnic_83xx_set_link_ksettings()
3437 ahw->port_config |= QLC_83XX_1G_CAPABLE; in qlcnic_83xx_set_link_ksettings()
3440 ahw->port_config &= ~(QLC_83XX_10_CAPABLE | in qlcnic_83xx_set_link_ksettings()
3443 ahw->port_config |= QLC_83XX_10G_CAPABLE; in qlcnic_83xx_set_link_ksettings()
3446 return -EINVAL; in qlcnic_83xx_set_link_ksettings()
3451 netdev_info(adapter->netdev, in qlcnic_83xx_set_link_ksettings()
3453 ahw->port_config = config; in qlcnic_83xx_set_link_ksettings()
3465 low = cmd->rsp.arg[index]; in qlcnic_83xx_copy_stats()
3466 hi = cmd->rsp.arg[index + 1]; in qlcnic_83xx_copy_stats()
3481 dev_info(&adapter->pdev->dev, in qlcnic_83xx_fill_stats()
3483 *ret = -EIO; in qlcnic_83xx_fill_stats()
3486 total_regs = cmd->rsp.num; in qlcnic_83xx_fill_stats()
3522 dev_warn(&adapter->pdev->dev, "Unknown get statistics mode\n"); in qlcnic_83xx_fill_stats()
3523 *ret = -EIO; in qlcnic_83xx_fill_stats()
3531 struct net_device *netdev = adapter->netdev; in qlcnic_83xx_get_stats()
3538 cmd.req.arg[1] = BIT_1 | (adapter->tx_ring->ctx_id << 16); in qlcnic_83xx_get_stats()
3547 cmd.req.arg[1] = BIT_2 | (adapter->portnum << 16); in qlcnic_83xx_get_stats()
3557 cmd.req.arg[1] = adapter->recv_ctx->context_id << 16; in qlcnic_83xx_get_stats()
3587 dev_err(&adapter->pdev->dev, in qlcnic_83xx_extend_md_capab()
3601 if (adapter->fw_version != QLCNIC_VERSION_CODE(major, minor, sub)) { in qlcnic_83xx_reg_test()
3602 dev_info(&adapter->pdev->dev, "%s: Reg test failed\n", in qlcnic_83xx_reg_test()
3612 sizeof(*adapter->ahw->ext_reg_tbl)) + in qlcnic_83xx_get_regs_len()
3614 sizeof(*adapter->ahw->reg_tbl)); in qlcnic_83xx_get_regs_len()
3626 regs_buff[i++] = QLCRDX(adapter->ahw, j); in qlcnic_83xx_get_registers()
3633 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_interrupt_test()
3635 u8 val, drv_sds_rings = adapter->drv_sds_rings; in qlcnic_83xx_interrupt_test()
3636 u8 drv_tx_rings = adapter->drv_tx_rings; in qlcnic_83xx_interrupt_test()
3641 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { in qlcnic_83xx_interrupt_test()
3643 return -EBUSY; in qlcnic_83xx_interrupt_test()
3648 return -EBUSY; in qlcnic_83xx_interrupt_test()
3656 ahw->diag_cnt = 0; in qlcnic_83xx_interrupt_test()
3661 if (adapter->flags & QLCNIC_MSIX_ENABLED) in qlcnic_83xx_interrupt_test()
3662 intrpt_id = ahw->intr_tbl[0].id; in qlcnic_83xx_interrupt_test()
3675 dev_info(&adapter->pdev->dev, in qlcnic_83xx_interrupt_test()
3676 "Interrupt generated: 0x%x, requested:0x%x\n", in qlcnic_83xx_interrupt_test()
3679 dev_err(&adapter->pdev->dev, in qlcnic_83xx_interrupt_test()
3680 "Interrupt test error: 0x%x\n", val); in qlcnic_83xx_interrupt_test()
3685 ret = !ahw->diag_cnt; in qlcnic_83xx_interrupt_test()
3694 adapter->drv_sds_rings = drv_sds_rings; in qlcnic_83xx_interrupt_test()
3695 adapter->drv_tx_rings = drv_tx_rings; in qlcnic_83xx_interrupt_test()
3703 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_get_pauseparam()
3709 dev_err(&adapter->pdev->dev, in qlcnic_83xx_get_pauseparam()
3713 config = ahw->port_config; in qlcnic_83xx_get_pauseparam()
3717 pause->tx_pause = 1; in qlcnic_83xx_get_pauseparam()
3720 pause->rx_pause = 1; in qlcnic_83xx_get_pauseparam()
3727 pause->tx_pause = 1; in qlcnic_83xx_get_pauseparam()
3728 pause->rx_pause = 1; in qlcnic_83xx_get_pauseparam()
3733 pause->autoneg = 1; in qlcnic_83xx_get_pauseparam()
3739 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_set_pauseparam()
3745 dev_err(&adapter->pdev->dev, in qlcnic_83xx_set_pauseparam()
3749 config = ahw->port_config; in qlcnic_83xx_set_pauseparam()
3751 if (ahw->port_type == QLCNIC_GBE) { in qlcnic_83xx_set_pauseparam()
3752 if (pause->autoneg) in qlcnic_83xx_set_pauseparam()
3753 ahw->port_config |= QLC_83XX_ENABLE_AUTONEG; in qlcnic_83xx_set_pauseparam()
3754 if (!pause->autoneg) in qlcnic_83xx_set_pauseparam()
3755 ahw->port_config &= ~QLC_83XX_ENABLE_AUTONEG; in qlcnic_83xx_set_pauseparam()
3756 } else if ((ahw->port_type == QLCNIC_XGBE) && (pause->autoneg)) { in qlcnic_83xx_set_pauseparam()
3757 return -EOPNOTSUPP; in qlcnic_83xx_set_pauseparam()
3761 ahw->port_config |= QLC_83XX_CFG_STD_PAUSE; in qlcnic_83xx_set_pauseparam()
3763 if (pause->rx_pause && pause->tx_pause) { in qlcnic_83xx_set_pauseparam()
3764 ahw->port_config |= QLC_83XX_CFG_STD_TX_RX_PAUSE; in qlcnic_83xx_set_pauseparam()
3765 } else if (pause->rx_pause && !pause->tx_pause) { in qlcnic_83xx_set_pauseparam()
3766 ahw->port_config &= ~QLC_83XX_CFG_STD_TX_PAUSE; in qlcnic_83xx_set_pauseparam()
3767 ahw->port_config |= QLC_83XX_CFG_STD_RX_PAUSE; in qlcnic_83xx_set_pauseparam()
3768 } else if (pause->tx_pause && !pause->rx_pause) { in qlcnic_83xx_set_pauseparam()
3769 ahw->port_config &= ~QLC_83XX_CFG_STD_RX_PAUSE; in qlcnic_83xx_set_pauseparam()
3770 ahw->port_config |= QLC_83XX_CFG_STD_TX_PAUSE; in qlcnic_83xx_set_pauseparam()
3771 } else if (!pause->rx_pause && !pause->tx_pause) { in qlcnic_83xx_set_pauseparam()
3772 ahw->port_config &= ~(QLC_83XX_CFG_STD_TX_RX_PAUSE | in qlcnic_83xx_set_pauseparam()
3777 dev_err(&adapter->pdev->dev, in qlcnic_83xx_set_pauseparam()
3779 ahw->port_config = config; in qlcnic_83xx_set_pauseparam()
3795 return -EIO; in qlcnic_83xx_read_flash_status_reg()
3798 if (err == -EIO) in qlcnic_83xx_read_flash_status_reg()
3809 if (status == -EIO) { in qlcnic_83xx_flash_test()
3810 dev_info(&adapter->pdev->dev, "%s: EEPROM test failed.\n", in qlcnic_83xx_flash_test()
3820 struct net_device *netdev = adapter->netdev; in qlcnic_83xx_shutdown()
3829 cancel_delayed_work_sync(&adapter->idc_aen_work); in qlcnic_83xx_shutdown()
3836 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_resume()
3837 struct qlc_83xx_idc *idc = &ahw->idc; in qlcnic_83xx_resume()
3844 if (ahw->nic_mode == QLCNIC_VNIC_MODE) { in qlcnic_83xx_resume()
3845 if (ahw->op_mode == QLCNIC_MGMT_FUNC) { in qlcnic_83xx_resume()
3859 idc->delay); in qlcnic_83xx_resume()
3865 reinit_completion(&mbx->completion); in qlcnic_83xx_reinit_mbx_work()
3866 set_bit(QLC_83XX_MBX_READY, &mbx->status); in qlcnic_83xx_reinit_mbx_work()
3874 destroy_workqueue(mbx->work_q); in qlcnic_83xx_free_mailbox()
3882 atomic_set(&cmd->rsp_status, QLC_83XX_MBX_RESPONSE_ARRIVED); in qlcnic_83xx_notify_cmd_completion()
3884 if (cmd->type == QLC_83XX_MBX_CMD_NO_WAIT) { in qlcnic_83xx_notify_cmd_completion()
3889 complete(&cmd->completion); in qlcnic_83xx_notify_cmd_completion()
3894 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_83xx_flush_mbx_queue()
3895 struct list_head *head = &mbx->cmd_q; in qlcnic_83xx_flush_mbx_queue()
3898 spin_lock_bh(&mbx->queue_lock); in qlcnic_83xx_flush_mbx_queue()
3901 cmd = list_entry(head->next, struct qlcnic_cmd_args, list); in qlcnic_83xx_flush_mbx_queue()
3902 dev_info(&adapter->pdev->dev, "%s: Mailbox command 0x%x\n", in qlcnic_83xx_flush_mbx_queue()
3903 __func__, cmd->cmd_op); in qlcnic_83xx_flush_mbx_queue()
3904 list_del(&cmd->list); in qlcnic_83xx_flush_mbx_queue()
3905 mbx->num_cmds--; in qlcnic_83xx_flush_mbx_queue()
3909 spin_unlock_bh(&mbx->queue_lock); in qlcnic_83xx_flush_mbx_queue()
3914 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_check_mbx_status()
3915 struct qlcnic_mailbox *mbx = ahw->mailbox; in qlcnic_83xx_check_mbx_status()
3918 if (!test_bit(QLC_83XX_MBX_READY, &mbx->status)) in qlcnic_83xx_check_mbx_status()
3919 return -EBUSY; in qlcnic_83xx_check_mbx_status()
3923 clear_bit(QLC_83XX_MBX_READY, &mbx->status); in qlcnic_83xx_check_mbx_status()
3924 ahw->idc.collect_dump = 1; in qlcnic_83xx_check_mbx_status()
3925 return -EIO; in qlcnic_83xx_check_mbx_status()
3935 QLCWRX(adapter->ahw, QLCNIC_HOST_MBX_CTRL, QLCNIC_SET_OWNER); in qlcnic_83xx_signal_mbx_cmd()
3937 QLCWRX(adapter->ahw, QLCNIC_FW_MBX_CTRL, QLCNIC_CLR_OWNER); in qlcnic_83xx_signal_mbx_cmd()
3943 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_83xx_dequeue_mbx_cmd()
3945 spin_lock_bh(&mbx->queue_lock); in qlcnic_83xx_dequeue_mbx_cmd()
3947 list_del(&cmd->list); in qlcnic_83xx_dequeue_mbx_cmd()
3948 mbx->num_cmds--; in qlcnic_83xx_dequeue_mbx_cmd()
3950 spin_unlock_bh(&mbx->queue_lock); in qlcnic_83xx_dequeue_mbx_cmd()
3959 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_encode_mbx_cmd()
3962 if (cmd->op_type != QLC_83XX_MBX_POST_BC_OP) { in qlcnic_83xx_encode_mbx_cmd()
3963 mbx_cmd = cmd->req.arg[0]; in qlcnic_83xx_encode_mbx_cmd()
3965 for (i = 1; i < cmd->req.num; i++) in qlcnic_83xx_encode_mbx_cmd()
3966 writel(cmd->req.arg[i], QLCNIC_MBX_HOST(ahw, i)); in qlcnic_83xx_encode_mbx_cmd()
3968 fw_hal_version = ahw->fw_hal_version; in qlcnic_83xx_encode_mbx_cmd()
3970 total_size = cmd->pay_size + hdr_size; in qlcnic_83xx_encode_mbx_cmd()
3979 mbx_cmd |= cmd->func_num << 5; in qlcnic_83xx_encode_mbx_cmd()
3984 writel(*(cmd->hdr++), QLCNIC_MBX_HOST(ahw, i)); in qlcnic_83xx_encode_mbx_cmd()
3985 for (j = 0; j < cmd->pay_size; j++, i++) in qlcnic_83xx_encode_mbx_cmd()
3986 writel(*(cmd->pay++), QLCNIC_MBX_HOST(ahw, i)); in qlcnic_83xx_encode_mbx_cmd()
3992 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_83xx_detach_mailbox_work()
3997 clear_bit(QLC_83XX_MBX_READY, &mbx->status); in qlcnic_83xx_detach_mailbox_work()
3998 complete(&mbx->completion); in qlcnic_83xx_detach_mailbox_work()
3999 cancel_work_sync(&mbx->work); in qlcnic_83xx_detach_mailbox_work()
4000 flush_workqueue(mbx->work_q); in qlcnic_83xx_detach_mailbox_work()
4008 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_83xx_enqueue_mbx_cmd()
4010 if (test_bit(QLC_83XX_MBX_READY, &mbx->status)) { in qlcnic_83xx_enqueue_mbx_cmd()
4011 atomic_set(&cmd->rsp_status, QLC_83XX_MBX_RESPONSE_WAIT); in qlcnic_83xx_enqueue_mbx_cmd()
4012 init_completion(&cmd->completion); in qlcnic_83xx_enqueue_mbx_cmd()
4013 cmd->rsp_opcode = QLC_83XX_MBX_RESPONSE_UNKNOWN; in qlcnic_83xx_enqueue_mbx_cmd()
4015 spin_lock_bh(&mbx->queue_lock); in qlcnic_83xx_enqueue_mbx_cmd()
4017 list_add_tail(&cmd->list, &mbx->cmd_q); in qlcnic_83xx_enqueue_mbx_cmd()
4018 mbx->num_cmds++; in qlcnic_83xx_enqueue_mbx_cmd()
4019 cmd->total_cmds = mbx->num_cmds; in qlcnic_83xx_enqueue_mbx_cmd()
4020 *timeout = cmd->total_cmds * QLC_83XX_MBX_TIMEOUT; in qlcnic_83xx_enqueue_mbx_cmd()
4021 queue_work(mbx->work_q, &mbx->work); in qlcnic_83xx_enqueue_mbx_cmd()
4023 spin_unlock_bh(&mbx->queue_lock); in qlcnic_83xx_enqueue_mbx_cmd()
4028 return -EBUSY; in qlcnic_83xx_enqueue_mbx_cmd()
4037 if (cmd->cmd_op == QLCNIC_CMD_CONFIG_MAC_VLAN) { in qlcnic_83xx_check_mac_rcode()
4038 fw_data = readl(QLCNIC_MBX_FW(adapter->ahw, 2)); in qlcnic_83xx_check_mac_rcode()
4043 cmd->rsp_opcode = QLCNIC_RCODE_SUCCESS; in qlcnic_83xx_check_mac_rcode()
4048 return -EINVAL; in qlcnic_83xx_check_mac_rcode()
4054 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_decode_mbx_rsp()
4055 struct device *dev = &adapter->pdev->dev; in qlcnic_83xx_decode_mbx_rsp()
4066 cmd->rsp_opcode = QLCNIC_RCODE_SUCCESS; in qlcnic_83xx_decode_mbx_rsp()
4072 …ev_err(dev, "%s: Mailbox command failed, opcode=0x%x, cmd_type=0x%x, func=0x%x, op_mode=0x%x, erro… in qlcnic_83xx_decode_mbx_rsp()
4073 __func__, cmd->cmd_op, cmd->type, ahw->pci_func, in qlcnic_83xx_decode_mbx_rsp()
4074 ahw->op_mode, mbx_err_code); in qlcnic_83xx_decode_mbx_rsp()
4075 cmd->rsp_opcode = QLC_83XX_MBX_RESPONSE_FAILED; in qlcnic_83xx_decode_mbx_rsp()
4084 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_dump_mailbox_registers()
4088 …dev_info(&adapter->pdev->dev, "Mbx interrupt mask=0x%x, Mbx interrupt enable=0x%x, Host mbx contro… in qlcnic_dump_mailbox_registers()
4089 readl(ahw->pci_base0 + offset), in qlcnic_dump_mailbox_registers()
4099 struct qlcnic_adapter *adapter = mbx->adapter; in qlcnic_83xx_mailbox_worker()
4100 const struct qlcnic_mbx_ops *mbx_ops = mbx->ops; in qlcnic_83xx_mailbox_worker()
4101 struct device *dev = &adapter->pdev->dev; in qlcnic_83xx_mailbox_worker()
4102 struct list_head *head = &mbx->cmd_q; in qlcnic_83xx_mailbox_worker()
4107 ahw = adapter->ahw; in qlcnic_83xx_mailbox_worker()
4115 spin_lock_irqsave(&mbx->aen_lock, flags); in qlcnic_83xx_mailbox_worker()
4116 mbx->rsp_status = QLC_83XX_MBX_RESPONSE_WAIT; in qlcnic_83xx_mailbox_worker()
4117 spin_unlock_irqrestore(&mbx->aen_lock, flags); in qlcnic_83xx_mailbox_worker()
4119 spin_lock_bh(&mbx->queue_lock); in qlcnic_83xx_mailbox_worker()
4122 spin_unlock_bh(&mbx->queue_lock); in qlcnic_83xx_mailbox_worker()
4125 cmd = list_entry(head->next, struct qlcnic_cmd_args, list); in qlcnic_83xx_mailbox_worker()
4127 spin_unlock_bh(&mbx->queue_lock); in qlcnic_83xx_mailbox_worker()
4129 mbx_ops->encode_cmd(adapter, cmd); in qlcnic_83xx_mailbox_worker()
4130 mbx_ops->nofity_fw(adapter, QLC_83XX_MBX_REQUEST); in qlcnic_83xx_mailbox_worker()
4132 if (wait_for_completion_timeout(&mbx->completion, in qlcnic_83xx_mailbox_worker()
4134 mbx_ops->decode_resp(adapter, cmd); in qlcnic_83xx_mailbox_worker()
4135 mbx_ops->nofity_fw(adapter, QLC_83XX_MBX_COMPLETION); in qlcnic_83xx_mailbox_worker()
4137 … dev_err(dev, "%s: Mailbox command timeout, opcode=0x%x, cmd_type=0x%x, func=0x%x, op_mode=0x%x\n", in qlcnic_83xx_mailbox_worker()
4138 __func__, cmd->cmd_op, cmd->type, ahw->pci_func, in qlcnic_83xx_mailbox_worker()
4139 ahw->op_mode); in qlcnic_83xx_mailbox_worker()
4140 clear_bit(QLC_83XX_MBX_READY, &mbx->status); in qlcnic_83xx_mailbox_worker()
4146 cmd->rsp_opcode = QLCNIC_RCODE_TIMEOUT; in qlcnic_83xx_mailbox_worker()
4148 mbx_ops->dequeue_cmd(adapter, cmd); in qlcnic_83xx_mailbox_worker()
4162 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_init_mailbox_work()
4165 ahw->mailbox = kzalloc(sizeof(*mbx), GFP_KERNEL); in qlcnic_83xx_init_mailbox_work()
4166 if (!ahw->mailbox) in qlcnic_83xx_init_mailbox_work()
4167 return -ENOMEM; in qlcnic_83xx_init_mailbox_work()
4169 mbx = ahw->mailbox; in qlcnic_83xx_init_mailbox_work()
4170 mbx->ops = &qlcnic_83xx_mbx_ops; in qlcnic_83xx_init_mailbox_work()
4171 mbx->adapter = adapter; in qlcnic_83xx_init_mailbox_work()
4173 spin_lock_init(&mbx->queue_lock); in qlcnic_83xx_init_mailbox_work()
4174 spin_lock_init(&mbx->aen_lock); in qlcnic_83xx_init_mailbox_work()
4175 INIT_LIST_HEAD(&mbx->cmd_q); in qlcnic_83xx_init_mailbox_work()
4176 init_completion(&mbx->completion); in qlcnic_83xx_init_mailbox_work()
4178 mbx->work_q = create_singlethread_workqueue("qlcnic_mailbox"); in qlcnic_83xx_init_mailbox_work()
4179 if (mbx->work_q == NULL) { in qlcnic_83xx_init_mailbox_work()
4181 return -ENOMEM; in qlcnic_83xx_init_mailbox_work()
4184 INIT_WORK(&mbx->work, qlcnic_83xx_mailbox_worker); in qlcnic_83xx_init_mailbox_work()
4185 set_bit(QLC_83XX_MBX_READY, &mbx->status); in qlcnic_83xx_init_mailbox_work()
4200 set_bit(__QLCNIC_AER, &adapter->state); in qlcnic_83xx_io_error_detected()
4201 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_io_error_detected()
4216 pdev->error_state = pci_channel_io_normal; in qlcnic_83xx_io_slot_reset()
4229 clear_bit(__QLCNIC_AER, &adapter->state); in qlcnic_83xx_io_slot_reset()
4230 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_io_slot_reset()
4238 if (test_and_clear_bit(__QLCNIC_AER, &adapter->state)) in qlcnic_83xx_io_resume()