Re: [PATCH 32/68] uas: Use proper packet size when submitting reponse urbs

2013-11-18 Thread Hans de Goede

Hi,

On 11/18/2013 08:05 AM, Gerd Hoffmann wrote:

On Fr, 2013-11-15 at 16:06 +0100, Hans de Goede wrote:

task management commands expect a response_iu rather then a sense_iu,
and
these have different sizes. Make the urb we submit to get the reply
the right
size.


I think that doesn't work for uas in usb2 (no streams) mode.  status
urbs are not linked to requests (via tag / stream id) in that case, so
you can't know in advance which status urb gets filles with a sense_ui
and which with a response_ui by the device.


Oh, good point. You're completely right, so we always need to submit the
bigger size which is the sense urb size. I'll drop this patch from my
set then, and send a v3. Before I do that, do you have any other remarks ?

Regards,

Hans
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 32/68] uas: Use proper packet size when submitting reponse urbs

2013-11-17 Thread Gerd Hoffmann
On Fr, 2013-11-15 at 16:06 +0100, Hans de Goede wrote:
 task management commands expect a response_iu rather then a sense_iu,
 and
 these have different sizes. Make the urb we submit to get the reply
 the right
 size.

I think that doesn't work for uas in usb2 (no streams) mode.  status
urbs are not linked to requests (via tag / stream id) in that case, so
you can't know in advance which status urb gets filles with a sense_ui
and which with a response_ui by the device.

cheers,
  Gerd


--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 32/68] uas: Use proper packet size when submitting reponse urbs

2013-11-15 Thread Hans de Goede
task management commands expect a response_iu rather then a sense_iu, and
these have different sizes. Make the urb we submit to get the reply the right
size.

Signed-off-by: Hans de Goede hdego...@redhat.com
---
 drivers/usb/storage/uas.c | 19 ---
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index 33f9dcd..83c2ef8 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -429,7 +429,8 @@ static struct urb *uas_alloc_data_urb(struct uas_dev_info 
*devinfo, gfp_t gfp,
return urb;
 }
 
-static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp,
+static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo,
+  int size, gfp_t gfp,
   struct Scsi_Host *shost, u16 stream_id)
 {
struct usb_device *udev = devinfo-udev;
@@ -439,11 +440,11 @@ static struct urb *uas_alloc_sense_urb(struct 
uas_dev_info *devinfo, gfp_t gfp,
if (!urb)
goto out;
 
-   iu = kzalloc(sizeof(*iu), gfp);
+   iu = kzalloc(size, gfp);
if (!iu)
goto free;
 
-   usb_fill_bulk_urb(urb, udev, devinfo-status_pipe, iu, sizeof(*iu),
+   usb_fill_bulk_urb(urb, udev, devinfo-status_pipe, iu, size,
uas_stat_cmplt, shost);
urb-stream_id = stream_id;
urb-transfer_flags |= URB_FREE_BUFFER;
@@ -548,13 +549,13 @@ err:
  * daft to me.
  */
 
-static int uas_submit_sense_urb(struct Scsi_Host *shost,
+static int uas_submit_sense_urb(struct Scsi_Host *shost, int size,
gfp_t gfp, unsigned int stream)
 {
struct uas_dev_info *devinfo = (void *)shost-hostdata[0];
struct urb *urb;
 
-   urb = uas_alloc_sense_urb(devinfo, gfp, shost, stream);
+   urb = uas_alloc_sense_urb(devinfo, size, gfp, shost, stream);
if (!urb)
return SCSI_MLQUEUE_DEVICE_BUSY;
usb_anchor_urb(urb, devinfo-sense_urbs);
@@ -576,7 +577,8 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd,
 
WARN_ON_ONCE(!spin_is_locked(devinfo-lock));
if (cmdinfo-state  SUBMIT_STATUS_URB) {
-   err = uas_submit_sense_urb(cmnd-device-host, gfp,
+   err = uas_submit_sense_urb(cmnd-device-host,
+  sizeof(struct sense_iu), gfp,
   cmdinfo-stream);
if (err) {
return err;
@@ -724,10 +726,13 @@ static int uas_eh_task_mgmt(struct scsi_cmnd *cmnd,
struct uas_dev_info *devinfo = (void *)shost-hostdata[0];
u16 tag = devinfo-qdepth - 1;
unsigned long flags;
+   int r;
 
spin_lock_irqsave(devinfo-lock, flags);
memset(devinfo-response, 0, sizeof(devinfo-response));
-   if (uas_submit_sense_urb(shost, GFP_ATOMIC, tag)) {
+   r = uas_submit_sense_urb(shost, sizeof(struct response_iu),
+GFP_ATOMIC, tag);
+   if (r != 0) {
shost_printk(KERN_INFO, shost,
 %s: %s: submit sense urb failed\n,
 __func__, fname);
-- 
1.8.4.2

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html