| .. | .. |
|---|
| 1 | 1 | /******************************************************************* |
|---|
| 2 | 2 | * This file is part of the Emulex Linux Device Driver for * |
|---|
| 3 | 3 | * Fibre Channel Host Bus Adapters. * |
|---|
| 4 | | - * Copyright (C) 2017-2018 Broadcom. All Rights Reserved. The term * |
|---|
| 4 | + * Copyright (C) 2017-2019 Broadcom. All Rights Reserved. The term * |
|---|
| 5 | 5 | * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * |
|---|
| 6 | 6 | * Copyright (C) 2007-2011 Emulex. All rights reserved. * |
|---|
| 7 | 7 | * EMULEX and SLI are trademarks of Emulex. * |
|---|
| .. | .. |
|---|
| 46 | 46 | |
|---|
| 47 | 47 | /* nvmestat output buffer size */ |
|---|
| 48 | 48 | #define LPFC_NVMESTAT_SIZE 8192 |
|---|
| 49 | | -#define LPFC_NVMEKTIME_SIZE 8192 |
|---|
| 50 | | -#define LPFC_CPUCHECK_SIZE 8192 |
|---|
| 49 | +#define LPFC_IOKTIME_SIZE 8192 |
|---|
| 51 | 50 | #define LPFC_NVMEIO_TRC_SIZE 8192 |
|---|
| 51 | + |
|---|
| 52 | +/* scsistat output buffer size */ |
|---|
| 53 | +#define LPFC_SCSISTAT_SIZE 8192 |
|---|
| 52 | 54 | |
|---|
| 53 | 55 | #define LPFC_DEBUG_OUT_LINE_SZ 80 |
|---|
| 54 | 56 | |
|---|
| .. | .. |
|---|
| 284 | 286 | |
|---|
| 285 | 287 | #endif |
|---|
| 286 | 288 | |
|---|
| 289 | +/* multixripool output buffer size */ |
|---|
| 290 | +#define LPFC_DUMP_MULTIXRIPOOL_SIZE 8192 |
|---|
| 291 | + |
|---|
| 287 | 292 | enum { |
|---|
| 288 | | - DUMP_FCP, |
|---|
| 289 | | - DUMP_NVME, |
|---|
| 293 | + DUMP_IO, |
|---|
| 290 | 294 | DUMP_MBX, |
|---|
| 291 | 295 | DUMP_ELS, |
|---|
| 292 | 296 | DUMP_NVMELS, |
|---|
| .. | .. |
|---|
| 324 | 328 | * This function dumps an entry indexed by @idx from a queue specified by the |
|---|
| 325 | 329 | * queue descriptor @q. |
|---|
| 326 | 330 | **/ |
|---|
| 327 | | -static inline void |
|---|
| 331 | +static void |
|---|
| 328 | 332 | lpfc_debug_dump_qe(struct lpfc_queue *q, uint32_t idx) |
|---|
| 329 | 333 | { |
|---|
| 330 | 334 | char line_buf[LPFC_LBUF_SZ]; |
|---|
| .. | .. |
|---|
| 339 | 343 | |
|---|
| 340 | 344 | esize = q->entry_size; |
|---|
| 341 | 345 | qe_word_cnt = esize / sizeof(uint32_t); |
|---|
| 342 | | - pword = q->qe[idx].address; |
|---|
| 346 | + pword = lpfc_sli4_qe(q, idx); |
|---|
| 343 | 347 | |
|---|
| 344 | 348 | len = 0; |
|---|
| 345 | 349 | len += scnprintf(line_buf+len, LPFC_LBUF_SZ-len, "QE[%04d]: ", idx); |
|---|
| .. | .. |
|---|
| 409 | 413 | struct lpfc_queue *wq; |
|---|
| 410 | 414 | char *qtypestr; |
|---|
| 411 | 415 | |
|---|
| 412 | | - if (qtype == DUMP_FCP) { |
|---|
| 413 | | - wq = phba->sli4_hba.fcp_wq[wqidx]; |
|---|
| 414 | | - qtypestr = "FCP"; |
|---|
| 415 | | - } else if (qtype == DUMP_NVME) { |
|---|
| 416 | | - wq = phba->sli4_hba.nvme_wq[wqidx]; |
|---|
| 417 | | - qtypestr = "NVME"; |
|---|
| 416 | + if (qtype == DUMP_IO) { |
|---|
| 417 | + wq = phba->sli4_hba.hdwq[wqidx].io_wq; |
|---|
| 418 | + qtypestr = "IO"; |
|---|
| 418 | 419 | } else if (qtype == DUMP_MBX) { |
|---|
| 419 | 420 | wq = phba->sli4_hba.mbx_wq; |
|---|
| 420 | 421 | qtypestr = "MBX"; |
|---|
| .. | .. |
|---|
| 427 | 428 | } else |
|---|
| 428 | 429 | return; |
|---|
| 429 | 430 | |
|---|
| 430 | | - if (qtype == DUMP_FCP || qtype == DUMP_NVME) |
|---|
| 431 | + if (qtype == DUMP_IO) |
|---|
| 431 | 432 | pr_err("%s WQ: WQ[Idx:%d|Qid:%d]\n", |
|---|
| 432 | 433 | qtypestr, wqidx, wq->queue_id); |
|---|
| 433 | 434 | else |
|---|
| .. | .. |
|---|
| 453 | 454 | char *qtypestr; |
|---|
| 454 | 455 | int eqidx; |
|---|
| 455 | 456 | |
|---|
| 456 | | - /* fcp/nvme wq and cq are 1:1, thus same indexes */ |
|---|
| 457 | + /* io wq and cq are 1:1, thus same indexes */ |
|---|
| 458 | + eq = NULL; |
|---|
| 457 | 459 | |
|---|
| 458 | | - if (qtype == DUMP_FCP) { |
|---|
| 459 | | - wq = phba->sli4_hba.fcp_wq[wqidx]; |
|---|
| 460 | | - cq = phba->sli4_hba.fcp_cq[wqidx]; |
|---|
| 461 | | - qtypestr = "FCP"; |
|---|
| 462 | | - } else if (qtype == DUMP_NVME) { |
|---|
| 463 | | - wq = phba->sli4_hba.nvme_wq[wqidx]; |
|---|
| 464 | | - cq = phba->sli4_hba.nvme_cq[wqidx]; |
|---|
| 465 | | - qtypestr = "NVME"; |
|---|
| 460 | + if (qtype == DUMP_IO) { |
|---|
| 461 | + wq = phba->sli4_hba.hdwq[wqidx].io_wq; |
|---|
| 462 | + cq = phba->sli4_hba.hdwq[wqidx].io_cq; |
|---|
| 463 | + qtypestr = "IO"; |
|---|
| 466 | 464 | } else if (qtype == DUMP_MBX) { |
|---|
| 467 | 465 | wq = phba->sli4_hba.mbx_wq; |
|---|
| 468 | 466 | cq = phba->sli4_hba.mbx_cq; |
|---|
| .. | .. |
|---|
| 478 | 476 | } else |
|---|
| 479 | 477 | return; |
|---|
| 480 | 478 | |
|---|
| 481 | | - for (eqidx = 0; eqidx < phba->io_channel_irqs; eqidx++) { |
|---|
| 482 | | - if (cq->assoc_qid == phba->sli4_hba.hba_eq[eqidx]->queue_id) |
|---|
| 479 | + for (eqidx = 0; eqidx < phba->cfg_hdw_queue; eqidx++) { |
|---|
| 480 | + eq = phba->sli4_hba.hdwq[eqidx].hba_eq; |
|---|
| 481 | + if (cq->assoc_qid == eq->queue_id) |
|---|
| 483 | 482 | break; |
|---|
| 484 | 483 | } |
|---|
| 485 | | - if (eqidx == phba->io_channel_irqs) { |
|---|
| 484 | + if (eqidx == phba->cfg_hdw_queue) { |
|---|
| 486 | 485 | pr_err("Couldn't find EQ for CQ. Using EQ[0]\n"); |
|---|
| 487 | 486 | eqidx = 0; |
|---|
| 487 | + eq = phba->sli4_hba.hdwq[0].hba_eq; |
|---|
| 488 | 488 | } |
|---|
| 489 | 489 | |
|---|
| 490 | | - eq = phba->sli4_hba.hba_eq[eqidx]; |
|---|
| 491 | | - |
|---|
| 492 | | - if (qtype == DUMP_FCP || qtype == DUMP_NVME) |
|---|
| 490 | + if (qtype == DUMP_IO) |
|---|
| 493 | 491 | pr_err("%s CQ: WQ[Idx:%d|Qid%d]->CQ[Idx%d|Qid%d]" |
|---|
| 494 | 492 | "->EQ[Idx:%d|Qid:%d]:\n", |
|---|
| 495 | 493 | qtypestr, wqidx, wq->queue_id, wqidx, cq->queue_id, |
|---|
| .. | .. |
|---|
| 516 | 514 | { |
|---|
| 517 | 515 | struct lpfc_queue *qp; |
|---|
| 518 | 516 | |
|---|
| 519 | | - qp = phba->sli4_hba.hba_eq[qidx]; |
|---|
| 517 | + qp = phba->sli4_hba.hdwq[qidx].hba_eq; |
|---|
| 520 | 518 | |
|---|
| 521 | 519 | pr_err("EQ[Idx:%d|Qid:%d]\n", qidx, qp->queue_id); |
|---|
| 522 | 520 | |
|---|
| .. | .. |
|---|
| 564 | 562 | { |
|---|
| 565 | 563 | int wq_idx; |
|---|
| 566 | 564 | |
|---|
| 567 | | - for (wq_idx = 0; wq_idx < phba->cfg_fcp_io_channel; wq_idx++) |
|---|
| 568 | | - if (phba->sli4_hba.fcp_wq[wq_idx]->queue_id == qid) |
|---|
| 565 | + for (wq_idx = 0; wq_idx < phba->cfg_hdw_queue; wq_idx++) |
|---|
| 566 | + if (phba->sli4_hba.hdwq[wq_idx].io_wq->queue_id == qid) |
|---|
| 569 | 567 | break; |
|---|
| 570 | | - if (wq_idx < phba->cfg_fcp_io_channel) { |
|---|
| 571 | | - pr_err("FCP WQ[Idx:%d|Qid:%d]\n", wq_idx, qid); |
|---|
| 572 | | - lpfc_debug_dump_q(phba->sli4_hba.fcp_wq[wq_idx]); |
|---|
| 573 | | - return; |
|---|
| 574 | | - } |
|---|
| 575 | | - |
|---|
| 576 | | - for (wq_idx = 0; wq_idx < phba->cfg_nvme_io_channel; wq_idx++) |
|---|
| 577 | | - if (phba->sli4_hba.nvme_wq[wq_idx]->queue_id == qid) |
|---|
| 578 | | - break; |
|---|
| 579 | | - if (wq_idx < phba->cfg_nvme_io_channel) { |
|---|
| 580 | | - pr_err("NVME WQ[Idx:%d|Qid:%d]\n", wq_idx, qid); |
|---|
| 581 | | - lpfc_debug_dump_q(phba->sli4_hba.nvme_wq[wq_idx]); |
|---|
| 568 | + if (wq_idx < phba->cfg_hdw_queue) { |
|---|
| 569 | + pr_err("IO WQ[Idx:%d|Qid:%d]\n", wq_idx, qid); |
|---|
| 570 | + lpfc_debug_dump_q(phba->sli4_hba.hdwq[wq_idx].io_wq); |
|---|
| 582 | 571 | return; |
|---|
| 583 | 572 | } |
|---|
| 584 | 573 | |
|---|
| .. | .. |
|---|
| 646 | 635 | { |
|---|
| 647 | 636 | int cq_idx; |
|---|
| 648 | 637 | |
|---|
| 649 | | - for (cq_idx = 0; cq_idx < phba->cfg_fcp_io_channel; cq_idx++) |
|---|
| 650 | | - if (phba->sli4_hba.fcp_cq[cq_idx]->queue_id == qid) |
|---|
| 638 | + for (cq_idx = 0; cq_idx < phba->cfg_hdw_queue; cq_idx++) |
|---|
| 639 | + if (phba->sli4_hba.hdwq[cq_idx].io_cq->queue_id == qid) |
|---|
| 651 | 640 | break; |
|---|
| 652 | 641 | |
|---|
| 653 | | - if (cq_idx < phba->cfg_fcp_io_channel) { |
|---|
| 654 | | - pr_err("FCP CQ[Idx:%d|Qid:%d]\n", cq_idx, qid); |
|---|
| 655 | | - lpfc_debug_dump_q(phba->sli4_hba.fcp_cq[cq_idx]); |
|---|
| 656 | | - return; |
|---|
| 657 | | - } |
|---|
| 658 | | - |
|---|
| 659 | | - for (cq_idx = 0; cq_idx < phba->cfg_nvme_io_channel; cq_idx++) |
|---|
| 660 | | - if (phba->sli4_hba.nvme_cq[cq_idx]->queue_id == qid) |
|---|
| 661 | | - break; |
|---|
| 662 | | - |
|---|
| 663 | | - if (cq_idx < phba->cfg_nvme_io_channel) { |
|---|
| 664 | | - pr_err("NVME CQ[Idx:%d|Qid:%d]\n", cq_idx, qid); |
|---|
| 665 | | - lpfc_debug_dump_q(phba->sli4_hba.nvme_cq[cq_idx]); |
|---|
| 642 | + if (cq_idx < phba->cfg_hdw_queue) { |
|---|
| 643 | + pr_err("IO CQ[Idx:%d|Qid:%d]\n", cq_idx, qid); |
|---|
| 644 | + lpfc_debug_dump_q(phba->sli4_hba.hdwq[cq_idx].io_cq); |
|---|
| 666 | 645 | return; |
|---|
| 667 | 646 | } |
|---|
| 668 | 647 | |
|---|
| .. | .. |
|---|
| 697 | 676 | { |
|---|
| 698 | 677 | int eq_idx; |
|---|
| 699 | 678 | |
|---|
| 700 | | - for (eq_idx = 0; eq_idx < phba->io_channel_irqs; eq_idx++) |
|---|
| 701 | | - if (phba->sli4_hba.hba_eq[eq_idx]->queue_id == qid) |
|---|
| 679 | + for (eq_idx = 0; eq_idx < phba->cfg_hdw_queue; eq_idx++) |
|---|
| 680 | + if (phba->sli4_hba.hdwq[eq_idx].hba_eq->queue_id == qid) |
|---|
| 702 | 681 | break; |
|---|
| 703 | 682 | |
|---|
| 704 | | - if (eq_idx < phba->io_channel_irqs) { |
|---|
| 683 | + if (eq_idx < phba->cfg_hdw_queue) { |
|---|
| 705 | 684 | printk(KERN_ERR "FCP EQ[Idx:%d|Qid:%d]\n", eq_idx, qid); |
|---|
| 706 | | - lpfc_debug_dump_q(phba->sli4_hba.hba_eq[eq_idx]); |
|---|
| 685 | + lpfc_debug_dump_q(phba->sli4_hba.hdwq[eq_idx].hba_eq); |
|---|
| 707 | 686 | return; |
|---|
| 708 | 687 | } |
|---|
| 709 | 688 | } |
|---|