mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
scsi: ufs: Reuse compose_devman_upiu
Move some code fragments into ufshcd_prepare_req_desc_hdr() so it can be used throughout. Signed-off-by: Avri Altman <avri.altman@wdc.com> Link: https://lore.kernel.org/r/20240309081104.5006-5-avri.altman@wdc.com Reviewed-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Bean Huo <beanhuo@micron.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
5b59a68dac
commit
996a24b99d
@ -2710,18 +2710,27 @@ static void ufshcd_disable_intr(struct ufs_hba *hba, u32 intrs)
|
||||
/**
|
||||
* ufshcd_prepare_req_desc_hdr - Fill UTP Transfer request descriptor header according to request
|
||||
* descriptor according to request
|
||||
* @hba: per adapter instance
|
||||
* @lrbp: pointer to local reference block
|
||||
* @upiu_flags: flags required in the header
|
||||
* @cmd_dir: requests data direction
|
||||
* @ehs_length: Total EHS Length (in 32‐bytes units of all Extra Header Segments)
|
||||
* @legacy_type: UTP_CMD_TYPE_SCSI or UTP_CMD_TYPE_DEV_MANAGE
|
||||
*/
|
||||
static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8 *upiu_flags,
|
||||
enum dma_data_direction cmd_dir, int ehs_length)
|
||||
static void
|
||||
ufshcd_prepare_req_desc_hdr(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
|
||||
u8 *upiu_flags, enum dma_data_direction cmd_dir,
|
||||
int ehs_length, enum utp_cmd_type legacy_type)
|
||||
{
|
||||
struct utp_transfer_req_desc *req_desc = lrbp->utr_descriptor_ptr;
|
||||
struct request_desc_header *h = &req_desc->header;
|
||||
enum utp_data_direction data_direction;
|
||||
|
||||
if (hba->ufs_version <= ufshci_version(1, 1))
|
||||
lrbp->command_type = legacy_type;
|
||||
else
|
||||
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
|
||||
|
||||
*h = (typeof(*h)){ };
|
||||
|
||||
if (cmd_dir == DMA_FROM_DEVICE) {
|
||||
@ -2854,12 +2863,8 @@ static int ufshcd_compose_devman_upiu(struct ufs_hba *hba,
|
||||
u8 upiu_flags;
|
||||
int ret = 0;
|
||||
|
||||
if (hba->ufs_version <= ufshci_version(1, 1))
|
||||
lrbp->command_type = UTP_CMD_TYPE_DEV_MANAGE;
|
||||
else
|
||||
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
|
||||
ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, 0, UTP_CMD_TYPE_DEV_MANAGE);
|
||||
|
||||
ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE, 0);
|
||||
if (hba->dev_cmd.type == DEV_CMD_TYPE_QUERY)
|
||||
ufshcd_prepare_utp_query_req_upiu(hba, lrbp, upiu_flags);
|
||||
else if (hba->dev_cmd.type == DEV_CMD_TYPE_NOP)
|
||||
@ -2882,13 +2887,8 @@ static void ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
|
||||
unsigned int ioprio_class = IOPRIO_PRIO_CLASS(req_get_ioprio(rq));
|
||||
u8 upiu_flags;
|
||||
|
||||
if (hba->ufs_version <= ufshci_version(1, 1))
|
||||
lrbp->command_type = UTP_CMD_TYPE_SCSI;
|
||||
else
|
||||
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
|
||||
|
||||
ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags,
|
||||
lrbp->cmd->sc_data_direction, 0);
|
||||
ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags,
|
||||
lrbp->cmd->sc_data_direction, 0, UTP_CMD_TYPE_SCSI);
|
||||
if (ioprio_class == IOPRIO_CLASS_RT)
|
||||
upiu_flags |= UPIU_CMD_FLAGS_CP;
|
||||
ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags);
|
||||
@ -7229,16 +7229,11 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
|
||||
|
||||
ufshcd_setup_dev_cmd(hba, lrbp, cmd_type, 0, tag);
|
||||
|
||||
if (hba->ufs_version <= ufshci_version(1, 1))
|
||||
lrbp->command_type = UTP_CMD_TYPE_DEV_MANAGE;
|
||||
else
|
||||
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
|
||||
ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, 0, UTP_CMD_TYPE_DEV_MANAGE);
|
||||
|
||||
/* update the task tag in the request upiu */
|
||||
req_upiu->header.task_tag = tag;
|
||||
|
||||
ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE, 0);
|
||||
|
||||
/* just copy the upiu request as it is */
|
||||
memcpy(lrbp->ucd_req_ptr, req_upiu, sizeof(*lrbp->ucd_req_ptr));
|
||||
if (desc_buff && desc_op == UPIU_QUERY_OPCODE_WRITE_DESC) {
|
||||
@ -7379,24 +7374,14 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
|
||||
u8 upiu_flags;
|
||||
u8 *ehs_data;
|
||||
u16 ehs_len;
|
||||
int ehs = (hba->capabilities & MASK_EHSLUTRD_SUPPORTED) ? 2 : 0;
|
||||
|
||||
/* Protects use of hba->reserved_slot. */
|
||||
ufshcd_dev_man_lock(hba);
|
||||
|
||||
ufshcd_setup_dev_cmd(hba, lrbp, DEV_CMD_TYPE_RPMB, UFS_UPIU_RPMB_WLUN, tag);
|
||||
|
||||
/* Advanced RPMB starts from UFS 4.0, so its command type is UTP_CMD_TYPE_UFS_STORAGE */
|
||||
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
|
||||
|
||||
/*
|
||||
* According to UFSHCI 4.0 specification page 24, if EHSLUTRDS is 0, host controller takes
|
||||
* EHS length from CMD UPIU, and SW driver use EHS Length field in CMD UPIU. if it is 1,
|
||||
* HW controller takes EHS length from UTRD.
|
||||
*/
|
||||
if (hba->capabilities & MASK_EHSLUTRD_SUPPORTED)
|
||||
ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, dir, 2);
|
||||
else
|
||||
ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, dir, 0);
|
||||
ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, ehs, UTP_CMD_TYPE_DEV_MANAGE);
|
||||
|
||||
/* update the task tag */
|
||||
req_upiu->header.task_tag = tag;
|
||||
|
@ -426,7 +426,7 @@ union ufs_crypto_cfg_entry {
|
||||
*/
|
||||
|
||||
/* Transfer request command type */
|
||||
enum {
|
||||
enum utp_cmd_type {
|
||||
UTP_CMD_TYPE_SCSI = 0x0,
|
||||
UTP_CMD_TYPE_UFS = 0x1,
|
||||
UTP_CMD_TYPE_DEV_MANAGE = 0x2,
|
||||
|
Loading…
Reference in New Issue
Block a user