Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[SCSI] lpfc 8.3.28: Add support for ABTS failure handling

Add support for ABTS failure handling:

- Add asynchronous ABTS notification event feature to driver (CR 124578)
- Change driver message 3092 and 3116 to KERN_WARNING (CR 124768)
- Alter the SCR ELS command to use the temporary RPI and the
Destination DID for SLI4-FC (CR 126070)

Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>

authored by

James Smart and committed by
James Bottomley
cb69f7de ff78d8f9

+263 -93
+3 -1
drivers/scsi/lpfc/lpfc_crtn.h
··· 106 106 void lpfc_disc_timeout(unsigned long); 107 107 108 108 struct lpfc_nodelist *__lpfc_findnode_rpi(struct lpfc_vport *, uint16_t); 109 - 109 + struct lpfc_nodelist *lpfc_findnode_rpi(struct lpfc_vport *, uint16_t); 110 110 void lpfc_worker_wake_up(struct lpfc_hba *); 111 111 int lpfc_workq_post_event(struct lpfc_hba *, void *, void *, uint32_t); 112 112 int lpfc_do_work(void *); ··· 455 455 void lpfc_sli4_queue_destroy(struct lpfc_hba *); 456 456 int lpfc_sli4_read_config(struct lpfc_hba *phba); 457 457 int lpfc_scsi_buf_update(struct lpfc_hba *phba); 458 + void lpfc_sli4_abts_err_handler(struct lpfc_hba *, struct lpfc_nodelist *, 459 + struct sli4_wcqe_xri_aborted *);
-50
drivers/scsi/lpfc/lpfc_els.c
··· 6596 6596 } 6597 6597 6598 6598 /** 6599 - * lpfc_find_vport_by_vpid - Find a vport on a HBA through vport identifier 6600 - * @phba: pointer to lpfc hba data structure. 6601 - * @vpi: host virtual N_Port identifier. 6602 - * 6603 - * This routine finds a vport on a HBA (referred by @phba) through a 6604 - * @vpi. The function walks the HBA's vport list and returns the address 6605 - * of the vport with the matching @vpi. 6606 - * 6607 - * Return code 6608 - * NULL - No vport with the matching @vpi found 6609 - * Otherwise - Address to the vport with the matching @vpi. 6610 - **/ 6611 - struct lpfc_vport * 6612 - lpfc_find_vport_by_vpid(struct lpfc_hba *phba, uint16_t vpi) 6613 - { 6614 - struct lpfc_vport *vport; 6615 - unsigned long flags; 6616 - int i = 0; 6617 - 6618 - /* The physical ports are always vpi 0 - translate is unnecessary. */ 6619 - if (vpi > 0) { 6620 - /* 6621 - * Translate the physical vpi to the logical vpi. The 6622 - * vport stores the logical vpi. 6623 - */ 6624 - for (i = 0; i < phba->max_vpi; i++) { 6625 - if (vpi == phba->vpi_ids[i]) 6626 - break; 6627 - } 6628 - 6629 - if (i >= phba->max_vpi) { 6630 - lpfc_printf_log(phba, KERN_ERR, LOG_ELS, 6631 - "2936 Could not find Vport mapped " 6632 - "to vpi %d\n", vpi); 6633 - return NULL; 6634 - } 6635 - } 6636 - 6637 - spin_lock_irqsave(&phba->hbalock, flags); 6638 - list_for_each_entry(vport, &phba->port_list, listentry) { 6639 - if (vport->vpi == i) { 6640 - spin_unlock_irqrestore(&phba->hbalock, flags); 6641 - return vport; 6642 - } 6643 - } 6644 - spin_unlock_irqrestore(&phba->hbalock, flags); 6645 - return NULL; 6646 - } 6647 - 6648 - /** 6649 6599 * lpfc_els_unsol_event - Process an unsolicited event from an els sli ring 6650 6600 * @phba: pointer to lpfc hba data structure. 6651 6601 * @pring: pointer to a SLI ring.
+67
drivers/scsi/lpfc/lpfc_hbadisc.c
··· 5352 5352 return ndlp; 5353 5353 } 5354 5354 5355 + /* 5356 + * This routine looks up the ndlp lists for the given RPI. If the rpi 5357 + * is found, the routine returns the node element list pointer else 5358 + * return NULL. 5359 + */ 5360 + struct lpfc_nodelist * 5361 + lpfc_findnode_rpi(struct lpfc_vport *vport, uint16_t rpi) 5362 + { 5363 + struct Scsi_Host *shost = lpfc_shost_from_vport(vport); 5364 + struct lpfc_nodelist *ndlp; 5365 + 5366 + spin_lock_irq(shost->host_lock); 5367 + ndlp = __lpfc_findnode_rpi(vport, rpi); 5368 + spin_unlock_irq(shost->host_lock); 5369 + return ndlp; 5370 + } 5371 + 5372 + /** 5373 + * lpfc_find_vport_by_vpid - Find a vport on a HBA through vport identifier 5374 + * @phba: pointer to lpfc hba data structure. 5375 + * @vpi: the physical host virtual N_Port identifier. 5376 + * 5377 + * This routine finds a vport on a HBA (referred by @phba) through a 5378 + * @vpi. The function walks the HBA's vport list and returns the address 5379 + * of the vport with the matching @vpi. 5380 + * 5381 + * Return code 5382 + * NULL - No vport with the matching @vpi found 5383 + * Otherwise - Address to the vport with the matching @vpi. 5384 + **/ 5385 + struct lpfc_vport * 5386 + lpfc_find_vport_by_vpid(struct lpfc_hba *phba, uint16_t vpi) 5387 + { 5388 + struct lpfc_vport *vport; 5389 + unsigned long flags; 5390 + int i = 0; 5391 + 5392 + /* The physical ports are always vpi 0 - translate is unnecessary. */ 5393 + if (vpi > 0) { 5394 + /* 5395 + * Translate the physical vpi to the logical vpi. The 5396 + * vport stores the logical vpi. 5397 + */ 5398 + for (i = 0; i < phba->max_vpi; i++) { 5399 + if (vpi == phba->vpi_ids[i]) 5400 + break; 5401 + } 5402 + 5403 + if (i >= phba->max_vpi) { 5404 + lpfc_printf_log(phba, KERN_ERR, LOG_ELS, 5405 + "2936 Could not find Vport mapped " 5406 + "to vpi %d\n", vpi); 5407 + return NULL; 5408 + } 5409 + } 5410 + 5411 + spin_lock_irqsave(&phba->hbalock, flags); 5412 + list_for_each_entry(vport, &phba->port_list, listentry) { 5413 + if (vport->vpi == i) { 5414 + spin_unlock_irqrestore(&phba->hbalock, flags); 5415 + return vport; 5416 + } 5417 + } 5418 + spin_unlock_irqrestore(&phba->hbalock, flags); 5419 + return NULL; 5420 + } 5421 + 5355 5422 void 5356 5423 lpfc_nlp_init(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, 5357 5424 uint32_t did)
+9 -4
drivers/scsi/lpfc/lpfc_hw.h
··· 2819 2819 #ifdef __BIG_ENDIAN_BITFIELD 2820 2820 uint32_t rsvd1 : 19; /* Reserved */ 2821 2821 uint32_t cdss : 1; /* Configure Data Security SLI */ 2822 - uint32_t rsvd2 : 3; /* Reserved */ 2822 + uint32_t casabt : 1; /* Configure async abts status notice */ 2823 + uint32_t rsvd2 : 2; /* Reserved */ 2823 2824 uint32_t cbg : 1; /* Configure BlockGuard */ 2824 2825 uint32_t cmv : 1; /* Configure Max VPIs */ 2825 2826 uint32_t ccrp : 1; /* Config Command Ring Polling */ ··· 2840 2839 uint32_t ccrp : 1; /* Config Command Ring Polling */ 2841 2840 uint32_t cmv : 1; /* Configure Max VPIs */ 2842 2841 uint32_t cbg : 1; /* Configure BlockGuard */ 2843 - uint32_t rsvd2 : 3; /* Reserved */ 2842 + uint32_t rsvd2 : 2; /* Reserved */ 2843 + uint32_t casabt : 1; /* Configure async abts status notice */ 2844 2844 uint32_t cdss : 1; /* Configure Data Security SLI */ 2845 2845 uint32_t rsvd1 : 19; /* Reserved */ 2846 2846 #endif 2847 2847 #ifdef __BIG_ENDIAN_BITFIELD 2848 2848 uint32_t rsvd3 : 19; /* Reserved */ 2849 2849 uint32_t gdss : 1; /* Configure Data Security SLI */ 2850 - uint32_t rsvd4 : 3; /* Reserved */ 2850 + uint32_t gasabt : 1; /* Grant async abts status notice */ 2851 + uint32_t rsvd4 : 2; /* Reserved */ 2851 2852 uint32_t gbg : 1; /* Grant BlockGuard */ 2852 2853 uint32_t gmv : 1; /* Grant Max VPIs */ 2853 2854 uint32_t gcrp : 1; /* Grant Command Ring Polling */ ··· 2869 2866 uint32_t gcrp : 1; /* Grant Command Ring Polling */ 2870 2867 uint32_t gmv : 1; /* Grant Max VPIs */ 2871 2868 uint32_t gbg : 1; /* Grant BlockGuard */ 2872 - uint32_t rsvd4 : 3; /* Reserved */ 2869 + uint32_t rsvd4 : 2; /* Reserved */ 2870 + uint32_t gasabt : 1; /* Grant async abts status notice */ 2873 2871 uint32_t gdss : 1; /* Configure Data Security SLI */ 2874 2872 uint32_t rsvd3 : 19; /* Reserved */ 2875 2873 #endif ··· 3469 3465 } ASYNCSTAT_FIELDS; 3470 3466 #define ASYNC_TEMP_WARN 0x100 3471 3467 #define ASYNC_TEMP_SAFE 0x101 3468 + #define ASYNC_STATUS_CN 0x102 3472 3469 3473 3470 /* IOCB Command template for CMD_IOCB_RCV_ELS64_CX (0xB7) 3474 3471 or CMD_IOCB_RCV_SEQ64_CX (0xB5) */
+4
drivers/scsi/lpfc/lpfc_mbox.c
··· 1293 1293 phba->sli_rev = LPFC_SLI_REV2; 1294 1294 mb->un.varCfgPort.sli_mode = phba->sli_rev; 1295 1295 1296 + /* If this is an SLI3 port, configure async status notification. */ 1297 + if (phba->sli_rev == LPFC_SLI_REV3) 1298 + mb->un.varCfgPort.casabt = 1; 1299 + 1296 1300 /* Now setup pcb */ 1297 1301 phba->pcb->type = TYPE_NATIVE_SLI2; 1298 1302 phba->pcb->feature = FEATURE_INITIAL_SLI2;
+3 -1
drivers/scsi/lpfc/lpfc_scsi.c
··· 681 681 682 682 rrq_empty = list_empty(&phba->active_rrq_list); 683 683 spin_unlock_irqrestore(&phba->hbalock, iflag); 684 - if (ndlp) 684 + if (ndlp) { 685 685 lpfc_set_rrq_active(phba, ndlp, xri, rxid, 1); 686 + lpfc_sli4_abts_err_handler(phba, ndlp, axri); 687 + } 686 688 lpfc_release_scsi_buf_s4(phba, psb); 687 689 if (rrq_empty) 688 690 lpfc_worker_wake_up(phba);
+177 -37
drivers/scsi/lpfc/lpfc_sli.c
··· 4339 4339 phba->sli.sli_flag &= ~LPFC_SLI_ASYNC_MBX_BLK; 4340 4340 spin_unlock_irq(&phba->hbalock); 4341 4341 done = 1; 4342 + 4343 + if ((pmb->u.mb.un.varCfgPort.casabt == 1) && 4344 + (pmb->u.mb.un.varCfgPort.gasabt == 0)) 4345 + lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, 4346 + "3110 Port did not grant ASABT\n"); 4342 4347 } 4343 4348 } 4344 4349 if (!done) { ··· 7709 7704 iocbq->context2)->virt); 7710 7705 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { 7711 7706 if (pcmd && (*pcmd == ELS_CMD_FLOGI || 7707 + *pcmd == ELS_CMD_SCR || 7712 7708 *pcmd == ELS_CMD_PLOGI)) { 7713 7709 bf_set(els_req64_sp, &wqe->els_req, 1); 7714 7710 bf_set(els_req64_sid, &wqe->els_req, ··· 8219 8213 return 0; 8220 8214 } 8221 8215 8216 + /* lpfc_sli_abts_recover_port - Recover a port that failed an ABTS. 8217 + * @vport: pointer to virtual port object. 8218 + * @ndlp: nodelist pointer for the impacted rport. 8219 + * 8220 + * The driver calls this routine in response to a XRI ABORT CQE 8221 + * event from the port. In this event, the driver is required to 8222 + * recover its login to the rport even though its login may be valid 8223 + * from the driver's perspective. The failed ABTS notice from the 8224 + * port indicates the rport is not responding. 8225 + */ 8226 + static void 8227 + lpfc_sli_abts_recover_port(struct lpfc_vport *vport, 8228 + struct lpfc_nodelist *ndlp) 8229 + { 8230 + struct Scsi_Host *shost; 8231 + struct lpfc_hba *phba; 8232 + unsigned long flags = 0; 8233 + 8234 + shost = lpfc_shost_from_vport(vport); 8235 + phba = vport->phba; 8236 + if (ndlp->nlp_state != NLP_STE_MAPPED_NODE) { 8237 + lpfc_printf_log(phba, KERN_INFO, 8238 + LOG_SLI, "3093 No rport recovery needed. " 8239 + "rport in state 0x%x\n", 8240 + ndlp->nlp_state); 8241 + return; 8242 + } 8243 + lpfc_printf_log(phba, KERN_ERR, LOG_SLI, 8244 + "3094 Start rport recovery on shost id 0x%x " 8245 + "fc_id 0x%06x vpi 0x%x rpi 0x%x state 0x%x " 8246 + "flags 0x%x\n", 8247 + shost->host_no, ndlp->nlp_DID, 8248 + vport->vpi, ndlp->nlp_rpi, ndlp->nlp_state, 8249 + ndlp->nlp_flag); 8250 + /* 8251 + * The rport is not responding. Don't attempt ADISC recovery. 8252 + * Remove the FCP-2 flag to force a PLOGI. 8253 + */ 8254 + spin_lock_irqsave(shost->host_lock, flags); 8255 + ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE; 8256 + spin_unlock_irqrestore(shost->host_lock, flags); 8257 + lpfc_disc_state_machine(vport, ndlp, NULL, 8258 + NLP_EVT_DEVICE_RECOVERY); 8259 + lpfc_cancel_retry_delay_tmo(vport, ndlp); 8260 + spin_lock_irqsave(shost->host_lock, flags); 8261 + ndlp->nlp_flag |= NLP_NPR_2B_DISC; 8262 + spin_unlock_irqrestore(shost->host_lock, flags); 8263 + lpfc_disc_start(vport); 8264 + } 8265 + 8266 + /* lpfc_sli_abts_err_handler - handle a failed ABTS request from an SLI3 port. 8267 + * @phba: Pointer to HBA context object. 8268 + * @iocbq: Pointer to iocb object. 8269 + * 8270 + * The async_event handler calls this routine when it receives 8271 + * an ASYNC_STATUS_CN event from the port. The port generates 8272 + * this event when an Abort Sequence request to an rport fails 8273 + * twice in succession. The abort could be originated by the 8274 + * driver or by the port. The ABTS could have been for an ELS 8275 + * or FCP IO. The port only generates this event when an ABTS 8276 + * fails to complete after one retry. 8277 + */ 8278 + static void 8279 + lpfc_sli_abts_err_handler(struct lpfc_hba *phba, 8280 + struct lpfc_iocbq *iocbq) 8281 + { 8282 + struct lpfc_nodelist *ndlp = NULL; 8283 + uint16_t rpi = 0, vpi = 0; 8284 + struct lpfc_vport *vport = NULL; 8285 + 8286 + /* The rpi in the ulpContext is vport-sensitive. */ 8287 + vpi = iocbq->iocb.un.asyncstat.sub_ctxt_tag; 8288 + rpi = iocbq->iocb.ulpContext; 8289 + 8290 + lpfc_printf_log(phba, KERN_WARNING, LOG_SLI, 8291 + "3092 Port generated ABTS async event " 8292 + "on vpi %d rpi %d status 0x%x\n", 8293 + vpi, rpi, iocbq->iocb.ulpStatus); 8294 + 8295 + vport = lpfc_find_vport_by_vpid(phba, vpi); 8296 + if (!vport) 8297 + goto err_exit; 8298 + ndlp = lpfc_findnode_rpi(vport, rpi); 8299 + if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) 8300 + goto err_exit; 8301 + 8302 + if (iocbq->iocb.ulpStatus == IOSTAT_LOCAL_REJECT) 8303 + lpfc_sli_abts_recover_port(vport, ndlp); 8304 + return; 8305 + 8306 + err_exit: 8307 + lpfc_printf_log(phba, KERN_INFO, LOG_SLI, 8308 + "3095 Event Context not found, no " 8309 + "action on vpi %d rpi %d status 0x%x, reason 0x%x\n", 8310 + iocbq->iocb.ulpContext, iocbq->iocb.ulpStatus, 8311 + vpi, rpi); 8312 + } 8313 + 8314 + /* lpfc_sli4_abts_err_handler - handle a failed ABTS request from an SLI4 port. 8315 + * @phba: pointer to HBA context object. 8316 + * @ndlp: nodelist pointer for the impacted rport. 8317 + * @axri: pointer to the wcqe containing the failed exchange. 8318 + * 8319 + * The driver calls this routine when it receives an ABORT_XRI_FCP CQE from the 8320 + * port. The port generates this event when an abort exchange request to an 8321 + * rport fails twice in succession with no reply. The abort could be originated 8322 + * by the driver or by the port. The ABTS could have been for an ELS or FCP IO. 8323 + */ 8324 + void 8325 + lpfc_sli4_abts_err_handler(struct lpfc_hba *phba, 8326 + struct lpfc_nodelist *ndlp, 8327 + struct sli4_wcqe_xri_aborted *axri) 8328 + { 8329 + struct lpfc_vport *vport; 8330 + 8331 + if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) 8332 + lpfc_printf_log(phba, KERN_INFO, LOG_SLI, 8333 + "3115 Node Context not found, driver " 8334 + "ignoring abts err event\n"); 8335 + vport = ndlp->vport; 8336 + lpfc_printf_log(phba, KERN_WARNING, LOG_SLI, 8337 + "3116 Port generated FCP XRI ABORT event on " 8338 + "vpi %d rpi %d xri x%x status 0x%x\n", 8339 + ndlp->vport->vpi, ndlp->nlp_rpi, 8340 + bf_get(lpfc_wcqe_xa_xri, axri), 8341 + bf_get(lpfc_wcqe_xa_status, axri)); 8342 + 8343 + if (bf_get(lpfc_wcqe_xa_status, axri) == IOSTAT_LOCAL_REJECT) 8344 + lpfc_sli_abts_recover_port(vport, ndlp); 8345 + } 8346 + 8222 8347 /** 8223 8348 * lpfc_sli_async_event_handler - ASYNC iocb handler function 8224 8349 * @phba: Pointer to HBA context object. ··· 8369 8232 { 8370 8233 IOCB_t *icmd; 8371 8234 uint16_t evt_code; 8372 - uint16_t temp; 8373 8235 struct temp_event temp_event_data; 8374 8236 struct Scsi_Host *shost; 8375 8237 uint32_t *iocb_w; 8376 8238 8377 8239 icmd = &iocbq->iocb; 8378 8240 evt_code = icmd->un.asyncstat.evt_code; 8379 - temp = icmd->ulpContext; 8380 8241 8381 - if ((evt_code != ASYNC_TEMP_WARN) && 8382 - (evt_code != ASYNC_TEMP_SAFE)) { 8242 + switch (evt_code) { 8243 + case ASYNC_TEMP_WARN: 8244 + case ASYNC_TEMP_SAFE: 8245 + temp_event_data.data = (uint32_t) icmd->ulpContext; 8246 + temp_event_data.event_type = FC_REG_TEMPERATURE_EVENT; 8247 + if (evt_code == ASYNC_TEMP_WARN) { 8248 + temp_event_data.event_code = LPFC_THRESHOLD_TEMP; 8249 + lpfc_printf_log(phba, KERN_ERR, LOG_TEMP, 8250 + "0347 Adapter is very hot, please take " 8251 + "corrective action. temperature : %d Celsius\n", 8252 + (uint32_t) icmd->ulpContext); 8253 + } else { 8254 + temp_event_data.event_code = LPFC_NORMAL_TEMP; 8255 + lpfc_printf_log(phba, KERN_ERR, LOG_TEMP, 8256 + "0340 Adapter temperature is OK now. " 8257 + "temperature : %d Celsius\n", 8258 + (uint32_t) icmd->ulpContext); 8259 + } 8260 + 8261 + /* Send temperature change event to applications */ 8262 + shost = lpfc_shost_from_vport(phba->pport); 8263 + fc_host_post_vendor_event(shost, fc_get_event_number(), 8264 + sizeof(temp_event_data), (char *) &temp_event_data, 8265 + LPFC_NL_VENDOR_ID); 8266 + break; 8267 + case ASYNC_STATUS_CN: 8268 + lpfc_sli_abts_err_handler(phba, iocbq); 8269 + break; 8270 + default: 8383 8271 iocb_w = (uint32_t *) icmd; 8384 - lpfc_printf_log(phba, 8385 - KERN_ERR, 8386 - LOG_SLI, 8272 + lpfc_printf_log(phba, KERN_ERR, LOG_SLI, 8387 8273 "0346 Ring %d handler: unexpected ASYNC_STATUS" 8388 8274 " evt_code 0x%x\n" 8389 8275 "W0 0x%08x W1 0x%08x W2 0x%08x W3 0x%08x\n" 8390 8276 "W4 0x%08x W5 0x%08x W6 0x%08x W7 0x%08x\n" 8391 8277 "W8 0x%08x W9 0x%08x W10 0x%08x W11 0x%08x\n" 8392 8278 "W12 0x%08x W13 0x%08x W14 0x%08x W15 0x%08x\n", 8393 - pring->ringno, 8394 - icmd->un.asyncstat.evt_code, 8279 + pring->ringno, icmd->un.asyncstat.evt_code, 8395 8280 iocb_w[0], iocb_w[1], iocb_w[2], iocb_w[3], 8396 8281 iocb_w[4], iocb_w[5], iocb_w[6], iocb_w[7], 8397 8282 iocb_w[8], iocb_w[9], iocb_w[10], iocb_w[11], 8398 8283 iocb_w[12], iocb_w[13], iocb_w[14], iocb_w[15]); 8399 8284 8400 - return; 8285 + break; 8401 8286 } 8402 - temp_event_data.data = (uint32_t)temp; 8403 - temp_event_data.event_type = FC_REG_TEMPERATURE_EVENT; 8404 - if (evt_code == ASYNC_TEMP_WARN) { 8405 - temp_event_data.event_code = LPFC_THRESHOLD_TEMP; 8406 - lpfc_printf_log(phba, 8407 - KERN_ERR, 8408 - LOG_TEMP, 8409 - "0347 Adapter is very hot, please take " 8410 - "corrective action. temperature : %d Celsius\n", 8411 - temp); 8412 - } 8413 - if (evt_code == ASYNC_TEMP_SAFE) { 8414 - temp_event_data.event_code = LPFC_NORMAL_TEMP; 8415 - lpfc_printf_log(phba, 8416 - KERN_ERR, 8417 - LOG_TEMP, 8418 - "0340 Adapter temperature is OK now. " 8419 - "temperature : %d Celsius\n", 8420 - temp); 8421 - } 8422 - 8423 - /* Send temperature change event to applications */ 8424 - shost = lpfc_shost_from_vport(phba->pport); 8425 - fc_host_post_vendor_event(shost, fc_get_event_number(), 8426 - sizeof(temp_event_data), (char *) &temp_event_data, 8427 - LPFC_NL_VENDOR_ID); 8428 - 8429 8287 } 8430 8288 8431 8289 ··· 9379 9247 lpfc_sli_abort_fcp_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, 9380 9248 struct lpfc_iocbq *rspiocb) 9381 9249 { 9250 + lpfc_printf_log(phba, KERN_INFO, LOG_SLI, 9251 + "3096 ABORT_XRI_CN completing on xri x%x " 9252 + "original iotag x%x, abort cmd iotag x%x " 9253 + "status 0x%x, reason 0x%x\n", 9254 + cmdiocb->iocb.un.acxri.abortContextTag, 9255 + cmdiocb->iocb.un.acxri.abortIoTag, 9256 + cmdiocb->iotag, rspiocb->iocb.ulpStatus, 9257 + rspiocb->iocb.un.ulpWord[4]); 9382 9258 lpfc_sli_release_iocbq(phba, cmdiocb); 9383 9259 return; 9384 9260 }