usb_stor_bulk_transfer_sg() assumes buf is a scatterlist array if
use_sg is non-NULL.  Change it to an explicit sg arg, instead, to
allow the callers to change to scsi_sglist().

Signed-off-by: Rusty Russell <[EMAIL PROTECTED]>

diff -r 09247461cfda drivers/usb/storage/freecom.c
--- a/drivers/usb/storage/freecom.c     Thu Jan 03 19:30:25 2008 +1100
+++ b/drivers/usb/storage/freecom.c     Thu Jan 03 19:51:09 2008 +1100
@@ -133,7 +133,7 @@ freecom_readdata (struct scsi_cmnd *srb,
        /* Now transfer all of our blocks. */
        US_DEBUGP("Start of read\n");
        result = usb_stor_bulk_transfer_sg(us, ipipe, srb->request_buffer,
-                       count, srb->use_sg, &srb->resid);
+                       count, scsi_sglist(srb), scsi_sg_count(srb), 
&srb->resid);
        US_DEBUGP("freecom_readdata done!\n");
 
        if (result > USB_STOR_XFER_SHORT)
@@ -167,7 +167,7 @@ freecom_writedata (struct scsi_cmnd *srb
        /* Now transfer all of our blocks. */
        US_DEBUGP("Start of write\n");
        result = usb_stor_bulk_transfer_sg(us, opipe, srb->request_buffer,
-                       count, srb->use_sg, &srb->resid);
+                       count, scsi_sglist(srb), scsi_sg_count(srb), 
&srb->resid);
 
        US_DEBUGP("freecom_writedata done!\n");
        if (result > USB_STOR_XFER_SHORT)
diff -r 09247461cfda drivers/usb/storage/sddr09.c
--- a/drivers/usb/storage/sddr09.c      Thu Jan 03 19:30:25 2008 +1100
+++ b/drivers/usb/storage/sddr09.c      Thu Jan 03 19:51:09 2008 +1100
@@ -355,7 +355,7 @@ static int
 static int
 sddr09_readX(struct us_data *us, int x, unsigned long fromaddress,
             int nr_of_pages, int bulklen, unsigned char *buf,
-            int use_sg) {
+            struct scatterlist *sg, int use_sg) {
 
        unsigned char *command = us->iobuf;
        int result;
@@ -382,7 +382,7 @@ sddr09_readX(struct us_data *us, int x, 
        }
 
        result = usb_stor_bulk_transfer_sg(us, us->recv_bulk_pipe,
-                                      buf, bulklen, use_sg, NULL);
+                                          buf, bulklen, sg, use_sg, NULL);
 
        if (result != USB_STOR_XFER_GOOD) {
                US_DEBUGP("Result for bulk_transfer in sddr09_read2%d %d\n",
@@ -403,12 +403,13 @@ sddr09_readX(struct us_data *us, int x, 
  */
 static int
 sddr09_read20(struct us_data *us, unsigned long fromaddress,
-             int nr_of_pages, int pageshift, unsigned char *buf, int use_sg) {
+             int nr_of_pages, int pageshift, unsigned char *buf,
+             struct scatterlist *sg, int use_sg) {
        int bulklen = nr_of_pages << pageshift;
 
        /* The last 8 bits of fromaddress are ignored. */
        return sddr09_readX(us, 0, fromaddress, nr_of_pages, bulklen,
-                           buf, use_sg);
+                           buf, sg, use_sg);
 }
 
 /*
@@ -426,11 +427,12 @@ sddr09_read20(struct us_data *us, unsign
  */
 static int
 sddr09_read21(struct us_data *us, unsigned long fromaddress,
-             int count, int controlshift, unsigned char *buf, int use_sg) {
+             int count, int controlshift, unsigned char *buf,
+             struct scatterlist *sg, int use_sg) {
 
        int bulklen = (count << controlshift);
        return sddr09_readX(us, 1, fromaddress, count, bulklen,
-                           buf, use_sg);
+                           buf, sg, use_sg);
 }
 
 /*
@@ -444,13 +446,14 @@ sddr09_read21(struct us_data *us, unsign
  */
 static int
 sddr09_read22(struct us_data *us, unsigned long fromaddress,
-             int nr_of_pages, int pageshift, unsigned char *buf, int use_sg) {
+             int nr_of_pages, int pageshift, unsigned char *buf,
+             struct scatterlist *sg, int use_sg) {
 
        int bulklen = (nr_of_pages << pageshift) + (nr_of_pages << 
CONTROL_SHIFT);
        US_DEBUGP("sddr09_read22: reading %d pages, %d bytes\n",
                  nr_of_pages, bulklen);
        return sddr09_readX(us, 2, fromaddress, nr_of_pages, bulklen,
-                           buf, use_sg);
+                           buf, sg, use_sg);
 }
 
 #if 0
