diff mbox series

[v6,7/7] scsi: ufs-bsg: Add support for uic commands in ufs_bsg_request()

Message ID 1537523064-13478-8-git-send-email-avri.altman@wdc.com (mailing list archive)
State Changes Requested
Headers show
Series scsi: Add ufs bsg endpoint | expand

Commit Message

Avri Altman Sept. 21, 2018, 9:44 a.m. UTC
Make ufshcd_send_uic_cmd() public for that.

Signed-off-by: Avri Altman <avri.altman@wdc.com>
---
 drivers/scsi/ufs/ufs_bsg.c       | 11 ++++++++++-
 drivers/scsi/ufs/ufshcd.c        |  4 ++--
 drivers/scsi/ufs/ufshcd.h        |  2 ++
 include/uapi/scsi/scsi_bsg_ufs.h |  2 ++
 4 files changed, 16 insertions(+), 3 deletions(-)

Comments

Christoph Hellwig Sept. 27, 2018, 1:25 p.m. UTC | #1
> -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 ret;
>  	unsigned long flags;
> @@ -2081,6 +2080,7 @@ static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba)
>  	ufshcd_release(hba);
>  	return ret;
>  }
> +EXPORT_SYMBOL_GPL(ufshcd_send_uic_cmd);

As far as I can tell the bsg code is now build into the main ufshcd
module, so you shouldn't need this export.
Avri Altman Sept. 27, 2018, 1:37 p.m. UTC | #2
> 
> > -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 ret;
> >  	unsigned long flags;
> > @@ -2081,6 +2080,7 @@ static inline u8 ufshcd_get_upmcrs(struct ufs_hba
> *hba)
> >  	ufshcd_release(hba);
> >  	return ret;
> >  }
> > +EXPORT_SYMBOL_GPL(ufshcd_send_uic_cmd);
> 
> As far as I can tell the bsg code is now build into the main ufshcd
> module, so you shouldn't need this export.
Done.

Thanks,
Avri
diff mbox series

Patch

diff --git a/drivers/scsi/ufs/ufs_bsg.c b/drivers/scsi/ufs/ufs_bsg.c
index c1797e2..b4261eb 100644
--- a/drivers/scsi/ufs/ufs_bsg.c
+++ b/drivers/scsi/ufs/ufs_bsg.c
@@ -55,6 +55,7 @@  static int ufs_bsg_request(struct bsg_job *job)
 	unsigned int request_len = job->request_len;
 	unsigned int reply_len = job->reply_len;
 	struct utp_upiu_query *qr;
+	struct uic_command uc = {};
 	int msgcode;
 	uint8_t *desc_buff = NULL;
 	int desc_len = 0;
@@ -107,7 +108,15 @@  static int ufs_bsg_request(struct bsg_job *job)
 
 		break;
 	case UPIU_TRANSACTION_UIC_CMD:
-		/* later */
+		memcpy(&uc, &bsg_request->upiu_req.uc, UIC_CMD_SIZE);
+		ret = ufshcd_send_uic_cmd(hba, &uc);
+		if (ret)
+			dev_dbg(hba->dev,
+				"send uic cmd: error code %d\n", ret);
+
+		memcpy(&bsg_reply->upiu_rsp.uc, &uc, UIC_CMD_SIZE);
+
+		break;
 	case UPIU_TRANSACTION_COMMAND:
 	case UPIU_TRANSACTION_DATA_OUT:
 not_supported:
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index f73edf9..61ee833 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -2060,8 +2060,7 @@  static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba)
  *
  * Returns 0 only if success.
  */
-static 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 ret;
 	unsigned long flags;
@@ -2081,6 +2080,7 @@  static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba)
 	ufshcd_release(hba);
 	return ret;
 }
+EXPORT_SYMBOL_GPL(ufshcd_send_uic_cmd);
 
 /**
  * ufshcd_map_sg - Map scatter-gather list to prdt
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 2d5f3ee..e14c40f 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -813,6 +813,8 @@  extern int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel,
 			       u32 *mib_val, u8 peer);
 extern int ufshcd_config_pwr_mode(struct ufs_hba *hba,
 			struct ufs_pa_layer_attr *desired_pwr_mode);
+extern int ufshcd_send_uic_cmd(struct ufs_hba *hba,
+			       struct uic_command *uic_cmd);
 
 /* UIC command interfaces for DME primitives */
 #define DME_LOCAL	0
diff --git a/include/uapi/scsi/scsi_bsg_ufs.h b/include/uapi/scsi/scsi_bsg_ufs.h
index 205b312..15b5226 100644
--- a/include/uapi/scsi/scsi_bsg_ufs.h
+++ b/include/uapi/scsi/scsi_bsg_ufs.h
@@ -13,6 +13,8 @@ 
 
 #define MAX_CDB_SIZE	16
 #define UPIU_TRANSACTION_UIC_CMD 0x1F
+/* uic commands are 4DW long, per UFSHCI V2.1 paragraph 5.6.1 */
+#define UIC_CMD_SIZE (sizeof(u32) * 4)
 
 enum {
 	REQ_UPIU_SIZE_DWORDS	= 8,