0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065 #include "qla_def.h"
0066
0067 #include <linux/delay.h>
0068 #define CREATE_TRACE_POINTS
0069 #include <trace/events/qla.h>
0070
0071 static uint32_t ql_dbg_offset = 0x800;
0072
0073 static inline void
0074 qla2xxx_prep_dump(struct qla_hw_data *ha, struct qla2xxx_fw_dump *fw_dump)
0075 {
0076 fw_dump->fw_major_version = htonl(ha->fw_major_version);
0077 fw_dump->fw_minor_version = htonl(ha->fw_minor_version);
0078 fw_dump->fw_subminor_version = htonl(ha->fw_subminor_version);
0079 fw_dump->fw_attributes = htonl(ha->fw_attributes);
0080
0081 fw_dump->vendor = htonl(ha->pdev->vendor);
0082 fw_dump->device = htonl(ha->pdev->device);
0083 fw_dump->subsystem_vendor = htonl(ha->pdev->subsystem_vendor);
0084 fw_dump->subsystem_device = htonl(ha->pdev->subsystem_device);
0085 }
0086
0087 static inline void *
0088 qla2xxx_copy_queues(struct qla_hw_data *ha, void *ptr)
0089 {
0090 struct req_que *req = ha->req_q_map[0];
0091 struct rsp_que *rsp = ha->rsp_q_map[0];
0092
0093 memcpy(ptr, req->ring, req->length *
0094 sizeof(request_t));
0095
0096
0097 ptr += req->length * sizeof(request_t);
0098 memcpy(ptr, rsp->ring, rsp->length *
0099 sizeof(response_t));
0100
0101 return ptr + (rsp->length * sizeof(response_t));
0102 }
0103
0104 int
0105 qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
0106 uint32_t ram_dwords, void **nxt)
0107 {
0108 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
0109 dma_addr_t dump_dma = ha->gid_list_dma;
0110 uint32_t *chunk = (uint32_t *)ha->gid_list;
0111 uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
0112 uint32_t stat;
0113 ulong i, j, timer = 6000000;
0114 int rval = QLA_FUNCTION_FAILED;
0115 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
0116
0117 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
0118
0119 if (qla_pci_disconnected(vha, reg))
0120 return rval;
0121
0122 for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
0123 if (i + dwords > ram_dwords)
0124 dwords = ram_dwords - i;
0125
0126 wrt_reg_word(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
0127 wrt_reg_word(®->mailbox1, LSW(addr));
0128 wrt_reg_word(®->mailbox8, MSW(addr));
0129
0130 wrt_reg_word(®->mailbox2, MSW(LSD(dump_dma)));
0131 wrt_reg_word(®->mailbox3, LSW(LSD(dump_dma)));
0132 wrt_reg_word(®->mailbox6, MSW(MSD(dump_dma)));
0133 wrt_reg_word(®->mailbox7, LSW(MSD(dump_dma)));
0134
0135 wrt_reg_word(®->mailbox4, MSW(dwords));
0136 wrt_reg_word(®->mailbox5, LSW(dwords));
0137
0138 wrt_reg_word(®->mailbox9, 0);
0139 wrt_reg_dword(®->hccr, HCCRX_SET_HOST_INT);
0140
0141 ha->flags.mbox_int = 0;
0142 while (timer--) {
0143 udelay(5);
0144
0145 if (qla_pci_disconnected(vha, reg))
0146 return rval;
0147
0148 stat = rd_reg_dword(®->host_status);
0149
0150 if (!(stat & HSRX_RISC_INT))
0151 continue;
0152
0153 stat &= 0xff;
0154 if (stat != 0x1 && stat != 0x2 &&
0155 stat != 0x10 && stat != 0x11) {
0156
0157
0158 wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_INT);
0159 rd_reg_dword(®->hccr);
0160 continue;
0161 }
0162
0163 set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
0164 rval = rd_reg_word(®->mailbox0) & MBS_MASK;
0165 wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_INT);
0166 rd_reg_dword(®->hccr);
0167 break;
0168 }
0169 ha->flags.mbox_int = 1;
0170 *nxt = ram + i;
0171
0172 if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
0173
0174 return rval;
0175 }
0176 if (rval) {
0177
0178 return rval;
0179 }
0180 for (j = 0; j < dwords; j++) {
0181 ram[i + j] =
0182 (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ?
0183 chunk[j] : swab32(chunk[j]);
0184 }
0185 }
0186
0187 *nxt = ram + i;
0188 return QLA_SUCCESS;
0189 }
0190
0191 int
0192 qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, __be32 *ram,
0193 uint32_t ram_dwords, void **nxt)
0194 {
0195 int rval = QLA_FUNCTION_FAILED;
0196 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
0197 dma_addr_t dump_dma = ha->gid_list_dma;
0198 uint32_t *chunk = (uint32_t *)ha->gid_list;
0199 uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
0200 uint32_t stat;
0201 ulong i, j, timer = 6000000;
0202 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
0203
0204 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
0205
0206 if (qla_pci_disconnected(vha, reg))
0207 return rval;
0208
0209 for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
0210 if (i + dwords > ram_dwords)
0211 dwords = ram_dwords - i;
0212
0213 wrt_reg_word(®->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED);
0214 wrt_reg_word(®->mailbox1, LSW(addr));
0215 wrt_reg_word(®->mailbox8, MSW(addr));
0216 wrt_reg_word(®->mailbox10, 0);
0217
0218 wrt_reg_word(®->mailbox2, MSW(LSD(dump_dma)));
0219 wrt_reg_word(®->mailbox3, LSW(LSD(dump_dma)));
0220 wrt_reg_word(®->mailbox6, MSW(MSD(dump_dma)));
0221 wrt_reg_word(®->mailbox7, LSW(MSD(dump_dma)));
0222
0223 wrt_reg_word(®->mailbox4, MSW(dwords));
0224 wrt_reg_word(®->mailbox5, LSW(dwords));
0225 wrt_reg_dword(®->hccr, HCCRX_SET_HOST_INT);
0226
0227 ha->flags.mbox_int = 0;
0228 while (timer--) {
0229 udelay(5);
0230 if (qla_pci_disconnected(vha, reg))
0231 return rval;
0232
0233 stat = rd_reg_dword(®->host_status);
0234
0235 if (!(stat & HSRX_RISC_INT))
0236 continue;
0237
0238 stat &= 0xff;
0239 if (stat != 0x1 && stat != 0x2 &&
0240 stat != 0x10 && stat != 0x11) {
0241 wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_INT);
0242 rd_reg_dword(®->hccr);
0243 continue;
0244 }
0245
0246 set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
0247 rval = rd_reg_word(®->mailbox0) & MBS_MASK;
0248 wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_INT);
0249 rd_reg_dword(®->hccr);
0250 break;
0251 }
0252 ha->flags.mbox_int = 1;
0253 *nxt = ram + i;
0254
0255 if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
0256
0257 return rval;
0258 }
0259 if (rval) {
0260
0261 return rval;
0262 }
0263 for (j = 0; j < dwords; j++) {
0264 ram[i + j] = (__force __be32)
0265 ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) ?
0266 chunk[j] : swab32(chunk[j]));
0267 }
0268 }
0269
0270 *nxt = ram + i;
0271 return QLA_SUCCESS;
0272 }
0273
0274 static int
0275 qla24xx_dump_memory(struct qla_hw_data *ha, __be32 *code_ram,
0276 uint32_t cram_size, void **nxt)
0277 {
0278 int rval;
0279
0280
0281 rval = qla24xx_dump_ram(ha, 0x20000, code_ram, cram_size / 4, nxt);
0282 if (rval != QLA_SUCCESS)
0283 return rval;
0284
0285 set_bit(RISC_SRAM_DUMP_CMPL, &ha->fw_dump_cap_flags);
0286
0287
0288 rval = qla24xx_dump_ram(ha, 0x100000, *nxt,
0289 ha->fw_memory_size - 0x100000 + 1, nxt);
0290 if (rval == QLA_SUCCESS)
0291 set_bit(RISC_EXT_MEM_DUMP_CMPL, &ha->fw_dump_cap_flags);
0292
0293 return rval;
0294 }
0295
0296 static __be32 *
0297 qla24xx_read_window(struct device_reg_24xx __iomem *reg, uint32_t iobase,
0298 uint32_t count, __be32 *buf)
0299 {
0300 __le32 __iomem *dmp_reg;
0301
0302 wrt_reg_dword(®->iobase_addr, iobase);
0303 dmp_reg = ®->iobase_window;
0304 for ( ; count--; dmp_reg++)
0305 *buf++ = htonl(rd_reg_dword(dmp_reg));
0306
0307 return buf;
0308 }
0309
0310 void
0311 qla24xx_pause_risc(struct device_reg_24xx __iomem *reg, struct qla_hw_data *ha)
0312 {
0313 wrt_reg_dword(®->hccr, HCCRX_SET_RISC_PAUSE);
0314
0315
0316 udelay(100);
0317 if (rd_reg_dword(®->host_status) & HSRX_RISC_PAUSED)
0318 set_bit(RISC_PAUSE_CMPL, &ha->fw_dump_cap_flags);
0319 }
0320
0321 int
0322 qla24xx_soft_reset(struct qla_hw_data *ha)
0323 {
0324 int rval = QLA_SUCCESS;
0325 uint32_t cnt;
0326 uint16_t wd;
0327 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
0328
0329
0330
0331
0332
0333
0334 wrt_reg_dword(®->ctrl_status, CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
0335 for (cnt = 0; cnt < 30000; cnt++) {
0336 if ((rd_reg_dword(®->ctrl_status) & CSRX_DMA_ACTIVE) == 0)
0337 break;
0338
0339 udelay(10);
0340 }
0341 if (!(rd_reg_dword(®->ctrl_status) & CSRX_DMA_ACTIVE))
0342 set_bit(DMA_SHUTDOWN_CMPL, &ha->fw_dump_cap_flags);
0343
0344 wrt_reg_dword(®->ctrl_status,
0345 CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
0346 pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
0347
0348 udelay(100);
0349
0350
0351 for (cnt = 0; cnt < 30000; cnt++) {
0352 if ((rd_reg_dword(®->ctrl_status) &
0353 CSRX_ISP_SOFT_RESET) == 0)
0354 break;
0355
0356 udelay(10);
0357 }
0358 if (!(rd_reg_dword(®->ctrl_status) & CSRX_ISP_SOFT_RESET))
0359 set_bit(ISP_RESET_CMPL, &ha->fw_dump_cap_flags);
0360
0361 wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_RESET);
0362 rd_reg_dword(®->hccr);
0363
0364 for (cnt = 10000; rd_reg_word(®->mailbox0) != 0 &&
0365 rval == QLA_SUCCESS; cnt--) {
0366 if (cnt)
0367 udelay(10);
0368 else
0369 rval = QLA_FUNCTION_TIMEOUT;
0370 }
0371 if (rval == QLA_SUCCESS)
0372 set_bit(RISC_RDY_AFT_RESET, &ha->fw_dump_cap_flags);
0373
0374 return rval;
0375 }
0376
0377 static int
0378 qla2xxx_dump_ram(struct qla_hw_data *ha, uint32_t addr, __be16 *ram,
0379 uint32_t ram_words, void **nxt)
0380 {
0381 int rval;
0382 uint32_t cnt, stat, timer, words, idx;
0383 uint16_t mb0;
0384 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
0385 dma_addr_t dump_dma = ha->gid_list_dma;
0386 __le16 *dump = (__force __le16 *)ha->gid_list;
0387
0388 rval = QLA_SUCCESS;
0389 mb0 = 0;
0390
0391 WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED);
0392 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
0393
0394 words = qla2x00_gid_list_size(ha) / 2;
0395 for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS;
0396 cnt += words, addr += words) {
0397 if (cnt + words > ram_words)
0398 words = ram_words - cnt;
0399
0400 WRT_MAILBOX_REG(ha, reg, 1, LSW(addr));
0401 WRT_MAILBOX_REG(ha, reg, 8, MSW(addr));
0402
0403 WRT_MAILBOX_REG(ha, reg, 2, MSW(dump_dma));
0404 WRT_MAILBOX_REG(ha, reg, 3, LSW(dump_dma));
0405 WRT_MAILBOX_REG(ha, reg, 6, MSW(MSD(dump_dma)));
0406 WRT_MAILBOX_REG(ha, reg, 7, LSW(MSD(dump_dma)));
0407
0408 WRT_MAILBOX_REG(ha, reg, 4, words);
0409 wrt_reg_word(®->hccr, HCCR_SET_HOST_INT);
0410
0411 for (timer = 6000000; timer; timer--) {
0412
0413 stat = rd_reg_dword(®->u.isp2300.host_status);
0414 if (stat & HSR_RISC_INT) {
0415 stat &= 0xff;
0416
0417 if (stat == 0x1 || stat == 0x2) {
0418 set_bit(MBX_INTERRUPT,
0419 &ha->mbx_cmd_flags);
0420
0421 mb0 = RD_MAILBOX_REG(ha, reg, 0);
0422
0423
0424 wrt_reg_word(®->semaphore, 0);
0425 wrt_reg_word(®->hccr,
0426 HCCR_CLR_RISC_INT);
0427 rd_reg_word(®->hccr);
0428 break;
0429 } else if (stat == 0x10 || stat == 0x11) {
0430 set_bit(MBX_INTERRUPT,
0431 &ha->mbx_cmd_flags);
0432
0433 mb0 = RD_MAILBOX_REG(ha, reg, 0);
0434
0435 wrt_reg_word(®->hccr,
0436 HCCR_CLR_RISC_INT);
0437 rd_reg_word(®->hccr);
0438 break;
0439 }
0440
0441
0442 wrt_reg_word(®->hccr, HCCR_CLR_RISC_INT);
0443 rd_reg_word(®->hccr);
0444 }
0445 udelay(5);
0446 }
0447
0448 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
0449 rval = mb0 & MBS_MASK;
0450 for (idx = 0; idx < words; idx++)
0451 ram[cnt + idx] =
0452 cpu_to_be16(le16_to_cpu(dump[idx]));
0453 } else {
0454 rval = QLA_FUNCTION_FAILED;
0455 }
0456 }
0457
0458 *nxt = rval == QLA_SUCCESS ? &ram[cnt] : NULL;
0459 return rval;
0460 }
0461
0462 static inline void
0463 qla2xxx_read_window(struct device_reg_2xxx __iomem *reg, uint32_t count,
0464 __be16 *buf)
0465 {
0466 __le16 __iomem *dmp_reg = ®->u.isp2300.fb_cmd;
0467
0468 for ( ; count--; dmp_reg++)
0469 *buf++ = htons(rd_reg_word(dmp_reg));
0470 }
0471
0472 static inline void *
0473 qla24xx_copy_eft(struct qla_hw_data *ha, void *ptr)
0474 {
0475 if (!ha->eft)
0476 return ptr;
0477
0478 memcpy(ptr, ha->eft, ntohl(ha->fw_dump->eft_size));
0479 return ptr + ntohl(ha->fw_dump->eft_size);
0480 }
0481
0482 static inline void *
0483 qla25xx_copy_fce(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
0484 {
0485 uint32_t cnt;
0486 __be32 *iter_reg;
0487 struct qla2xxx_fce_chain *fcec = ptr;
0488
0489 if (!ha->fce)
0490 return ptr;
0491
0492 *last_chain = &fcec->type;
0493 fcec->type = htonl(DUMP_CHAIN_FCE);
0494 fcec->chain_size = htonl(sizeof(struct qla2xxx_fce_chain) +
0495 fce_calc_size(ha->fce_bufs));
0496 fcec->size = htonl(fce_calc_size(ha->fce_bufs));
0497 fcec->addr_l = htonl(LSD(ha->fce_dma));
0498 fcec->addr_h = htonl(MSD(ha->fce_dma));
0499
0500 iter_reg = fcec->eregs;
0501 for (cnt = 0; cnt < 8; cnt++)
0502 *iter_reg++ = htonl(ha->fce_mb[cnt]);
0503
0504 memcpy(iter_reg, ha->fce, ntohl(fcec->size));
0505
0506 return (char *)iter_reg + ntohl(fcec->size);
0507 }
0508
0509 static inline void *
0510 qla25xx_copy_exlogin(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
0511 {
0512 struct qla2xxx_offld_chain *c = ptr;
0513
0514 if (!ha->exlogin_buf)
0515 return ptr;
0516
0517 *last_chain = &c->type;
0518
0519 c->type = cpu_to_be32(DUMP_CHAIN_EXLOGIN);
0520 c->chain_size = cpu_to_be32(sizeof(struct qla2xxx_offld_chain) +
0521 ha->exlogin_size);
0522 c->size = cpu_to_be32(ha->exlogin_size);
0523 c->addr = cpu_to_be64(ha->exlogin_buf_dma);
0524
0525 ptr += sizeof(struct qla2xxx_offld_chain);
0526 memcpy(ptr, ha->exlogin_buf, ha->exlogin_size);
0527
0528 return (char *)ptr + be32_to_cpu(c->size);
0529 }
0530
0531 static inline void *
0532 qla81xx_copy_exchoffld(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
0533 {
0534 struct qla2xxx_offld_chain *c = ptr;
0535
0536 if (!ha->exchoffld_buf)
0537 return ptr;
0538
0539 *last_chain = &c->type;
0540
0541 c->type = cpu_to_be32(DUMP_CHAIN_EXCHG);
0542 c->chain_size = cpu_to_be32(sizeof(struct qla2xxx_offld_chain) +
0543 ha->exchoffld_size);
0544 c->size = cpu_to_be32(ha->exchoffld_size);
0545 c->addr = cpu_to_be64(ha->exchoffld_buf_dma);
0546
0547 ptr += sizeof(struct qla2xxx_offld_chain);
0548 memcpy(ptr, ha->exchoffld_buf, ha->exchoffld_size);
0549
0550 return (char *)ptr + be32_to_cpu(c->size);
0551 }
0552
0553 static inline void *
0554 qla2xxx_copy_atioqueues(struct qla_hw_data *ha, void *ptr,
0555 __be32 **last_chain)
0556 {
0557 struct qla2xxx_mqueue_chain *q;
0558 struct qla2xxx_mqueue_header *qh;
0559 uint32_t num_queues;
0560 int que;
0561 struct {
0562 int length;
0563 void *ring;
0564 } aq, *aqp;
0565
0566 if (!ha->tgt.atio_ring)
0567 return ptr;
0568
0569 num_queues = 1;
0570 aqp = &aq;
0571 aqp->length = ha->tgt.atio_q_length;
0572 aqp->ring = ha->tgt.atio_ring;
0573
0574 for (que = 0; que < num_queues; que++) {
0575
0576 q = ptr;
0577 *last_chain = &q->type;
0578 q->type = htonl(DUMP_CHAIN_QUEUE);
0579 q->chain_size = htonl(
0580 sizeof(struct qla2xxx_mqueue_chain) +
0581 sizeof(struct qla2xxx_mqueue_header) +
0582 (aqp->length * sizeof(request_t)));
0583 ptr += sizeof(struct qla2xxx_mqueue_chain);
0584
0585
0586 qh = ptr;
0587 qh->queue = htonl(TYPE_ATIO_QUEUE);
0588 qh->number = htonl(que);
0589 qh->size = htonl(aqp->length * sizeof(request_t));
0590 ptr += sizeof(struct qla2xxx_mqueue_header);
0591
0592
0593 memcpy(ptr, aqp->ring, aqp->length * sizeof(request_t));
0594
0595 ptr += aqp->length * sizeof(request_t);
0596 }
0597
0598 return ptr;
0599 }
0600
0601 static inline void *
0602 qla25xx_copy_mqueues(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
0603 {
0604 struct qla2xxx_mqueue_chain *q;
0605 struct qla2xxx_mqueue_header *qh;
0606 struct req_que *req;
0607 struct rsp_que *rsp;
0608 int que;
0609
0610 if (!ha->mqenable)
0611 return ptr;
0612
0613
0614 for (que = 1; que < ha->max_req_queues; que++) {
0615 req = ha->req_q_map[que];
0616 if (!req)
0617 break;
0618
0619
0620 q = ptr;
0621 *last_chain = &q->type;
0622 q->type = htonl(DUMP_CHAIN_QUEUE);
0623 q->chain_size = htonl(
0624 sizeof(struct qla2xxx_mqueue_chain) +
0625 sizeof(struct qla2xxx_mqueue_header) +
0626 (req->length * sizeof(request_t)));
0627 ptr += sizeof(struct qla2xxx_mqueue_chain);
0628
0629
0630 qh = ptr;
0631 qh->queue = htonl(TYPE_REQUEST_QUEUE);
0632 qh->number = htonl(que);
0633 qh->size = htonl(req->length * sizeof(request_t));
0634 ptr += sizeof(struct qla2xxx_mqueue_header);
0635
0636
0637 memcpy(ptr, req->ring, req->length * sizeof(request_t));
0638 ptr += req->length * sizeof(request_t);
0639 }
0640
0641
0642 for (que = 1; que < ha->max_rsp_queues; que++) {
0643 rsp = ha->rsp_q_map[que];
0644 if (!rsp)
0645 break;
0646
0647
0648 q = ptr;
0649 *last_chain = &q->type;
0650 q->type = htonl(DUMP_CHAIN_QUEUE);
0651 q->chain_size = htonl(
0652 sizeof(struct qla2xxx_mqueue_chain) +
0653 sizeof(struct qla2xxx_mqueue_header) +
0654 (rsp->length * sizeof(response_t)));
0655 ptr += sizeof(struct qla2xxx_mqueue_chain);
0656
0657
0658 qh = ptr;
0659 qh->queue = htonl(TYPE_RESPONSE_QUEUE);
0660 qh->number = htonl(que);
0661 qh->size = htonl(rsp->length * sizeof(response_t));
0662 ptr += sizeof(struct qla2xxx_mqueue_header);
0663
0664
0665 memcpy(ptr, rsp->ring, rsp->length * sizeof(response_t));
0666 ptr += rsp->length * sizeof(response_t);
0667 }
0668
0669 return ptr;
0670 }
0671
0672 static inline void *
0673 qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
0674 {
0675 uint32_t cnt, que_idx;
0676 uint8_t que_cnt;
0677 struct qla2xxx_mq_chain *mq = ptr;
0678 device_reg_t *reg;
0679
0680 if (!ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha) ||
0681 IS_QLA28XX(ha))
0682 return ptr;
0683
0684 mq = ptr;
0685 *last_chain = &mq->type;
0686 mq->type = htonl(DUMP_CHAIN_MQ);
0687 mq->chain_size = htonl(sizeof(struct qla2xxx_mq_chain));
0688
0689 que_cnt = ha->max_req_queues > ha->max_rsp_queues ?
0690 ha->max_req_queues : ha->max_rsp_queues;
0691 mq->count = htonl(que_cnt);
0692 for (cnt = 0; cnt < que_cnt; cnt++) {
0693 reg = ISP_QUE_REG(ha, cnt);
0694 que_idx = cnt * 4;
0695 mq->qregs[que_idx] =
0696 htonl(rd_reg_dword(®->isp25mq.req_q_in));
0697 mq->qregs[que_idx+1] =
0698 htonl(rd_reg_dword(®->isp25mq.req_q_out));
0699 mq->qregs[que_idx+2] =
0700 htonl(rd_reg_dword(®->isp25mq.rsp_q_in));
0701 mq->qregs[que_idx+3] =
0702 htonl(rd_reg_dword(®->isp25mq.rsp_q_out));
0703 }
0704
0705 return ptr + sizeof(struct qla2xxx_mq_chain);
0706 }
0707
0708 void
0709 qla2xxx_dump_post_process(scsi_qla_host_t *vha, int rval)
0710 {
0711 struct qla_hw_data *ha = vha->hw;
0712
0713 if (rval != QLA_SUCCESS) {
0714 ql_log(ql_log_warn, vha, 0xd000,
0715 "Failed to dump firmware (%x), dump status flags (0x%lx).\n",
0716 rval, ha->fw_dump_cap_flags);
0717 ha->fw_dumped = false;
0718 } else {
0719 ql_log(ql_log_info, vha, 0xd001,
0720 "Firmware dump saved to temp buffer (%ld/%p), dump status flags (0x%lx).\n",
0721 vha->host_no, ha->fw_dump, ha->fw_dump_cap_flags);
0722 ha->fw_dumped = true;
0723 qla2x00_post_uevent_work(vha, QLA_UEVENT_CODE_FW_DUMP);
0724 }
0725 }
0726
0727 void qla2xxx_dump_fw(scsi_qla_host_t *vha)
0728 {
0729 unsigned long flags;
0730
0731 spin_lock_irqsave(&vha->hw->hardware_lock, flags);
0732 vha->hw->isp_ops->fw_dump(vha);
0733 spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
0734 }
0735
0736
0737
0738
0739
0740 void
0741 qla2300_fw_dump(scsi_qla_host_t *vha)
0742 {
0743 int rval;
0744 uint32_t cnt;
0745 struct qla_hw_data *ha = vha->hw;
0746 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
0747 __le16 __iomem *dmp_reg;
0748 struct qla2300_fw_dump *fw;
0749 void *nxt;
0750 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
0751
0752 lockdep_assert_held(&ha->hardware_lock);
0753
0754 if (!ha->fw_dump) {
0755 ql_log(ql_log_warn, vha, 0xd002,
0756 "No buffer available for dump.\n");
0757 return;
0758 }
0759
0760 if (ha->fw_dumped) {
0761 ql_log(ql_log_warn, vha, 0xd003,
0762 "Firmware has been previously dumped (%p) "
0763 "-- ignoring request.\n",
0764 ha->fw_dump);
0765 return;
0766 }
0767 fw = &ha->fw_dump->isp.isp23;
0768 qla2xxx_prep_dump(ha, ha->fw_dump);
0769
0770 rval = QLA_SUCCESS;
0771 fw->hccr = htons(rd_reg_word(®->hccr));
0772
0773
0774 wrt_reg_word(®->hccr, HCCR_PAUSE_RISC);
0775 if (IS_QLA2300(ha)) {
0776 for (cnt = 30000;
0777 (rd_reg_word(®->hccr) & HCCR_RISC_PAUSE) == 0 &&
0778 rval == QLA_SUCCESS; cnt--) {
0779 if (cnt)
0780 udelay(100);
0781 else
0782 rval = QLA_FUNCTION_TIMEOUT;
0783 }
0784 } else {
0785 rd_reg_word(®->hccr);
0786 udelay(10);
0787 }
0788
0789 if (rval == QLA_SUCCESS) {
0790 dmp_reg = ®->flash_address;
0791 for (cnt = 0; cnt < ARRAY_SIZE(fw->pbiu_reg); cnt++, dmp_reg++)
0792 fw->pbiu_reg[cnt] = htons(rd_reg_word(dmp_reg));
0793
0794 dmp_reg = ®->u.isp2300.req_q_in;
0795 for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_host_reg);
0796 cnt++, dmp_reg++)
0797 fw->risc_host_reg[cnt] = htons(rd_reg_word(dmp_reg));
0798
0799 dmp_reg = ®->u.isp2300.mailbox0;
0800 for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg);
0801 cnt++, dmp_reg++)
0802 fw->mailbox_reg[cnt] = htons(rd_reg_word(dmp_reg));
0803
0804 wrt_reg_word(®->ctrl_status, 0x40);
0805 qla2xxx_read_window(reg, 32, fw->resp_dma_reg);
0806
0807 wrt_reg_word(®->ctrl_status, 0x50);
0808 qla2xxx_read_window(reg, 48, fw->dma_reg);
0809
0810 wrt_reg_word(®->ctrl_status, 0x00);
0811 dmp_reg = ®->risc_hw;
0812 for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_hdw_reg);
0813 cnt++, dmp_reg++)
0814 fw->risc_hdw_reg[cnt] = htons(rd_reg_word(dmp_reg));
0815
0816 wrt_reg_word(®->pcr, 0x2000);
0817 qla2xxx_read_window(reg, 16, fw->risc_gp0_reg);
0818
0819 wrt_reg_word(®->pcr, 0x2200);
0820 qla2xxx_read_window(reg, 16, fw->risc_gp1_reg);
0821
0822 wrt_reg_word(®->pcr, 0x2400);
0823 qla2xxx_read_window(reg, 16, fw->risc_gp2_reg);
0824
0825 wrt_reg_word(®->pcr, 0x2600);
0826 qla2xxx_read_window(reg, 16, fw->risc_gp3_reg);
0827
0828 wrt_reg_word(®->pcr, 0x2800);
0829 qla2xxx_read_window(reg, 16, fw->risc_gp4_reg);
0830
0831 wrt_reg_word(®->pcr, 0x2A00);
0832 qla2xxx_read_window(reg, 16, fw->risc_gp5_reg);
0833
0834 wrt_reg_word(®->pcr, 0x2C00);
0835 qla2xxx_read_window(reg, 16, fw->risc_gp6_reg);
0836
0837 wrt_reg_word(®->pcr, 0x2E00);
0838 qla2xxx_read_window(reg, 16, fw->risc_gp7_reg);
0839
0840 wrt_reg_word(®->ctrl_status, 0x10);
0841 qla2xxx_read_window(reg, 64, fw->frame_buf_hdw_reg);
0842
0843 wrt_reg_word(®->ctrl_status, 0x20);
0844 qla2xxx_read_window(reg, 64, fw->fpm_b0_reg);
0845
0846 wrt_reg_word(®->ctrl_status, 0x30);
0847 qla2xxx_read_window(reg, 64, fw->fpm_b1_reg);
0848
0849
0850 wrt_reg_word(®->ctrl_status, CSR_ISP_SOFT_RESET);
0851 for (cnt = 0; cnt < 30000; cnt++) {
0852 if ((rd_reg_word(®->ctrl_status) &
0853 CSR_ISP_SOFT_RESET) == 0)
0854 break;
0855
0856 udelay(10);
0857 }
0858 }
0859
0860 if (!IS_QLA2300(ha)) {
0861 for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
0862 rval == QLA_SUCCESS; cnt--) {
0863 if (cnt)
0864 udelay(100);
0865 else
0866 rval = QLA_FUNCTION_TIMEOUT;
0867 }
0868 }
0869
0870
0871 if (rval == QLA_SUCCESS)
0872 rval = qla2xxx_dump_ram(ha, 0x800, fw->risc_ram,
0873 ARRAY_SIZE(fw->risc_ram), &nxt);
0874
0875
0876 if (rval == QLA_SUCCESS)
0877 rval = qla2xxx_dump_ram(ha, 0x10000, fw->stack_ram,
0878 ARRAY_SIZE(fw->stack_ram), &nxt);
0879
0880
0881 if (rval == QLA_SUCCESS)
0882 rval = qla2xxx_dump_ram(ha, 0x11000, fw->data_ram,
0883 ha->fw_memory_size - 0x11000 + 1, &nxt);
0884
0885 if (rval == QLA_SUCCESS)
0886 qla2xxx_copy_queues(ha, nxt);
0887
0888 qla2xxx_dump_post_process(base_vha, rval);
0889 }
0890
0891
0892
0893
0894
0895 void
0896 qla2100_fw_dump(scsi_qla_host_t *vha)
0897 {
0898 int rval;
0899 uint32_t cnt, timer;
0900 uint16_t risc_address = 0;
0901 uint16_t mb0 = 0, mb2 = 0;
0902 struct qla_hw_data *ha = vha->hw;
0903 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
0904 __le16 __iomem *dmp_reg;
0905 struct qla2100_fw_dump *fw;
0906 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
0907
0908 lockdep_assert_held(&ha->hardware_lock);
0909
0910 if (!ha->fw_dump) {
0911 ql_log(ql_log_warn, vha, 0xd004,
0912 "No buffer available for dump.\n");
0913 return;
0914 }
0915
0916 if (ha->fw_dumped) {
0917 ql_log(ql_log_warn, vha, 0xd005,
0918 "Firmware has been previously dumped (%p) "
0919 "-- ignoring request.\n",
0920 ha->fw_dump);
0921 return;
0922 }
0923 fw = &ha->fw_dump->isp.isp21;
0924 qla2xxx_prep_dump(ha, ha->fw_dump);
0925
0926 rval = QLA_SUCCESS;
0927 fw->hccr = htons(rd_reg_word(®->hccr));
0928
0929
0930 wrt_reg_word(®->hccr, HCCR_PAUSE_RISC);
0931 for (cnt = 30000; (rd_reg_word(®->hccr) & HCCR_RISC_PAUSE) == 0 &&
0932 rval == QLA_SUCCESS; cnt--) {
0933 if (cnt)
0934 udelay(100);
0935 else
0936 rval = QLA_FUNCTION_TIMEOUT;
0937 }
0938 if (rval == QLA_SUCCESS) {
0939 dmp_reg = ®->flash_address;
0940 for (cnt = 0; cnt < ARRAY_SIZE(fw->pbiu_reg); cnt++, dmp_reg++)
0941 fw->pbiu_reg[cnt] = htons(rd_reg_word(dmp_reg));
0942
0943 dmp_reg = ®->u.isp2100.mailbox0;
0944 for (cnt = 0; cnt < ha->mbx_count; cnt++, dmp_reg++) {
0945 if (cnt == 8)
0946 dmp_reg = ®->u_end.isp2200.mailbox8;
0947
0948 fw->mailbox_reg[cnt] = htons(rd_reg_word(dmp_reg));
0949 }
0950
0951 dmp_reg = ®->u.isp2100.unused_2[0];
0952 for (cnt = 0; cnt < ARRAY_SIZE(fw->dma_reg); cnt++, dmp_reg++)
0953 fw->dma_reg[cnt] = htons(rd_reg_word(dmp_reg));
0954
0955 wrt_reg_word(®->ctrl_status, 0x00);
0956 dmp_reg = ®->risc_hw;
0957 for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_hdw_reg); cnt++, dmp_reg++)
0958 fw->risc_hdw_reg[cnt] = htons(rd_reg_word(dmp_reg));
0959
0960 wrt_reg_word(®->pcr, 0x2000);
0961 qla2xxx_read_window(reg, 16, fw->risc_gp0_reg);
0962
0963 wrt_reg_word(®->pcr, 0x2100);
0964 qla2xxx_read_window(reg, 16, fw->risc_gp1_reg);
0965
0966 wrt_reg_word(®->pcr, 0x2200);
0967 qla2xxx_read_window(reg, 16, fw->risc_gp2_reg);
0968
0969 wrt_reg_word(®->pcr, 0x2300);
0970 qla2xxx_read_window(reg, 16, fw->risc_gp3_reg);
0971
0972 wrt_reg_word(®->pcr, 0x2400);
0973 qla2xxx_read_window(reg, 16, fw->risc_gp4_reg);
0974
0975 wrt_reg_word(®->pcr, 0x2500);
0976 qla2xxx_read_window(reg, 16, fw->risc_gp5_reg);
0977
0978 wrt_reg_word(®->pcr, 0x2600);
0979 qla2xxx_read_window(reg, 16, fw->risc_gp6_reg);
0980
0981 wrt_reg_word(®->pcr, 0x2700);
0982 qla2xxx_read_window(reg, 16, fw->risc_gp7_reg);
0983
0984 wrt_reg_word(®->ctrl_status, 0x10);
0985 qla2xxx_read_window(reg, 16, fw->frame_buf_hdw_reg);
0986
0987 wrt_reg_word(®->ctrl_status, 0x20);
0988 qla2xxx_read_window(reg, 64, fw->fpm_b0_reg);
0989
0990 wrt_reg_word(®->ctrl_status, 0x30);
0991 qla2xxx_read_window(reg, 64, fw->fpm_b1_reg);
0992
0993
0994 wrt_reg_word(®->ctrl_status, CSR_ISP_SOFT_RESET);
0995 }
0996
0997 for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
0998 rval == QLA_SUCCESS; cnt--) {
0999 if (cnt)
1000 udelay(100);
1001 else
1002 rval = QLA_FUNCTION_TIMEOUT;
1003 }
1004
1005
1006 if (rval == QLA_SUCCESS && (IS_QLA2200(ha) || (IS_QLA2100(ha) &&
1007 (rd_reg_word(®->mctr) & (BIT_1 | BIT_0)) != 0))) {
1008
1009 wrt_reg_word(®->hccr, HCCR_PAUSE_RISC);
1010 for (cnt = 30000;
1011 (rd_reg_word(®->hccr) & HCCR_RISC_PAUSE) == 0 &&
1012 rval == QLA_SUCCESS; cnt--) {
1013 if (cnt)
1014 udelay(100);
1015 else
1016 rval = QLA_FUNCTION_TIMEOUT;
1017 }
1018 if (rval == QLA_SUCCESS) {
1019
1020 if (IS_QLA2100(ha))
1021 wrt_reg_word(®->mctr, 0xf1);
1022 else
1023 wrt_reg_word(®->mctr, 0xf2);
1024 rd_reg_word(®->mctr);
1025
1026
1027 wrt_reg_word(®->hccr, HCCR_RELEASE_RISC);
1028 }
1029 }
1030
1031 if (rval == QLA_SUCCESS) {
1032
1033 risc_address = 0x1000;
1034 WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
1035 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
1036 }
1037 for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_ram) && rval == QLA_SUCCESS;
1038 cnt++, risc_address++) {
1039 WRT_MAILBOX_REG(ha, reg, 1, risc_address);
1040 wrt_reg_word(®->hccr, HCCR_SET_HOST_INT);
1041
1042 for (timer = 6000000; timer != 0; timer--) {
1043
1044 if (rd_reg_word(®->istatus) & ISR_RISC_INT) {
1045 if (rd_reg_word(®->semaphore) & BIT_0) {
1046 set_bit(MBX_INTERRUPT,
1047 &ha->mbx_cmd_flags);
1048
1049 mb0 = RD_MAILBOX_REG(ha, reg, 0);
1050 mb2 = RD_MAILBOX_REG(ha, reg, 2);
1051
1052 wrt_reg_word(®->semaphore, 0);
1053 wrt_reg_word(®->hccr,
1054 HCCR_CLR_RISC_INT);
1055 rd_reg_word(®->hccr);
1056 break;
1057 }
1058 wrt_reg_word(®->hccr, HCCR_CLR_RISC_INT);
1059 rd_reg_word(®->hccr);
1060 }
1061 udelay(5);
1062 }
1063
1064 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
1065 rval = mb0 & MBS_MASK;
1066 fw->risc_ram[cnt] = htons(mb2);
1067 } else {
1068 rval = QLA_FUNCTION_FAILED;
1069 }
1070 }
1071
1072 if (rval == QLA_SUCCESS)
1073 qla2xxx_copy_queues(ha, &fw->queue_dump[0]);
1074
1075 qla2xxx_dump_post_process(base_vha, rval);
1076 }
1077
1078 void
1079 qla24xx_fw_dump(scsi_qla_host_t *vha)
1080 {
1081 int rval;
1082 uint32_t cnt;
1083 struct qla_hw_data *ha = vha->hw;
1084 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
1085 __le32 __iomem *dmp_reg;
1086 __be32 *iter_reg;
1087 __le16 __iomem *mbx_reg;
1088 struct qla24xx_fw_dump *fw;
1089 void *nxt;
1090 void *nxt_chain;
1091 __be32 *last_chain = NULL;
1092 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
1093
1094 lockdep_assert_held(&ha->hardware_lock);
1095
1096 if (IS_P3P_TYPE(ha))
1097 return;
1098
1099 ha->fw_dump_cap_flags = 0;
1100
1101 if (!ha->fw_dump) {
1102 ql_log(ql_log_warn, vha, 0xd006,
1103 "No buffer available for dump.\n");
1104 return;
1105 }
1106
1107 if (ha->fw_dumped) {
1108 ql_log(ql_log_warn, vha, 0xd007,
1109 "Firmware has been previously dumped (%p) "
1110 "-- ignoring request.\n",
1111 ha->fw_dump);
1112 return;
1113 }
1114 QLA_FW_STOPPED(ha);
1115 fw = &ha->fw_dump->isp.isp24;
1116 qla2xxx_prep_dump(ha, ha->fw_dump);
1117
1118 fw->host_status = htonl(rd_reg_dword(®->host_status));
1119
1120
1121
1122
1123
1124 qla24xx_pause_risc(reg, ha);
1125
1126
1127 dmp_reg = ®->flash_addr;
1128 for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
1129 fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
1130
1131
1132 wrt_reg_dword(®->ictrl, 0);
1133 rd_reg_dword(®->ictrl);
1134
1135
1136 wrt_reg_dword(®->iobase_addr, 0x0F70);
1137 rd_reg_dword(®->iobase_addr);
1138 wrt_reg_dword(®->iobase_select, 0xB0000000);
1139 fw->shadow_reg[0] = htonl(rd_reg_dword(®->iobase_sdata));
1140
1141 wrt_reg_dword(®->iobase_select, 0xB0100000);
1142 fw->shadow_reg[1] = htonl(rd_reg_dword(®->iobase_sdata));
1143
1144 wrt_reg_dword(®->iobase_select, 0xB0200000);
1145 fw->shadow_reg[2] = htonl(rd_reg_dword(®->iobase_sdata));
1146
1147 wrt_reg_dword(®->iobase_select, 0xB0300000);
1148 fw->shadow_reg[3] = htonl(rd_reg_dword(®->iobase_sdata));
1149
1150 wrt_reg_dword(®->iobase_select, 0xB0400000);
1151 fw->shadow_reg[4] = htonl(rd_reg_dword(®->iobase_sdata));
1152
1153 wrt_reg_dword(®->iobase_select, 0xB0500000);
1154 fw->shadow_reg[5] = htonl(rd_reg_dword(®->iobase_sdata));
1155
1156 wrt_reg_dword(®->iobase_select, 0xB0600000);
1157 fw->shadow_reg[6] = htonl(rd_reg_dword(®->iobase_sdata));
1158
1159
1160 mbx_reg = ®->mailbox0;
1161 for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
1162 fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
1163
1164
1165 iter_reg = fw->xseq_gp_reg;
1166 iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
1167 iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
1168 iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
1169 iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
1170 iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
1171 iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
1172 iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
1173 qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
1174
1175 qla24xx_read_window(reg, 0xBFE0, 16, fw->xseq_0_reg);
1176 qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
1177
1178
1179 iter_reg = fw->rseq_gp_reg;
1180 iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
1181 iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
1182 iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
1183 iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
1184 iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
1185 iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
1186 iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
1187 qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
1188
1189 qla24xx_read_window(reg, 0xFFD0, 16, fw->rseq_0_reg);
1190 qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
1191 qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
1192
1193
1194 qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);
1195
1196
1197 iter_reg = fw->req0_dma_reg;
1198 iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
1199 dmp_reg = ®->iobase_q;
1200 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
1201 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1202
1203 iter_reg = fw->resp0_dma_reg;
1204 iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
1205 dmp_reg = ®->iobase_q;
1206 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
1207 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1208
1209 iter_reg = fw->req1_dma_reg;
1210 iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
1211 dmp_reg = ®->iobase_q;
1212 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
1213 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1214
1215
1216 iter_reg = fw->xmt0_dma_reg;
1217 iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
1218 qla24xx_read_window(reg, 0x7610, 16, iter_reg);
1219
1220 iter_reg = fw->xmt1_dma_reg;
1221 iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
1222 qla24xx_read_window(reg, 0x7630, 16, iter_reg);
1223
1224 iter_reg = fw->xmt2_dma_reg;
1225 iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
1226 qla24xx_read_window(reg, 0x7650, 16, iter_reg);
1227
1228 iter_reg = fw->xmt3_dma_reg;
1229 iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
1230 qla24xx_read_window(reg, 0x7670, 16, iter_reg);
1231
1232 iter_reg = fw->xmt4_dma_reg;
1233 iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
1234 qla24xx_read_window(reg, 0x7690, 16, iter_reg);
1235
1236 qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
1237
1238
1239 iter_reg = fw->rcvt0_data_dma_reg;
1240 iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
1241 qla24xx_read_window(reg, 0x7710, 16, iter_reg);
1242
1243 iter_reg = fw->rcvt1_data_dma_reg;
1244 iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
1245 qla24xx_read_window(reg, 0x7730, 16, iter_reg);
1246
1247
1248 iter_reg = fw->risc_gp_reg;
1249 iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
1250 iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
1251 iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
1252 iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
1253 iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
1254 iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
1255 iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
1256 qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
1257
1258
1259 iter_reg = fw->lmc_reg;
1260 iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
1261 iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
1262 iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
1263 iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
1264 iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
1265 iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
1266 qla24xx_read_window(reg, 0x3060, 16, iter_reg);
1267
1268
1269 iter_reg = fw->fpm_hdw_reg;
1270 iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
1271 iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
1272 iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
1273 iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
1274 iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
1275 iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
1276 iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
1277 iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
1278 iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
1279 iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
1280 iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
1281 qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
1282
1283
1284 iter_reg = fw->fb_hdw_reg;
1285 iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
1286 iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
1287 iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
1288 iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
1289 iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
1290 iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
1291 iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
1292 iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
1293 iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
1294 iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
1295 qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
1296
1297 rval = qla24xx_soft_reset(ha);
1298 if (rval != QLA_SUCCESS)
1299 goto qla24xx_fw_dump_failed_0;
1300
1301 rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
1302 &nxt);
1303 if (rval != QLA_SUCCESS)
1304 goto qla24xx_fw_dump_failed_0;
1305
1306 nxt = qla2xxx_copy_queues(ha, nxt);
1307
1308 qla24xx_copy_eft(ha, nxt);
1309
1310 nxt_chain = (void *)ha->fw_dump + ha->chain_offset;
1311 nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
1312 if (last_chain) {
1313 ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
1314 *last_chain |= htonl(DUMP_CHAIN_LAST);
1315 }
1316
1317
1318 ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
1319
1320 qla24xx_fw_dump_failed_0:
1321 qla2xxx_dump_post_process(base_vha, rval);
1322 }
1323
1324 void
1325 qla25xx_fw_dump(scsi_qla_host_t *vha)
1326 {
1327 int rval;
1328 uint32_t cnt;
1329 struct qla_hw_data *ha = vha->hw;
1330 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
1331 __le32 __iomem *dmp_reg;
1332 __be32 *iter_reg;
1333 __le16 __iomem *mbx_reg;
1334 struct qla25xx_fw_dump *fw;
1335 void *nxt, *nxt_chain;
1336 __be32 *last_chain = NULL;
1337 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
1338
1339 lockdep_assert_held(&ha->hardware_lock);
1340
1341 ha->fw_dump_cap_flags = 0;
1342
1343 if (!ha->fw_dump) {
1344 ql_log(ql_log_warn, vha, 0xd008,
1345 "No buffer available for dump.\n");
1346 return;
1347 }
1348
1349 if (ha->fw_dumped) {
1350 ql_log(ql_log_warn, vha, 0xd009,
1351 "Firmware has been previously dumped (%p) "
1352 "-- ignoring request.\n",
1353 ha->fw_dump);
1354 return;
1355 }
1356 QLA_FW_STOPPED(ha);
1357 fw = &ha->fw_dump->isp.isp25;
1358 qla2xxx_prep_dump(ha, ha->fw_dump);
1359 ha->fw_dump->version = htonl(2);
1360
1361 fw->host_status = htonl(rd_reg_dword(®->host_status));
1362
1363
1364
1365
1366
1367 qla24xx_pause_risc(reg, ha);
1368
1369
1370 iter_reg = fw->host_risc_reg;
1371 iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
1372 qla24xx_read_window(reg, 0x7010, 16, iter_reg);
1373
1374
1375 wrt_reg_dword(®->iobase_addr, 0x7C00);
1376 rd_reg_dword(®->iobase_addr);
1377 wrt_reg_dword(®->iobase_window, 0x01);
1378 dmp_reg = ®->iobase_c4;
1379 fw->pcie_regs[0] = htonl(rd_reg_dword(dmp_reg));
1380 dmp_reg++;
1381 fw->pcie_regs[1] = htonl(rd_reg_dword(dmp_reg));
1382 dmp_reg++;
1383 fw->pcie_regs[2] = htonl(rd_reg_dword(dmp_reg));
1384 fw->pcie_regs[3] = htonl(rd_reg_dword(®->iobase_window));
1385
1386 wrt_reg_dword(®->iobase_window, 0x00);
1387 rd_reg_dword(®->iobase_window);
1388
1389
1390 dmp_reg = ®->flash_addr;
1391 for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
1392 fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
1393
1394
1395 wrt_reg_dword(®->ictrl, 0);
1396 rd_reg_dword(®->ictrl);
1397
1398
1399 wrt_reg_dword(®->iobase_addr, 0x0F70);
1400 rd_reg_dword(®->iobase_addr);
1401 wrt_reg_dword(®->iobase_select, 0xB0000000);
1402 fw->shadow_reg[0] = htonl(rd_reg_dword(®->iobase_sdata));
1403
1404 wrt_reg_dword(®->iobase_select, 0xB0100000);
1405 fw->shadow_reg[1] = htonl(rd_reg_dword(®->iobase_sdata));
1406
1407 wrt_reg_dword(®->iobase_select, 0xB0200000);
1408 fw->shadow_reg[2] = htonl(rd_reg_dword(®->iobase_sdata));
1409
1410 wrt_reg_dword(®->iobase_select, 0xB0300000);
1411 fw->shadow_reg[3] = htonl(rd_reg_dword(®->iobase_sdata));
1412
1413 wrt_reg_dword(®->iobase_select, 0xB0400000);
1414 fw->shadow_reg[4] = htonl(rd_reg_dword(®->iobase_sdata));
1415
1416 wrt_reg_dword(®->iobase_select, 0xB0500000);
1417 fw->shadow_reg[5] = htonl(rd_reg_dword(®->iobase_sdata));
1418
1419 wrt_reg_dword(®->iobase_select, 0xB0600000);
1420 fw->shadow_reg[6] = htonl(rd_reg_dword(®->iobase_sdata));
1421
1422 wrt_reg_dword(®->iobase_select, 0xB0700000);
1423 fw->shadow_reg[7] = htonl(rd_reg_dword(®->iobase_sdata));
1424
1425 wrt_reg_dword(®->iobase_select, 0xB0800000);
1426 fw->shadow_reg[8] = htonl(rd_reg_dword(®->iobase_sdata));
1427
1428 wrt_reg_dword(®->iobase_select, 0xB0900000);
1429 fw->shadow_reg[9] = htonl(rd_reg_dword(®->iobase_sdata));
1430
1431 wrt_reg_dword(®->iobase_select, 0xB0A00000);
1432 fw->shadow_reg[10] = htonl(rd_reg_dword(®->iobase_sdata));
1433
1434
1435 wrt_reg_dword(®->iobase_addr, 0x0010);
1436 fw->risc_io_reg = htonl(rd_reg_dword(®->iobase_window));
1437
1438
1439 mbx_reg = ®->mailbox0;
1440 for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
1441 fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
1442
1443
1444 iter_reg = fw->xseq_gp_reg;
1445 iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
1446 iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
1447 iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
1448 iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
1449 iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
1450 iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
1451 iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
1452 qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
1453
1454 iter_reg = fw->xseq_0_reg;
1455 iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
1456 iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
1457 qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
1458
1459 qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
1460
1461
1462 iter_reg = fw->rseq_gp_reg;
1463 iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
1464 iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
1465 iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
1466 iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
1467 iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
1468 iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
1469 iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
1470 qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
1471
1472 iter_reg = fw->rseq_0_reg;
1473 iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
1474 qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
1475
1476 qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
1477 qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
1478
1479
1480 iter_reg = fw->aseq_gp_reg;
1481 iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
1482 iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
1483 iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
1484 iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
1485 iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
1486 iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
1487 iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
1488 qla24xx_read_window(reg, 0xB070, 16, iter_reg);
1489
1490 iter_reg = fw->aseq_0_reg;
1491 iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
1492 qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
1493
1494 qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
1495 qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
1496
1497
1498 qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);
1499
1500
1501 iter_reg = fw->req0_dma_reg;
1502 iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
1503 dmp_reg = ®->iobase_q;
1504 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
1505 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1506
1507 iter_reg = fw->resp0_dma_reg;
1508 iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
1509 dmp_reg = ®->iobase_q;
1510 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
1511 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1512
1513 iter_reg = fw->req1_dma_reg;
1514 iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
1515 dmp_reg = ®->iobase_q;
1516 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
1517 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1518
1519
1520 iter_reg = fw->xmt0_dma_reg;
1521 iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
1522 qla24xx_read_window(reg, 0x7610, 16, iter_reg);
1523
1524 iter_reg = fw->xmt1_dma_reg;
1525 iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
1526 qla24xx_read_window(reg, 0x7630, 16, iter_reg);
1527
1528 iter_reg = fw->xmt2_dma_reg;
1529 iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
1530 qla24xx_read_window(reg, 0x7650, 16, iter_reg);
1531
1532 iter_reg = fw->xmt3_dma_reg;
1533 iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
1534 qla24xx_read_window(reg, 0x7670, 16, iter_reg);
1535
1536 iter_reg = fw->xmt4_dma_reg;
1537 iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
1538 qla24xx_read_window(reg, 0x7690, 16, iter_reg);
1539
1540 qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
1541
1542
1543 iter_reg = fw->rcvt0_data_dma_reg;
1544 iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
1545 qla24xx_read_window(reg, 0x7710, 16, iter_reg);
1546
1547 iter_reg = fw->rcvt1_data_dma_reg;
1548 iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
1549 qla24xx_read_window(reg, 0x7730, 16, iter_reg);
1550
1551
1552 iter_reg = fw->risc_gp_reg;
1553 iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
1554 iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
1555 iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
1556 iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
1557 iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
1558 iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
1559 iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
1560 qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
1561
1562
1563 iter_reg = fw->lmc_reg;
1564 iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
1565 iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
1566 iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
1567 iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
1568 iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
1569 iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
1570 iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
1571 qla24xx_read_window(reg, 0x3070, 16, iter_reg);
1572
1573
1574 iter_reg = fw->fpm_hdw_reg;
1575 iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
1576 iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
1577 iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
1578 iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
1579 iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
1580 iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
1581 iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
1582 iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
1583 iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
1584 iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
1585 iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
1586 qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
1587
1588
1589 iter_reg = fw->fb_hdw_reg;
1590 iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
1591 iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
1592 iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
1593 iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
1594 iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
1595 iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
1596 iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
1597 iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
1598 iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
1599 iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
1600 iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
1601 qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
1602
1603
1604 nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
1605 &last_chain);
1606
1607 rval = qla24xx_soft_reset(ha);
1608 if (rval != QLA_SUCCESS)
1609 goto qla25xx_fw_dump_failed_0;
1610
1611 rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
1612 &nxt);
1613 if (rval != QLA_SUCCESS)
1614 goto qla25xx_fw_dump_failed_0;
1615
1616 nxt = qla2xxx_copy_queues(ha, nxt);
1617
1618 qla24xx_copy_eft(ha, nxt);
1619
1620
1621 nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
1622 nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
1623 nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
1624 nxt_chain = qla25xx_copy_exlogin(ha, nxt_chain, &last_chain);
1625 if (last_chain) {
1626 ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
1627 *last_chain |= htonl(DUMP_CHAIN_LAST);
1628 }
1629
1630
1631 ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
1632
1633 qla25xx_fw_dump_failed_0:
1634 qla2xxx_dump_post_process(base_vha, rval);
1635 }
1636
1637 void
1638 qla81xx_fw_dump(scsi_qla_host_t *vha)
1639 {
1640 int rval;
1641 uint32_t cnt;
1642 struct qla_hw_data *ha = vha->hw;
1643 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
1644 __le32 __iomem *dmp_reg;
1645 __be32 *iter_reg;
1646 __le16 __iomem *mbx_reg;
1647 struct qla81xx_fw_dump *fw;
1648 void *nxt, *nxt_chain;
1649 __be32 *last_chain = NULL;
1650 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
1651
1652 lockdep_assert_held(&ha->hardware_lock);
1653
1654 ha->fw_dump_cap_flags = 0;
1655
1656 if (!ha->fw_dump) {
1657 ql_log(ql_log_warn, vha, 0xd00a,
1658 "No buffer available for dump.\n");
1659 return;
1660 }
1661
1662 if (ha->fw_dumped) {
1663 ql_log(ql_log_warn, vha, 0xd00b,
1664 "Firmware has been previously dumped (%p) "
1665 "-- ignoring request.\n",
1666 ha->fw_dump);
1667 return;
1668 }
1669 fw = &ha->fw_dump->isp.isp81;
1670 qla2xxx_prep_dump(ha, ha->fw_dump);
1671
1672 fw->host_status = htonl(rd_reg_dword(®->host_status));
1673
1674
1675
1676
1677
1678 qla24xx_pause_risc(reg, ha);
1679
1680
1681 iter_reg = fw->host_risc_reg;
1682 iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
1683 qla24xx_read_window(reg, 0x7010, 16, iter_reg);
1684
1685
1686 wrt_reg_dword(®->iobase_addr, 0x7C00);
1687 rd_reg_dword(®->iobase_addr);
1688 wrt_reg_dword(®->iobase_window, 0x01);
1689 dmp_reg = ®->iobase_c4;
1690 fw->pcie_regs[0] = htonl(rd_reg_dword(dmp_reg));
1691 dmp_reg++;
1692 fw->pcie_regs[1] = htonl(rd_reg_dword(dmp_reg));
1693 dmp_reg++;
1694 fw->pcie_regs[2] = htonl(rd_reg_dword(dmp_reg));
1695 fw->pcie_regs[3] = htonl(rd_reg_dword(®->iobase_window));
1696
1697 wrt_reg_dword(®->iobase_window, 0x00);
1698 rd_reg_dword(®->iobase_window);
1699
1700
1701 dmp_reg = ®->flash_addr;
1702 for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
1703 fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
1704
1705
1706 wrt_reg_dword(®->ictrl, 0);
1707 rd_reg_dword(®->ictrl);
1708
1709
1710 wrt_reg_dword(®->iobase_addr, 0x0F70);
1711 rd_reg_dword(®->iobase_addr);
1712 wrt_reg_dword(®->iobase_select, 0xB0000000);
1713 fw->shadow_reg[0] = htonl(rd_reg_dword(®->iobase_sdata));
1714
1715 wrt_reg_dword(®->iobase_select, 0xB0100000);
1716 fw->shadow_reg[1] = htonl(rd_reg_dword(®->iobase_sdata));
1717
1718 wrt_reg_dword(®->iobase_select, 0xB0200000);
1719 fw->shadow_reg[2] = htonl(rd_reg_dword(®->iobase_sdata));
1720
1721 wrt_reg_dword(®->iobase_select, 0xB0300000);
1722 fw->shadow_reg[3] = htonl(rd_reg_dword(®->iobase_sdata));
1723
1724 wrt_reg_dword(®->iobase_select, 0xB0400000);
1725 fw->shadow_reg[4] = htonl(rd_reg_dword(®->iobase_sdata));
1726
1727 wrt_reg_dword(®->iobase_select, 0xB0500000);
1728 fw->shadow_reg[5] = htonl(rd_reg_dword(®->iobase_sdata));
1729
1730 wrt_reg_dword(®->iobase_select, 0xB0600000);
1731 fw->shadow_reg[6] = htonl(rd_reg_dword(®->iobase_sdata));
1732
1733 wrt_reg_dword(®->iobase_select, 0xB0700000);
1734 fw->shadow_reg[7] = htonl(rd_reg_dword(®->iobase_sdata));
1735
1736 wrt_reg_dword(®->iobase_select, 0xB0800000);
1737 fw->shadow_reg[8] = htonl(rd_reg_dword(®->iobase_sdata));
1738
1739 wrt_reg_dword(®->iobase_select, 0xB0900000);
1740 fw->shadow_reg[9] = htonl(rd_reg_dword(®->iobase_sdata));
1741
1742 wrt_reg_dword(®->iobase_select, 0xB0A00000);
1743 fw->shadow_reg[10] = htonl(rd_reg_dword(®->iobase_sdata));
1744
1745
1746 wrt_reg_dword(®->iobase_addr, 0x0010);
1747 fw->risc_io_reg = htonl(rd_reg_dword(®->iobase_window));
1748
1749
1750 mbx_reg = ®->mailbox0;
1751 for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
1752 fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
1753
1754
1755 iter_reg = fw->xseq_gp_reg;
1756 iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
1757 iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
1758 iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
1759 iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
1760 iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
1761 iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
1762 iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
1763 qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
1764
1765 iter_reg = fw->xseq_0_reg;
1766 iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
1767 iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
1768 qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
1769
1770 qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
1771
1772
1773 iter_reg = fw->rseq_gp_reg;
1774 iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
1775 iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
1776 iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
1777 iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
1778 iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
1779 iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
1780 iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
1781 qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
1782
1783 iter_reg = fw->rseq_0_reg;
1784 iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
1785 qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
1786
1787 qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
1788 qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
1789
1790
1791 iter_reg = fw->aseq_gp_reg;
1792 iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
1793 iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
1794 iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
1795 iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
1796 iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
1797 iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
1798 iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
1799 qla24xx_read_window(reg, 0xB070, 16, iter_reg);
1800
1801 iter_reg = fw->aseq_0_reg;
1802 iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
1803 qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
1804
1805 qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
1806 qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
1807
1808
1809 qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);
1810
1811
1812 iter_reg = fw->req0_dma_reg;
1813 iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
1814 dmp_reg = ®->iobase_q;
1815 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
1816 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1817
1818 iter_reg = fw->resp0_dma_reg;
1819 iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
1820 dmp_reg = ®->iobase_q;
1821 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
1822 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1823
1824 iter_reg = fw->req1_dma_reg;
1825 iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
1826 dmp_reg = ®->iobase_q;
1827 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
1828 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1829
1830
1831 iter_reg = fw->xmt0_dma_reg;
1832 iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
1833 qla24xx_read_window(reg, 0x7610, 16, iter_reg);
1834
1835 iter_reg = fw->xmt1_dma_reg;
1836 iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
1837 qla24xx_read_window(reg, 0x7630, 16, iter_reg);
1838
1839 iter_reg = fw->xmt2_dma_reg;
1840 iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
1841 qla24xx_read_window(reg, 0x7650, 16, iter_reg);
1842
1843 iter_reg = fw->xmt3_dma_reg;
1844 iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
1845 qla24xx_read_window(reg, 0x7670, 16, iter_reg);
1846
1847 iter_reg = fw->xmt4_dma_reg;
1848 iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
1849 qla24xx_read_window(reg, 0x7690, 16, iter_reg);
1850
1851 qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
1852
1853
1854 iter_reg = fw->rcvt0_data_dma_reg;
1855 iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
1856 qla24xx_read_window(reg, 0x7710, 16, iter_reg);
1857
1858 iter_reg = fw->rcvt1_data_dma_reg;
1859 iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
1860 qla24xx_read_window(reg, 0x7730, 16, iter_reg);
1861
1862
1863 iter_reg = fw->risc_gp_reg;
1864 iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
1865 iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
1866 iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
1867 iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
1868 iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
1869 iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
1870 iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
1871 qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
1872
1873
1874 iter_reg = fw->lmc_reg;
1875 iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
1876 iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
1877 iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
1878 iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
1879 iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
1880 iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
1881 iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
1882 qla24xx_read_window(reg, 0x3070, 16, iter_reg);
1883
1884
1885 iter_reg = fw->fpm_hdw_reg;
1886 iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
1887 iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
1888 iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
1889 iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
1890 iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
1891 iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
1892 iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
1893 iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
1894 iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
1895 iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
1896 iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
1897 iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
1898 iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg);
1899 qla24xx_read_window(reg, 0x40D0, 16, iter_reg);
1900
1901
1902 iter_reg = fw->fb_hdw_reg;
1903 iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
1904 iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
1905 iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
1906 iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
1907 iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
1908 iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
1909 iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
1910 iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
1911 iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
1912 iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
1913 iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
1914 iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg);
1915 qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
1916
1917
1918 nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
1919 &last_chain);
1920
1921 rval = qla24xx_soft_reset(ha);
1922 if (rval != QLA_SUCCESS)
1923 goto qla81xx_fw_dump_failed_0;
1924
1925 rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
1926 &nxt);
1927 if (rval != QLA_SUCCESS)
1928 goto qla81xx_fw_dump_failed_0;
1929
1930 nxt = qla2xxx_copy_queues(ha, nxt);
1931
1932 qla24xx_copy_eft(ha, nxt);
1933
1934
1935 nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
1936 nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
1937 nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
1938 nxt_chain = qla25xx_copy_exlogin(ha, nxt_chain, &last_chain);
1939 nxt_chain = qla81xx_copy_exchoffld(ha, nxt_chain, &last_chain);
1940 if (last_chain) {
1941 ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
1942 *last_chain |= htonl(DUMP_CHAIN_LAST);
1943 }
1944
1945
1946 ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
1947
1948 qla81xx_fw_dump_failed_0:
1949 qla2xxx_dump_post_process(base_vha, rval);
1950 }
1951
1952 void
1953 qla83xx_fw_dump(scsi_qla_host_t *vha)
1954 {
1955 int rval;
1956 uint32_t cnt;
1957 struct qla_hw_data *ha = vha->hw;
1958 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
1959 __le32 __iomem *dmp_reg;
1960 __be32 *iter_reg;
1961 __le16 __iomem *mbx_reg;
1962 struct qla83xx_fw_dump *fw;
1963 void *nxt, *nxt_chain;
1964 __be32 *last_chain = NULL;
1965 struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
1966
1967 lockdep_assert_held(&ha->hardware_lock);
1968
1969 ha->fw_dump_cap_flags = 0;
1970
1971 if (!ha->fw_dump) {
1972 ql_log(ql_log_warn, vha, 0xd00c,
1973 "No buffer available for dump!!!\n");
1974 return;
1975 }
1976
1977 if (ha->fw_dumped) {
1978 ql_log(ql_log_warn, vha, 0xd00d,
1979 "Firmware has been previously dumped (%p) -- ignoring "
1980 "request...\n", ha->fw_dump);
1981 return;
1982 }
1983 QLA_FW_STOPPED(ha);
1984 fw = &ha->fw_dump->isp.isp83;
1985 qla2xxx_prep_dump(ha, ha->fw_dump);
1986
1987 fw->host_status = htonl(rd_reg_dword(®->host_status));
1988
1989
1990
1991
1992
1993 qla24xx_pause_risc(reg, ha);
1994
1995 wrt_reg_dword(®->iobase_addr, 0x6000);
1996 dmp_reg = ®->iobase_window;
1997 rd_reg_dword(dmp_reg);
1998 wrt_reg_dword(dmp_reg, 0);
1999
2000 dmp_reg = ®->unused_4_1[0];
2001 rd_reg_dword(dmp_reg);
2002 wrt_reg_dword(dmp_reg, 0);
2003
2004 wrt_reg_dword(®->iobase_addr, 0x6010);
2005 dmp_reg = ®->unused_4_1[2];
2006 rd_reg_dword(dmp_reg);
2007 wrt_reg_dword(dmp_reg, 0);
2008
2009
2010 wrt_reg_dword(®->iobase_addr, 0x0F70);
2011 rd_reg_dword(®->iobase_addr);
2012 wrt_reg_dword(®->iobase_select, 0x60000000);
2013
2014
2015 iter_reg = fw->host_risc_reg;
2016 iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
2017 iter_reg = qla24xx_read_window(reg, 0x7010, 16, iter_reg);
2018 qla24xx_read_window(reg, 0x7040, 16, iter_reg);
2019
2020
2021 wrt_reg_dword(®->iobase_addr, 0x7C00);
2022 rd_reg_dword(®->iobase_addr);
2023 wrt_reg_dword(®->iobase_window, 0x01);
2024 dmp_reg = ®->iobase_c4;
2025 fw->pcie_regs[0] = htonl(rd_reg_dword(dmp_reg));
2026 dmp_reg++;
2027 fw->pcie_regs[1] = htonl(rd_reg_dword(dmp_reg));
2028 dmp_reg++;
2029 fw->pcie_regs[2] = htonl(rd_reg_dword(dmp_reg));
2030 fw->pcie_regs[3] = htonl(rd_reg_dword(®->iobase_window));
2031
2032 wrt_reg_dword(®->iobase_window, 0x00);
2033 rd_reg_dword(®->iobase_window);
2034
2035
2036 dmp_reg = ®->flash_addr;
2037 for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
2038 fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
2039
2040
2041 wrt_reg_dword(®->ictrl, 0);
2042 rd_reg_dword(®->ictrl);
2043
2044
2045 wrt_reg_dword(®->iobase_addr, 0x0F70);
2046 rd_reg_dword(®->iobase_addr);
2047 wrt_reg_dword(®->iobase_select, 0xB0000000);
2048 fw->shadow_reg[0] = htonl(rd_reg_dword(®->iobase_sdata));
2049
2050 wrt_reg_dword(®->iobase_select, 0xB0100000);
2051 fw->shadow_reg[1] = htonl(rd_reg_dword(®->iobase_sdata));
2052
2053 wrt_reg_dword(®->iobase_select, 0xB0200000);
2054 fw->shadow_reg[2] = htonl(rd_reg_dword(®->iobase_sdata));
2055
2056 wrt_reg_dword(®->iobase_select, 0xB0300000);
2057 fw->shadow_reg[3] = htonl(rd_reg_dword(®->iobase_sdata));
2058
2059 wrt_reg_dword(®->iobase_select, 0xB0400000);
2060 fw->shadow_reg[4] = htonl(rd_reg_dword(®->iobase_sdata));
2061
2062 wrt_reg_dword(®->iobase_select, 0xB0500000);
2063 fw->shadow_reg[5] = htonl(rd_reg_dword(®->iobase_sdata));
2064
2065 wrt_reg_dword(®->iobase_select, 0xB0600000);
2066 fw->shadow_reg[6] = htonl(rd_reg_dword(®->iobase_sdata));
2067
2068 wrt_reg_dword(®->iobase_select, 0xB0700000);
2069 fw->shadow_reg[7] = htonl(rd_reg_dword(®->iobase_sdata));
2070
2071 wrt_reg_dword(®->iobase_select, 0xB0800000);
2072 fw->shadow_reg[8] = htonl(rd_reg_dword(®->iobase_sdata));
2073
2074 wrt_reg_dword(®->iobase_select, 0xB0900000);
2075 fw->shadow_reg[9] = htonl(rd_reg_dword(®->iobase_sdata));
2076
2077 wrt_reg_dword(®->iobase_select, 0xB0A00000);
2078 fw->shadow_reg[10] = htonl(rd_reg_dword(®->iobase_sdata));
2079
2080
2081 wrt_reg_dword(®->iobase_addr, 0x0010);
2082 fw->risc_io_reg = htonl(rd_reg_dword(®->iobase_window));
2083
2084
2085 mbx_reg = ®->mailbox0;
2086 for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
2087 fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
2088
2089
2090 iter_reg = fw->xseq_gp_reg;
2091 iter_reg = qla24xx_read_window(reg, 0xBE00, 16, iter_reg);
2092 iter_reg = qla24xx_read_window(reg, 0xBE10, 16, iter_reg);
2093 iter_reg = qla24xx_read_window(reg, 0xBE20, 16, iter_reg);
2094 iter_reg = qla24xx_read_window(reg, 0xBE30, 16, iter_reg);
2095 iter_reg = qla24xx_read_window(reg, 0xBE40, 16, iter_reg);
2096 iter_reg = qla24xx_read_window(reg, 0xBE50, 16, iter_reg);
2097 iter_reg = qla24xx_read_window(reg, 0xBE60, 16, iter_reg);
2098 iter_reg = qla24xx_read_window(reg, 0xBE70, 16, iter_reg);
2099 iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
2100 iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
2101 iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
2102 iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
2103 iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
2104 iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
2105 iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
2106 qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
2107
2108 iter_reg = fw->xseq_0_reg;
2109 iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
2110 iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
2111 qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
2112
2113 qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
2114
2115 qla24xx_read_window(reg, 0xBEF0, 16, fw->xseq_2_reg);
2116
2117
2118 iter_reg = fw->rseq_gp_reg;
2119 iter_reg = qla24xx_read_window(reg, 0xFE00, 16, iter_reg);
2120 iter_reg = qla24xx_read_window(reg, 0xFE10, 16, iter_reg);
2121 iter_reg = qla24xx_read_window(reg, 0xFE20, 16, iter_reg);
2122 iter_reg = qla24xx_read_window(reg, 0xFE30, 16, iter_reg);
2123 iter_reg = qla24xx_read_window(reg, 0xFE40, 16, iter_reg);
2124 iter_reg = qla24xx_read_window(reg, 0xFE50, 16, iter_reg);
2125 iter_reg = qla24xx_read_window(reg, 0xFE60, 16, iter_reg);
2126 iter_reg = qla24xx_read_window(reg, 0xFE70, 16, iter_reg);
2127 iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
2128 iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
2129 iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
2130 iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
2131 iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
2132 iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
2133 iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
2134 qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
2135
2136 iter_reg = fw->rseq_0_reg;
2137 iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
2138 qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
2139
2140 qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
2141 qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
2142 qla24xx_read_window(reg, 0xFEF0, 16, fw->rseq_3_reg);
2143
2144
2145 iter_reg = fw->aseq_gp_reg;
2146 iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
2147 iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
2148 iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
2149 iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
2150 iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
2151 iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
2152 iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
2153 iter_reg = qla24xx_read_window(reg, 0xB070, 16, iter_reg);
2154 iter_reg = qla24xx_read_window(reg, 0xB100, 16, iter_reg);
2155 iter_reg = qla24xx_read_window(reg, 0xB110, 16, iter_reg);
2156 iter_reg = qla24xx_read_window(reg, 0xB120, 16, iter_reg);
2157 iter_reg = qla24xx_read_window(reg, 0xB130, 16, iter_reg);
2158 iter_reg = qla24xx_read_window(reg, 0xB140, 16, iter_reg);
2159 iter_reg = qla24xx_read_window(reg, 0xB150, 16, iter_reg);
2160 iter_reg = qla24xx_read_window(reg, 0xB160, 16, iter_reg);
2161 qla24xx_read_window(reg, 0xB170, 16, iter_reg);
2162
2163 iter_reg = fw->aseq_0_reg;
2164 iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
2165 qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
2166
2167 qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
2168 qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
2169 qla24xx_read_window(reg, 0xB1F0, 16, fw->aseq_3_reg);
2170
2171
2172 iter_reg = fw->cmd_dma_reg;
2173 iter_reg = qla24xx_read_window(reg, 0x7100, 16, iter_reg);
2174 iter_reg = qla24xx_read_window(reg, 0x7120, 16, iter_reg);
2175 iter_reg = qla24xx_read_window(reg, 0x7130, 16, iter_reg);
2176 qla24xx_read_window(reg, 0x71F0, 16, iter_reg);
2177
2178
2179 iter_reg = fw->req0_dma_reg;
2180 iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
2181 dmp_reg = ®->iobase_q;
2182 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
2183 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
2184
2185 iter_reg = fw->resp0_dma_reg;
2186 iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
2187 dmp_reg = ®->iobase_q;
2188 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
2189 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
2190
2191 iter_reg = fw->req1_dma_reg;
2192 iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
2193 dmp_reg = ®->iobase_q;
2194 for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
2195 *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
2196
2197
2198 iter_reg = fw->xmt0_dma_reg;
2199 iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
2200 qla24xx_read_window(reg, 0x7610, 16, iter_reg);
2201
2202 iter_reg = fw->xmt1_dma_reg;
2203 iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
2204 qla24xx_read_window(reg, 0x7630, 16, iter_reg);
2205
2206 iter_reg = fw->xmt2_dma_reg;
2207 iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
2208 qla24xx_read_window(reg, 0x7650, 16, iter_reg);
2209
2210 iter_reg = fw->xmt3_dma_reg;
2211 iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
2212 qla24xx_read_window(reg, 0x7670, 16, iter_reg);
2213
2214 iter_reg = fw->xmt4_dma_reg;
2215 iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
2216 qla24xx_read_window(reg, 0x7690, 16, iter_reg);
2217
2218 qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
2219
2220
2221 iter_reg = fw->rcvt0_data_dma_reg;
2222 iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
2223 qla24xx_read_window(reg, 0x7710, 16, iter_reg);
2224
2225 iter_reg = fw->rcvt1_data_dma_reg;
2226 iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
2227 qla24xx_read_window(reg, 0x7730, 16, iter_reg);
2228
2229
2230 iter_reg = fw->risc_gp_reg;
2231 iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
2232 iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
2233 iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
2234 iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
2235 iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
2236 iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
2237 iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
2238 qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
2239
2240
2241 iter_reg = fw->lmc_reg;
2242 iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
2243 iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
2244 iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
2245 iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
2246 iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
2247 iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
2248 iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
2249 qla24xx_read_window(reg, 0x3070, 16, iter_reg);
2250
2251
2252 iter_reg = fw->fpm_hdw_reg;
2253 iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
2254 iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
2255 iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
2256 iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
2257 iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
2258 iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
2259 iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
2260 iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
2261 iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
2262 iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
2263 iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
2264 iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
2265 iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg);
2266 iter_reg = qla24xx_read_window(reg, 0x40D0, 16, iter_reg);
2267 iter_reg = qla24xx_read_window(reg, 0x40E0, 16, iter_reg);
2268 qla24xx_read_window(reg, 0x40F0, 16, iter_reg);
2269
2270
2271 iter_reg = fw->rq0_array_reg;
2272 iter_reg = qla24xx_read_window(reg, 0x5C00, 16, iter_reg);
2273 iter_reg = qla24xx_read_window(reg, 0x5C10, 16, iter_reg);
2274 iter_reg = qla24xx_read_window(reg, 0x5C20, 16, iter_reg);
2275 iter_reg = qla24xx_read_window(reg, 0x5C30, 16, iter_reg);
2276 iter_reg = qla24xx_read_window(reg, 0x5C40, 16, iter_reg);
2277 iter_reg = qla24xx_read_window(reg, 0x5C50, 16, iter_reg);
2278 iter_reg = qla24xx_read_window(reg, 0x5C60, 16, iter_reg);
2279 iter_reg = qla24xx_read_window(reg, 0x5C70, 16, iter_reg);
2280 iter_reg = qla24xx_read_window(reg, 0x5C80, 16, iter_reg);
2281 iter_reg = qla24xx_read_window(reg, 0x5C90, 16, iter_reg);
2282 iter_reg = qla24xx_read_window(reg, 0x5CA0, 16, iter_reg);
2283 iter_reg = qla24xx_read_window(reg, 0x5CB0, 16, iter_reg);
2284 iter_reg = qla24xx_read_window(reg, 0x5CC0, 16, iter_reg);
2285 iter_reg = qla24xx_read_window(reg, 0x5CD0, 16, iter_reg);
2286 iter_reg = qla24xx_read_window(reg, 0x5CE0, 16, iter_reg);
2287 qla24xx_read_window(reg, 0x5CF0, 16, iter_reg);
2288
2289
2290 iter_reg = fw->rq1_array_reg;
2291 iter_reg = qla24xx_read_window(reg, 0x5D00, 16, iter_reg);
2292 iter_reg = qla24xx_read_window(reg, 0x5D10, 16, iter_reg);
2293 iter_reg = qla24xx_read_window(reg, 0x5D20, 16, iter_reg);
2294 iter_reg = qla24xx_read_window(reg, 0x5D30, 16, iter_reg);
2295 iter_reg = qla24xx_read_window(reg, 0x5D40, 16, iter_reg);
2296 iter_reg = qla24xx_read_window(reg, 0x5D50, 16, iter_reg);
2297 iter_reg = qla24xx_read_window(reg, 0x5D60, 16, iter_reg);
2298 iter_reg = qla24xx_read_window(reg, 0x5D70, 16, iter_reg);
2299 iter_reg = qla24xx_read_window(reg, 0x5D80, 16, iter_reg);
2300 iter_reg = qla24xx_read_window(reg, 0x5D90, 16, iter_reg);
2301 iter_reg = qla24xx_read_window(reg, 0x5DA0, 16, iter_reg);
2302 iter_reg = qla24xx_read_window(reg, 0x5DB0, 16, iter_reg);
2303 iter_reg = qla24xx_read_window(reg, 0x5DC0, 16, iter_reg);
2304 iter_reg = qla24xx_read_window(reg, 0x5DD0, 16, iter_reg);
2305 iter_reg = qla24xx_read_window(reg, 0x5DE0, 16, iter_reg);
2306 qla24xx_read_window(reg, 0x5DF0, 16, iter_reg);
2307
2308
2309 iter_reg = fw->rp0_array_reg;
2310 iter_reg = qla24xx_read_window(reg, 0x5E00, 16, iter_reg);
2311 iter_reg = qla24xx_read_window(reg, 0x5E10, 16, iter_reg);
2312 iter_reg = qla24xx_read_window(reg, 0x5E20, 16, iter_reg);
2313 iter_reg = qla24xx_read_window(reg, 0x5E30, 16, iter_reg);
2314 iter_reg = qla24xx_read_window(reg, 0x5E40, 16, iter_reg);
2315 iter_reg = qla24xx_read_window(reg, 0x5E50, 16, iter_reg);
2316 iter_reg = qla24xx_read_window(reg, 0x5E60, 16, iter_reg);
2317 iter_reg = qla24xx_read_window(reg, 0x5E70, 16, iter_reg);
2318 iter_reg = qla24xx_read_window(reg, 0x5E80, 16, iter_reg);
2319 iter_reg = qla24xx_read_window(reg, 0x5E90, 16, iter_reg);
2320 iter_reg = qla24xx_read_window(reg, 0x5EA0, 16, iter_reg);
2321 iter_reg = qla24xx_read_window(reg, 0x5EB0, 16, iter_reg);
2322 iter_reg = qla24xx_read_window(reg, 0x5EC0, 16, iter_reg);
2323 iter_reg = qla24xx_read_window(reg, 0x5ED0, 16, iter_reg);
2324 iter_reg = qla24xx_read_window(reg, 0x5EE0, 16, iter_reg);
2325 qla24xx_read_window(reg, 0x5EF0, 16, iter_reg);
2326
2327
2328 iter_reg = fw->rp1_array_reg;
2329 iter_reg = qla24xx_read_window(reg, 0x5F00, 16, iter_reg);
2330 iter_reg = qla24xx_read_window(reg, 0x5F10, 16, iter_reg);
2331 iter_reg = qla24xx_read_window(reg, 0x5F20, 16, iter_reg);
2332 iter_reg = qla24xx_read_window(reg, 0x5F30, 16, iter_reg);
2333 iter_reg = qla24xx_read_window(reg, 0x5F40, 16, iter_reg);
2334 iter_reg = qla24xx_read_window(reg, 0x5F50, 16, iter_reg);
2335 iter_reg = qla24xx_read_window(reg, 0x5F60, 16, iter_reg);
2336 iter_reg = qla24xx_read_window(reg, 0x5F70, 16, iter_reg);
2337 iter_reg = qla24xx_read_window(reg, 0x5F80, 16, iter_reg);
2338 iter_reg = qla24xx_read_window(reg, 0x5F90, 16, iter_reg);
2339 iter_reg = qla24xx_read_window(reg, 0x5FA0, 16, iter_reg);
2340 iter_reg = qla24xx_read_window(reg, 0x5FB0, 16, iter_reg);
2341 iter_reg = qla24xx_read_window(reg, 0x5FC0, 16, iter_reg);
2342 iter_reg = qla24xx_read_window(reg, 0x5FD0, 16, iter_reg);
2343 iter_reg = qla24xx_read_window(reg, 0x5FE0, 16, iter_reg);
2344 qla24xx_read_window(reg, 0x5FF0, 16, iter_reg);
2345
2346 iter_reg = fw->at0_array_reg;
2347 iter_reg = qla24xx_read_window(reg, 0x7080, 16, iter_reg);
2348 iter_reg = qla24xx_read_window(reg, 0x7090, 16, iter_reg);
2349 iter_reg = qla24xx_read_window(reg, 0x70A0, 16, iter_reg);
2350 iter_reg = qla24xx_read_window(reg, 0x70B0, 16, iter_reg);
2351 iter_reg = qla24xx_read_window(reg, 0x70C0, 16, iter_reg);
2352 iter_reg = qla24xx_read_window(reg, 0x70D0, 16, iter_reg);
2353 iter_reg = qla24xx_read_window(reg, 0x70E0, 16, iter_reg);
2354 qla24xx_read_window(reg, 0x70F0, 16, iter_reg);
2355
2356
2357 qla24xx_read_window(reg, 0x7800, 16, fw->queue_control_reg);
2358
2359
2360 iter_reg = fw->fb_hdw_reg;
2361 iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
2362 iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
2363 iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
2364 iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
2365 iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
2366 iter_reg = qla24xx_read_window(reg, 0x6060, 16, iter_reg);
2367 iter_reg = qla24xx_read_window(reg, 0x6070, 16, iter_reg);
2368 iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
2369 iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
2370 iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
2371 iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
2372 iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
2373 iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
2374 iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg);
2375 iter_reg = qla24xx_read_window(reg, 0x6530, 16, iter_reg);
2376 iter_reg = qla24xx_read_window(reg, 0x6540, 16, iter_reg);
2377 iter_reg = qla24xx_read_window(reg, 0x6550, 16, iter_reg);
2378 iter_reg = qla24xx_read_window(reg, 0x6560, 16, iter_reg);
2379 iter_reg = qla24xx_read_window(reg, 0x6570, 16, iter_reg);
2380 iter_reg = qla24xx_read_window(reg, 0x6580, 16, iter_reg);
2381 iter_reg = qla24xx_read_window(reg, 0x6590, 16, iter_reg);
2382 iter_reg = qla24xx_read_window(reg, 0x65A0, 16, iter_reg);
2383 iter_reg = qla24xx_read_window(reg, 0x65B0, 16, iter_reg);
2384 iter_reg = qla24xx_read_window(reg, 0x65C0, 16, iter_reg);
2385 iter_reg = qla24xx_read_window(reg, 0x65D0, 16, iter_reg);
2386 iter_reg = qla24xx_read_window(reg, 0x65E0, 16, iter_reg);
2387 qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
2388
2389
2390 nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
2391 &last_chain);
2392
2393 rval = qla24xx_soft_reset(ha);
2394 if (rval != QLA_SUCCESS) {
2395 ql_log(ql_log_warn, vha, 0xd00e,
2396 "SOFT RESET FAILED, forcing continuation of dump!!!\n");
2397 rval = QLA_SUCCESS;
2398
2399 ql_log(ql_log_warn, vha, 0xd00f, "try a bigger hammer!!!\n");
2400
2401 wrt_reg_dword(®->hccr, HCCRX_SET_RISC_RESET);
2402 rd_reg_dword(®->hccr);
2403
2404 wrt_reg_dword(®->hccr, HCCRX_REL_RISC_PAUSE);
2405 rd_reg_dword(®->hccr);
2406
2407 wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_RESET);
2408 rd_reg_dword(®->hccr);
2409
2410 for (cnt = 30000; cnt && (rd_reg_word(®->mailbox0)); cnt--)
2411 udelay(5);
2412
2413 if (!cnt) {
2414 nxt = fw->code_ram;
2415 nxt += sizeof(fw->code_ram);
2416 nxt += (ha->fw_memory_size - 0x100000 + 1);
2417 goto copy_queue;
2418 } else {
2419 set_bit(RISC_RDY_AFT_RESET, &ha->fw_dump_cap_flags);
2420 ql_log(ql_log_warn, vha, 0xd010,
2421 "bigger hammer success?\n");
2422 }
2423 }
2424
2425 rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
2426 &nxt);
2427 if (rval != QLA_SUCCESS)
2428 goto qla83xx_fw_dump_failed_0;
2429
2430 copy_queue:
2431 nxt = qla2xxx_copy_queues(ha, nxt);
2432
2433 qla24xx_copy_eft(ha, nxt);
2434
2435
2436 nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
2437 nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
2438 nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
2439 nxt_chain = qla25xx_copy_exlogin(ha, nxt_chain, &last_chain);
2440 nxt_chain = qla81xx_copy_exchoffld(ha, nxt_chain, &last_chain);
2441 if (last_chain) {
2442 ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
2443 *last_chain |= htonl(DUMP_CHAIN_LAST);
2444 }
2445
2446
2447 ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
2448
2449 qla83xx_fw_dump_failed_0:
2450 qla2xxx_dump_post_process(base_vha, rval);
2451 }
2452
2453
2454
2455
2456
2457
2458 static void ql_dbg_prefix(char *pbuf, int pbuf_size,
2459 const scsi_qla_host_t *vha, uint msg_id)
2460 {
2461 if (vha) {
2462 const struct pci_dev *pdev = vha->hw->pdev;
2463
2464
2465 snprintf(pbuf, pbuf_size, "%s [%s]-%04x:%lu: ", QL_MSGHDR,
2466 dev_name(&(pdev->dev)), msg_id, vha->host_no);
2467 } else {
2468
2469 snprintf(pbuf, pbuf_size, "%s [%s]-%04x: : ", QL_MSGHDR,
2470 "0000:00:00.0", msg_id);
2471 }
2472 }
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487 void
2488 ql_dbg(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
2489 {
2490 va_list va;
2491 struct va_format vaf;
2492 char pbuf[64];
2493
2494 if (!ql_mask_match(level) && !trace_ql_dbg_log_enabled())
2495 return;
2496
2497 va_start(va, fmt);
2498
2499 vaf.fmt = fmt;
2500 vaf.va = &va;
2501
2502 ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), vha, id);
2503
2504 if (!ql_mask_match(level))
2505 trace_ql_dbg_log(pbuf, &vaf);
2506 else
2507 pr_warn("%s%pV", pbuf, &vaf);
2508
2509 va_end(va);
2510
2511 }
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527 void
2528 ql_dbg_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
2529 {
2530 va_list va;
2531 struct va_format vaf;
2532 char pbuf[128];
2533
2534 if (pdev == NULL)
2535 return;
2536 if (!ql_mask_match(level))
2537 return;
2538
2539 va_start(va, fmt);
2540
2541 vaf.fmt = fmt;
2542 vaf.va = &va;
2543
2544 ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), NULL, id + ql_dbg_offset);
2545 pr_warn("%s%pV", pbuf, &vaf);
2546
2547 va_end(va);
2548 }
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563 void
2564 ql_log(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
2565 {
2566 va_list va;
2567 struct va_format vaf;
2568 char pbuf[128];
2569
2570 if (level > ql_errlev)
2571 return;
2572
2573 ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), vha, id);
2574
2575 va_start(va, fmt);
2576
2577 vaf.fmt = fmt;
2578 vaf.va = &va;
2579
2580 switch (level) {
2581 case ql_log_fatal:
2582 pr_crit("%s%pV", pbuf, &vaf);
2583 break;
2584 case ql_log_warn:
2585 pr_err("%s%pV", pbuf, &vaf);
2586 break;
2587 case ql_log_info:
2588 pr_warn("%s%pV", pbuf, &vaf);
2589 break;
2590 default:
2591 pr_info("%s%pV", pbuf, &vaf);
2592 break;
2593 }
2594
2595 va_end(va);
2596 }
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612 void
2613 ql_log_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
2614 {
2615 va_list va;
2616 struct va_format vaf;
2617 char pbuf[128];
2618
2619 if (pdev == NULL)
2620 return;
2621 if (level > ql_errlev)
2622 return;
2623
2624 ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), NULL, id);
2625
2626 va_start(va, fmt);
2627
2628 vaf.fmt = fmt;
2629 vaf.va = &va;
2630
2631 switch (level) {
2632 case ql_log_fatal:
2633 pr_crit("%s%pV", pbuf, &vaf);
2634 break;
2635 case ql_log_warn:
2636 pr_err("%s%pV", pbuf, &vaf);
2637 break;
2638 case ql_log_info:
2639 pr_warn("%s%pV", pbuf, &vaf);
2640 break;
2641 default:
2642 pr_info("%s%pV", pbuf, &vaf);
2643 break;
2644 }
2645
2646 va_end(va);
2647 }
2648
2649 void
2650 ql_dump_regs(uint level, scsi_qla_host_t *vha, uint id)
2651 {
2652 int i;
2653 struct qla_hw_data *ha = vha->hw;
2654 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
2655 struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24;
2656 struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82;
2657 __le16 __iomem *mbx_reg;
2658
2659 if (!ql_mask_match(level))
2660 return;
2661
2662 if (IS_P3P_TYPE(ha))
2663 mbx_reg = ®82->mailbox_in[0];
2664 else if (IS_FWI2_CAPABLE(ha))
2665 mbx_reg = ®24->mailbox0;
2666 else
2667 mbx_reg = MAILBOX_REG(ha, reg, 0);
2668
2669 ql_dbg(level, vha, id, "Mailbox registers:\n");
2670 for (i = 0; i < 6; i++, mbx_reg++)
2671 ql_dbg(level, vha, id,
2672 "mbox[%d] %#04x\n", i, rd_reg_word(mbx_reg));
2673 }
2674
2675 void
2676 ql_dump_buffer(uint level, scsi_qla_host_t *vha, uint id, const void *buf,
2677 uint size)
2678 {
2679 uint cnt;
2680
2681 if (!ql_mask_match(level))
2682 return;
2683
2684 ql_dbg(level, vha, id,
2685 "%-+5d 0 1 2 3 4 5 6 7 8 9 A B C D E F\n", size);
2686 ql_dbg(level, vha, id,
2687 "----- -----------------------------------------------\n");
2688 for (cnt = 0; cnt < size; cnt += 16) {
2689 ql_dbg(level, vha, id, "%04x: ", cnt);
2690 print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1,
2691 buf + cnt, min(16U, size - cnt), false);
2692 }
2693 }
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708 void
2709 ql_log_qp(uint32_t level, struct qla_qpair *qpair, int32_t id,
2710 const char *fmt, ...)
2711 {
2712 va_list va;
2713 struct va_format vaf;
2714 char pbuf[128];
2715
2716 if (level > ql_errlev)
2717 return;
2718
2719 ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), qpair ? qpair->vha : NULL, id);
2720
2721 va_start(va, fmt);
2722
2723 vaf.fmt = fmt;
2724 vaf.va = &va;
2725
2726 switch (level) {
2727 case ql_log_fatal:
2728 pr_crit("%s%pV", pbuf, &vaf);
2729 break;
2730 case ql_log_warn:
2731 pr_err("%s%pV", pbuf, &vaf);
2732 break;
2733 case ql_log_info:
2734 pr_warn("%s%pV", pbuf, &vaf);
2735 break;
2736 default:
2737 pr_info("%s%pV", pbuf, &vaf);
2738 break;
2739 }
2740
2741 va_end(va);
2742 }
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757 void
2758 ql_dbg_qp(uint32_t level, struct qla_qpair *qpair, int32_t id,
2759 const char *fmt, ...)
2760 {
2761 va_list va;
2762 struct va_format vaf;
2763 char pbuf[128];
2764
2765 if (!ql_mask_match(level))
2766 return;
2767
2768 va_start(va, fmt);
2769
2770 vaf.fmt = fmt;
2771 vaf.va = &va;
2772
2773 ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), qpair ? qpair->vha : NULL,
2774 id + ql_dbg_offset);
2775 pr_warn("%s%pV", pbuf, &vaf);
2776
2777 va_end(va);
2778
2779 }