@@ -538,7 +541,8 @@ static int
 static int
 sddr09_writeX(struct us_data *us,
              unsigned long Waddress, unsigned long Eaddress,
-             int nr_of_pages, int bulklen, unsigned char *buf, int use_sg) {
+             int nr_of_pages, int bulklen, unsigned char *buf,
+             struct scatterlist *sg, int use_sg) {
 
        unsigned char *command = us->iobuf;
        int result;
@@ -568,7 +572,7 @@ sddr09_writeX(struct us_data *us,
        }
 
        result = usb_stor_bulk_transfer_sg(us, us->send_bulk_pipe,
-                                      buf, bulklen, use_sg, NULL);
+                                      buf, bulklen, sg, use_sg, NULL);
 
        if (result != USB_STOR_XFER_GOOD) {
                US_DEBUGP("Result for bulk_transfer in sddr09_writeX %d\n",
@@ -582,10 +586,10 @@ static int
 static int
 sddr09_write_inplace(struct us_data *us, unsigned long address,
                     int nr_of_pages, int pageshift, unsigned char *buf,
-                    int use_sg) {
+                    struct scatterlist *sg, int use_sg) {
        int bulklen = (nr_of_pages << pageshift) + (nr_of_pages << 
CONTROL_SHIFT);
        return sddr09_writeX(us, address, address, nr_of_pages, bulklen,
-                            buf, use_sg);
+                            buf, sg, use_sg);
 }
 
 #if 0
@@ -772,7 +776,7 @@ sddr09_read_data(struct us_data *us,
                                info->pageshift;
 
                        result = sddr09_read20(us, address>>1,
-                                       pages, info->pageshift, buffer, 0);
+                                       pages, info->pageshift, buffer, NULL, 
0);
                        if (result)
                                break;
                }
@@ -858,7 +862,7 @@ sddr09_write_lba(struct us_data *us, uns
        /* read old contents */
        address = (pba << (info->pageshift + info->blockshift));
        result = sddr09_read22(us, address>>1, info->blocksize,
-                              info->pageshift, blockbuffer, 0);
+                              info->pageshift, blockbuffer, NULL, 0);
        if (result)
                return result;
 
@@ -898,7 +902,7 @@ sddr09_write_lba(struct us_data *us, uns
        US_DEBUGP("Rewrite PBA %d (LBA %d)\n", pba, lba);
 
        result = sddr09_write_inplace(us, address>>1, info->blocksize,
-                                     info->pageshift, blockbuffer, 0);
+                                     info->pageshift, blockbuffer, NULL, 0);
 
        US_DEBUGP("sddr09_write_inplace returns %d\n", result);
 
