aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Neukum <oliver@neukum.org>2008-03-14 03:53:24 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-03-25 01:26:15 -0400
commit4f4f9c53c241a0205434c76d05eba2c5f160e9d0 (patch)
treebdb487c15fb22e4d07101ff77c3fa9b0453a0ab6
parentcc36bdd47ae51b66780b317c1fa519221f894405 (diff)
USB: sierra: dma fixes
while I was adding autosuspend to that driver I noticed a few issues. You were having DMAed buffers as a part of a structure. This will fail on platforms that are not DMA-coherent (arm, sparc, ppc, ...) Please test this patch to fix it. Signed-off-by: Kevin Lloyd <klloyd@sierrawireless.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/usb/serial/sierra.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
index e3d44ae8d448..dda4d05fe237 100644
--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -14,7 +14,7 @@
14 Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org> 14 Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org>
15*/ 15*/
16 16
17#define DRIVER_VERSION "v.1.2.7" 17#define DRIVER_VERSION "v.1.2.8"
18#define DRIVER_AUTHOR "Kevin Lloyd <linux@sierrawireless.com>" 18#define DRIVER_AUTHOR "Kevin Lloyd <linux@sierrawireless.com>"
19#define DRIVER_DESC "USB Driver for Sierra Wireless USB modems" 19#define DRIVER_DESC "USB Driver for Sierra Wireless USB modems"
20 20
@@ -196,9 +196,9 @@ struct sierra_port_private {
196 spinlock_t lock; /* lock the structure */ 196 spinlock_t lock; /* lock the structure */
197 int outstanding_urbs; /* number of out urbs in flight */ 197 int outstanding_urbs; /* number of out urbs in flight */
198 198
199 /* Input endpoints and buffer for this port */ 199 /* Input endpoints and buffers for this port */
200 struct urb *in_urbs[N_IN_URB]; 200 struct urb *in_urbs[N_IN_URB];
201 char in_buffer[N_IN_URB][IN_BUFLEN]; 201 char *in_buffer[N_IN_URB];
202 202
203 /* Settings for the port */ 203 /* Settings for the port */
204 int rts_state; /* Handshaking pins (outputs) */ 204 int rts_state; /* Handshaking pins (outputs) */
@@ -638,6 +638,15 @@ static int sierra_startup(struct usb_serial *serial)
638 return -ENOMEM; 638 return -ENOMEM;
639 } 639 }
640 spin_lock_init(&portdata->lock); 640 spin_lock_init(&portdata->lock);
641 for (j = 0; j < N_IN_URB; j++) {
642 portdata->in_buffer[j] = kmalloc(IN_BUFLEN, GFP_KERNEL);
643 if (!portdata->in_buffer[j]) {
644 for (--j; j >= 0; j--)
645 kfree(portdata->in_buffer[j]);
646 kfree(portdata);
647 return -ENOMEM;
648 }
649 }
641 650
642 usb_set_serial_port_data(port, portdata); 651 usb_set_serial_port_data(port, portdata);
643 652
@@ -681,7 +690,7 @@ static void sierra_shutdown(struct usb_serial *serial)
681 for (j = 0; j < N_IN_URB; j++) { 690 for (j = 0; j < N_IN_URB; j++) {
682 usb_kill_urb(portdata->in_urbs[j]); 691 usb_kill_urb(portdata->in_urbs[j]);
683 usb_free_urb(portdata->in_urbs[j]); 692 usb_free_urb(portdata->in_urbs[j]);
684 portdata->in_urbs[j] = NULL; 693 kfree(portdata->in_buffer[j]);
685 } 694 }
686 kfree(portdata); 695 kfree(portdata);
687 usb_set_serial_port_data(port, NULL); 696 usb_set_serial_port_data(port, NULL);