[SCSI] lpfc 8.3.37: Fixed no-context ABTS failed with BA_RJT
Fixed no-context ABTS received on unsolicited receive queue failed with BA_RJT Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:

committed by
James Bottomley

parent
7b15db32d3
commit
6dd9e31ccb
@@ -164,37 +164,24 @@ lpfc_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_sli4_ct_abort_unsol_event - Default handle for sli4 unsol abort
|
||||
* lpfc_ct_handle_unsol_abort - ct upper level protocol abort handler
|
||||
* @phba: Pointer to HBA context object.
|
||||
* @pring: Pointer to the driver internal I/O ring.
|
||||
* @piocbq: Pointer to the IOCBQ.
|
||||
* @dmabuf: pointer to a dmabuf that describes the FC sequence
|
||||
*
|
||||
* This function serves as the default handler for the sli4 unsolicited
|
||||
* abort event. It shall be invoked when there is no application interface
|
||||
* registered unsolicited abort handler. This handler does nothing but
|
||||
* just simply releases the dma buffer used by the unsol abort event.
|
||||
* This function serves as the upper level protocol abort handler for CT
|
||||
* protocol.
|
||||
*
|
||||
* Return 1 if abort has been handled, 0 otherwise.
|
||||
**/
|
||||
void
|
||||
lpfc_sli4_ct_abort_unsol_event(struct lpfc_hba *phba,
|
||||
struct lpfc_sli_ring *pring,
|
||||
struct lpfc_iocbq *piocbq)
|
||||
int
|
||||
lpfc_ct_handle_unsol_abort(struct lpfc_hba *phba, struct hbq_dmabuf *dmabuf)
|
||||
{
|
||||
IOCB_t *icmd = &piocbq->iocb;
|
||||
struct lpfc_dmabuf *bdeBuf;
|
||||
uint32_t size;
|
||||
int handled;
|
||||
|
||||
/* Forward abort event to any process registered to receive ct event */
|
||||
if (lpfc_bsg_ct_unsol_event(phba, pring, piocbq) == 0)
|
||||
return;
|
||||
/* CT upper level goes through BSG */
|
||||
handled = lpfc_bsg_ct_unsol_abort(phba, dmabuf);
|
||||
|
||||
/* If there is no BDE associated with IOCB, there is nothing to do */
|
||||
if (icmd->ulpBdeCount == 0)
|
||||
return;
|
||||
bdeBuf = piocbq->context2;
|
||||
piocbq->context2 = NULL;
|
||||
size = icmd->un.cont64[0].tus.f.bdeSize;
|
||||
lpfc_ct_unsol_buffer(phba, piocbq, bdeBuf, size);
|
||||
lpfc_in_buf_free(phba, bdeBuf);
|
||||
return handled;
|
||||
}
|
||||
|
||||
static void
|
||||
|
Reference in New Issue
Block a user