Lines Matching full:adapter

267 int qlcnic_83xx_get_fw_version(struct qlcnic_adapter *adapter)
270 struct pci_dev *pdev = adapter->pdev;
272 fw_major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR);
273 fw_minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR);
274 fw_build = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB);
275 adapter->fw_version = QLCNIC_VERSION_CODE(fw_major, fw_minor, fw_build);
280 return adapter->fw_version;
283 static int __qlcnic_set_win_base(struct qlcnic_adapter *adapter, u32 addr)
288 base = adapter->ahw->pci_base0 +
289 QLC_83XX_CRB_WIN_FUNC(adapter->ahw->pci_func);
298 int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr,
301 struct qlcnic_hardware_context *ahw = adapter->ahw;
303 *err = __qlcnic_set_win_base(adapter, (u32) addr);
307 dev_err(&adapter->pdev->dev,
313 int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *adapter, ulong addr,
317 struct qlcnic_hardware_context *ahw = adapter->ahw;
319 err = __qlcnic_set_win_base(adapter, (u32) addr);
324 dev_err(&adapter->pdev->dev,
331 static void qlcnic_83xx_enable_legacy(struct qlcnic_adapter *adapter)
333 struct qlcnic_hardware_context *ahw = adapter->ahw;
336 adapter->tgt_status_reg = ahw->pci_base0 + QLC_83XX_INTX_PTR;
337 adapter->tgt_mask_reg = ahw->pci_base0 + QLC_83XX_INTX_MASK;
338 adapter->isr_int_vec = ahw->pci_base0 + QLC_83XX_INTX_TRGR;
339 adapter->msix_entries[0].vector = adapter->pdev->irq;
340 dev_info(&adapter->pdev->dev, "using legacy interrupt\n");
343 static int qlcnic_83xx_calculate_msix_vector(struct qlcnic_adapter *adapter)
347 num_msix = adapter->drv_sds_rings;
352 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED))
353 num_msix += adapter->drv_tx_rings;
358 int qlcnic_83xx_setup_intr(struct qlcnic_adapter *adapter)
360 struct qlcnic_hardware_context *ahw = adapter->ahw;
363 if (adapter->flags & QLCNIC_TSS_RSS) {
364 err = qlcnic_setup_tss_rss_intr(adapter);
369 num_msix = qlcnic_83xx_calculate_msix_vector(adapter);
371 err = qlcnic_enable_msix(adapter, num_msix);
375 if (adapter->flags & QLCNIC_MSIX_ENABLED) {
378 if (qlcnic_sriov_vf_check(adapter))
381 adapter->drv_sds_rings = QLCNIC_SINGLE_RING;
382 adapter->drv_tx_rings = QLCNIC_SINGLE_RING;
393 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
394 if (adapter->ahw->pci_func >= QLC_MAX_LEGACY_FUNC_SUPP) {
395 dev_err(&adapter->pdev->dev, "PCI function number 8 and higher are not supported with legacy interrupt, func 0x%x\n",
400 qlcnic_83xx_enable_legacy(adapter);
404 if (adapter->flags & QLCNIC_MSIX_ENABLED)
415 static inline void qlcnic_83xx_clear_legacy_intr_mask(struct qlcnic_adapter *adapter)
417 writel(0, adapter->tgt_mask_reg);
420 static inline void qlcnic_83xx_set_legacy_intr_mask(struct qlcnic_adapter *adapter)
422 if (adapter->tgt_mask_reg)
423 writel(1, adapter->tgt_mask_reg);
427 *adapter)
436 mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
437 writel(0, adapter->ahw->pci_base0 + mask);
440 void qlcnic_83xx_disable_mbx_intr(struct qlcnic_adapter *adapter)
444 mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
445 writel(1, adapter->ahw->pci_base0 + mask);
446 QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, 0);
449 static inline void qlcnic_83xx_get_mbx_data(struct qlcnic_adapter *adapter,
458 cmd->rsp.arg[i] = readl(QLCNIC_MBX_FW(adapter->ahw, i));
461 irqreturn_t qlcnic_83xx_clear_legacy_intr(struct qlcnic_adapter *adapter)
464 struct qlcnic_hardware_context *ahw = adapter->ahw;
467 intr_val = readl(adapter->tgt_status_reg);
472 if (QLC_83XX_INTX_FUNC(intr_val) != adapter->ahw->pci_func) {
473 adapter->stats.spurious_intr++;
480 writel_relaxed(0, adapter->isr_int_vec);
481 intr_val = readl(adapter->isr_int_vec);
483 intr_val = readl(adapter->tgt_status_reg);
499 static void qlcnic_83xx_poll_process_aen(struct qlcnic_adapter *adapter)
502 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox;
506 resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL);
510 event = readl(QLCNIC_MBX_FW(adapter->ahw, 0));
512 __qlcnic_83xx_process_aen(adapter);
518 qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
524 struct qlcnic_adapter *adapter = data;
526 struct qlcnic_hardware_context *ahw = adapter->ahw;
528 if (qlcnic_83xx_clear_legacy_intr(adapter) == IRQ_NONE)
531 qlcnic_83xx_poll_process_aen(adapter);
536 qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
540 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
541 qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
543 sds_ring = &adapter->recv_ctx->sds_rings[0];
553 struct qlcnic_adapter *adapter = sds_ring->adapter;
555 if (adapter->flags & QLCNIC_MSIX_ENABLED)
558 if (adapter->nic_ops->clear_legacy_intr(adapter) == IRQ_NONE)
562 adapter->ahw->diag_cnt++;
563 qlcnic_enable_sds_intr(adapter, sds_ring);
568 void qlcnic_83xx_free_mbx_intr(struct qlcnic_adapter *adapter)
572 if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
573 qlcnic_83xx_set_legacy_intr_mask(adapter);
575 qlcnic_83xx_disable_mbx_intr(adapter);
577 if (adapter->flags & QLCNIC_MSIX_ENABLED)
578 num_msix = adapter->ahw->num_msix - 1;
584 if (adapter->msix_entries) {
585 synchronize_irq(adapter->msix_entries[num_msix].vector);
586 free_irq(adapter->msix_entries[num_msix].vector, adapter);
590 int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
597 if (!(adapter->flags & QLCNIC_MSI_ENABLED) &&
598 !(adapter->flags & QLCNIC_MSIX_ENABLED))
601 if (adapter->flags & QLCNIC_MSIX_ENABLED) {
603 val = adapter->msix_entries[adapter->ahw->num_msix - 1].vector;
604 err = request_irq(val, handler, flags, "qlcnic-MB", adapter);
606 dev_err(&adapter->pdev->dev,
612 val = adapter->msix_entries[0].vector;
613 err = request_irq(val, handler, flags, "qlcnic", adapter);
615 dev_err(&adapter->pdev->dev,
619 qlcnic_83xx_clear_legacy_intr_mask(adapter);
623 qlcnic_83xx_enable_mbx_interrupt(adapter);
628 void qlcnic_83xx_get_func_no(struct qlcnic_adapter *adapter)
630 u32 val = QLCRDX(adapter->ahw, QLCNIC_INFORMANT);
631 adapter->ahw->pci_func = (val >> 24) & 0xff;
634 int qlcnic_83xx_cam_lock(struct qlcnic_adapter *adapter)
639 struct qlcnic_hardware_context *ahw = adapter->ahw;
646 QLC_SHARED_REG_WR32(adapter, QLCNIC_FLASH_LOCK_OWNER,
656 void qlcnic_83xx_cam_unlock(struct qlcnic_adapter *adapter)
659 struct qlcnic_hardware_context *ahw = adapter->ahw;
665 void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
671 if (qlcnic_api_lock(adapter)) {
672 dev_err(&adapter->pdev->dev,
678 data = QLCRD32(adapter, (u32) offset, &ret);
679 qlcnic_api_unlock(adapter);
682 dev_err(&adapter->pdev->dev,
690 void qlcnic_83xx_write_crb(struct qlcnic_adapter *adapter, char *buf,
696 qlcnic_83xx_wrt_reg_indirect(adapter, (u32) offset, data);
699 int qlcnic_83xx_get_port_info(struct qlcnic_adapter *adapter)
701 struct qlcnic_hardware_context *ahw = adapter->ahw;
704 status = qlcnic_83xx_get_port_config(adapter);
706 dev_err(&adapter->pdev->dev,
727 static void qlcnic_83xx_set_mac_filter_count(struct qlcnic_adapter *adapter)
729 struct qlcnic_hardware_context *ahw = adapter->ahw;
743 void qlcnic_83xx_enable_mbx_interrupt(struct qlcnic_adapter *adapter)
747 if (adapter->flags & QLCNIC_MSIX_ENABLED)
748 val = BIT_2 | ((adapter->ahw->num_msix - 1) << 8);
752 QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, val);
753 qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
756 void qlcnic_83xx_check_vf(struct qlcnic_adapter *adapter,
760 struct qlcnic_hardware_context *ahw = adapter->ahw;
763 qlcnic_get_func_no(adapter);
765 if (qlcnic_sriov_vf_check(adapter)) {
766 qlcnic_sriov_vf_set_ops(adapter);
771 op_mode = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE);
780 dev_info(&adapter->pdev->dev,
783 adapter->nic_ops = &qlcnic_vf_ops;
785 if (pci_find_ext_capability(adapter->pdev,
787 set_bit(__QLCNIC_SRIOV_CAPABLE, &adapter->state);
788 adapter->nic_ops = &qlcnic_83xx_ops;
792 static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter,
794 static void qlcnic_83xx_handle_idc_comp_aen(struct qlcnic_adapter *adapter,
797 void qlcnic_dump_mbx(struct qlcnic_adapter *adapter,
805 dev_info(&adapter->pdev->dev,
813 dev_info(&adapter->pdev->dev,
823 static void qlcnic_83xx_poll_for_mbx_completion(struct qlcnic_adapter *adapter,
826 struct qlcnic_hardware_context *ahw = adapter->ahw;
840 dev_err(&adapter->pdev->dev,
847 int qlcnic_83xx_issue_cmd(struct qlcnic_adapter *adapter,
850 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox;
851 struct qlcnic_hardware_context *ahw = adapter->ahw;
860 err = mbx->ops->enqueue_cmd(adapter, cmd, &timeout);
862 dev_err(&adapter->pdev->dev,
872 dev_err(&adapter->pdev->dev,
882 qlcnic_83xx_poll_for_mbx_completion(adapter, cmd);
885 dev_err(&adapter->pdev->dev,
889 qlcnic_83xx_detach_mailbox_work(adapter);
896 struct qlcnic_adapter *adapter, u32 type)
921 temp = adapter->ahw->fw_hal_version << 29;
928 dev_err(&adapter->pdev->dev, "%s: Invalid mailbox command opcode 0x%x\n",
935 struct qlcnic_adapter *adapter;
939 adapter = container_of(work, struct qlcnic_adapter, idc_aen_work.work);
940 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_IDC_ACK);
945 cmd.req.arg[i] = adapter->ahw->mbox_aen[i];
947 err = qlcnic_issue_cmd(adapter, &cmd);
949 dev_info(&adapter->pdev->dev,
954 static void qlcnic_83xx_handle_idc_comp_aen(struct qlcnic_adapter *adapter,
957 dev_dbg(&adapter->pdev->dev, "Completion AEN:0x%x.\n",
959 clear_bit(QLC_83XX_IDC_COMP_AEN, &adapter->ahw->idc.status);
963 static void __qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter)
965 struct qlcnic_hardware_context *ahw = adapter->ahw;
975 qlcnic_83xx_handle_link_aen(adapter, event);
978 qlcnic_83xx_handle_idc_comp_aen(adapter, event);
982 adapter->ahw->mbox_aen[i] = QLCNIC_MBX_RSP(event[i]);
983 queue_delayed_work(adapter->qlcnic_wq,
984 &adapter->idc_aen_work, 0);
990 qlcnic_sriov_handle_bc_event(adapter, event[1]);
993 dev_info(&adapter->pdev->dev, "SFP+ Insert AEN:0x%x.\n",
997 dev_info(&adapter->pdev->dev, "SFP Removed AEN:0x%x.\n",
1001 qlcnic_dcb_aen_handler(adapter->dcb, (void *)&event[1]);
1004 dev_dbg(&adapter->pdev->dev, "Unsupported AEN:0x%x.\n",
1012 static void qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter)
1015 struct qlcnic_hardware_context *ahw = adapter->ahw;
1024 __qlcnic_83xx_process_aen(adapter);
1035 struct qlcnic_adapter *adapter;
1037 adapter = container_of(work, struct qlcnic_adapter, mbx_poll_work.work);
1039 if (!test_bit(__QLCNIC_MBX_POLL_ENABLE, &adapter->state))
1042 qlcnic_83xx_process_aen(adapter);
1043 queue_delayed_work(adapter->qlcnic_wq, &adapter->mbx_poll_work,
1047 void qlcnic_83xx_enable_mbx_poll(struct qlcnic_adapter *adapter)
1049 if (test_and_set_bit(__QLCNIC_MBX_POLL_ENABLE, &adapter->state))
1052 INIT_DELAYED_WORK(&adapter->mbx_poll_work, qlcnic_83xx_mbx_poll_work);
1053 queue_delayed_work(adapter->qlcnic_wq, &adapter->mbx_poll_work, 0);
1056 void qlcnic_83xx_disable_mbx_poll(struct qlcnic_adapter *adapter)
1058 if (!test_and_clear_bit(__QLCNIC_MBX_POLL_ENABLE, &adapter->state))
1060 cancel_delayed_work_sync(&adapter->mbx_poll_work);
1063 static int qlcnic_83xx_add_rings(struct qlcnic_adapter *adapter)
1073 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
1074 struct qlcnic_hardware_context *ahw = adapter->ahw;
1078 num_sds = adapter->drv_sds_rings - QLCNIC_MAX_SDS_RINGS;
1079 err = ahw->hw_ops->alloc_mbx_args(&cmd, adapter,
1082 dev_err(&adapter->pdev->dev,
1091 for (i = 8; i < adapter->drv_sds_rings; i++) {
1100 if (adapter->flags & QLCNIC_MSIX_ENABLED)
1105 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST)
1116 err = ahw->hw_ops->mbx_cmd(adapter, &cmd);
1118 dev_err(&adapter->pdev->dev,
1126 for (i = 8; i < adapter->drv_sds_rings; i++) {
1130 if (adapter->flags & QLCNIC_MSIX_ENABLED)
1143 void qlcnic_83xx_del_rx_ctx(struct qlcnic_adapter *adapter)
1148 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
1150 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX))
1153 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter))
1156 if (qlcnic_sriov_pf_check(adapter))
1157 qlcnic_pf_set_interface_id_del_rx_ctx(adapter, &temp);
1160 err = qlcnic_issue_cmd(adapter, &cmd);
1162 dev_err(&adapter->pdev->dev,
1169 int qlcnic_83xx_create_rx_ctx(struct qlcnic_adapter *adapter)
1180 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
1181 struct qlcnic_hardware_context *ahw = adapter->ahw;
1182 num_rds = adapter->max_rds_rings;
1184 if (adapter->drv_sds_rings <= QLCNIC_MAX_SDS_RINGS)
1185 num_sds = adapter->drv_sds_rings;
1193 if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP)
1197 err = qlcnic_alloc_mbx_args(&cmd, adapter,
1202 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter))
1209 if (qlcnic_sriov_pf_check(adapter))
1210 qlcnic_pf_set_interface_id_create_rx_ctx(adapter,
1222 if (adapter->flags & QLCNIC_MSIX_ENABLED)
1226 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST)
1255 err = ahw->hw_ops->mbx_cmd(adapter, &cmd);
1257 dev_err(&adapter->pdev->dev,
1265 dev_info(&adapter->pdev->dev, "Rx Context[%d] Created, state:0x%x\n",
1281 if (adapter->flags & QLCNIC_MSIX_ENABLED)
1288 if (adapter->drv_sds_rings > QLCNIC_MAX_SDS_RINGS)
1289 err = qlcnic_83xx_add_rings(adapter);
1295 void qlcnic_83xx_del_tx_ctx(struct qlcnic_adapter *adapter,
1301 if (qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX))
1304 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter))
1307 if (qlcnic_sriov_pf_check(adapter))
1308 qlcnic_pf_set_interface_id_del_tx_ctx(adapter, &temp);
1311 if (qlcnic_issue_cmd(adapter, &cmd))
1312 dev_err(&adapter->pdev->dev,
1317 int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *adapter,
1326 struct qlcnic_hardware_context *ahw = adapter->ahw;
1342 if (adapter->flags & QLCNIC_MSIX_ENABLED) {
1343 if (!(adapter->flags & QLCNIC_TX_INTR_SHARED))
1344 msix_vector = adapter->drv_sds_rings + ring;
1346 msix_vector = adapter->drv_sds_rings - 1;
1352 if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST)
1358 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX);
1362 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter))
1365 if (qlcnic_sriov_pf_check(adapter))
1366 qlcnic_pf_set_interface_id_create_tx_ctx(adapter, &temp);
1374 err = qlcnic_issue_cmd(adapter, &cmd);
1376 netdev_err(adapter->netdev,
1383 if ((adapter->flags & QLCNIC_MSIX_ENABLED) &&
1384 !(adapter->flags & QLCNIC_TX_INTR_SHARED)) {
1385 intr_mask = ahw->intr_tbl[adapter->drv_sds_rings + ring].src;
1388 netdev_info(adapter->netdev,
1399 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1402 u16 adapter_state = adapter->is_up;
1409 __qlcnic_down(adapter, netdev);
1411 qlcnic_detach(adapter);
1413 adapter->drv_sds_rings = QLCNIC_SINGLE_RING;
1414 adapter->ahw->diag_test = test;
1415 adapter->ahw->linkup = 0;
1417 ret = qlcnic_attach(adapter);
1423 ret = qlcnic_fw_create_ctx(adapter);
1425 qlcnic_detach(adapter);
1427 adapter->drv_sds_rings = num_sds_ring;
1428 qlcnic_attach(adapter);
1434 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
1435 rds_ring = &adapter->recv_ctx->rds_rings[ring];
1436 qlcnic_post_rx_buffers(adapter, rds_ring, ring);
1439 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1440 for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
1441 sds_ring = &adapter->recv_ctx->sds_rings[ring];
1442 qlcnic_enable_sds_intr(adapter, sds_ring);
1446 if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) {
1447 adapter->ahw->loopback_state = 0;
1448 adapter->ahw->hw_ops->setup_link_event(adapter, 1);
1451 set_bit(__QLCNIC_DEV_UP, &adapter->state);
1458 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1462 clear_bit(__QLCNIC_DEV_UP, &adapter->state);
1463 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1464 for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
1465 sds_ring = &adapter->recv_ctx->sds_rings[ring];
1466 if (adapter->flags & QLCNIC_MSIX_ENABLED)
1467 qlcnic_disable_sds_intr(adapter, sds_ring);
1471 qlcnic_fw_destroy_ctx(adapter);
1472 qlcnic_detach(adapter);
1474 adapter->ahw->diag_test = 0;
1475 adapter->drv_sds_rings = drv_sds_rings;
1477 if (qlcnic_attach(adapter))
1481 __qlcnic_up(adapter, netdev);
1487 static void qlcnic_83xx_get_beacon_state(struct qlcnic_adapter *adapter)
1489 struct qlcnic_hardware_context *ahw = adapter->ahw;
1494 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LED_CONFIG);
1496 err = qlcnic_issue_cmd(adapter, &cmd);
1505 netdev_err(adapter->netdev, "Get beacon state failed, err=%d\n",
1514 int qlcnic_83xx_config_led(struct qlcnic_adapter *adapter, u32 state,
1523 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1528 status = qlcnic_issue_cmd(adapter, &cmd);
1530 dev_err(&adapter->pdev->dev,
1535 adapter->ahw->mbox_reg[i] = cmd.rsp.arg[i+1];
1541 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1551 status = qlcnic_issue_cmd(adapter, &cmd);
1553 dev_err(&adapter->pdev->dev,
1562 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1567 cmd.req.arg[1] = adapter->ahw->mbox_reg[0];
1568 cmd.req.arg[2] = adapter->ahw->mbox_reg[1];
1569 cmd.req.arg[3] = adapter->ahw->mbox_reg[2];
1571 cmd.req.arg[4] = adapter->ahw->mbox_reg[3];
1572 status = qlcnic_issue_cmd(adapter, &cmd);
1574 dev_err(&adapter->pdev->dev,
1584 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1587 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
1595 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state))
1598 if (test_bit(__QLCNIC_RESETTING, &adapter->state))
1601 err = qlcnic_83xx_config_led(adapter, active, 0);
1608 if (test_bit(__QLCNIC_RESETTING, &adapter->state))
1611 err = qlcnic_83xx_config_led(adapter, active, 0);
1621 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
1626 void qlcnic_83xx_initialize_nic(struct qlcnic_adapter *adapter, int enable)
1631 if (qlcnic_sriov_vf_check(adapter))
1635 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1638 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1646 if (adapter->dcb)
1649 status = qlcnic_issue_cmd(adapter, &cmd);
1651 dev_err(&adapter->pdev->dev,
1658 static int qlcnic_83xx_set_port_config(struct qlcnic_adapter *adapter)
1663 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_PORT_CONFIG);
1667 cmd.req.arg[1] = adapter->ahw->port_config;
1668 err = qlcnic_issue_cmd(adapter, &cmd);
1670 dev_info(&adapter->pdev->dev, "Set Port Config failed.\n");
1675 static int qlcnic_83xx_get_port_config(struct qlcnic_adapter *adapter)
1680 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PORT_CONFIG);
1684 err = qlcnic_issue_cmd(adapter, &cmd);
1686 dev_info(&adapter->pdev->dev, "Get Port config failed\n");
1688 adapter->ahw->port_config = cmd.rsp.arg[1];
1693 int qlcnic_83xx_setup_link_event(struct qlcnic_adapter *adapter, int enable)
1699 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_EVENT);
1703 temp = adapter->recv_ctx->context_id << 16;
1705 err = qlcnic_issue_cmd(adapter, &cmd);
1707 dev_info(&adapter->pdev->dev,
1713 static void qlcnic_83xx_set_interface_id_promisc(struct qlcnic_adapter *adapter,
1716 if (qlcnic_sriov_pf_check(adapter)) {
1717 qlcnic_alloc_lb_filters_mem(adapter);
1718 qlcnic_pf_set_interface_id_promisc(adapter, interface_id);
1719 adapter->rx_mac_learn = true;
1721 if (!qlcnic_sriov_vf_check(adapter))
1722 *interface_id = adapter->recv_ctx->context_id << 16;
1726 int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode)
1732 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
1739 err = qlcnic_alloc_mbx_args(cmd, adapter,
1745 qlcnic_83xx_set_interface_id_promisc(adapter, &temp);
1747 if (qlcnic_84xx_check(adapter) && qlcnic_sriov_pf_check(adapter))
1751 err = qlcnic_issue_cmd(adapter, cmd);
1764 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1765 struct qlcnic_hardware_context *ahw = adapter->ahw;
1766 u8 drv_sds_rings = adapter->drv_sds_rings;
1767 u8 drv_tx_rings = adapter->drv_tx_rings;
1776 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
1781 if (qlcnic_get_diag_lock(adapter)) {
1794 ret = qlcnic_83xx_set_lb_mode(adapter, mode);
1802 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
1812 qlcnic_83xx_clear_lb_mode(adapter, mode);
1815 } while ((adapter->ahw->linkup && ahw->has_link_events) != 1);
1817 ret = qlcnic_do_lb_test(adapter, mode);
1819 qlcnic_83xx_clear_lb_mode(adapter, mode);
1825 adapter->drv_sds_rings = drv_sds_rings;
1826 adapter->drv_tx_rings = drv_tx_rings;
1827 qlcnic_release_diag_lock(adapter);
1831 static void qlcnic_extend_lb_idc_cmpltn_wait(struct qlcnic_adapter *adapter,
1834 struct qlcnic_hardware_context *ahw = adapter->ahw;
1837 netdev_info(adapter->netdev, "Received loopback IDC time extend event for 0x%x seconds\n",
1844 static int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
1846 struct qlcnic_hardware_context *ahw = adapter->ahw;
1847 struct net_device *netdev = adapter->netdev;
1853 status = qlcnic_83xx_get_port_config(adapter);
1874 status = qlcnic_83xx_set_port_config(adapter);
1888 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
1896 qlcnic_extend_lb_idc_cmpltn_wait(adapter,
1903 qlcnic_83xx_clear_lb_mode(adapter, mode);
1908 qlcnic_sre_macaddr_change(adapter, adapter->mac_addr, 0,
1913 static int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
1915 struct qlcnic_hardware_context *ahw = adapter->ahw;
1917 struct net_device *netdev = adapter->netdev;
1928 status = qlcnic_83xx_set_port_config(adapter);
1942 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
1950 qlcnic_extend_lb_idc_cmpltn_wait(adapter,
1961 qlcnic_sre_macaddr_change(adapter, adapter->mac_addr, 0,
1966 static void qlcnic_83xx_set_interface_id_ipaddr(struct qlcnic_adapter *adapter,
1969 if (qlcnic_sriov_pf_check(adapter)) {
1970 qlcnic_pf_set_interface_id_ipaddr(adapter, interface_id);
1972 if (!qlcnic_sriov_vf_check(adapter))
1973 *interface_id = adapter->recv_ctx->context_id << 16;
1977 void qlcnic_83xx_config_ipaddr(struct qlcnic_adapter *adapter, __be32 ip,
1984 err = qlcnic_alloc_mbx_args(&cmd, adapter,
1989 qlcnic_83xx_set_interface_id_ipaddr(adapter, &temp);
1997 * Adapter needs IP address in network byte order.
2006 err = qlcnic_issue_cmd(adapter, &cmd);
2008 dev_err(&adapter->netdev->dev,
2015 int qlcnic_83xx_config_hw_lro(struct qlcnic_adapter *adapter, int mode)
2024 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
2027 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO);
2031 temp = adapter->recv_ctx->context_id << 16;
2035 err = qlcnic_issue_cmd(adapter, &cmd);
2037 dev_info(&adapter->pdev->dev, "LRO config failed\n");
2043 int qlcnic_83xx_config_rss(struct qlcnic_adapter *adapter, int enable)
2054 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_RSS);
2070 cmd.req.arg[1] = (adapter->recv_ctx->context_id);
2074 err = qlcnic_issue_cmd(adapter, &cmd);
2077 dev_info(&adapter->pdev->dev, "RSS config failed\n");
2084 static void qlcnic_83xx_set_interface_id_macaddr(struct qlcnic_adapter *adapter,
2087 if (qlcnic_sriov_pf_check(adapter)) {
2088 qlcnic_pf_set_interface_id_macaddr(adapter, interface_id);
2090 if (!qlcnic_sriov_vf_check(adapter))
2091 *interface_id = adapter->recv_ctx->context_id << 16;
2095 int qlcnic_83xx_sre_macaddr_change(struct qlcnic_adapter *adapter, u8 *addr,
2103 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
2110 err = qlcnic_alloc_mbx_args(cmd, adapter, QLCNIC_CMD_CONFIG_MAC_VLAN);
2121 qlcnic_83xx_set_interface_id_macaddr(adapter, &temp);
2132 err = qlcnic_issue_cmd(adapter, cmd);
2142 void qlcnic_83xx_change_l2_filter(struct qlcnic_adapter *adapter, u64 *addr,
2148 qlcnic_83xx_sre_macaddr_change(adapter, mac, vlan_id, QLCNIC_MAC_ADD);
2151 static void qlcnic_83xx_configure_mac(struct qlcnic_adapter *adapter, u8 *mac,
2164 int qlcnic_83xx_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac,
2171 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS);
2175 qlcnic_83xx_configure_mac(adapter, mac, QLCNIC_GET_CURRENT_MAC, &cmd);
2176 err = qlcnic_issue_cmd(adapter, &cmd);
2187 dev_err(&adapter->pdev->dev, "Failed to get mac address%d\n",
2195 static int qlcnic_83xx_set_rx_intr_coal(struct qlcnic_adapter *adapter)
2197 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
2202 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL);
2206 temp = adapter->recv_ctx->context_id;
2212 err = qlcnic_issue_cmd(adapter, &cmd);
2214 netdev_err(adapter->netdev,
2222 static int qlcnic_83xx_set_tx_intr_coal(struct qlcnic_adapter *adapter)
2224 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
2229 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL);
2233 temp = adapter->tx_ring->ctx_id;
2239 err = qlcnic_issue_cmd(adapter, &cmd);
2241 netdev_err(adapter->netdev,
2249 int qlcnic_83xx_set_rx_tx_intr_coal(struct qlcnic_adapter *adapter)
2253 err = qlcnic_83xx_set_rx_intr_coal(adapter);
2255 netdev_err(adapter->netdev,
2258 err = qlcnic_83xx_set_tx_intr_coal(adapter);
2260 netdev_err(adapter->netdev,
2266 int qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter,
2269 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
2274 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
2303 err = qlcnic_83xx_set_rx_intr_coal(adapter);
2306 err = qlcnic_83xx_set_tx_intr_coal(adapter);
2309 err = qlcnic_83xx_set_rx_tx_intr_coal(adapter);
2313 netdev_err(adapter->netdev,
2321 static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter,
2324 struct qlcnic_hardware_context *ahw = adapter->ahw;
2344 qlcnic_advert_link_change(adapter, link_status);
2350 struct qlcnic_adapter *adapter = data;
2354 mbx = adapter->ahw->mailbox;
2356 resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL);
2360 event = readl(QLCNIC_MBX_FW(adapter->ahw, 0));
2362 __qlcnic_83xx_process_aen(adapter);
2367 adapter->stats.mbx_spurious_intr++;
2371 mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
2372 writel(0, adapter->ahw->pci_base0 + mask);
2377 int qlcnic_83xx_set_nic_info(struct qlcnic_adapter *adapter,
2383 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) {
2384 dev_err(&adapter->pdev->dev,
2390 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
2404 err = qlcnic_issue_cmd(adapter, &cmd);
2407 dev_err(&adapter->pdev->dev, "Failed to set nic info%d\n",
2417 int qlcnic_83xx_get_nic_info(struct qlcnic_adapter *adapter,
2424 struct qlcnic_hardware_context *ahw = adapter->ahw;
2426 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO);
2436 err = qlcnic_issue_cmd(adapter, &cmd);
2438 dev_info(&adapter->pdev->dev,
2470 int qlcnic_get_pci_func_type(struct qlcnic_adapter *adapter, u16 type,
2473 struct device *dev = &adapter->pdev->dev;
2495 int qlcnic_83xx_get_pci_info(struct qlcnic_adapter *adapter,
2498 struct qlcnic_hardware_context *ahw = adapter->ahw;
2499 struct device *dev = &adapter->pdev->dev;
2505 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO);
2509 err = qlcnic_issue_cmd(adapter, &cmd);
2523 err = qlcnic_get_pci_func_type(adapter, pci_info->type,
2554 int qlcnic_83xx_config_intrpt(struct qlcnic_adapter *adapter, bool op_type)
2561 max_ints = adapter->ahw->num_msix - 1;
2562 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTRPT);
2568 if (qlcnic_sriov_vf_check(adapter))
2569 cmd.req.arg[1] |= (adapter->ahw->pci_func << 8) | BIT_16;
2573 val = type | (adapter->ahw->intr_tbl[i].type << 4);
2574 if (adapter->ahw->intr_tbl[i].type == QLCNIC_INTRPT_MSIX)
2575 val |= (adapter->ahw->intr_tbl[i].id << 16);
2578 err = qlcnic_issue_cmd(adapter, &cmd);
2580 dev_err(&adapter->pdev->dev,
2589 dev_info(&adapter->pdev->dev,
2591 adapter->ahw->intr_tbl[i].id);
2595 adapter->ahw->intr_tbl[i].id = MSW(val);
2596 adapter->ahw->intr_tbl[i].enabled = 1;
2598 adapter->ahw->intr_tbl[i].src = temp;
2600 adapter->ahw->intr_tbl[i].id = i;
2601 adapter->ahw->intr_tbl[i].enabled = 0;
2602 adapter->ahw->intr_tbl[i].src = 0;
2610 int qlcnic_83xx_lock_flash(struct qlcnic_adapter *adapter)
2616 status = QLC_SHARED_REG_RD32(adapter, QLCNIC_FLASH_LOCK);
2621 id = QLC_SHARED_REG_RD32(adapter,
2623 dev_err(&adapter->pdev->dev,
2630 QLC_SHARED_REG_WR32(adapter, QLCNIC_FLASH_LOCK_OWNER, adapter->portnum);
2634 void qlcnic_83xx_unlock_flash(struct qlcnic_adapter *adapter)
2636 QLC_SHARED_REG_RD32(adapter, QLCNIC_FLASH_UNLOCK);
2637 QLC_SHARED_REG_WR32(adapter, QLCNIC_FLASH_LOCK_OWNER, 0xFF);
2640 int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
2650 dev_err(&adapter->pdev->dev, "Illegal addr = 0x%x\n", addr);
2654 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_DIRECT_WINDOW,
2664 ret = QLCRD32(adapter, indirect_add, &err);
2677 qlcnic_83xx_wrt_reg_indirect(adapter,
2687 ret = QLCRD32(adapter, indirect_add, &err);
2701 static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter)
2708 status = QLCRD32(adapter, QLC_83XX_FLASH_STATUS, &err);
2725 int qlcnic_83xx_enable_flash_write(struct qlcnic_adapter *adapter)
2729 cmd = adapter->ahw->fdt.write_statusreg_cmd;
2730 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
2732 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA,
2733 adapter->ahw->fdt.write_enable_bits);
2734 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL,
2736 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
2743 int qlcnic_83xx_disable_flash_write(struct qlcnic_adapter *adapter)
2747 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
2749 adapter->ahw->fdt.write_statusreg_cmd));
2750 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA,
2751 adapter->ahw->fdt.write_disable_bits);
2752 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL,
2754 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
2761 int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
2766 if (qlcnic_83xx_lock_flash(adapter))
2769 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
2771 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL,
2773 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
2775 qlcnic_83xx_unlock_flash(adapter);
2779 mfg_id = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
2781 qlcnic_83xx_unlock_flash(adapter);
2785 adapter->flash_mfg_id = (mfg_id & 0xFF);
2786 qlcnic_83xx_unlock_flash(adapter);
2791 int qlcnic_83xx_read_flash_descriptor_table(struct qlcnic_adapter *adapter)
2798 if (qlcnic_83xx_lock_flash(adapter))
2801 memset(&adapter->ahw->fdt, 0, fdt_size);
2802 ret = qlcnic_83xx_lockless_flash_read32(adapter, QLCNIC_FDT_LOCATION,
2803 (u8 *)&adapter->ahw->fdt,
2805 qlcnic_swap32_buffer((u32 *)&adapter->ahw->fdt, count);
2806 qlcnic_83xx_unlock_flash(adapter);
2810 int qlcnic_83xx_erase_flash_sector(struct qlcnic_adapter *adapter,
2816 if (qlcnic_83xx_lock_flash(adapter) != 0)
2819 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) {
2820 ret = qlcnic_83xx_enable_flash_write(adapter);
2822 qlcnic_83xx_unlock_flash(adapter);
2823 dev_err(&adapter->pdev->dev,
2830 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
2832 qlcnic_83xx_unlock_flash(adapter);
2833 dev_err(&adapter->pdev->dev,
2842 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA,
2844 cmd = QLC_83XX_FLASH_FDT_ERASE_DEF_SIG | adapter->ahw->fdt.erase_cmd;
2845 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id)
2846 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, cmd);
2848 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
2850 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL,
2853 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
2855 qlcnic_83xx_unlock_flash(adapter);
2856 dev_err(&adapter->pdev->dev,
2861 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) {
2862 ret = qlcnic_83xx_disable_flash_write(adapter);
2864 qlcnic_83xx_unlock_flash(adapter);
2865 dev_err(&adapter->pdev->dev,
2871 qlcnic_83xx_unlock_flash(adapter);
2876 int qlcnic_83xx_flash_write32(struct qlcnic_adapter *adapter, u32 addr,
2882 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, addr1);
2883 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, *p_data);
2884 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL,
2886 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
2888 dev_err(&adapter->pdev->dev,
2896 int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
2904 dev_err(&adapter->pdev->dev,
2909 temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
2913 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL,
2915 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
2919 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, *p_data++);
2920 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL,
2922 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
2924 dev_err(&adapter->pdev->dev,
2930 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
2934 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA,
2936 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL,
2938 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
2940 dev_err(&adapter->pdev->dev,
2947 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
2951 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_WRDATA, *p_data++);
2952 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL,
2954 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
2956 dev_err(&adapter->pdev->dev,
2961 ret = QLCRD32(adapter, QLC_83XX_FLASH_SPI_STATUS, &err);
2966 dev_err(&adapter->pdev->dev, "%s: failed at %d\n",
2969 temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
2973 qlcnic_83xx_wrt_reg_indirect(adapter,
2981 static void qlcnic_83xx_recover_driver_lock(struct qlcnic_adapter *adapter)
2985 val = QLCRDX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK);
2990 val = val | ((adapter->portnum << 2) |
2992 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val);
2993 dev_info(&adapter->pdev->dev,
2996 val = QLCRDX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK);
2998 if (id == adapter->portnum) {
3001 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val);
3003 QLCRDX(adapter->ahw, QLC_83XX_DRV_UNLOCK);
3006 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val);
3007 dev_info(&adapter->pdev->dev,
3010 dev_info(&adapter->pdev->dev,
3015 dev_info(&adapter->pdev->dev,
3021 int qlcnic_83xx_lock_driver(struct qlcnic_adapter *adapter)
3027 status = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK);
3035 temp = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
3038 val = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
3041 dev_info(&adapter->pdev->dev,
3044 qlcnic_83xx_recover_driver_lock(adapter);
3048 dev_err(&adapter->pdev->dev,
3056 dev_err(&adapter->pdev->dev,
3062 val = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
3065 val = lock_alive_counter << 8 | adapter->portnum;
3066 QLCWRX(adapter->ahw, QLC_83XX_DRV_LOCK_ID, val);
3071 void qlcnic_83xx_unlock_driver(struct qlcnic_adapter *adapter)
3075 val = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
3079 if (id != adapter->portnum)
3080 dev_err(&adapter->pdev->dev,
3082 __func__, adapter->portnum, id);
3085 QLCWRX(adapter->ahw, QLC_83XX_DRV_LOCK_ID, val);
3086 QLCRDX(adapter->ahw, QLC_83XX_DRV_UNLOCK);
3089 int qlcnic_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
3099 mutex_lock(&adapter->ahw->mem_lock);
3100 qlcnic_ind_wr(adapter, QLCNIC_MS_ADDR_HI, 0);
3107 mutex_unlock(&adapter->ahw->mem_lock);
3111 qlcnic_ind_wr(adapter, QLCNIC_MS_ADDR_LO, addr);
3112 qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_LO, *data++);
3113 qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_HI, *data++);
3114 qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_ULO, *data++);
3115 qlcnic_ind_wr(adapter, QLCNIC_MS_WRTDATA_UHI, *data++);
3116 qlcnic_ind_wr(adapter, QLCNIC_MS_CTRL, QLCNIC_TA_WRITE_ENABLE);
3117 qlcnic_ind_wr(adapter, QLCNIC_MS_CTRL, QLCNIC_TA_WRITE_START);
3120 temp = qlcnic_ind_rd(adapter, QLCNIC_MS_CTRL);
3130 mutex_unlock(&adapter->ahw->mem_lock);
3135 mutex_unlock(&adapter->ahw->mem_lock);
3140 int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
3147 if (qlcnic_83xx_lock_flash(adapter) != 0)
3151 dev_err(&adapter->pdev->dev, "Illegal addr = 0x%x\n", addr);
3152 qlcnic_83xx_unlock_flash(adapter);
3157 if (qlcnic_83xx_wrt_reg_indirect(adapter,
3160 qlcnic_83xx_unlock_flash(adapter);
3165 ret = QLCRD32(adapter, indirect_addr, &err);
3167 qlcnic_83xx_unlock_flash(adapter);
3177 qlcnic_83xx_unlock_flash(adapter);
3182 void qlcnic_83xx_get_port_type(struct qlcnic_adapter *adapter)
3184 struct qlcnic_hardware_context *ahw = adapter->ahw;
3189 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_STATUS);
3193 err = qlcnic_issue_cmd(adapter, &cmd);
3195 dev_info(&adapter->pdev->dev,
3216 int qlcnic_83xx_test_link(struct qlcnic_adapter *adapter)
3222 struct qlcnic_hardware_context *ahw = adapter->ahw;
3224 if (qlcnic_sriov_vf_check(adapter))
3225 pci_func = adapter->portnum;
3231 dev_info(&adapter->pdev->dev, "link state down\n");
3235 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_STATUS);
3239 err = qlcnic_issue_cmd(adapter, &cmd);
3241 dev_info(&adapter->pdev->dev,
3300 int qlcnic_83xx_get_link_ksettings(struct qlcnic_adapter *adapter,
3303 struct qlcnic_hardware_context *ahw = adapter->ahw;
3308 if (!test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) {
3310 status = qlcnic_83xx_get_port_info(adapter);
3312 config = qlcnic_83xx_test_link(adapter);
3319 if (netif_running(adapter->netdev) && ahw->has_link_events) {
3401 int qlcnic_83xx_set_link_ksettings(struct qlcnic_adapter *adapter,
3404 struct qlcnic_hardware_context *ahw = adapter->ahw;
3405 u32 config = adapter->ahw->port_config;
3410 netdev_info(adapter->netdev,
3451 status = qlcnic_83xx_set_port_config(adapter);
3453 netdev_info(adapter->netdev,
3474 static u64 *qlcnic_83xx_fill_stats(struct qlcnic_adapter *adapter,
3481 err = qlcnic_issue_cmd(adapter, cmd);
3483 dev_info(&adapter->pdev->dev,
3524 dev_warn(&adapter->pdev->dev, "Unknown get statistics mode\n");
3530 void qlcnic_83xx_get_stats(struct qlcnic_adapter *adapter, u64 *data)
3533 struct net_device *netdev = adapter->netdev;
3536 ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_STATISTICS);
3540 cmd.req.arg[1] = BIT_1 | (adapter->tx_ring->ctx_id << 16);
3542 data = qlcnic_83xx_fill_stats(adapter, &cmd, data,
3549 cmd.req.arg[1] = BIT_2 | (adapter->portnum << 16);
3552 data = qlcnic_83xx_fill_stats(adapter, &cmd, data,
3559 cmd.req.arg[1] = adapter->recv_ctx->context_id << 16;
3562 data = qlcnic_83xx_fill_stats(adapter, &cmd, data,
3573 int qlcnic_83xx_extend_md_capab(struct qlcnic_adapter *adapter)
3578 err = qlcnic_alloc_mbx_args(&cmd, adapter,
3587 err = qlcnic_issue_cmd(adapter, &cmd);
3589 dev_err(&adapter->pdev->dev,
3595 int qlcnic_83xx_reg_test(struct qlcnic_adapter *adapter)
3599 major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR);
3600 minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR);
3601 sub = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB);
3603 if (adapter->fw_version != QLCNIC_VERSION_CODE(major, minor, sub)) {
3604 dev_info(&adapter->pdev->dev, "%s: Reg test failed\n",
3611 inline int qlcnic_83xx_get_regs_len(struct qlcnic_adapter *adapter)
3614 sizeof(*adapter->ahw->ext_reg_tbl)) +
3616 sizeof(*adapter->ahw->reg_tbl));
3619 int qlcnic_83xx_get_registers(struct qlcnic_adapter *adapter, u32 *regs_buff)
3625 regs_buff[i] = QLC_SHARED_REG_RD32(adapter, j);
3628 regs_buff[i++] = QLCRDX(adapter->ahw, j);
3634 struct qlcnic_adapter *adapter = netdev_priv(netdev);
3635 struct qlcnic_hardware_context *ahw = adapter->ahw;
3637 u8 val, drv_sds_rings = adapter->drv_sds_rings;
3638 u8 drv_tx_rings = adapter->drv_tx_rings;
3643 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
3648 if (qlcnic_get_diag_lock(adapter)) {
3659 ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST);
3663 if (adapter->flags & QLCNIC_MSIX_ENABLED)
3672 ret = qlcnic_issue_cmd(adapter, &cmd);
3677 dev_info(&adapter->pdev->dev,
3681 dev_err(&adapter->pdev->dev,
3696 adapter->drv_sds_rings = drv_sds_rings;
3697 adapter->drv_tx_rings = drv_tx_rings;
3698 qlcnic_release_diag_lock(adapter);
3702 void qlcnic_83xx_get_pauseparam(struct qlcnic_adapter *adapter,
3705 struct qlcnic_hardware_context *ahw = adapter->ahw;
3709 status = qlcnic_83xx_get_port_config(adapter);
3711 dev_err(&adapter->pdev->dev,
3738 int qlcnic_83xx_set_pauseparam(struct qlcnic_adapter *adapter,
3741 struct qlcnic_hardware_context *ahw = adapter->ahw;
3745 status = qlcnic_83xx_get_port_config(adapter);
3747 dev_err(&adapter->pdev->dev,
3777 status = qlcnic_83xx_set_port_config(adapter);
3779 dev_err(&adapter->pdev->dev,
3786 static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
3791 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
3793 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_CONTROL,
3795 ret = qlcnic_83xx_poll_flash_status_reg(adapter);
3799 temp = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
3806 int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter)
3810 status = qlcnic_83xx_read_flash_status_reg(adapter);
3812 dev_info(&adapter->pdev->dev, "%s: EEPROM test failed.\n",
3821 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3822 struct net_device *netdev = adapter->netdev;
3825 qlcnic_cancel_idc_work(adapter);
3828 qlcnic_down(adapter, netdev);
3830 qlcnic_83xx_disable_mbx_intr(adapter);
3831 cancel_delayed_work_sync(&adapter->idc_aen_work);
3836 static int qlcnic_83xx_resume(struct qlcnic_adapter *adapter)
3838 struct qlcnic_hardware_context *ahw = adapter->ahw;
3842 err = qlcnic_83xx_idc_init(adapter);
3848 qlcnic_83xx_set_vnic_opmode(adapter);
3850 err = qlcnic_83xx_check_vnic_state(adapter);
3856 err = qlcnic_83xx_idc_reattach_driver(adapter);
3860 qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state,
3881 qlcnic_83xx_notify_cmd_completion(struct qlcnic_adapter *adapter,
3894 static void qlcnic_83xx_flush_mbx_queue(struct qlcnic_adapter *adapter)
3896 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox;
3904 dev_info(&adapter->pdev->dev, "%s: Mailbox command 0x%x\n",
3908 qlcnic_83xx_notify_cmd_completion(adapter, cmd);
3914 static int qlcnic_83xx_check_mbx_status(struct qlcnic_adapter *adapter)
3916 struct qlcnic_hardware_context *ahw = adapter->ahw;
3933 static inline void qlcnic_83xx_signal_mbx_cmd(struct qlcnic_adapter *adapter,
3937 QLCWRX(adapter->ahw, QLCNIC_HOST_MBX_CTRL, QLCNIC_SET_OWNER);
3939 QLCWRX(adapter->ahw, QLCNIC_FW_MBX_CTRL, QLCNIC_CLR_OWNER);
3942 static void qlcnic_83xx_dequeue_mbx_cmd(struct qlcnic_adapter *adapter,
3945 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox;
3954 qlcnic_83xx_notify_cmd_completion(adapter, cmd);
3957 static void qlcnic_83xx_encode_mbx_cmd(struct qlcnic_adapter *adapter,
3961 struct qlcnic_hardware_context *ahw = adapter->ahw;
3980 if (qlcnic_sriov_pf_check(adapter))
3992 void qlcnic_83xx_detach_mailbox_work(struct qlcnic_adapter *adapter)
3994 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox;
4003 qlcnic_83xx_flush_mbx_queue(adapter);
4006 static int qlcnic_83xx_enqueue_mbx_cmd(struct qlcnic_adapter *adapter,
4010 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox;
4033 static int qlcnic_83xx_check_mac_rcode(struct qlcnic_adapter *adapter,
4040 fw_data = readl(QLCNIC_MBX_FW(adapter->ahw, 2));
4053 static void qlcnic_83xx_decode_mbx_rsp(struct qlcnic_adapter *adapter,
4056 struct qlcnic_hardware_context *ahw = adapter->ahw;
4057 struct device *dev = &adapter->pdev->dev;
4063 qlcnic_83xx_get_mbx_data(adapter, cmd);
4071 if (!qlcnic_83xx_check_mac_rcode(adapter, cmd))
4078 qlcnic_dump_mbx(adapter, cmd);
4084 static inline void qlcnic_dump_mailbox_registers(struct qlcnic_adapter *adapter)
4086 struct qlcnic_hardware_context *ahw = adapter->ahw;
4090 dev_info(&adapter->pdev->dev, "Mbx interrupt mask=0x%x, Mbx interrupt enable=0x%x, Host mbx control=0x%x, Fw mbx control=0x%x",
4101 struct qlcnic_adapter *adapter = mbx->adapter;
4103 struct device *dev = &adapter->pdev->dev;
4109 ahw = adapter->ahw;
4112 if (qlcnic_83xx_check_mbx_status(adapter)) {
4113 qlcnic_83xx_flush_mbx_queue(adapter);
4131 mbx_ops->encode_cmd(adapter, cmd);
4132 mbx_ops->nofity_fw(adapter, QLC_83XX_MBX_REQUEST);
4136 mbx_ops->decode_resp(adapter, cmd);
4137 mbx_ops->nofity_fw(adapter, QLC_83XX_MBX_COMPLETION);
4143 qlcnic_dump_mailbox_registers(adapter);
4144 qlcnic_83xx_get_mbx_data(adapter, cmd);
4145 qlcnic_dump_mbx(adapter, cmd);
4146 qlcnic_83xx_idc_request_reset(adapter,
4150 mbx_ops->dequeue_cmd(adapter, cmd);
4162 int qlcnic_83xx_init_mailbox_work(struct qlcnic_adapter *adapter)
4164 struct qlcnic_hardware_context *ahw = adapter->ahw;
4173 mbx->adapter = adapter;
4194 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
4202 set_bit(__QLCNIC_AER, &adapter->state);
4203 set_bit(__QLCNIC_RESETTING, &adapter->state);
4205 qlcnic_83xx_aer_stop_poll_work(adapter);
4215 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
4227 err = qlcnic_83xx_aer_reset(adapter);
4231 clear_bit(__QLCNIC_AER, &adapter->state);
4232 clear_bit(__QLCNIC_RESETTING, &adapter->state);
4238 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
4240 if (test_and_clear_bit(__QLCNIC_AER, &adapter->state))
4241 qlcnic_83xx_aer_start_poll_work(adapter);