Skip to content

Commit

Permalink
scsi: ufs: fix endianness sparse warnings
Browse files Browse the repository at this point in the history
Fix many warnings with incorrect endian assumptions
which makes the code unportable to new architectures.

The UFS specification defines the byte order as big-endian
for UPIU structure and little-endian for the host controller
transfer/task management descriptors.

Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
Acked-by: Vinayak Holikatti <vinholikatti@gmail.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
  • Loading branch information
Sujit Reddy Thumma authored and Christoph Hellwig committed May 28, 2014
1 parent 2bbf5c7 commit e8c8e82
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 68 deletions.
36 changes: 18 additions & 18 deletions drivers/scsi/ufs/ufs.h
Original file line number Diff line number Diff line change
Expand Up @@ -196,9 +196,9 @@ enum {
* @dword_2: UPIU header DW-2
*/
struct utp_upiu_header {
u32 dword_0;
u32 dword_1;
u32 dword_2;
__be32 dword_0;
__be32 dword_1;
__be32 dword_2;
};

/**
Expand All @@ -207,7 +207,7 @@ struct utp_upiu_header {
* @cdb: Command Descriptor Block CDB DW-4 to DW-7
*/
struct utp_upiu_cmd {
u32 exp_data_transfer_len;
__be32 exp_data_transfer_len;
u8 cdb[MAX_CDB_SIZE];
};

Expand All @@ -228,10 +228,10 @@ struct utp_upiu_query {
u8 idn;
u8 index;
u8 selector;
u16 reserved_osf;
u16 length;
u32 value;
u32 reserved[2];
__be16 reserved_osf;
__be16 length;
__be32 value;
__be32 reserved[2];
};

/**
Expand All @@ -256,9 +256,9 @@ struct utp_upiu_req {
* @sense_data: Sense data field DW-8 to DW-12
*/
struct utp_cmd_rsp {
u32 residual_transfer_count;
u32 reserved[4];
u16 sense_data_len;
__be32 residual_transfer_count;
__be32 reserved[4];
__be16 sense_data_len;
u8 sense_data[18];
};

Expand Down Expand Up @@ -286,10 +286,10 @@ struct utp_upiu_rsp {
*/
struct utp_upiu_task_req {
struct utp_upiu_header header;
u32 input_param1;
u32 input_param2;
u32 input_param3;
u32 reserved[2];
__be32 input_param1;
__be32 input_param2;
__be32 input_param3;
__be32 reserved[2];
};

/**
Expand All @@ -301,9 +301,9 @@ struct utp_upiu_task_req {
*/
struct utp_upiu_task_rsp {
struct utp_upiu_header header;
u32 output_param1;
u32 output_param2;
u32 reserved[3];
__be32 output_param1;
__be32 output_param2;
__be32 reserved[3];
};

/**
Expand Down
42 changes: 8 additions & 34 deletions drivers/scsi/ufs/ufshcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ static inline int ufshcd_is_device_present(u32 reg_hcs)
*/
static inline int ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp)
{
return lrbp->utr_descriptor_ptr->header.dword_2 & MASK_OCS;
return le32_to_cpu(lrbp->utr_descriptor_ptr->header.dword_2) & MASK_OCS;
}

/**
Expand All @@ -176,7 +176,7 @@ static inline int ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp)
static inline int
ufshcd_get_tmr_ocs(struct utp_task_req_desc *task_req_descp)
{
return task_req_descp->header.dword_2 & MASK_OCS;
return le32_to_cpu(task_req_descp->header.dword_2) & MASK_OCS;
}

/**
Expand Down Expand Up @@ -389,26 +389,6 @@ static inline void ufshcd_copy_sense_data(struct ufshcd_lrb *lrbp)
}
}

/**
* ufshcd_query_to_cpu() - formats the buffer to native cpu endian
* @response: upiu query response to convert
*/
static inline void ufshcd_query_to_cpu(struct utp_upiu_query *response)
{
response->length = be16_to_cpu(response->length);
response->value = be32_to_cpu(response->value);
}

/**
* ufshcd_query_to_be() - formats the buffer to big endian
* @request: upiu query request to convert
*/
static inline void ufshcd_query_to_be(struct utp_upiu_query *request)
{
request->length = cpu_to_be16(request->length);
request->value = cpu_to_be32(request->value);
}

/**
* ufshcd_copy_query_response() - Copy the Query Response and the data
* descriptor
Expand All @@ -425,7 +405,6 @@ void ufshcd_copy_query_response(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
UPIU_RSP_CODE_OFFSET;

memcpy(&query_res->upiu_res, &lrbp->ucd_rsp_ptr->qr, QUERY_OSF_SIZE);
ufshcd_query_to_cpu(&query_res->upiu_res);


/* Get the descriptor */
Expand Down Expand Up @@ -749,7 +728,7 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
{
struct utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr;
struct ufs_query *query = &hba->dev_cmd.query;
u16 len = query->request.upiu_req.length;
u16 len = be16_to_cpu(query->request.upiu_req.length);
u8 *descp = (u8 *)lrbp->ucd_req_ptr + GENERAL_UPIU_REQUEST_SIZE;

/* Query request header */
Expand All @@ -766,7 +745,6 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
/* Copy the Query Request buffer as is */
memcpy(&ucd_req_ptr->qr, &query->request.upiu_req,
QUERY_OSF_SIZE);
ufshcd_query_to_be(&ucd_req_ptr->qr);

/* Copy the Descriptor */
if ((len > 0) && (query->request.upiu_req.opcode ==
Expand Down Expand Up @@ -1151,7 +1129,7 @@ static int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
}

if (flag_res)
*flag_res = (response->upiu_res.value &
*flag_res = (be32_to_cpu(response->upiu_res.value) &
MASK_QUERY_UPIU_FLAG_LOC) & 0x1;

out_unlock:
Expand Down Expand Up @@ -1195,7 +1173,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
switch (opcode) {
case UPIU_QUERY_OPCODE_WRITE_ATTR:
request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST;
request->upiu_req.value = *attr_val;
request->upiu_req.value = cpu_to_be32(*attr_val);
break;
case UPIU_QUERY_OPCODE_READ_ATTR:
request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST;
Expand All @@ -1222,7 +1200,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
goto out_unlock;
}

*attr_val = response->upiu_res.value;
*attr_val = be32_to_cpu(response->upiu_res.value);

out_unlock:
mutex_unlock(&hba->dev_cmd.lock);
Expand Down Expand Up @@ -2568,12 +2546,8 @@ ufshcd_issue_tm_cmd(struct ufs_hba *hba,
task_req_upiup->header.dword_1 =
UPIU_HEADER_DWORD(0, tm_function, 0, 0);

task_req_upiup->input_param1 = lrbp->lun;
task_req_upiup->input_param1 =
cpu_to_be32(task_req_upiup->input_param1);
task_req_upiup->input_param2 = lrbp->task_tag;
task_req_upiup->input_param2 =
cpu_to_be32(task_req_upiup->input_param2);
task_req_upiup->input_param1 = cpu_to_be32(lrbp->lun);
task_req_upiup->input_param2 = cpu_to_be32(lrbp->task_tag);

/* send command to the controller */
__set_bit(free_slot, &hba->outstanding_tasks);
Expand Down
32 changes: 16 additions & 16 deletions drivers/scsi/ufs/ufshci.h
Original file line number Diff line number Diff line change
Expand Up @@ -304,10 +304,10 @@ enum {
* @size: size of physical segment DW-3
*/
struct ufshcd_sg_entry {
u32 base_addr;
u32 upper_addr;
u32 reserved;
u32 size;
__le32 base_addr;
__le32 upper_addr;
__le32 reserved;
__le32 size;
};

/**
Expand All @@ -330,10 +330,10 @@ struct utp_transfer_cmd_desc {
* @dword3: Descriptor Header DW3
*/
struct request_desc_header {
u32 dword_0;
u32 dword_1;
u32 dword_2;
u32 dword_3;
__le32 dword_0;
__le32 dword_1;
__le32 dword_2;
__le32 dword_3;
};

/**
Expand All @@ -352,16 +352,16 @@ struct utp_transfer_req_desc {
struct request_desc_header header;

/* DW 4-5*/
u32 command_desc_base_addr_lo;
u32 command_desc_base_addr_hi;
__le32 command_desc_base_addr_lo;
__le32 command_desc_base_addr_hi;

/* DW 6 */
u16 response_upiu_length;
u16 response_upiu_offset;
__le16 response_upiu_length;
__le16 response_upiu_offset;

/* DW 7 */
u16 prd_table_length;
u16 prd_table_offset;
__le16 prd_table_length;
__le16 prd_table_offset;
};

/**
Expand All @@ -376,10 +376,10 @@ struct utp_task_req_desc {
struct request_desc_header header;

/* DW 4-11 */
u32 task_req_upiu[TASK_REQ_UPIU_SIZE_DWORDS];
__le32 task_req_upiu[TASK_REQ_UPIU_SIZE_DWORDS];

/* DW 12-19 */
u32 task_rsp_upiu[TASK_RSP_UPIU_SIZE_DWORDS];
__le32 task_rsp_upiu[TASK_RSP_UPIU_SIZE_DWORDS];
};

#endif /* End of Header */

0 comments on commit e8c8e82

Please sign in to comment.