mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
scsi: lpfc: SLI path split: Refactor Abort paths
This patch refactors the Abort paths to use SLI-4 as the primary interface. - Introduce generic lpfc_sli_prep_abort_xri jump table routine - Consolidate lpfc_sli4_issue_abort_iotag and lpfc_sli_issue_abort_iotag into a single generic lpfc_sli_issue_abort_iotag routine - Consolidate lpfc_sli4_abort_fcp_cmpl and lpfc_sli_abort_fcp_cmpl into a single generic lpfc_sli_abort_fcp_cmpl routine - Remove unused routine lpfc_get_iocb_from_iocbq - Conversion away from using SLI-3 iocb structures to set/access fields in common routines. Use the new generic get/set routines that were added. This move changes code from indirect structure references to using local variables with the generic routines. - Refactor routines when setting non-generic fields, to have both SLI3 and SLI4 specific sections. This replaces the set-as-SLI3 then translate to SLI4 behavior of the past. Link: https://lore.kernel.org/r/20220225022308.16486-15-jsmart2021@gmail.com Co-developed-by: Justin Tee <justin.tee@broadcom.com> Signed-off-by: Justin Tee <justin.tee@broadcom.com> Signed-off-by: James Smart <jsmart2021@gmail.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
committed by
Martin K. Petersen
parent
3512ac0942
commit
31a59f7570
@@ -931,8 +931,6 @@ struct lpfc_hba {
|
||||
void (*__lpfc_sli_release_iocbq)(struct lpfc_hba *,
|
||||
struct lpfc_iocbq *);
|
||||
int (*lpfc_hba_down_post)(struct lpfc_hba *phba);
|
||||
IOCB_t * (*lpfc_get_iocb_from_iocbq)
|
||||
(struct lpfc_iocbq *);
|
||||
void (*lpfc_scsi_cmd_iocb_cmpl)
|
||||
(struct lpfc_hba *, struct lpfc_iocbq *, struct lpfc_iocbq *);
|
||||
|
||||
@@ -979,6 +977,9 @@ struct lpfc_hba {
|
||||
struct lpfc_dmabuf *bmp, u16 rpi,
|
||||
u16 ox_id, u32 num_entry, u8 rctl,
|
||||
u8 last_seq, u8 cr_cx_cmd);
|
||||
void (*__lpfc_sli_prep_abort_xri)(struct lpfc_iocbq *cmdiocbq,
|
||||
u16 ulp_context, u16 iotag,
|
||||
u8 ulp_class, u16 cqid, bool ia);
|
||||
|
||||
/* expedite pool */
|
||||
struct lpfc_epd_pool epd_pool;
|
||||
@@ -1869,6 +1870,15 @@ u32 get_job_data_placed(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
|
||||
return iocbq->iocb.un.genreq64.bdl.bdeSize;
|
||||
}
|
||||
|
||||
static inline
|
||||
u32 get_job_abtsiotag(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
|
||||
{
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
return iocbq->wqe.abort_cmd.wqe_com.abort_tag;
|
||||
else
|
||||
return iocbq->iocb.un.acxri.abortIoTag;
|
||||
}
|
||||
|
||||
static inline
|
||||
u32 get_job_els_rsp64_did(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
|
||||
{
|
||||
|
||||
@@ -366,6 +366,9 @@ void lpfc_sli_prep_xmit_seq64(struct lpfc_hba *phba,
|
||||
struct lpfc_dmabuf *bmp, u16 rpi, u16 ox_id,
|
||||
u32 num_entry, u8 rctl, u8 last_seq,
|
||||
u8 cr_cx_cmd);
|
||||
void lpfc_sli_prep_abort_xri(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocbq,
|
||||
u16 ulp_context, u16 iotag, u8 ulp_class, u16 cqid,
|
||||
bool ia);
|
||||
struct lpfc_sglq *__lpfc_clear_active_sglq(struct lpfc_hba *phba, uint16_t xri);
|
||||
struct lpfc_sglq *__lpfc_sli_get_nvmet_sglq(struct lpfc_hba *phba,
|
||||
struct lpfc_iocbq *piocbq);
|
||||
|
||||
@@ -1746,9 +1746,8 @@ lpfc_nvme_abort_fcreq_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
"6145 ABORT_XRI_CN completing on rpi x%x "
|
||||
"original iotag x%x, abort cmd iotag x%x "
|
||||
"req_tag x%x, status x%x, hwstatus x%x\n",
|
||||
cmdiocb->iocb.un.acxri.abortContextTag,
|
||||
cmdiocb->iocb.un.acxri.abortIoTag,
|
||||
cmdiocb->iotag,
|
||||
bf_get(wqe_ctxt_tag, &cmdiocb->wqe.generic.wqe_com),
|
||||
get_job_abtsiotag(phba, cmdiocb), cmdiocb->iotag,
|
||||
bf_get(lpfc_wcqe_c_request_tag, abts_cmpl),
|
||||
bf_get(lpfc_wcqe_c_status, abts_cmpl),
|
||||
bf_get(lpfc_wcqe_c_hw_status, abts_cmpl));
|
||||
|
||||
@@ -5929,15 +5929,13 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
|
||||
}
|
||||
|
||||
lpfc_cmd->waitq = &waitq;
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
if (phba->sli_rev == LPFC_SLI_REV4)
|
||||
spin_unlock(&pring_s4->ring_lock);
|
||||
ret_val = lpfc_sli4_issue_abort_iotag(phba, iocb,
|
||||
lpfc_sli4_abort_fcp_cmpl);
|
||||
} else {
|
||||
else
|
||||
pring = &phba->sli.sli3_ring[LPFC_FCP_RING];
|
||||
ret_val = lpfc_sli_issue_abort_iotag(phba, pring, iocb,
|
||||
lpfc_sli_abort_fcp_cmpl);
|
||||
}
|
||||
|
||||
ret_val = lpfc_sli_issue_abort_iotag(phba, pring, iocb,
|
||||
lpfc_sli_abort_fcp_cmpl);
|
||||
|
||||
/* Make sure HBA is alive */
|
||||
lpfc_issue_hb_tmo(phba);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -76,11 +76,13 @@ struct lpfc_iocbq {
|
||||
struct lpfc_wcqe_complete wcqe_cmpl; /* WQE cmpl */
|
||||
|
||||
u32 unsol_rcv_len; /* Receive len in usol path */
|
||||
|
||||
uint8_t num_bdes;
|
||||
uint8_t abort_bls; /* ABTS by initiator or responder */
|
||||
|
||||
u8 abort_rctl; /* ACC or RJT flag */
|
||||
uint8_t priority; /* OAS priority */
|
||||
uint8_t retry; /* retry counter for IOCB cmd - if needed */
|
||||
|
||||
u32 cmd_flag;
|
||||
#define LPFC_IO_LIBDFC 1 /* libdfc iocb */
|
||||
#define LPFC_IO_WAKE 2 /* Synchronous I/O completed */
|
||||
|
||||
Reference in New Issue
Block a user