mirror of
https://github.com/torvalds/linux.git
synced 2024-11-18 01:51:53 +00:00
scsi: mpt3sas: save and use MSI-X index for posting RD
In the IO submission path _base_get_msix_index is called twice. Initially while getting the smid and subsequently while posting the request descriptor (RD). Refactor code to query msix index only while posting the request descriptor. Save determined msix index in msix_io field. Signed-off-by: Suganath Prabu S <suganath-prabu.subramani@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
5dd48a555a
commit
998c3001d3
@ -3399,8 +3399,8 @@ mpt3sas_base_get_smid_scsiio(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx,
|
||||
|
||||
smid = tag + 1;
|
||||
request->cb_idx = cb_idx;
|
||||
request->msix_io = _base_get_msix_index(ioc, NULL);
|
||||
request->smid = smid;
|
||||
request->scmd = scmd;
|
||||
INIT_LIST_HEAD(&request->chain_list);
|
||||
return smid;
|
||||
}
|
||||
@ -3454,6 +3454,7 @@ void mpt3sas_base_clear_st(struct MPT3SAS_ADAPTER *ioc,
|
||||
return;
|
||||
st->cb_idx = 0xFF;
|
||||
st->direct_io = 0;
|
||||
st->scmd = NULL;
|
||||
atomic_set(&ioc->chain_lookup[st->smid - 1].chain_offset, 0);
|
||||
st->smid = 0;
|
||||
}
|
||||
@ -3552,6 +3553,29 @@ _base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock)
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* _base_set_and_get_msix_index - get the msix index and assign to msix_io
|
||||
* variable of scsi tracker
|
||||
* @ioc: per adapter object
|
||||
* @smid: system request message index
|
||||
*
|
||||
* returns msix index.
|
||||
*/
|
||||
static u8
|
||||
_base_set_and_get_msix_index(struct MPT3SAS_ADAPTER *ioc, u16 smid)
|
||||
{
|
||||
struct scsiio_tracker *st = NULL;
|
||||
|
||||
if (smid < ioc->hi_priority_smid)
|
||||
st = _get_st_from_smid(ioc, smid);
|
||||
|
||||
if (st == NULL)
|
||||
return _base_get_msix_index(ioc, NULL);
|
||||
|
||||
st->msix_io = ioc->get_msix_index_for_smlio(ioc, st->scmd);
|
||||
return st->msix_io;
|
||||
}
|
||||
|
||||
/**
|
||||
* _base_put_smid_mpi_ep_scsi_io - send SCSI_IO request to firmware
|
||||
* @ioc: per adapter object
|
||||
@ -3573,7 +3597,7 @@ _base_put_smid_mpi_ep_scsi_io(struct MPT3SAS_ADAPTER *ioc,
|
||||
_base_clone_mpi_to_sys_mem(mpi_req_iomem, (void *)mfp,
|
||||
ioc->request_sz);
|
||||
descriptor.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO;
|
||||
descriptor.SCSIIO.MSIxIndex = _base_get_msix_index(ioc, NULL);
|
||||
descriptor.SCSIIO.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
|
||||
descriptor.SCSIIO.SMID = cpu_to_le16(smid);
|
||||
descriptor.SCSIIO.DevHandle = cpu_to_le16(handle);
|
||||
descriptor.SCSIIO.LMID = 0;
|
||||
@ -3595,7 +3619,7 @@ _base_put_smid_scsi_io(struct MPT3SAS_ADAPTER *ioc, u16 smid, u16 handle)
|
||||
|
||||
|
||||
descriptor.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO;
|
||||
descriptor.SCSIIO.MSIxIndex = _base_get_msix_index(ioc, NULL);
|
||||
descriptor.SCSIIO.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
|
||||
descriptor.SCSIIO.SMID = cpu_to_le16(smid);
|
||||
descriptor.SCSIIO.DevHandle = cpu_to_le16(handle);
|
||||
descriptor.SCSIIO.LMID = 0;
|
||||
@ -3618,7 +3642,7 @@ _base_put_smid_fast_path(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
||||
|
||||
descriptor.SCSIIO.RequestFlags =
|
||||
MPI25_REQ_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO;
|
||||
descriptor.SCSIIO.MSIxIndex = _base_get_msix_index(ioc, NULL);
|
||||
descriptor.SCSIIO.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
|
||||
descriptor.SCSIIO.SMID = cpu_to_le16(smid);
|
||||
descriptor.SCSIIO.DevHandle = cpu_to_le16(handle);
|
||||
descriptor.SCSIIO.LMID = 0;
|
||||
@ -3682,7 +3706,7 @@ mpt3sas_base_put_smid_nvme_encap(struct MPT3SAS_ADAPTER *ioc, u16 smid)
|
||||
|
||||
descriptor.Default.RequestFlags =
|
||||
MPI26_REQ_DESCRIPT_FLAGS_PCIE_ENCAPSULATED;
|
||||
descriptor.Default.MSIxIndex = _base_get_msix_index(ioc, NULL);
|
||||
descriptor.Default.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
|
||||
descriptor.Default.SMID = cpu_to_le16(smid);
|
||||
descriptor.Default.LMID = 0;
|
||||
descriptor.Default.DescriptorTypeDependent = 0;
|
||||
@ -3714,7 +3738,7 @@ _base_put_smid_default(struct MPT3SAS_ADAPTER *ioc, u16 smid)
|
||||
}
|
||||
request = (u64 *)&descriptor;
|
||||
descriptor.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
|
||||
descriptor.Default.MSIxIndex = _base_get_msix_index(ioc, NULL);
|
||||
descriptor.Default.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
|
||||
descriptor.Default.SMID = cpu_to_le16(smid);
|
||||
descriptor.Default.LMID = 0;
|
||||
descriptor.Default.DescriptorTypeDependent = 0;
|
||||
@ -3744,7 +3768,7 @@ _base_put_smid_scsi_io_atomic(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
||||
u32 *request = (u32 *)&descriptor;
|
||||
|
||||
descriptor.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO;
|
||||
descriptor.MSIxIndex = _base_get_msix_index(ioc, NULL);
|
||||
descriptor.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
|
||||
descriptor.SMID = cpu_to_le16(smid);
|
||||
|
||||
writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
|
||||
@ -3766,7 +3790,7 @@ _base_put_smid_fast_path_atomic(struct MPT3SAS_ADAPTER *ioc, u16 smid,
|
||||
u32 *request = (u32 *)&descriptor;
|
||||
|
||||
descriptor.RequestFlags = MPI25_REQ_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO;
|
||||
descriptor.MSIxIndex = _base_get_msix_index(ioc, NULL);
|
||||
descriptor.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
|
||||
descriptor.SMID = cpu_to_le16(smid);
|
||||
|
||||
writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
|
||||
@ -3810,7 +3834,7 @@ _base_put_smid_default_atomic(struct MPT3SAS_ADAPTER *ioc, u16 smid)
|
||||
u32 *request = (u32 *)&descriptor;
|
||||
|
||||
descriptor.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
|
||||
descriptor.MSIxIndex = _base_get_msix_index(ioc, NULL);
|
||||
descriptor.MSIxIndex = _base_set_and_get_msix_index(ioc, smid);
|
||||
descriptor.SMID = cpu_to_le16(smid);
|
||||
|
||||
writel(cpu_to_le32(*request), &ioc->chip->AtomicRequestDescriptorPost);
|
||||
|
@ -830,6 +830,7 @@ struct chain_lookup {
|
||||
*/
|
||||
struct scsiio_tracker {
|
||||
u16 smid;
|
||||
struct scsi_cmnd *scmd;
|
||||
u8 cb_idx;
|
||||
u8 direct_io;
|
||||
struct pcie_sg_list pcie_sg_list;
|
||||
|
@ -5210,6 +5210,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
|
||||
((ioc_status & MPI2_IOCSTATUS_MASK)
|
||||
!= MPI2_IOCSTATUS_SCSI_TASK_TERMINATED)) {
|
||||
st->direct_io = 0;
|
||||
st->scmd = scmd;
|
||||
memcpy(mpi_request->CDB.CDB32, scmd->cmnd, scmd->cmd_len);
|
||||
mpi_request->DevHandle =
|
||||
cpu_to_le16(sas_device_priv_data->sas_target->handle);
|
||||
|
Loading…
Reference in New Issue
Block a user