Commit 6cae9a39 authored by Martin K. Petersen's avatar Martin K. Petersen

Merge patch series "Multiple cleanup patches for the UFS driver"

Bart Van Assche <bvanassche@acm.org> says:

Hi Martin,

This patch includes the following changes, none of which should change the
functionality of the UFS host controller driver:
- Improve the kernel-doc headers further.
- Fix multiple W=2 compiler warnings.
- Simplify ufshcd_abort_all().
- Simplify the code for creating and parsing UFS Transport Protocol (UTP)
  headers.

Please consider this patch series for the next merge window.

Thanks,

Bart.

Link: https://lore.kernel.org/r/20230727194457.3152309-1-bvanassche@acm.orgSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parents 03ce80a1 617bfaa8
...@@ -127,7 +127,8 @@ static int ufs_hwmon_write(struct device *dev, enum hwmon_sensor_types type, u32 ...@@ -127,7 +127,8 @@ static int ufs_hwmon_write(struct device *dev, enum hwmon_sensor_types type, u32
return err; return err;
} }
static umode_t ufs_hwmon_is_visible(const void *_data, enum hwmon_sensor_types type, u32 attr, static umode_t ufs_hwmon_is_visible(const void *data,
enum hwmon_sensor_types type, u32 attr,
int channel) int channel)
{ {
if (type != hwmon_temp) if (type != hwmon_temp)
......
...@@ -105,7 +105,7 @@ EXPORT_SYMBOL_GPL(ufshcd_mcq_config_mac); ...@@ -105,7 +105,7 @@ EXPORT_SYMBOL_GPL(ufshcd_mcq_config_mac);
* @hba: per adapter instance * @hba: per adapter instance
* @req: pointer to the request to be issued * @req: pointer to the request to be issued
* *
* Returns the hardware queue instance on which the request would * Return: the hardware queue instance on which the request would
* be queued. * be queued.
*/ */
struct ufs_hw_queue *ufshcd_mcq_req_to_hwq(struct ufs_hba *hba, struct ufs_hw_queue *ufshcd_mcq_req_to_hwq(struct ufs_hba *hba,
...@@ -121,7 +121,7 @@ struct ufs_hw_queue *ufshcd_mcq_req_to_hwq(struct ufs_hba *hba, ...@@ -121,7 +121,7 @@ struct ufs_hw_queue *ufshcd_mcq_req_to_hwq(struct ufs_hba *hba,
* ufshcd_mcq_decide_queue_depth - decide the queue depth * ufshcd_mcq_decide_queue_depth - decide the queue depth
* @hba: per adapter instance * @hba: per adapter instance
* *
* Returns queue-depth on success, non-zero on error * Return: queue-depth on success, non-zero on error
* *
* MAC - Max. Active Command of the Host Controller (HC) * MAC - Max. Active Command of the Host Controller (HC)
* HC wouldn't send more than this commands to the device. * HC wouldn't send more than this commands to the device.
...@@ -493,7 +493,7 @@ static int ufshcd_mcq_sq_start(struct ufs_hba *hba, struct ufs_hw_queue *hwq) ...@@ -493,7 +493,7 @@ static int ufshcd_mcq_sq_start(struct ufs_hba *hba, struct ufs_hw_queue *hwq)
* @hba: per adapter instance. * @hba: per adapter instance.
* @task_tag: The command's task tag. * @task_tag: The command's task tag.
* *
* Returns 0 for success; error code otherwise. * Return: 0 for success; error code otherwise.
*/ */
int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag) int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
{ {
...@@ -558,12 +558,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag) ...@@ -558,12 +558,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag)
*/ */
static void ufshcd_mcq_nullify_sqe(struct utp_transfer_req_desc *utrd) static void ufshcd_mcq_nullify_sqe(struct utp_transfer_req_desc *utrd)
{ {
u32 dword_0; utrd->header.command_type = 0xf;
dword_0 = le32_to_cpu(utrd->header.dword_0);
dword_0 &= ~UPIU_COMMAND_TYPE_MASK;
dword_0 |= FIELD_PREP(UPIU_COMMAND_TYPE_MASK, 0xF);
utrd->header.dword_0 = cpu_to_le32(dword_0);
} }
/** /**
...@@ -575,7 +570,7 @@ static void ufshcd_mcq_nullify_sqe(struct utp_transfer_req_desc *utrd) ...@@ -575,7 +570,7 @@ static void ufshcd_mcq_nullify_sqe(struct utp_transfer_req_desc *utrd)
* @hwq: Hardware Queue to be searched. * @hwq: Hardware Queue to be searched.
* @task_tag: The command's task tag. * @task_tag: The command's task tag.
* *
* Returns true if the SQE containing the command is present in the SQ * Return: true if the SQE containing the command is present in the SQ
* (not fetched by the controller); returns false if the SQE is not in the SQ. * (not fetched by the controller); returns false if the SQE is not in the SQ.
*/ */
static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba, static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
...@@ -624,7 +619,7 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba, ...@@ -624,7 +619,7 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
* ufshcd_mcq_abort - Abort the command in MCQ. * ufshcd_mcq_abort - Abort the command in MCQ.
* @cmd: The command to be aborted. * @cmd: The command to be aborted.
* *
* Returns SUCCESS or FAILED error codes * Return: SUCCESS or FAILED error codes
*/ */
int ufshcd_mcq_abort(struct scsi_cmnd *cmd) int ufshcd_mcq_abort(struct scsi_cmnd *cmd)
{ {
......
...@@ -232,6 +232,8 @@ static inline void ufs_bsg_node_release(struct device *dev) ...@@ -232,6 +232,8 @@ static inline void ufs_bsg_node_release(struct device *dev)
* @hba: per adapter object * @hba: per adapter object
* *
* Called during initial loading of the driver, and before scsi_scan_host. * Called during initial loading of the driver, and before scsi_scan_host.
*
* Returns: 0 (success).
*/ */
int ufs_bsg_probe(struct ufs_hba *hba) int ufs_bsg_probe(struct ufs_hba *hba)
{ {
......
...@@ -26,15 +26,15 @@ static inline void ufshcd_prepare_lrbp_crypto(struct request *rq, ...@@ -26,15 +26,15 @@ static inline void ufshcd_prepare_lrbp_crypto(struct request *rq,
} }
static inline void static inline void
ufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp, u32 *dword_0, ufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp,
u32 *dword_1, u32 *dword_3) struct request_desc_header *h)
{ {
if (lrbp->crypto_key_slot >= 0) { if (lrbp->crypto_key_slot < 0)
*dword_0 |= UTP_REQ_DESC_CRYPTO_ENABLE_CMD; return;
*dword_0 |= lrbp->crypto_key_slot; h->enable_crypto = 1;
*dword_1 = lower_32_bits(lrbp->data_unit_num); h->cci = lrbp->crypto_key_slot;
*dword_3 = upper_32_bits(lrbp->data_unit_num); h->dunl = cpu_to_le32(lower_32_bits(lrbp->data_unit_num));
} h->dunu = cpu_to_le32(upper_32_bits(lrbp->data_unit_num));
} }
bool ufshcd_crypto_enable(struct ufs_hba *hba); bool ufshcd_crypto_enable(struct ufs_hba *hba);
...@@ -51,8 +51,8 @@ static inline void ufshcd_prepare_lrbp_crypto(struct request *rq, ...@@ -51,8 +51,8 @@ static inline void ufshcd_prepare_lrbp_crypto(struct request *rq,
struct ufshcd_lrb *lrbp) { } struct ufshcd_lrb *lrbp) { }
static inline void static inline void
ufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp, u32 *dword_0, ufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp,
u32 *dword_1, u32 *dword_3) { } struct request_desc_header *h) { }
static inline bool ufshcd_crypto_enable(struct ufs_hba *hba) static inline bool ufshcd_crypto_enable(struct ufs_hba *hba)
{ {
......
...@@ -93,7 +93,7 @@ int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd); ...@@ -93,7 +93,7 @@ int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd);
int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba, int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
struct utp_upiu_req *req_upiu, struct utp_upiu_req *req_upiu,
struct utp_upiu_req *rsp_upiu, struct utp_upiu_req *rsp_upiu,
int msgcode, enum upiu_request_transaction msgcode,
u8 *desc_buff, int *buff_len, u8 *desc_buff, int *buff_len,
enum query_opcode desc_op); enum query_opcode desc_op);
...@@ -294,7 +294,7 @@ extern const struct ufs_pm_lvl_states ufs_pm_lvl_states[]; ...@@ -294,7 +294,7 @@ extern const struct ufs_pm_lvl_states ufs_pm_lvl_states[];
* ufshcd_scsi_to_upiu_lun - maps scsi LUN to UPIU LUN * ufshcd_scsi_to_upiu_lun - maps scsi LUN to UPIU LUN
* @scsi_lun: scsi LUN id * @scsi_lun: scsi LUN id
* *
* Returns UPIU LUN id * Return: UPIU LUN id
*/ */
static inline u8 ufshcd_scsi_to_upiu_lun(unsigned int scsi_lun) static inline u8 ufshcd_scsi_to_upiu_lun(unsigned int scsi_lun)
{ {
......
...@@ -701,8 +701,7 @@ EXPORT_SYMBOL_GPL(ufshcd_delay_us); ...@@ -701,8 +701,7 @@ EXPORT_SYMBOL_GPL(ufshcd_delay_us);
* @interval_us: polling interval in microseconds * @interval_us: polling interval in microseconds
* @timeout_ms: timeout in milliseconds * @timeout_ms: timeout in milliseconds
* *
* Return: * Return: -ETIMEDOUT on error, zero on success.
* -ETIMEDOUT on error, zero on success.
*/ */
static int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask, static int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask,
u32 val, unsigned long interval_us, u32 val, unsigned long interval_us,
...@@ -730,7 +729,7 @@ static int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask, ...@@ -730,7 +729,7 @@ static int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask,
* ufshcd_get_intr_mask - Get the interrupt bit mask * ufshcd_get_intr_mask - Get the interrupt bit mask
* @hba: Pointer to adapter instance * @hba: Pointer to adapter instance
* *
* Returns interrupt bit mask per version * Return: interrupt bit mask per version
*/ */
static inline u32 ufshcd_get_intr_mask(struct ufs_hba *hba) static inline u32 ufshcd_get_intr_mask(struct ufs_hba *hba)
{ {
...@@ -746,7 +745,7 @@ static inline u32 ufshcd_get_intr_mask(struct ufs_hba *hba) ...@@ -746,7 +745,7 @@ static inline u32 ufshcd_get_intr_mask(struct ufs_hba *hba)
* ufshcd_get_ufs_version - Get the UFS version supported by the HBA * ufshcd_get_ufs_version - Get the UFS version supported by the HBA
* @hba: Pointer to adapter instance * @hba: Pointer to adapter instance
* *
* Returns UFSHCI version supported by the controller * Return: UFSHCI version supported by the controller
*/ */
static inline u32 ufshcd_get_ufs_version(struct ufs_hba *hba) static inline u32 ufshcd_get_ufs_version(struct ufs_hba *hba)
{ {
...@@ -773,7 +772,7 @@ static inline u32 ufshcd_get_ufs_version(struct ufs_hba *hba) ...@@ -773,7 +772,7 @@ static inline u32 ufshcd_get_ufs_version(struct ufs_hba *hba)
* the host controller * the host controller
* @hba: pointer to adapter instance * @hba: pointer to adapter instance
* *
* Returns true if device present, false if no device detected * Return: true if device present, false if no device detected
*/ */
static inline bool ufshcd_is_device_present(struct ufs_hba *hba) static inline bool ufshcd_is_device_present(struct ufs_hba *hba)
{ {
...@@ -786,7 +785,8 @@ static inline bool ufshcd_is_device_present(struct ufs_hba *hba) ...@@ -786,7 +785,8 @@ static inline bool ufshcd_is_device_present(struct ufs_hba *hba)
* @cqe: pointer to the completion queue entry * @cqe: pointer to the completion queue entry
* *
* This function is used to get the OCS field from UTRD * This function is used to get the OCS field from UTRD
* Returns the OCS field in the UTRD *
* Return: the OCS field in the UTRD.
*/ */
static enum utp_ocs ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp, static enum utp_ocs ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp,
struct cq_entry *cqe) struct cq_entry *cqe)
...@@ -794,7 +794,7 @@ static enum utp_ocs ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp, ...@@ -794,7 +794,7 @@ static enum utp_ocs ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp,
if (cqe) if (cqe)
return le32_to_cpu(cqe->status) & MASK_OCS; return le32_to_cpu(cqe->status) & MASK_OCS;
return le32_to_cpu(lrbp->utr_descriptor_ptr->header.dword_2) & MASK_OCS; return lrbp->utr_descriptor_ptr->header.ocs & MASK_OCS;
} }
/** /**
...@@ -839,7 +839,7 @@ static inline void ufshcd_utmrl_clear(struct ufs_hba *hba, u32 pos) ...@@ -839,7 +839,7 @@ static inline void ufshcd_utmrl_clear(struct ufs_hba *hba, u32 pos)
* ufshcd_get_lists_status - Check UCRDY, UTRLRDY and UTMRLRDY * ufshcd_get_lists_status - Check UCRDY, UTRLRDY and UTMRLRDY
* @reg: Register value of host controller status * @reg: Register value of host controller status
* *
* Returns integer, 0 on Success and positive value if failed * Return: 0 on success; a positive value if failed.
*/ */
static inline int ufshcd_get_lists_status(u32 reg) static inline int ufshcd_get_lists_status(u32 reg)
{ {
...@@ -851,7 +851,8 @@ static inline int ufshcd_get_lists_status(u32 reg) ...@@ -851,7 +851,8 @@ static inline int ufshcd_get_lists_status(u32 reg)
* @hba: Pointer to adapter instance * @hba: Pointer to adapter instance
* *
* This function gets the result of UIC command completion * This function gets the result of UIC command completion
* Returns 0 on success, non zero value on error *
* Return: 0 on success; non-zero value on error.
*/ */
static inline int ufshcd_get_uic_cmd_result(struct ufs_hba *hba) static inline int ufshcd_get_uic_cmd_result(struct ufs_hba *hba)
{ {
...@@ -864,7 +865,8 @@ static inline int ufshcd_get_uic_cmd_result(struct ufs_hba *hba) ...@@ -864,7 +865,8 @@ static inline int ufshcd_get_uic_cmd_result(struct ufs_hba *hba)
* @hba: Pointer to adapter instance * @hba: Pointer to adapter instance
* *
* This function gets UIC command argument3 * This function gets UIC command argument3
* Returns 0 on success, non zero value on error *
* Return: 0 on success; non-zero value on error.
*/ */
static inline u32 ufshcd_get_dme_attr_val(struct ufs_hba *hba) static inline u32 ufshcd_get_dme_attr_val(struct ufs_hba *hba)
{ {
...@@ -874,38 +876,13 @@ static inline u32 ufshcd_get_dme_attr_val(struct ufs_hba *hba) ...@@ -874,38 +876,13 @@ static inline u32 ufshcd_get_dme_attr_val(struct ufs_hba *hba)
/** /**
* ufshcd_get_req_rsp - returns the TR response transaction type * ufshcd_get_req_rsp - returns the TR response transaction type
* @ucd_rsp_ptr: pointer to response UPIU * @ucd_rsp_ptr: pointer to response UPIU
*/
static inline int
ufshcd_get_req_rsp(struct utp_upiu_rsp *ucd_rsp_ptr)
{
return be32_to_cpu(ucd_rsp_ptr->header.dword_0) >> 24;
}
/**
* ufshcd_get_rsp_upiu_result - Get the result from response UPIU
* @ucd_rsp_ptr: pointer to response UPIU
*
* This function gets the response status and scsi_status from response UPIU
* Returns the response result code.
*/
static inline int
ufshcd_get_rsp_upiu_result(struct utp_upiu_rsp *ucd_rsp_ptr)
{
return be32_to_cpu(ucd_rsp_ptr->header.dword_1) & MASK_RSP_UPIU_RESULT;
}
/*
* ufshcd_get_rsp_upiu_data_seg_len - Get the data segment length
* from response UPIU
* @ucd_rsp_ptr: pointer to response UPIU
* *
* Return the data segment length. * Return: UPIU type.
*/ */
static inline unsigned int static inline enum upiu_response_transaction
ufshcd_get_rsp_upiu_data_seg_len(struct utp_upiu_rsp *ucd_rsp_ptr) ufshcd_get_req_rsp(struct utp_upiu_rsp *ucd_rsp_ptr)
{ {
return be32_to_cpu(ucd_rsp_ptr->header.dword_2) & return ucd_rsp_ptr->header.transaction_code;
MASK_RSP_UPIU_DATA_SEG_LEN;
} }
/** /**
...@@ -915,12 +892,11 @@ ufshcd_get_rsp_upiu_data_seg_len(struct utp_upiu_rsp *ucd_rsp_ptr) ...@@ -915,12 +892,11 @@ ufshcd_get_rsp_upiu_data_seg_len(struct utp_upiu_rsp *ucd_rsp_ptr)
* The function checks if the device raised an exception event indicated in * The function checks if the device raised an exception event indicated in
* the Device Information field of response UPIU. * the Device Information field of response UPIU.
* *
* Returns true if exception is raised, false otherwise. * Return: true if exception is raised, false otherwise.
*/ */
static inline bool ufshcd_is_exception_event(struct utp_upiu_rsp *ucd_rsp_ptr) static inline bool ufshcd_is_exception_event(struct utp_upiu_rsp *ucd_rsp_ptr)
{ {
return be32_to_cpu(ucd_rsp_ptr->header.dword_2) & return ucd_rsp_ptr->header.device_information & 1;
MASK_RSP_EXCEPTION_EVENT;
} }
/** /**
...@@ -991,7 +967,7 @@ static inline void ufshcd_hba_start(struct ufs_hba *hba) ...@@ -991,7 +967,7 @@ static inline void ufshcd_hba_start(struct ufs_hba *hba)
* ufshcd_is_hba_active - Get controller state * ufshcd_is_hba_active - Get controller state
* @hba: per adapter instance * @hba: per adapter instance
* *
* Returns true if and only if the controller is active. * Return: true if and only if the controller is active.
*/ */
static inline bool ufshcd_is_hba_active(struct ufs_hba *hba) static inline bool ufshcd_is_hba_active(struct ufs_hba *hba)
{ {
...@@ -1027,8 +1003,7 @@ static bool ufshcd_is_unipro_pa_params_tuning_req(struct ufs_hba *hba) ...@@ -1027,8 +1003,7 @@ static bool ufshcd_is_unipro_pa_params_tuning_req(struct ufs_hba *hba)
* @hba: per adapter instance * @hba: per adapter instance
* @scale_up: If True, set max possible frequency othewise set low frequency * @scale_up: If True, set max possible frequency othewise set low frequency
* *
* Returns 0 if successful * Return: 0 if successful; < 0 upon failure.
* Returns < 0 for any other errors
*/ */
static int ufshcd_set_clk_freq(struct ufs_hba *hba, bool scale_up) static int ufshcd_set_clk_freq(struct ufs_hba *hba, bool scale_up)
{ {
...@@ -1090,8 +1065,7 @@ static int ufshcd_set_clk_freq(struct ufs_hba *hba, bool scale_up) ...@@ -1090,8 +1065,7 @@ static int ufshcd_set_clk_freq(struct ufs_hba *hba, bool scale_up)
* @hba: per adapter instance * @hba: per adapter instance
* @scale_up: True if scaling up and false if scaling down * @scale_up: True if scaling up and false if scaling down
* *
* Returns 0 if successful * Return: 0 if successful; < 0 upon failure.
* Returns < 0 for any other errors
*/ */
static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up)
{ {
...@@ -1122,7 +1096,7 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up) ...@@ -1122,7 +1096,7 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up)
* @hba: per adapter instance * @hba: per adapter instance
* @scale_up: True if scaling up and false if scaling down * @scale_up: True if scaling up and false if scaling down
* *
* Returns true if scaling is required, false otherwise. * Return: true if scaling is required, false otherwise.
*/ */
static bool ufshcd_is_devfreq_scaling_required(struct ufs_hba *hba, static bool ufshcd_is_devfreq_scaling_required(struct ufs_hba *hba,
bool scale_up) bool scale_up)
...@@ -1239,9 +1213,8 @@ static int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba, ...@@ -1239,9 +1213,8 @@ static int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba,
* @hba: per adapter instance * @hba: per adapter instance
* @scale_up: True for scaling up gear and false for scaling down * @scale_up: True for scaling up gear and false for scaling down
* *
* Returns 0 for success, * Return: 0 for success; -EBUSY if scaling can't happen at this time;
* Returns -EBUSY if scaling can't happen at this time * non-zero for any other errors.
* Returns non-zero for any other errors
*/ */
static int ufshcd_scale_gear(struct ufs_hba *hba, bool scale_up) static int ufshcd_scale_gear(struct ufs_hba *hba, bool scale_up)
{ {
...@@ -1331,9 +1304,8 @@ static void ufshcd_clock_scaling_unprepare(struct ufs_hba *hba, int err, bool sc ...@@ -1331,9 +1304,8 @@ static void ufshcd_clock_scaling_unprepare(struct ufs_hba *hba, int err, bool sc
* @hba: per adapter instance * @hba: per adapter instance
* @scale_up: True for scaling up and false for scalin down * @scale_up: True for scaling up and false for scalin down
* *
* Returns 0 for success, * Return: 0 for success; -EBUSY if scaling can't happen at this time; non-zero
* Returns -EBUSY if scaling can't happen at this time * for any other errors.
* Returns non-zero for any other errors
*/ */
static int ufshcd_devfreq_scale(struct ufs_hba *hba, bool scale_up) static int ufshcd_devfreq_scale(struct ufs_hba *hba, bool scale_up)
{ {
...@@ -2223,10 +2195,11 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag, ...@@ -2223,10 +2195,11 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag,
static inline void ufshcd_copy_sense_data(struct ufshcd_lrb *lrbp) static inline void ufshcd_copy_sense_data(struct ufshcd_lrb *lrbp)
{ {
u8 *const sense_buffer = lrbp->cmd->sense_buffer; u8 *const sense_buffer = lrbp->cmd->sense_buffer;
u16 resp_len;
int len; int len;
if (sense_buffer && resp_len = be16_to_cpu(lrbp->ucd_rsp_ptr->header.data_segment_length);
ufshcd_get_rsp_upiu_data_seg_len(lrbp->ucd_rsp_ptr)) { if (sense_buffer && resp_len) {
int len_to_copy; int len_to_copy;
len = be16_to_cpu(lrbp->ucd_rsp_ptr->sr.sense_data_len); len = be16_to_cpu(lrbp->ucd_rsp_ptr->sr.sense_data_len);
...@@ -2242,6 +2215,8 @@ static inline void ufshcd_copy_sense_data(struct ufshcd_lrb *lrbp) ...@@ -2242,6 +2215,8 @@ static inline void ufshcd_copy_sense_data(struct ufshcd_lrb *lrbp)
* descriptor * descriptor
* @hba: per adapter instance * @hba: per adapter instance
* @lrbp: pointer to local reference block * @lrbp: pointer to local reference block
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static static
int ufshcd_copy_query_response(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) int ufshcd_copy_query_response(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
...@@ -2259,8 +2234,8 @@ int ufshcd_copy_query_response(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) ...@@ -2259,8 +2234,8 @@ int ufshcd_copy_query_response(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
u16 buf_len; u16 buf_len;
/* data segment length */ /* data segment length */
resp_len = be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_2) & resp_len = be16_to_cpu(lrbp->ucd_rsp_ptr->header
MASK_QUERY_DATA_SEG_LEN; .data_segment_length);
buf_len = be16_to_cpu( buf_len = be16_to_cpu(
hba->dev_cmd.query.request.upiu_req.length); hba->dev_cmd.query.request.upiu_req.length);
if (likely(buf_len >= resp_len)) { if (likely(buf_len >= resp_len)) {
...@@ -2318,7 +2293,8 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba) ...@@ -2318,7 +2293,8 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
* ufshcd_ready_for_uic_cmd - Check if controller is ready * ufshcd_ready_for_uic_cmd - Check if controller is ready
* to accept UIC commands * to accept UIC commands
* @hba: per adapter instance * @hba: per adapter instance
* Return true on success, else false *
* Return: true on success, else false.
*/ */
static inline bool ufshcd_ready_for_uic_cmd(struct ufs_hba *hba) static inline bool ufshcd_ready_for_uic_cmd(struct ufs_hba *hba)
{ {
...@@ -2330,7 +2306,8 @@ static inline bool ufshcd_ready_for_uic_cmd(struct ufs_hba *hba) ...@@ -2330,7 +2306,8 @@ static inline bool ufshcd_ready_for_uic_cmd(struct ufs_hba *hba)
* @hba: Pointer to adapter instance * @hba: Pointer to adapter instance
* *
* This function gets the UPMCRS field of HCS register * This function gets the UPMCRS field of HCS register
* Returns value of UPMCRS field *
* Return: value of UPMCRS field.
*/ */
static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba) static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba)
{ {
...@@ -2368,7 +2345,7 @@ ufshcd_dispatch_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd) ...@@ -2368,7 +2345,7 @@ ufshcd_dispatch_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
* @hba: per adapter instance * @hba: per adapter instance
* @uic_cmd: UIC command * @uic_cmd: UIC command
* *
* Returns 0 only if success. * Return: 0 only if success.
*/ */
static int static int
ufshcd_wait_for_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd) ufshcd_wait_for_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
...@@ -2407,7 +2384,7 @@ ufshcd_wait_for_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd) ...@@ -2407,7 +2384,7 @@ ufshcd_wait_for_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
* @uic_cmd: UIC command * @uic_cmd: UIC command
* @completion: initialize the completion only if this is set to true * @completion: initialize the completion only if this is set to true
* *
* Returns 0 only if success. * Return: 0 only if success.
*/ */
static int static int
__ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd, __ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd,
...@@ -2436,7 +2413,7 @@ __ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd, ...@@ -2436,7 +2413,7 @@ __ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd,
* @hba: per adapter instance * @hba: per adapter instance
* @uic_cmd: UIC command * @uic_cmd: UIC command
* *
* Returns 0 only if success. * Return: 0 only if success.
*/ */
int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd) int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
{ {
...@@ -2513,7 +2490,7 @@ static void ufshcd_sgl_to_prdt(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, int ...@@ -2513,7 +2490,7 @@ static void ufshcd_sgl_to_prdt(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, int
* @hba: per adapter instance * @hba: per adapter instance
* @lrbp: pointer to local reference block * @lrbp: pointer to local reference block
* *
* Returns 0 in case of success, non-zero value in case of failure * Return: 0 in case of success, non-zero value in case of failure.
*/ */
static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
{ {
...@@ -2582,10 +2559,10 @@ static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8 *upiu_flags, ...@@ -2582,10 +2559,10 @@ static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8 *upiu_flags,
enum dma_data_direction cmd_dir, int ehs_length) enum dma_data_direction cmd_dir, int ehs_length)
{ {
struct utp_transfer_req_desc *req_desc = lrbp->utr_descriptor_ptr; struct utp_transfer_req_desc *req_desc = lrbp->utr_descriptor_ptr;
u32 data_direction; struct request_desc_header *h = &req_desc->header;
u32 dword_0; enum utp_data_direction data_direction;
u32 dword_1 = 0;
u32 dword_3 = 0; *h = (typeof(*h)){ };
if (cmd_dir == DMA_FROM_DEVICE) { if (cmd_dir == DMA_FROM_DEVICE) {
data_direction = UTP_DEVICE_TO_HOST; data_direction = UTP_DEVICE_TO_HOST;
...@@ -2598,25 +2575,22 @@ static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8 *upiu_flags, ...@@ -2598,25 +2575,22 @@ static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8 *upiu_flags,
*upiu_flags = UPIU_CMD_FLAGS_NONE; *upiu_flags = UPIU_CMD_FLAGS_NONE;
} }
dword_0 = data_direction | (lrbp->command_type << UPIU_COMMAND_TYPE_OFFSET) | h->command_type = lrbp->command_type;
ehs_length << 8; h->data_direction = data_direction;
h->ehs_length = ehs_length;
if (lrbp->intr_cmd) if (lrbp->intr_cmd)
dword_0 |= UTP_REQ_DESC_INT_CMD; h->interrupt = 1;
/* Prepare crypto related dwords */ /* Prepare crypto related dwords */
ufshcd_prepare_req_desc_hdr_crypto(lrbp, &dword_0, &dword_1, &dword_3); ufshcd_prepare_req_desc_hdr_crypto(lrbp, h);
/* Transfer request descriptor header fields */
req_desc->header.dword_0 = cpu_to_le32(dword_0);
req_desc->header.dword_1 = cpu_to_le32(dword_1);
/* /*
* assigning invalid value for command status. Controller * assigning invalid value for command status. Controller
* updates OCS on command completion, with the command * updates OCS on command completion, with the command
* status * status
*/ */
req_desc->header.dword_2 = h->ocs = OCS_INVALID_COMMAND_STATUS;
cpu_to_le32(OCS_INVALID_COMMAND_STATUS);
req_desc->header.dword_3 = cpu_to_le32(dword_3);
req_desc->prd_table_length = 0; req_desc->prd_table_length = 0;
} }
...@@ -2634,15 +2608,13 @@ void ufshcd_prepare_utp_scsi_cmd_upiu(struct ufshcd_lrb *lrbp, u8 upiu_flags) ...@@ -2634,15 +2608,13 @@ void ufshcd_prepare_utp_scsi_cmd_upiu(struct ufshcd_lrb *lrbp, u8 upiu_flags)
struct utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr; struct utp_upiu_req *ucd_req_ptr = lrbp->ucd_req_ptr;
unsigned short cdb_len; unsigned short cdb_len;
/* command descriptor fields */ ucd_req_ptr->header = (struct utp_upiu_header){
ucd_req_ptr->header.dword_0 = upiu_header_dword( .transaction_code = UPIU_TRANSACTION_COMMAND,
UPIU_TRANSACTION_COMMAND, upiu_flags, .flags = upiu_flags,
lrbp->lun, lrbp->task_tag); .lun = lrbp->lun,
ucd_req_ptr->header.dword_1 = upiu_header_dword( .task_tag = lrbp->task_tag,
UPIU_COMMAND_SET_TYPE_SCSI, 0, 0, 0); .command_set_type = UPIU_COMMAND_SET_TYPE_SCSI,
};
/* Total EHS length and Data segment length will be zero */
ucd_req_ptr->header.dword_2 = 0;
ucd_req_ptr->sc.exp_data_transfer_len = cpu_to_be32(cmd->sdb.length); ucd_req_ptr->sc.exp_data_transfer_len = cpu_to_be32(cmd->sdb.length);
...@@ -2667,18 +2639,19 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba, ...@@ -2667,18 +2639,19 @@ static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba,
u16 len = be16_to_cpu(query->request.upiu_req.length); u16 len = be16_to_cpu(query->request.upiu_req.length);
/* Query request header */ /* Query request header */
ucd_req_ptr->header.dword_0 = upiu_header_dword( ucd_req_ptr->header = (struct utp_upiu_header){
UPIU_TRANSACTION_QUERY_REQ, upiu_flags, .transaction_code = UPIU_TRANSACTION_QUERY_REQ,
lrbp->lun, lrbp->task_tag); .flags = upiu_flags,
ucd_req_ptr->header.dword_1 = upiu_header_dword( .lun = lrbp->lun,
0, query->request.query_func, 0, 0); .task_tag = lrbp->task_tag,
.query_function = query->request.query_func,
/* Data segment length only need for WRITE_DESC */ /* Data segment length only need for WRITE_DESC */
if (query->request.upiu_req.opcode == UPIU_QUERY_OPCODE_WRITE_DESC) .data_segment_length =
ucd_req_ptr->header.dword_2 = query->request.upiu_req.opcode ==
upiu_header_dword(0, 0, len >> 8, (u8)len); UPIU_QUERY_OPCODE_WRITE_DESC ?
else cpu_to_be16(len) :
ucd_req_ptr->header.dword_2 = 0; 0,
};
/* 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,
...@@ -2697,12 +2670,10 @@ static inline void ufshcd_prepare_utp_nop_upiu(struct ufshcd_lrb *lrbp) ...@@ -2697,12 +2670,10 @@ static inline void ufshcd_prepare_utp_nop_upiu(struct ufshcd_lrb *lrbp)
memset(ucd_req_ptr, 0, sizeof(struct utp_upiu_req)); memset(ucd_req_ptr, 0, sizeof(struct utp_upiu_req));
/* command descriptor fields */ ucd_req_ptr->header = (struct utp_upiu_header){
ucd_req_ptr->header.dword_0 = upiu_header_dword( .transaction_code = UPIU_TRANSACTION_NOP_OUT,
UPIU_TRANSACTION_NOP_OUT, 0, 0, lrbp->task_tag); .task_tag = lrbp->task_tag,
/* clear rest of the fields of basic header */ };
ucd_req_ptr->header.dword_1 = 0;
ucd_req_ptr->header.dword_2 = 0;
memset(lrbp->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp)); memset(lrbp->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp));
} }
...@@ -2712,6 +2683,8 @@ static inline void ufshcd_prepare_utp_nop_upiu(struct ufshcd_lrb *lrbp) ...@@ -2712,6 +2683,8 @@ static inline void ufshcd_prepare_utp_nop_upiu(struct ufshcd_lrb *lrbp)
* for Device Management Purposes * for Device Management Purposes
* @hba: per adapter instance * @hba: per adapter instance
* @lrbp: pointer to local reference block * @lrbp: pointer to local reference block
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_compose_devman_upiu(struct ufs_hba *hba, static int ufshcd_compose_devman_upiu(struct ufs_hba *hba,
struct ufshcd_lrb *lrbp) struct ufshcd_lrb *lrbp)
...@@ -2740,6 +2713,8 @@ static int ufshcd_compose_devman_upiu(struct ufs_hba *hba, ...@@ -2740,6 +2713,8 @@ static int ufshcd_compose_devman_upiu(struct ufs_hba *hba,
* for SCSI Purposes * for SCSI Purposes
* @hba: per adapter instance * @hba: per adapter instance
* @lrbp: pointer to local reference block * @lrbp: pointer to local reference block
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) static int ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
{ {
...@@ -2765,7 +2740,7 @@ static int ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) ...@@ -2765,7 +2740,7 @@ static int ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
* ufshcd_upiu_wlun_to_scsi_wlun - maps UPIU W-LUN id to SCSI W-LUN ID * ufshcd_upiu_wlun_to_scsi_wlun - maps UPIU W-LUN id to SCSI W-LUN ID
* @upiu_wlun_id: UPIU W-LUN id * @upiu_wlun_id: UPIU W-LUN id
* *
* Returns SCSI W-LUN id * Return: SCSI W-LUN id.
*/ */
static inline u16 ufshcd_upiu_wlun_to_scsi_wlun(u8 upiu_wlun_id) static inline u16 ufshcd_upiu_wlun_to_scsi_wlun(u8 upiu_wlun_id)
{ {
...@@ -2836,7 +2811,7 @@ static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i) ...@@ -2836,7 +2811,7 @@ static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
* @host: SCSI host pointer * @host: SCSI host pointer
* @cmd: command from SCSI Midlayer * @cmd: command from SCSI Midlayer
* *
* Returns 0 for success, non-zero in case of failure * Return: 0 for success, non-zero in case of failure.
*/ */
static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
{ {
...@@ -2947,7 +2922,7 @@ static int ufshcd_compose_dev_cmd(struct ufs_hba *hba, ...@@ -2947,7 +2922,7 @@ static int ufshcd_compose_dev_cmd(struct ufs_hba *hba,
* Check with the block layer if the command is inflight * Check with the block layer if the command is inflight
* @cmd: command to check. * @cmd: command to check.
* *
* Returns true if command is inflight; false if not. * Return: true if command is inflight; false if not.
*/ */
bool ufshcd_cmd_inflight(struct scsi_cmnd *cmd) bool ufshcd_cmd_inflight(struct scsi_cmnd *cmd)
{ {
...@@ -3002,26 +2977,17 @@ static int ufshcd_clear_cmd(struct ufs_hba *hba, u32 task_tag) ...@@ -3002,26 +2977,17 @@ static int ufshcd_clear_cmd(struct ufs_hba *hba, u32 task_tag)
mask, ~mask, 1000, 1000); mask, ~mask, 1000, 1000);
} }
static int
ufshcd_check_query_response(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
{
struct ufs_query_res *query_res = &hba->dev_cmd.query.response;
/* Get the UPIU response */
query_res->response = ufshcd_get_rsp_upiu_result(lrbp->ucd_rsp_ptr) >>
UPIU_RSP_CODE_OFFSET;
return query_res->response;
}
/** /**
* ufshcd_dev_cmd_completion() - handles device management command responses * ufshcd_dev_cmd_completion() - handles device management command responses
* @hba: per adapter instance * @hba: per adapter instance
* @lrbp: pointer to local reference block * @lrbp: pointer to local reference block
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int static int
ufshcd_dev_cmd_completion(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) ufshcd_dev_cmd_completion(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
{ {
int resp; enum upiu_response_transaction resp;
int err = 0; int err = 0;
hba->ufs_stats.last_hibern8_exit_tstamp = ktime_set(0, 0); hba->ufs_stats.last_hibern8_exit_tstamp = ktime_set(0, 0);
...@@ -3035,11 +3001,13 @@ ufshcd_dev_cmd_completion(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) ...@@ -3035,11 +3001,13 @@ ufshcd_dev_cmd_completion(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
__func__, resp); __func__, resp);
} }
break; break;
case UPIU_TRANSACTION_QUERY_RSP: case UPIU_TRANSACTION_QUERY_RSP: {
err = ufshcd_check_query_response(hba, lrbp); u8 response = lrbp->ucd_rsp_ptr->header.response;
if (!err)
if (response == 0)
err = ufshcd_copy_query_response(hba, lrbp); err = ufshcd_copy_query_response(hba, lrbp);
break; break;
}
case UPIU_TRANSACTION_REJECT_UPIU: case UPIU_TRANSACTION_REJECT_UPIU:
/* TODO: handle Reject UPIU Response */ /* TODO: handle Reject UPIU Response */
err = -EPERM; err = -EPERM;
...@@ -3154,6 +3122,8 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba, ...@@ -3154,6 +3122,8 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
* @cmd_type: specifies the type (NOP, Query...) * @cmd_type: specifies the type (NOP, Query...)
* @timeout: timeout in milliseconds * @timeout: timeout in milliseconds
* *
* Return: 0 upon success; < 0 upon failure.
*
* NOTE: Since there is only one available tag for device management commands, * NOTE: Since there is only one available tag for device management commands,
* it is expected you hold the hba->dev_cmd.lock mutex. * it is expected you hold the hba->dev_cmd.lock mutex.
*/ */
...@@ -3245,7 +3215,7 @@ static int ufshcd_query_flag_retry(struct ufs_hba *hba, ...@@ -3245,7 +3215,7 @@ static int ufshcd_query_flag_retry(struct ufs_hba *hba,
* @index: flag index to access * @index: flag index to access
* @flag_res: the flag value after the query request completes * @flag_res: the flag value after the query request completes
* *
* Returns 0 for success, non-zero in case of failure * Return: 0 for success, non-zero in case of failure.
*/ */
int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
enum flag_idn idn, u8 index, bool *flag_res) enum flag_idn idn, u8 index, bool *flag_res)
...@@ -3314,7 +3284,7 @@ int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, ...@@ -3314,7 +3284,7 @@ int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
* @selector: selector field * @selector: selector field
* @attr_val: the attribute value after the query request completes * @attr_val: the attribute value after the query request completes
* *
* Returns 0 for success, non-zero in case of failure * Return: 0 for success, non-zero in case of failure.
*/ */
int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode, int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
enum attr_idn idn, u8 index, u8 selector, u32 *attr_val) enum attr_idn idn, u8 index, u8 selector, u32 *attr_val)
...@@ -3379,7 +3349,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode, ...@@ -3379,7 +3349,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
* @attr_val: the attribute value after the query request * @attr_val: the attribute value after the query request
* completes * completes
* *
* Returns 0 for success, non-zero in case of failure * Return: 0 for success, non-zero in case of failure.
*/ */
int ufshcd_query_attr_retry(struct ufs_hba *hba, int ufshcd_query_attr_retry(struct ufs_hba *hba,
enum query_opcode opcode, enum attr_idn idn, u8 index, u8 selector, enum query_opcode opcode, enum attr_idn idn, u8 index, u8 selector,
...@@ -3477,9 +3447,10 @@ static int __ufshcd_query_descriptor(struct ufs_hba *hba, ...@@ -3477,9 +3447,10 @@ static int __ufshcd_query_descriptor(struct ufs_hba *hba,
* @desc_buf: the buffer that contains the descriptor * @desc_buf: the buffer that contains the descriptor
* @buf_len: length parameter passed to the device * @buf_len: length parameter passed to the device
* *
* Returns 0 for success, non-zero in case of failure.
* The buf_len parameter will contain, on return, the length parameter * The buf_len parameter will contain, on return, the length parameter
* received on the response. * received on the response.
*
* Return: 0 for success, non-zero in case of failure.
*/ */
int ufshcd_query_descriptor_retry(struct ufs_hba *hba, int ufshcd_query_descriptor_retry(struct ufs_hba *hba,
enum query_opcode opcode, enum query_opcode opcode,
...@@ -3509,7 +3480,7 @@ int ufshcd_query_descriptor_retry(struct ufs_hba *hba, ...@@ -3509,7 +3480,7 @@ int ufshcd_query_descriptor_retry(struct ufs_hba *hba,
* @param_read_buf: pointer to buffer where parameter would be read * @param_read_buf: pointer to buffer where parameter would be read
* @param_size: sizeof(param_read_buf) * @param_size: sizeof(param_read_buf)
* *
* Return 0 in case of success, non-zero otherwise * Return: 0 in case of success, non-zero otherwise.
*/ */
int ufshcd_read_desc_param(struct ufs_hba *hba, int ufshcd_read_desc_param(struct ufs_hba *hba,
enum desc_idn desc_id, enum desc_idn desc_id,
...@@ -3689,7 +3660,7 @@ int ufshcd_read_string_desc(struct ufs_hba *hba, u8 desc_index, ...@@ -3689,7 +3660,7 @@ int ufshcd_read_string_desc(struct ufs_hba *hba, u8 desc_index,
* @param_read_buf: pointer to buffer where parameter would be read * @param_read_buf: pointer to buffer where parameter would be read
* @param_size: sizeof(param_read_buf) * @param_size: sizeof(param_read_buf)
* *
* Return 0 in case of success, non-zero otherwise * Return: 0 in case of success, non-zero otherwise.
*/ */
static inline int ufshcd_read_unit_desc_param(struct ufs_hba *hba, static inline int ufshcd_read_unit_desc_param(struct ufs_hba *hba,
int lun, int lun,
...@@ -3744,7 +3715,7 @@ static int ufshcd_get_ref_clk_gating_wait(struct ufs_hba *hba) ...@@ -3744,7 +3715,7 @@ static int ufshcd_get_ref_clk_gating_wait(struct ufs_hba *hba)
* (UTMRDL) * (UTMRDL)
* 4. Allocate memory for local reference block(lrb). * 4. Allocate memory for local reference block(lrb).
* *
* Returns 0 for success, non-zero in case of failure * Return: 0 for success, non-zero in case of failure.
*/ */
static int ufshcd_memory_alloc(struct ufs_hba *hba) static int ufshcd_memory_alloc(struct ufs_hba *hba)
{ {
...@@ -3891,7 +3862,7 @@ static void ufshcd_host_memory_configure(struct ufs_hba *hba) ...@@ -3891,7 +3862,7 @@ static void ufshcd_host_memory_configure(struct ufs_hba *hba)
* Once the Unipro links are up, the device connected to the controller * Once the Unipro links are up, the device connected to the controller
* is detected. * is detected.
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
static int ufshcd_dme_link_startup(struct ufs_hba *hba) static int ufshcd_dme_link_startup(struct ufs_hba *hba)
{ {
...@@ -3913,7 +3884,7 @@ static int ufshcd_dme_link_startup(struct ufs_hba *hba) ...@@ -3913,7 +3884,7 @@ static int ufshcd_dme_link_startup(struct ufs_hba *hba)
* DME_RESET command is issued in order to reset UniPro stack. * DME_RESET command is issued in order to reset UniPro stack.
* This function now deals with cold reset. * This function now deals with cold reset.
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
static int ufshcd_dme_reset(struct ufs_hba *hba) static int ufshcd_dme_reset(struct ufs_hba *hba)
{ {
...@@ -3952,7 +3923,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dme_configure_adapt); ...@@ -3952,7 +3923,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dme_configure_adapt);
* *
* DME_ENABLE command is issued in order to enable UniPro stack. * DME_ENABLE command is issued in order to enable UniPro stack.
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
static int ufshcd_dme_enable(struct ufs_hba *hba) static int ufshcd_dme_enable(struct ufs_hba *hba)
{ {
...@@ -4008,7 +3979,7 @@ static inline void ufshcd_add_delay_before_dme_cmd(struct ufs_hba *hba) ...@@ -4008,7 +3979,7 @@ static inline void ufshcd_add_delay_before_dme_cmd(struct ufs_hba *hba)
* @mib_val: setting value as uic command argument3 * @mib_val: setting value as uic command argument3
* @peer: indicate whether peer or local * @peer: indicate whether peer or local
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel,
u8 attr_set, u32 mib_val, u8 peer) u8 attr_set, u32 mib_val, u8 peer)
...@@ -4052,7 +4023,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dme_set_attr); ...@@ -4052,7 +4023,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dme_set_attr);
* @mib_val: the value of the attribute as returned by the UIC command * @mib_val: the value of the attribute as returned by the UIC command
* @peer: indicate whether peer or local * @peer: indicate whether peer or local
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel,
u32 *mib_val, u8 peer) u32 *mib_val, u8 peer)
...@@ -4133,7 +4104,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dme_get_attr); ...@@ -4133,7 +4104,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dme_get_attr);
* addition to normal UIC command completion Status (UCCS). This function only * addition to normal UIC command completion Status (UCCS). This function only
* returns after the relevant status bits indicate the completion. * returns after the relevant status bits indicate the completion.
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd) static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
{ {
...@@ -4223,7 +4194,7 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd) ...@@ -4223,7 +4194,7 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
* @hba: per adapter instance * @hba: per adapter instance
* @mode: powr mode value * @mode: powr mode value
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
int ufshcd_uic_change_pwr_mode(struct ufs_hba *hba, u8 mode) int ufshcd_uic_change_pwr_mode(struct ufs_hba *hba, u8 mode)
{ {
...@@ -4385,6 +4356,8 @@ static void ufshcd_init_pwr_info(struct ufs_hba *hba) ...@@ -4385,6 +4356,8 @@ static void ufshcd_init_pwr_info(struct ufs_hba *hba)
/** /**
* ufshcd_get_max_pwr_mode - reads the max power mode negotiated with device * ufshcd_get_max_pwr_mode - reads the max power mode negotiated with device
* @hba: per-adapter instance * @hba: per-adapter instance
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_get_max_pwr_mode(struct ufs_hba *hba) static int ufshcd_get_max_pwr_mode(struct ufs_hba *hba)
{ {
...@@ -4542,6 +4515,8 @@ static int ufshcd_change_power_mode(struct ufs_hba *hba, ...@@ -4542,6 +4515,8 @@ static int ufshcd_change_power_mode(struct ufs_hba *hba,
* ufshcd_config_pwr_mode - configure a new power mode * ufshcd_config_pwr_mode - configure a new power mode
* @hba: per-adapter instance * @hba: per-adapter instance
* @desired_pwr_mode: desired power configuration * @desired_pwr_mode: desired power configuration
*
* Return: 0 upon success; < 0 upon failure.
*/ */
int ufshcd_config_pwr_mode(struct ufs_hba *hba, int ufshcd_config_pwr_mode(struct ufs_hba *hba,
struct ufs_pa_layer_attr *desired_pwr_mode) struct ufs_pa_layer_attr *desired_pwr_mode)
...@@ -4566,6 +4541,8 @@ EXPORT_SYMBOL_GPL(ufshcd_config_pwr_mode); ...@@ -4566,6 +4541,8 @@ EXPORT_SYMBOL_GPL(ufshcd_config_pwr_mode);
* @hba: per-adapter instance * @hba: per-adapter instance
* *
* Set fDeviceInit flag and poll until device toggles it. * Set fDeviceInit flag and poll until device toggles it.
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_complete_dev_init(struct ufs_hba *hba) static int ufshcd_complete_dev_init(struct ufs_hba *hba)
{ {
...@@ -4616,7 +4593,7 @@ static int ufshcd_complete_dev_init(struct ufs_hba *hba) ...@@ -4616,7 +4593,7 @@ static int ufshcd_complete_dev_init(struct ufs_hba *hba)
* 3. Program UTRL and UTMRL base address * 3. Program UTRL and UTMRL base address
* 4. Configure run-stop-registers * 4. Configure run-stop-registers
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
int ufshcd_make_hba_operational(struct ufs_hba *hba) int ufshcd_make_hba_operational(struct ufs_hba *hba)
{ {
...@@ -4697,7 +4674,7 @@ EXPORT_SYMBOL_GPL(ufshcd_hba_stop); ...@@ -4697,7 +4674,7 @@ EXPORT_SYMBOL_GPL(ufshcd_hba_stop);
* sequence kicks off. When controller is ready it will set * sequence kicks off. When controller is ready it will set
* the Host Controller Enable bit to 1. * the Host Controller Enable bit to 1.
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
static int ufshcd_hba_execute_hce(struct ufs_hba *hba) static int ufshcd_hba_execute_hce(struct ufs_hba *hba)
{ {
...@@ -4842,7 +4819,7 @@ EXPORT_SYMBOL_GPL(ufshcd_update_evt_hist); ...@@ -4842,7 +4819,7 @@ EXPORT_SYMBOL_GPL(ufshcd_update_evt_hist);
* ufshcd_link_startup - Initialize unipro link startup * ufshcd_link_startup - Initialize unipro link startup
* @hba: per adapter instance * @hba: per adapter instance
* *
* Returns 0 for success, non-zero in case of failure * Return: 0 for success, non-zero in case of failure.
*/ */
static int ufshcd_link_startup(struct ufs_hba *hba) static int ufshcd_link_startup(struct ufs_hba *hba)
{ {
...@@ -4937,6 +4914,8 @@ static int ufshcd_link_startup(struct ufs_hba *hba) ...@@ -4937,6 +4914,8 @@ static int ufshcd_link_startup(struct ufs_hba *hba)
* If the UTP layer at the device side is not initialized, it may * If the UTP layer at the device side is not initialized, it may
* not respond with NOP IN UPIU within timeout of %NOP_OUT_TIMEOUT * not respond with NOP IN UPIU within timeout of %NOP_OUT_TIMEOUT
* and we retry sending NOP OUT for %NOP_OUT_RETRIES iterations. * and we retry sending NOP OUT for %NOP_OUT_RETRIES iterations.
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_verify_dev_init(struct ufs_hba *hba) static int ufshcd_verify_dev_init(struct ufs_hba *hba)
{ {
...@@ -5061,7 +5040,7 @@ static void ufshcd_lu_init(struct ufs_hba *hba, struct scsi_device *sdev) ...@@ -5061,7 +5040,7 @@ static void ufshcd_lu_init(struct ufs_hba *hba, struct scsi_device *sdev)
* ufshcd_slave_alloc - handle initial SCSI device configurations * ufshcd_slave_alloc - handle initial SCSI device configurations
* @sdev: pointer to SCSI device * @sdev: pointer to SCSI device
* *
* Returns success * Return: success.
*/ */
static int ufshcd_slave_alloc(struct scsi_device *sdev) static int ufshcd_slave_alloc(struct scsi_device *sdev)
{ {
...@@ -5097,6 +5076,8 @@ static int ufshcd_slave_alloc(struct scsi_device *sdev) ...@@ -5097,6 +5076,8 @@ static int ufshcd_slave_alloc(struct scsi_device *sdev)
* @depth: required depth to set * @depth: required depth to set
* *
* Change queue depth and make sure the max. limits are not crossed. * Change queue depth and make sure the max. limits are not crossed.
*
* Return: new queue depth.
*/ */
static int ufshcd_change_queue_depth(struct scsi_device *sdev, int depth) static int ufshcd_change_queue_depth(struct scsi_device *sdev, int depth)
{ {
...@@ -5106,6 +5087,8 @@ static int ufshcd_change_queue_depth(struct scsi_device *sdev, int depth) ...@@ -5106,6 +5087,8 @@ static int ufshcd_change_queue_depth(struct scsi_device *sdev, int depth)
/** /**
* ufshcd_slave_configure - adjust SCSI device configurations * ufshcd_slave_configure - adjust SCSI device configurations
* @sdev: pointer to SCSI device * @sdev: pointer to SCSI device
*
* Return: 0 (success).
*/ */
static int ufshcd_slave_configure(struct scsi_device *sdev) static int ufshcd_slave_configure(struct scsi_device *sdev)
{ {
...@@ -5179,7 +5162,7 @@ static void ufshcd_slave_destroy(struct scsi_device *sdev) ...@@ -5179,7 +5162,7 @@ static void ufshcd_slave_destroy(struct scsi_device *sdev)
* @lrbp: pointer to local reference block of completed command * @lrbp: pointer to local reference block of completed command
* @scsi_status: SCSI command status * @scsi_status: SCSI command status
* *
* Returns value base on SCSI command status * Return: value base on SCSI command status.
*/ */
static inline int static inline int
ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int scsi_status) ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int scsi_status)
...@@ -5213,7 +5196,7 @@ ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int scsi_status) ...@@ -5213,7 +5196,7 @@ ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int scsi_status)
* @lrbp: pointer to local reference block of completed command * @lrbp: pointer to local reference block of completed command
* @cqe: pointer to the completion queue entry * @cqe: pointer to the completion queue entry
* *
* Returns result of the command to notify SCSI midlayer * Return: result of the command to notify SCSI midlayer.
*/ */
static inline int static inline int
ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
...@@ -5225,7 +5208,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, ...@@ -5225,7 +5208,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
u8 upiu_flags; u8 upiu_flags;
u32 resid; u32 resid;
upiu_flags = be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_0) >> 16; upiu_flags = lrbp->ucd_rsp_ptr->header.flags;
resid = be32_to_cpu(lrbp->ucd_rsp_ptr->sr.residual_transfer_count); resid = be32_to_cpu(lrbp->ucd_rsp_ptr->sr.residual_transfer_count);
/* /*
* Test !overflow instead of underflow to support UFS devices that do * Test !overflow instead of underflow to support UFS devices that do
...@@ -5238,28 +5221,21 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, ...@@ -5238,28 +5221,21 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
ocs = ufshcd_get_tr_ocs(lrbp, cqe); ocs = ufshcd_get_tr_ocs(lrbp, cqe);
if (hba->quirks & UFSHCD_QUIRK_BROKEN_OCS_FATAL_ERROR) { if (hba->quirks & UFSHCD_QUIRK_BROKEN_OCS_FATAL_ERROR) {
if (be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_1) & if (lrbp->ucd_rsp_ptr->header.response ||
MASK_RSP_UPIU_RESULT) lrbp->ucd_rsp_ptr->header.status)
ocs = OCS_SUCCESS; ocs = OCS_SUCCESS;
} }
switch (ocs) { switch (ocs) {
case OCS_SUCCESS: case OCS_SUCCESS:
result = ufshcd_get_req_rsp(lrbp->ucd_rsp_ptr);
hba->ufs_stats.last_hibern8_exit_tstamp = ktime_set(0, 0); hba->ufs_stats.last_hibern8_exit_tstamp = ktime_set(0, 0);
switch (result) { switch (ufshcd_get_req_rsp(lrbp->ucd_rsp_ptr)) {
case UPIU_TRANSACTION_RESPONSE: case UPIU_TRANSACTION_RESPONSE:
/*
* get the response UPIU result to extract
* the SCSI command status
*/
result = ufshcd_get_rsp_upiu_result(lrbp->ucd_rsp_ptr);
/* /*
* get the result based on SCSI status response * get the result based on SCSI status response
* to notify the SCSI midlayer of the command status * to notify the SCSI midlayer of the command status
*/ */
scsi_status = result & MASK_SCSI_STATUS; scsi_status = lrbp->ucd_rsp_ptr->header.status;
result = ufshcd_scsi_cmd_status(lrbp, scsi_status); result = ufshcd_scsi_cmd_status(lrbp, scsi_status);
/* /*
...@@ -5348,7 +5324,7 @@ static bool ufshcd_is_auto_hibern8_error(struct ufs_hba *hba, ...@@ -5348,7 +5324,7 @@ static bool ufshcd_is_auto_hibern8_error(struct ufs_hba *hba,
* @hba: per adapter instance * @hba: per adapter instance
* @intr_status: interrupt status generated by the controller * @intr_status: interrupt status generated by the controller
* *
* Returns * Return:
* IRQ_HANDLED - If interrupt is valid * IRQ_HANDLED - If interrupt is valid
* IRQ_NONE - If invalid interrupt * IRQ_NONE - If invalid interrupt
*/ */
...@@ -5424,8 +5400,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, ...@@ -5424,8 +5400,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
if (hba->dev_cmd.complete) { if (hba->dev_cmd.complete) {
if (cqe) { if (cqe) {
ocs = le32_to_cpu(cqe->status) & MASK_OCS; ocs = le32_to_cpu(cqe->status) & MASK_OCS;
lrbp->utr_descriptor_ptr->header.dword_2 = lrbp->utr_descriptor_ptr->header.ocs = ocs;
cpu_to_le32(ocs);
} }
complete(hba->dev_cmd.complete); complete(hba->dev_cmd.complete);
ufshcd_clk_scaling_update_busy(hba); ufshcd_clk_scaling_update_busy(hba);
...@@ -5468,7 +5443,7 @@ static void ufshcd_clear_polled(struct ufs_hba *hba, ...@@ -5468,7 +5443,7 @@ static void ufshcd_clear_polled(struct ufs_hba *hba,
} }
/* /*
* Returns > 0 if one or more commands have been completed or 0 if no * Return: > 0 if one or more commands have been completed or 0 if no
* requests have been completed. * requests have been completed.
*/ */
static int ufshcd_poll(struct Scsi_Host *shost, unsigned int queue_num) static int ufshcd_poll(struct Scsi_Host *shost, unsigned int queue_num)
...@@ -5558,7 +5533,7 @@ static void ufshcd_mcq_compl_pending_transfer(struct ufs_hba *hba, ...@@ -5558,7 +5533,7 @@ static void ufshcd_mcq_compl_pending_transfer(struct ufs_hba *hba,
* ufshcd_transfer_req_compl - handle SCSI and query command completion * ufshcd_transfer_req_compl - handle SCSI and query command completion
* @hba: per adapter instance * @hba: per adapter instance
* *
* Returns * Return:
* IRQ_HANDLED - If interrupt is valid * IRQ_HANDLED - If interrupt is valid
* IRQ_NONE - If invalid interrupt * IRQ_NONE - If invalid interrupt
*/ */
...@@ -5635,7 +5610,7 @@ int ufshcd_update_ee_control(struct ufs_hba *hba, u16 *mask, ...@@ -5635,7 +5610,7 @@ int ufshcd_update_ee_control(struct ufs_hba *hba, u16 *mask,
* Disables exception event in the device so that the EVENT_ALERT * Disables exception event in the device so that the EVENT_ALERT
* bit is not set. * bit is not set.
* *
* Returns zero on success, non-zero error value on failure. * Return: zero on success, non-zero error value on failure.
*/ */
static inline int ufshcd_disable_ee(struct ufs_hba *hba, u16 mask) static inline int ufshcd_disable_ee(struct ufs_hba *hba, u16 mask)
{ {
...@@ -5650,7 +5625,7 @@ static inline int ufshcd_disable_ee(struct ufs_hba *hba, u16 mask) ...@@ -5650,7 +5625,7 @@ static inline int ufshcd_disable_ee(struct ufs_hba *hba, u16 mask)
* Enable corresponding exception event in the device to allow * Enable corresponding exception event in the device to allow
* device to alert host in critical scenarios. * device to alert host in critical scenarios.
* *
* Returns zero on success, non-zero error value on failure. * Return: zero on success, non-zero error value on failure.
*/ */
static inline int ufshcd_enable_ee(struct ufs_hba *hba, u16 mask) static inline int ufshcd_enable_ee(struct ufs_hba *hba, u16 mask)
{ {
...@@ -5666,7 +5641,7 @@ static inline int ufshcd_enable_ee(struct ufs_hba *hba, u16 mask) ...@@ -5666,7 +5641,7 @@ static inline int ufshcd_enable_ee(struct ufs_hba *hba, u16 mask)
* as the device is allowed to manage its own way of handling background * as the device is allowed to manage its own way of handling background
* operations. * operations.
* *
* Returns zero on success, non-zero on failure. * Return: zero on success, non-zero on failure.
*/ */
static int ufshcd_enable_auto_bkops(struct ufs_hba *hba) static int ufshcd_enable_auto_bkops(struct ufs_hba *hba)
{ {
...@@ -5705,7 +5680,7 @@ static int ufshcd_enable_auto_bkops(struct ufs_hba *hba) ...@@ -5705,7 +5680,7 @@ static int ufshcd_enable_auto_bkops(struct ufs_hba *hba)
* host is idle so that BKOPS are managed effectively without any negative * host is idle so that BKOPS are managed effectively without any negative
* impacts. * impacts.
* *
* Returns zero on success, non-zero on failure. * Return: zero on success, non-zero on failure.
*/ */
static int ufshcd_disable_auto_bkops(struct ufs_hba *hba) static int ufshcd_disable_auto_bkops(struct ufs_hba *hba)
{ {
...@@ -5781,7 +5756,7 @@ static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status) ...@@ -5781,7 +5756,7 @@ static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status)
* bkops_status is greater than or equal to "status" argument passed to * bkops_status is greater than or equal to "status" argument passed to
* this function, disable otherwise. * this function, disable otherwise.
* *
* Returns 0 for success, non-zero in case of failure. * Return: 0 for success, non-zero in case of failure.
* *
* NOTE: Caller of this function can check the "hba->auto_bkops_enabled" flag * NOTE: Caller of this function can check the "hba->auto_bkops_enabled" flag
* to know whether auto bkops is enabled or disabled after this function * to know whether auto bkops is enabled or disabled after this function
...@@ -5822,6 +5797,8 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba, ...@@ -5822,6 +5797,8 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba,
* *
* If BKOPs is enabled, this function returns 0, 1 if the bkops in not enabled * If BKOPs is enabled, this function returns 0, 1 if the bkops in not enabled
* and negative error value for any other failure. * and negative error value for any other failure.
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_urgent_bkops(struct ufs_hba *hba) static int ufshcd_urgent_bkops(struct ufs_hba *hba)
{ {
...@@ -6133,7 +6110,7 @@ static void ufshcd_complete_requests(struct ufs_hba *hba, bool force_compl) ...@@ -6133,7 +6110,7 @@ static void ufshcd_complete_requests(struct ufs_hba *hba, bool force_compl)
* to recover from the DL NAC errors or not. * to recover from the DL NAC errors or not.
* @hba: per-adapter instance * @hba: per-adapter instance
* *
* Returns true if error handling is required, false otherwise * Return: true if error handling is required, false otherwise.
*/ */
static bool ufshcd_quirk_dl_nac_errors(struct ufs_hba *hba) static bool ufshcd_quirk_dl_nac_errors(struct ufs_hba *hba)
{ {
...@@ -6360,54 +6337,48 @@ static bool ufshcd_is_pwr_mode_restore_needed(struct ufs_hba *hba) ...@@ -6360,54 +6337,48 @@ static bool ufshcd_is_pwr_mode_restore_needed(struct ufs_hba *hba)
return false; return false;
} }
static bool ufshcd_abort_one(struct request *rq, void *priv)
{
int *ret = priv;
u32 tag = rq->tag;
struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
struct scsi_device *sdev = cmd->device;
struct Scsi_Host *shost = sdev->host;
struct ufs_hba *hba = shost_priv(shost);
*ret = ufshcd_try_to_abort_task(hba, tag);
dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
*ret ? "failed" : "succeeded");
return *ret == 0;
}
/**
* ufshcd_abort_all - Abort all pending commands.
* @hba: Host bus adapter pointer.
*
* Return: true if and only if the host controller needs to be reset.
*/
static bool ufshcd_abort_all(struct ufs_hba *hba) static bool ufshcd_abort_all(struct ufs_hba *hba)
{ {
bool needs_reset = false; int tag, ret = 0;
int tag, ret;
if (is_mcq_enabled(hba)) { blk_mq_tagset_busy_iter(&hba->host->tag_set, ufshcd_abort_one, &ret);
struct ufshcd_lrb *lrbp; if (ret)
int tag; goto out;
for (tag = 0; tag < hba->nutrs; tag++) {
lrbp = &hba->lrb[tag];
if (!ufshcd_cmd_inflight(lrbp->cmd))
continue;
ret = ufshcd_try_to_abort_task(hba, tag);
dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
ret ? "failed" : "succeeded");
if (ret) {
needs_reset = true;
goto out;
}
}
} else {
/* Clear pending transfer requests */
for_each_set_bit(tag, &hba->outstanding_reqs, hba->nutrs) {
ret = ufshcd_try_to_abort_task(hba, tag);
dev_err(hba->dev, "Aborting tag %d / CDB %#02x %s\n", tag,
hba->lrb[tag].cmd ? hba->lrb[tag].cmd->cmnd[0] : -1,
ret ? "failed" : "succeeded");
if (ret) {
needs_reset = true;
goto out;
}
}
}
/* Clear pending task management requests */ /* Clear pending task management requests */
for_each_set_bit(tag, &hba->outstanding_tasks, hba->nutmrs) { for_each_set_bit(tag, &hba->outstanding_tasks, hba->nutmrs) {
if (ufshcd_clear_tm_cmd(hba, tag)) { ret = ufshcd_clear_tm_cmd(hba, tag);
needs_reset = true; if (ret)
goto out; goto out;
}
} }
out: out:
/* Complete the requests that are cleared by s/w */ /* Complete the requests that are cleared by s/w */
ufshcd_complete_requests(hba, false); ufshcd_complete_requests(hba, false);
return needs_reset; return ret != 0;
} }
/** /**
...@@ -6594,7 +6565,7 @@ static void ufshcd_err_handler(struct work_struct *work) ...@@ -6594,7 +6565,7 @@ static void ufshcd_err_handler(struct work_struct *work)
* ufshcd_update_uic_error - check and set fatal UIC error flags. * ufshcd_update_uic_error - check and set fatal UIC error flags.
* @hba: per-adapter instance * @hba: per-adapter instance
* *
* Returns * Return:
* IRQ_HANDLED - If interrupt is valid * IRQ_HANDLED - If interrupt is valid
* IRQ_NONE - If invalid interrupt * IRQ_NONE - If invalid interrupt
*/ */
...@@ -6687,7 +6658,7 @@ static irqreturn_t ufshcd_update_uic_error(struct ufs_hba *hba) ...@@ -6687,7 +6658,7 @@ static irqreturn_t ufshcd_update_uic_error(struct ufs_hba *hba)
* @hba: per-adapter instance * @hba: per-adapter instance
* @intr_status: interrupt status generated by the controller * @intr_status: interrupt status generated by the controller
* *
* Returns * Return:
* IRQ_HANDLED - If interrupt is valid * IRQ_HANDLED - If interrupt is valid
* IRQ_NONE - If invalid interrupt * IRQ_NONE - If invalid interrupt
*/ */
...@@ -6763,7 +6734,7 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba, u32 intr_status) ...@@ -6763,7 +6734,7 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba, u32 intr_status)
* ufshcd_tmc_handler - handle task management function completion * ufshcd_tmc_handler - handle task management function completion
* @hba: per adapter instance * @hba: per adapter instance
* *
* Returns * Return:
* IRQ_HANDLED - If interrupt is valid * IRQ_HANDLED - If interrupt is valid
* IRQ_NONE - If invalid interrupt * IRQ_NONE - If invalid interrupt
*/ */
...@@ -6792,7 +6763,7 @@ static irqreturn_t ufshcd_tmc_handler(struct ufs_hba *hba) ...@@ -6792,7 +6763,7 @@ static irqreturn_t ufshcd_tmc_handler(struct ufs_hba *hba)
* ufshcd_handle_mcq_cq_events - handle MCQ completion queue events * ufshcd_handle_mcq_cq_events - handle MCQ completion queue events
* @hba: per adapter instance * @hba: per adapter instance
* *
* Returns IRQ_HANDLED if interrupt is handled * Return: IRQ_HANDLED if interrupt is handled.
*/ */
static irqreturn_t ufshcd_handle_mcq_cq_events(struct ufs_hba *hba) static irqreturn_t ufshcd_handle_mcq_cq_events(struct ufs_hba *hba)
{ {
...@@ -6827,7 +6798,7 @@ static irqreturn_t ufshcd_handle_mcq_cq_events(struct ufs_hba *hba) ...@@ -6827,7 +6798,7 @@ static irqreturn_t ufshcd_handle_mcq_cq_events(struct ufs_hba *hba)
* @hba: per adapter instance * @hba: per adapter instance
* @intr_status: contains interrupts generated by the controller * @intr_status: contains interrupts generated by the controller
* *
* Returns * Return:
* IRQ_HANDLED - If interrupt is valid * IRQ_HANDLED - If interrupt is valid
* IRQ_NONE - If invalid interrupt * IRQ_NONE - If invalid interrupt
*/ */
...@@ -6858,7 +6829,7 @@ static irqreturn_t ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status) ...@@ -6858,7 +6829,7 @@ static irqreturn_t ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status)
* @irq: irq number * @irq: irq number
* @__hba: pointer to adapter instance * @__hba: pointer to adapter instance
* *
* Returns * Return:
* IRQ_HANDLED - If interrupt is valid * IRQ_HANDLED - If interrupt is valid
* IRQ_NONE - If invalid interrupt * IRQ_NONE - If invalid interrupt
*/ */
...@@ -6954,7 +6925,7 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba, ...@@ -6954,7 +6925,7 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
WARN_ONCE(task_tag < 0 || task_tag >= hba->nutmrs, "Invalid tag %d\n", WARN_ONCE(task_tag < 0 || task_tag >= hba->nutmrs, "Invalid tag %d\n",
task_tag); task_tag);
hba->tmf_rqs[req->tag] = req; hba->tmf_rqs[req->tag] = req;
treq->upiu_req.req_header.dword_0 |= cpu_to_be32(task_tag); treq->upiu_req.req_header.task_tag = task_tag;
memcpy(hba->utmrdl_base_addr + task_tag, treq, sizeof(*treq)); memcpy(hba->utmrdl_base_addr + task_tag, treq, sizeof(*treq));
ufshcd_vops_setup_task_mgmt(hba, task_tag, tm_function); ufshcd_vops_setup_task_mgmt(hba, task_tag, tm_function);
...@@ -7007,23 +6978,23 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba, ...@@ -7007,23 +6978,23 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
* @tm_function: task management function opcode * @tm_function: task management function opcode
* @tm_response: task management service response return value * @tm_response: task management service response return value
* *
* Returns non-zero value on error, zero on success. * Return: non-zero value on error, zero on success.
*/ */
static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id, static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id,
u8 tm_function, u8 *tm_response) u8 tm_function, u8 *tm_response)
{ {
struct utp_task_req_desc treq = { { 0 }, }; struct utp_task_req_desc treq = { };
enum utp_ocs ocs_value; enum utp_ocs ocs_value;
int err; int err;
/* Configure task request descriptor */ /* Configure task request descriptor */
treq.header.dword_0 = cpu_to_le32(UTP_REQ_DESC_INT_CMD); treq.header.interrupt = 1;
treq.header.dword_2 = cpu_to_le32(OCS_INVALID_COMMAND_STATUS); treq.header.ocs = OCS_INVALID_COMMAND_STATUS;
/* Configure task request UPIU */ /* Configure task request UPIU */
treq.upiu_req.req_header.dword_0 = cpu_to_be32(lun_id << 8) | treq.upiu_req.req_header.transaction_code = UPIU_TRANSACTION_TASK_REQ;
cpu_to_be32(UPIU_TRANSACTION_TASK_REQ << 24); treq.upiu_req.req_header.lun = lun_id;
treq.upiu_req.req_header.dword_1 = cpu_to_be32(tm_function << 16); treq.upiu_req.req_header.tm_function = tm_function;
/* /*
* The host shall provide the same value for LUN field in the basic * The host shall provide the same value for LUN field in the basic
...@@ -7036,7 +7007,7 @@ static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id, ...@@ -7036,7 +7007,7 @@ static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id,
if (err == -ETIMEDOUT) if (err == -ETIMEDOUT)
return err; return err;
ocs_value = le32_to_cpu(treq.header.dword_2) & MASK_OCS; ocs_value = treq.header.ocs & MASK_OCS;
if (ocs_value != OCS_SUCCESS) if (ocs_value != OCS_SUCCESS)
dev_err(hba->dev, "%s: failed, ocs = 0x%x\n", dev_err(hba->dev, "%s: failed, ocs = 0x%x\n",
__func__, ocs_value); __func__, ocs_value);
...@@ -7062,6 +7033,8 @@ static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id, ...@@ -7062,6 +7033,8 @@ static int ufshcd_issue_tm_cmd(struct ufs_hba *hba, int lun_id, int task_id,
* *
* Since there is only one available tag for device management commands, * Since there is only one available tag for device management commands,
* the caller is expected to hold the hba->dev_cmd.lock mutex. * the caller is expected to hold the hba->dev_cmd.lock mutex.
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba, static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
struct utp_upiu_req *req_upiu, struct utp_upiu_req *req_upiu,
...@@ -7095,7 +7068,7 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba, ...@@ -7095,7 +7068,7 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE; lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
/* update the task tag in the request upiu */ /* update the task tag in the request upiu */
req_upiu->header.dword_0 |= cpu_to_be32(tag); req_upiu->header.task_tag = tag;
ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE, 0); ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE, 0);
...@@ -7128,8 +7101,8 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba, ...@@ -7128,8 +7101,8 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
memcpy(rsp_upiu, lrbp->ucd_rsp_ptr, sizeof(*rsp_upiu)); memcpy(rsp_upiu, lrbp->ucd_rsp_ptr, sizeof(*rsp_upiu));
if (desc_buff && desc_op == UPIU_QUERY_OPCODE_READ_DESC) { if (desc_buff && desc_op == UPIU_QUERY_OPCODE_READ_DESC) {
u8 *descp = (u8 *)lrbp->ucd_rsp_ptr + sizeof(*rsp_upiu); u8 *descp = (u8 *)lrbp->ucd_rsp_ptr + sizeof(*rsp_upiu);
u16 resp_len = be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_2) & u16 resp_len = be16_to_cpu(lrbp->ucd_rsp_ptr->header
MASK_QUERY_DATA_SEG_LEN; .data_segment_length);
if (*buff_len >= resp_len) { if (*buff_len >= resp_len) {
memcpy(desc_buff, descp, resp_len); memcpy(desc_buff, descp, resp_len);
...@@ -7163,19 +7136,21 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba, ...@@ -7163,19 +7136,21 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
* Management requests. * Management requests.
* It is up to the caller to fill the upiu conent properly, as it will * It is up to the caller to fill the upiu conent properly, as it will
* be copied without any further input validations. * be copied without any further input validations.
*
* Return: 0 upon success; < 0 upon failure.
*/ */
int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba, int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
struct utp_upiu_req *req_upiu, struct utp_upiu_req *req_upiu,
struct utp_upiu_req *rsp_upiu, struct utp_upiu_req *rsp_upiu,
int msgcode, enum upiu_request_transaction msgcode,
u8 *desc_buff, int *buff_len, u8 *desc_buff, int *buff_len,
enum query_opcode desc_op) enum query_opcode desc_op)
{ {
int err; int err;
enum dev_cmd_type cmd_type = DEV_CMD_TYPE_QUERY; enum dev_cmd_type cmd_type = DEV_CMD_TYPE_QUERY;
struct utp_task_req_desc treq = { { 0 }, }; struct utp_task_req_desc treq = { };
enum utp_ocs ocs_value; enum utp_ocs ocs_value;
u8 tm_f = be32_to_cpu(req_upiu->header.dword_1) >> 16 & MASK_TM_FUNC; u8 tm_f = req_upiu->header.tm_function;
switch (msgcode) { switch (msgcode) {
case UPIU_TRANSACTION_NOP_OUT: case UPIU_TRANSACTION_NOP_OUT:
...@@ -7192,8 +7167,8 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba, ...@@ -7192,8 +7167,8 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
break; break;
case UPIU_TRANSACTION_TASK_REQ: case UPIU_TRANSACTION_TASK_REQ:
treq.header.dword_0 = cpu_to_le32(UTP_REQ_DESC_INT_CMD); treq.header.interrupt = 1;
treq.header.dword_2 = cpu_to_le32(OCS_INVALID_COMMAND_STATUS); treq.header.ocs = OCS_INVALID_COMMAND_STATUS;
memcpy(&treq.upiu_req, req_upiu, sizeof(*req_upiu)); memcpy(&treq.upiu_req, req_upiu, sizeof(*req_upiu));
...@@ -7201,7 +7176,7 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba, ...@@ -7201,7 +7176,7 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
if (err == -ETIMEDOUT) if (err == -ETIMEDOUT)
break; break;
ocs_value = le32_to_cpu(treq.header.dword_2) & MASK_OCS; ocs_value = treq.header.ocs & MASK_OCS;
if (ocs_value != OCS_SUCCESS) { if (ocs_value != OCS_SUCCESS) {
dev_err(hba->dev, "%s: failed, ocs = 0x%x\n", __func__, dev_err(hba->dev, "%s: failed, ocs = 0x%x\n", __func__,
ocs_value); ocs_value);
...@@ -7231,7 +7206,7 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba, ...@@ -7231,7 +7206,7 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
* @sg_list: Pointer to SG list when DATA IN/OUT UPIU is required in ARPMB operation * @sg_list: Pointer to SG list when DATA IN/OUT UPIU is required in ARPMB operation
* @dir: DMA direction * @dir: DMA direction
* *
* Returns zero on success, non-zero on failure * Return: zero on success, non-zero on failure.
*/ */
int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *req_upiu, int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *req_upiu,
struct utp_upiu_req *rsp_upiu, struct ufs_ehs *req_ehs, struct utp_upiu_req *rsp_upiu, struct ufs_ehs *req_ehs,
...@@ -7267,7 +7242,9 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r ...@@ -7267,7 +7242,9 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, dir, 2); ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, dir, 2);
/* update the task tag and LUN in the request upiu */ /* update the task tag and LUN in the request upiu */
req_upiu->header.dword_0 |= cpu_to_be32(upiu_flags << 16 | UFS_UPIU_RPMB_WLUN << 8 | tag); req_upiu->header.flags = upiu_flags;
req_upiu->header.lun = UFS_UPIU_RPMB_WLUN;
req_upiu->header.task_tag = tag;
/* copy the UPIU(contains CDB) request as it is */ /* copy the UPIU(contains CDB) request as it is */
memcpy(lrbp->ucd_req_ptr, req_upiu, sizeof(*lrbp->ucd_req_ptr)); memcpy(lrbp->ucd_req_ptr, req_upiu, sizeof(*lrbp->ucd_req_ptr));
...@@ -7289,9 +7266,10 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r ...@@ -7289,9 +7266,10 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
/* Just copy the upiu response as it is */ /* Just copy the upiu response as it is */
memcpy(rsp_upiu, lrbp->ucd_rsp_ptr, sizeof(*rsp_upiu)); memcpy(rsp_upiu, lrbp->ucd_rsp_ptr, sizeof(*rsp_upiu));
/* Get the response UPIU result */ /* Get the response UPIU result */
result = ufshcd_get_rsp_upiu_result(lrbp->ucd_rsp_ptr); result = (lrbp->ucd_rsp_ptr->header.response << 8) |
lrbp->ucd_rsp_ptr->header.status;
ehs_len = be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_2) >> 24; ehs_len = lrbp->ucd_rsp_ptr->header.ehs_length;
/* /*
* Since the bLength in EHS indicates the total size of the EHS Header and EHS Data * Since the bLength in EHS indicates the total size of the EHS Header and EHS Data
* in 32 Byte units, the value of the bLength Request/Response for Advanced RPMB * in 32 Byte units, the value of the bLength Request/Response for Advanced RPMB
...@@ -7317,7 +7295,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r ...@@ -7317,7 +7295,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
* ufshcd_eh_device_reset_handler() - Reset a single logical unit. * ufshcd_eh_device_reset_handler() - Reset a single logical unit.
* @cmd: SCSI command pointer * @cmd: SCSI command pointer
* *
* Returns SUCCESS/FAILED * Return: SUCCESS or FAILED.
*/ */
static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd) static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
{ {
...@@ -7412,7 +7390,7 @@ static void ufshcd_set_req_abort_skip(struct ufs_hba *hba, unsigned long bitmap) ...@@ -7412,7 +7390,7 @@ static void ufshcd_set_req_abort_skip(struct ufs_hba *hba, unsigned long bitmap)
* issued. To avoid that, first issue UFS_QUERY_TASK to check if the command is * issued. To avoid that, first issue UFS_QUERY_TASK to check if the command is
* really issued and then try to abort it. * really issued and then try to abort it.
* *
* Returns zero on success, non-zero on failure * Return: zero on success, non-zero on failure.
*/ */
int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag) int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
{ {
...@@ -7500,7 +7478,7 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag) ...@@ -7500,7 +7478,7 @@ int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag)
* ufshcd_abort - scsi host template eh_abort_handler callback * ufshcd_abort - scsi host template eh_abort_handler callback
* @cmd: SCSI command pointer * @cmd: SCSI command pointer
* *
* Returns SUCCESS/FAILED * Return: SUCCESS or FAILED.
*/ */
static int ufshcd_abort(struct scsi_cmnd *cmd) static int ufshcd_abort(struct scsi_cmnd *cmd)
{ {
...@@ -7625,7 +7603,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) ...@@ -7625,7 +7603,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
* local and remote (device) Uni-Pro stack and the attributes * local and remote (device) Uni-Pro stack and the attributes
* are reset to default state. * are reset to default state.
* *
* Returns zero on success, non-zero on failure * Return: zero on success, non-zero on failure.
*/ */
static int ufshcd_host_reset_and_restore(struct ufs_hba *hba) static int ufshcd_host_reset_and_restore(struct ufs_hba *hba)
{ {
...@@ -7662,7 +7640,7 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba) ...@@ -7662,7 +7640,7 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba)
* Reset and recover device, host and re-establish link. This * Reset and recover device, host and re-establish link. This
* is helpful to recover the communication in fatal error conditions. * is helpful to recover the communication in fatal error conditions.
* *
* Returns zero on success, non-zero on failure * Return: zero on success, non-zero on failure.
*/ */
static int ufshcd_reset_and_restore(struct ufs_hba *hba) static int ufshcd_reset_and_restore(struct ufs_hba *hba)
{ {
...@@ -7720,7 +7698,7 @@ static int ufshcd_reset_and_restore(struct ufs_hba *hba) ...@@ -7720,7 +7698,7 @@ static int ufshcd_reset_and_restore(struct ufs_hba *hba)
* ufshcd_eh_host_reset_handler - host reset handler registered to scsi layer * ufshcd_eh_host_reset_handler - host reset handler registered to scsi layer
* @cmd: SCSI command pointer * @cmd: SCSI command pointer
* *
* Returns SUCCESS/FAILED * Return: SUCCESS or FAILED.
*/ */
static int ufshcd_eh_host_reset_handler(struct scsi_cmnd *cmd) static int ufshcd_eh_host_reset_handler(struct scsi_cmnd *cmd)
{ {
...@@ -7752,7 +7730,7 @@ static int ufshcd_eh_host_reset_handler(struct scsi_cmnd *cmd) ...@@ -7752,7 +7730,7 @@ static int ufshcd_eh_host_reset_handler(struct scsi_cmnd *cmd)
* @start_scan: row at the desc table to start scan from * @start_scan: row at the desc table to start scan from
* @buff: power descriptor buffer * @buff: power descriptor buffer
* *
* Returns calculated max ICC level for specific regulator * Return: calculated max ICC level for specific regulator.
*/ */
static u32 ufshcd_get_max_icc_level(int sup_curr_uA, u32 start_scan, static u32 ufshcd_get_max_icc_level(int sup_curr_uA, u32 start_scan,
const char *buff) const char *buff)
...@@ -7798,7 +7776,7 @@ static u32 ufshcd_get_max_icc_level(int sup_curr_uA, u32 start_scan, ...@@ -7798,7 +7776,7 @@ static u32 ufshcd_get_max_icc_level(int sup_curr_uA, u32 start_scan,
* @hba: per-adapter instance * @hba: per-adapter instance
* @desc_buf: power descriptor buffer to extract ICC levels from. * @desc_buf: power descriptor buffer to extract ICC levels from.
* *
* Returns calculated ICC level * Return: calculated ICC level.
*/ */
static u32 ufshcd_find_max_sup_active_icc_level(struct ufs_hba *hba, static u32 ufshcd_find_max_sup_active_icc_level(struct ufs_hba *hba,
const u8 *desc_buf) const u8 *desc_buf)
...@@ -7907,7 +7885,7 @@ static inline void ufshcd_blk_pm_runtime_init(struct scsi_device *sdev) ...@@ -7907,7 +7885,7 @@ static inline void ufshcd_blk_pm_runtime_init(struct scsi_device *sdev)
* This function adds scsi device instances for each of all well known LUs * This function adds scsi device instances for each of all well known LUs
* (except "REPORT LUNS" LU). * (except "REPORT LUNS" LU).
* *
* Returns zero on success (all required W-LUs are added successfully), * Return: zero on success (all required W-LUs are added successfully),
* non-zero error value on failure (if failed to add any of the required W-LU). * non-zero error value on failure (if failed to add any of the required W-LU).
*/ */
static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) static int ufshcd_scsi_add_wlus(struct ufs_hba *hba)
...@@ -8176,7 +8154,7 @@ static void ufs_put_device_desc(struct ufs_hba *hba) ...@@ -8176,7 +8154,7 @@ static void ufs_put_device_desc(struct ufs_hba *hba)
* RX_MIN_ACTIVATETIME_CAPABILITY attribute. This optimal value can help reduce * RX_MIN_ACTIVATETIME_CAPABILITY attribute. This optimal value can help reduce
* the hibern8 exit latency. * the hibern8 exit latency.
* *
* Returns zero on success, non-zero error value on failure. * Return: zero on success, non-zero error value on failure.
*/ */
static int ufshcd_tune_pa_tactivate(struct ufs_hba *hba) static int ufshcd_tune_pa_tactivate(struct ufs_hba *hba)
{ {
...@@ -8211,7 +8189,7 @@ static int ufshcd_tune_pa_tactivate(struct ufs_hba *hba) ...@@ -8211,7 +8189,7 @@ static int ufshcd_tune_pa_tactivate(struct ufs_hba *hba)
* TX_HIBERN8TIME_CAPABILITY & peer M-PHY's RX_HIBERN8TIME_CAPABILITY. * TX_HIBERN8TIME_CAPABILITY & peer M-PHY's RX_HIBERN8TIME_CAPABILITY.
* This optimal value can help reduce the hibern8 exit latency. * This optimal value can help reduce the hibern8 exit latency.
* *
* Returns zero on success, non-zero error value on failure. * Return: zero on success, non-zero error value on failure.
*/ */
static int ufshcd_tune_pa_hibern8time(struct ufs_hba *hba) static int ufshcd_tune_pa_hibern8time(struct ufs_hba *hba)
{ {
...@@ -8253,7 +8231,7 @@ static int ufshcd_tune_pa_hibern8time(struct ufs_hba *hba) ...@@ -8253,7 +8231,7 @@ static int ufshcd_tune_pa_hibern8time(struct ufs_hba *hba)
* PA_TACTIVATE, we need to enable UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE quirk * PA_TACTIVATE, we need to enable UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE quirk
* for such devices. * for such devices.
* *
* Returns zero on success, non-zero error value on failure. * Return: zero on success, non-zero error value on failure.
*/ */
static int ufshcd_quirk_tune_host_pa_tactivate(struct ufs_hba *hba) static int ufshcd_quirk_tune_host_pa_tactivate(struct ufs_hba *hba)
{ {
...@@ -8476,6 +8454,8 @@ static int ufshcd_device_params_init(struct ufs_hba *hba) ...@@ -8476,6 +8454,8 @@ static int ufshcd_device_params_init(struct ufs_hba *hba)
/** /**
* ufshcd_add_lus - probe and add UFS logical units * ufshcd_add_lus - probe and add UFS logical units
* @hba: per-adapter instance * @hba: per-adapter instance
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_add_lus(struct ufs_hba *hba) static int ufshcd_add_lus(struct ufs_hba *hba)
{ {
...@@ -8685,6 +8665,8 @@ static int ufshcd_device_init(struct ufs_hba *hba, bool init_dev_params) ...@@ -8685,6 +8665,8 @@ static int ufshcd_device_init(struct ufs_hba *hba, bool init_dev_params)
* @init_dev_params: whether or not to call ufshcd_device_params_init(). * @init_dev_params: whether or not to call ufshcd_device_params_init().
* *
* Execute link-startup and verify device initialization * Execute link-startup and verify device initialization
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_probe_hba(struct ufs_hba *hba, bool init_dev_params) static int ufshcd_probe_hba(struct ufs_hba *hba, bool init_dev_params)
{ {
...@@ -9255,8 +9237,8 @@ static int ufshcd_execute_start_stop(struct scsi_device *sdev, ...@@ -9255,8 +9237,8 @@ static int ufshcd_execute_start_stop(struct scsi_device *sdev,
* @hba: per adapter instance * @hba: per adapter instance
* @pwr_mode: device power mode to set * @pwr_mode: device power mode to set
* *
* Returns 0 if requested power mode is set successfully * Return: 0 if requested power mode is set successfully;
* Returns < 0 if failed to set the requested power mode * < 0 if failed to set the requested power mode.
*/ */
static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba, static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba,
enum ufs_dev_pwr_mode pwr_mode) enum ufs_dev_pwr_mode pwr_mode)
...@@ -9839,6 +9821,8 @@ static int ufshcd_wl_resume(struct device *dev) ...@@ -9839,6 +9821,8 @@ static int ufshcd_wl_resume(struct device *dev)
* *
* This function will put disable irqs, turn off clocks * This function will put disable irqs, turn off clocks
* and set vreg and hba-vreg in lpm mode. * and set vreg and hba-vreg in lpm mode.
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_suspend(struct ufs_hba *hba) static int ufshcd_suspend(struct ufs_hba *hba)
{ {
...@@ -9876,7 +9860,7 @@ static int ufshcd_suspend(struct ufs_hba *hba) ...@@ -9876,7 +9860,7 @@ static int ufshcd_suspend(struct ufs_hba *hba)
* This function basically turns on the regulators, clocks and * This function basically turns on the regulators, clocks and
* irqs of the hba. * irqs of the hba.
* *
* Returns 0 for success and non-zero for failure * Return: 0 for success and non-zero for failure.
*/ */
static int ufshcd_resume(struct ufs_hba *hba) static int ufshcd_resume(struct ufs_hba *hba)
{ {
...@@ -9917,7 +9901,7 @@ static int ufshcd_resume(struct ufs_hba *hba) ...@@ -9917,7 +9901,7 @@ static int ufshcd_resume(struct ufs_hba *hba)
* Executed before putting the system into a sleep state in which the contents * Executed before putting the system into a sleep state in which the contents
* of main memory are preserved. * of main memory are preserved.
* *
* Returns 0 for success and non-zero for failure * Return: 0 for success and non-zero for failure.
*/ */
int ufshcd_system_suspend(struct device *dev) int ufshcd_system_suspend(struct device *dev)
{ {
...@@ -9944,7 +9928,7 @@ EXPORT_SYMBOL(ufshcd_system_suspend); ...@@ -9944,7 +9928,7 @@ EXPORT_SYMBOL(ufshcd_system_suspend);
* Executed after waking the system up from a sleep state in which the contents * Executed after waking the system up from a sleep state in which the contents
* of main memory were preserved. * of main memory were preserved.
* *
* Returns 0 for success and non-zero for failure * Return: 0 for success and non-zero for failure.
*/ */
int ufshcd_system_resume(struct device *dev) int ufshcd_system_resume(struct device *dev)
{ {
...@@ -9974,7 +9958,7 @@ EXPORT_SYMBOL(ufshcd_system_resume); ...@@ -9974,7 +9958,7 @@ EXPORT_SYMBOL(ufshcd_system_resume);
* *
* Check the description of ufshcd_suspend() function for more details. * Check the description of ufshcd_suspend() function for more details.
* *
* Returns 0 for success and non-zero for failure * Return: 0 for success and non-zero for failure.
*/ */
int ufshcd_runtime_suspend(struct device *dev) int ufshcd_runtime_suspend(struct device *dev)
{ {
...@@ -10000,6 +9984,8 @@ EXPORT_SYMBOL(ufshcd_runtime_suspend); ...@@ -10000,6 +9984,8 @@ EXPORT_SYMBOL(ufshcd_runtime_suspend);
* *
* 1. Turn on all the controller related clocks * 1. Turn on all the controller related clocks
* 2. Turn ON VCC rail * 2. Turn ON VCC rail
*
* Return: 0 upon success; < 0 upon failure.
*/ */
int ufshcd_runtime_resume(struct device *dev) int ufshcd_runtime_resume(struct device *dev)
{ {
...@@ -10134,7 +10120,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dealloc_host); ...@@ -10134,7 +10120,7 @@ EXPORT_SYMBOL_GPL(ufshcd_dealloc_host);
* addressing capability * addressing capability
* @hba: per adapter instance * @hba: per adapter instance
* *
* Returns 0 for success, non-zero for failure * Return: 0 for success, non-zero for failure.
*/ */
static int ufshcd_set_dma_mask(struct ufs_hba *hba) static int ufshcd_set_dma_mask(struct ufs_hba *hba)
{ {
...@@ -10149,7 +10135,8 @@ static int ufshcd_set_dma_mask(struct ufs_hba *hba) ...@@ -10149,7 +10135,8 @@ static int ufshcd_set_dma_mask(struct ufs_hba *hba)
* ufshcd_alloc_host - allocate Host Bus Adapter (HBA) * ufshcd_alloc_host - allocate Host Bus Adapter (HBA)
* @dev: pointer to device handle * @dev: pointer to device handle
* @hba_handle: driver private handle * @hba_handle: driver private handle
* Returns 0 on success, non-zero value on failure *
* Return: 0 on success, non-zero value on failure.
*/ */
int ufshcd_alloc_host(struct device *dev, struct ufs_hba **hba_handle) int ufshcd_alloc_host(struct device *dev, struct ufs_hba **hba_handle)
{ {
...@@ -10205,7 +10192,8 @@ static const struct blk_mq_ops ufshcd_tmf_ops = { ...@@ -10205,7 +10192,8 @@ static const struct blk_mq_ops ufshcd_tmf_ops = {
* @hba: per-adapter instance * @hba: per-adapter instance
* @mmio_base: base register address * @mmio_base: base register address
* @irq: Interrupt line of device * @irq: Interrupt line of device
* Returns 0 on success, non-zero value on failure *
* Return: 0 on success, non-zero value on failure.
*/ */
int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
{ {
...@@ -10536,6 +10524,45 @@ static const struct dev_pm_ops ufshcd_wl_pm_ops = { ...@@ -10536,6 +10524,45 @@ static const struct dev_pm_ops ufshcd_wl_pm_ops = {
SET_RUNTIME_PM_OPS(ufshcd_wl_runtime_suspend, ufshcd_wl_runtime_resume, NULL) SET_RUNTIME_PM_OPS(ufshcd_wl_runtime_suspend, ufshcd_wl_runtime_resume, NULL)
}; };
static void ufshcd_check_header_layout(void)
{
BUILD_BUG_ON(((u8 *)&(struct request_desc_header){
.cci = 3})[0] != 3);
BUILD_BUG_ON(((u8 *)&(struct request_desc_header){
.ehs_length = 2})[1] != 2);
BUILD_BUG_ON(((u8 *)&(struct request_desc_header){
.enable_crypto = 1})[2]
!= 0x80);
BUILD_BUG_ON((((u8 *)&(struct request_desc_header){
.command_type = 5,
.data_direction = 3,
.interrupt = 1,
})[3]) != ((5 << 4) | (3 << 1) | 1));
BUILD_BUG_ON(((__le32 *)&(struct request_desc_header){
.dunl = cpu_to_le32(0xdeadbeef)})[1] !=
cpu_to_le32(0xdeadbeef));
BUILD_BUG_ON(((u8 *)&(struct request_desc_header){
.ocs = 4})[8] != 4);
BUILD_BUG_ON(((u8 *)&(struct request_desc_header){
.cds = 5})[9] != 5);
BUILD_BUG_ON(((__le32 *)&(struct request_desc_header){
.dunu = cpu_to_le32(0xbadcafe)})[3] !=
cpu_to_le32(0xbadcafe));
BUILD_BUG_ON(((u8 *)&(struct utp_upiu_header){
.iid = 0xf })[4] != 0xf0);
BUILD_BUG_ON(((u8 *)&(struct utp_upiu_header){
.command_set_type = 0xf })[4] != 0xf);
}
/* /*
* ufs_dev_wlun_template - describes ufs device wlun * ufs_dev_wlun_template - describes ufs device wlun
* ufs-device wlun - used to send pm commands * ufs-device wlun - used to send pm commands
...@@ -10561,6 +10588,8 @@ static int __init ufshcd_core_init(void) ...@@ -10561,6 +10588,8 @@ static int __init ufshcd_core_init(void)
{ {
int ret; int ret;
ufshcd_check_header_layout();
ufs_debugfs_init(); ufs_debugfs_init();
ret = scsi_register_driver(&ufs_dev_wlun_template.gendrv); ret = scsi_register_driver(&ufs_dev_wlun_template.gendrv);
......
...@@ -101,11 +101,10 @@ static void cdns_ufs_set_l4_attr(struct ufs_hba *hba) ...@@ -101,11 +101,10 @@ static void cdns_ufs_set_l4_attr(struct ufs_hba *hba)
} }
/** /**
* cdns_ufs_set_hclkdiv() * cdns_ufs_set_hclkdiv() - set HCLKDIV register value based on the core_clk.
* Sets HCLKDIV register value based on the core_clk
* @hba: host controller instance * @hba: host controller instance
* *
* Return zero for success and non-zero for failure * Return: zero for success and non-zero for failure.
*/ */
static int cdns_ufs_set_hclkdiv(struct ufs_hba *hba) static int cdns_ufs_set_hclkdiv(struct ufs_hba *hba)
{ {
...@@ -143,12 +142,11 @@ static int cdns_ufs_set_hclkdiv(struct ufs_hba *hba) ...@@ -143,12 +142,11 @@ static int cdns_ufs_set_hclkdiv(struct ufs_hba *hba)
} }
/** /**
* cdns_ufs_hce_enable_notify() * cdns_ufs_hce_enable_notify() - set HCLKDIV register
* Called before and after HCE enable bit is set.
* @hba: host controller instance * @hba: host controller instance
* @status: notify stage (pre, post change) * @status: notify stage (pre, post change)
* *
* Return zero for success and non-zero for failure * Return: zero for success and non-zero for failure.
*/ */
static int cdns_ufs_hce_enable_notify(struct ufs_hba *hba, static int cdns_ufs_hce_enable_notify(struct ufs_hba *hba,
enum ufs_notify_change_status status) enum ufs_notify_change_status status)
...@@ -160,12 +158,10 @@ static int cdns_ufs_hce_enable_notify(struct ufs_hba *hba, ...@@ -160,12 +158,10 @@ static int cdns_ufs_hce_enable_notify(struct ufs_hba *hba,
} }
/** /**
* cdns_ufs_hibern8_notify() * cdns_ufs_hibern8_notify() - save and restore L4 attributes.
* Called around hibern8 enter/exit.
* @hba: host controller instance * @hba: host controller instance
* @cmd: UIC Command * @cmd: UIC Command
* @status: notify stage (pre, post change) * @status: notify stage (pre, post change)
*
*/ */
static void cdns_ufs_hibern8_notify(struct ufs_hba *hba, enum uic_cmd_dme cmd, static void cdns_ufs_hibern8_notify(struct ufs_hba *hba, enum uic_cmd_dme cmd,
enum ufs_notify_change_status status) enum ufs_notify_change_status status)
...@@ -177,12 +173,11 @@ static void cdns_ufs_hibern8_notify(struct ufs_hba *hba, enum uic_cmd_dme cmd, ...@@ -177,12 +173,11 @@ static void cdns_ufs_hibern8_notify(struct ufs_hba *hba, enum uic_cmd_dme cmd,
} }
/** /**
* cdns_ufs_link_startup_notify() * cdns_ufs_link_startup_notify() - handle link startup.
* Called before and after Link startup is carried out.
* @hba: host controller instance * @hba: host controller instance
* @status: notify stage (pre, post change) * @status: notify stage (pre, post change)
* *
* Return zero for success and non-zero for failure * Return: zero for success and non-zero for failure.
*/ */
static int cdns_ufs_link_startup_notify(struct ufs_hba *hba, static int cdns_ufs_link_startup_notify(struct ufs_hba *hba,
enum ufs_notify_change_status status) enum ufs_notify_change_status status)
...@@ -212,7 +207,7 @@ static int cdns_ufs_link_startup_notify(struct ufs_hba *hba, ...@@ -212,7 +207,7 @@ static int cdns_ufs_link_startup_notify(struct ufs_hba *hba,
* cdns_ufs_init - performs additional ufs initialization * cdns_ufs_init - performs additional ufs initialization
* @hba: host controller instance * @hba: host controller instance
* *
* Returns status of initialization * Return: status of initialization.
*/ */
static int cdns_ufs_init(struct ufs_hba *hba) static int cdns_ufs_init(struct ufs_hba *hba)
{ {
...@@ -235,7 +230,7 @@ static int cdns_ufs_init(struct ufs_hba *hba) ...@@ -235,7 +230,7 @@ static int cdns_ufs_init(struct ufs_hba *hba)
* cdns_ufs_m31_16nm_phy_initialization - performs m31 phy initialization * cdns_ufs_m31_16nm_phy_initialization - performs m31 phy initialization
* @hba: host controller instance * @hba: host controller instance
* *
* Always returns 0 * Return: 0 (success).
*/ */
static int cdns_ufs_m31_16nm_phy_initialization(struct ufs_hba *hba) static int cdns_ufs_m31_16nm_phy_initialization(struct ufs_hba *hba)
{ {
...@@ -284,7 +279,7 @@ MODULE_DEVICE_TABLE(of, cdns_ufs_of_match); ...@@ -284,7 +279,7 @@ MODULE_DEVICE_TABLE(of, cdns_ufs_of_match);
* cdns_ufs_pltfrm_probe - probe routine of the driver * cdns_ufs_pltfrm_probe - probe routine of the driver
* @pdev: pointer to platform device handle * @pdev: pointer to platform device handle
* *
* Return zero for success and non-zero for failure * Return: zero for success and non-zero for failure.
*/ */
static int cdns_ufs_pltfrm_probe(struct platform_device *pdev) static int cdns_ufs_pltfrm_probe(struct platform_device *pdev)
{ {
...@@ -308,7 +303,7 @@ static int cdns_ufs_pltfrm_probe(struct platform_device *pdev) ...@@ -308,7 +303,7 @@ static int cdns_ufs_pltfrm_probe(struct platform_device *pdev)
* cdns_ufs_pltfrm_remove - removes the ufs driver * cdns_ufs_pltfrm_remove - removes the ufs driver
* @pdev: pointer to platform device handle * @pdev: pointer to platform device handle
* *
* Always returns 0 * Return: 0 (success).
*/ */
static int cdns_ufs_pltfrm_remove(struct platform_device *pdev) static int cdns_ufs_pltfrm_remove(struct platform_device *pdev)
{ {
......
...@@ -51,7 +51,7 @@ static void tc_dwc_g210_pci_remove(struct pci_dev *pdev) ...@@ -51,7 +51,7 @@ static void tc_dwc_g210_pci_remove(struct pci_dev *pdev)
* @pdev: pointer to PCI device handle * @pdev: pointer to PCI device handle
* @id: PCI device id * @id: PCI device id
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
static int static int
tc_dwc_g210_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) tc_dwc_g210_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
......
...@@ -17,11 +17,10 @@ ...@@ -17,11 +17,10 @@
#include "tc-dwc-g210.h" #include "tc-dwc-g210.h"
/** /**
* tc_dwc_g210_setup_40bit_rmmi() * tc_dwc_g210_setup_40bit_rmmi() - configure 40-bit RMMI.
* This function configures Synopsys TC specific atributes (40-bit RMMI)
* @hba: Pointer to drivers structure * @hba: Pointer to drivers structure
* *
* Returns 0 on success or non-zero value on failure * Return: 0 on success or non-zero value on failure.
*/ */
static int tc_dwc_g210_setup_40bit_rmmi(struct ufs_hba *hba) static int tc_dwc_g210_setup_40bit_rmmi(struct ufs_hba *hba)
{ {
...@@ -81,11 +80,10 @@ static int tc_dwc_g210_setup_40bit_rmmi(struct ufs_hba *hba) ...@@ -81,11 +80,10 @@ static int tc_dwc_g210_setup_40bit_rmmi(struct ufs_hba *hba)
} }
/** /**
* tc_dwc_g210_setup_20bit_rmmi_lane0() * tc_dwc_g210_setup_20bit_rmmi_lane0() - configure 20-bit RMMI Lane 0.
* This function configures Synopsys TC 20-bit RMMI Lane 0
* @hba: Pointer to drivers structure * @hba: Pointer to drivers structure
* *
* Returns 0 on success or non-zero value on failure * Return: 0 on success or non-zero value on failure.
*/ */
static int tc_dwc_g210_setup_20bit_rmmi_lane0(struct ufs_hba *hba) static int tc_dwc_g210_setup_20bit_rmmi_lane0(struct ufs_hba *hba)
{ {
...@@ -134,11 +132,10 @@ static int tc_dwc_g210_setup_20bit_rmmi_lane0(struct ufs_hba *hba) ...@@ -134,11 +132,10 @@ static int tc_dwc_g210_setup_20bit_rmmi_lane0(struct ufs_hba *hba)
} }
/** /**
* tc_dwc_g210_setup_20bit_rmmi_lane1() * tc_dwc_g210_setup_20bit_rmmi_lane1() - configure 20-bit RMMI Lane 1.
* This function configures Synopsys TC 20-bit RMMI Lane 1
* @hba: Pointer to drivers structure * @hba: Pointer to drivers structure
* *
* Returns 0 on success or non-zero value on failure * Return: 0 on success or non-zero value on failure.
*/ */
static int tc_dwc_g210_setup_20bit_rmmi_lane1(struct ufs_hba *hba) static int tc_dwc_g210_setup_20bit_rmmi_lane1(struct ufs_hba *hba)
{ {
...@@ -211,11 +208,10 @@ static int tc_dwc_g210_setup_20bit_rmmi_lane1(struct ufs_hba *hba) ...@@ -211,11 +208,10 @@ static int tc_dwc_g210_setup_20bit_rmmi_lane1(struct ufs_hba *hba)
} }
/** /**
* tc_dwc_g210_setup_20bit_rmmi() * tc_dwc_g210_setup_20bit_rmmi() - configure 20-bit RMMI.
* This function configures Synopsys TC specific atributes (20-bit RMMI)
* @hba: Pointer to drivers structure * @hba: Pointer to drivers structure
* *
* Returns 0 on success or non-zero value on failure * Return: 0 on success or non-zero value on failure.
*/ */
static int tc_dwc_g210_setup_20bit_rmmi(struct ufs_hba *hba) static int tc_dwc_g210_setup_20bit_rmmi(struct ufs_hba *hba)
{ {
...@@ -251,12 +247,10 @@ static int tc_dwc_g210_setup_20bit_rmmi(struct ufs_hba *hba) ...@@ -251,12 +247,10 @@ static int tc_dwc_g210_setup_20bit_rmmi(struct ufs_hba *hba)
} }
/** /**
* tc_dwc_g210_config_40_bit() * tc_dwc_g210_config_40_bit() - configure 40-bit TC specific attributes.
* This function configures Local (host) Synopsys 40-bit TC specific attributes
*
* @hba: Pointer to drivers structure * @hba: Pointer to drivers structure
* *
* Returns 0 on success non-zero value on failure * Return: 0 on success non-zero value on failure.
*/ */
int tc_dwc_g210_config_40_bit(struct ufs_hba *hba) int tc_dwc_g210_config_40_bit(struct ufs_hba *hba)
{ {
...@@ -283,12 +277,10 @@ int tc_dwc_g210_config_40_bit(struct ufs_hba *hba) ...@@ -283,12 +277,10 @@ int tc_dwc_g210_config_40_bit(struct ufs_hba *hba)
EXPORT_SYMBOL(tc_dwc_g210_config_40_bit); EXPORT_SYMBOL(tc_dwc_g210_config_40_bit);
/** /**
* tc_dwc_g210_config_20_bit() * tc_dwc_g210_config_20_bit() - configure 20-bit TC specific attributes.
* This function configures Local (host) Synopsys 20-bit TC specific attributes
*
* @hba: Pointer to drivers structure * @hba: Pointer to drivers structure
* *
* Returns 0 on success non-zero value on failure * Return: 0 on success non-zero value on failure.
*/ */
int tc_dwc_g210_config_20_bit(struct ufs_hba *hba) int tc_dwc_g210_config_20_bit(struct ufs_hba *hba)
{ {
......
...@@ -666,7 +666,7 @@ static void ufs_mtk_pwr_ctrl(struct ufs_hba *hba, bool on) ...@@ -666,7 +666,7 @@ static void ufs_mtk_pwr_ctrl(struct ufs_hba *hba, bool on)
* @on: If true, enable clocks else disable them. * @on: If true, enable clocks else disable them.
* @status: PRE_CHANGE or POST_CHANGE notify * @status: PRE_CHANGE or POST_CHANGE notify
* *
* Returns 0 on success, non-zero on failure. * Return: 0 on success, non-zero on failure.
*/ */
static int ufs_mtk_setup_clocks(struct ufs_hba *hba, bool on, static int ufs_mtk_setup_clocks(struct ufs_hba *hba, bool on,
enum ufs_notify_change_status status) enum ufs_notify_change_status status)
...@@ -885,7 +885,7 @@ static void ufs_mtk_init_mcq_irq(struct ufs_hba *hba) ...@@ -885,7 +885,7 @@ static void ufs_mtk_init_mcq_irq(struct ufs_hba *hba)
* Binds PHY with controller and powers up PHY enabling clocks * Binds PHY with controller and powers up PHY enabling clocks
* and regulators. * and regulators.
* *
* Returns -EPROBE_DEFER if binding fails, returns negative error * Return: -EPROBE_DEFER if binding fails, returns negative error
* on phy power up failure and returns zero on success. * on phy power up failure and returns zero on success.
*/ */
static int ufs_mtk_init(struct ufs_hba *hba) static int ufs_mtk_init(struct ufs_hba *hba)
...@@ -1696,7 +1696,7 @@ static const struct ufs_hba_variant_ops ufs_hba_mtk_vops = { ...@@ -1696,7 +1696,7 @@ static const struct ufs_hba_variant_ops ufs_hba_mtk_vops = {
* ufs_mtk_probe - probe routine of the driver * ufs_mtk_probe - probe routine of the driver
* @pdev: pointer to Platform device handle * @pdev: pointer to Platform device handle
* *
* Return zero for success and non-zero for failure * Return: zero for success and non-zero for failure.
*/ */
static int ufs_mtk_probe(struct platform_device *pdev) static int ufs_mtk_probe(struct platform_device *pdev)
{ {
......
...@@ -529,7 +529,7 @@ static int ufs_qcom_hce_enable_notify(struct ufs_hba *hba, ...@@ -529,7 +529,7 @@ static int ufs_qcom_hce_enable_notify(struct ufs_hba *hba,
} }
/* /*
* Returns zero for success and non-zero in case of a failure * Return: zero for success and non-zero in case of a failure.
*/ */
static int ufs_qcom_cfg_timers(struct ufs_hba *hba, u32 gear, static int ufs_qcom_cfg_timers(struct ufs_hba *hba, u32 gear,
u32 hs, u32 rate, bool update_link_startup_timer) u32 hs, u32 rate, bool update_link_startup_timer)
...@@ -1055,7 +1055,7 @@ static void ufs_qcom_set_caps(struct ufs_hba *hba) ...@@ -1055,7 +1055,7 @@ static void ufs_qcom_set_caps(struct ufs_hba *hba)
* @on: If true, enable clocks else disable them. * @on: If true, enable clocks else disable them.
* @status: PRE_CHANGE or POST_CHANGE notify * @status: PRE_CHANGE or POST_CHANGE notify
* *
* Returns 0 on success, non-zero on failure. * Return: 0 on success, non-zero on failure.
*/ */
static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on, static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on,
enum ufs_notify_change_status status) enum ufs_notify_change_status status)
...@@ -1162,7 +1162,7 @@ static int ufs_qcom_icc_init(struct ufs_qcom_host *host) ...@@ -1162,7 +1162,7 @@ static int ufs_qcom_icc_init(struct ufs_qcom_host *host)
* Binds PHY with controller and powers up PHY enabling clocks * Binds PHY with controller and powers up PHY enabling clocks
* and regulators. * and regulators.
* *
* Returns -EPROBE_DEFER if binding fails, returns negative error * Return: -EPROBE_DEFER if binding fails, returns negative error
* on phy power up failure and returns zero on success. * on phy power up failure and returns zero on success.
*/ */
static int ufs_qcom_init(struct ufs_hba *hba) static int ufs_qcom_init(struct ufs_hba *hba)
...@@ -1885,7 +1885,7 @@ static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = { ...@@ -1885,7 +1885,7 @@ static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = {
* ufs_qcom_probe - probe routine of the driver * ufs_qcom_probe - probe routine of the driver
* @pdev: pointer to Platform device handle * @pdev: pointer to Platform device handle
* *
* Return zero for success and non-zero for failure * Return: zero for success and non-zero for failure.
*/ */
static int ufs_qcom_probe(struct platform_device *pdev) static int ufs_qcom_probe(struct platform_device *pdev)
{ {
......
...@@ -34,9 +34,7 @@ int ufshcd_dwc_dme_set_attrs(struct ufs_hba *hba, ...@@ -34,9 +34,7 @@ int ufshcd_dwc_dme_set_attrs(struct ufs_hba *hba,
EXPORT_SYMBOL(ufshcd_dwc_dme_set_attrs); EXPORT_SYMBOL(ufshcd_dwc_dme_set_attrs);
/** /**
* ufshcd_dwc_program_clk_div() * ufshcd_dwc_program_clk_div() - program clock divider.
* This function programs the clk divider value. This value is needed to
* provide 1 microsecond tick to unipro layer.
* @hba: Private Structure pointer * @hba: Private Structure pointer
* @divider_val: clock divider value to be programmed * @divider_val: clock divider value to be programmed
* *
...@@ -47,11 +45,10 @@ static void ufshcd_dwc_program_clk_div(struct ufs_hba *hba, u32 divider_val) ...@@ -47,11 +45,10 @@ static void ufshcd_dwc_program_clk_div(struct ufs_hba *hba, u32 divider_val)
} }
/** /**
* ufshcd_dwc_link_is_up() * ufshcd_dwc_link_is_up() - check if link is up.
* Check if link is up
* @hba: private structure pointer * @hba: private structure pointer
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
static int ufshcd_dwc_link_is_up(struct ufs_hba *hba) static int ufshcd_dwc_link_is_up(struct ufs_hba *hba)
{ {
...@@ -68,7 +65,9 @@ static int ufshcd_dwc_link_is_up(struct ufs_hba *hba) ...@@ -68,7 +65,9 @@ static int ufshcd_dwc_link_is_up(struct ufs_hba *hba)
} }
/** /**
* ufshcd_dwc_connection_setup() * ufshcd_dwc_connection_setup() - configure unipro attributes.
* @hba: pointer to drivers private data
*
* This function configures both the local side (host) and the peer side * This function configures both the local side (host) and the peer side
* (device) unipro attributes to establish the connection to application/ * (device) unipro attributes to establish the connection to application/
* cport. * cport.
...@@ -76,9 +75,7 @@ static int ufshcd_dwc_link_is_up(struct ufs_hba *hba) ...@@ -76,9 +75,7 @@ static int ufshcd_dwc_link_is_up(struct ufs_hba *hba)
* have this connection setup on reset. But invoking this function does no * have this connection setup on reset. But invoking this function does no
* harm and should be fine even working with any ufs device. * harm and should be fine even working with any ufs device.
* *
* @hba: pointer to drivers private data * Return: 0 on success non-zero value on failure.
*
* Returns 0 on success non-zero value on failure
*/ */
static int ufshcd_dwc_connection_setup(struct ufs_hba *hba) static int ufshcd_dwc_connection_setup(struct ufs_hba *hba)
{ {
...@@ -107,12 +104,11 @@ static int ufshcd_dwc_connection_setup(struct ufs_hba *hba) ...@@ -107,12 +104,11 @@ static int ufshcd_dwc_connection_setup(struct ufs_hba *hba)
} }
/** /**
* ufshcd_dwc_link_startup_notify() * ufshcd_dwc_link_startup_notify() - program clock divider.
* UFS Host DWC specific link startup sequence
* @hba: private structure pointer * @hba: private structure pointer
* @status: Callback notify status * @status: Callback notify status
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
int ufshcd_dwc_link_startup_notify(struct ufs_hba *hba, int ufshcd_dwc_link_startup_notify(struct ufs_hba *hba,
enum ufs_notify_change_status status) enum ufs_notify_change_status status)
......
...@@ -524,7 +524,7 @@ static void ufshcd_pci_remove(struct pci_dev *pdev) ...@@ -524,7 +524,7 @@ static void ufshcd_pci_remove(struct pci_dev *pdev)
* @pdev: pointer to PCI device handle * @pdev: pointer to PCI device handle
* @id: PCI device id * @id: PCI device id
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
static int static int
ufshcd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) ufshcd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
......
...@@ -166,6 +166,8 @@ EXPORT_SYMBOL_GPL(ufshcd_populate_vreg); ...@@ -166,6 +166,8 @@ EXPORT_SYMBOL_GPL(ufshcd_populate_vreg);
* If any of the supplies are not defined it is assumed that they are always-on * If any of the supplies are not defined it is assumed that they are always-on
* and hence return zero. If the property is defined but parsing is failed * and hence return zero. If the property is defined but parsing is failed
* then return corresponding error. * then return corresponding error.
*
* Return: 0 upon success; < 0 upon failure.
*/ */
static int ufshcd_parse_regulator_info(struct ufs_hba *hba) static int ufshcd_parse_regulator_info(struct ufs_hba *hba)
{ {
...@@ -212,7 +214,7 @@ static void ufshcd_init_lanes_per_dir(struct ufs_hba *hba) ...@@ -212,7 +214,7 @@ static void ufshcd_init_lanes_per_dir(struct ufs_hba *hba)
* @dev_max: pointer to device attributes * @dev_max: pointer to device attributes
* @agreed_pwr: returned agreed attributes * @agreed_pwr: returned agreed attributes
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
int ufshcd_get_pwr_dev_param(const struct ufs_dev_params *pltfrm_param, int ufshcd_get_pwr_dev_param(const struct ufs_dev_params *pltfrm_param,
const struct ufs_pa_layer_attr *dev_max, const struct ufs_pa_layer_attr *dev_max,
...@@ -326,7 +328,7 @@ EXPORT_SYMBOL_GPL(ufshcd_init_pwr_dev_param); ...@@ -326,7 +328,7 @@ EXPORT_SYMBOL_GPL(ufshcd_init_pwr_dev_param);
* @pdev: pointer to Platform device handle * @pdev: pointer to Platform device handle
* @vops: pointer to variant ops * @vops: pointer to variant ops
* *
* Returns 0 on success, non-zero value on failure * Return: 0 on success, non-zero value on failure.
*/ */
int ufshcd_pltfrm_init(struct platform_device *pdev, int ufshcd_pltfrm_init(struct platform_device *pdev,
const struct ufs_hba_variant_ops *vops) const struct ufs_hba_variant_ops *vops)
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#ifndef SCSI_BSG_UFS_H #ifndef SCSI_BSG_UFS_H
#define SCSI_BSG_UFS_H #define SCSI_BSG_UFS_H
#include <asm/byteorder.h>
#include <linux/types.h> #include <linux/types.h>
/* /*
* This file intended to be included by both kernel and user space * This file intended to be included by both kernel and user space
...@@ -40,11 +41,56 @@ enum ufs_rpmb_op_type { ...@@ -40,11 +41,56 @@ enum ufs_rpmb_op_type {
* @dword_0: UPIU header DW-0 * @dword_0: UPIU header DW-0
* @dword_1: UPIU header DW-1 * @dword_1: UPIU header DW-1
* @dword_2: UPIU header DW-2 * @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 { struct utp_upiu_header {
__be32 dword_0; union {
__be32 dword_1; struct {
__be32 dword_2; __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;
};
};
}; };
/** /**
......
...@@ -11,10 +11,16 @@ ...@@ -11,10 +11,16 @@
#ifndef _UFS_H #ifndef _UFS_H
#define _UFS_H #define _UFS_H
#include <linux/mutex.h> #include <linux/bitops.h>
#include <linux/types.h> #include <linux/types.h>
#include <uapi/scsi/scsi_bsg_ufs.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 GENERAL_UPIU_REQUEST_SIZE (sizeof(struct utp_upiu_req))
#define QUERY_DESC_MAX_SIZE 255 #define QUERY_DESC_MAX_SIZE 255
#define QUERY_DESC_MIN_SIZE 2 #define QUERY_DESC_MIN_SIZE 2
...@@ -23,11 +29,6 @@ ...@@ -23,11 +29,6 @@
(sizeof(struct utp_upiu_header))) (sizeof(struct utp_upiu_header)))
#define UFS_SENSE_SIZE 18 #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 * UFS device may have standard LUs and LUN id could be from 0x00 to
* 0x7F. Standard LUs use "Peripheral Device Addressing Format". * 0x7F. Standard LUs use "Peripheral Device Addressing Format".
...@@ -78,7 +79,7 @@ enum { ...@@ -78,7 +79,7 @@ enum {
}; };
/* UTP UPIU Transaction Codes Initiator to Target */ /* UTP UPIU Transaction Codes Initiator to Target */
enum { enum upiu_request_transaction {
UPIU_TRANSACTION_NOP_OUT = 0x00, UPIU_TRANSACTION_NOP_OUT = 0x00,
UPIU_TRANSACTION_COMMAND = 0x01, UPIU_TRANSACTION_COMMAND = 0x01,
UPIU_TRANSACTION_DATA_OUT = 0x02, UPIU_TRANSACTION_DATA_OUT = 0x02,
...@@ -87,7 +88,7 @@ enum { ...@@ -87,7 +88,7 @@ enum {
}; };
/* UTP UPIU Transaction Codes Target to Initiator */ /* UTP UPIU Transaction Codes Target to Initiator */
enum { enum upiu_response_transaction {
UPIU_TRANSACTION_NOP_IN = 0x20, UPIU_TRANSACTION_NOP_IN = 0x20,
UPIU_TRANSACTION_RESPONSE = 0x21, UPIU_TRANSACTION_RESPONSE = 0x21,
UPIU_TRANSACTION_DATA_IN = 0x22, UPIU_TRANSACTION_DATA_IN = 0x22,
...@@ -473,21 +474,11 @@ enum { ...@@ -473,21 +474,11 @@ enum {
UPIU_COMMAND_SET_TYPE_QUERY = 0x2, UPIU_COMMAND_SET_TYPE_QUERY = 0x2,
}; };
/* UTP Transfer Request Command Offset */
#define UPIU_COMMAND_TYPE_OFFSET 28
/* Offset of the response code in the UPIU header */ /* Offset of the response code in the UPIU header */
#define UPIU_RSP_CODE_OFFSET 8 #define UPIU_RSP_CODE_OFFSET 8
enum { 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_SERVICE_RESP = 0xFF,
MASK_TM_FUNC = 0xFF,
}; };
/* Task management service response */ /* Task management service response */
...@@ -537,26 +528,6 @@ struct utp_upiu_rsp { ...@@ -537,26 +528,6 @@ struct utp_upiu_rsp {
}; };
}; };
/**
* struct ufs_query_req - parameters for building a query request
* @query_func: UPIU header query function
* @upiu_req: the query request data
*/
struct ufs_query_req {
u8 query_func;
struct utp_upiu_query upiu_req;
};
/**
* struct ufs_query_resp - UPIU QUERY
* @response: device response code
* @upiu_res: query response data
*/
struct ufs_query_res {
u8 response;
struct utp_upiu_query upiu_res;
};
/* /*
* VCCQ & VCCQ2 current requirement when UFS device is in sleep state * VCCQ & VCCQ2 current requirement when UFS device is in sleep state
* and link is in Hibern8 state. * and link is in Hibern8 state.
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/dma-direction.h> #include <linux/dma-direction.h>
#include <scsi/scsi_device.h> #include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
#include <ufs/unipro.h> #include <ufs/unipro.h>
#include <ufs/ufs.h> #include <ufs/ufs.h>
#include <ufs/ufs_quirks.h> #include <ufs/ufs_quirks.h>
...@@ -201,6 +202,25 @@ struct ufshcd_lrb { ...@@ -201,6 +202,25 @@ struct ufshcd_lrb {
bool req_abort_skip; bool req_abort_skip;
}; };
/**
* struct ufs_query_req - parameters for building a query request
* @query_func: UPIU header query function
* @upiu_req: the query request data
*/
struct ufs_query_req {
u8 query_func;
struct utp_upiu_query upiu_req;
};
/**
* struct ufs_query_resp - UPIU QUERY
* @response: device response code
* @upiu_res: query response data
*/
struct ufs_query_res {
struct utp_upiu_query upiu_res;
};
/** /**
* struct ufs_query - holds relevant data structures for query request * struct ufs_query - holds relevant data structures for query request
* @request: request upiu and function * @request: request upiu and function
...@@ -1356,12 +1376,6 @@ int ufshcd_get_vreg(struct device *dev, struct ufs_vreg *vreg); ...@@ -1356,12 +1376,6 @@ int ufshcd_get_vreg(struct device *dev, struct ufs_vreg *vreg);
int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd); int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd);
int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
struct utp_upiu_req *req_upiu,
struct utp_upiu_req *rsp_upiu,
int msgcode,
u8 *desc_buff, int *buff_len,
enum query_opcode desc_op);
int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *req_upiu, int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *req_upiu,
struct utp_upiu_req *rsp_upiu, struct ufs_ehs *ehs_req, struct utp_upiu_req *rsp_upiu, struct ufs_ehs *ehs_req,
struct ufs_ehs *ehs_rsp, int sg_cnt, struct ufs_ehs *ehs_rsp, int sg_cnt,
......
...@@ -11,7 +11,8 @@ ...@@ -11,7 +11,8 @@
#ifndef _UFSHCI_H #ifndef _UFSHCI_H
#define _UFSHCI_H #define _UFSHCI_H
#include <scsi/scsi_host.h> #include <linux/types.h>
#include <ufs/ufs.h>
enum { enum {
TASK_REQ_UPIU_SIZE_DWORDS = 8, TASK_REQ_UPIU_SIZE_DWORDS = 8,
...@@ -126,7 +127,6 @@ enum { ...@@ -126,7 +127,6 @@ enum {
}; };
#define SQ_ICU_ERR_CODE_MASK GENMASK(7, 4) #define SQ_ICU_ERR_CODE_MASK GENMASK(7, 4)
#define UPIU_COMMAND_TYPE_MASK GENMASK(31, 28)
#define UFS_MASK(mask, offset) ((mask) << (offset)) #define UFS_MASK(mask, offset) ((mask) << (offset))
/* UFS Version 08h */ /* UFS Version 08h */
...@@ -438,15 +438,13 @@ enum { ...@@ -438,15 +438,13 @@ enum {
UTP_SCSI_COMMAND = 0x00000000, UTP_SCSI_COMMAND = 0x00000000,
UTP_NATIVE_UFS_COMMAND = 0x10000000, UTP_NATIVE_UFS_COMMAND = 0x10000000,
UTP_DEVICE_MANAGEMENT_FUNCTION = 0x20000000, UTP_DEVICE_MANAGEMENT_FUNCTION = 0x20000000,
UTP_REQ_DESC_INT_CMD = 0x01000000,
UTP_REQ_DESC_CRYPTO_ENABLE_CMD = 0x00800000,
}; };
/* UTP Transfer Request Data Direction (DD) */ /* UTP Transfer Request Data Direction (DD) */
enum { enum utp_data_direction {
UTP_NO_DATA_TRANSFER = 0x00000000, UTP_NO_DATA_TRANSFER = 0,
UTP_HOST_TO_DEVICE = 0x02000000, UTP_HOST_TO_DEVICE = 1,
UTP_DEVICE_TO_HOST = 0x04000000, UTP_DEVICE_TO_HOST = 2,
}; };
/* Overall command status values */ /* Overall command status values */
...@@ -505,17 +503,38 @@ struct utp_transfer_cmd_desc { ...@@ -505,17 +503,38 @@ struct utp_transfer_cmd_desc {
/** /**
* struct request_desc_header - Descriptor Header common to both UTRD and UTMRD * struct request_desc_header - Descriptor Header common to both UTRD and UTMRD
* @dword0: Descriptor Header DW0
* @dword1: Descriptor Header DW1
* @dword2: Descriptor Header DW2
* @dword3: Descriptor Header DW3
*/ */
struct request_desc_header { struct request_desc_header {
__le32 dword_0; u8 cci;
__le32 dword_1; u8 ehs_length;
__le32 dword_2; #if defined(__BIG_ENDIAN)
__le32 dword_3; u8 enable_crypto:1;
}; u8 reserved2:7;
u8 command_type:4;
u8 reserved1:1;
u8 data_direction:2;
u8 interrupt:1;
#elif defined(__LITTLE_ENDIAN)
u8 reserved2:7;
u8 enable_crypto:1;
u8 interrupt:1;
u8 data_direction:2;
u8 reserved1:1;
u8 command_type:4;
#else
#error
#endif
__le32 dunl;
u8 ocs;
u8 cds;
__le16 ldbc;
__le32 dunu;
};
static_assert(sizeof(struct request_desc_header) == 16);
/** /**
* struct utp_transfer_req_desc - UTP Transfer Request Descriptor (UTRD) * struct utp_transfer_req_desc - UTP Transfer Request Descriptor (UTRD)
......
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