@@ -1014,13 +1018,14 @@ sddr09_read_control(struct us_data *us,
                unsigned long address,
                unsigned int blocks,
                unsigned char *content,
+               struct scatterlist *sg,
                int use_sg) {
 
        US_DEBUGP("Read control address %lu, blocks %d\n",
                address, blocks);
 
        return sddr09_read21(us, address, blocks,
-                            CONTROL_SHIFT, content, use_sg);
+                            CONTROL_SHIFT, content, sg, use_sg);
 }
 
 /*
@@ -1220,7 +1225,7 @@ sddr09_read_map(struct us_data *us) {
                        result = sddr09_read_control(
                                us, address>>1,
                                min(alloc_blocks, numblocks - i),
-                               buffer, 0);
+                               buffer, NULL, 0);
                        if (result) {
                                result = -1;
                                goto done;
@@ -1639,7 +1644,8 @@ int sddr09_transport(struct scsi_cmnd *s
                result = usb_stor_bulk_transfer_sg(us, pipe,
                                        srb->request_buffer,
                                        srb->request_bufflen,
-                                       srb->use_sg, &srb->resid);
+                                       scsi_sglist(srb), scsi_sg_count(srb),
+                                       &srb->resid);
 
                return (result == USB_STOR_XFER_GOOD ?
                        USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
diff -r 09247461cfda drivers/usb/storage/shuttle_usbat.c
--- a/drivers/usb/storage/shuttle_usbat.c       Thu Jan 03 19:30:25 2008 +1100
+++ b/drivers/usb/storage/shuttle_usbat.c       Thu Jan 03 19:51:09 2008 +1100
@@ -132,13 +132,14 @@ static int usbat_bulk_read(struct us_dat
 static int usbat_bulk_read(struct us_data *us,
                           unsigned char *data,
                           unsigned int len,
+                          struct scatterlist *sg,
                           int use_sg)
 {
        if (len == 0)
                return USB_STOR_XFER_GOOD;
 
        US_DEBUGP("usbat_bulk_read: len = %d\n", len);
-       return usb_stor_bulk_transfer_sg(us, us->recv_bulk_pipe, data, len, 
use_sg, NULL);
+       return usb_stor_bulk_transfer_sg(us, us->recv_bulk_pipe, data, len, sg, 
use_sg, NULL);
 }
 
 /*
@@ -147,13 +148,14 @@ static int usbat_bulk_write(struct us_da
 static int usbat_bulk_write(struct us_data *us,
                            unsigned char *data,
                            unsigned int len,
+                           struct scatterlist *sg,
                            int use_sg)
 {
        if (len == 0)
                return USB_STOR_XFER_GOOD;
 
        US_DEBUGP("usbat_bulk_write:  len = %d\n", len);
-       return usb_stor_bulk_transfer_sg(us, us->send_bulk_pipe, data, len, 
use_sg, NULL);
+       return usb_stor_bulk_transfer_sg(us, us->send_bulk_pipe, data, len, sg, 
use_sg, NULL);
 }
 
 /*
@@ -316,6 +318,7 @@ static int usbat_read_block(struct us_da
 static int usbat_read_block(struct us_data *us,
                            unsigned char *content,
                            unsigned short len,
+                           struct scatterlist *sg,
                            int use_sg)
 {
        int result;
@@ -337,7 +340,7 @@ static int usbat_read_block(struct us_da
        if (result != USB_STOR_XFER_GOOD)
                return USB_STOR_TRANSPORT_ERROR;
 
-       result = usbat_bulk_read(us, content, len, use_sg);
+       result = usbat_bulk_read(us, content, len, sg, use_sg);
        return (result == USB_STOR_XFER_GOOD ?
                        USB_STOR_TRANSPORT_GOOD : USB_STOR_TRANSPORT_ERROR);
 }
@@ -350,6 +353,7 @@ static int usbat_write_block(struct us_d
                             unsigned char *content,
                             unsigned short len,
                             int minutes,
+                            struct scatterlist *sg,
                             int use_sg)
 {
        int result;
@@ -372,7 +376,7 @@ static int usbat_write_block(struct us_d
        if (result != USB_STOR_XFER_GOOD)
                return USB_STOR_TRANSPORT_ERROR;
 
-       result = usbat_bulk_write(us, content, len, use_sg);
+       result = usbat_bulk_write(us, content, len, sg, use_sg);
        if (result != USB_STOR_XFER_GOOD)
                return USB_STOR_TRANSPORT_ERROR;
 
@@ -394,6 +398,7 @@ static int usbat_hp8200e_rw_block_test(s
                                       int direction,
                                       unsigned char *content,
                                       unsigned short len,
+                                      struct scatterlist *sg,
                                       int use_sg,
                                       int minutes)
 {
@@ -465,14 +470,15 @@ static int usbat_hp8200e_rw_block_test(s
                                data[1+(j<<1)] = data_out[j];
                        }
 
-                       result = usbat_bulk_write(us, data, num_registers*2, 0);
+                       result = usbat_bulk_write(us, data, num_registers*2,
+                                                 NULL, 0);
                        if (result != USB_STOR_XFER_GOOD)
                                return USB_STOR_TRANSPORT_ERROR;
 
                }
 
                result = usb_stor_bulk_transfer_sg(us,
-                       pipe, content, len, use_sg, NULL);
+                       pipe, content, len, sg, use_sg, NULL);
 
                /*
                 * If we get a stall on the bulk download, we'll retry
@@ -583,7 +589,7 @@ static int usbat_multiple_write(struct u
        }
 
        /* Send the data */
