This patch updates the shuttle-usbat driver to be scatter-gather safe. Greg, please apply.
Matt ----- Forwarded message from Alan Stern <[EMAIL PROTECTED]> ----- Date: Mon, 24 Nov 2003 16:31:35 -0500 (EST) From: Alan Stern <[EMAIL PROTECTED]> Subject: PATCH: (as147) Update scatter-gather handling in the shuttle-usbat driver To: Matthew Dharm <[EMAIL PROTECTED]> cc: USB Storage List <[EMAIL PROTECTED]> X-Spam-Status: No, hits=-4.0 required=5.0 tests=UNIFIED_PATCH,RCVD_IN_ORBZ version=2.11 Matt: This patch updates the shuttle_usbat driver to use the new scatter-gather transfer routines. The small set of changes needed speaks well for the original organization of the code. This has not been tested. Alan Stern ===== shuttle_usbat.c 1.24 vs edited ===== --- 1.24/drivers/usb/storage/shuttle_usbat.c Mon Aug 4 13:47:08 2003 +++ edited/drivers/usb/storage/shuttle_usbat.c Mon Nov 24 16:19:30 2003 @@ -40,7 +40,6 @@ */ #include "transport.h" -#include "raw_bulk.h" #include "protocol.h" #include "usb.h" #include "debug.h" @@ -529,9 +528,8 @@ unsigned char *buffer; unsigned int len; unsigned int sector; - struct scatterlist *sg = NULL; - int sg_segment = 0; - int sg_offset = 0; + unsigned int sg_segment = 0; + unsigned int sg_offset = 0; US_DEBUGP("handle_read10: transfersize %d\n", srb->transfersize); @@ -572,19 +570,20 @@ len = (65535/srb->transfersize) * srb->transfersize; US_DEBUGP("Max read is %d bytes\n", len); - buffer = kmalloc(len, GFP_NOIO); - if (buffer == NULL) // bloody hell! - return USB_STOR_TRANSPORT_FAILED; + len = min(len, srb->request_bufflen); + if (srb->use_sg) { + buffer = kmalloc(len, GFP_NOIO); + if (buffer == NULL) // bloody hell! + return USB_STOR_TRANSPORT_FAILED; + } else + buffer = srb->request_buffer; sector = short_pack(data[7+3], data[7+2]); sector <<= 16; sector |= short_pack(data[7+5], data[7+4]); transferred = 0; - if (srb->use_sg) { - sg = (struct scatterlist *)srb->request_buffer; - sg_segment = 0; // for keeping track of where we are in - sg_offset = 0; // the scatter/gather list - } + sg_segment = 0; // for keeping track of where we are in + sg_offset = 0; // the scatter/gather list while (transferred != srb->request_bufflen) { @@ -618,10 +617,10 @@ // Transfer the received data into the srb buffer if (srb->use_sg) - us_copy_to_sgbuf(buffer, len, sg, - &sg_segment, &sg_offset, srb->use_sg); + usb_stor_access_xfer_buf(buffer, len, srb, + &sg_segment, &sg_offset, TO_XFER_BUF); else - memcpy(srb->request_buffer+transferred, buffer, len); + buffer += len; // Update the amount transferred and the sector number @@ -630,7 +629,8 @@ } // while transferred != srb->request_bufflen - kfree(buffer); + if (srb->use_sg) + kfree(buffer); return result; } ----- End forwarded message ----- -- Matthew Dharm Home: [EMAIL PROTECTED] Maintainer, Linux USB Mass Storage Driver S: Another stupid question? G: There's no such thing as a stupid question, only stupid people. -- Stef and Greg User Friendly, 7/15/1998
pgp00000.pgp
Description: PGP signature