Commit 617bfaa8 authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen

scsi: ufs: Simplify response header parsing

Make the code that parses UTP transfer request headers easier to read by
using u8 instead of __be32 where appropriate.
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Link: https://lore.kernel.org/r/20230727194457.3152309-13-bvanassche@acm.orgReviewed-by: default avatarAvri Altman <avri.altman@wdc.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 67a2a897
This diff is collapsed.
......@@ -8,6 +8,7 @@
#ifndef SCSI_BSG_UFS_H
#define SCSI_BSG_UFS_H
#include <asm/byteorder.h>
#include <linux/types.h>
/*
* This file intended to be included by both kernel and user space
......@@ -40,11 +41,56 @@ enum ufs_rpmb_op_type {
* @dword_0: UPIU header DW-0
* @dword_1: UPIU header DW-1
* @dword_2: UPIU header DW-2
*
* @transaction_code: Type of request or response. See also enum
* upiu_request_transaction and enum upiu_response_transaction.
* @flags: UPIU flags. The meaning of individual flags depends on the
* transaction code.
* @lun: Logical unit number.
* @task_tag: Task tag.
* @iid: Initiator ID.
* @command_set_type: 0 for SCSI command set; 1 for UFS specific.
* @tm_function: Task management function in case of a task management request
* UPIU.
* @query_function: Query function in case of a query request UPIU.
* @response: 0 for success; 1 for failure.
* @status: SCSI status if this is the header of a response to a SCSI command.
* @ehs_length: EHS length in units of 32 bytes.
* @device_information:
* @data_segment_length: data segment length.
*/
struct utp_upiu_header {
__be32 dword_0;
__be32 dword_1;
__be32 dword_2;
union {
struct {
__be32 dword_0;
__be32 dword_1;
__be32 dword_2;
};
struct {
__u8 transaction_code;
__u8 flags;
__u8 lun;
__u8 task_tag;
#if defined(__BIG_ENDIAN)
__u8 iid: 4;
__u8 command_set_type: 4;
#elif defined(__LITTLE_ENDIAN)
__u8 command_set_type: 4;
__u8 iid: 4;
#else
#error
#endif
union {
__u8 tm_function;
__u8 query_function;
};
__u8 response;
__u8 status;
__u8 ehs_length;
__u8 device_information;
__be16 data_segment_length;
};
};
};
/**
......
......@@ -15,6 +15,12 @@
#include <linux/types.h>
#include <uapi/scsi/scsi_bsg_ufs.h>
/*
* Using static_assert() is not allowed in UAPI header files. Hence the check
* in this header file of the size of struct utp_upiu_header.
*/
static_assert(sizeof(struct utp_upiu_header) == 12);
#define GENERAL_UPIU_REQUEST_SIZE (sizeof(struct utp_upiu_req))
#define QUERY_DESC_MAX_SIZE 255
#define QUERY_DESC_MIN_SIZE 2
......@@ -23,11 +29,6 @@
(sizeof(struct utp_upiu_header)))
#define UFS_SENSE_SIZE 18
static inline __be32 upiu_header_dword(u8 byte3, u8 byte2, u8 byte1, u8 byte0)
{
return cpu_to_be32(byte3 << 24 | byte2 << 16 | byte1 << 8 | byte0);
}
/*
* UFS device may have standard LUs and LUN id could be from 0x00 to
* 0x7F. Standard LUs use "Peripheral Device Addressing Format".
......@@ -477,14 +478,7 @@ enum {
#define UPIU_RSP_CODE_OFFSET 8
enum {
MASK_SCSI_STATUS = 0xFF,
MASK_TASK_RESPONSE = 0xFF00,
MASK_RSP_UPIU_RESULT = 0xFFFF,
MASK_QUERY_DATA_SEG_LEN = 0xFFFF,
MASK_RSP_UPIU_DATA_SEG_LEN = 0xFFFF,
MASK_RSP_EXCEPTION_EVENT = 0x10000,
MASK_TM_SERVICE_RESP = 0xFF,
MASK_TM_FUNC = 0xFF,
};
/* Task management service response */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment