aboutsummaryrefslogtreecommitdiffstats
diff options
authorMark Brown <broonie@kernel.org>2026-05-29 23:13:49 +0100
committerMark Brown <broonie@kernel.org>2026-05-29 23:13:49 +0100
commit3a809b602233ed47ae7375b72663c4147853b1c3 (patch)
treeaf063d7d0e208c3c0167c11240ede0bce5bec826
parentb5d6adf32744ef61b5ed065152baff796b55fd2c (diff)
parent20fd1648f35399f114351b67c14ff8d3233a30e2 (diff)
downloadlinux-next-history-3a809b602233ed47ae7375b72663c4147853b1c3.tar.gz
Merge branch 'for-next' of https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git
-rw-r--r--drivers/hwmon/drivetemp.c5
-rw-r--r--drivers/scsi/megaraid/megaraid_mbox.c26
-rw-r--r--drivers/scsi/megaraid/megaraid_mm.c30
-rw-r--r--drivers/scsi/scsi_debug.c11
-rw-r--r--drivers/scsi/scsi_ioctl.c11
-rw-r--r--drivers/scsi/scsi_scan.c33
-rw-r--r--drivers/ufs/core/ufs-txeq.c8
-rw-r--r--drivers/ufs/core/ufshcd.c56
-rw-r--r--drivers/ufs/host/ufs-qcom.c3
-rw-r--r--include/scsi/scsi_common.h8
-rw-r--r--include/scsi/scsi_device.h7
-rw-r--r--include/target/target_core_base.h5
-rw-r--r--include/ufs/ufshcd.h7
13 files changed, 103 insertions, 107 deletions
diff --git a/drivers/hwmon/drivetemp.c b/drivers/hwmon/drivetemp.c
index 002e0660a0b87..efe8b229bdbe2 100644
--- a/drivers/hwmon/drivetemp.c
+++ b/drivers/hwmon/drivetemp.c
@@ -306,13 +306,10 @@ static bool drivetemp_sct_avoid(struct drivetemp_data *st)
struct scsi_device *sdev = st->sdev;
unsigned int ctr;
- if (!sdev->model)
- return false;
-
/*
* The "model" field contains just the raw SCSI INQUIRY response
* "product identification" field, which has a width of 16 bytes.
- * This field is space-filled, but is NOT NULL-terminated.
+ * This field is space-filled and NUL-terminated.
*/
for (ctr = 0; ctr < ARRAY_SIZE(sct_avoid_models); ctr++)
if (!strncmp(sdev->model, sct_avoid_models[ctr],
diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c
index 06cf94ee4e360..ce89032a5a744 100644
--- a/drivers/scsi/megaraid/megaraid_mbox.c
+++ b/drivers/scsi/megaraid/megaraid_mbox.c
@@ -3396,7 +3396,7 @@ static int
megaraid_cmm_register(adapter_t *adapter)
{
mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter);
- mraid_mmadp_t adp;
+ mraid_mmadp_t *adp;
scb_t *scb;
mbox_ccb_t *ccb;
int rval;
@@ -3404,11 +3404,16 @@ megaraid_cmm_register(adapter_t *adapter)
// Allocate memory for the base list of scb for management module.
adapter->uscb_list = kzalloc_objs(scb_t, MBOX_MAX_USER_CMDS);
+ adp = kzalloc_obj(*adp);
- if (adapter->uscb_list == NULL) {
+ if (!adapter->uscb_list || !adp) {
con_log(CL_ANN, (KERN_WARNING
"megaraid: out of memory, %s %d\n", __func__,
__LINE__));
+
+ kfree(adapter->uscb_list);
+ kfree(adp);
+
return -1;
}
@@ -3452,20 +3457,21 @@ megaraid_cmm_register(adapter_t *adapter)
list_add_tail(&scb->list, &adapter->uscb_pool);
}
- adp.unique_id = adapter->unique_id;
- adp.drvr_type = DRVRTYPE_MBOX;
- adp.drvr_data = (unsigned long)adapter;
- adp.pdev = adapter->pdev;
- adp.issue_uioc = megaraid_mbox_mm_handler;
- adp.timeout = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
- adp.max_kioc = MBOX_MAX_USER_CMDS;
+ adp->unique_id = adapter->unique_id;
+ adp->drvr_type = DRVRTYPE_MBOX;
+ adp->drvr_data = (unsigned long)adapter;
+ adp->pdev = adapter->pdev;
+ adp->issue_uioc = megaraid_mbox_mm_handler;
+ adp->timeout = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
+ adp->max_kioc = MBOX_MAX_USER_CMDS;
- if ((rval = mraid_mm_register_adp(&adp)) != 0) {
+ if ((rval = mraid_mm_register_adp(adp)) != 0) {
con_log(CL_ANN, (KERN_WARNING
"megaraid mbox: did not register with CMM\n"));
kfree(adapter->uscb_list);
+ kfree(adp);
}
return rval;
diff --git a/drivers/scsi/megaraid/megaraid_mm.c b/drivers/scsi/megaraid/megaraid_mm.c
index 538da0e98131a..60db48dc8f3a4 100644
--- a/drivers/scsi/megaraid/megaraid_mm.c
+++ b/drivers/scsi/megaraid/megaraid_mm.c
@@ -898,42 +898,28 @@ hinfo_to_cinfo(mraid_hba_info_t *hinfo, mcontroller_t *cinfo)
/**
* mraid_mm_register_adp - Registration routine for low level drivers
- * @lld_adp : Adapter object
+ * @adapter : Adapter object
*/
int
-mraid_mm_register_adp(mraid_mmadp_t *lld_adp)
+mraid_mm_register_adp(mraid_mmadp_t *adapter)
{
- mraid_mmadp_t *adapter;
mbox64_t *mbox_list;
uioc_t *kioc;
uint32_t rval;
int i;
- if (lld_adp->drvr_type != DRVRTYPE_MBOX)
+ if (adapter->drvr_type != DRVRTYPE_MBOX)
return (-EINVAL);
- adapter = kzalloc_obj(mraid_mmadp_t);
-
- if (!adapter)
- return -ENOMEM;
-
-
- adapter->unique_id = lld_adp->unique_id;
- adapter->drvr_type = lld_adp->drvr_type;
- adapter->drvr_data = lld_adp->drvr_data;
- adapter->pdev = lld_adp->pdev;
- adapter->issue_uioc = lld_adp->issue_uioc;
- adapter->timeout = lld_adp->timeout;
- adapter->max_kioc = lld_adp->max_kioc;
adapter->quiescent = 1;
/*
* Allocate single blocks of memory for all required kiocs,
* mailboxes and passthru structures.
*/
- adapter->kioc_list = kmalloc_objs(uioc_t, lld_adp->max_kioc);
- adapter->mbox_list = kmalloc_objs(mbox64_t, lld_adp->max_kioc);
+ adapter->kioc_list = kmalloc_objs(uioc_t, adapter->max_kioc);
+ adapter->mbox_list = kmalloc_objs(mbox64_t, adapter->max_kioc);
adapter->pthru_dma_pool = dma_pool_create("megaraid mm pthru pool",
&adapter->pdev->dev,
sizeof(mraid_passthru_t),
@@ -956,11 +942,11 @@ mraid_mm_register_adp(mraid_mmadp_t *lld_adp)
*/
INIT_LIST_HEAD(&adapter->kioc_pool);
spin_lock_init(&adapter->kioc_pool_lock);
- sema_init(&adapter->kioc_semaphore, lld_adp->max_kioc);
+ sema_init(&adapter->kioc_semaphore, adapter->max_kioc);
mbox_list = (mbox64_t *)adapter->mbox_list;
- for (i = 0; i < lld_adp->max_kioc; i++) {
+ for (i = 0; i < adapter->max_kioc; i++) {
kioc = adapter->kioc_list + i;
kioc->cmdbuf = (uint64_t)(unsigned long)(mbox_list + i);
@@ -997,7 +983,7 @@ dma_pool_error:
pthru_dma_pool_error:
- for (i = 0; i < lld_adp->max_kioc; i++) {
+ for (i = 0; i < adapter->max_kioc; i++) {
kioc = adapter->kioc_list + i;
if (kioc->pthru32) {
dma_pool_free(adapter->pthru_dma_pool, kioc->pthru32,
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 040c5e1e713a2..bc2aa7f6d372a 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -233,13 +233,6 @@ struct tape_block {
#define SDEBUG_OPT_UNALIGNED_WRITE 0x20000
#define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \
SDEBUG_OPT_RESET_NOISE)
-#define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \
- SDEBUG_OPT_TRANSPORT_ERR | \
- SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \
- SDEBUG_OPT_SHORT_TRANSFER | \
- SDEBUG_OPT_HOST_BUSY | \
- SDEBUG_OPT_CMD_ABORT | \
- SDEBUG_OPT_UNALIGNED_WRITE)
#define SDEBUG_OPT_RECOV_DIF_DIX (SDEBUG_OPT_RECOVERED_ERR | \
SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR)
@@ -955,7 +948,6 @@ static bool sdebug_removable = DEF_REMOVABLE;
static bool sdebug_clustering;
static bool sdebug_host_lock = DEF_HOST_LOCK;
static bool sdebug_strict = DEF_STRICT;
-static bool sdebug_any_injecting_opt;
static bool sdebug_no_rwlock;
static bool sdebug_verbose;
static bool have_dif_prot;
@@ -7528,7 +7520,6 @@ static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer,
return -EINVAL;
sdebug_opts = opts;
sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
- sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
if (sdebug_every_nth != 0)
tweak_cmnd_count();
return length;
@@ -7748,7 +7739,6 @@ static ssize_t opts_store(struct device_driver *ddp, const char *buf,
opts_done:
sdebug_opts = opts;
sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
- sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
tweak_cmnd_count();
return count;
}
@@ -9659,7 +9649,6 @@ static int sdebug_driver_probe(struct device *dev)
scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
sdebug_verbose = !!(SDEBUG_OPT_NOISE & sdebug_opts);
- sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & sdebug_opts);
if (sdebug_every_nth) /* need stats counters for every_nth */
sdebug_statistics = true;
error = scsi_add_host(hpnt, &sdbg_host->dev);
diff --git a/drivers/scsi/scsi_ioctl.c b/drivers/scsi/scsi_ioctl.c
index 0ddc95bafc71f..c14f81403a09e 100644
--- a/drivers/scsi/scsi_ioctl.c
+++ b/drivers/scsi/scsi_ioctl.c
@@ -176,10 +176,13 @@ static int scsi_ioctl_get_pci(struct scsi_device *sdev, void __user *arg)
name = dev_name(dev);
- /* compatibility with old ioctl which only returned
- * 20 characters */
- return copy_to_user(arg, name, min(strlen(name), (size_t)20))
- ? -EFAULT: 0;
+ /*
+ * Compatibility with old ioctl which only returned 20 characters.
+ */
+ if (copy_to_user(arg, name, strnlen(name, 20)))
+ return -EFAULT;
+
+ return 0;
}
static int sg_get_version(int __user *p)
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index a35a5f777d166..7e60e3a4bca66 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -292,9 +292,9 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
if (!sdev)
goto out;
- sdev->vendor = scsi_null_device_strs;
- sdev->model = scsi_null_device_strs;
- sdev->rev = scsi_null_device_strs;
+ strscpy(sdev->vendor, scsi_null_device_strs);
+ strscpy(sdev->model, scsi_null_device_strs);
+ strscpy(sdev->rev, scsi_null_device_strs);
sdev->host = shost;
sdev->queue_ramp_up_period = SCSI_DEFAULT_RAMP_UP_PERIOD;
sdev->id = starget->id;
@@ -728,9 +728,13 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
}
if (result == 0) {
- scsi_sanitize_inquiry_string(&inq_result[8], 8);
- scsi_sanitize_inquiry_string(&inq_result[16], 16);
- scsi_sanitize_inquiry_string(&inq_result[32], 4);
+ scsi_sanitize_inquiry_string(&inq_result[INQUIRY_VENDOR_OFFSET],
+ INQUIRY_VENDOR_LEN);
+ scsi_sanitize_inquiry_string(&inq_result[INQUIRY_MODEL_OFFSET],
+ INQUIRY_MODEL_LEN);
+ scsi_sanitize_inquiry_string(
+ &inq_result[INQUIRY_REVISION_OFFSET],
+ INQUIRY_REVISION_LEN);
response_len = inq_result[4] + 5;
if (response_len > 255)
@@ -743,8 +747,9 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
* corresponding bit fields in scsi_device, so bflags
* need not be passed as an argument.
*/
- *bflags = scsi_get_device_flags(sdev, &inq_result[8],
- &inq_result[16]);
+ *bflags = scsi_get_device_flags(sdev,
+ &inq_result[INQUIRY_VENDOR_OFFSET],
+ &inq_result[INQUIRY_MODEL_OFFSET]);
/* When the first pass succeeds we gain information about
* what larger transfer lengths might work. */
@@ -905,9 +910,15 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
if (sdev->inquiry == NULL)
return SCSI_SCAN_NO_RESPONSE;
- sdev->vendor = (char *) (sdev->inquiry + 8);
- sdev->model = (char *) (sdev->inquiry + 16);
- sdev->rev = (char *) (sdev->inquiry + 32);
+ strscpy(sdev->vendor, sdev->inquiry + INQUIRY_VENDOR_OFFSET);
+ strscpy(sdev->model, sdev->inquiry + INQUIRY_MODEL_OFFSET);
+ /*
+ * memcpy() instead of strscpy() because strscpy() would read past
+ * the end of sdev->inquiry if its length is exactly 36 bytes.
+ */
+ memcpy(sdev->rev, sdev->inquiry + INQUIRY_REVISION_OFFSET,
+ INQUIRY_REVISION_LEN);
+ sdev->rev[INQUIRY_REVISION_LEN] = '\0';
sdev->is_ata = strncmp(sdev->vendor, "ATA ", 8) == 0;
if (sdev->is_ata) {
diff --git a/drivers/ufs/core/ufs-txeq.c b/drivers/ufs/core/ufs-txeq.c
index 4b264adfdf49a..aa64f2bf4f1ef 100644
--- a/drivers/ufs/core/ufs-txeq.c
+++ b/drivers/ufs/core/ufs-txeq.c
@@ -885,7 +885,9 @@ static int ufshcd_setup_tx_eqtr_adapt_length(struct ufs_hba *hba,
if (adapt_l0l1l2l3_cap_local > ADAPT_L0L1L2L3_LENGTH_MAX) {
dev_err(hba->dev, "local RX_HS_G%u_ADAPT_INITIAL_L0L1L2L3_CAP (0x%x) exceeds MAX\n",
gear, adapt_l0l1l2l3_cap_local);
- return -EINVAL;
+
+ if (!(hba->quirks & UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3))
+ return -EINVAL;
}
ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_PEERRXHSG6ADAPTINITIALL0L1L2L3),
@@ -896,7 +898,9 @@ static int ufshcd_setup_tx_eqtr_adapt_length(struct ufs_hba *hba,
if (adapt_l0l1l2l3_cap_peer > ADAPT_L0L1L2L3_LENGTH_MAX) {
dev_err(hba->dev, "peer RX_HS_G%u_ADAPT_INITIAL_L0L1L2L3_CAP (0x%x) exceeds MAX\n",
gear, adapt_l0l1l2l3_cap_peer);
- return -EINVAL;
+
+ if (!(hba->quirks & UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3))
+ return -EINVAL;
}
t_adapt_l0l1l2l3_local = adapt_cap_to_t_adapt_l0l1l2l3(adapt_l0l1l2l3_cap_local);
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 06b965080fb0e..9e0336098e26e 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -460,20 +460,24 @@ static void ufshcd_add_uic_command_trace(struct ufs_hba *hba,
const struct uic_command *ucmd,
enum ufs_trace_str_t str_t)
{
- u32 cmd;
+ u32 cmd, arg1, arg2, arg3;
if (!trace_ufshcd_uic_command_enabled())
return;
- if (str_t == UFS_CMD_SEND)
+ if (str_t == UFS_CMD_SEND) {
cmd = ucmd->command;
- else
+ arg1 = ucmd->argument1;
+ arg2 = ucmd->argument2;
+ arg3 = ucmd->argument3;
+ } else {
cmd = ufshcd_readl(hba, REG_UIC_COMMAND);
+ arg1 = ufshcd_readl(hba, REG_UIC_COMMAND_ARG_1);
+ arg2 = ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2);
+ arg3 = ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3);
+ }
- trace_ufshcd_uic_command(hba, str_t, cmd,
- ufshcd_readl(hba, REG_UIC_COMMAND_ARG_1),
- ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2),
- ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3));
+ trace_ufshcd_uic_command(hba, str_t, cmd, arg1, arg2, arg3);
}
static void ufshcd_add_command_trace(struct ufs_hba *hba, struct scsi_cmnd *cmd,
@@ -913,33 +917,6 @@ static inline int ufshcd_get_lists_status(u32 reg)
}
/**
- * ufshcd_get_uic_cmd_result - Get the UIC command result
- * @hba: Pointer to adapter instance
- *
- * This function gets the result of UIC command completion
- *
- * Return: 0 on success; non-zero value on error.
- */
-static inline int ufshcd_get_uic_cmd_result(struct ufs_hba *hba)
-{
- return ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2) &
- MASK_UIC_COMMAND_RESULT;
-}
-
-/**
- * ufshcd_get_dme_attr_val - Get the value of attribute returned by UIC command
- * @hba: Pointer to adapter instance
- *
- * This function gets UIC command argument3
- *
- * Return: 0 on success; non-zero value on error.
- */
-static inline u32 ufshcd_get_dme_attr_val(struct ufs_hba *hba)
-{
- return ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3);
-}
-
-/**
* ufshcd_get_req_rsp - returns the TR response transaction type
* @ucd_rsp_ptr: pointer to response UPIU
*
@@ -2598,6 +2575,7 @@ ufshcd_dispatch_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
lockdep_assert_held(&hba->uic_cmd_mutex);
WARN_ON(hba->active_uic_cmd);
+ WARN_ON_ONCE(uic_cmd->argument2 & MASK_UIC_COMMAND_RESULT);
hba->active_uic_cmd = uic_cmd;
@@ -5810,8 +5788,14 @@ static irqreturn_t ufshcd_uic_cmd_compl(struct ufs_hba *hba, u32 intr_status)
hba->errors |= (UFSHCD_UIC_HIBERN8_MASK & intr_status);
if (intr_status & UIC_COMMAND_COMPL) {
- cmd->argument2 |= ufshcd_get_uic_cmd_result(hba);
- cmd->argument3 = ufshcd_get_dme_attr_val(hba);
+ /*
+ * Store the UIC command result in the lowest byte of
+ * cmd->argument2.
+ */
+ cmd->argument2 |= ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2) &
+ MASK_UIC_COMMAND_RESULT;
+ /* Store the DME attribute value in cmd->argument3. */
+ cmd->argument3 = ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3);
if (!hba->uic_async_done)
cmd->cmd_active = false;
complete(&cmd->done);
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 9664b8ae67b78..291c434487648 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -1315,6 +1315,9 @@ static void ufs_qcom_advertise_quirks(struct ufs_hba *hba)
if (host->hw_ver.major > 0x3)
hba->quirks |= UFSHCD_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH;
+ if (host->hw_ver.major == 0x7 && host->hw_ver.minor == 0x1)
+ hba->quirks |= UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3;
+
if (drvdata && drvdata->quirks)
hba->quirks |= drvdata->quirks;
}
diff --git a/include/scsi/scsi_common.h b/include/scsi/scsi_common.h
index fb58715fac869..00c8a16d3cd24 100644
--- a/include/scsi/scsi_common.h
+++ b/include/scsi/scsi_common.h
@@ -10,6 +10,14 @@
#include <uapi/linux/pr.h>
#include <scsi/scsi_proto.h>
+/* From the standard INQUIRY data description in SPC-6. */
+#define INQUIRY_VENDOR_OFFSET 8
+#define INQUIRY_VENDOR_LEN 8
+#define INQUIRY_MODEL_OFFSET 16
+#define INQUIRY_MODEL_LEN 16
+#define INQUIRY_REVISION_OFFSET 32
+#define INQUIRY_REVISION_LEN 4
+
enum scsi_pr_type {
SCSI_PR_WRITE_EXCLUSIVE = 0x01,
SCSI_PR_EXCLUSIVE_ACCESS = 0x03,
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index 9c2a7bbe5891e..029f5115b2ea0 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -7,6 +7,7 @@
#include <linux/workqueue.h>
#include <linux/blk-mq.h>
#include <scsi/scsi.h>
+#include <scsi/scsi_common.h>
#include <linux/atomic.h>
#include <linux/sbitmap.h>
@@ -137,9 +138,9 @@ struct scsi_device {
struct mutex inquiry_mutex;
unsigned char inquiry_len; /* valid bytes in 'inquiry' */
unsigned char * inquiry; /* INQUIRY response data */
- const char * vendor; /* [back_compat] point into 'inquiry' ... */
- const char * model; /* ... after scan; point to static string */
- const char * rev; /* ... "nullnullnullnull" before scan */
+ char vendor[INQUIRY_VENDOR_LEN + 1];
+ char model[INQUIRY_MODEL_LEN + 1];
+ char rev[INQUIRY_REVISION_LEN + 1];
#define SCSI_DEFAULT_VPD_LEN 255 /* default SCSI VPD page size (max) */
struct scsi_vpd __rcu *vpd_pg0;
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 9a0e9f9e1ec44..002b0fc575876 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -8,6 +8,7 @@
#include <linux/percpu-refcount.h>
#include <linux/semaphore.h> /* struct semaphore */
#include <linux/completion.h>
+#include <scsi/scsi_common.h>
#define TARGET_CORE_VERSION "v5.0"
@@ -46,10 +47,6 @@
/* Used by transport_get_inquiry_vpd_device_ident() */
#define INQUIRY_VPD_DEVICE_IDENTIFIER_LEN 254
-#define INQUIRY_VENDOR_LEN 8
-#define INQUIRY_MODEL_LEN 16
-#define INQUIRY_REVISION_LEN 4
-
/* Attempts before moving from SHORT to LONG */
#define PYX_TRANSPORT_WINDOW_CLOSED_THRESHOLD 3
#define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_SHORT 3 /* In milliseconds */
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index f48d6416e2993..3eaae082329c9 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -806,6 +806,13 @@ enum ufshcd_quirks {
* delay after enabling VCC to ensure it's stable.
*/
UFSHCD_QUIRK_VCC_ON_DELAY = 1 << 27,
+
+ /*
+ * This quirk indicates that Host supports TX Equalization Training
+ * (EQTR) using Adapt L0L1L2L3 length which is larger than what is
+ * allowed by M-PHY spec ver 6.0.
+ */
+ UFSHCD_QUIRK_EXTENDED_TX_EQTR_ADAPT_LENGTH_L0L1L2L3 = 1 << 28,
};
enum ufshcd_caps {