23 #include <linux/pci.h>
24 #include <linux/slab.h>
26 #include <linux/list.h>
28 #include <scsi/scsi.h>
94 #define MENLO_DID 0x0000FC0E
127 #define BUF_SZ_4K 4096
128 #define SLI_CT_ELX_LOOPBACK 0x10
135 #define ELX_LOOPBACK_HEADER_SZ \
136 (size_t)(&((struct lpfc_sli_ct_request *)NULL)->un)
162 lpfc_bsg_send_mgmt_cmd_cmp(
struct lpfc_hba *phba,
178 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
188 rsp = &rspiocbq->
iocb;
212 job->
reply->reply_payload_rcv_len =
224 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
233 lpfc_bsg_send_mgmt_cmd(
struct fc_bsg_job *job)
255 job->
reply->reply_payload_rcv_len = 0;
261 "2733 Failed allocation of dd_data\n");
295 INIT_LIST_HEAD(&bmp->
list);
321 cmd->un.genreq64.bdl.ulpIoTag32 = 0;
325 cmd->un.genreq64.bdl.bdeSize =
326 (request_nseg + reply_nseg) *
sizeof(
struct ulp_bde64);
328 cmd->un.genreq64.w5.hcsw.Fctl = (
SI |
LA);
329 cmd->un.genreq64.w5.hcsw.Dfctl = 0;
332 cmd->ulpBdeCount = 1;
345 cmdiocbq->
iocb_cmpl = lpfc_bsg_send_mgmt_cmd_cmp;
354 if (lpfc_readl(phba->
HCregaddr, &creg_val)) {
413 lpfc_bsg_rport_els_cmp(
struct lpfc_hba *phba,
431 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
443 rsp = &rspiocbq->
iocb;
454 job->
reply->reply_payload_rcv_len =
457 job->
reply->reply_payload_rcv_len =
461 els_reply = &job->
reply->reply_data.ctels_reply;
463 els_reply->
rjt_data.action = rjt_data[3];
464 els_reply->
rjt_data.reason_code = rjt_data[2];
465 els_reply->
rjt_data.reason_explanation = rjt_data[1];
466 els_reply->
rjt_data.vendor_unique = rjt_data[0];
481 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
517 job->
reply->reply_payload_rcv_len = 0;
523 "2735 Failed allocation of dd_data\n");
533 elscmd = job->
request->rqst_data.r_els.els_code;
543 rsp = &rspiocbq->
iocb;
591 (request_nseg + reply_nseg) *
sizeof(
struct ulp_bde64);
600 cmdiocbq->
iocb_cmpl = lpfc_bsg_rport_els_cmp;
612 if (lpfc_readl(phba->
HCregaddr, &creg_val)) {
661 lpfc_bsg_event_free(
struct kref *
kref)
693 kref_get(&evt->
kref);
703 kref_put(&evt->
kref, lpfc_bsg_event_free);
727 kref_init(&evt->
kref);
743 if ((!mlist) || (!lpfc_is_link_up(phba) &&
796 INIT_LIST_HEAD(&head);
801 goto error_ct_unsol_exit;
805 goto error_ct_unsol_exit;
815 goto error_ct_unsol_exit;
817 evt_req_id = ct_req->
FsType;
826 evt->
req_id != evt_req_id)
829 lpfc_bsg_event_ref(evt);
830 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
831 evt_dat = kzalloc(
sizeof(*evt_dat),
GFP_KERNEL);
832 if (evt_dat ==
NULL) {
834 lpfc_bsg_event_unref(evt);
836 "2614 Memory allocation failed for "
856 "2615 Memory allocation failed for "
857 "CT event data, size %d\n",
861 lpfc_bsg_event_unref(evt);
862 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
863 goto error_ct_unsol_exit;
878 size = hbqe->
bde.tus.f.bdeSize;
884 size = hbqe->
bde.tus.f.bdeSize;
887 if ((offset + size) > evt_dat->
len)
888 size = evt_dat->
len - offset;
901 "found for iocbq 0x%p\n",
907 lpfc_bsg_event_unref(evt);
908 spin_unlock_irqrestore(
910 goto error_ct_unsol_exit;
925 diag_cmd_data_free(phba,
963 "2717 CT context array entry "
964 "[%d] over-run: oxid:x%x, "
984 lpfc_bsg_event_unref(evt);
989 lpfc_bsg_event_unref(evt);
994 job->
reply->reply_payload_rcv_len =
size;
996 job->
reply->result = 0;
999 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
1004 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
1006 error_ct_unsol_exit:
1007 if (!list_empty(&head))
1020 lpfc_bsg_hba_set_event(
struct fc_bsg_job *job)
1029 unsigned long flags;
1034 "2612 Received SET_CT_EVENT below minimum "
1041 if (dd_data ==
NULL) {
1043 "2734 Failed allocation of dd_data\n");
1049 job->
request->rqst_data.h_vendor.vendor_cmd;
1050 ev_mask = ((
uint32_t)(
unsigned long)event_req->type_mask &
1054 if (evt->
reg_id == event_req->ev_reg_id) {
1055 lpfc_bsg_event_ref(evt);
1060 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
1064 evt = lpfc_bsg_event_new(ev_mask, event_req->ev_reg_id,
1065 event_req->ev_req_id);
1068 "2617 Failed allocation of event "
1076 lpfc_bsg_event_ref(evt);
1078 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
1087 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
1091 if (dd_data !=
NULL)
1103 lpfc_bsg_hba_get_event(
struct fc_bsg_job *job)
1111 unsigned long flags;
1117 "2613 Received GET_CT_EVENT request below "
1124 job->
request->rqst_data.h_vendor.vendor_cmd;
1127 job->
reply->reply_data.vendor_reply.vendor_rsp;
1130 if (evt->
reg_id == event_req->ev_reg_id) {
1133 lpfc_bsg_event_ref(evt);
1141 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
1146 if (evt_dat ==
NULL) {
1147 job->
reply->reply_payload_rcv_len = 0;
1155 "2618 Truncated event data at %d "
1160 event_reply->type = evt_dat->type;
1161 event_reply->immed_data = evt_dat->immed_dat;
1162 if (evt_dat->len > 0)
1163 job->
reply->reply_payload_rcv_len =
1166 evt_dat->data, evt_dat->len);
1168 job->
reply->reply_payload_rcv_len = 0;
1171 kfree(evt_dat->data);
1176 lpfc_bsg_event_unref(evt);
1177 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
1179 job->
reply->result = 0;
1207 lpfc_issue_ct_rsp_cmp(
struct lpfc_hba *phba,
1216 unsigned long flags;
1223 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
1229 rsp = &rspiocbq->
iocb;
1251 job->
reply->reply_payload_rcv_len =
1264 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
1291 "2736 Failed allocation of dd_data\n");
1303 icmd = &ctiocb->
iocb;
1323 goto issue_ct_rsp_exit;
1330 "2721 ndlp null for oxid %x SID %x\n",
1334 goto issue_ct_rsp_exit;
1340 goto issue_ct_rsp_exit;
1348 goto issue_ct_rsp_exit;
1355 phba->
ct_ctx[
tag].flags &= ~UNSOL_VALID;
1363 "2722 Xmit CT response on exchange x%x Data: x%x x%x x%x\n",
1371 ctiocb->
iocb_cmpl = lpfc_issue_ct_rsp_cmp;
1382 if (lpfc_readl(phba->
HCregaddr, &creg_val)) {
1384 goto issue_ct_rsp_exit;
1409 lpfc_bsg_send_mgmt_rsp(
struct fc_bsg_job *job)
1414 job->
request->rqst_data.h_vendor.vendor_cmd;
1422 unsigned long reqbfrcnt =
1427 job->
reply->reply_payload_rcv_len = 0;
1429 if (!reqbfrcnt || (reqbfrcnt > (80 *
BUF_SZ_4K))) {
1431 goto send_mgmt_rsp_exit;
1437 goto send_mgmt_rsp_exit;
1443 goto send_mgmt_rsp_free_bmp;
1446 INIT_LIST_HEAD(&bmp->
list);
1460 rc = lpfc_issue_ct_rsp(phba, job, tag, bmp, request_nseg);
1471 send_mgmt_rsp_free_bmp:
1488 lpfc_bsg_diag_mode_enter(
struct lpfc_hba *phba)
1511 for (i = 0; i <= phba->
max_vpi && vports[
i] !=
NULL; i++) {
1512 shost = lpfc_shost_from_vport(vports[i]);
1517 shost = lpfc_shost_from_vport(phba->
pport);
1537 lpfc_bsg_diag_mode_exit(
struct lpfc_hba *phba)
1545 for (i = 0; i <= phba->
max_vpi && vports[
i] !=
NULL; i++) {
1546 shost = lpfc_shost_from_vport(vports[i]);
1551 shost = lpfc_shost_from_vport(phba->
pport);
1582 job->
reply->reply_payload_rcv_len = 0;
1587 "2738 Received DIAG MODE request size:%d "
1588 "below the minimum size:%d\n",
1596 rc = lpfc_bsg_diag_mode_enter(phba);
1602 job->
request->rqst_data.h_vendor.vendor_cmd;
1603 link_flags = loopback_mode->
type;
1604 timeout = loopback_mode->
timeout * 100;
1609 goto loopback_mode_exit;
1621 if (i++ > timeout) {
1623 goto loopback_mode_exit;
1644 spin_lock_irq(&phba->
hbalock);
1646 spin_unlock_irq(&phba->
hbalock);
1652 if (i++ > timeout) {
1665 lpfc_bsg_diag_mode_exit(phba);
1707 if (alloc_len != req_len) {
1709 goto link_diag_state_set_out;
1712 "3128 Set link to diagnostic state:x%x (x%x/x%x)\n",
1713 diag, phba->
sli4_hba.lnk_info.lnk_tp,
1716 link_diag_state = &pmboxq->
u.
mqe.un.link_diag_state;
1717 bf_set(lpfc_mbx_set_diag_state_diag_bit_valid, &link_diag_state->
u.
req,
1719 bf_set(lpfc_mbx_set_diag_state_link_num, &link_diag_state->
u.
req,
1721 bf_set(lpfc_mbx_set_diag_state_link_type, &link_diag_state->
u.
req,
1724 bf_set(lpfc_mbx_set_diag_state_diag,
1725 &link_diag_state->
u.
req, 1);
1727 bf_set(lpfc_mbx_set_diag_state_diag,
1728 &link_diag_state->
u.
req, 0);
1737 link_diag_state_set_out:
1752 lpfc_sli4_bsg_set_internal_loopback(
struct lpfc_hba *phba)
1767 if (alloc_len != req_len) {
1771 link_diag_loopback = &pmboxq->
u.
mqe.un.link_diag_loopback;
1772 bf_set(lpfc_mbx_set_diag_state_link_num,
1773 &link_diag_loopback->
u.
req, phba->
sli4_hba.lnk_info.lnk_no);
1774 bf_set(lpfc_mbx_set_diag_state_link_type,
1775 &link_diag_loopback->
u.
req, phba->
sli4_hba.lnk_info.lnk_tp);
1776 bf_set(lpfc_mbx_set_diag_lpbk_type, &link_diag_loopback->
u.
req,
1782 "3127 Failed setup loopback mode mailbox "
1783 "command, rc:x%x, status:x%x\n", mbxstatus,
1800 lpfc_sli4_diag_fcport_reg_setup(
struct lpfc_hba *phba)
1806 "3136 Port still had vfi registered: "
1807 "mydid:x%x, fcfi:%d, vfi:%d, vpi:%d\n",
1808 phba->
pport->fc_myDID, phba->
fcf.fcfi,
1833 job->
reply->reply_payload_rcv_len = 0;
1838 "3011 Received DIAG MODE request size:%d "
1839 "below the minimum size:%d\n",
1847 rc = lpfc_bsg_diag_mode_enter(phba);
1852 spin_lock_irq(&phba->
hbalock);
1854 spin_unlock_irq(&phba->
hbalock);
1863 "3129 Bring link to diagnostic state.\n");
1865 job->
request->rqst_data.h_vendor.vendor_cmd;
1866 link_flags = loopback_mode->
type;
1867 timeout = loopback_mode->
timeout * 100;
1869 rc = lpfc_sli4_bsg_set_link_diag_state(phba, 1);
1872 "3130 Failed to bring link to diagnostic "
1873 "state, rc:x%x\n", rc);
1874 goto loopback_mode_exit;
1880 if (i++ > timeout) {
1883 "3131 Timeout waiting for link to "
1884 "diagnostic mode, timeout:%d ms\n",
1886 goto loopback_mode_exit;
1893 "3132 Set up loopback mode:x%x\n", link_flags);
1896 rc = lpfc_sli4_bsg_set_internal_loopback(phba);
1904 "3141 Loopback mode:x%x not supported\n",
1906 goto loopback_mode_exit;
1914 if (i++ > timeout) {
1917 "3137 Timeout waiting for link up "
1918 "in loopback mode, timeout:%d ms\n",
1929 phba->
pport->fc_myDID = 1;
1930 rc = lpfc_sli4_diag_fcport_reg_setup(phba);
1932 goto loopback_mode_exit;
1939 if (i++ > timeout) {
1942 "3133 Timeout waiting for port "
1943 "loopback mode ready, timeout:%d ms\n",
1954 spin_lock_irq(&phba->
hbalock);
1956 spin_unlock_irq(&phba->
hbalock);
1958 lpfc_bsg_diag_mode_exit(phba);
1977 lpfc_bsg_diag_loopback_mode(
struct fc_bsg_job *job)
1995 rc = lpfc_sli3_bsg_diag_loopback_mode(phba, job);
1996 else if (
bf_get(lpfc_sli_intf_if_type, &phba->
sli4_hba.sli_intf) ==
1998 rc = lpfc_sli4_bsg_diag_loopback_mode(phba, job);
2013 lpfc_sli4_bsg_diag_mode_end(
struct fc_bsg_job *job)
2039 spin_lock_irq(&phba->
hbalock);
2041 spin_unlock_irq(&phba->
hbalock);
2043 job->
request->rqst_data.h_vendor.vendor_cmd;
2044 timeout = loopback_mode_end_cmd->
timeout * 100;
2046 rc = lpfc_sli4_bsg_set_link_diag_state(phba, 0);
2049 "3139 Failed to bring link to diagnostic "
2050 "state, rc:x%x\n", rc);
2051 goto loopback_mode_end_exit;
2057 if (i++ > timeout) {
2060 "3140 Timeout waiting for link to "
2061 "diagnostic mode_end, timeout:%d ms\n",
2071 phba->
pport->fc_myDID = 0;
2073 loopback_mode_end_exit:
2090 lpfc_sli4_bsg_link_diag_test(
struct fc_bsg_job *job)
2101 uint32_t shdr_status, shdr_add_status;
2103 int mbxstatus, rc = 0;
2134 "3013 Received LINK DIAG TEST request "
2135 " size:%d below the minimum size:%d\n",
2143 rc = lpfc_bsg_diag_mode_enter(phba);
2148 job->
request->rqst_data.h_vendor.vendor_cmd;
2149 timeout = link_diag_test_cmd->
timeout * 100;
2151 rc = lpfc_sli4_bsg_set_link_diag_state(phba, 1);
2159 goto link_diag_test_exit;
2167 if (alloc_len != req_len) {
2169 goto link_diag_test_exit;
2171 run_link_diag_test = &pmboxq->
u.
mqe.un.link_diag_test;
2172 bf_set(lpfc_mbx_run_diag_test_link_num, &run_link_diag_test->
u.
req,
2174 bf_set(lpfc_mbx_run_diag_test_link_type, &run_link_diag_test->
u.
req,
2176 bf_set(lpfc_mbx_run_diag_test_test_id, &run_link_diag_test->
u.
req,
2178 bf_set(lpfc_mbx_run_diag_test_loops, &run_link_diag_test->
u.
req,
2179 link_diag_test_cmd->
loops);
2180 bf_set(lpfc_mbx_run_diag_test_test_ver, &run_link_diag_test->
u.
req,
2182 bf_set(lpfc_mbx_run_diag_test_err_act, &run_link_diag_test->
u.
req,
2188 &pmboxq->
u.
mqe.un.sli4_config.header.cfg_shdr;
2190 shdr_add_status =
bf_get(lpfc_mbox_hdr_add_status, &shdr->
response);
2191 if (shdr_status || shdr_add_status || mbxstatus) {
2193 "3010 Run link diag test mailbox failed with "
2194 "mbx_status x%x status x%x, add_status x%x\n",
2195 mbxstatus, shdr_status, shdr_add_status);
2199 job->
reply->reply_data.vendor_reply.vendor_rsp;
2204 "3012 Received Run link diag test reply "
2205 "below minimum size (%d): reply_len:%d\n",
2217 link_diag_test_exit:
2218 rc = lpfc_sli4_bsg_set_link_diag_state(phba, 0);
2223 lpfc_bsg_diag_mode_exit(phba);
2259 phba->
pport->fc_myDID,
2316 phba->
sli4_hba.rpi_ids[rpi], mbox);
2355 unsigned long flags;
2366 lpfc_bsg_event_ref(evt);
2367 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
2376 INIT_LIST_HEAD(&dmabuf->
list);
2378 memset(bpl, 0,
sizeof(*bpl));
2386 bpl->
tus.
f.bdeFlags = 0;
2392 if (cmdiocbq ==
NULL || rspiocbq ==
NULL ||
2396 goto err_get_xri_exit;
2399 cmd = &cmdiocbq->
iocb;
2400 rsp = &rspiocbq->
iocb;
2437 goto err_get_xri_exit;
2451 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
2460 lpfc_bsg_event_unref(evt);
2461 lpfc_bsg_event_unref(evt);
2462 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
2485 lpfc_bsg_dma_page_alloc(
struct lpfc_hba *phba)
2495 INIT_LIST_HEAD(&dmabuf->
list);
2501 if (!dmabuf->
virt) {
2542 lpfc_bsg_dma_page_list_free(
struct lpfc_hba *phba,
2547 if (list_empty(dmabuf_list))
2551 list_del_init(&dmabuf->
list);
2552 lpfc_bsg_dma_page_free(phba, dmabuf);
2569 diag_cmd_data_alloc(
struct lpfc_hba *phba,
2592 INIT_LIST_HEAD(&dmp->
dma.list);
2612 bpl->
tus.
f.bdeFlags = 0;
2613 pci_dma_sync_single_for_device(phba->
pcidev,
2636 diag_cmd_data_free(phba, mlist);
2649 static int lpfcdiag_loop_post_rxbufs(
struct lpfc_hba *phba,
uint16_t rxxri,
2669 if (rxbmp !=
NULL) {
2672 INIT_LIST_HEAD(&rxbmp->
list);
2674 rxbuffer = diag_cmd_data_alloc(phba, rxbpl, len, 0);
2678 if (!cmdiocbq || !rxbmp || !rxbpl || !rxbuffer) {
2680 goto err_post_rxbufs_exit;
2685 dmp = &rxbuffer->
dma;
2687 cmd = &cmdiocbq->
iocb;
2690 INIT_LIST_HEAD(&
head);
2718 if ((--num_bde > 0) && (i < 2))
2731 diag_cmd_data_free(phba,
2734 diag_cmd_data_free(phba,
2738 goto err_post_rxbufs_exit;
2752 goto err_post_rxbufs_exit;
2755 cmd = &cmdiocbq->
iocb;
2760 err_post_rxbufs_exit:
2793 lpfc_bsg_diag_loopback_run(
struct fc_bsg_job *job)
2803 size_t segment_len = 0, segment_offset = 0, current_offset = 0;
2819 unsigned long flags;
2820 void *dataout =
NULL;
2824 job->
reply->reply_payload_rcv_len = 0;
2829 "2739 Received DIAG TEST request below minimum "
2832 goto loopback_test_exit;
2838 goto loopback_test_exit;
2841 job->
request->rqst_data.h_vendor.vendor_cmd;
2847 goto loopback_test_exit;
2852 goto loopback_test_exit;
2858 if ((size == 0) || (size > 80 *
BUF_SZ_4K)) {
2860 goto loopback_test_exit;
2871 if (size <= (64 * 1024))
2872 total_mem = full_size;
2874 total_mem = 64 * 1024;
2880 if (dataout ==
NULL) {
2882 goto loopback_test_exit;
2890 rc = lpfcdiag_loop_self_reg(phba, &rpi);
2892 goto loopback_test_exit;
2895 rc = lpfcdiag_loop_get_xri(phba, rpi, &txxri, &rxxri);
2897 lpfcdiag_loop_self_unreg(phba, rpi);
2898 goto loopback_test_exit;
2901 rc = lpfcdiag_loop_post_rxbufs(phba, rxxri, full_size);
2903 lpfcdiag_loop_self_unreg(phba, rpi);
2904 goto loopback_test_exit;
2910 lpfcdiag_loop_self_unreg(phba, rpi);
2912 goto loopback_test_exit;
2917 lpfc_bsg_event_ref(evt);
2918 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
2928 INIT_LIST_HEAD(&txbmp->list);
2929 txbpl = (
struct ulp_bde64 *) txbmp->virt;
2930 txbuffer = diag_cmd_data_alloc(phba,
2931 txbpl, full_size, 0);
2935 if (!cmdiocbq || !txbmp || !txbpl || !txbuffer || !txbmp->virt) {
2937 goto err_loopback_test_exit;
2941 goto err_loopback_test_exit;
2944 cmd = &cmdiocbq->
iocb;
2946 rsp = &rspiocbq->
iocb;
2948 INIT_LIST_HEAD(&
head);
2952 if (current_offset == 0) {
2954 memset(ctreq, 0, ELX_LOOPBACK_HEADER_SZ);
2965 BUG_ON(segment_offset >= segment_len);
2966 memcpy(curr->virt + segment_offset,
2967 ptr + current_offset,
2968 segment_len - segment_offset);
2970 current_offset += segment_len - segment_offset;
2971 BUG_ON(current_offset > size);
2976 num_bde = (
uint32_t)txbuffer->flag;
2978 cmd->un.xseq64.bdl.addrHigh =
putPaddrHigh(txbmp->phys);
2979 cmd->un.xseq64.bdl.addrLow =
putPaddrLow(txbmp->phys);
2981 cmd->un.xseq64.bdl.bdeSize = (num_bde *
sizeof(
struct ulp_bde64));
2983 cmd->un.xseq64.w5.hcsw.Fctl = (
LS |
LA);
2984 cmd->un.xseq64.w5.hcsw.Dfctl = 0;
2989 cmd->ulpBdeCount = 1;
2994 cmd->ulpContext = txxri;
2996 cmd->un.xseq64.bdl.ulpIoTag32 = 0;
2997 cmd->un.ulpWord[3] = phba->
sli4_hba.rpi_ids[rpi];
3000 cmd->unsli3.rcvsli3.ox_id = 0xffff;
3011 "3126 Failed loopback test issue iocb: "
3012 "iocb_stat:x%x\n", iocb_stat);
3014 goto err_loopback_test_exit;
3025 "3125 Not receiving unsolicited event, "
3032 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
3033 rx_databuf = evdat->data;
3034 if (evdat->len != full_size) {
3036 "1603 Loopback test did not receive expected "
3037 "data length. actual length 0x%x expected "
3039 evdat->len, full_size);
3041 }
else if (rx_databuf ==
NULL)
3047 job->
reply->reply_payload_rcv_len =
3051 job->
reply->reply_payload_rcv_len =
size;
3055 err_loopback_test_exit:
3056 lpfcdiag_loop_self_unreg(phba, rpi);
3059 lpfc_bsg_event_unref(evt);
3060 lpfc_bsg_event_unref(evt);
3061 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
3063 if (cmdiocbq !=
NULL)
3066 if (rspiocbq !=
NULL)
3069 if (txbmp !=
NULL) {
3070 if (txbpl !=
NULL) {
3071 if (txbuffer !=
NULL)
3072 diag_cmd_data_free(phba, txbuffer);
3105 "2740 Received GET_DFC_REV request below "
3112 job->
request->rqst_data.h_vendor.vendor_cmd;
3115 job->
reply->reply_data.vendor_reply.vendor_rsp;
3120 "2741 Received GET_DFC_REV reply below "
3152 unsigned long flags;
3159 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
3174 job->
reply->reply_payload_rcv_len =
3184 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
3187 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
3191 lpfc_bsg_dma_page_free(phba, dd_data->
context_un.
mbox.dmabuffers);
3195 job->
reply->result = 0;
3210 static int lpfc_bsg_check_cmd_access(
struct lpfc_hba *phba,
3229 "2743 Command 0x%x is illegal in on-line "
3264 "1226 mbox: set_variable 0x%x, 0x%x\n",
3271 spin_lock_irq(&phba->
hbalock);
3273 spin_unlock_irq(&phba->
hbalock);
3285 "2742 Unknown Command 0x%x\n",
3301 lpfc_bsg_mbox_ext_session_reset(
struct lpfc_hba *phba)
3307 lpfc_bsg_dma_page_list_free(phba,
3332 unsigned long flags;
3343 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
3371 job->
reply->reply_payload_rcv_len =
3376 job->
reply->result = 0;
3382 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
3384 "2937 SLI_CONFIG ext-buffer maibox command "
3385 "(x%x/x%x) complete bsg job done, bsize:%d\n",
3394 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
3399 "2938 SLI_CONFIG ext-buffer maibox "
3400 "command (x%x/x%x) failure, rc:x%x\n",
3428 "2939 SLI_CONFIG ext-buffer rd maibox command "
3429 "complete, ctxState:x%x, mbxStatus:x%x\n",
3432 job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq);
3435 lpfc_bsg_mbox_ext_session_reset(phba);
3465 "2940 SLI_CONFIG ext-buffer wr maibox command "
3466 "complete, ctxState:x%x, mbxStatus:x%x\n",
3469 job = lpfc_bsg_issue_mbox_ext_handle_job(phba, pmboxq);
3473 lpfc_bsg_mbox_ext_session_reset(phba);
3503 "2943 SLI_CONFIG(mse)[%d], "
3504 "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3520 "2944 SLI_CONFIG(mse)[%d], "
3521 "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3541 "3007 SLI_CONFIG(hbd)[%d], "
3542 "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3544 bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
3560 "3008 SLI_CONFIG(hbd)[%d], "
3561 "bufLen:%d, addrHi:x%x, addrLo:x%x\n",
3563 bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
3593 uint32_t ext_buf_cnt, ext_buf_index;
3608 ext_buf_cnt =
bsg_bf_get(lpfc_mbox_hdr_mse_cnt,
3612 "2945 Handled SLI_CONFIG(mse) rd, "
3613 "ext_buf_cnt(%d) out of range(%d)\n",
3620 "2941 Handled SLI_CONFIG(mse) rd, "
3621 "ext_buf_cnt:%d\n", ext_buf_cnt);
3633 "2946 Handled SLI_CONFIG(hbd) rd, "
3634 "ext_buf_cnt(%d) out of range(%d)\n",
3641 "2942 Handled SLI_CONFIG(hbd) rd, "
3642 "ext_buf_cnt:%d\n", ext_buf_cnt);
3650 if (ext_buf_cnt == 0) {
3653 }
else if (ext_buf_cnt > 1) {
3655 for (i = 1; i < ext_buf_cnt; i++) {
3656 ext_dmabuf = lpfc_bsg_dma_page_alloc(phba);
3682 lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp, 0, dmabuf, dmabuf);
3685 if (ext_buf_cnt > 1) {
3689 lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp,
3690 ext_buf_index, dmabuf,
3701 pmb = &pmboxq->
u.
mb;
3703 memcpy(pmb, pmbx,
sizeof(*pmb));
3716 pmboxq->
mbox_cmpl = lpfc_bsg_issue_read_mbox_ext_cmpl;
3744 "2947 Issued SLI_CONFIG ext-buffer "
3745 "maibox command, rc:x%x\n", rc);
3749 "2948 Failed to issue SLI_CONFIG ext-buffer "
3750 "maibox command, rc:x%x\n", rc);
3756 lpfc_bsg_dma_page_list_free(phba,
3793 ext_buf_cnt =
bsg_bf_get(lpfc_mbox_hdr_mse_cnt,
3797 "2953 Failed SLI_CONFIG(mse) wr, "
3798 "ext_buf_cnt(%d) out of range(%d)\n",
3804 "2949 Handled SLI_CONFIG(mse) wr, "
3805 "ext_buf_cnt:%d\n", ext_buf_cnt);
3815 "2954 Failed SLI_CONFIG(hbd) wr, "
3816 "ext_buf_cnt(%d) out of range(%d)\n",
3822 "2950 Handled SLI_CONFIG(hbd) wr, "
3823 "ext_buf_cnt:%d\n", ext_buf_cnt);
3830 if (ext_buf_cnt == 0)
3834 lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp, 0, dmabuf, dmabuf);
3841 for (i = 1; i < ext_buf_cnt; i++) {
3844 "2951 SLI_CONFIG(mse), buf[%d]-length:%d\n",
3849 "2952 SLI_CONFIG(hbd), buf[%d]-length:%d\n",
3850 i,
bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
3863 if (ext_buf_cnt == 1) {
3878 pmb = &pmboxq->
u.
mb;
3880 memcpy(pmb, mbx,
sizeof(*pmb));
3885 pmboxq->
mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
3901 "2955 Issued SLI_CONFIG ext-buffer "
3902 "maibox command, rc:x%x\n", rc);
3906 "2956 Failed to issue SLI_CONFIG ext-buffer "
3907 "maibox command, rc:x%x\n", rc);
3913 job->
reply->result = 0;
3951 subsys =
bsg_bf_get(lpfc_emb0_subcmnd_subsys,
3953 opcode =
bsg_bf_get(lpfc_emb0_subcmnd_opcode,
3959 "2957 Handled SLI_CONFIG "
3960 "subsys_fcoe, opcode:x%x\n",
3962 rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
3967 "2958 Handled SLI_CONFIG "
3968 "subsys_fcoe, opcode:x%x\n",
3970 rc = lpfc_bsg_sli_cfg_write_cmd_ext(phba, job,
3975 "2959 Reject SLI_CONFIG "
3976 "subsys_fcoe, opcode:x%x\n",
3986 "3106 Handled SLI_CONFIG "
3987 "subsys_comn, opcode:x%x\n",
3989 rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
3994 "3107 Reject SLI_CONFIG "
3995 "subsys_comn, opcode:x%x\n",
4002 "2977 Reject SLI_CONFIG "
4003 "subsys:x%d, opcode:x%x\n",
4008 subsys =
bsg_bf_get(lpfc_emb1_subcmnd_subsys,
4010 opcode =
bsg_bf_get(lpfc_emb1_subcmnd_opcode,
4017 "2960 Handled SLI_CONFIG "
4018 "subsys_comn, opcode:x%x\n",
4020 rc = lpfc_bsg_sli_cfg_read_cmd_ext(phba, job,
4025 "2961 Handled SLI_CONFIG "
4026 "subsys_comn, opcode:x%x\n",
4028 rc = lpfc_bsg_sli_cfg_write_cmd_ext(phba, job,
4033 "2962 Not handled SLI_CONFIG "
4034 "subsys_comn, opcode:x%x\n",
4041 "2978 Not handled SLI_CONFIG "
4042 "subsys:x%d, opcode:x%x\n",
4063 lpfc_bsg_mbox_ext_abort(
struct lpfc_hba *phba)
4068 lpfc_bsg_mbox_ext_session_reset(phba);
4096 size =
bsg_bf_get(lpfc_mbox_sli_config_mse_len,
4099 "2963 SLI_CONFIG (mse) ext-buffer rd get "
4100 "buffer[%d], size:%d\n", index, size);
4102 size =
bsg_bf_get(lpfc_mbox_sli_config_ecmn_hbd_len,
4105 "2964 SLI_CONFIG (hbd) ext-buffer rd get "
4106 "buffer[%d], size:%d\n", index, size);
4112 list_del_init(&dmabuf->
list);
4120 job->
reply->reply_payload_rcv_len =
4125 lpfc_bsg_dma_page_free(phba, dmabuf);
4129 "2965 SLI_CONFIG (hbd) ext-buffer rd mbox "
4130 "command session done\n");
4131 lpfc_bsg_mbox_ext_session_reset(phba);
4134 job->
reply->result = 0;
4183 "2966 SLI_CONFIG (mse) ext-buffer wr set "
4184 "buffer[%d], size:%d\n",
4189 "2967 SLI_CONFIG (hbd) ext-buffer wr set "
4190 "buffer[%d], size:%d\n",
4196 lpfc_bsg_sli_cfg_dma_desc_setup(phba, nemb_tp, index,
4208 "2968 SLI_CONFIG ext-buffer wr all %d "
4209 "ebuffers received\n",
4219 pmb = &pmboxq->
u.
mb;
4220 memcpy(pmb, pbuf,
sizeof(*pmb));
4225 pmboxq->
mbox_cmpl = lpfc_bsg_issue_write_mbox_ext_cmpl;
4241 "2969 Issued SLI_CONFIG ext-buffer "
4242 "maibox command, rc:x%x\n", rc);
4246 "2970 Failed to issue SLI_CONFIG ext-buffer "
4247 "maibox command, rc:x%x\n", rc);
4253 job->
reply->result = 0;
4258 lpfc_bsg_dma_page_free(phba, dmabuf);
4280 "2971 SLI_CONFIG buffer (type:x%x)\n",
4286 "2972 SLI_CONFIG rd buffer state "
4289 lpfc_bsg_mbox_ext_abort(phba);
4292 rc = lpfc_bsg_read_ebuf_get(phba, job);
4294 lpfc_bsg_dma_page_free(phba, dmabuf);
4298 "2973 SLI_CONFIG wr buffer state "
4301 lpfc_bsg_mbox_ext_abort(phba);
4304 rc = lpfc_bsg_write_ebuf_set(phba, job, dmabuf);
4336 "2974 SLI_CONFIG mailbox: tag:%d, "
4339 rc = lpfc_bsg_handle_sli_cfg_mbox(phba, job, dmabuf);
4342 goto sli_cfg_ext_error;
4351 goto sli_cfg_ext_error;
4353 goto sli_cfg_ext_error;
4355 goto sli_cfg_ext_error;
4358 "2975 SLI_CONFIG mailbox external buffer: "
4359 "extSta:x%x, tag:%d, seq:%d\n",
4362 rc = lpfc_bsg_handle_sli_cfg_ebuf(phba, job, dmabuf);
4368 "2976 SLI_CONFIG mailbox broken pipe: "
4369 "ctxSta:x%x, ctxNumBuf:%d "
4370 "ctxTag:%d, ctxSeq:%d, tag:%d, seq:%d\n",
4377 lpfc_bsg_mbox_ext_session_reset(phba);
4419 job->
reply->reply_payload_rcv_len = 0;
4447 dmabuf = lpfc_bsg_dma_page_alloc(phba);
4448 if (!dmabuf || !dmabuf->
virt) {
4461 rc = lpfc_bsg_handle_sli_cfg_ext(phba, job, dmabuf);
4469 rc = lpfc_bsg_check_cmd_access(phba, (
MAILBOX_t *)pmbx, vport);
4477 "2727 Failed allocation of dd_data\n");
4489 pmb = &pmboxq->
u.
mb;
4490 memcpy(pmb, pmbx,
sizeof(*pmb));
4492 pmboxq->
vport = vport;
4497 if (phba->
pport->stopped &&
4503 "2797 mbox: Issued mailbox cmd "
4504 "0x%x while in stopped state.\n",
4529 if ((transmit_length > receive_length) ||
4547 receive_length = rdEventLog->
rcv_bde64.tus.f.bdeSize;
4548 mode =
bf_get(lpfc_event_log, rdEventLog);
4579 if (receive_length == 0) {
4603 sli4_config = &pmboxq->
u.
mqe.un.sli4_config;
4604 if (!
bf_get(lpfc_mbox_hdr_emb,
4605 &sli4_config->
header.cfg_mhdr)) {
4613 receive_length = nembed_sge->
sge[0].length;
4618 if ((receive_length == 0) ||
4625 nembed_sge->
sge[0].pa_hi =
4628 nembed_sge->
sge[0].pa_lo =
4661 memcpy(pmbx, pmb,
sizeof(*pmb));
4662 job->
reply->reply_payload_rcv_len =
4679 lpfc_bsg_dma_page_free(phba, dmabuf);
4699 job->
reply->reply_payload_rcv_len = 0;
4703 "2737 Mix-and-match backward compability "
4704 "between MBOX_REQ old size:%d and "
4705 "new request size:%d\n",
4710 job->
request->rqst_data.h_vendor.vendor_cmd;
4715 rc = lpfc_bsg_issue_mbox(phba, job, vport);
4719 job->
reply->result = 0;
4752 lpfc_bsg_menlo_cmd_cmp(
struct lpfc_hba *phba,
4761 unsigned long flags;
4768 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
4778 if (cmdiocbq->
context2 && rspiocbq)
4785 rsp = &rspiocbq->
iocb;
4797 job->
reply->reply_data.vendor_reply.vendor_rsp;
4815 job->
reply->reply_payload_rcv_len =
4827 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
4860 job->
reply->reply_payload_rcv_len = 0;
4866 "2784 Received MENLO_CMD request below "
4875 "2785 Received MENLO_CMD reply below "
4883 "2786 Adapter does not support menlo "
4890 job->
request->rqst_data.h_vendor.vendor_cmd;
4893 job->
reply->reply_data.vendor_reply.vendor_rsp;
4899 "2787 Failed allocation of dd_data\n");
4922 rsp = &rspiocbq->
iocb;
4930 INIT_LIST_HEAD(&bmp->
list);
4956 cmd = &cmdiocbq->
iocb;
4961 cmd->un.genreq64.bdl.bdeSize =
4962 (request_nseg + reply_nseg) *
sizeof(
struct ulp_bde64);
4963 cmd->un.genreq64.w5.hcsw.Fctl = (
SI |
LA);
4964 cmd->un.genreq64.w5.hcsw.Dfctl = 0;
4967 cmd->ulpBdeCount = 1;
4977 cmdiocbq->
iocb_cmpl = lpfc_bsg_menlo_cmd_cmp;
4988 cmd->un.ulpWord[4] = 0;
4989 cmd->ulpContext = menlo_cmd->xri;
5038 rc = lpfc_bsg_hba_set_event(job);
5041 rc = lpfc_bsg_hba_get_event(job);
5044 rc = lpfc_bsg_send_mgmt_rsp(job);
5047 rc = lpfc_bsg_diag_loopback_mode(job);
5050 rc = lpfc_sli4_bsg_diag_mode_end(job);
5053 rc = lpfc_bsg_diag_loopback_run(job);
5056 rc = lpfc_sli4_bsg_link_diag_test(job);
5059 rc = lpfc_bsg_get_dfc_rev(job);
5062 rc = lpfc_bsg_mbox_cmd(job);
5066 rc = lpfc_menlo_cmd(job);
5070 job->
reply->reply_payload_rcv_len = 0;
5089 msgcode = job->
request->msgcode;
5092 rc = lpfc_bsg_hst_vendor(job);
5095 rc = lpfc_bsg_rport_els(job);
5098 rc = lpfc_bsg_send_mgmt_cmd(job);
5102 job->
reply->reply_payload_rcv_len = 0;
5130 unsigned long flags;
5136 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
5140 switch (dd_data->
type) {
5146 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
5148 spin_lock_irq(&phba->
hbalock);
5150 spin_unlock_irq(&phba->
hbalock);
5157 job->
reply->reply_payload_rcv_len = 0;
5162 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
5168 mbox->set_job =
NULL;
5170 job->
reply->reply_payload_rcv_len = 0;
5173 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
5183 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);
5185 spin_lock_irq(&phba->
hbalock);
5187 spin_unlock_irq(&phba->
hbalock);
5190 spin_unlock_irqrestore(&phba->
ct_ev_lock, flags);