0001
0002
0003
0004
0005
0006
0007 #include "qlcnic_sriov.h"
0008 #include "qlcnic.h"
0009 #include "qlcnic_hw.h"
0010
0011
0012 #define QLC_83XX_RESTART_TEMPLATE_SIZE 0x2000
0013 #define QLC_83XX_RESET_TEMPLATE_ADDR 0x4F0000
0014 #define QLC_83XX_RESET_SEQ_VERSION 0x0101
0015
0016 #define QLC_83XX_OPCODE_NOP 0x0000
0017 #define QLC_83XX_OPCODE_WRITE_LIST 0x0001
0018 #define QLC_83XX_OPCODE_READ_WRITE_LIST 0x0002
0019 #define QLC_83XX_OPCODE_POLL_LIST 0x0004
0020 #define QLC_83XX_OPCODE_POLL_WRITE_LIST 0x0008
0021 #define QLC_83XX_OPCODE_READ_MODIFY_WRITE 0x0010
0022 #define QLC_83XX_OPCODE_SEQ_PAUSE 0x0020
0023 #define QLC_83XX_OPCODE_SEQ_END 0x0040
0024 #define QLC_83XX_OPCODE_TMPL_END 0x0080
0025 #define QLC_83XX_OPCODE_POLL_READ_LIST 0x0100
0026
0027
0028 #define QLC_83XX_RESET_CONTROL 0x28084E50
0029 #define QLC_83XX_RESET_REG 0x28084E60
0030 #define QLC_83XX_RESET_PORT0 0x28084E70
0031 #define QLC_83XX_RESET_PORT1 0x28084E80
0032 #define QLC_83XX_RESET_PORT2 0x28084E90
0033 #define QLC_83XX_RESET_PORT3 0x28084EA0
0034 #define QLC_83XX_RESET_SRESHIM 0x28084EB0
0035 #define QLC_83XX_RESET_EPGSHIM 0x28084EC0
0036 #define QLC_83XX_RESET_ETHERPCS 0x28084ED0
0037
0038 static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter);
0039 static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev);
0040 static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter);
0041 static int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev);
0042 static int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *);
0043 static void qlcnic_83xx_stop_hw(struct qlcnic_adapter *);
0044
0045
0046 struct qlc_83xx_reset_hdr {
0047 #if defined(__LITTLE_ENDIAN)
0048 u16 version;
0049 u16 signature;
0050 u16 size;
0051 u16 entries;
0052 u16 hdr_size;
0053 u16 checksum;
0054 u16 init_offset;
0055 u16 start_offset;
0056 #elif defined(__BIG_ENDIAN)
0057 u16 signature;
0058 u16 version;
0059 u16 entries;
0060 u16 size;
0061 u16 checksum;
0062 u16 hdr_size;
0063 u16 start_offset;
0064 u16 init_offset;
0065 #endif
0066 } __packed;
0067
0068
0069 struct qlc_83xx_entry_hdr {
0070 #if defined(__LITTLE_ENDIAN)
0071 u16 cmd;
0072 u16 size;
0073 u16 count;
0074 u16 delay;
0075 #elif defined(__BIG_ENDIAN)
0076 u16 size;
0077 u16 cmd;
0078 u16 delay;
0079 u16 count;
0080 #endif
0081 } __packed;
0082
0083
0084 struct qlc_83xx_poll {
0085 u32 mask;
0086 u32 status;
0087 } __packed;
0088
0089
0090 struct qlc_83xx_rmw {
0091 u32 mask;
0092 u32 xor_value;
0093 u32 or_value;
0094 #if defined(__LITTLE_ENDIAN)
0095 u8 shl;
0096 u8 shr;
0097 u8 index_a;
0098 u8 rsvd;
0099 #elif defined(__BIG_ENDIAN)
0100 u8 rsvd;
0101 u8 index_a;
0102 u8 shr;
0103 u8 shl;
0104 #endif
0105 } __packed;
0106
0107
0108 struct qlc_83xx_entry {
0109 u32 arg1;
0110 u32 arg2;
0111 } __packed;
0112
0113
0114 struct qlc_83xx_quad_entry {
0115 u32 dr_addr;
0116 u32 dr_value;
0117 u32 ar_addr;
0118 u32 ar_value;
0119 } __packed;
0120 static const char *const qlc_83xx_idc_states[] = {
0121 "Unknown",
0122 "Cold",
0123 "Init",
0124 "Ready",
0125 "Need Reset",
0126 "Need Quiesce",
0127 "Failed",
0128 "Quiesce"
0129 };
0130
0131 static int
0132 qlcnic_83xx_idc_check_driver_presence_reg(struct qlcnic_adapter *adapter)
0133 {
0134 u32 val;
0135
0136 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
0137 if ((val & 0xFFFF))
0138 return 1;
0139 else
0140 return 0;
0141 }
0142
0143 static void qlcnic_83xx_idc_log_state_history(struct qlcnic_adapter *adapter)
0144 {
0145 u32 cur, prev;
0146 cur = adapter->ahw->idc.curr_state;
0147 prev = adapter->ahw->idc.prev_state;
0148
0149 dev_info(&adapter->pdev->dev,
0150 "current state = %s, prev state = %s\n",
0151 adapter->ahw->idc.name[cur],
0152 adapter->ahw->idc.name[prev]);
0153 }
0154
0155 static int qlcnic_83xx_idc_update_audit_reg(struct qlcnic_adapter *adapter,
0156 u8 mode, int lock)
0157 {
0158 u32 val;
0159 int seconds;
0160
0161 if (lock) {
0162 if (qlcnic_83xx_lock_driver(adapter))
0163 return -EBUSY;
0164 }
0165
0166 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
0167 val |= (adapter->portnum & 0xf);
0168 val |= mode << 7;
0169 if (mode)
0170 seconds = jiffies / HZ - adapter->ahw->idc.sec_counter;
0171 else
0172 seconds = jiffies / HZ;
0173
0174 val |= seconds << 8;
0175 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT, val);
0176 adapter->ahw->idc.sec_counter = jiffies / HZ;
0177
0178 if (lock)
0179 qlcnic_83xx_unlock_driver(adapter);
0180
0181 return 0;
0182 }
0183
0184 static void qlcnic_83xx_idc_update_minor_version(struct qlcnic_adapter *adapter)
0185 {
0186 u32 val;
0187
0188 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION);
0189 val = val & ~(0x3 << (adapter->portnum * 2));
0190 val = val | (QLC_83XX_IDC_MINOR_VERSION << (adapter->portnum * 2));
0191 QLCWRX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION, val);
0192 }
0193
0194 static int qlcnic_83xx_idc_update_major_version(struct qlcnic_adapter *adapter,
0195 int lock)
0196 {
0197 u32 val;
0198
0199 if (lock) {
0200 if (qlcnic_83xx_lock_driver(adapter))
0201 return -EBUSY;
0202 }
0203
0204 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION);
0205 val = val & ~0xFF;
0206 val = val | QLC_83XX_IDC_MAJOR_VERSION;
0207 QLCWRX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION, val);
0208
0209 if (lock)
0210 qlcnic_83xx_unlock_driver(adapter);
0211
0212 return 0;
0213 }
0214
0215 static int
0216 qlcnic_83xx_idc_update_drv_presence_reg(struct qlcnic_adapter *adapter,
0217 int status, int lock)
0218 {
0219 u32 val;
0220
0221 if (lock) {
0222 if (qlcnic_83xx_lock_driver(adapter))
0223 return -EBUSY;
0224 }
0225
0226 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
0227
0228 if (status)
0229 val = val | (1 << adapter->portnum);
0230 else
0231 val = val & ~(1 << adapter->portnum);
0232
0233 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
0234 qlcnic_83xx_idc_update_minor_version(adapter);
0235
0236 if (lock)
0237 qlcnic_83xx_unlock_driver(adapter);
0238
0239 return 0;
0240 }
0241
0242 static int qlcnic_83xx_idc_check_major_version(struct qlcnic_adapter *adapter)
0243 {
0244 u32 val;
0245 u8 version;
0246
0247 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION);
0248 version = val & 0xFF;
0249
0250 if (version != QLC_83XX_IDC_MAJOR_VERSION) {
0251 dev_info(&adapter->pdev->dev,
0252 "%s:mismatch. version 0x%x, expected version 0x%x\n",
0253 __func__, version, QLC_83XX_IDC_MAJOR_VERSION);
0254 return -EIO;
0255 }
0256
0257 return 0;
0258 }
0259
0260 static int qlcnic_83xx_idc_clear_registers(struct qlcnic_adapter *adapter,
0261 int lock)
0262 {
0263 u32 val;
0264
0265 if (lock) {
0266 if (qlcnic_83xx_lock_driver(adapter))
0267 return -EBUSY;
0268 }
0269
0270 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, 0);
0271
0272 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
0273 val &= ~QLC_83XX_IDC_GRACEFULL_RESET;
0274 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
0275
0276 if (lock)
0277 qlcnic_83xx_unlock_driver(adapter);
0278
0279 return 0;
0280 }
0281
0282 static int qlcnic_83xx_idc_update_drv_ack_reg(struct qlcnic_adapter *adapter,
0283 int flag, int lock)
0284 {
0285 u32 val;
0286
0287 if (lock) {
0288 if (qlcnic_83xx_lock_driver(adapter))
0289 return -EBUSY;
0290 }
0291
0292 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK);
0293 if (flag)
0294 val = val | (1 << adapter->portnum);
0295 else
0296 val = val & ~(1 << adapter->portnum);
0297 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, val);
0298
0299 if (lock)
0300 qlcnic_83xx_unlock_driver(adapter);
0301
0302 return 0;
0303 }
0304
0305 static int qlcnic_83xx_idc_check_timeout(struct qlcnic_adapter *adapter,
0306 int time_limit)
0307 {
0308 u64 seconds;
0309
0310 seconds = jiffies / HZ - adapter->ahw->idc.sec_counter;
0311 if (seconds <= time_limit)
0312 return 0;
0313 else
0314 return -EBUSY;
0315 }
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326 static int qlcnic_83xx_idc_check_reset_ack_reg(struct qlcnic_adapter *adapter)
0327 {
0328 int timeout;
0329 u32 ack, presence, val;
0330
0331 timeout = QLC_83XX_IDC_RESET_TIMEOUT_SECS;
0332 ack = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK);
0333 presence = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
0334 dev_info(&adapter->pdev->dev,
0335 "%s: ack = 0x%x, presence = 0x%x\n", __func__, ack, presence);
0336 if (!((ack & presence) == presence)) {
0337 if (qlcnic_83xx_idc_check_timeout(adapter, timeout)) {
0338
0339 dev_info(&adapter->pdev->dev,
0340 "%s: ACK wait exceeds time limit\n", __func__);
0341 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
0342 val = val & ~(ack ^ presence);
0343 if (qlcnic_83xx_lock_driver(adapter))
0344 return -EBUSY;
0345 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
0346 dev_info(&adapter->pdev->dev,
0347 "%s: updated drv presence reg = 0x%x\n",
0348 __func__, val);
0349 qlcnic_83xx_unlock_driver(adapter);
0350 return 0;
0351
0352 } else {
0353 return 1;
0354 }
0355 } else {
0356 dev_info(&adapter->pdev->dev,
0357 "%s: Reset ACK received from all functions\n",
0358 __func__);
0359 return 0;
0360 }
0361 }
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373 static int qlcnic_83xx_idc_tx_soft_reset(struct qlcnic_adapter *adapter)
0374 {
0375 struct net_device *netdev = adapter->netdev;
0376
0377 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
0378 return -EBUSY;
0379
0380 netif_device_detach(netdev);
0381 qlcnic_down(adapter, netdev);
0382 qlcnic_up(adapter, netdev);
0383 netif_device_attach(netdev);
0384 clear_bit(__QLCNIC_RESETTING, &adapter->state);
0385 netdev_info(adapter->netdev, "%s: soft reset complete.\n", __func__);
0386
0387 return 0;
0388 }
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398 static void qlcnic_83xx_idc_detach_driver(struct qlcnic_adapter *adapter)
0399 {
0400 int i;
0401 struct net_device *netdev = adapter->netdev;
0402
0403 netif_device_detach(netdev);
0404 qlcnic_83xx_detach_mailbox_work(adapter);
0405
0406
0407 qlcnic_83xx_disable_mbx_intr(adapter);
0408 qlcnic_down(adapter, netdev);
0409 for (i = 0; i < adapter->ahw->num_msix; i++) {
0410 adapter->ahw->intr_tbl[i].id = i;
0411 adapter->ahw->intr_tbl[i].enabled = 0;
0412 adapter->ahw->intr_tbl[i].src = 0;
0413 }
0414
0415 if (qlcnic_sriov_pf_check(adapter))
0416 qlcnic_sriov_pf_reset(adapter);
0417 }
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428 static void qlcnic_83xx_idc_attach_driver(struct qlcnic_adapter *adapter)
0429 {
0430 struct net_device *netdev = adapter->netdev;
0431
0432 if (netif_running(netdev)) {
0433 if (qlcnic_up(adapter, netdev))
0434 goto done;
0435 qlcnic_restore_indev_addr(netdev, NETDEV_UP);
0436 }
0437 done:
0438 netif_device_attach(netdev);
0439 }
0440
0441 static int qlcnic_83xx_idc_enter_failed_state(struct qlcnic_adapter *adapter,
0442 int lock)
0443 {
0444 if (lock) {
0445 if (qlcnic_83xx_lock_driver(adapter))
0446 return -EBUSY;
0447 }
0448
0449 qlcnic_83xx_idc_clear_registers(adapter, 0);
0450 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_FAILED);
0451 if (lock)
0452 qlcnic_83xx_unlock_driver(adapter);
0453
0454 qlcnic_83xx_idc_log_state_history(adapter);
0455 dev_info(&adapter->pdev->dev, "Device will enter failed state\n");
0456
0457 return 0;
0458 }
0459
0460 static int qlcnic_83xx_idc_enter_init_state(struct qlcnic_adapter *adapter,
0461 int lock)
0462 {
0463 if (lock) {
0464 if (qlcnic_83xx_lock_driver(adapter))
0465 return -EBUSY;
0466 }
0467
0468 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_INIT);
0469
0470 if (lock)
0471 qlcnic_83xx_unlock_driver(adapter);
0472
0473 return 0;
0474 }
0475
0476 static int qlcnic_83xx_idc_enter_need_quiesce(struct qlcnic_adapter *adapter,
0477 int lock)
0478 {
0479 if (lock) {
0480 if (qlcnic_83xx_lock_driver(adapter))
0481 return -EBUSY;
0482 }
0483
0484 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
0485 QLC_83XX_IDC_DEV_NEED_QUISCENT);
0486
0487 if (lock)
0488 qlcnic_83xx_unlock_driver(adapter);
0489
0490 return 0;
0491 }
0492
0493 static int
0494 qlcnic_83xx_idc_enter_need_reset_state(struct qlcnic_adapter *adapter, int lock)
0495 {
0496 if (lock) {
0497 if (qlcnic_83xx_lock_driver(adapter))
0498 return -EBUSY;
0499 }
0500
0501 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
0502 QLC_83XX_IDC_DEV_NEED_RESET);
0503
0504 if (lock)
0505 qlcnic_83xx_unlock_driver(adapter);
0506
0507 return 0;
0508 }
0509
0510 static int qlcnic_83xx_idc_enter_ready_state(struct qlcnic_adapter *adapter,
0511 int lock)
0512 {
0513 if (lock) {
0514 if (qlcnic_83xx_lock_driver(adapter))
0515 return -EBUSY;
0516 }
0517
0518 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_READY);
0519 if (lock)
0520 qlcnic_83xx_unlock_driver(adapter);
0521
0522 return 0;
0523 }
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536 static int qlcnic_83xx_idc_find_reset_owner_id(struct qlcnic_adapter *adapter)
0537 {
0538 u32 reg, reg1, reg2, i, j, owner, class;
0539
0540 reg1 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_1);
0541 reg2 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_2);
0542 owner = QLCNIC_TYPE_NIC;
0543 i = 0;
0544 j = 0;
0545 reg = reg1;
0546
0547 do {
0548 class = (((reg & (0xF << j * 4)) >> j * 4) & 0x3);
0549 if (class == owner)
0550 break;
0551 if (i == (QLC_83XX_IDC_MAX_FUNC_PER_PARTITION_INFO - 1)) {
0552 reg = reg2;
0553 j = 0;
0554 } else {
0555 j++;
0556 }
0557
0558 if (i == (QLC_83XX_IDC_MAX_CNA_FUNCTIONS - 1)) {
0559 if (owner == QLCNIC_TYPE_NIC)
0560 owner = QLCNIC_TYPE_ISCSI;
0561 else if (owner == QLCNIC_TYPE_ISCSI)
0562 owner = QLCNIC_TYPE_FCOE;
0563 else if (owner == QLCNIC_TYPE_FCOE)
0564 return -EIO;
0565 reg = reg1;
0566 j = 0;
0567 i = 0;
0568 }
0569 } while (i++ < QLC_83XX_IDC_MAX_CNA_FUNCTIONS);
0570
0571 return i;
0572 }
0573
0574 static int qlcnic_83xx_idc_restart_hw(struct qlcnic_adapter *adapter, int lock)
0575 {
0576 int ret = 0;
0577
0578 ret = qlcnic_83xx_restart_hw(adapter);
0579
0580 if (ret) {
0581 qlcnic_83xx_idc_enter_failed_state(adapter, lock);
0582 } else {
0583 qlcnic_83xx_idc_clear_registers(adapter, lock);
0584 ret = qlcnic_83xx_idc_enter_ready_state(adapter, lock);
0585 }
0586
0587 return ret;
0588 }
0589
0590 static int qlcnic_83xx_idc_check_fan_failure(struct qlcnic_adapter *adapter)
0591 {
0592 u32 status;
0593
0594 status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1);
0595
0596 if (status & QLCNIC_RCODE_FATAL_ERROR) {
0597 dev_err(&adapter->pdev->dev,
0598 "peg halt status1=0x%x\n", status);
0599 if (QLCNIC_FWERROR_CODE(status) == QLCNIC_FWERROR_FAN_FAILURE) {
0600 dev_err(&adapter->pdev->dev,
0601 "On board active cooling fan failed. "
0602 "Device has been halted.\n");
0603 dev_err(&adapter->pdev->dev,
0604 "Replace the adapter.\n");
0605 return -EIO;
0606 }
0607 }
0608
0609 return 0;
0610 }
0611
0612 int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)
0613 {
0614 int err;
0615
0616 qlcnic_83xx_reinit_mbx_work(adapter->ahw->mailbox);
0617 qlcnic_83xx_enable_mbx_interrupt(adapter);
0618
0619 qlcnic_83xx_initialize_nic(adapter, 1);
0620
0621 err = qlcnic_sriov_pf_reinit(adapter);
0622 if (err)
0623 return err;
0624
0625 qlcnic_83xx_enable_mbx_interrupt(adapter);
0626
0627 if (qlcnic_83xx_configure_opmode(adapter)) {
0628 qlcnic_83xx_idc_enter_failed_state(adapter, 1);
0629 return -EIO;
0630 }
0631
0632 if (adapter->nic_ops->init_driver(adapter)) {
0633 qlcnic_83xx_idc_enter_failed_state(adapter, 1);
0634 return -EIO;
0635 }
0636
0637 if (adapter->portnum == 0)
0638 qlcnic_set_drv_version(adapter);
0639
0640 qlcnic_dcb_get_info(adapter->dcb);
0641 qlcnic_83xx_idc_attach_driver(adapter);
0642
0643 return 0;
0644 }
0645
0646 static void qlcnic_83xx_idc_update_idc_params(struct qlcnic_adapter *adapter)
0647 {
0648 struct qlcnic_hardware_context *ahw = adapter->ahw;
0649
0650 qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 1);
0651 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
0652 set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
0653
0654 ahw->idc.quiesce_req = 0;
0655 ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY;
0656 ahw->idc.err_code = 0;
0657 ahw->idc.collect_dump = 0;
0658 ahw->reset_context = 0;
0659 adapter->tx_timeo_cnt = 0;
0660 ahw->idc.delay_reset = 0;
0661
0662 clear_bit(__QLCNIC_RESETTING, &adapter->state);
0663 }
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676 int qlcnic_83xx_idc_ready_state_entry(struct qlcnic_adapter *adapter)
0677 {
0678 struct qlcnic_hardware_context *ahw = adapter->ahw;
0679
0680 if (ahw->idc.prev_state != QLC_83XX_IDC_DEV_READY) {
0681 qlcnic_83xx_idc_update_idc_params(adapter);
0682
0683 if ((ahw->idc.prev_state == QLC_83XX_IDC_DEV_NEED_RESET) ||
0684 (ahw->idc.prev_state == QLC_83XX_IDC_DEV_INIT)) {
0685 if (qlcnic_83xx_idc_reattach_driver(adapter))
0686 return -EIO;
0687 }
0688 }
0689
0690 return 0;
0691 }
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705 int qlcnic_83xx_idc_vnic_pf_entry(struct qlcnic_adapter *adapter)
0706 {
0707 u32 state;
0708 struct qlcnic_hardware_context *ahw = adapter->ahw;
0709
0710
0711 state = QLCRDX(adapter->ahw, QLC_83XX_VNIC_STATE);
0712 if (state != QLCNIC_DEV_NPAR_OPER) {
0713 if (!ahw->idc.vnic_wait_limit--) {
0714 qlcnic_83xx_idc_enter_failed_state(adapter, 1);
0715 return -EIO;
0716 }
0717 dev_info(&adapter->pdev->dev, "vNIC mode disabled\n");
0718 return -EIO;
0719
0720 } else {
0721
0722 if (ahw->idc.vnic_state != QLCNIC_DEV_NPAR_OPER) {
0723 qlcnic_83xx_idc_update_idc_params(adapter);
0724
0725
0726
0727 if (ahw->idc.prev_state != QLC_83XX_IDC_DEV_UNKNOWN) {
0728 if (qlcnic_83xx_idc_reattach_driver(adapter))
0729 return -EIO;
0730 }
0731 adapter->ahw->idc.vnic_state = QLCNIC_DEV_NPAR_OPER;
0732 dev_info(&adapter->pdev->dev, "vNIC mode enabled\n");
0733 }
0734 }
0735
0736 return 0;
0737 }
0738
0739 static int qlcnic_83xx_idc_unknown_state(struct qlcnic_adapter *adapter)
0740 {
0741 adapter->ahw->idc.err_code = -EIO;
0742 dev_err(&adapter->pdev->dev,
0743 "%s: Device in unknown state\n", __func__);
0744 clear_bit(__QLCNIC_RESETTING, &adapter->state);
0745 return 0;
0746 }
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760 static int qlcnic_83xx_idc_cold_state_handler(struct qlcnic_adapter *adapter)
0761 {
0762 qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 0);
0763 qlcnic_83xx_idc_update_audit_reg(adapter, 1, 0);
0764
0765 if (qlcnic_load_fw_file) {
0766 qlcnic_83xx_idc_restart_hw(adapter, 0);
0767 } else {
0768 if (qlcnic_83xx_check_hw_status(adapter)) {
0769 qlcnic_83xx_idc_enter_failed_state(adapter, 0);
0770 return -EIO;
0771 } else {
0772 qlcnic_83xx_idc_enter_ready_state(adapter, 0);
0773 }
0774 }
0775 return 0;
0776 }
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790 static int qlcnic_83xx_idc_init_state(struct qlcnic_adapter *adapter)
0791 {
0792 int timeout, ret = 0;
0793 u32 owner;
0794
0795 timeout = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
0796 if (adapter->ahw->idc.prev_state == QLC_83XX_IDC_DEV_NEED_RESET) {
0797 owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
0798 if (adapter->ahw->pci_func == owner)
0799 ret = qlcnic_83xx_idc_restart_hw(adapter, 1);
0800 } else {
0801 ret = qlcnic_83xx_idc_check_timeout(adapter, timeout);
0802 }
0803
0804 return ret;
0805 }
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818 static int qlcnic_83xx_idc_ready_state(struct qlcnic_adapter *adapter)
0819 {
0820 struct qlcnic_hardware_context *ahw = adapter->ahw;
0821 struct qlcnic_mailbox *mbx = ahw->mailbox;
0822 int ret = 0;
0823 u32 val;
0824
0825
0826 if (ahw->idc.state_entry(adapter))
0827 return -EIO;
0828
0829 if (qlcnic_check_temp(adapter)) {
0830 if (ahw->temp == QLCNIC_TEMP_PANIC) {
0831 qlcnic_83xx_idc_check_fan_failure(adapter);
0832 dev_err(&adapter->pdev->dev,
0833 "Error: device temperature %d above limits\n",
0834 adapter->ahw->temp);
0835 clear_bit(QLC_83XX_MBX_READY, &mbx->status);
0836 set_bit(__QLCNIC_RESETTING, &adapter->state);
0837 qlcnic_83xx_idc_detach_driver(adapter);
0838 qlcnic_83xx_idc_enter_failed_state(adapter, 1);
0839 return -EIO;
0840 }
0841 }
0842
0843 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
0844 ret = qlcnic_83xx_check_heartbeat(adapter);
0845 if (ret) {
0846 adapter->flags |= QLCNIC_FW_HANG;
0847 if (!(val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY)) {
0848 clear_bit(QLC_83XX_MBX_READY, &mbx->status);
0849 set_bit(__QLCNIC_RESETTING, &adapter->state);
0850 qlcnic_83xx_idc_enter_need_reset_state(adapter, 1);
0851 } else {
0852 netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
0853 __func__);
0854 qlcnic_83xx_idc_enter_failed_state(adapter, 1);
0855 }
0856 return -EIO;
0857 }
0858
0859 if ((val & QLC_83XX_IDC_GRACEFULL_RESET) || ahw->idc.collect_dump) {
0860 clear_bit(QLC_83XX_MBX_READY, &mbx->status);
0861
0862
0863 qlcnic_83xx_idc_enter_need_reset_state(adapter, 1);
0864 return ret;
0865 }
0866
0867
0868 if (ahw->reset_context &&
0869 !(val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY)) {
0870 adapter->ahw->reset_context = 0;
0871 qlcnic_83xx_idc_tx_soft_reset(adapter);
0872 return ret;
0873 }
0874
0875
0876 if (adapter->ahw->idc.quiesce_req) {
0877 qlcnic_83xx_idc_enter_need_quiesce(adapter, 1);
0878 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
0879 return ret;
0880 }
0881
0882 return ret;
0883 }
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897 static int qlcnic_83xx_idc_need_reset_state(struct qlcnic_adapter *adapter)
0898 {
0899 struct qlcnic_mailbox *mbx = adapter->ahw->mailbox;
0900 int ret = 0;
0901
0902 if (adapter->ahw->idc.prev_state != QLC_83XX_IDC_DEV_NEED_RESET) {
0903 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
0904 set_bit(__QLCNIC_RESETTING, &adapter->state);
0905 clear_bit(QLC_83XX_MBX_READY, &mbx->status);
0906 if (adapter->ahw->nic_mode == QLCNIC_VNIC_MODE)
0907 qlcnic_83xx_disable_vnic_mode(adapter, 1);
0908
0909 if (qlcnic_check_diag_status(adapter)) {
0910 dev_info(&adapter->pdev->dev,
0911 "%s: Wait for diag completion\n", __func__);
0912 adapter->ahw->idc.delay_reset = 1;
0913 return 0;
0914 } else {
0915 qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
0916 qlcnic_83xx_idc_detach_driver(adapter);
0917 }
0918 }
0919
0920 if (qlcnic_check_diag_status(adapter)) {
0921 dev_info(&adapter->pdev->dev,
0922 "%s: Wait for diag completion\n", __func__);
0923 return -1;
0924 } else {
0925 if (adapter->ahw->idc.delay_reset) {
0926 qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
0927 qlcnic_83xx_idc_detach_driver(adapter);
0928 adapter->ahw->idc.delay_reset = 0;
0929 }
0930
0931
0932 ret = qlcnic_83xx_idc_check_reset_ack_reg(adapter);
0933 if (ret) {
0934 dev_info(&adapter->pdev->dev,
0935 "%s: Waiting for reset ACK\n", __func__);
0936 return -1;
0937 }
0938 }
0939
0940
0941 qlcnic_83xx_idc_enter_init_state(adapter, 1);
0942
0943 return ret;
0944 }
0945
0946 static int qlcnic_83xx_idc_need_quiesce_state(struct qlcnic_adapter *adapter)
0947 {
0948 dev_err(&adapter->pdev->dev, "%s: TBD\n", __func__);
0949 return 0;
0950 }
0951
0952 static void qlcnic_83xx_idc_failed_state(struct qlcnic_adapter *adapter)
0953 {
0954 struct qlcnic_hardware_context *ahw = adapter->ahw;
0955 u32 val, owner;
0956
0957 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
0958 if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
0959 owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
0960 if (ahw->pci_func == owner) {
0961 qlcnic_83xx_stop_hw(adapter);
0962 qlcnic_dump_fw(adapter);
0963 }
0964 }
0965
0966 netdev_warn(adapter->netdev, "%s: Reboot will be required to recover the adapter!!\n",
0967 __func__);
0968 clear_bit(__QLCNIC_RESETTING, &adapter->state);
0969 ahw->idc.err_code = -EIO;
0970
0971 return;
0972 }
0973
0974 static int qlcnic_83xx_idc_quiesce_state(struct qlcnic_adapter *adapter)
0975 {
0976 dev_info(&adapter->pdev->dev, "%s: TBD\n", __func__);
0977 return 0;
0978 }
0979
0980 static int qlcnic_83xx_idc_check_state_validity(struct qlcnic_adapter *adapter,
0981 u32 state)
0982 {
0983 u32 cur, prev, next;
0984
0985 cur = adapter->ahw->idc.curr_state;
0986 prev = adapter->ahw->idc.prev_state;
0987 next = state;
0988
0989 if ((next < QLC_83XX_IDC_DEV_COLD) ||
0990 (next > QLC_83XX_IDC_DEV_QUISCENT)) {
0991 dev_err(&adapter->pdev->dev,
0992 "%s: curr %d, prev %d, next state %d is invalid\n",
0993 __func__, cur, prev, state);
0994 return 1;
0995 }
0996
0997 if ((cur == QLC_83XX_IDC_DEV_UNKNOWN) &&
0998 (prev == QLC_83XX_IDC_DEV_UNKNOWN)) {
0999 if ((next != QLC_83XX_IDC_DEV_COLD) &&
1000 (next != QLC_83XX_IDC_DEV_READY)) {
1001 dev_err(&adapter->pdev->dev,
1002 "%s: failed, cur %d prev %d next %d\n",
1003 __func__, cur, prev, next);
1004 return 1;
1005 }
1006 }
1007
1008 if (next == QLC_83XX_IDC_DEV_INIT) {
1009 if ((prev != QLC_83XX_IDC_DEV_INIT) &&
1010 (prev != QLC_83XX_IDC_DEV_COLD) &&
1011 (prev != QLC_83XX_IDC_DEV_NEED_RESET)) {
1012 dev_err(&adapter->pdev->dev,
1013 "%s: failed, cur %d prev %d next %d\n",
1014 __func__, cur, prev, next);
1015 return 1;
1016 }
1017 }
1018
1019 return 0;
1020 }
1021
1022 #define QLC_83XX_ENCAP_TYPE_VXLAN BIT_1
1023 #define QLC_83XX_MATCH_ENCAP_ID BIT_2
1024 #define QLC_83XX_SET_VXLAN_UDP_DPORT BIT_3
1025 #define QLC_83XX_VXLAN_UDP_DPORT(PORT) ((PORT & 0xffff) << 16)
1026
1027 #define QLCNIC_ENABLE_INGRESS_ENCAP_PARSING 1
1028 #define QLCNIC_DISABLE_INGRESS_ENCAP_PARSING 0
1029
1030 int qlcnic_set_vxlan_port(struct qlcnic_adapter *adapter, u16 port)
1031 {
1032 struct qlcnic_cmd_args cmd;
1033 int ret = 0;
1034
1035 memset(&cmd, 0, sizeof(cmd));
1036
1037 ret = qlcnic_alloc_mbx_args(&cmd, adapter,
1038 QLCNIC_CMD_INIT_NIC_FUNC);
1039 if (ret)
1040 return ret;
1041
1042 cmd.req.arg[1] = QLC_83XX_MULTI_TENANCY_INFO;
1043 cmd.req.arg[2] = QLC_83XX_ENCAP_TYPE_VXLAN |
1044 QLC_83XX_SET_VXLAN_UDP_DPORT |
1045 QLC_83XX_VXLAN_UDP_DPORT(port);
1046
1047 ret = qlcnic_issue_cmd(adapter, &cmd);
1048 if (ret)
1049 netdev_err(adapter->netdev,
1050 "Failed to set VXLAN port %d in adapter\n",
1051 port);
1052
1053 qlcnic_free_mbx_args(&cmd);
1054
1055 return ret;
1056 }
1057
1058 int qlcnic_set_vxlan_parsing(struct qlcnic_adapter *adapter, u16 port)
1059 {
1060 struct qlcnic_cmd_args cmd;
1061 int ret = 0;
1062
1063 memset(&cmd, 0, sizeof(cmd));
1064
1065 ret = qlcnic_alloc_mbx_args(&cmd, adapter,
1066 QLCNIC_CMD_SET_INGRESS_ENCAP);
1067 if (ret)
1068 return ret;
1069
1070 cmd.req.arg[1] = port ? QLCNIC_ENABLE_INGRESS_ENCAP_PARSING :
1071 QLCNIC_DISABLE_INGRESS_ENCAP_PARSING;
1072
1073 ret = qlcnic_issue_cmd(adapter, &cmd);
1074 if (ret)
1075 netdev_err(adapter->netdev,
1076 "Failed to %s VXLAN parsing for port %d\n",
1077 port ? "enable" : "disable", port);
1078 else
1079 netdev_info(adapter->netdev,
1080 "%s VXLAN parsing for port %d\n",
1081 port ? "Enabled" : "Disabled", port);
1082
1083 qlcnic_free_mbx_args(&cmd);
1084
1085 return ret;
1086 }
1087
1088 static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter)
1089 {
1090 if (adapter->fhash.fnum)
1091 qlcnic_prune_lb_filters(adapter);
1092 }
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105 void qlcnic_83xx_idc_poll_dev_state(struct work_struct *work)
1106 {
1107 struct qlcnic_adapter *adapter;
1108 u32 state;
1109
1110 adapter = container_of(work, struct qlcnic_adapter, fw_work.work);
1111 state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
1112
1113 if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
1114 qlcnic_83xx_idc_log_state_history(adapter);
1115 adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
1116 } else {
1117 adapter->ahw->idc.curr_state = state;
1118 }
1119
1120 switch (adapter->ahw->idc.curr_state) {
1121 case QLC_83XX_IDC_DEV_READY:
1122 qlcnic_83xx_idc_ready_state(adapter);
1123 break;
1124 case QLC_83XX_IDC_DEV_NEED_RESET:
1125 qlcnic_83xx_idc_need_reset_state(adapter);
1126 break;
1127 case QLC_83XX_IDC_DEV_NEED_QUISCENT:
1128 qlcnic_83xx_idc_need_quiesce_state(adapter);
1129 break;
1130 case QLC_83XX_IDC_DEV_FAILED:
1131 qlcnic_83xx_idc_failed_state(adapter);
1132 return;
1133 case QLC_83XX_IDC_DEV_INIT:
1134 qlcnic_83xx_idc_init_state(adapter);
1135 break;
1136 case QLC_83XX_IDC_DEV_QUISCENT:
1137 qlcnic_83xx_idc_quiesce_state(adapter);
1138 break;
1139 default:
1140 qlcnic_83xx_idc_unknown_state(adapter);
1141 return;
1142 }
1143 adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state;
1144 qlcnic_83xx_periodic_tasks(adapter);
1145
1146
1147 if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status))
1148 qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state,
1149 adapter->ahw->idc.delay);
1150 }
1151
1152 static void qlcnic_83xx_setup_idc_parameters(struct qlcnic_adapter *adapter)
1153 {
1154 u32 idc_params, val;
1155
1156 if (qlcnic_83xx_flash_read32(adapter, QLC_83XX_IDC_FLASH_PARAM_ADDR,
1157 (u8 *)&idc_params, 1)) {
1158 dev_info(&adapter->pdev->dev,
1159 "%s:failed to get IDC params from flash\n", __func__);
1160 adapter->dev_init_timeo = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
1161 adapter->reset_ack_timeo = QLC_83XX_IDC_RESET_TIMEOUT_SECS;
1162 } else {
1163 adapter->dev_init_timeo = idc_params & 0xFFFF;
1164 adapter->reset_ack_timeo = ((idc_params >> 16) & 0xFFFF);
1165 }
1166
1167 adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
1168 adapter->ahw->idc.prev_state = QLC_83XX_IDC_DEV_UNKNOWN;
1169 adapter->ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY;
1170 adapter->ahw->idc.err_code = 0;
1171 adapter->ahw->idc.collect_dump = 0;
1172 adapter->ahw->idc.name = (char **)qlc_83xx_idc_states;
1173
1174 clear_bit(__QLCNIC_RESETTING, &adapter->state);
1175 set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
1176
1177
1178 if (!qlcnic_auto_fw_reset) {
1179
1180 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1181 val = val | QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
1182 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
1183 }
1184 }
1185
1186 static int
1187 qlcnic_83xx_idc_first_to_load_function_handler(struct qlcnic_adapter *adapter)
1188 {
1189 u32 state, val;
1190
1191 if (qlcnic_83xx_lock_driver(adapter))
1192 return -EIO;
1193
1194
1195 QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, 0);
1196 if (qlcnic_83xx_idc_update_major_version(adapter, 0)) {
1197 qlcnic_83xx_unlock_driver(adapter);
1198 return -EIO;
1199 }
1200
1201 state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
1202 if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
1203 qlcnic_83xx_unlock_driver(adapter);
1204 return -EIO;
1205 }
1206
1207 if (state != QLC_83XX_IDC_DEV_COLD && qlcnic_load_fw_file) {
1208 QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
1209 QLC_83XX_IDC_DEV_COLD);
1210 state = QLC_83XX_IDC_DEV_COLD;
1211 }
1212
1213 adapter->ahw->idc.curr_state = state;
1214
1215 if (state == QLC_83XX_IDC_DEV_COLD)
1216 qlcnic_83xx_idc_cold_state_handler(adapter);
1217
1218
1219 if (qlcnic_auto_fw_reset) {
1220 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1221 val = val & ~QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
1222 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
1223 }
1224
1225 qlcnic_83xx_unlock_driver(adapter);
1226
1227 return 0;
1228 }
1229
1230 int qlcnic_83xx_idc_init(struct qlcnic_adapter *adapter)
1231 {
1232 int ret = -EIO;
1233
1234 qlcnic_83xx_setup_idc_parameters(adapter);
1235
1236 if (qlcnic_83xx_get_reset_instruction_template(adapter))
1237 return ret;
1238
1239 if (!qlcnic_83xx_idc_check_driver_presence_reg(adapter)) {
1240 if (qlcnic_83xx_idc_first_to_load_function_handler(adapter))
1241 return -EIO;
1242 } else {
1243 if (qlcnic_83xx_idc_check_major_version(adapter))
1244 return -EIO;
1245 }
1246
1247 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
1248
1249 return 0;
1250 }
1251
1252 void qlcnic_83xx_idc_exit(struct qlcnic_adapter *adapter)
1253 {
1254 int id;
1255 u32 val;
1256
1257 while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
1258 usleep_range(10000, 11000);
1259
1260 id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
1261 id = id & 0xFF;
1262
1263 if (id == adapter->portnum) {
1264 dev_err(&adapter->pdev->dev,
1265 "%s: wait for lock recovery.. %d\n", __func__, id);
1266 msleep(20);
1267 id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
1268 id = id & 0xFF;
1269 }
1270
1271
1272 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
1273 val = val & ~(1 << adapter->portnum);
1274 QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
1275 clear_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
1276 clear_bit(__QLCNIC_RESETTING, &adapter->state);
1277
1278 cancel_delayed_work_sync(&adapter->fw_work);
1279 }
1280
1281 void qlcnic_83xx_idc_request_reset(struct qlcnic_adapter *adapter, u32 key)
1282 {
1283 u32 val;
1284
1285 if (qlcnic_sriov_vf_check(adapter))
1286 return;
1287
1288 if (qlcnic_83xx_lock_driver(adapter)) {
1289 dev_err(&adapter->pdev->dev,
1290 "%s:failed, please retry\n", __func__);
1291 return;
1292 }
1293
1294 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1295 if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
1296 netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
1297 __func__);
1298 qlcnic_83xx_idc_enter_failed_state(adapter, 0);
1299 qlcnic_83xx_unlock_driver(adapter);
1300 return;
1301 }
1302
1303 if (key == QLCNIC_FORCE_FW_RESET) {
1304 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
1305 val = val | QLC_83XX_IDC_GRACEFULL_RESET;
1306 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
1307 } else if (key == QLCNIC_FORCE_FW_DUMP_KEY) {
1308 adapter->ahw->idc.collect_dump = 1;
1309 }
1310
1311 qlcnic_83xx_unlock_driver(adapter);
1312 return;
1313 }
1314
1315 static int qlcnic_83xx_copy_bootloader(struct qlcnic_adapter *adapter)
1316 {
1317 u8 *p_cache;
1318 u32 src, size;
1319 u64 dest;
1320 int ret = -EIO;
1321
1322 src = QLC_83XX_BOOTLOADER_FLASH_ADDR;
1323 dest = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_ADDR);
1324 size = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_SIZE);
1325
1326
1327 if (size & 0xF)
1328 size = (size + 16) & ~0xF;
1329
1330 p_cache = vzalloc(size);
1331 if (p_cache == NULL)
1332 return -ENOMEM;
1333
1334 ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache,
1335 size / sizeof(u32));
1336 if (ret) {
1337 vfree(p_cache);
1338 return ret;
1339 }
1340
1341 ret = qlcnic_ms_mem_write128(adapter, dest, (u32 *)p_cache,
1342 size / 16);
1343 if (ret) {
1344 vfree(p_cache);
1345 return ret;
1346 }
1347 vfree(p_cache);
1348
1349 return ret;
1350 }
1351
1352 static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
1353 {
1354 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
1355 const struct firmware *fw = fw_info->fw;
1356 u32 dest, *p_cache, *temp;
1357 __le32 *temp_le;
1358 u8 data[16];
1359 size_t size;
1360 int i, ret;
1361 u64 addr;
1362
1363 temp = vzalloc(fw->size);
1364 if (!temp) {
1365 release_firmware(fw);
1366 fw_info->fw = NULL;
1367 return -ENOMEM;
1368 }
1369
1370 temp_le = (__le32 *)fw->data;
1371
1372
1373
1374
1375 for (i = 0; i < fw->size / sizeof(u32); i++)
1376 temp[i] = __le32_to_cpu(temp_le[i]);
1377
1378 dest = QLCRDX(adapter->ahw, QLCNIC_FW_IMAGE_ADDR);
1379 size = (fw->size & ~0xF);
1380 p_cache = temp;
1381 addr = (u64)dest;
1382
1383 ret = qlcnic_ms_mem_write128(adapter, addr,
1384 p_cache, size / 16);
1385 if (ret) {
1386 dev_err(&adapter->pdev->dev, "MS memory write failed\n");
1387 goto exit;
1388 }
1389
1390
1391 if (fw->size & 0xF) {
1392 addr = dest + size;
1393 for (i = 0; i < (fw->size & 0xF); i++)
1394 data[i] = ((u8 *)temp)[size + i];
1395 for (; i < 16; i++)
1396 data[i] = 0;
1397 ret = qlcnic_ms_mem_write128(adapter, addr,
1398 (u32 *)data, 1);
1399 if (ret) {
1400 dev_err(&adapter->pdev->dev,
1401 "MS memory write failed\n");
1402 goto exit;
1403 }
1404 }
1405
1406 exit:
1407 release_firmware(fw);
1408 fw_info->fw = NULL;
1409 vfree(temp);
1410
1411 return ret;
1412 }
1413
1414 static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
1415 {
1416 int i, j;
1417 u32 val = 0, val1 = 0, reg = 0;
1418 int err = 0;
1419
1420 val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err);
1421 if (err == -EIO)
1422 return;
1423 dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
1424
1425 for (j = 0; j < 2; j++) {
1426 if (j == 0) {
1427 dev_info(&adapter->pdev->dev,
1428 "Port 0 RxB Pause Threshold Regs[TC7..TC0]:");
1429 reg = QLC_83XX_PORT0_THRESHOLD;
1430 } else if (j == 1) {
1431 dev_info(&adapter->pdev->dev,
1432 "Port 1 RxB Pause Threshold Regs[TC7..TC0]:");
1433 reg = QLC_83XX_PORT1_THRESHOLD;
1434 }
1435 for (i = 0; i < 8; i++) {
1436 val = QLCRD32(adapter, reg + (i * 0x4), &err);
1437 if (err == -EIO)
1438 return;
1439 dev_info(&adapter->pdev->dev, "0x%x ", val);
1440 }
1441 dev_info(&adapter->pdev->dev, "\n");
1442 }
1443
1444 for (j = 0; j < 2; j++) {
1445 if (j == 0) {
1446 dev_info(&adapter->pdev->dev,
1447 "Port 0 RxB TC Max Cell Registers[4..1]:");
1448 reg = QLC_83XX_PORT0_TC_MC_REG;
1449 } else if (j == 1) {
1450 dev_info(&adapter->pdev->dev,
1451 "Port 1 RxB TC Max Cell Registers[4..1]:");
1452 reg = QLC_83XX_PORT1_TC_MC_REG;
1453 }
1454 for (i = 0; i < 4; i++) {
1455 val = QLCRD32(adapter, reg + (i * 0x4), &err);
1456 if (err == -EIO)
1457 return;
1458 dev_info(&adapter->pdev->dev, "0x%x ", val);
1459 }
1460 dev_info(&adapter->pdev->dev, "\n");
1461 }
1462
1463 for (j = 0; j < 2; j++) {
1464 if (j == 0) {
1465 dev_info(&adapter->pdev->dev,
1466 "Port 0 RxB Rx TC Stats[TC7..TC0]:");
1467 reg = QLC_83XX_PORT0_TC_STATS;
1468 } else if (j == 1) {
1469 dev_info(&adapter->pdev->dev,
1470 "Port 1 RxB Rx TC Stats[TC7..TC0]:");
1471 reg = QLC_83XX_PORT1_TC_STATS;
1472 }
1473 for (i = 7; i >= 0; i--) {
1474 val = QLCRD32(adapter, reg, &err);
1475 if (err == -EIO)
1476 return;
1477 val &= ~(0x7 << 29);
1478 QLCWR32(adapter, reg, (val | (i << 29)));
1479 val = QLCRD32(adapter, reg, &err);
1480 if (err == -EIO)
1481 return;
1482 dev_info(&adapter->pdev->dev, "0x%x ", val);
1483 }
1484 dev_info(&adapter->pdev->dev, "\n");
1485 }
1486
1487 val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err);
1488 if (err == -EIO)
1489 return;
1490 val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err);
1491 if (err == -EIO)
1492 return;
1493 dev_info(&adapter->pdev->dev,
1494 "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
1495 val, val1);
1496 }
1497
1498
1499 static void qlcnic_83xx_disable_pause_frames(struct qlcnic_adapter *adapter)
1500 {
1501 u32 reg = 0, i, j;
1502
1503 if (qlcnic_83xx_lock_driver(adapter)) {
1504 dev_err(&adapter->pdev->dev,
1505 "%s:failed to acquire driver lock\n", __func__);
1506 return;
1507 }
1508
1509 qlcnic_83xx_dump_pause_control_regs(adapter);
1510 QLCWR32(adapter, QLC_83XX_SRE_SHIM_REG, 0x0);
1511
1512 for (j = 0; j < 2; j++) {
1513 if (j == 0)
1514 reg = QLC_83XX_PORT0_THRESHOLD;
1515 else if (j == 1)
1516 reg = QLC_83XX_PORT1_THRESHOLD;
1517
1518 for (i = 0; i < 8; i++)
1519 QLCWR32(adapter, reg + (i * 0x4), 0x0);
1520 }
1521
1522 for (j = 0; j < 2; j++) {
1523 if (j == 0)
1524 reg = QLC_83XX_PORT0_TC_MC_REG;
1525 else if (j == 1)
1526 reg = QLC_83XX_PORT1_TC_MC_REG;
1527
1528 for (i = 0; i < 4; i++)
1529 QLCWR32(adapter, reg + (i * 0x4), 0x03FF03FF);
1530 }
1531
1532 QLCWR32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, 0);
1533 QLCWR32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, 0);
1534 dev_info(&adapter->pdev->dev,
1535 "Disabled pause frames successfully on all ports\n");
1536 qlcnic_83xx_unlock_driver(adapter);
1537 }
1538
1539 static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
1540 {
1541 QLCWR32(adapter, QLC_83XX_RESET_REG, 0);
1542 QLCWR32(adapter, QLC_83XX_RESET_PORT0, 0);
1543 QLCWR32(adapter, QLC_83XX_RESET_PORT1, 0);
1544 QLCWR32(adapter, QLC_83XX_RESET_PORT2, 0);
1545 QLCWR32(adapter, QLC_83XX_RESET_PORT3, 0);
1546 QLCWR32(adapter, QLC_83XX_RESET_SRESHIM, 0);
1547 QLCWR32(adapter, QLC_83XX_RESET_EPGSHIM, 0);
1548 QLCWR32(adapter, QLC_83XX_RESET_ETHERPCS, 0);
1549 QLCWR32(adapter, QLC_83XX_RESET_CONTROL, 1);
1550 }
1551
1552 static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
1553 {
1554 u32 heartbeat, peg_status;
1555 int retries, ret = -EIO, err = 0;
1556
1557 retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
1558 p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
1559 QLCNIC_PEG_ALIVE_COUNTER);
1560
1561 do {
1562 msleep(QLCNIC_HEARTBEAT_PERIOD_MSECS);
1563 heartbeat = QLC_SHARED_REG_RD32(p_dev,
1564 QLCNIC_PEG_ALIVE_COUNTER);
1565 if (heartbeat != p_dev->heartbeat) {
1566 ret = QLCNIC_RCODE_SUCCESS;
1567 break;
1568 }
1569 } while (--retries);
1570
1571 if (ret) {
1572 dev_err(&p_dev->pdev->dev, "firmware hang detected\n");
1573 qlcnic_83xx_take_eport_out_of_reset(p_dev);
1574 qlcnic_83xx_disable_pause_frames(p_dev);
1575 peg_status = QLC_SHARED_REG_RD32(p_dev,
1576 QLCNIC_PEG_HALT_STATUS1);
1577 dev_info(&p_dev->pdev->dev, "Dumping HW/FW registers\n"
1578 "PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,\n"
1579 "PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,\n"
1580 "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
1581 "PEG_NET_4_PC: 0x%x\n", peg_status,
1582 QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
1583 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err),
1584 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err),
1585 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err),
1586 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err),
1587 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err));
1588
1589 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
1590 dev_err(&p_dev->pdev->dev,
1591 "Device is being reset err code 0x00006700.\n");
1592 }
1593
1594 return ret;
1595 }
1596
1597 static int qlcnic_83xx_check_cmd_peg_status(struct qlcnic_adapter *p_dev)
1598 {
1599 int retries = QLCNIC_CMDPEG_CHECK_RETRY_COUNT;
1600 u32 val;
1601
1602 do {
1603 val = QLC_SHARED_REG_RD32(p_dev, QLCNIC_CMDPEG_STATE);
1604 if (val == QLC_83XX_CMDPEG_COMPLETE)
1605 return 0;
1606 msleep(QLCNIC_CMDPEG_CHECK_DELAY);
1607 } while (--retries);
1608
1609 dev_err(&p_dev->pdev->dev, "%s: failed, state = 0x%x\n", __func__, val);
1610 return -EIO;
1611 }
1612
1613 static int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev)
1614 {
1615 int err;
1616
1617 err = qlcnic_83xx_check_cmd_peg_status(p_dev);
1618 if (err)
1619 return err;
1620
1621 err = qlcnic_83xx_check_heartbeat(p_dev);
1622 if (err)
1623 return err;
1624
1625 return err;
1626 }
1627
1628 static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
1629 int duration, u32 mask, u32 status)
1630 {
1631 int timeout_error, err = 0;
1632 u32 value;
1633 u8 retries;
1634
1635 value = QLCRD32(p_dev, addr, &err);
1636 if (err == -EIO)
1637 return err;
1638 retries = duration / 10;
1639
1640 do {
1641 if ((value & mask) != status) {
1642 timeout_error = 1;
1643 msleep(duration / 10);
1644 value = QLCRD32(p_dev, addr, &err);
1645 if (err == -EIO)
1646 return err;
1647 } else {
1648 timeout_error = 0;
1649 break;
1650 }
1651 } while (retries--);
1652
1653 if (timeout_error) {
1654 p_dev->ahw->reset.seq_error++;
1655 dev_err(&p_dev->pdev->dev,
1656 "%s: Timeout Err, entry_num = %d\n",
1657 __func__, p_dev->ahw->reset.seq_index);
1658 dev_err(&p_dev->pdev->dev,
1659 "0x%08x 0x%08x 0x%08x\n",
1660 value, mask, status);
1661 }
1662
1663 return timeout_error;
1664 }
1665
1666 static int qlcnic_83xx_reset_template_checksum(struct qlcnic_adapter *p_dev)
1667 {
1668 u32 sum = 0;
1669 u16 *buff = (u16 *)p_dev->ahw->reset.buff;
1670 int count = p_dev->ahw->reset.hdr->size / sizeof(u16);
1671
1672 while (count-- > 0)
1673 sum += *buff++;
1674
1675 while (sum >> 16)
1676 sum = (sum & 0xFFFF) + (sum >> 16);
1677
1678 if (~sum) {
1679 return 0;
1680 } else {
1681 dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
1682 return -1;
1683 }
1684 }
1685
1686 static int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev)
1687 {
1688 struct qlcnic_hardware_context *ahw = p_dev->ahw;
1689 u32 addr, count, prev_ver, curr_ver;
1690 u8 *p_buff;
1691
1692 if (ahw->reset.buff != NULL) {
1693 prev_ver = p_dev->fw_version;
1694 curr_ver = qlcnic_83xx_get_fw_version(p_dev);
1695 if (curr_ver > prev_ver)
1696 kfree(ahw->reset.buff);
1697 else
1698 return 0;
1699 }
1700
1701 ahw->reset.seq_error = 0;
1702 ahw->reset.buff = kzalloc(QLC_83XX_RESTART_TEMPLATE_SIZE, GFP_KERNEL);
1703 if (ahw->reset.buff == NULL)
1704 return -ENOMEM;
1705
1706 p_buff = p_dev->ahw->reset.buff;
1707 addr = QLC_83XX_RESET_TEMPLATE_ADDR;
1708 count = sizeof(struct qlc_83xx_reset_hdr) / sizeof(u32);
1709
1710
1711 if (qlcnic_83xx_flash_read32(p_dev, addr, p_buff, count)) {
1712 dev_err(&p_dev->pdev->dev, "%s: flash read failed\n", __func__);
1713 return -EIO;
1714 }
1715 ahw->reset.hdr = (struct qlc_83xx_reset_hdr *)ahw->reset.buff;
1716 addr = QLC_83XX_RESET_TEMPLATE_ADDR + ahw->reset.hdr->hdr_size;
1717 p_buff = ahw->reset.buff + ahw->reset.hdr->hdr_size;
1718 count = (ahw->reset.hdr->size - ahw->reset.hdr->hdr_size) / sizeof(u32);
1719
1720
1721 if (qlcnic_83xx_flash_read32(p_dev, addr, p_buff, count)) {
1722 dev_err(&p_dev->pdev->dev, "%s: flash read failed\n", __func__);
1723 return -EIO;
1724 }
1725
1726 if (qlcnic_83xx_reset_template_checksum(p_dev))
1727 return -EIO;
1728
1729 ahw->reset.init_offset = ahw->reset.buff + ahw->reset.hdr->init_offset;
1730 ahw->reset.start_offset = ahw->reset.buff +
1731 ahw->reset.hdr->start_offset;
1732 ahw->reset.stop_offset = ahw->reset.buff + ahw->reset.hdr->hdr_size;
1733 return 0;
1734 }
1735
1736
1737 static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
1738 u32 raddr, u32 waddr)
1739 {
1740 int err = 0;
1741 u32 value;
1742
1743 value = QLCRD32(p_dev, raddr, &err);
1744 if (err == -EIO)
1745 return;
1746 qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
1747 }
1748
1749
1750 static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev,
1751 u32 raddr, u32 waddr,
1752 struct qlc_83xx_rmw *p_rmw_hdr)
1753 {
1754 int err = 0;
1755 u32 value;
1756
1757 if (p_rmw_hdr->index_a) {
1758 value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
1759 } else {
1760 value = QLCRD32(p_dev, raddr, &err);
1761 if (err == -EIO)
1762 return;
1763 }
1764
1765 value &= p_rmw_hdr->mask;
1766 value <<= p_rmw_hdr->shl;
1767 value >>= p_rmw_hdr->shr;
1768 value |= p_rmw_hdr->or_value;
1769 value ^= p_rmw_hdr->xor_value;
1770 qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
1771 }
1772
1773
1774 static void qlcnic_83xx_write_list(struct qlcnic_adapter *p_dev,
1775 struct qlc_83xx_entry_hdr *p_hdr)
1776 {
1777 int i;
1778 struct qlc_83xx_entry *entry;
1779
1780 entry = (struct qlc_83xx_entry *)((char *)p_hdr +
1781 sizeof(struct qlc_83xx_entry_hdr));
1782
1783 for (i = 0; i < p_hdr->count; i++, entry++) {
1784 qlcnic_83xx_wrt_reg_indirect(p_dev, entry->arg1,
1785 entry->arg2);
1786 if (p_hdr->delay)
1787 udelay((u32)(p_hdr->delay));
1788 }
1789 }
1790
1791
1792 static void qlcnic_83xx_read_write_list(struct qlcnic_adapter *p_dev,
1793 struct qlc_83xx_entry_hdr *p_hdr)
1794 {
1795 int i;
1796 struct qlc_83xx_entry *entry;
1797
1798 entry = (struct qlc_83xx_entry *)((char *)p_hdr +
1799 sizeof(struct qlc_83xx_entry_hdr));
1800
1801 for (i = 0; i < p_hdr->count; i++, entry++) {
1802 qlcnic_83xx_read_write_crb_reg(p_dev, entry->arg1,
1803 entry->arg2);
1804 if (p_hdr->delay)
1805 udelay((u32)(p_hdr->delay));
1806 }
1807 }
1808
1809
1810 static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
1811 struct qlc_83xx_entry_hdr *p_hdr)
1812 {
1813 long delay;
1814 struct qlc_83xx_entry *entry;
1815 struct qlc_83xx_poll *poll;
1816 int i, err = 0;
1817 unsigned long arg1, arg2;
1818
1819 poll = (struct qlc_83xx_poll *)((char *)p_hdr +
1820 sizeof(struct qlc_83xx_entry_hdr));
1821
1822 entry = (struct qlc_83xx_entry *)((char *)poll +
1823 sizeof(struct qlc_83xx_poll));
1824 delay = (long)p_hdr->delay;
1825
1826 if (!delay) {
1827 for (i = 0; i < p_hdr->count; i++, entry++)
1828 qlcnic_83xx_poll_reg(p_dev, entry->arg1,
1829 delay, poll->mask,
1830 poll->status);
1831 } else {
1832 for (i = 0; i < p_hdr->count; i++, entry++) {
1833 arg1 = entry->arg1;
1834 arg2 = entry->arg2;
1835 if (delay) {
1836 if (qlcnic_83xx_poll_reg(p_dev,
1837 arg1, delay,
1838 poll->mask,
1839 poll->status)){
1840 QLCRD32(p_dev, arg1, &err);
1841 if (err == -EIO)
1842 return;
1843 QLCRD32(p_dev, arg2, &err);
1844 if (err == -EIO)
1845 return;
1846 }
1847 }
1848 }
1849 }
1850 }
1851
1852
1853 static void qlcnic_83xx_poll_write_list(struct qlcnic_adapter *p_dev,
1854 struct qlc_83xx_entry_hdr *p_hdr)
1855 {
1856 int i;
1857 long delay;
1858 struct qlc_83xx_quad_entry *entry;
1859 struct qlc_83xx_poll *poll;
1860
1861 poll = (struct qlc_83xx_poll *)((char *)p_hdr +
1862 sizeof(struct qlc_83xx_entry_hdr));
1863 entry = (struct qlc_83xx_quad_entry *)((char *)poll +
1864 sizeof(struct qlc_83xx_poll));
1865 delay = (long)p_hdr->delay;
1866
1867 for (i = 0; i < p_hdr->count; i++, entry++) {
1868 qlcnic_83xx_wrt_reg_indirect(p_dev, entry->dr_addr,
1869 entry->dr_value);
1870 qlcnic_83xx_wrt_reg_indirect(p_dev, entry->ar_addr,
1871 entry->ar_value);
1872 if (delay)
1873 qlcnic_83xx_poll_reg(p_dev, entry->ar_addr, delay,
1874 poll->mask, poll->status);
1875 }
1876 }
1877
1878
1879 static void qlcnic_83xx_read_modify_write(struct qlcnic_adapter *p_dev,
1880 struct qlc_83xx_entry_hdr *p_hdr)
1881 {
1882 int i;
1883 struct qlc_83xx_entry *entry;
1884 struct qlc_83xx_rmw *rmw_hdr;
1885
1886 rmw_hdr = (struct qlc_83xx_rmw *)((char *)p_hdr +
1887 sizeof(struct qlc_83xx_entry_hdr));
1888
1889 entry = (struct qlc_83xx_entry *)((char *)rmw_hdr +
1890 sizeof(struct qlc_83xx_rmw));
1891
1892 for (i = 0; i < p_hdr->count; i++, entry++) {
1893 qlcnic_83xx_rmw_crb_reg(p_dev, entry->arg1,
1894 entry->arg2, rmw_hdr);
1895 if (p_hdr->delay)
1896 udelay((u32)(p_hdr->delay));
1897 }
1898 }
1899
1900 static void qlcnic_83xx_pause(struct qlc_83xx_entry_hdr *p_hdr)
1901 {
1902 if (p_hdr->delay)
1903 mdelay((u32)((long)p_hdr->delay));
1904 }
1905
1906
1907 static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
1908 struct qlc_83xx_entry_hdr *p_hdr)
1909 {
1910 long delay;
1911 int index, i, j, err;
1912 struct qlc_83xx_quad_entry *entry;
1913 struct qlc_83xx_poll *poll;
1914 unsigned long addr;
1915
1916 poll = (struct qlc_83xx_poll *)((char *)p_hdr +
1917 sizeof(struct qlc_83xx_entry_hdr));
1918
1919 entry = (struct qlc_83xx_quad_entry *)((char *)poll +
1920 sizeof(struct qlc_83xx_poll));
1921 delay = (long)p_hdr->delay;
1922
1923 for (i = 0; i < p_hdr->count; i++, entry++) {
1924 qlcnic_83xx_wrt_reg_indirect(p_dev, entry->ar_addr,
1925 entry->ar_value);
1926 if (delay) {
1927 if (!qlcnic_83xx_poll_reg(p_dev, entry->ar_addr, delay,
1928 poll->mask, poll->status)){
1929 index = p_dev->ahw->reset.array_index;
1930 addr = entry->dr_addr;
1931 j = QLCRD32(p_dev, addr, &err);
1932 if (err == -EIO)
1933 return;
1934
1935 p_dev->ahw->reset.array[index++] = j;
1936
1937 if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
1938 p_dev->ahw->reset.array_index = 1;
1939 }
1940 }
1941 }
1942 }
1943
1944 static inline void qlcnic_83xx_seq_end(struct qlcnic_adapter *p_dev)
1945 {
1946 p_dev->ahw->reset.seq_end = 1;
1947 }
1948
1949 static void qlcnic_83xx_template_end(struct qlcnic_adapter *p_dev)
1950 {
1951 p_dev->ahw->reset.template_end = 1;
1952 if (p_dev->ahw->reset.seq_error == 0)
1953 dev_err(&p_dev->pdev->dev,
1954 "HW restart process completed successfully.\n");
1955 else
1956 dev_err(&p_dev->pdev->dev,
1957 "HW restart completed with timeout errors.\n");
1958 }
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974 static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev,
1975 char *p_buff)
1976 {
1977 int index, entries;
1978 struct qlc_83xx_entry_hdr *p_hdr;
1979 char *entry = p_buff;
1980
1981 p_dev->ahw->reset.seq_end = 0;
1982 p_dev->ahw->reset.template_end = 0;
1983 entries = p_dev->ahw->reset.hdr->entries;
1984 index = p_dev->ahw->reset.seq_index;
1985
1986 for (; (!p_dev->ahw->reset.seq_end) && (index < entries); index++) {
1987 p_hdr = (struct qlc_83xx_entry_hdr *)entry;
1988
1989 switch (p_hdr->cmd) {
1990 case QLC_83XX_OPCODE_NOP:
1991 break;
1992 case QLC_83XX_OPCODE_WRITE_LIST:
1993 qlcnic_83xx_write_list(p_dev, p_hdr);
1994 break;
1995 case QLC_83XX_OPCODE_READ_WRITE_LIST:
1996 qlcnic_83xx_read_write_list(p_dev, p_hdr);
1997 break;
1998 case QLC_83XX_OPCODE_POLL_LIST:
1999 qlcnic_83xx_poll_list(p_dev, p_hdr);
2000 break;
2001 case QLC_83XX_OPCODE_POLL_WRITE_LIST:
2002 qlcnic_83xx_poll_write_list(p_dev, p_hdr);
2003 break;
2004 case QLC_83XX_OPCODE_READ_MODIFY_WRITE:
2005 qlcnic_83xx_read_modify_write(p_dev, p_hdr);
2006 break;
2007 case QLC_83XX_OPCODE_SEQ_PAUSE:
2008 qlcnic_83xx_pause(p_hdr);
2009 break;
2010 case QLC_83XX_OPCODE_SEQ_END:
2011 qlcnic_83xx_seq_end(p_dev);
2012 break;
2013 case QLC_83XX_OPCODE_TMPL_END:
2014 qlcnic_83xx_template_end(p_dev);
2015 break;
2016 case QLC_83XX_OPCODE_POLL_READ_LIST:
2017 qlcnic_83xx_poll_read_list(p_dev, p_hdr);
2018 break;
2019 default:
2020 dev_err(&p_dev->pdev->dev,
2021 "%s: Unknown opcode 0x%04x in template %d\n",
2022 __func__, p_hdr->cmd, index);
2023 break;
2024 }
2025 entry += p_hdr->size;
2026 cond_resched();
2027 }
2028 p_dev->ahw->reset.seq_index = index;
2029 }
2030
2031 static void qlcnic_83xx_stop_hw(struct qlcnic_adapter *p_dev)
2032 {
2033 p_dev->ahw->reset.seq_index = 0;
2034
2035 qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.stop_offset);
2036 if (p_dev->ahw->reset.seq_end != 1)
2037 dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
2038 }
2039
2040 static void qlcnic_83xx_start_hw(struct qlcnic_adapter *p_dev)
2041 {
2042 qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.start_offset);
2043 if (p_dev->ahw->reset.template_end != 1)
2044 dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
2045 }
2046
2047 static void qlcnic_83xx_init_hw(struct qlcnic_adapter *p_dev)
2048 {
2049 qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.init_offset);
2050 if (p_dev->ahw->reset.seq_end != 1)
2051 dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
2052 }
2053
2054
2055 #define QLC_83XX_POST_SIGNATURE_REG 0x41602014
2056 #define QLC_83XX_POST_MODE_REG 0x41602018
2057 #define QLC_83XX_POST_FAST_MODE 0
2058 #define QLC_83XX_POST_MEDIUM_MODE 1
2059 #define QLC_83XX_POST_SLOW_MODE 2
2060
2061
2062 #define QLC_83XX_POST_FAST_MODE_TIMEOUT 690
2063 #define QLC_83XX_POST_MED_MODE_TIMEOUT 2930
2064 #define QLC_83XX_POST_SLOW_MODE_TIMEOUT 7500
2065
2066
2067 #define QLC_83XX_POST_PASS 0xfffffff0
2068 #define QLC_83XX_POST_ASIC_STRESS_TEST_FAIL 0xffffffff
2069 #define QLC_83XX_POST_DDR_TEST_FAIL 0xfffffffe
2070 #define QLC_83XX_POST_ASIC_MEMORY_TEST_FAIL 0xfffffffc
2071 #define QLC_83XX_POST_FLASH_TEST_FAIL 0xfffffff8
2072
2073 static int qlcnic_83xx_run_post(struct qlcnic_adapter *adapter)
2074 {
2075 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
2076 struct device *dev = &adapter->pdev->dev;
2077 int timeout, count, ret = 0;
2078 u32 signature;
2079
2080
2081 switch (adapter->ahw->post_mode) {
2082 case QLC_83XX_POST_FAST_MODE:
2083 timeout = QLC_83XX_POST_FAST_MODE_TIMEOUT + 2000;
2084 break;
2085 case QLC_83XX_POST_MEDIUM_MODE:
2086 timeout = QLC_83XX_POST_MED_MODE_TIMEOUT + 2000;
2087 break;
2088 case QLC_83XX_POST_SLOW_MODE:
2089 timeout = QLC_83XX_POST_SLOW_MODE_TIMEOUT + 2000;
2090 break;
2091 default:
2092 return -EINVAL;
2093 }
2094
2095 strncpy(fw_info->fw_file_name, QLC_83XX_POST_FW_FILE_NAME,
2096 QLC_FW_FILE_NAME_LEN);
2097
2098 ret = request_firmware(&fw_info->fw, fw_info->fw_file_name, dev);
2099 if (ret) {
2100 dev_err(dev, "POST firmware can not be loaded, skipping POST\n");
2101 return 0;
2102 }
2103
2104 ret = qlcnic_83xx_copy_fw_file(adapter);
2105 if (ret)
2106 return ret;
2107
2108
2109 qlcnic_ind_wr(adapter, QLC_83XX_POST_SIGNATURE_REG, 0);
2110
2111
2112 qlcnic_ind_wr(adapter, QLC_83XX_POST_MODE_REG,
2113 adapter->ahw->post_mode);
2114
2115 QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
2116 QLC_83XX_BOOT_FROM_FILE);
2117
2118 qlcnic_83xx_start_hw(adapter);
2119
2120 count = 0;
2121 do {
2122 msleep(100);
2123 count += 100;
2124
2125 signature = qlcnic_ind_rd(adapter, QLC_83XX_POST_SIGNATURE_REG);
2126 if (signature == QLC_83XX_POST_PASS)
2127 break;
2128 } while (timeout > count);
2129
2130 if (timeout <= count) {
2131 dev_err(dev, "POST timed out, signature = 0x%08x\n", signature);
2132 return -EIO;
2133 }
2134
2135 switch (signature) {
2136 case QLC_83XX_POST_PASS:
2137 dev_info(dev, "POST passed, Signature = 0x%08x\n", signature);
2138 break;
2139 case QLC_83XX_POST_ASIC_STRESS_TEST_FAIL:
2140 dev_err(dev, "POST failed, Test case : ASIC STRESS TEST, Signature = 0x%08x\n",
2141 signature);
2142 ret = -EIO;
2143 break;
2144 case QLC_83XX_POST_DDR_TEST_FAIL:
2145 dev_err(dev, "POST failed, Test case : DDT TEST, Signature = 0x%08x\n",
2146 signature);
2147 ret = -EIO;
2148 break;
2149 case QLC_83XX_POST_ASIC_MEMORY_TEST_FAIL:
2150 dev_err(dev, "POST failed, Test case : ASIC MEMORY TEST, Signature = 0x%08x\n",
2151 signature);
2152 ret = -EIO;
2153 break;
2154 case QLC_83XX_POST_FLASH_TEST_FAIL:
2155 dev_err(dev, "POST failed, Test case : FLASH TEST, Signature = 0x%08x\n",
2156 signature);
2157 ret = -EIO;
2158 break;
2159 default:
2160 dev_err(dev, "POST failed, Test case : INVALID, Signature = 0x%08x\n",
2161 signature);
2162 ret = -EIO;
2163 break;
2164 }
2165
2166 return ret;
2167 }
2168
2169 static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter)
2170 {
2171 struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
2172 int err = -EIO;
2173
2174 if (request_firmware(&fw_info->fw, fw_info->fw_file_name,
2175 &(adapter->pdev->dev))) {
2176 dev_err(&adapter->pdev->dev,
2177 "No file FW image, loading flash FW image.\n");
2178 QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
2179 QLC_83XX_BOOT_FROM_FLASH);
2180 } else {
2181 if (qlcnic_83xx_copy_fw_file(adapter))
2182 return err;
2183 QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
2184 QLC_83XX_BOOT_FROM_FILE);
2185 }
2186
2187 return 0;
2188 }
2189
2190 static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter)
2191 {
2192 u32 val;
2193 int err = -EIO;
2194
2195 qlcnic_83xx_stop_hw(adapter);
2196
2197
2198 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
2199 if (!(val & QLC_83XX_IDC_GRACEFULL_RESET))
2200 qlcnic_dump_fw(adapter);
2201
2202 if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
2203 netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
2204 __func__);
2205 qlcnic_83xx_idc_enter_failed_state(adapter, 1);
2206 return err;
2207 }
2208
2209 qlcnic_83xx_init_hw(adapter);
2210
2211 if (qlcnic_83xx_copy_bootloader(adapter))
2212 return err;
2213
2214
2215 if (adapter->ahw->run_post) {
2216 err = qlcnic_83xx_run_post(adapter);
2217 if (err)
2218 return err;
2219
2220
2221 adapter->ahw->run_post = false;
2222
2223
2224 qlcnic_83xx_stop_hw(adapter);
2225 qlcnic_83xx_init_hw(adapter);
2226
2227 err = qlcnic_83xx_copy_bootloader(adapter);
2228 if (err)
2229 return err;
2230 }
2231
2232
2233 if (qlcnic_load_fw_file == 1) {
2234 err = qlcnic_83xx_load_fw_image_from_host(adapter);
2235 if (err)
2236 return err;
2237 } else {
2238 QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
2239 QLC_83XX_BOOT_FROM_FLASH);
2240 }
2241
2242 qlcnic_83xx_start_hw(adapter);
2243 if (qlcnic_83xx_check_hw_status(adapter))
2244 return -EIO;
2245
2246 return 0;
2247 }
2248
2249 static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter)
2250 {
2251 int err;
2252 struct qlcnic_info nic_info;
2253 struct qlcnic_hardware_context *ahw = adapter->ahw;
2254
2255 memset(&nic_info, 0, sizeof(struct qlcnic_info));
2256 err = qlcnic_get_nic_info(adapter, &nic_info, ahw->pci_func);
2257 if (err)
2258 return -EIO;
2259
2260 ahw->physical_port = (u8) nic_info.phys_port;
2261 ahw->switch_mode = nic_info.switch_mode;
2262 ahw->max_tx_ques = nic_info.max_tx_ques;
2263 ahw->max_rx_ques = nic_info.max_rx_ques;
2264 ahw->capabilities = nic_info.capabilities;
2265 ahw->max_mac_filters = nic_info.max_mac_filters;
2266 ahw->max_mtu = nic_info.max_mtu;
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276 if (test_bit(__QLCNIC_SRIOV_CAPABLE, &adapter->state))
2277 return QLC_83XX_DEFAULT_OPMODE;
2278
2279 if (ahw->capabilities & QLC_83XX_ESWITCH_CAPABILITY)
2280 return QLCNIC_VNIC_MODE;
2281
2282 return QLC_83XX_DEFAULT_OPMODE;
2283 }
2284
2285 int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
2286 {
2287 struct qlcnic_hardware_context *ahw = adapter->ahw;
2288 u16 max_sds_rings, max_tx_rings;
2289 int ret;
2290
2291 ret = qlcnic_83xx_get_nic_configuration(adapter);
2292 if (ret == -EIO)
2293 return -EIO;
2294
2295 if (ret == QLCNIC_VNIC_MODE) {
2296 ahw->nic_mode = QLCNIC_VNIC_MODE;
2297
2298 if (qlcnic_83xx_config_vnic_opmode(adapter))
2299 return -EIO;
2300
2301 max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS;
2302 max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS;
2303 } else if (ret == QLC_83XX_DEFAULT_OPMODE) {
2304 ahw->nic_mode = QLCNIC_DEFAULT_MODE;
2305 adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver;
2306 ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
2307 max_sds_rings = QLCNIC_MAX_SDS_RINGS;
2308 max_tx_rings = QLCNIC_MAX_TX_RINGS;
2309 } else {
2310 dev_err(&adapter->pdev->dev, "%s: Invalid opmode %d\n",
2311 __func__, ret);
2312 return -EIO;
2313 }
2314
2315 adapter->max_sds_rings = min(ahw->max_rx_ques, max_sds_rings);
2316 adapter->max_tx_rings = min(ahw->max_tx_ques, max_tx_rings);
2317
2318 return 0;
2319 }
2320
2321 static void qlcnic_83xx_config_buff_descriptors(struct qlcnic_adapter *adapter)
2322 {
2323 struct qlcnic_hardware_context *ahw = adapter->ahw;
2324
2325 if (ahw->port_type == QLCNIC_XGBE) {
2326 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
2327 adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G;
2328 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
2329 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
2330
2331 } else if (ahw->port_type == QLCNIC_GBE) {
2332 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
2333 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
2334 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
2335 adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
2336 }
2337 adapter->num_txd = MAX_CMD_DESCRIPTORS;
2338 adapter->max_rds_rings = MAX_RDS_RINGS;
2339 }
2340
2341 static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter)
2342 {
2343 int err = -EIO;
2344
2345 qlcnic_83xx_get_minidump_template(adapter);
2346 if (qlcnic_83xx_get_port_info(adapter))
2347 return err;
2348
2349 qlcnic_83xx_config_buff_descriptors(adapter);
2350 adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
2351 adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
2352
2353 dev_info(&adapter->pdev->dev, "HAL Version: %d\n",
2354 adapter->ahw->fw_hal_version);
2355
2356 return 0;
2357 }
2358
2359 #define IS_QLC_83XX_USED(a, b, c) (((1 << a->portnum) & b) || ((c >> 6) & 0x1))
2360 static void qlcnic_83xx_clear_function_resources(struct qlcnic_adapter *adapter)
2361 {
2362 struct qlcnic_cmd_args cmd;
2363 u32 presence_mask, audit_mask;
2364 int status;
2365
2366 presence_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
2367 audit_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
2368
2369 if (IS_QLC_83XX_USED(adapter, presence_mask, audit_mask)) {
2370 status = qlcnic_alloc_mbx_args(&cmd, adapter,
2371 QLCNIC_CMD_STOP_NIC_FUNC);
2372 if (status)
2373 return;
2374
2375 cmd.req.arg[1] = BIT_31;
2376 status = qlcnic_issue_cmd(adapter, &cmd);
2377 if (status)
2378 dev_err(&adapter->pdev->dev,
2379 "Failed to clean up the function resources\n");
2380 qlcnic_free_mbx_args(&cmd);
2381 }
2382 }
2383
2384 static int qlcnic_83xx_get_fw_info(struct qlcnic_adapter *adapter)
2385 {
2386 struct qlcnic_hardware_context *ahw = adapter->ahw;
2387 struct pci_dev *pdev = adapter->pdev;
2388 struct qlc_83xx_fw_info *fw_info;
2389 int err = 0;
2390
2391 ahw->fw_info = kzalloc(sizeof(*fw_info), GFP_KERNEL);
2392 if (!ahw->fw_info) {
2393 err = -ENOMEM;
2394 } else {
2395 fw_info = ahw->fw_info;
2396 switch (pdev->device) {
2397 case PCI_DEVICE_ID_QLOGIC_QLE834X:
2398 case PCI_DEVICE_ID_QLOGIC_QLE8830:
2399 strncpy(fw_info->fw_file_name, QLC_83XX_FW_FILE_NAME,
2400 QLC_FW_FILE_NAME_LEN);
2401 break;
2402 case PCI_DEVICE_ID_QLOGIC_QLE844X:
2403 strncpy(fw_info->fw_file_name, QLC_84XX_FW_FILE_NAME,
2404 QLC_FW_FILE_NAME_LEN);
2405 break;
2406 default:
2407 dev_err(&pdev->dev, "%s: Invalid device id\n",
2408 __func__);
2409 err = -EINVAL;
2410 break;
2411 }
2412 }
2413
2414 return err;
2415 }
2416
2417 static void qlcnic_83xx_init_rings(struct qlcnic_adapter *adapter)
2418 {
2419 u8 rx_cnt = QLCNIC_DEF_SDS_RINGS;
2420 u8 tx_cnt = QLCNIC_DEF_TX_RINGS;
2421
2422 adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS;
2423 adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS;
2424
2425 if (!adapter->ahw->msix_supported) {
2426 rx_cnt = QLCNIC_SINGLE_RING;
2427 tx_cnt = QLCNIC_SINGLE_RING;
2428 }
2429
2430
2431 qlcnic_set_tx_ring_count(adapter, tx_cnt);
2432 qlcnic_set_sds_ring_count(adapter, rx_cnt);
2433 }
2434
2435 int qlcnic_83xx_init(struct qlcnic_adapter *adapter)
2436 {
2437 struct qlcnic_hardware_context *ahw = adapter->ahw;
2438 int err = 0;
2439
2440 adapter->rx_mac_learn = false;
2441 ahw->msix_supported = !!qlcnic_use_msi_x;
2442
2443
2444 switch (qlcnic_load_fw_file) {
2445 case 2:
2446 ahw->post_mode = QLC_83XX_POST_FAST_MODE;
2447 ahw->run_post = true;
2448 break;
2449 case 3:
2450 ahw->post_mode = QLC_83XX_POST_MEDIUM_MODE;
2451 ahw->run_post = true;
2452 break;
2453 case 4:
2454 ahw->post_mode = QLC_83XX_POST_SLOW_MODE;
2455 ahw->run_post = true;
2456 break;
2457 default:
2458 ahw->run_post = false;
2459 break;
2460 }
2461
2462 qlcnic_83xx_init_rings(adapter);
2463
2464 err = qlcnic_83xx_init_mailbox_work(adapter);
2465 if (err)
2466 goto exit;
2467
2468 if (qlcnic_sriov_vf_check(adapter)) {
2469 err = qlcnic_sriov_vf_init(adapter);
2470 if (err)
2471 goto detach_mbx;
2472 else
2473 return err;
2474 }
2475
2476 if (qlcnic_83xx_read_flash_descriptor_table(adapter) ||
2477 qlcnic_83xx_read_flash_mfg_id(adapter)) {
2478 dev_err(&adapter->pdev->dev, "Failed reading flash mfg id\n");
2479 err = -ENOTRECOVERABLE;
2480 goto detach_mbx;
2481 }
2482
2483 err = qlcnic_83xx_check_hw_status(adapter);
2484 if (err)
2485 goto detach_mbx;
2486
2487 err = qlcnic_83xx_get_fw_info(adapter);
2488 if (err)
2489 goto detach_mbx;
2490
2491 err = qlcnic_83xx_idc_init(adapter);
2492 if (err)
2493 goto detach_mbx;
2494
2495 err = qlcnic_setup_intr(adapter);
2496 if (err) {
2497 dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n");
2498 goto disable_intr;
2499 }
2500
2501 INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
2502
2503 err = qlcnic_83xx_setup_mbx_intr(adapter);
2504 if (err)
2505 goto disable_mbx_intr;
2506
2507 qlcnic_83xx_clear_function_resources(adapter);
2508 qlcnic_dcb_enable(adapter->dcb);
2509 qlcnic_83xx_initialize_nic(adapter, 1);
2510 qlcnic_dcb_get_info(adapter->dcb);
2511
2512
2513 err = qlcnic_83xx_configure_opmode(adapter);
2514 if (err)
2515 goto disable_mbx_intr;
2516
2517
2518
2519 err = adapter->nic_ops->init_driver(adapter);
2520 if (err)
2521 goto disable_mbx_intr;
2522
2523
2524 qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
2525 return 0;
2526
2527 disable_mbx_intr:
2528 qlcnic_83xx_free_mbx_intr(adapter);
2529
2530 disable_intr:
2531 qlcnic_teardown_intr(adapter);
2532
2533 detach_mbx:
2534 qlcnic_83xx_detach_mailbox_work(adapter);
2535 qlcnic_83xx_free_mailbox(ahw->mailbox);
2536 ahw->mailbox = NULL;
2537 exit:
2538 return err;
2539 }
2540
2541 void qlcnic_83xx_aer_stop_poll_work(struct qlcnic_adapter *adapter)
2542 {
2543 struct qlcnic_hardware_context *ahw = adapter->ahw;
2544 struct qlc_83xx_idc *idc = &ahw->idc;
2545
2546 clear_bit(QLC_83XX_MBX_READY, &idc->status);
2547 cancel_delayed_work_sync(&adapter->fw_work);
2548
2549 if (ahw->nic_mode == QLCNIC_VNIC_MODE)
2550 qlcnic_83xx_disable_vnic_mode(adapter, 1);
2551
2552 qlcnic_83xx_idc_detach_driver(adapter);
2553 qlcnic_83xx_initialize_nic(adapter, 0);
2554
2555 cancel_delayed_work_sync(&adapter->idc_aen_work);
2556 }
2557
2558 int qlcnic_83xx_aer_reset(struct qlcnic_adapter *adapter)
2559 {
2560 struct qlcnic_hardware_context *ahw = adapter->ahw;
2561 struct qlc_83xx_idc *idc = &ahw->idc;
2562 int ret = 0;
2563 u32 owner;
2564
2565
2566
2567
2568
2569 idc->prev_state = QLC_83XX_IDC_DEV_NEED_RESET;
2570 owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
2571 if (ahw->pci_func == owner) {
2572 ret = qlcnic_83xx_restart_hw(adapter);
2573 if (ret < 0)
2574 return ret;
2575 qlcnic_83xx_idc_clear_registers(adapter, 0);
2576 }
2577
2578 ret = idc->state_entry(adapter);
2579 return ret;
2580 }
2581
2582 void qlcnic_83xx_aer_start_poll_work(struct qlcnic_adapter *adapter)
2583 {
2584 struct qlcnic_hardware_context *ahw = adapter->ahw;
2585 struct qlc_83xx_idc *idc = &ahw->idc;
2586 u32 owner;
2587
2588 idc->prev_state = QLC_83XX_IDC_DEV_READY;
2589 owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
2590 if (ahw->pci_func == owner)
2591 qlcnic_83xx_idc_enter_ready_state(adapter, 0);
2592
2593 qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, 0);
2594 }