Commit 5dfcf1ad authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen

scsi: usb: Stop using the SCSI pointer

Set scsi_host_template.cmd_size instead of using the SCSI pointer for
storing driver-private data. Change the type of the argument of
uas_add_work() from struct uas_cmd_info * into struct scsi_cmnd * because
it is easier to convert a SCSI command pointer into a uas_cmd_info pointer
than the other way around.

This patch prepares for removal of the SCSI pointer from struct scsi_cmnd.

Link: https://lore.kernel.org/r/20220218195117.25689-46-bvanassche@acm.org
Cc: linux-usb@vger.kernel.org
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: default avatarOliver Neukum <oneukum@suse.com>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4022bfd6
...@@ -113,7 +113,7 @@ static void uas_do_work(struct work_struct *work) ...@@ -113,7 +113,7 @@ static void uas_do_work(struct work_struct *work)
continue; continue;
cmnd = devinfo->cmnd[i]; cmnd = devinfo->cmnd[i];
cmdinfo = (void *)&cmnd->SCp; cmdinfo = scsi_cmd_priv(cmnd);
if (!(cmdinfo->state & IS_IN_WORK_LIST)) if (!(cmdinfo->state & IS_IN_WORK_LIST))
continue; continue;
...@@ -139,10 +139,9 @@ static void uas_scan_work(struct work_struct *work) ...@@ -139,10 +139,9 @@ static void uas_scan_work(struct work_struct *work)
dev_dbg(&devinfo->intf->dev, "scan complete\n"); dev_dbg(&devinfo->intf->dev, "scan complete\n");
} }
static void uas_add_work(struct uas_cmd_info *cmdinfo) static void uas_add_work(struct scsi_cmnd *cmnd)
{ {
struct scsi_pointer *scp = (void *)cmdinfo; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, SCp);
struct uas_dev_info *devinfo = cmnd->device->hostdata; struct uas_dev_info *devinfo = cmnd->device->hostdata;
lockdep_assert_held(&devinfo->lock); lockdep_assert_held(&devinfo->lock);
...@@ -163,7 +162,7 @@ static void uas_zap_pending(struct uas_dev_info *devinfo, int result) ...@@ -163,7 +162,7 @@ static void uas_zap_pending(struct uas_dev_info *devinfo, int result)
continue; continue;
cmnd = devinfo->cmnd[i]; cmnd = devinfo->cmnd[i];
cmdinfo = (void *)&cmnd->SCp; cmdinfo = scsi_cmd_priv(cmnd);
uas_log_cmd_state(cmnd, __func__, 0); uas_log_cmd_state(cmnd, __func__, 0);
/* Sense urbs were killed, clear COMMAND_INFLIGHT manually */ /* Sense urbs were killed, clear COMMAND_INFLIGHT manually */
cmdinfo->state &= ~COMMAND_INFLIGHT; cmdinfo->state &= ~COMMAND_INFLIGHT;
...@@ -200,15 +199,14 @@ static void uas_sense(struct urb *urb, struct scsi_cmnd *cmnd) ...@@ -200,15 +199,14 @@ static void uas_sense(struct urb *urb, struct scsi_cmnd *cmnd)
static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *prefix, static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *prefix,
int status) int status)
{ {
struct uas_cmd_info *ci = (void *)&cmnd->SCp; struct uas_cmd_info *ci = scsi_cmd_priv(cmnd);
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
if (status == -ENODEV) /* too late */ if (status == -ENODEV) /* too late */
return; return;
scmd_printk(KERN_INFO, cmnd, scmd_printk(KERN_INFO, cmnd,
"%s %d uas-tag %d inflight:%s%s%s%s%s%s%s%s%s%s%s%s ", "%s %d uas-tag %d inflight:%s%s%s%s%s%s%s%s%s%s%s%s ",
prefix, status, cmdinfo->uas_tag, prefix, status, ci->uas_tag,
(ci->state & SUBMIT_STATUS_URB) ? " s-st" : "", (ci->state & SUBMIT_STATUS_URB) ? " s-st" : "",
(ci->state & ALLOC_DATA_IN_URB) ? " a-in" : "", (ci->state & ALLOC_DATA_IN_URB) ? " a-in" : "",
(ci->state & SUBMIT_DATA_IN_URB) ? " s-in" : "", (ci->state & SUBMIT_DATA_IN_URB) ? " s-in" : "",
...@@ -231,7 +229,7 @@ static void uas_free_unsubmitted_urbs(struct scsi_cmnd *cmnd) ...@@ -231,7 +229,7 @@ static void uas_free_unsubmitted_urbs(struct scsi_cmnd *cmnd)
if (!cmnd) if (!cmnd)
return; return;
cmdinfo = (void *)&cmnd->SCp; cmdinfo = scsi_cmd_priv(cmnd);
if (cmdinfo->state & SUBMIT_CMD_URB) if (cmdinfo->state & SUBMIT_CMD_URB)
usb_free_urb(cmdinfo->cmd_urb); usb_free_urb(cmdinfo->cmd_urb);
...@@ -245,7 +243,7 @@ static void uas_free_unsubmitted_urbs(struct scsi_cmnd *cmnd) ...@@ -245,7 +243,7 @@ static void uas_free_unsubmitted_urbs(struct scsi_cmnd *cmnd)
static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller) static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller)
{ {
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata; struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
lockdep_assert_held(&devinfo->lock); lockdep_assert_held(&devinfo->lock);
...@@ -263,13 +261,13 @@ static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller) ...@@ -263,13 +261,13 @@ static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller)
static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd, static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd,
unsigned direction) unsigned direction)
{ {
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
int err; int err;
cmdinfo->state |= direction | SUBMIT_STATUS_URB; cmdinfo->state |= direction | SUBMIT_STATUS_URB;
err = uas_submit_urbs(cmnd, cmnd->device->hostdata); err = uas_submit_urbs(cmnd, cmnd->device->hostdata);
if (err) { if (err) {
uas_add_work(cmdinfo); uas_add_work(cmnd);
} }
} }
...@@ -329,7 +327,7 @@ static void uas_stat_cmplt(struct urb *urb) ...@@ -329,7 +327,7 @@ static void uas_stat_cmplt(struct urb *urb)
} }
cmnd = devinfo->cmnd[idx]; cmnd = devinfo->cmnd[idx];
cmdinfo = (void *)&cmnd->SCp; cmdinfo = scsi_cmd_priv(cmnd);
if (!(cmdinfo->state & COMMAND_INFLIGHT)) { if (!(cmdinfo->state & COMMAND_INFLIGHT)) {
uas_log_cmd_state(cmnd, "unexpected status cmplt", 0); uas_log_cmd_state(cmnd, "unexpected status cmplt", 0);
...@@ -394,7 +392,7 @@ static void uas_stat_cmplt(struct urb *urb) ...@@ -394,7 +392,7 @@ static void uas_stat_cmplt(struct urb *urb)
static void uas_data_cmplt(struct urb *urb) static void uas_data_cmplt(struct urb *urb)
{ {
struct scsi_cmnd *cmnd = urb->context; struct scsi_cmnd *cmnd = urb->context;
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata; struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
struct scsi_data_buffer *sdb = &cmnd->sdb; struct scsi_data_buffer *sdb = &cmnd->sdb;
unsigned long flags; unsigned long flags;
...@@ -446,7 +444,7 @@ static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp, ...@@ -446,7 +444,7 @@ static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp,
enum dma_data_direction dir) enum dma_data_direction dir)
{ {
struct usb_device *udev = devinfo->udev; struct usb_device *udev = devinfo->udev;
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
struct urb *urb = usb_alloc_urb(0, gfp); struct urb *urb = usb_alloc_urb(0, gfp);
struct scsi_data_buffer *sdb = &cmnd->sdb; struct scsi_data_buffer *sdb = &cmnd->sdb;
unsigned int pipe = (dir == DMA_FROM_DEVICE) unsigned int pipe = (dir == DMA_FROM_DEVICE)
...@@ -468,7 +466,7 @@ static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp, ...@@ -468,7 +466,7 @@ static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp,
struct scsi_cmnd *cmnd) struct scsi_cmnd *cmnd)
{ {
struct usb_device *udev = devinfo->udev; struct usb_device *udev = devinfo->udev;
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
struct urb *urb = usb_alloc_urb(0, gfp); struct urb *urb = usb_alloc_urb(0, gfp);
struct sense_iu *iu; struct sense_iu *iu;
...@@ -496,7 +494,7 @@ static struct urb *uas_alloc_cmd_urb(struct uas_dev_info *devinfo, gfp_t gfp, ...@@ -496,7 +494,7 @@ static struct urb *uas_alloc_cmd_urb(struct uas_dev_info *devinfo, gfp_t gfp,
{ {
struct usb_device *udev = devinfo->udev; struct usb_device *udev = devinfo->udev;
struct scsi_device *sdev = cmnd->device; struct scsi_device *sdev = cmnd->device;
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
struct urb *urb = usb_alloc_urb(0, gfp); struct urb *urb = usb_alloc_urb(0, gfp);
struct command_iu *iu; struct command_iu *iu;
int len; int len;
...@@ -558,7 +556,7 @@ static struct urb *uas_submit_sense_urb(struct scsi_cmnd *cmnd, gfp_t gfp) ...@@ -558,7 +556,7 @@ static struct urb *uas_submit_sense_urb(struct scsi_cmnd *cmnd, gfp_t gfp)
static int uas_submit_urbs(struct scsi_cmnd *cmnd, static int uas_submit_urbs(struct scsi_cmnd *cmnd,
struct uas_dev_info *devinfo) struct uas_dev_info *devinfo)
{ {
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
struct urb *urb; struct urb *urb;
int err; int err;
...@@ -637,12 +635,10 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd) ...@@ -637,12 +635,10 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd)
{ {
struct scsi_device *sdev = cmnd->device; struct scsi_device *sdev = cmnd->device;
struct uas_dev_info *devinfo = sdev->hostdata; struct uas_dev_info *devinfo = sdev->hostdata;
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
unsigned long flags; unsigned long flags;
int idx, err; int idx, err;
BUILD_BUG_ON(sizeof(struct uas_cmd_info) > sizeof(struct scsi_pointer));
/* Re-check scsi_block_requests now that we've the host-lock */ /* Re-check scsi_block_requests now that we've the host-lock */
if (cmnd->device->host->host_self_blocked) if (cmnd->device->host->host_self_blocked)
return SCSI_MLQUEUE_DEVICE_BUSY; return SCSI_MLQUEUE_DEVICE_BUSY;
...@@ -712,7 +708,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd) ...@@ -712,7 +708,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd)
spin_unlock_irqrestore(&devinfo->lock, flags); spin_unlock_irqrestore(&devinfo->lock, flags);
return SCSI_MLQUEUE_DEVICE_BUSY; return SCSI_MLQUEUE_DEVICE_BUSY;
} }
uas_add_work(cmdinfo); uas_add_work(cmnd);
} }
devinfo->cmnd[idx] = cmnd; devinfo->cmnd[idx] = cmnd;
...@@ -730,7 +726,7 @@ static DEF_SCSI_QCMD(uas_queuecommand) ...@@ -730,7 +726,7 @@ static DEF_SCSI_QCMD(uas_queuecommand)
*/ */
static int uas_eh_abort_handler(struct scsi_cmnd *cmnd) static int uas_eh_abort_handler(struct scsi_cmnd *cmnd)
{ {
struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; struct uas_cmd_info *cmdinfo = scsi_cmd_priv(cmnd);
struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata; struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
struct urb *data_in_urb = NULL; struct urb *data_in_urb = NULL;
struct urb *data_out_urb = NULL; struct urb *data_out_urb = NULL;
...@@ -910,6 +906,7 @@ static struct scsi_host_template uas_host_template = { ...@@ -910,6 +906,7 @@ static struct scsi_host_template uas_host_template = {
.this_id = -1, .this_id = -1,
.skip_settle_delay = 1, .skip_settle_delay = 1,
.dma_boundary = PAGE_SIZE - 1, .dma_boundary = PAGE_SIZE - 1,
.cmd_size = sizeof(struct uas_cmd_info),
}; };
#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \ #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
......
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