提交 e8c8e82a 编写于 作者: S Sujit Reddy Thumma 提交者: Christoph Hellwig

scsi: ufs: fix endianness sparse warnings

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: NSujit Reddy Thumma <sthumma@codeaurora.org>
Acked-by: NVinayak Holikatti <vinholikatti@gmail.com>
Signed-off-by: NChristoph Hellwig <hch@lst.de>
上级 2bbf5c7f
...@@ -196,9 +196,9 @@ enum { ...@@ -196,9 +196,9 @@ enum {
* @dword_2: UPIU header DW-2 * @dword_2: UPIU header DW-2
*/ */
struct utp_upiu_header { struct utp_upiu_header {
u32 dword_0; __be32 dword_0;
u32 dword_1; __be32 dword_1;
u32 dword_2; __be32 dword_2;
}; };
/** /**
...@@ -207,7 +207,7 @@ struct utp_upiu_header { ...@@ -207,7 +207,7 @@ struct utp_upiu_header {
* @cdb: Command Descriptor Block CDB DW-4 to DW-7 * @cdb: Command Descriptor Block CDB DW-4 to DW-7
*/ */
struct utp_upiu_cmd { struct utp_upiu_cmd {
u32 exp_data_transfer_len; __be32 exp_data_transfer_len;
u8 cdb[MAX_CDB_SIZE]; u8 cdb[MAX_CDB_SIZE];
}; };
...@@ -228,10 +228,10 @@ struct utp_upiu_query { ...@@ -228,10 +228,10 @@ struct utp_upiu_query {
u8 idn; u8 idn;
u8 index; u8 index;
u8 selector; u8 selector;
u16 reserved_osf; __be16 reserved_osf;
u16 length; __be16 length;
u32 value; __be32 value;
u32 reserved[2]; __be32 reserved[2];
}; };
/** /**
...@@ -256,9 +256,9 @@ struct utp_upiu_req { ...@@ -256,9 +256,9 @@ struct utp_upiu_req {
* @sense_data: Sense data field DW-8 to DW-12 * @sense_data: Sense data field DW-8 to DW-12
*/ */
struct utp_cmd_rsp { struct utp_cmd_rsp {
u32 residual_transfer_count; __be32 residual_transfer_count;
u32 reserved[4]; __be32 reserved[4];
u16 sense_data_len; __be16 sense_data_len;
u8 sense_data[18]; u8 sense_data[18];
}; };
...@@ -286,10 +286,10 @@ struct utp_upiu_rsp { ...@@ -286,10 +286,10 @@ struct utp_upiu_rsp {
*/ */
struct utp_upiu_task_req { struct utp_upiu_task_req {
struct utp_upiu_header header; struct utp_upiu_header header;
u32 input_param1; __be32 input_param1;
u32 input_param2; __be32 input_param2;
u32 input_param3; __be32 input_param3;
u32 reserved[2]; __be32 reserved[2];
}; };
/** /**
...@@ -301,9 +301,9 @@ struct utp_upiu_task_req { ...@@ -301,9 +301,9 @@ struct utp_upiu_task_req {
*/ */
struct utp_upiu_task_rsp { struct utp_upiu_task_rsp {
struct utp_upiu_header header; struct utp_upiu_header header;
u32 output_param1; __be32 output_param1;
u32 output_param2; __be32 output_param2;
u32 reserved[3]; __be32 reserved[3];
}; };
/** /**
......
...@@ -163,7 +163,7 @@ static inline int ufshcd_is_device_present(u32 reg_hcs) ...@@ -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) 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;
} }
/** /**
...@@ -176,7 +176,7 @@ static inline int ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp) ...@@ -176,7 +176,7 @@ static inline int ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp)
static inline int static inline int
ufshcd_get_tmr_ocs(struct utp_task_req_desc *task_req_descp) 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;
} }
/** /**
...@@ -389,26 +389,6 @@ static inline void ufshcd_copy_sense_data(struct ufshcd_lrb *lrbp) ...@@ -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 * ufshcd_copy_query_response() - Copy the Query Response and the data
* descriptor * descriptor
...@@ -425,7 +405,6 @@ void ufshcd_copy_query_response(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) ...@@ -425,7 +405,6 @@ void ufshcd_copy_query_response(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
UPIU_RSP_CODE_OFFSET; UPIU_RSP_CODE_OFFSET;
memcpy(&query_res->upiu_res, &lrbp->ucd_rsp_ptr->qr, QUERY_OSF_SIZE); memcpy(&query_res->upiu_res, &lrbp->ucd_rsp_ptr->qr, QUERY_OSF_SIZE);
ufshcd_query_to_cpu(&query_res->upiu_res);
/* Get the descriptor */ /* Get the descriptor */
...@@ -749,7 +728,7 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba, ...@@ -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 utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr;
struct ufs_query *query = &hba->dev_cmd.query; 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; u8 *descp = (u8 *)lrbp->ucd_req_ptr + GENERAL_UPIU_REQUEST_SIZE;
/* Query request header */ /* Query request header */
...@@ -766,7 +745,6 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba, ...@@ -766,7 +745,6 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
/* Copy the Query Request buffer as is */ /* Copy the Query Request buffer as is */
memcpy(&ucd_req_ptr->qr, &query->request.upiu_req, memcpy(&ucd_req_ptr->qr, &query->request.upiu_req,
QUERY_OSF_SIZE); QUERY_OSF_SIZE);
ufshcd_query_to_be(&ucd_req_ptr->qr);
/* Copy the Descriptor */ /* Copy the Descriptor */
if ((len > 0) && (query->request.upiu_req.opcode == if ((len > 0) && (query->request.upiu_req.opcode ==
...@@ -1151,7 +1129,7 @@ static int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, ...@@ -1151,7 +1129,7 @@ static int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
} }
if (flag_res) if (flag_res)
*flag_res = (response->upiu_res.value & *flag_res = (be32_to_cpu(response->upiu_res.value) &
MASK_QUERY_UPIU_FLAG_LOC) & 0x1; MASK_QUERY_UPIU_FLAG_LOC) & 0x1;
out_unlock: out_unlock:
...@@ -1195,7 +1173,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode, ...@@ -1195,7 +1173,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
switch (opcode) { switch (opcode) {
case UPIU_QUERY_OPCODE_WRITE_ATTR: case UPIU_QUERY_OPCODE_WRITE_ATTR:
request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST; 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; break;
case UPIU_QUERY_OPCODE_READ_ATTR: case UPIU_QUERY_OPCODE_READ_ATTR:
request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST; request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST;
...@@ -1222,7 +1200,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode, ...@@ -1222,7 +1200,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
goto out_unlock; goto out_unlock;
} }
*attr_val = response->upiu_res.value; *attr_val = be32_to_cpu(response->upiu_res.value);
out_unlock: out_unlock:
mutex_unlock(&hba->dev_cmd.lock); mutex_unlock(&hba->dev_cmd.lock);
...@@ -2568,12 +2546,8 @@ ufshcd_issue_tm_cmd(struct ufs_hba *hba, ...@@ -2568,12 +2546,8 @@ ufshcd_issue_tm_cmd(struct ufs_hba *hba,
task_req_upiup->header.dword_1 = task_req_upiup->header.dword_1 =
UPIU_HEADER_DWORD(0, tm_function, 0, 0); UPIU_HEADER_DWORD(0, tm_function, 0, 0);
task_req_upiup->input_param1 = lrbp->lun; task_req_upiup->input_param1 = cpu_to_be32(lrbp->lun);
task_req_upiup->input_param1 = task_req_upiup->input_param2 = cpu_to_be32(lrbp->task_tag);
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);
/* send command to the controller */ /* send command to the controller */
__set_bit(free_slot, &hba->outstanding_tasks); __set_bit(free_slot, &hba->outstanding_tasks);
......
...@@ -304,10 +304,10 @@ enum { ...@@ -304,10 +304,10 @@ enum {
* @size: size of physical segment DW-3 * @size: size of physical segment DW-3
*/ */
struct ufshcd_sg_entry { struct ufshcd_sg_entry {
u32 base_addr; __le32 base_addr;
u32 upper_addr; __le32 upper_addr;
u32 reserved; __le32 reserved;
u32 size; __le32 size;
}; };
/** /**
...@@ -330,10 +330,10 @@ struct utp_transfer_cmd_desc { ...@@ -330,10 +330,10 @@ struct utp_transfer_cmd_desc {
* @dword3: Descriptor Header DW3 * @dword3: Descriptor Header DW3
*/ */
struct request_desc_header { struct request_desc_header {
u32 dword_0; __le32 dword_0;
u32 dword_1; __le32 dword_1;
u32 dword_2; __le32 dword_2;
u32 dword_3; __le32 dword_3;
}; };
/** /**
...@@ -352,16 +352,16 @@ struct utp_transfer_req_desc { ...@@ -352,16 +352,16 @@ struct utp_transfer_req_desc {
struct request_desc_header header; struct request_desc_header header;
/* DW 4-5*/ /* DW 4-5*/
u32 command_desc_base_addr_lo; __le32 command_desc_base_addr_lo;
u32 command_desc_base_addr_hi; __le32 command_desc_base_addr_hi;
/* DW 6 */ /* DW 6 */
u16 response_upiu_length; __le16 response_upiu_length;
u16 response_upiu_offset; __le16 response_upiu_offset;
/* DW 7 */ /* DW 7 */
u16 prd_table_length; __le16 prd_table_length;
u16 prd_table_offset; __le16 prd_table_offset;
}; };
/** /**
...@@ -376,10 +376,10 @@ struct utp_task_req_desc { ...@@ -376,10 +376,10 @@ struct utp_task_req_desc {
struct request_desc_header header; struct request_desc_header header;
/* DW 4-11 */ /* DW 4-11 */
u32 task_req_upiu[TASK_REQ_UPIU_SIZE_DWORDS]; __le32 task_req_upiu[TASK_REQ_UPIU_SIZE_DWORDS];
/* DW 12-19 */ /* 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 */ #endif /* End of Header */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册