-       result = usbat_bulk_write(us, data, num_registers*2, 0);
+       result = usbat_bulk_write(us, data, num_registers*2, NULL,0);
        if (result != USB_STOR_XFER_GOOD)
                return USB_STOR_TRANSPORT_ERROR;
 
@@ -608,6 +614,7 @@ static int usbat_read_blocks(struct us_d
 static int usbat_read_blocks(struct us_data *us,
                             unsigned char *buffer,
                             int len,
+                            struct scatterlist *sg,
                             int use_sg)
 {
        int result;
@@ -628,7 +635,7 @@ static int usbat_read_blocks(struct us_d
                return USB_STOR_TRANSPORT_FAILED;
        
        /* Read the blocks we just asked for */
-       result = usbat_bulk_read(us, buffer, len, use_sg);
+       result = usbat_bulk_read(us, buffer, len, sg, use_sg);
        if (result != USB_STOR_XFER_GOOD)
                return USB_STOR_TRANSPORT_FAILED;
 
@@ -650,6 +657,7 @@ static int usbat_write_blocks(struct us_
 static int usbat_write_blocks(struct us_data *us,
                                                          unsigned char *buffer,
                              int len,
+                             struct scatterlist *sg,
                              int use_sg)
 {
        int result;
@@ -670,7 +678,7 @@ static int usbat_write_blocks(struct us_
                return USB_STOR_TRANSPORT_FAILED;
        
        /* Write the data */
-       result = usbat_bulk_write(us, buffer, len, use_sg);
+       result = usbat_bulk_write(us, buffer, len, sg, use_sg);
        if (result != USB_STOR_XFER_GOOD)
                return USB_STOR_TRANSPORT_FAILED;
 
@@ -955,7 +963,7 @@ static int usbat_flash_get_sector_count(
        msleep(100);
 
        /* Read the device identification data */
-       rc = usbat_read_block(us, reply, 512, 0);
+       rc = usbat_read_block(us, reply, 512, NULL, 0);
        if (rc != USB_STOR_TRANSPORT_GOOD)
                goto leave;
 
@@ -1040,7 +1048,7 @@ static int usbat_flash_read_data(struct 
                        goto leave;
 
                /* Read the data we just requested */
-               result = usbat_read_blocks(us, buffer, len, 0);
+               result = usbat_read_blocks(us, buffer, len, NULL, 0);
                if (result != USB_STOR_TRANSPORT_GOOD)
                        goto leave;
         
@@ -1135,7 +1143,7 @@ static int usbat_flash_write_data(struct
                        goto leave;
 
                /* Write the data */
-               result = usbat_write_blocks(us, buffer, len, 0);
+               result = usbat_write_blocks(us, buffer, len, NULL, 0);
                if (result != USB_STOR_TRANSPORT_GOOD)
                        goto leave;
 
@@ -1178,7 +1186,8 @@ static int usbat_hp8200e_handle_read10(s
                        (USBAT_QUAL_FCQ | USBAT_QUAL_ALQ),
                        DMA_FROM_DEVICE,
                        srb->request_buffer, 
-                       srb->request_bufflen, srb->use_sg, 1);
+                       srb->request_bufflen,
+                       scsi_sglist(srb), scsi_sg_count(srb), 1);
 
                return result;
        }
@@ -1247,7 +1256,7 @@ static int usbat_hp8200e_handle_read10(s
                        (USBAT_QUAL_FCQ | USBAT_QUAL_ALQ),
                        DMA_FROM_DEVICE,
                        buffer,
-                       len, 0, 1);
+                       len, NULL, 0, 1);
 
                if (result != USB_STOR_TRANSPORT_GOOD)
                        break;
@@ -1473,7 +1482,7 @@ static int usbat_hp8200e_transport(struc
                        (USBAT_QUAL_FCQ | USBAT_QUAL_ALQ),
                        DMA_TO_DEVICE,
                        srb->request_buffer, 
-                       len, srb->use_sg, 10);
+                       len, scsi_sglist(srb), scsi_sg_count(srb), 10);
 
                if (result == USB_STOR_TRANSPORT_GOOD) {
                        transferred += len;
@@ -1512,7 +1521,7 @@ static int usbat_hp8200e_transport(struc
 
        if ((result = usbat_write_block(us,
                        USBAT_ATA, srb->cmnd, 12,
-                               (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), 0) !=
+                               (srb->cmnd[0]==GPCMD_BLANK ? 75 : 10), NULL, 0) 
!=
                             USB_STOR_TRANSPORT_GOOD)) {
                return result;
        }
@@ -1540,11 +1549,12 @@ static int usbat_hp8200e_transport(struc
                        len = *status;
 
 
-               result = usbat_read_block(us, srb->request_buffer, len, 
srb->use_sg);
+               result = usbat_read_block(us, srb->request_buffer, len,
+                                         scsi_sglist(srb), scsi_sg_count(srb));
 
                /* Debug-print the first 32 bytes of the transfer */
 
-               if (!srb->use_sg) {
+               if (!scsi_sg_count(srb)) {
                        string[0] = 0;
                        for (i=0; i<len && i<32; i++) {
                                sprintf(string+strlen(string), "%02X ",
diff -r 09247461cfda drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c   Thu Jan 03 19:30:25 2008 +1100
+++ b/drivers/usb/storage/transport.c   Thu Jan 03 19:51:09 2008 +1100
@@ -468,7 +468,8 @@ static int usb_stor_bulk_transfer_sglist
  * scatter-gather or not, and acts appropriately.
  */
 int usb_stor_bulk_transfer_sg(struct us_data* us, unsigned int pipe,
-               void *buf, unsigned int length_left, int use_sg, int *residual)
+                             void *buf, unsigned int length_left,
+                             struct scatterlist *sg, int use_sg, int *residual)
 {
        int result;
        unsigned int partial;
@@ -477,7 +478,7 @@ int usb_stor_bulk_transfer_sg(struct us_
        if (use_sg) {
                /* use the usb core scatter-gather primitives */
                result = usb_stor_bulk_transfer_sglist(us, pipe,
-                               (struct scatterlist *) buf, use_sg,
+                               sg, use_sg,
                                length_left, &partial);
                length_left -= partial;
        } else {
@@ -739,7 +740,8 @@ int usb_stor_CBI_transport(struct scsi_c
                                us->recv_bulk_pipe : us->send_bulk_pipe;
                result = usb_stor_bulk_transfer_sg(us, pipe,
                                        srb->request_buffer, transfer_length,
-                                       srb->use_sg, &srb->resid);
+                                       scsi_sglist(srb), scsi_sg_count(srb),
+                                       &srb->resid);
                US_DEBUGP("CBI data stage result is 0x%x\n", result);
 
                /* if we stalled the data transfer it means command failed */
@@ -838,7 +840,8 @@ int usb_stor_CB_transport(struct scsi_cm
                                us->recv_bulk_pipe : us->send_bulk_pipe;
                result = usb_stor_bulk_transfer_sg(us, pipe,
                                        srb->request_buffer, transfer_length,
-                                       srb->use_sg, &srb->resid);
+                                       scsi_sglist(srb), scsi_sg_count(srb),
+                                       &srb->resid);
                US_DEBUGP("CB data stage result is 0x%x\n", result);
 
                /* if we stalled the data transfer it means command failed */
@@ -957,7 +960,8 @@ int usb_stor_Bulk_transport(struct scsi_
                                us->recv_bulk_pipe : us->send_bulk_pipe;
                result = usb_stor_bulk_transfer_sg(us, pipe,
                                        srb->request_buffer, transfer_length,
-                                       srb->use_sg, &srb->resid);
+                                       scsi_sglist(srb), scsi_sg_count(srb),
+                                       &srb->resid);
                US_DEBUGP("Bulk data transfer result 0x%x\n", result);
                if (result == USB_STOR_XFER_ERROR)
                        return USB_STOR_TRANSPORT_ERROR;
diff -r 09247461cfda drivers/usb/storage/transport.h
--- a/drivers/usb/storage/transport.h   Thu Jan 03 19:30:25 2008 +1100
+++ b/drivers/usb/storage/transport.h   Thu Jan 03 19:51:09 2008 +1100
@@ -138,7 +138,8 @@ extern int usb_stor_bulk_transfer_buf(st
 extern int usb_stor_bulk_transfer_buf(struct us_data *us, unsigned int pipe,
                void *buf, unsigned int length, unsigned int *act_len);
 extern int usb_stor_bulk_transfer_sg(struct us_data *us, unsigned int pipe,
-               void *buf, unsigned int length, int use_sg, int *residual);
+               void *buf, unsigned int length, struct scatterlist *sg,
+               int use_sg, int *residual);
 
 extern int usb_stor_port_reset(struct us_data *us);
 #endif
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to