Lines Matching refs:adapter
39 static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter);
41 static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter);
133 qlcnic_83xx_idc_check_driver_presence_reg(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_check_driver_presence_reg() argument
137 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE); in qlcnic_83xx_idc_check_driver_presence_reg()
144 static void qlcnic_83xx_idc_log_state_history(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_log_state_history() argument
147 cur = adapter->ahw->idc.curr_state; in qlcnic_83xx_idc_log_state_history()
148 prev = adapter->ahw->idc.prev_state; in qlcnic_83xx_idc_log_state_history()
150 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_log_state_history()
152 adapter->ahw->idc.name[cur], in qlcnic_83xx_idc_log_state_history()
153 adapter->ahw->idc.name[prev]); in qlcnic_83xx_idc_log_state_history()
156 static int qlcnic_83xx_idc_update_audit_reg(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_update_audit_reg() argument
163 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_update_audit_reg()
167 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT); in qlcnic_83xx_idc_update_audit_reg()
168 val |= (adapter->portnum & 0xf); in qlcnic_83xx_idc_update_audit_reg()
171 seconds = jiffies / HZ - adapter->ahw->idc.sec_counter; in qlcnic_83xx_idc_update_audit_reg()
176 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT, val); in qlcnic_83xx_idc_update_audit_reg()
177 adapter->ahw->idc.sec_counter = jiffies / HZ; in qlcnic_83xx_idc_update_audit_reg()
180 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_update_audit_reg()
185 static void qlcnic_83xx_idc_update_minor_version(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_update_minor_version() argument
189 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION); in qlcnic_83xx_idc_update_minor_version()
190 val = val & ~(0x3 << (adapter->portnum * 2)); in qlcnic_83xx_idc_update_minor_version()
191 val = val | (QLC_83XX_IDC_MINOR_VERSION << (adapter->portnum * 2)); in qlcnic_83xx_idc_update_minor_version()
192 QLCWRX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION, val); in qlcnic_83xx_idc_update_minor_version()
195 static int qlcnic_83xx_idc_update_major_version(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_update_major_version() argument
201 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_update_major_version()
205 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION); in qlcnic_83xx_idc_update_major_version()
208 QLCWRX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION, val); in qlcnic_83xx_idc_update_major_version()
211 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_update_major_version()
217 qlcnic_83xx_idc_update_drv_presence_reg(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_update_drv_presence_reg() argument
223 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_update_drv_presence_reg()
227 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE); in qlcnic_83xx_idc_update_drv_presence_reg()
230 val = val | (1 << adapter->portnum); in qlcnic_83xx_idc_update_drv_presence_reg()
232 val = val & ~(1 << adapter->portnum); in qlcnic_83xx_idc_update_drv_presence_reg()
234 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val); in qlcnic_83xx_idc_update_drv_presence_reg()
235 qlcnic_83xx_idc_update_minor_version(adapter); in qlcnic_83xx_idc_update_drv_presence_reg()
238 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_update_drv_presence_reg()
243 static int qlcnic_83xx_idc_check_major_version(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_check_major_version() argument
248 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION); in qlcnic_83xx_idc_check_major_version()
252 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_check_major_version()
261 static int qlcnic_83xx_idc_clear_registers(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_clear_registers() argument
267 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_clear_registers()
271 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, 0); in qlcnic_83xx_idc_clear_registers()
273 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); in qlcnic_83xx_idc_clear_registers()
275 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val); in qlcnic_83xx_idc_clear_registers()
278 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_clear_registers()
283 static int qlcnic_83xx_idc_update_drv_ack_reg(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_update_drv_ack_reg() argument
289 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_update_drv_ack_reg()
293 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK); in qlcnic_83xx_idc_update_drv_ack_reg()
295 val = val | (1 << adapter->portnum); in qlcnic_83xx_idc_update_drv_ack_reg()
297 val = val & ~(1 << adapter->portnum); in qlcnic_83xx_idc_update_drv_ack_reg()
298 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, val); in qlcnic_83xx_idc_update_drv_ack_reg()
301 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_update_drv_ack_reg()
306 static int qlcnic_83xx_idc_check_timeout(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_check_timeout() argument
311 seconds = jiffies / HZ - adapter->ahw->idc.sec_counter; in qlcnic_83xx_idc_check_timeout()
327 static int qlcnic_83xx_idc_check_reset_ack_reg(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_check_reset_ack_reg() argument
333 ack = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK); in qlcnic_83xx_idc_check_reset_ack_reg()
334 presence = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE); in qlcnic_83xx_idc_check_reset_ack_reg()
335 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_check_reset_ack_reg()
338 if (qlcnic_83xx_idc_check_timeout(adapter, timeout)) { in qlcnic_83xx_idc_check_reset_ack_reg()
340 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_check_reset_ack_reg()
342 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE); in qlcnic_83xx_idc_check_reset_ack_reg()
344 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_check_reset_ack_reg()
346 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val); in qlcnic_83xx_idc_check_reset_ack_reg()
347 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_check_reset_ack_reg()
350 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_check_reset_ack_reg()
357 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_check_reset_ack_reg()
374 static int qlcnic_83xx_idc_tx_soft_reset(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_tx_soft_reset() argument
376 struct net_device *netdev = adapter->netdev; in qlcnic_83xx_idc_tx_soft_reset()
378 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_83xx_idc_tx_soft_reset()
382 qlcnic_down(adapter, netdev); in qlcnic_83xx_idc_tx_soft_reset()
383 qlcnic_up(adapter, netdev); in qlcnic_83xx_idc_tx_soft_reset()
385 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_idc_tx_soft_reset()
386 netdev_info(adapter->netdev, "%s: soft reset complete.\n", __func__); in qlcnic_83xx_idc_tx_soft_reset()
399 static void qlcnic_83xx_idc_detach_driver(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_detach_driver() argument
402 struct net_device *netdev = adapter->netdev; in qlcnic_83xx_idc_detach_driver()
405 qlcnic_83xx_detach_mailbox_work(adapter); in qlcnic_83xx_idc_detach_driver()
408 qlcnic_83xx_disable_mbx_intr(adapter); in qlcnic_83xx_idc_detach_driver()
409 qlcnic_down(adapter, netdev); in qlcnic_83xx_idc_detach_driver()
410 for (i = 0; i < adapter->ahw->num_msix; i++) { in qlcnic_83xx_idc_detach_driver()
411 adapter->ahw->intr_tbl[i].id = i; in qlcnic_83xx_idc_detach_driver()
412 adapter->ahw->intr_tbl[i].enabled = 0; in qlcnic_83xx_idc_detach_driver()
413 adapter->ahw->intr_tbl[i].src = 0; in qlcnic_83xx_idc_detach_driver()
416 if (qlcnic_sriov_pf_check(adapter)) in qlcnic_83xx_idc_detach_driver()
417 qlcnic_sriov_pf_reset(adapter); in qlcnic_83xx_idc_detach_driver()
429 static void qlcnic_83xx_idc_attach_driver(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_attach_driver() argument
431 struct net_device *netdev = adapter->netdev; in qlcnic_83xx_idc_attach_driver()
434 if (qlcnic_up(adapter, netdev)) in qlcnic_83xx_idc_attach_driver()
442 static int qlcnic_83xx_idc_enter_failed_state(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_enter_failed_state() argument
446 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_enter_failed_state()
450 qlcnic_83xx_idc_clear_registers(adapter, 0); in qlcnic_83xx_idc_enter_failed_state()
451 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_FAILED); in qlcnic_83xx_idc_enter_failed_state()
453 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_enter_failed_state()
455 qlcnic_83xx_idc_log_state_history(adapter); in qlcnic_83xx_idc_enter_failed_state()
456 dev_info(&adapter->pdev->dev, "Device will enter failed state\n"); in qlcnic_83xx_idc_enter_failed_state()
461 static int qlcnic_83xx_idc_enter_init_state(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_enter_init_state() argument
465 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_enter_init_state()
469 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_INIT); in qlcnic_83xx_idc_enter_init_state()
472 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_enter_init_state()
477 static int qlcnic_83xx_idc_enter_need_quiesce(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_enter_need_quiesce() argument
481 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_enter_need_quiesce()
485 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, in qlcnic_83xx_idc_enter_need_quiesce()
489 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_enter_need_quiesce()
495 qlcnic_83xx_idc_enter_need_reset_state(struct qlcnic_adapter *adapter, int lock) in qlcnic_83xx_idc_enter_need_reset_state() argument
498 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_enter_need_reset_state()
502 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, in qlcnic_83xx_idc_enter_need_reset_state()
506 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_enter_need_reset_state()
511 static int qlcnic_83xx_idc_enter_ready_state(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_enter_ready_state() argument
515 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_enter_ready_state()
519 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_READY); in qlcnic_83xx_idc_enter_ready_state()
521 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_enter_ready_state()
537 static int qlcnic_83xx_idc_find_reset_owner_id(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_find_reset_owner_id() argument
541 reg1 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_1); in qlcnic_83xx_idc_find_reset_owner_id()
542 reg2 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_2); in qlcnic_83xx_idc_find_reset_owner_id()
575 static int qlcnic_83xx_idc_restart_hw(struct qlcnic_adapter *adapter, int lock) in qlcnic_83xx_idc_restart_hw() argument
579 ret = qlcnic_83xx_restart_hw(adapter); in qlcnic_83xx_idc_restart_hw()
582 qlcnic_83xx_idc_enter_failed_state(adapter, lock); in qlcnic_83xx_idc_restart_hw()
584 qlcnic_83xx_idc_clear_registers(adapter, lock); in qlcnic_83xx_idc_restart_hw()
585 ret = qlcnic_83xx_idc_enter_ready_state(adapter, lock); in qlcnic_83xx_idc_restart_hw()
591 static int qlcnic_83xx_idc_check_fan_failure(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_check_fan_failure() argument
595 status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1); in qlcnic_83xx_idc_check_fan_failure()
598 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_check_fan_failure()
601 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_check_fan_failure()
604 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_check_fan_failure()
613 int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_reattach_driver() argument
617 qlcnic_83xx_reinit_mbx_work(adapter->ahw->mailbox); in qlcnic_83xx_idc_reattach_driver()
618 qlcnic_83xx_enable_mbx_interrupt(adapter); in qlcnic_83xx_idc_reattach_driver()
620 qlcnic_83xx_initialize_nic(adapter, 1); in qlcnic_83xx_idc_reattach_driver()
622 err = qlcnic_sriov_pf_reinit(adapter); in qlcnic_83xx_idc_reattach_driver()
626 qlcnic_83xx_enable_mbx_interrupt(adapter); in qlcnic_83xx_idc_reattach_driver()
628 if (qlcnic_83xx_configure_opmode(adapter)) { in qlcnic_83xx_idc_reattach_driver()
629 qlcnic_83xx_idc_enter_failed_state(adapter, 1); in qlcnic_83xx_idc_reattach_driver()
633 if (adapter->nic_ops->init_driver(adapter)) { in qlcnic_83xx_idc_reattach_driver()
634 qlcnic_83xx_idc_enter_failed_state(adapter, 1); in qlcnic_83xx_idc_reattach_driver()
638 if (adapter->portnum == 0) in qlcnic_83xx_idc_reattach_driver()
639 qlcnic_set_drv_version(adapter); in qlcnic_83xx_idc_reattach_driver()
641 qlcnic_dcb_get_info(adapter->dcb); in qlcnic_83xx_idc_reattach_driver()
642 qlcnic_83xx_idc_attach_driver(adapter); in qlcnic_83xx_idc_reattach_driver()
647 static void qlcnic_83xx_idc_update_idc_params(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_update_idc_params() argument
649 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_idc_update_idc_params()
651 qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 1); in qlcnic_83xx_idc_update_idc_params()
652 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1); in qlcnic_83xx_idc_update_idc_params()
653 set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status); in qlcnic_83xx_idc_update_idc_params()
660 adapter->tx_timeo_cnt = 0; in qlcnic_83xx_idc_update_idc_params()
663 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_idc_update_idc_params()
677 int qlcnic_83xx_idc_ready_state_entry(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_ready_state_entry() argument
679 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_idc_ready_state_entry()
682 qlcnic_83xx_idc_update_idc_params(adapter); in qlcnic_83xx_idc_ready_state_entry()
686 if (qlcnic_83xx_idc_reattach_driver(adapter)) in qlcnic_83xx_idc_ready_state_entry()
706 int qlcnic_83xx_idc_vnic_pf_entry(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_vnic_pf_entry() argument
709 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_idc_vnic_pf_entry()
712 state = QLCRDX(adapter->ahw, QLC_83XX_VNIC_STATE); in qlcnic_83xx_idc_vnic_pf_entry()
715 qlcnic_83xx_idc_enter_failed_state(adapter, 1); in qlcnic_83xx_idc_vnic_pf_entry()
718 dev_info(&adapter->pdev->dev, "vNIC mode disabled\n"); in qlcnic_83xx_idc_vnic_pf_entry()
724 qlcnic_83xx_idc_update_idc_params(adapter); in qlcnic_83xx_idc_vnic_pf_entry()
729 if (qlcnic_83xx_idc_reattach_driver(adapter)) in qlcnic_83xx_idc_vnic_pf_entry()
732 adapter->ahw->idc.vnic_state = QLCNIC_DEV_NPAR_OPER; in qlcnic_83xx_idc_vnic_pf_entry()
733 dev_info(&adapter->pdev->dev, "vNIC mode enabled\n"); in qlcnic_83xx_idc_vnic_pf_entry()
740 static int qlcnic_83xx_idc_unknown_state(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_unknown_state() argument
742 adapter->ahw->idc.err_code = -EIO; in qlcnic_83xx_idc_unknown_state()
743 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_unknown_state()
745 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_idc_unknown_state()
761 static int qlcnic_83xx_idc_cold_state_handler(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_cold_state_handler() argument
763 qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 0); in qlcnic_83xx_idc_cold_state_handler()
764 qlcnic_83xx_idc_update_audit_reg(adapter, 1, 0); in qlcnic_83xx_idc_cold_state_handler()
767 qlcnic_83xx_idc_restart_hw(adapter, 0); in qlcnic_83xx_idc_cold_state_handler()
769 if (qlcnic_83xx_check_hw_status(adapter)) { in qlcnic_83xx_idc_cold_state_handler()
770 qlcnic_83xx_idc_enter_failed_state(adapter, 0); in qlcnic_83xx_idc_cold_state_handler()
773 qlcnic_83xx_idc_enter_ready_state(adapter, 0); in qlcnic_83xx_idc_cold_state_handler()
791 static int qlcnic_83xx_idc_init_state(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_init_state() argument
797 if (adapter->ahw->idc.prev_state == QLC_83XX_IDC_DEV_NEED_RESET) { in qlcnic_83xx_idc_init_state()
798 owner = qlcnic_83xx_idc_find_reset_owner_id(adapter); in qlcnic_83xx_idc_init_state()
799 if (adapter->ahw->pci_func == owner) in qlcnic_83xx_idc_init_state()
800 ret = qlcnic_83xx_idc_restart_hw(adapter, 1); in qlcnic_83xx_idc_init_state()
802 ret = qlcnic_83xx_idc_check_timeout(adapter, timeout); in qlcnic_83xx_idc_init_state()
819 static int qlcnic_83xx_idc_ready_state(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_ready_state() argument
821 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_idc_ready_state()
827 if (ahw->idc.state_entry(adapter)) in qlcnic_83xx_idc_ready_state()
830 if (qlcnic_check_temp(adapter)) { in qlcnic_83xx_idc_ready_state()
832 qlcnic_83xx_idc_check_fan_failure(adapter); in qlcnic_83xx_idc_ready_state()
833 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_ready_state()
835 adapter->ahw->temp); in qlcnic_83xx_idc_ready_state()
837 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_idc_ready_state()
838 qlcnic_83xx_idc_detach_driver(adapter); in qlcnic_83xx_idc_ready_state()
839 qlcnic_83xx_idc_enter_failed_state(adapter, 1); in qlcnic_83xx_idc_ready_state()
844 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); in qlcnic_83xx_idc_ready_state()
845 ret = qlcnic_83xx_check_heartbeat(adapter); in qlcnic_83xx_idc_ready_state()
847 adapter->flags |= QLCNIC_FW_HANG; in qlcnic_83xx_idc_ready_state()
850 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_idc_ready_state()
851 qlcnic_83xx_idc_enter_need_reset_state(adapter, 1); in qlcnic_83xx_idc_ready_state()
853 netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n", in qlcnic_83xx_idc_ready_state()
855 qlcnic_83xx_idc_enter_failed_state(adapter, 1); in qlcnic_83xx_idc_ready_state()
864 qlcnic_83xx_idc_enter_need_reset_state(adapter, 1); in qlcnic_83xx_idc_ready_state()
871 adapter->ahw->reset_context = 0; in qlcnic_83xx_idc_ready_state()
872 qlcnic_83xx_idc_tx_soft_reset(adapter); in qlcnic_83xx_idc_ready_state()
877 if (adapter->ahw->idc.quiesce_req) { in qlcnic_83xx_idc_ready_state()
878 qlcnic_83xx_idc_enter_need_quiesce(adapter, 1); in qlcnic_83xx_idc_ready_state()
879 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1); in qlcnic_83xx_idc_ready_state()
898 static int qlcnic_83xx_idc_need_reset_state(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_need_reset_state() argument
900 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox; in qlcnic_83xx_idc_need_reset_state()
903 if (adapter->ahw->idc.prev_state != QLC_83XX_IDC_DEV_NEED_RESET) { in qlcnic_83xx_idc_need_reset_state()
904 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1); in qlcnic_83xx_idc_need_reset_state()
905 set_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_idc_need_reset_state()
907 if (adapter->ahw->nic_mode == QLCNIC_VNIC_MODE) in qlcnic_83xx_idc_need_reset_state()
908 qlcnic_83xx_disable_vnic_mode(adapter, 1); in qlcnic_83xx_idc_need_reset_state()
910 if (qlcnic_check_diag_status(adapter)) { in qlcnic_83xx_idc_need_reset_state()
911 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_need_reset_state()
913 adapter->ahw->idc.delay_reset = 1; in qlcnic_83xx_idc_need_reset_state()
916 qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1); in qlcnic_83xx_idc_need_reset_state()
917 qlcnic_83xx_idc_detach_driver(adapter); in qlcnic_83xx_idc_need_reset_state()
921 if (qlcnic_check_diag_status(adapter)) { in qlcnic_83xx_idc_need_reset_state()
922 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_need_reset_state()
926 if (adapter->ahw->idc.delay_reset) { in qlcnic_83xx_idc_need_reset_state()
927 qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1); in qlcnic_83xx_idc_need_reset_state()
928 qlcnic_83xx_idc_detach_driver(adapter); in qlcnic_83xx_idc_need_reset_state()
929 adapter->ahw->idc.delay_reset = 0; in qlcnic_83xx_idc_need_reset_state()
933 ret = qlcnic_83xx_idc_check_reset_ack_reg(adapter); in qlcnic_83xx_idc_need_reset_state()
935 dev_info(&adapter->pdev->dev, in qlcnic_83xx_idc_need_reset_state()
942 qlcnic_83xx_idc_enter_init_state(adapter, 1); in qlcnic_83xx_idc_need_reset_state()
947 static int qlcnic_83xx_idc_need_quiesce_state(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_need_quiesce_state() argument
949 dev_err(&adapter->pdev->dev, "%s: TBD\n", __func__); in qlcnic_83xx_idc_need_quiesce_state()
953 static void qlcnic_83xx_idc_failed_state(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_failed_state() argument
955 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_idc_failed_state()
958 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); in qlcnic_83xx_idc_failed_state()
960 owner = qlcnic_83xx_idc_find_reset_owner_id(adapter); in qlcnic_83xx_idc_failed_state()
962 qlcnic_83xx_stop_hw(adapter); in qlcnic_83xx_idc_failed_state()
963 qlcnic_dump_fw(adapter); in qlcnic_83xx_idc_failed_state()
967 netdev_warn(adapter->netdev, "%s: Reboot will be required to recover the adapter!!\n", in qlcnic_83xx_idc_failed_state()
969 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_idc_failed_state()
975 static int qlcnic_83xx_idc_quiesce_state(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_quiesce_state() argument
977 dev_info(&adapter->pdev->dev, "%s: TBD\n", __func__); in qlcnic_83xx_idc_quiesce_state()
981 static int qlcnic_83xx_idc_check_state_validity(struct qlcnic_adapter *adapter, in qlcnic_83xx_idc_check_state_validity() argument
986 cur = adapter->ahw->idc.curr_state; in qlcnic_83xx_idc_check_state_validity()
987 prev = adapter->ahw->idc.prev_state; in qlcnic_83xx_idc_check_state_validity()
992 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_check_state_validity()
1002 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_check_state_validity()
1013 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_check_state_validity()
1032 static int qlcnic_set_vxlan_port(struct qlcnic_adapter *adapter) in qlcnic_set_vxlan_port() argument
1034 u16 port = adapter->ahw->vxlan_port; in qlcnic_set_vxlan_port()
1040 ret = qlcnic_alloc_mbx_args(&cmd, adapter, in qlcnic_set_vxlan_port()
1050 ret = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_set_vxlan_port()
1052 netdev_err(adapter->netdev, in qlcnic_set_vxlan_port()
1061 static int qlcnic_set_vxlan_parsing(struct qlcnic_adapter *adapter, in qlcnic_set_vxlan_parsing() argument
1064 u16 vxlan_port = adapter->ahw->vxlan_port; in qlcnic_set_vxlan_parsing()
1070 ret = qlcnic_alloc_mbx_args(&cmd, adapter, in qlcnic_set_vxlan_parsing()
1078 ret = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_set_vxlan_parsing()
1080 netdev_err(adapter->netdev, in qlcnic_set_vxlan_parsing()
1084 netdev_info(adapter->netdev, in qlcnic_set_vxlan_parsing()
1094 static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter) in qlcnic_83xx_periodic_tasks() argument
1096 if (adapter->fhash.fnum) in qlcnic_83xx_periodic_tasks()
1097 qlcnic_prune_lb_filters(adapter); in qlcnic_83xx_periodic_tasks()
1100 if (adapter->flags & QLCNIC_ADD_VXLAN_PORT) { in qlcnic_83xx_periodic_tasks()
1101 if (qlcnic_set_vxlan_port(adapter)) in qlcnic_83xx_periodic_tasks()
1104 if (qlcnic_set_vxlan_parsing(adapter, true)) in qlcnic_83xx_periodic_tasks()
1107 adapter->flags &= ~QLCNIC_ADD_VXLAN_PORT; in qlcnic_83xx_periodic_tasks()
1108 } else if (adapter->flags & QLCNIC_DEL_VXLAN_PORT) { in qlcnic_83xx_periodic_tasks()
1109 if (qlcnic_set_vxlan_parsing(adapter, false)) in qlcnic_83xx_periodic_tasks()
1112 adapter->ahw->vxlan_port = 0; in qlcnic_83xx_periodic_tasks()
1113 adapter->flags &= ~QLCNIC_DEL_VXLAN_PORT; in qlcnic_83xx_periodic_tasks()
1131 struct qlcnic_adapter *adapter; in qlcnic_83xx_idc_poll_dev_state() local
1134 adapter = container_of(work, struct qlcnic_adapter, fw_work.work); in qlcnic_83xx_idc_poll_dev_state()
1135 state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE); in qlcnic_83xx_idc_poll_dev_state()
1137 if (qlcnic_83xx_idc_check_state_validity(adapter, state)) { in qlcnic_83xx_idc_poll_dev_state()
1138 qlcnic_83xx_idc_log_state_history(adapter); in qlcnic_83xx_idc_poll_dev_state()
1139 adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN; in qlcnic_83xx_idc_poll_dev_state()
1141 adapter->ahw->idc.curr_state = state; in qlcnic_83xx_idc_poll_dev_state()
1144 switch (adapter->ahw->idc.curr_state) { in qlcnic_83xx_idc_poll_dev_state()
1146 qlcnic_83xx_idc_ready_state(adapter); in qlcnic_83xx_idc_poll_dev_state()
1149 qlcnic_83xx_idc_need_reset_state(adapter); in qlcnic_83xx_idc_poll_dev_state()
1152 qlcnic_83xx_idc_need_quiesce_state(adapter); in qlcnic_83xx_idc_poll_dev_state()
1155 qlcnic_83xx_idc_failed_state(adapter); in qlcnic_83xx_idc_poll_dev_state()
1158 qlcnic_83xx_idc_init_state(adapter); in qlcnic_83xx_idc_poll_dev_state()
1161 qlcnic_83xx_idc_quiesce_state(adapter); in qlcnic_83xx_idc_poll_dev_state()
1164 qlcnic_83xx_idc_unknown_state(adapter); in qlcnic_83xx_idc_poll_dev_state()
1167 adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state; in qlcnic_83xx_idc_poll_dev_state()
1168 qlcnic_83xx_periodic_tasks(adapter); in qlcnic_83xx_idc_poll_dev_state()
1171 if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status)) in qlcnic_83xx_idc_poll_dev_state()
1172 qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, in qlcnic_83xx_idc_poll_dev_state()
1173 adapter->ahw->idc.delay); in qlcnic_83xx_idc_poll_dev_state()
1176 static void qlcnic_83xx_setup_idc_parameters(struct qlcnic_adapter *adapter) in qlcnic_83xx_setup_idc_parameters() argument
1180 if (qlcnic_83xx_flash_read32(adapter, QLC_83XX_IDC_FLASH_PARAM_ADDR, in qlcnic_83xx_setup_idc_parameters()
1182 dev_info(&adapter->pdev->dev, in qlcnic_83xx_setup_idc_parameters()
1184 adapter->dev_init_timeo = QLC_83XX_IDC_INIT_TIMEOUT_SECS; in qlcnic_83xx_setup_idc_parameters()
1185 adapter->reset_ack_timeo = QLC_83XX_IDC_RESET_TIMEOUT_SECS; in qlcnic_83xx_setup_idc_parameters()
1187 adapter->dev_init_timeo = idc_params & 0xFFFF; in qlcnic_83xx_setup_idc_parameters()
1188 adapter->reset_ack_timeo = ((idc_params >> 16) & 0xFFFF); in qlcnic_83xx_setup_idc_parameters()
1191 adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN; in qlcnic_83xx_setup_idc_parameters()
1192 adapter->ahw->idc.prev_state = QLC_83XX_IDC_DEV_UNKNOWN; in qlcnic_83xx_setup_idc_parameters()
1193 adapter->ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY; in qlcnic_83xx_setup_idc_parameters()
1194 adapter->ahw->idc.err_code = 0; in qlcnic_83xx_setup_idc_parameters()
1195 adapter->ahw->idc.collect_dump = 0; in qlcnic_83xx_setup_idc_parameters()
1196 adapter->ahw->idc.name = (char **)qlc_83xx_idc_states; in qlcnic_83xx_setup_idc_parameters()
1198 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_setup_idc_parameters()
1199 set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status); in qlcnic_83xx_setup_idc_parameters()
1204 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); in qlcnic_83xx_setup_idc_parameters()
1206 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val); in qlcnic_83xx_setup_idc_parameters()
1211 qlcnic_83xx_idc_first_to_load_function_handler(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_first_to_load_function_handler() argument
1215 if (qlcnic_83xx_lock_driver(adapter)) in qlcnic_83xx_idc_first_to_load_function_handler()
1219 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, 0); in qlcnic_83xx_idc_first_to_load_function_handler()
1220 if (qlcnic_83xx_idc_update_major_version(adapter, 0)) { in qlcnic_83xx_idc_first_to_load_function_handler()
1221 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_first_to_load_function_handler()
1225 state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE); in qlcnic_83xx_idc_first_to_load_function_handler()
1226 if (qlcnic_83xx_idc_check_state_validity(adapter, state)) { in qlcnic_83xx_idc_first_to_load_function_handler()
1227 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_first_to_load_function_handler()
1232 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, in qlcnic_83xx_idc_first_to_load_function_handler()
1237 adapter->ahw->idc.curr_state = state; in qlcnic_83xx_idc_first_to_load_function_handler()
1240 qlcnic_83xx_idc_cold_state_handler(adapter); in qlcnic_83xx_idc_first_to_load_function_handler()
1244 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); in qlcnic_83xx_idc_first_to_load_function_handler()
1246 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val); in qlcnic_83xx_idc_first_to_load_function_handler()
1249 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_first_to_load_function_handler()
1254 int qlcnic_83xx_idc_init(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_init() argument
1258 qlcnic_83xx_setup_idc_parameters(adapter); in qlcnic_83xx_idc_init()
1260 if (qlcnic_83xx_get_reset_instruction_template(adapter)) in qlcnic_83xx_idc_init()
1263 if (!qlcnic_83xx_idc_check_driver_presence_reg(adapter)) { in qlcnic_83xx_idc_init()
1264 if (qlcnic_83xx_idc_first_to_load_function_handler(adapter)) in qlcnic_83xx_idc_init()
1267 if (qlcnic_83xx_idc_check_major_version(adapter)) in qlcnic_83xx_idc_init()
1271 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1); in qlcnic_83xx_idc_init()
1276 void qlcnic_83xx_idc_exit(struct qlcnic_adapter *adapter) in qlcnic_83xx_idc_exit() argument
1281 while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) in qlcnic_83xx_idc_exit()
1284 id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); in qlcnic_83xx_idc_exit()
1287 if (id == adapter->portnum) { in qlcnic_83xx_idc_exit()
1288 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_exit()
1291 id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID); in qlcnic_83xx_idc_exit()
1296 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE); in qlcnic_83xx_idc_exit()
1297 val = val & ~(1 << adapter->portnum); in qlcnic_83xx_idc_exit()
1298 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val); in qlcnic_83xx_idc_exit()
1299 clear_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status); in qlcnic_83xx_idc_exit()
1300 clear_bit(__QLCNIC_RESETTING, &adapter->state); in qlcnic_83xx_idc_exit()
1302 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_83xx_idc_exit()
1305 void qlcnic_83xx_idc_request_reset(struct qlcnic_adapter *adapter, u32 key) in qlcnic_83xx_idc_request_reset() argument
1309 if (qlcnic_sriov_vf_check(adapter)) in qlcnic_83xx_idc_request_reset()
1312 if (qlcnic_83xx_lock_driver(adapter)) { in qlcnic_83xx_idc_request_reset()
1313 dev_err(&adapter->pdev->dev, in qlcnic_83xx_idc_request_reset()
1318 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); in qlcnic_83xx_idc_request_reset()
1320 netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n", in qlcnic_83xx_idc_request_reset()
1322 qlcnic_83xx_idc_enter_failed_state(adapter, 0); in qlcnic_83xx_idc_request_reset()
1323 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_request_reset()
1328 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); in qlcnic_83xx_idc_request_reset()
1330 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val); in qlcnic_83xx_idc_request_reset()
1332 adapter->ahw->idc.collect_dump = 1; in qlcnic_83xx_idc_request_reset()
1335 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_idc_request_reset()
1339 static int qlcnic_83xx_copy_bootloader(struct qlcnic_adapter *adapter) in qlcnic_83xx_copy_bootloader() argument
1347 dest = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_ADDR); in qlcnic_83xx_copy_bootloader()
1348 size = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_SIZE); in qlcnic_83xx_copy_bootloader()
1358 ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache, in qlcnic_83xx_copy_bootloader()
1365 ret = qlcnic_ms_mem_write128(adapter, dest, (u32 *)p_cache, in qlcnic_83xx_copy_bootloader()
1376 static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter) in qlcnic_83xx_copy_fw_file() argument
1378 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info; in qlcnic_83xx_copy_fw_file()
1402 dest = QLCRDX(adapter->ahw, QLCNIC_FW_IMAGE_ADDR); in qlcnic_83xx_copy_fw_file()
1407 ret = qlcnic_ms_mem_write128(adapter, addr, in qlcnic_83xx_copy_fw_file()
1410 dev_err(&adapter->pdev->dev, "MS memory write failed\n"); in qlcnic_83xx_copy_fw_file()
1421 ret = qlcnic_ms_mem_write128(adapter, addr, in qlcnic_83xx_copy_fw_file()
1424 dev_err(&adapter->pdev->dev, in qlcnic_83xx_copy_fw_file()
1438 static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) in qlcnic_83xx_dump_pause_control_regs() argument
1444 val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err); in qlcnic_83xx_dump_pause_control_regs()
1447 dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val); in qlcnic_83xx_dump_pause_control_regs()
1451 dev_info(&adapter->pdev->dev, in qlcnic_83xx_dump_pause_control_regs()
1455 dev_info(&adapter->pdev->dev, in qlcnic_83xx_dump_pause_control_regs()
1460 val = QLCRD32(adapter, reg + (i * 0x4), &err); in qlcnic_83xx_dump_pause_control_regs()
1463 dev_info(&adapter->pdev->dev, "0x%x ", val); in qlcnic_83xx_dump_pause_control_regs()
1465 dev_info(&adapter->pdev->dev, "\n"); in qlcnic_83xx_dump_pause_control_regs()
1470 dev_info(&adapter->pdev->dev, in qlcnic_83xx_dump_pause_control_regs()
1474 dev_info(&adapter->pdev->dev, in qlcnic_83xx_dump_pause_control_regs()
1479 val = QLCRD32(adapter, reg + (i * 0x4), &err); in qlcnic_83xx_dump_pause_control_regs()
1482 dev_info(&adapter->pdev->dev, "0x%x ", val); in qlcnic_83xx_dump_pause_control_regs()
1484 dev_info(&adapter->pdev->dev, "\n"); in qlcnic_83xx_dump_pause_control_regs()
1489 dev_info(&adapter->pdev->dev, in qlcnic_83xx_dump_pause_control_regs()
1493 dev_info(&adapter->pdev->dev, in qlcnic_83xx_dump_pause_control_regs()
1498 val = QLCRD32(adapter, reg, &err); in qlcnic_83xx_dump_pause_control_regs()
1502 QLCWR32(adapter, reg, (val | (i << 29))); in qlcnic_83xx_dump_pause_control_regs()
1503 val = QLCRD32(adapter, reg, &err); in qlcnic_83xx_dump_pause_control_regs()
1506 dev_info(&adapter->pdev->dev, "0x%x ", val); in qlcnic_83xx_dump_pause_control_regs()
1508 dev_info(&adapter->pdev->dev, "\n"); in qlcnic_83xx_dump_pause_control_regs()
1511 val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err); in qlcnic_83xx_dump_pause_control_regs()
1514 val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err); in qlcnic_83xx_dump_pause_control_regs()
1517 dev_info(&adapter->pdev->dev, in qlcnic_83xx_dump_pause_control_regs()
1523 static void qlcnic_83xx_disable_pause_frames(struct qlcnic_adapter *adapter) in qlcnic_83xx_disable_pause_frames() argument
1527 if (qlcnic_83xx_lock_driver(adapter)) { in qlcnic_83xx_disable_pause_frames()
1528 dev_err(&adapter->pdev->dev, in qlcnic_83xx_disable_pause_frames()
1533 qlcnic_83xx_dump_pause_control_regs(adapter); in qlcnic_83xx_disable_pause_frames()
1534 QLCWR32(adapter, QLC_83XX_SRE_SHIM_REG, 0x0); in qlcnic_83xx_disable_pause_frames()
1543 QLCWR32(adapter, reg + (i * 0x4), 0x0); in qlcnic_83xx_disable_pause_frames()
1553 QLCWR32(adapter, reg + (i * 0x4), 0x03FF03FF); in qlcnic_83xx_disable_pause_frames()
1556 QLCWR32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, 0); in qlcnic_83xx_disable_pause_frames()
1557 QLCWR32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, 0); in qlcnic_83xx_disable_pause_frames()
1558 dev_info(&adapter->pdev->dev, in qlcnic_83xx_disable_pause_frames()
1560 qlcnic_83xx_unlock_driver(adapter); in qlcnic_83xx_disable_pause_frames()
1563 static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter) in qlcnic_83xx_take_eport_out_of_reset() argument
1565 QLCWR32(adapter, QLC_83XX_RESET_REG, 0); in qlcnic_83xx_take_eport_out_of_reset()
1566 QLCWR32(adapter, QLC_83XX_RESET_PORT0, 0); in qlcnic_83xx_take_eport_out_of_reset()
1567 QLCWR32(adapter, QLC_83XX_RESET_PORT1, 0); in qlcnic_83xx_take_eport_out_of_reset()
1568 QLCWR32(adapter, QLC_83XX_RESET_PORT2, 0); in qlcnic_83xx_take_eport_out_of_reset()
1569 QLCWR32(adapter, QLC_83XX_RESET_PORT3, 0); in qlcnic_83xx_take_eport_out_of_reset()
1570 QLCWR32(adapter, QLC_83XX_RESET_SRESHIM, 0); in qlcnic_83xx_take_eport_out_of_reset()
1571 QLCWR32(adapter, QLC_83XX_RESET_EPGSHIM, 0); in qlcnic_83xx_take_eport_out_of_reset()
1572 QLCWR32(adapter, QLC_83XX_RESET_ETHERPCS, 0); in qlcnic_83xx_take_eport_out_of_reset()
1573 QLCWR32(adapter, QLC_83XX_RESET_CONTROL, 1); in qlcnic_83xx_take_eport_out_of_reset()
2096 static int qlcnic_83xx_run_post(struct qlcnic_adapter *adapter) in qlcnic_83xx_run_post() argument
2098 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info; in qlcnic_83xx_run_post()
2099 struct device *dev = &adapter->pdev->dev; in qlcnic_83xx_run_post()
2104 switch (adapter->ahw->post_mode) { in qlcnic_83xx_run_post()
2127 ret = qlcnic_83xx_copy_fw_file(adapter); in qlcnic_83xx_run_post()
2132 qlcnic_ind_wr(adapter, QLC_83XX_POST_SIGNATURE_REG, 0); in qlcnic_83xx_run_post()
2135 qlcnic_ind_wr(adapter, QLC_83XX_POST_MODE_REG, in qlcnic_83xx_run_post()
2136 adapter->ahw->post_mode); in qlcnic_83xx_run_post()
2138 QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID, in qlcnic_83xx_run_post()
2141 qlcnic_83xx_start_hw(adapter); in qlcnic_83xx_run_post()
2148 signature = qlcnic_ind_rd(adapter, QLC_83XX_POST_SIGNATURE_REG); in qlcnic_83xx_run_post()
2192 static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter) in qlcnic_83xx_load_fw_image_from_host() argument
2194 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info; in qlcnic_83xx_load_fw_image_from_host()
2198 &(adapter->pdev->dev))) { in qlcnic_83xx_load_fw_image_from_host()
2199 dev_err(&adapter->pdev->dev, in qlcnic_83xx_load_fw_image_from_host()
2201 QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID, in qlcnic_83xx_load_fw_image_from_host()
2204 if (qlcnic_83xx_copy_fw_file(adapter)) in qlcnic_83xx_load_fw_image_from_host()
2206 QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID, in qlcnic_83xx_load_fw_image_from_host()
2213 static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter) in qlcnic_83xx_restart_hw() argument
2218 qlcnic_83xx_stop_hw(adapter); in qlcnic_83xx_restart_hw()
2221 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); in qlcnic_83xx_restart_hw()
2223 qlcnic_dump_fw(adapter); in qlcnic_83xx_restart_hw()
2226 netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n", in qlcnic_83xx_restart_hw()
2228 qlcnic_83xx_idc_enter_failed_state(adapter, 1); in qlcnic_83xx_restart_hw()
2232 qlcnic_83xx_init_hw(adapter); in qlcnic_83xx_restart_hw()
2234 if (qlcnic_83xx_copy_bootloader(adapter)) in qlcnic_83xx_restart_hw()
2238 if (adapter->ahw->run_post) { in qlcnic_83xx_restart_hw()
2239 err = qlcnic_83xx_run_post(adapter); in qlcnic_83xx_restart_hw()
2244 adapter->ahw->run_post = false; in qlcnic_83xx_restart_hw()
2247 qlcnic_83xx_stop_hw(adapter); in qlcnic_83xx_restart_hw()
2248 qlcnic_83xx_init_hw(adapter); in qlcnic_83xx_restart_hw()
2250 err = qlcnic_83xx_copy_bootloader(adapter); in qlcnic_83xx_restart_hw()
2257 if (qlcnic_83xx_load_fw_image_from_host(adapter)) in qlcnic_83xx_restart_hw()
2260 QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID, in qlcnic_83xx_restart_hw()
2264 qlcnic_83xx_start_hw(adapter); in qlcnic_83xx_restart_hw()
2265 if (qlcnic_83xx_check_hw_status(adapter)) in qlcnic_83xx_restart_hw()
2271 static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter) in qlcnic_83xx_get_nic_configuration() argument
2275 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_get_nic_configuration()
2278 err = qlcnic_get_nic_info(adapter, &nic_info, ahw->pci_func); in qlcnic_83xx_get_nic_configuration()
2298 if (test_bit(__QLCNIC_SRIOV_CAPABLE, &adapter->state)) in qlcnic_83xx_get_nic_configuration()
2307 int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter) in qlcnic_83xx_configure_opmode() argument
2309 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_configure_opmode()
2313 ret = qlcnic_83xx_get_nic_configuration(adapter); in qlcnic_83xx_configure_opmode()
2320 if (qlcnic_83xx_config_vnic_opmode(adapter)) in qlcnic_83xx_configure_opmode()
2327 adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver; in qlcnic_83xx_configure_opmode()
2332 dev_err(&adapter->pdev->dev, "%s: Invalid opmode %d\n", in qlcnic_83xx_configure_opmode()
2337 adapter->max_sds_rings = min(ahw->max_rx_ques, max_sds_rings); in qlcnic_83xx_configure_opmode()
2338 adapter->max_tx_rings = min(ahw->max_tx_ques, max_tx_rings); in qlcnic_83xx_configure_opmode()
2343 static void qlcnic_83xx_config_buff_descriptors(struct qlcnic_adapter *adapter) in qlcnic_83xx_config_buff_descriptors() argument
2345 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_config_buff_descriptors()
2348 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G; in qlcnic_83xx_config_buff_descriptors()
2349 adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G; in qlcnic_83xx_config_buff_descriptors()
2350 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_83xx_config_buff_descriptors()
2351 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G; in qlcnic_83xx_config_buff_descriptors()
2354 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G; in qlcnic_83xx_config_buff_descriptors()
2355 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; in qlcnic_83xx_config_buff_descriptors()
2356 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G; in qlcnic_83xx_config_buff_descriptors()
2357 adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G; in qlcnic_83xx_config_buff_descriptors()
2359 adapter->num_txd = MAX_CMD_DESCRIPTORS; in qlcnic_83xx_config_buff_descriptors()
2360 adapter->max_rds_rings = MAX_RDS_RINGS; in qlcnic_83xx_config_buff_descriptors()
2363 static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter) in qlcnic_83xx_init_default_driver() argument
2367 qlcnic_83xx_get_minidump_template(adapter); in qlcnic_83xx_init_default_driver()
2368 if (qlcnic_83xx_get_port_info(adapter)) in qlcnic_83xx_init_default_driver()
2371 qlcnic_83xx_config_buff_descriptors(adapter); in qlcnic_83xx_init_default_driver()
2372 adapter->ahw->msix_supported = !!qlcnic_use_msi_x; in qlcnic_83xx_init_default_driver()
2373 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED; in qlcnic_83xx_init_default_driver()
2375 dev_info(&adapter->pdev->dev, "HAL Version: %d\n", in qlcnic_83xx_init_default_driver()
2376 adapter->ahw->fw_hal_version); in qlcnic_83xx_init_default_driver()
2382 static void qlcnic_83xx_clear_function_resources(struct qlcnic_adapter *adapter) in qlcnic_83xx_clear_function_resources() argument
2388 presence_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE); in qlcnic_83xx_clear_function_resources()
2389 audit_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT); in qlcnic_83xx_clear_function_resources()
2391 if (IS_QLC_83XX_USED(adapter, presence_mask, audit_mask)) { in qlcnic_83xx_clear_function_resources()
2392 status = qlcnic_alloc_mbx_args(&cmd, adapter, in qlcnic_83xx_clear_function_resources()
2398 status = qlcnic_issue_cmd(adapter, &cmd); in qlcnic_83xx_clear_function_resources()
2400 dev_err(&adapter->pdev->dev, in qlcnic_83xx_clear_function_resources()
2406 static int qlcnic_83xx_get_fw_info(struct qlcnic_adapter *adapter) in qlcnic_83xx_get_fw_info() argument
2408 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_get_fw_info()
2409 struct pci_dev *pdev = adapter->pdev; in qlcnic_83xx_get_fw_info()
2439 static void qlcnic_83xx_init_rings(struct qlcnic_adapter *adapter) in qlcnic_83xx_init_rings() argument
2444 adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS; in qlcnic_83xx_init_rings()
2445 adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS; in qlcnic_83xx_init_rings()
2447 if (!adapter->ahw->msix_supported) { in qlcnic_83xx_init_rings()
2453 qlcnic_set_tx_ring_count(adapter, tx_cnt); in qlcnic_83xx_init_rings()
2454 qlcnic_set_sds_ring_count(adapter, rx_cnt); in qlcnic_83xx_init_rings()
2457 int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac) in qlcnic_83xx_init() argument
2459 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_init()
2462 adapter->rx_mac_learn = false; in qlcnic_83xx_init()
2484 qlcnic_83xx_init_rings(adapter); in qlcnic_83xx_init()
2486 err = qlcnic_83xx_init_mailbox_work(adapter); in qlcnic_83xx_init()
2490 if (qlcnic_sriov_vf_check(adapter)) { in qlcnic_83xx_init()
2491 err = qlcnic_sriov_vf_init(adapter, pci_using_dac); in qlcnic_83xx_init()
2498 if (qlcnic_83xx_read_flash_descriptor_table(adapter) || in qlcnic_83xx_init()
2499 qlcnic_83xx_read_flash_mfg_id(adapter)) { in qlcnic_83xx_init()
2500 dev_err(&adapter->pdev->dev, "Failed reading flash mfg id\n"); in qlcnic_83xx_init()
2505 err = qlcnic_83xx_check_hw_status(adapter); in qlcnic_83xx_init()
2509 err = qlcnic_83xx_get_fw_info(adapter); in qlcnic_83xx_init()
2513 err = qlcnic_83xx_idc_init(adapter); in qlcnic_83xx_init()
2517 err = qlcnic_setup_intr(adapter); in qlcnic_83xx_init()
2519 dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n"); in qlcnic_83xx_init()
2523 INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work); in qlcnic_83xx_init()
2525 err = qlcnic_83xx_setup_mbx_intr(adapter); in qlcnic_83xx_init()
2529 qlcnic_83xx_clear_function_resources(adapter); in qlcnic_83xx_init()
2530 qlcnic_dcb_enable(adapter->dcb); in qlcnic_83xx_init()
2531 qlcnic_83xx_initialize_nic(adapter, 1); in qlcnic_83xx_init()
2532 qlcnic_dcb_get_info(adapter->dcb); in qlcnic_83xx_init()
2535 err = qlcnic_83xx_configure_opmode(adapter); in qlcnic_83xx_init()
2541 err = adapter->nic_ops->init_driver(adapter); in qlcnic_83xx_init()
2546 qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work); in qlcnic_83xx_init()
2550 qlcnic_83xx_free_mbx_intr(adapter); in qlcnic_83xx_init()
2553 qlcnic_teardown_intr(adapter); in qlcnic_83xx_init()
2556 qlcnic_83xx_detach_mailbox_work(adapter); in qlcnic_83xx_init()
2563 void qlcnic_83xx_aer_stop_poll_work(struct qlcnic_adapter *adapter) in qlcnic_83xx_aer_stop_poll_work() argument
2565 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_aer_stop_poll_work()
2569 cancel_delayed_work_sync(&adapter->fw_work); in qlcnic_83xx_aer_stop_poll_work()
2572 qlcnic_83xx_disable_vnic_mode(adapter, 1); in qlcnic_83xx_aer_stop_poll_work()
2574 qlcnic_83xx_idc_detach_driver(adapter); in qlcnic_83xx_aer_stop_poll_work()
2575 qlcnic_83xx_initialize_nic(adapter, 0); in qlcnic_83xx_aer_stop_poll_work()
2577 cancel_delayed_work_sync(&adapter->idc_aen_work); in qlcnic_83xx_aer_stop_poll_work()
2580 int qlcnic_83xx_aer_reset(struct qlcnic_adapter *adapter) in qlcnic_83xx_aer_reset() argument
2582 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_aer_reset()
2592 owner = qlcnic_83xx_idc_find_reset_owner_id(adapter); in qlcnic_83xx_aer_reset()
2594 ret = qlcnic_83xx_restart_hw(adapter); in qlcnic_83xx_aer_reset()
2597 qlcnic_83xx_idc_clear_registers(adapter, 0); in qlcnic_83xx_aer_reset()
2600 ret = idc->state_entry(adapter); in qlcnic_83xx_aer_reset()
2604 void qlcnic_83xx_aer_start_poll_work(struct qlcnic_adapter *adapter) in qlcnic_83xx_aer_start_poll_work() argument
2606 struct qlcnic_hardware_context *ahw = adapter->ahw; in qlcnic_83xx_aer_start_poll_work()
2611 owner = qlcnic_83xx_idc_find_reset_owner_id(adapter); in qlcnic_83xx_aer_start_poll_work()
2613 qlcnic_83xx_idc_enter_ready_state(adapter, 0); in qlcnic_83xx_aer_start_poll_work()
2615 qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, 0); in qlcnic_83xx_aer_start_poll_work()