0001
0002 #include "qlge.h"
0003
0004 int qlge_unpause_mpi_risc(struct qlge_adapter *qdev)
0005 {
0006 u32 tmp;
0007
0008
0009 tmp = qlge_read32(qdev, CSR);
0010 if (!(tmp & CSR_RP))
0011 return -EIO;
0012
0013 qlge_write32(qdev, CSR, CSR_CMD_CLR_PAUSE);
0014 return 0;
0015 }
0016
0017 int qlge_pause_mpi_risc(struct qlge_adapter *qdev)
0018 {
0019 u32 tmp;
0020 int count;
0021
0022
0023 qlge_write32(qdev, CSR, CSR_CMD_SET_PAUSE);
0024 for (count = UDELAY_COUNT; count; count--) {
0025 tmp = qlge_read32(qdev, CSR);
0026 if (tmp & CSR_RP)
0027 break;
0028 mdelay(UDELAY_DELAY);
0029 }
0030 return (count == 0) ? -ETIMEDOUT : 0;
0031 }
0032
0033 int qlge_hard_reset_mpi_risc(struct qlge_adapter *qdev)
0034 {
0035 u32 tmp;
0036 int count;
0037
0038
0039 qlge_write32(qdev, CSR, CSR_CMD_SET_RST);
0040 for (count = UDELAY_COUNT; count; count--) {
0041 tmp = qlge_read32(qdev, CSR);
0042 if (tmp & CSR_RR) {
0043 qlge_write32(qdev, CSR, CSR_CMD_CLR_RST);
0044 break;
0045 }
0046 mdelay(UDELAY_DELAY);
0047 }
0048 return (count == 0) ? -ETIMEDOUT : 0;
0049 }
0050
0051 int qlge_read_mpi_reg(struct qlge_adapter *qdev, u32 reg, u32 *data)
0052 {
0053 int status;
0054
0055 status = qlge_wait_reg_rdy(qdev, PROC_ADDR, PROC_ADDR_RDY, PROC_ADDR_ERR);
0056 if (status)
0057 goto exit;
0058
0059 qlge_write32(qdev, PROC_ADDR, reg | PROC_ADDR_R);
0060
0061 status = qlge_wait_reg_rdy(qdev, PROC_ADDR, PROC_ADDR_RDY, PROC_ADDR_ERR);
0062 if (status)
0063 goto exit;
0064
0065 *data = qlge_read32(qdev, PROC_DATA);
0066 exit:
0067 return status;
0068 }
0069
0070 int qlge_write_mpi_reg(struct qlge_adapter *qdev, u32 reg, u32 data)
0071 {
0072 int status = 0;
0073
0074 status = qlge_wait_reg_rdy(qdev, PROC_ADDR, PROC_ADDR_RDY, PROC_ADDR_ERR);
0075 if (status)
0076 goto exit;
0077
0078 qlge_write32(qdev, PROC_DATA, data);
0079
0080 qlge_write32(qdev, PROC_ADDR, reg);
0081
0082 status = qlge_wait_reg_rdy(qdev, PROC_ADDR, PROC_ADDR_RDY, PROC_ADDR_ERR);
0083 if (status)
0084 goto exit;
0085 exit:
0086 return status;
0087 }
0088
0089 int qlge_soft_reset_mpi_risc(struct qlge_adapter *qdev)
0090 {
0091 return qlge_write_mpi_reg(qdev, 0x00001010, 1);
0092 }
0093
0094
0095
0096
0097
0098
0099 int qlge_own_firmware(struct qlge_adapter *qdev)
0100 {
0101 u32 temp;
0102
0103
0104
0105
0106
0107 if (qdev->func < qdev->alt_func)
0108 return 1;
0109
0110
0111
0112
0113
0114
0115 temp = qlge_read32(qdev, STS);
0116 if (!(temp & (1 << (8 + qdev->alt_func))))
0117 return 1;
0118
0119 return 0;
0120 }
0121
0122 static int qlge_get_mb_sts(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0123 {
0124 int i, status;
0125
0126 status = qlge_sem_spinlock(qdev, SEM_PROC_REG_MASK);
0127 if (status)
0128 return -EBUSY;
0129 for (i = 0; i < mbcp->out_count; i++) {
0130 status =
0131 qlge_read_mpi_reg(qdev, qdev->mailbox_out + i,
0132 &mbcp->mbox_out[i]);
0133 if (status) {
0134 netif_err(qdev, drv, qdev->ndev, "Failed mailbox read.\n");
0135 break;
0136 }
0137 }
0138 qlge_sem_unlock(qdev, SEM_PROC_REG_MASK);
0139 return status;
0140 }
0141
0142
0143
0144
0145 static int qlge_wait_mbx_cmd_cmplt(struct qlge_adapter *qdev)
0146 {
0147 int count;
0148 u32 value;
0149
0150 for (count = 100; count; count--) {
0151 value = qlge_read32(qdev, STS);
0152 if (value & STS_PI)
0153 return 0;
0154 mdelay(UDELAY_DELAY);
0155 }
0156 return -ETIMEDOUT;
0157 }
0158
0159
0160
0161
0162 static int qlge_exec_mb_cmd(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0163 {
0164 int i, status;
0165
0166
0167
0168
0169
0170 if (qlge_read32(qdev, CSR) & CSR_HRI)
0171 return -EIO;
0172
0173 status = qlge_sem_spinlock(qdev, SEM_PROC_REG_MASK);
0174 if (status)
0175 return status;
0176
0177
0178
0179
0180 for (i = 0; i < mbcp->in_count; i++) {
0181 status = qlge_write_mpi_reg(qdev, qdev->mailbox_in + i,
0182 mbcp->mbox_in[i]);
0183 if (status)
0184 goto end;
0185 }
0186
0187
0188
0189 qlge_write32(qdev, CSR, CSR_CMD_SET_H2R_INT);
0190 end:
0191 qlge_sem_unlock(qdev, SEM_PROC_REG_MASK);
0192 return status;
0193 }
0194
0195
0196
0197
0198
0199
0200
0201
0202 static int qlge_idc_req_aen(struct qlge_adapter *qdev)
0203 {
0204 int status;
0205 struct mbox_params *mbcp = &qdev->idc_mbc;
0206
0207 netif_err(qdev, drv, qdev->ndev, "Enter!\n");
0208
0209
0210
0211 mbcp->out_count = 4;
0212 status = qlge_get_mb_sts(qdev, mbcp);
0213 if (status) {
0214 netif_err(qdev, drv, qdev->ndev,
0215 "Could not read MPI, resetting ASIC!\n");
0216 qlge_queue_asic_error(qdev);
0217 } else {
0218
0219
0220
0221
0222 qlge_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
0223 queue_delayed_work(qdev->workqueue, &qdev->mpi_idc_work, 0);
0224 }
0225 return status;
0226 }
0227
0228
0229
0230
0231 static int qlge_idc_cmplt_aen(struct qlge_adapter *qdev)
0232 {
0233 int status;
0234 struct mbox_params *mbcp = &qdev->idc_mbc;
0235
0236 mbcp->out_count = 4;
0237 status = qlge_get_mb_sts(qdev, mbcp);
0238 if (status) {
0239 netif_err(qdev, drv, qdev->ndev,
0240 "Could not read MPI, resetting RISC!\n");
0241 qlge_queue_fw_error(qdev);
0242 } else {
0243
0244
0245
0246 complete(&qdev->ide_completion);
0247 }
0248 return status;
0249 }
0250
0251 static void qlge_link_up(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0252 {
0253 int status;
0254
0255 mbcp->out_count = 2;
0256
0257 status = qlge_get_mb_sts(qdev, mbcp);
0258 if (status) {
0259 netif_err(qdev, drv, qdev->ndev,
0260 "%s: Could not get mailbox status.\n", __func__);
0261 return;
0262 }
0263
0264 qdev->link_status = mbcp->mbox_out[1];
0265 netif_err(qdev, drv, qdev->ndev, "Link Up.\n");
0266
0267
0268
0269
0270 if (test_bit(QL_CAM_RT_SET, &qdev->flags)) {
0271 status = qlge_cam_route_initialize(qdev);
0272 if (status) {
0273 netif_err(qdev, ifup, qdev->ndev,
0274 "Failed to init CAM/Routing tables.\n");
0275 return;
0276 }
0277 clear_bit(QL_CAM_RT_SET, &qdev->flags);
0278 }
0279
0280
0281
0282
0283
0284 if (!test_bit(QL_PORT_CFG, &qdev->flags)) {
0285 netif_err(qdev, drv, qdev->ndev, "Queue Port Config Worker!\n");
0286 set_bit(QL_PORT_CFG, &qdev->flags);
0287
0288
0289
0290
0291 qlge_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
0292 queue_delayed_work(qdev->workqueue,
0293 &qdev->mpi_port_cfg_work, 0);
0294 }
0295
0296 qlge_link_on(qdev);
0297 }
0298
0299 static void qlge_link_down(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0300 {
0301 int status;
0302
0303 mbcp->out_count = 3;
0304
0305 status = qlge_get_mb_sts(qdev, mbcp);
0306 if (status)
0307 netif_err(qdev, drv, qdev->ndev, "Link down AEN broken!\n");
0308
0309 qlge_link_off(qdev);
0310 }
0311
0312 static int qlge_sfp_in(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0313 {
0314 int status;
0315
0316 mbcp->out_count = 5;
0317
0318 status = qlge_get_mb_sts(qdev, mbcp);
0319 if (status)
0320 netif_err(qdev, drv, qdev->ndev, "SFP in AEN broken!\n");
0321 else
0322 netif_err(qdev, drv, qdev->ndev, "SFP insertion detected.\n");
0323
0324 return status;
0325 }
0326
0327 static int qlge_sfp_out(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0328 {
0329 int status;
0330
0331 mbcp->out_count = 1;
0332
0333 status = qlge_get_mb_sts(qdev, mbcp);
0334 if (status)
0335 netif_err(qdev, drv, qdev->ndev, "SFP out AEN broken!\n");
0336 else
0337 netif_err(qdev, drv, qdev->ndev, "SFP removal detected.\n");
0338
0339 return status;
0340 }
0341
0342 static int qlge_aen_lost(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0343 {
0344 int status;
0345
0346 mbcp->out_count = 6;
0347
0348 status = qlge_get_mb_sts(qdev, mbcp);
0349 if (status) {
0350 netif_err(qdev, drv, qdev->ndev, "Lost AEN broken!\n");
0351 } else {
0352 int i;
0353
0354 netif_err(qdev, drv, qdev->ndev, "Lost AEN detected.\n");
0355 for (i = 0; i < mbcp->out_count; i++)
0356 netif_err(qdev, drv, qdev->ndev, "mbox_out[%d] = 0x%.08x.\n",
0357 i, mbcp->mbox_out[i]);
0358 }
0359
0360 return status;
0361 }
0362
0363 static void qlge_init_fw_done(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0364 {
0365 int status;
0366
0367 mbcp->out_count = 2;
0368
0369 status = qlge_get_mb_sts(qdev, mbcp);
0370 if (status) {
0371 netif_err(qdev, drv, qdev->ndev, "Firmware did not initialize!\n");
0372 } else {
0373 netif_err(qdev, drv, qdev->ndev, "Firmware Revision = 0x%.08x.\n",
0374 mbcp->mbox_out[1]);
0375 qdev->fw_rev_id = mbcp->mbox_out[1];
0376 status = qlge_cam_route_initialize(qdev);
0377 if (status)
0378 netif_err(qdev, ifup, qdev->ndev,
0379 "Failed to init CAM/Routing tables.\n");
0380 }
0381 }
0382
0383
0384
0385
0386
0387
0388
0389
0390 static int qlge_mpi_handler(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0391 {
0392 int status;
0393 int orig_count = mbcp->out_count;
0394
0395
0396 mbcp->out_count = 1;
0397 status = qlge_get_mb_sts(qdev, mbcp);
0398 if (status) {
0399 netif_err(qdev, drv, qdev->ndev,
0400 "Could not read MPI, resetting ASIC!\n");
0401 qlge_queue_asic_error(qdev);
0402 goto end;
0403 }
0404
0405 switch (mbcp->mbox_out[0]) {
0406
0407
0408
0409
0410 case MB_CMD_STS_INTRMDT:
0411 case MB_CMD_STS_GOOD:
0412 case MB_CMD_STS_INVLD_CMD:
0413 case MB_CMD_STS_XFC_ERR:
0414 case MB_CMD_STS_CSUM_ERR:
0415 case MB_CMD_STS_ERR:
0416 case MB_CMD_STS_PARAM_ERR:
0417
0418
0419
0420
0421
0422
0423 mbcp->out_count = orig_count;
0424 status = qlge_get_mb_sts(qdev, mbcp);
0425 return status;
0426
0427
0428
0429
0430
0431
0432 case AEN_IDC_REQ:
0433 status = qlge_idc_req_aen(qdev);
0434 break;
0435
0436
0437
0438
0439
0440
0441 case AEN_IDC_CMPLT:
0442 case AEN_IDC_EXT:
0443 status = qlge_idc_cmplt_aen(qdev);
0444 break;
0445
0446 case AEN_LINK_UP:
0447 qlge_link_up(qdev, mbcp);
0448 break;
0449
0450 case AEN_LINK_DOWN:
0451 qlge_link_down(qdev, mbcp);
0452 break;
0453
0454 case AEN_FW_INIT_DONE:
0455
0456
0457
0458 if (mbcp->mbox_in[0] == MB_CMD_EX_FW) {
0459 mbcp->out_count = orig_count;
0460 status = qlge_get_mb_sts(qdev, mbcp);
0461 mbcp->mbox_out[0] = MB_CMD_STS_GOOD;
0462 return status;
0463 }
0464 qlge_init_fw_done(qdev, mbcp);
0465 break;
0466
0467 case AEN_AEN_SFP_IN:
0468 qlge_sfp_in(qdev, mbcp);
0469 break;
0470
0471 case AEN_AEN_SFP_OUT:
0472 qlge_sfp_out(qdev, mbcp);
0473 break;
0474
0475
0476
0477
0478 case AEN_FW_INIT_FAIL:
0479
0480
0481
0482 if (mbcp->mbox_in[0] == MB_CMD_EX_FW) {
0483 mbcp->out_count = orig_count;
0484 status = qlge_get_mb_sts(qdev, mbcp);
0485 mbcp->mbox_out[0] = MB_CMD_STS_ERR;
0486 return status;
0487 }
0488 netif_err(qdev, drv, qdev->ndev,
0489 "Firmware initialization failed.\n");
0490 status = -EIO;
0491 qlge_queue_fw_error(qdev);
0492 break;
0493
0494 case AEN_SYS_ERR:
0495 netif_err(qdev, drv, qdev->ndev, "System Error.\n");
0496 qlge_queue_fw_error(qdev);
0497 status = -EIO;
0498 break;
0499
0500 case AEN_AEN_LOST:
0501 qlge_aen_lost(qdev, mbcp);
0502 break;
0503
0504 case AEN_DCBX_CHG:
0505
0506 break;
0507 default:
0508 netif_err(qdev, drv, qdev->ndev,
0509 "Unsupported AE %.08x.\n", mbcp->mbox_out[0]);
0510
0511 }
0512 end:
0513 qlge_write32(qdev, CSR, CSR_CMD_CLR_R2PCI_INT);
0514
0515
0516
0517
0518
0519
0520 mbcp->out_count = orig_count;
0521 return status;
0522 }
0523
0524
0525
0526
0527
0528
0529 static int qlge_mailbox_command(struct qlge_adapter *qdev, struct mbox_params *mbcp)
0530 {
0531 int status;
0532 unsigned long count;
0533
0534 mutex_lock(&qdev->mpi_mutex);
0535
0536
0537 qlge_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
0538
0539
0540 status = qlge_exec_mb_cmd(qdev, mbcp);
0541 if (status)
0542 goto end;
0543
0544
0545
0546
0547 if (mbcp->mbox_in[0] == MB_CMD_MAKE_SYS_ERR)
0548 goto end;
0549
0550
0551
0552
0553
0554
0555
0556 count = jiffies + HZ * MAILBOX_TIMEOUT;
0557 do {
0558
0559 status = qlge_wait_mbx_cmd_cmplt(qdev);
0560 if (status)
0561 continue;
0562
0563
0564
0565
0566
0567
0568 status = qlge_mpi_handler(qdev, mbcp);
0569 if (status)
0570 goto end;
0571
0572
0573
0574
0575
0576 if (((mbcp->mbox_out[0] & 0x0000f000) ==
0577 MB_CMD_STS_GOOD) ||
0578 ((mbcp->mbox_out[0] & 0x0000f000) ==
0579 MB_CMD_STS_INTRMDT))
0580 goto done;
0581 } while (time_before(jiffies, count));
0582
0583 netif_err(qdev, drv, qdev->ndev,
0584 "Timed out waiting for mailbox complete.\n");
0585 status = -ETIMEDOUT;
0586 goto end;
0587
0588 done:
0589
0590
0591
0592
0593 qlge_write32(qdev, CSR, CSR_CMD_CLR_R2PCI_INT);
0594
0595 if (((mbcp->mbox_out[0] & 0x0000f000) !=
0596 MB_CMD_STS_GOOD) &&
0597 ((mbcp->mbox_out[0] & 0x0000f000) !=
0598 MB_CMD_STS_INTRMDT)) {
0599 status = -EIO;
0600 }
0601 end:
0602
0603 qlge_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
0604 mutex_unlock(&qdev->mpi_mutex);
0605 return status;
0606 }
0607
0608
0609
0610
0611
0612 int qlge_mb_about_fw(struct qlge_adapter *qdev)
0613 {
0614 struct mbox_params mbc;
0615 struct mbox_params *mbcp = &mbc;
0616 int status = 0;
0617
0618 memset(mbcp, 0, sizeof(struct mbox_params));
0619
0620 mbcp->in_count = 1;
0621 mbcp->out_count = 3;
0622
0623 mbcp->mbox_in[0] = MB_CMD_ABOUT_FW;
0624
0625 status = qlge_mailbox_command(qdev, mbcp);
0626 if (status)
0627 return status;
0628
0629 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0630 netif_err(qdev, drv, qdev->ndev,
0631 "Failed about firmware command\n");
0632 status = -EIO;
0633 }
0634
0635
0636 qdev->fw_rev_id = mbcp->mbox_out[1];
0637
0638 return status;
0639 }
0640
0641
0642
0643
0644 int qlge_mb_get_fw_state(struct qlge_adapter *qdev)
0645 {
0646 struct mbox_params mbc;
0647 struct mbox_params *mbcp = &mbc;
0648 int status = 0;
0649
0650 memset(mbcp, 0, sizeof(struct mbox_params));
0651
0652 mbcp->in_count = 1;
0653 mbcp->out_count = 2;
0654
0655 mbcp->mbox_in[0] = MB_CMD_GET_FW_STATE;
0656
0657 status = qlge_mailbox_command(qdev, mbcp);
0658 if (status)
0659 return status;
0660
0661 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0662 netif_err(qdev, drv, qdev->ndev,
0663 "Failed Get Firmware State.\n");
0664 status = -EIO;
0665 }
0666
0667
0668
0669
0670
0671 if (mbcp->mbox_out[1] & 1) {
0672 netif_err(qdev, drv, qdev->ndev,
0673 "Firmware waiting for initialization.\n");
0674 status = -EIO;
0675 }
0676
0677 return status;
0678 }
0679
0680
0681
0682
0683 static int qlge_mb_idc_ack(struct qlge_adapter *qdev)
0684 {
0685 struct mbox_params mbc;
0686 struct mbox_params *mbcp = &mbc;
0687 int status = 0;
0688
0689 memset(mbcp, 0, sizeof(struct mbox_params));
0690
0691 mbcp->in_count = 5;
0692 mbcp->out_count = 1;
0693
0694 mbcp->mbox_in[0] = MB_CMD_IDC_ACK;
0695 mbcp->mbox_in[1] = qdev->idc_mbc.mbox_out[1];
0696 mbcp->mbox_in[2] = qdev->idc_mbc.mbox_out[2];
0697 mbcp->mbox_in[3] = qdev->idc_mbc.mbox_out[3];
0698 mbcp->mbox_in[4] = qdev->idc_mbc.mbox_out[4];
0699
0700 status = qlge_mailbox_command(qdev, mbcp);
0701 if (status)
0702 return status;
0703
0704 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0705 netif_err(qdev, drv, qdev->ndev, "Failed IDC ACK send.\n");
0706 status = -EIO;
0707 }
0708 return status;
0709 }
0710
0711
0712
0713
0714
0715 int qlge_mb_set_port_cfg(struct qlge_adapter *qdev)
0716 {
0717 struct mbox_params mbc;
0718 struct mbox_params *mbcp = &mbc;
0719 int status = 0;
0720
0721 memset(mbcp, 0, sizeof(struct mbox_params));
0722
0723 mbcp->in_count = 3;
0724 mbcp->out_count = 1;
0725
0726 mbcp->mbox_in[0] = MB_CMD_SET_PORT_CFG;
0727 mbcp->mbox_in[1] = qdev->link_config;
0728 mbcp->mbox_in[2] = qdev->max_frame_size;
0729
0730 status = qlge_mailbox_command(qdev, mbcp);
0731 if (status)
0732 return status;
0733
0734 if (mbcp->mbox_out[0] == MB_CMD_STS_INTRMDT) {
0735 netif_err(qdev, drv, qdev->ndev,
0736 "Port Config sent, wait for IDC.\n");
0737 } else if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0738 netif_err(qdev, drv, qdev->ndev,
0739 "Failed Set Port Configuration.\n");
0740 status = -EIO;
0741 }
0742 return status;
0743 }
0744
0745 static int qlge_mb_dump_ram(struct qlge_adapter *qdev, u64 req_dma, u32 addr,
0746 u32 size)
0747 {
0748 int status = 0;
0749 struct mbox_params mbc;
0750 struct mbox_params *mbcp = &mbc;
0751
0752 memset(mbcp, 0, sizeof(struct mbox_params));
0753
0754 mbcp->in_count = 9;
0755 mbcp->out_count = 1;
0756
0757 mbcp->mbox_in[0] = MB_CMD_DUMP_RISC_RAM;
0758 mbcp->mbox_in[1] = LSW(addr);
0759 mbcp->mbox_in[2] = MSW(req_dma);
0760 mbcp->mbox_in[3] = LSW(req_dma);
0761 mbcp->mbox_in[4] = MSW(size);
0762 mbcp->mbox_in[5] = LSW(size);
0763 mbcp->mbox_in[6] = MSW(MSD(req_dma));
0764 mbcp->mbox_in[7] = LSW(MSD(req_dma));
0765 mbcp->mbox_in[8] = MSW(addr);
0766
0767 status = qlge_mailbox_command(qdev, mbcp);
0768 if (status)
0769 return status;
0770
0771 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0772 netif_err(qdev, drv, qdev->ndev, "Failed to dump risc RAM.\n");
0773 status = -EIO;
0774 }
0775 return status;
0776 }
0777
0778
0779 int qlge_dump_risc_ram_area(struct qlge_adapter *qdev, void *buf,
0780 u32 ram_addr, int word_count)
0781 {
0782 int status;
0783 char *my_buf;
0784 dma_addr_t buf_dma;
0785
0786 my_buf = dma_alloc_coherent(&qdev->pdev->dev,
0787 word_count * sizeof(u32), &buf_dma,
0788 GFP_ATOMIC);
0789 if (!my_buf)
0790 return -EIO;
0791
0792 status = qlge_mb_dump_ram(qdev, buf_dma, ram_addr, word_count);
0793 if (!status)
0794 memcpy(buf, my_buf, word_count * sizeof(u32));
0795
0796 dma_free_coherent(&qdev->pdev->dev, word_count * sizeof(u32), my_buf,
0797 buf_dma);
0798 return status;
0799 }
0800
0801
0802
0803
0804
0805 int qlge_mb_get_port_cfg(struct qlge_adapter *qdev)
0806 {
0807 struct mbox_params mbc;
0808 struct mbox_params *mbcp = &mbc;
0809 int status = 0;
0810
0811 memset(mbcp, 0, sizeof(struct mbox_params));
0812
0813 mbcp->in_count = 1;
0814 mbcp->out_count = 3;
0815
0816 mbcp->mbox_in[0] = MB_CMD_GET_PORT_CFG;
0817
0818 status = qlge_mailbox_command(qdev, mbcp);
0819 if (status)
0820 return status;
0821
0822 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0823 netif_err(qdev, drv, qdev->ndev,
0824 "Failed Get Port Configuration.\n");
0825 status = -EIO;
0826 } else {
0827 netif_printk(qdev, drv, KERN_DEBUG, qdev->ndev,
0828 "Passed Get Port Configuration.\n");
0829 qdev->link_config = mbcp->mbox_out[1];
0830 qdev->max_frame_size = mbcp->mbox_out[2];
0831 }
0832 return status;
0833 }
0834
0835 int qlge_mb_wol_mode(struct qlge_adapter *qdev, u32 wol)
0836 {
0837 struct mbox_params mbc;
0838 struct mbox_params *mbcp = &mbc;
0839 int status;
0840
0841 memset(mbcp, 0, sizeof(struct mbox_params));
0842
0843 mbcp->in_count = 2;
0844 mbcp->out_count = 1;
0845
0846 mbcp->mbox_in[0] = MB_CMD_SET_WOL_MODE;
0847 mbcp->mbox_in[1] = wol;
0848
0849 status = qlge_mailbox_command(qdev, mbcp);
0850 if (status)
0851 return status;
0852
0853 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0854 netif_err(qdev, drv, qdev->ndev, "Failed to set WOL mode.\n");
0855 status = -EIO;
0856 }
0857 return status;
0858 }
0859
0860 int qlge_mb_wol_set_magic(struct qlge_adapter *qdev, u32 enable_wol)
0861 {
0862 struct mbox_params mbc;
0863 struct mbox_params *mbcp = &mbc;
0864 int status;
0865 const u8 *addr = qdev->ndev->dev_addr;
0866
0867 memset(mbcp, 0, sizeof(struct mbox_params));
0868
0869 mbcp->in_count = 8;
0870 mbcp->out_count = 1;
0871
0872 mbcp->mbox_in[0] = MB_CMD_SET_WOL_MAGIC;
0873 if (enable_wol) {
0874 mbcp->mbox_in[1] = (u32)addr[0];
0875 mbcp->mbox_in[2] = (u32)addr[1];
0876 mbcp->mbox_in[3] = (u32)addr[2];
0877 mbcp->mbox_in[4] = (u32)addr[3];
0878 mbcp->mbox_in[5] = (u32)addr[4];
0879 mbcp->mbox_in[6] = (u32)addr[5];
0880 mbcp->mbox_in[7] = 0;
0881 } else {
0882 mbcp->mbox_in[1] = 0;
0883 mbcp->mbox_in[2] = 1;
0884 mbcp->mbox_in[3] = 1;
0885 mbcp->mbox_in[4] = 1;
0886 mbcp->mbox_in[5] = 1;
0887 mbcp->mbox_in[6] = 1;
0888 mbcp->mbox_in[7] = 0;
0889 }
0890
0891 status = qlge_mailbox_command(qdev, mbcp);
0892 if (status)
0893 return status;
0894
0895 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0896 netif_err(qdev, drv, qdev->ndev, "Failed to set WOL mode.\n");
0897 status = -EIO;
0898 }
0899 return status;
0900 }
0901
0902
0903
0904
0905
0906
0907
0908
0909 static int qlge_idc_wait(struct qlge_adapter *qdev)
0910 {
0911 int status = -ETIMEDOUT;
0912 struct mbox_params *mbcp = &qdev->idc_mbc;
0913 long wait_time;
0914
0915 for (wait_time = 1 * HZ; wait_time;) {
0916
0917
0918
0919 wait_time =
0920 wait_for_completion_timeout(&qdev->ide_completion,
0921 wait_time);
0922 if (!wait_time) {
0923 netif_err(qdev, drv, qdev->ndev, "IDC Timeout.\n");
0924 break;
0925 }
0926
0927
0928
0929
0930 if (mbcp->mbox_out[0] == AEN_IDC_EXT) {
0931 netif_err(qdev, drv, qdev->ndev,
0932 "IDC Time Extension from function.\n");
0933 wait_time += (mbcp->mbox_out[1] >> 8) & 0x0000000f;
0934 } else if (mbcp->mbox_out[0] == AEN_IDC_CMPLT) {
0935 netif_err(qdev, drv, qdev->ndev, "IDC Success.\n");
0936 status = 0;
0937 break;
0938 } else {
0939 netif_err(qdev, drv, qdev->ndev,
0940 "IDC: Invalid State 0x%.04x.\n",
0941 mbcp->mbox_out[0]);
0942 status = -EIO;
0943 break;
0944 }
0945 }
0946
0947 return status;
0948 }
0949
0950 int qlge_mb_set_led_cfg(struct qlge_adapter *qdev, u32 led_config)
0951 {
0952 struct mbox_params mbc;
0953 struct mbox_params *mbcp = &mbc;
0954 int status;
0955
0956 memset(mbcp, 0, sizeof(struct mbox_params));
0957
0958 mbcp->in_count = 2;
0959 mbcp->out_count = 1;
0960
0961 mbcp->mbox_in[0] = MB_CMD_SET_LED_CFG;
0962 mbcp->mbox_in[1] = led_config;
0963
0964 status = qlge_mailbox_command(qdev, mbcp);
0965 if (status)
0966 return status;
0967
0968 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0969 netif_err(qdev, drv, qdev->ndev,
0970 "Failed to set LED Configuration.\n");
0971 status = -EIO;
0972 }
0973
0974 return status;
0975 }
0976
0977 int qlge_mb_get_led_cfg(struct qlge_adapter *qdev)
0978 {
0979 struct mbox_params mbc;
0980 struct mbox_params *mbcp = &mbc;
0981 int status;
0982
0983 memset(mbcp, 0, sizeof(struct mbox_params));
0984
0985 mbcp->in_count = 1;
0986 mbcp->out_count = 2;
0987
0988 mbcp->mbox_in[0] = MB_CMD_GET_LED_CFG;
0989
0990 status = qlge_mailbox_command(qdev, mbcp);
0991 if (status)
0992 return status;
0993
0994 if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
0995 netif_err(qdev, drv, qdev->ndev,
0996 "Failed to get LED Configuration.\n");
0997 status = -EIO;
0998 } else {
0999 qdev->led_config = mbcp->mbox_out[1];
1000 }
1001 return status;
1002 }
1003
1004 int qlge_mb_set_mgmnt_traffic_ctl(struct qlge_adapter *qdev, u32 control)
1005 {
1006 struct mbox_params mbc;
1007 struct mbox_params *mbcp = &mbc;
1008 int status;
1009
1010 memset(mbcp, 0, sizeof(struct mbox_params));
1011
1012 mbcp->in_count = 1;
1013 mbcp->out_count = 2;
1014
1015 mbcp->mbox_in[0] = MB_CMD_SET_MGMNT_TFK_CTL;
1016 mbcp->mbox_in[1] = control;
1017
1018 status = qlge_mailbox_command(qdev, mbcp);
1019 if (status)
1020 return status;
1021
1022 if (mbcp->mbox_out[0] == MB_CMD_STS_GOOD)
1023 return status;
1024
1025 if (mbcp->mbox_out[0] == MB_CMD_STS_INVLD_CMD) {
1026 netif_err(qdev, drv, qdev->ndev,
1027 "Command not supported by firmware.\n");
1028 status = -EINVAL;
1029 } else if (mbcp->mbox_out[0] == MB_CMD_STS_ERR) {
1030
1031
1032
1033
1034 netif_err(qdev, drv, qdev->ndev,
1035 "Command parameters make no change.\n");
1036 }
1037 return status;
1038 }
1039
1040
1041 static int qlge_mb_get_mgmnt_traffic_ctl(struct qlge_adapter *qdev, u32 *control)
1042 {
1043 struct mbox_params mbc;
1044 struct mbox_params *mbcp = &mbc;
1045 int status;
1046
1047 memset(mbcp, 0, sizeof(struct mbox_params));
1048 *control = 0;
1049
1050 mbcp->in_count = 1;
1051 mbcp->out_count = 1;
1052
1053 mbcp->mbox_in[0] = MB_CMD_GET_MGMNT_TFK_CTL;
1054
1055 status = qlge_mailbox_command(qdev, mbcp);
1056 if (status)
1057 return status;
1058
1059 if (mbcp->mbox_out[0] == MB_CMD_STS_GOOD) {
1060 *control = mbcp->mbox_in[1];
1061 return status;
1062 }
1063
1064 if (mbcp->mbox_out[0] == MB_CMD_STS_INVLD_CMD) {
1065 netif_err(qdev, drv, qdev->ndev,
1066 "Command not supported by firmware.\n");
1067 status = -EINVAL;
1068 } else if (mbcp->mbox_out[0] == MB_CMD_STS_ERR) {
1069 netif_err(qdev, drv, qdev->ndev,
1070 "Failed to get MPI traffic control.\n");
1071 status = -EIO;
1072 }
1073 return status;
1074 }
1075
1076 int qlge_wait_fifo_empty(struct qlge_adapter *qdev)
1077 {
1078 int count;
1079 u32 mgmnt_fifo_empty;
1080 u32 nic_fifo_empty;
1081
1082 for (count = 6; count; count--) {
1083 nic_fifo_empty = qlge_read32(qdev, STS) & STS_NFE;
1084 qlge_mb_get_mgmnt_traffic_ctl(qdev, &mgmnt_fifo_empty);
1085 mgmnt_fifo_empty &= MB_GET_MPI_TFK_FIFO_EMPTY;
1086 if (nic_fifo_empty && mgmnt_fifo_empty)
1087 return 0;
1088 msleep(100);
1089 }
1090 return -ETIMEDOUT;
1091 }
1092
1093
1094
1095
1096 static int qlge_set_port_cfg(struct qlge_adapter *qdev)
1097 {
1098 int status;
1099
1100 status = qlge_mb_set_port_cfg(qdev);
1101 if (status)
1102 return status;
1103 status = qlge_idc_wait(qdev);
1104 return status;
1105 }
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115 void qlge_mpi_port_cfg_work(struct work_struct *work)
1116 {
1117 struct qlge_adapter *qdev =
1118 container_of(work, struct qlge_adapter, mpi_port_cfg_work.work);
1119 int status;
1120
1121 status = qlge_mb_get_port_cfg(qdev);
1122 if (status) {
1123 netif_err(qdev, drv, qdev->ndev,
1124 "Bug: Failed to get port config data.\n");
1125 goto err;
1126 }
1127
1128 if (qdev->link_config & CFG_JUMBO_FRAME_SIZE &&
1129 qdev->max_frame_size == CFG_DEFAULT_MAX_FRAME_SIZE)
1130 goto end;
1131
1132 qdev->link_config |= CFG_JUMBO_FRAME_SIZE;
1133 qdev->max_frame_size = CFG_DEFAULT_MAX_FRAME_SIZE;
1134 status = qlge_set_port_cfg(qdev);
1135 if (status) {
1136 netif_err(qdev, drv, qdev->ndev,
1137 "Bug: Failed to set port config data.\n");
1138 goto err;
1139 }
1140 end:
1141 clear_bit(QL_PORT_CFG, &qdev->flags);
1142 return;
1143 err:
1144 qlge_queue_fw_error(qdev);
1145 goto end;
1146 }
1147
1148
1149
1150
1151
1152
1153
1154 void qlge_mpi_idc_work(struct work_struct *work)
1155 {
1156 struct qlge_adapter *qdev =
1157 container_of(work, struct qlge_adapter, mpi_idc_work.work);
1158 int status;
1159 struct mbox_params *mbcp = &qdev->idc_mbc;
1160 u32 aen;
1161 int timeout;
1162
1163 aen = mbcp->mbox_out[1] >> 16;
1164 timeout = (mbcp->mbox_out[1] >> 8) & 0xf;
1165
1166 switch (aen) {
1167 default:
1168 netif_err(qdev, drv, qdev->ndev,
1169 "Bug: Unhandled IDC action.\n");
1170 break;
1171 case MB_CMD_PORT_RESET:
1172 case MB_CMD_STOP_FW:
1173 qlge_link_off(qdev);
1174 fallthrough;
1175 case MB_CMD_SET_PORT_CFG:
1176
1177
1178
1179
1180 set_bit(QL_CAM_RT_SET, &qdev->flags);
1181
1182 if (timeout) {
1183 status = qlge_mb_idc_ack(qdev);
1184 if (status)
1185 netif_err(qdev, drv, qdev->ndev,
1186 "Bug: No pending IDC!\n");
1187 } else {
1188 netif_printk(qdev, drv, KERN_DEBUG, qdev->ndev,
1189 "IDC ACK not required\n");
1190 status = 0;
1191 }
1192 break;
1193
1194
1195
1196
1197
1198
1199
1200 case MB_CMD_IOP_RESTART_MPI:
1201 case MB_CMD_IOP_PREP_LINK_DOWN:
1202
1203
1204
1205 qlge_link_off(qdev);
1206 set_bit(QL_CAM_RT_SET, &qdev->flags);
1207 fallthrough;
1208 case MB_CMD_IOP_DVR_START:
1209 case MB_CMD_IOP_FLASH_ACC:
1210 case MB_CMD_IOP_CORE_DUMP_MPI:
1211 case MB_CMD_IOP_PREP_UPDATE_MPI:
1212 case MB_CMD_IOP_COMP_UPDATE_MPI:
1213 case MB_CMD_IOP_NONE:
1214
1215 if (timeout) {
1216 status = qlge_mb_idc_ack(qdev);
1217 if (status)
1218 netif_err(qdev, drv, qdev->ndev,
1219 "Bug: No pending IDC!\n");
1220 } else {
1221 netif_printk(qdev, drv, KERN_DEBUG, qdev->ndev,
1222 "IDC ACK not required\n");
1223 status = 0;
1224 }
1225 break;
1226 }
1227 }
1228
1229 void qlge_mpi_work(struct work_struct *work)
1230 {
1231 struct qlge_adapter *qdev =
1232 container_of(work, struct qlge_adapter, mpi_work.work);
1233 struct mbox_params mbc;
1234 struct mbox_params *mbcp = &mbc;
1235 int err = 0;
1236
1237 mutex_lock(&qdev->mpi_mutex);
1238
1239 qlge_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
1240
1241 while (qlge_read32(qdev, STS) & STS_PI) {
1242 memset(mbcp, 0, sizeof(struct mbox_params));
1243 mbcp->out_count = 1;
1244
1245
1246
1247 err = qlge_mpi_handler(qdev, mbcp);
1248 if (err)
1249 break;
1250 }
1251
1252
1253 qlge_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
1254 mutex_unlock(&qdev->mpi_mutex);
1255 }
1256
1257 void qlge_mpi_reset_work(struct work_struct *work)
1258 {
1259 struct qlge_adapter *qdev =
1260 container_of(work, struct qlge_adapter, mpi_reset_work.work);
1261 cancel_delayed_work_sync(&qdev->mpi_work);
1262 cancel_delayed_work_sync(&qdev->mpi_port_cfg_work);
1263 cancel_delayed_work_sync(&qdev->mpi_idc_work);
1264
1265
1266
1267 if (!qlge_own_firmware(qdev)) {
1268 netif_err(qdev, drv, qdev->ndev, "Don't own firmware!\n");
1269 return;
1270 }
1271
1272 qlge_soft_reset_mpi_risc(qdev);
1273 }