lkml.org 
[lkml]   [2001]   [Sep]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectPATCH: usb-storage: 3 of 3
Attached is a patch to usb-storage.  Linus, please apply.

This patch does the following:
(o) Keeps CVS versions in the kernel in sync with mine (the min() changes
forced this one).
(o) A one-line fix to the (experimental) sddr-09 driver.
(o) Switch much of transport.c to use the new struct completion. This
shows a slight performance gain (less CPU used) and eliminates some bug
reports. I don't know what was wrong with the old code, but this new
code is clearly correct and works better, anyway.
(o) Adds a few unusual device entries, removes a bogus entry, and fixes a
comment in the same file.

Matt Dharm

--
Matthew Dharm Home: mdharm-usb@one-eyed-alien.net
Maintainer, Linux USB Mass Storage Driver

E: You run this ship with Windows?! YOU IDIOT!
L: Give me a break, it came bundled with the computer!
-- ESR and Lan Solaris
User Friendly, 12/8/1998
diff -u -X ../dontdiff drivers/usb/storage.old/scsiglue.c drivers/usb/storage/scsiglue.c
--- drivers/usb/storage.old/scsiglue.c Sun Aug 12 13:54:53 2001
+++ drivers/usb/storage/scsiglue.c Sat Sep 1 21:29:27 2001
@@ -1,7 +1,7 @@
/* Driver for USB Mass Storage compliant devices
* SCSI layer glue code
*
- * $Id: scsiglue.c,v 1.21 2001/07/29 23:41:52 mdharm Exp $
+ * $Id: scsiglue.c,v 1.22 2001/09/02 04:29:27 mdharm Exp $
*
* Current development and maintenance by:
* (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
diff -u -X ../dontdiff drivers/usb/storage.old/sddr09.c drivers/usb/storage/sddr09.c
--- drivers/usb/storage.old/sddr09.c Sun Jul 29 21:11:50 2001
+++ drivers/usb/storage/sddr09.c Sat Sep 1 23:07:20 2001
@@ -1,6 +1,6 @@
/* Driver for SanDisk SDDR-09 SmartMedia reader
*
- * $Id: sddr09.c,v 1.18 2001/06/11 02:54:25 mdharm Exp $
+ * $Id: sddr09.c,v 1.19 2001/09/02 06:07:20 mdharm Exp $
*
* SDDR09 driver v0.1:
*
@@ -693,7 +693,7 @@
// scatterlist block i*64/128k = i*(2^6)*(2^-17) = i*(2^-11)

for (i=0; i<numblocks; i++) {
- ptr = sg[i>>11].address+(i<<6);
+ ptr = sg[i>>11].address+((i&0x7ff)<<6);
if (ptr[0]!=0xFF || ptr[1]!=0xFF || ptr[2]!=0xFF ||
ptr[3]!=0xFF || ptr[4]!=0xFF || ptr[5]!=0xFF) {
US_DEBUGP("PBA %04X has no logical mapping: reserved area = "
diff -u -X ../dontdiff drivers/usb/storage.old/transport.c drivers/usb/storage/transport.c
--- drivers/usb/storage.old/transport.c Sun Jul 29 21:11:50 2001
+++ drivers/usb/storage/transport.c Sat Aug 18 01:37:46 2001
@@ -1,6 +1,6 @@
/* Driver for USB Mass Storage compliant devices
*
- * $Id: transport.c,v 1.39 2001/03/10 16:46:28 zagor Exp $
+ * $Id: transport.c,v 1.40 2001/08/18 08:37:46 mdharm Exp $
*
* Current development and maintenance by:
* (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
@@ -371,10 +371,9 @@
*/
static void usb_stor_blocking_completion(urb_t *urb)
{
- wait_queue_head_t *wqh_ptr = (wait_queue_head_t *)urb->context;
+ struct completion *urb_done_ptr = (struct completion *)urb->context;

- if (waitqueue_active(wqh_ptr))
- wake_up(wqh_ptr);
+ complete(urb_done_ptr);
}

/* This is our function to emulate usb_control_msg() but give us enough
@@ -384,8 +383,7 @@
u8 request, u8 requesttype, u16 value, u16 index,
void *data, u16 size)
{
- wait_queue_head_t wqh;
- wait_queue_t wait;
+ struct completion urb_done;
int status;
devrequest *dr;

@@ -402,9 +400,7 @@
dr->length = cpu_to_le16(size);

/* set up data structures for the wakeup system */
- init_waitqueue_head(&wqh);
- init_waitqueue_entry(&wait, current);
- add_wait_queue(&wqh, &wait);
+ init_completion(&urb_done);

/* lock the URB */
down(&(us->current_urb_sem));
@@ -412,33 +408,25 @@
/* fill the URB */
FILL_CONTROL_URB(us->current_urb, us->pusb_dev, pipe,
(unsigned char*) dr, data, size,
- usb_stor_blocking_completion, &wqh);
+ usb_stor_blocking_completion, &urb_done);
us->current_urb->actual_length = 0;
us->current_urb->error_count = 0;
us->current_urb->transfer_flags = USB_ASYNC_UNLINK;

/* submit the URB */
- set_current_state(TASK_UNINTERRUPTIBLE);
status = usb_submit_urb(us->current_urb);
if (status) {
/* something went wrong */
up(&(us->current_urb_sem));
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&wqh, &wait);
kfree(dr);
return status;
}

/* wait for the completion of the URB */
up(&(us->current_urb_sem));
- while (us->current_urb->status == -EINPROGRESS)
- schedule();
+ wait_for_completion(&urb_done);
down(&(us->current_urb_sem));

- /* we either timed out or got woken up -- clean up either way */
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&wqh, &wait);
-
/* return the actual length of the data transferred if no error*/
status = us->current_urb->status;
if (status >= 0)
@@ -456,45 +444,34 @@
int usb_stor_bulk_msg(struct us_data *us, void *data, int pipe,
unsigned int len, unsigned int *act_len)
{
- wait_queue_head_t wqh;
- wait_queue_t wait;
+ struct completion urb_done;
int status;

/* set up data structures for the wakeup system */
- init_waitqueue_head(&wqh);
- init_waitqueue_entry(&wait, current);
- add_wait_queue(&wqh, &wait);
+ init_completion(&urb_done);

/* lock the URB */
down(&(us->current_urb_sem));

/* fill the URB */
FILL_BULK_URB(us->current_urb, us->pusb_dev, pipe, data, len,
- usb_stor_blocking_completion, &wqh);
+ usb_stor_blocking_completion, &urb_done);
us->current_urb->actual_length = 0;
us->current_urb->error_count = 0;
us->current_urb->transfer_flags = USB_ASYNC_UNLINK;

/* submit the URB */
- set_current_state(TASK_UNINTERRUPTIBLE);
status = usb_submit_urb(us->current_urb);
if (status) {
/* something went wrong */
up(&(us->current_urb_sem));
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&wqh, &wait);
return status;
}

/* wait for the completion of the URB */
up(&(us->current_urb_sem));
- while (us->current_urb->status == -EINPROGRESS)
- schedule();
+ wait_for_completion(&urb_done);
down(&(us->current_urb_sem));
-
- /* we either timed out or got woken up -- clean up either way */
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&wqh, &wait);

/* return the actual length of the data transferred */
*act_len = us->current_urb->actual_length;
diff -u -X ../dontdiff drivers/usb/storage.old/unusual_devs.h drivers/usb/storage/unusual_devs.h
--- drivers/usb/storage.old/unusual_devs.h Sat Sep 1 21:25:09 2001
+++ drivers/usb/storage/unusual_devs.h Sat Sep 1 22:31:11 2001
@@ -1,7 +1,7 @@
/* Driver for USB Mass Storage compliant devices
* Ununsual Devices File
*
- * $Id: unusual_devs.h,v 1.16 2001/07/30 00:27:59 mdharm Exp $
+ * $Id: unusual_devs.h,v 1.20 2001/09/02 05:12:57 mdharm Exp $
*
* Current development and maintenance by:
* (c) 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net)
@@ -68,6 +68,19 @@
US_FL_START_STOP ),
#endif

+/* Made with the help of Edd Dumbill <edd@usefulinc.com> */
+UNUSUAL_DEV( 0x0451, 0x5409, 0x0001, 0x0001,
+ "Frontier Labs",
+ "Nex II Digital",
+ US_SC_SCSI, US_PR_BULK, NULL, US_FL_START_STOP),
+
+/* Reported by Paul Stewart <stewart@wetlogic.net>
+ * This entry is needed because the device reports Sub=ff */
+UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001,
+ "Hitachi",
+ "DVD-CAM DZ-MV100A Camcorder",
+ US_SC_SCSI, US_PR_CB, NULL, US_FL_SINGLE_LUN),
+
UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210,
"Fujifilm",
"FinePix 1400Zoom",
@@ -155,13 +168,20 @@
US_SC_SCSI, US_PR_CB, NULL,
US_FL_SINGLE_LUN | US_FL_START_STOP | US_FL_MODE_XLATE ),

+/* Reported by win@geeks.nl */
+UNUSUAL_DEV( 0x054c, 0x0025, 0x0100, 0x0100,
+ "Sony",
+ "Memorystick NW-MS7",
+ US_SC_UFI, US_PR_CB, NULL,
+ US_FL_SINGLE_LUN | US_FL_START_STOP ),
+
UNUSUAL_DEV( 0x054c, 0x002d, 0x0100, 0x0100,
"Sony",
"Memorystick MSAC-US1",
US_SC_UFI, US_PR_CB, NULL,
US_FL_SINGLE_LUN | US_FL_START_STOP ),

-/* Submitted by Klaus Mueller <k.mueller@intership.de> */
+/* Submitted by Klaus Mueller <k.mueller@intershop.de> */
UNUSUAL_DEV( 0x054c, 0x002e, 0x0106, 0x0310,
"Sony",
"Handycam",
@@ -195,12 +215,6 @@
UNUSUAL_DEV( 0x05ab, 0x0031, 0x0100, 0x0110,
"In-System",
"USB/IDE Bridge (ATA/ATAPI)",
- US_SC_ISD200, US_PR_BULK, isd200_Initialization,
- 0 ),
-
-UNUSUAL_DEV( 0x05ab, 0x0060, 0x0100, 0x0110,
- "In-System",
- "USB 2.0/IDE Bridge (ATA/ATAPI)",
US_SC_ISD200, US_PR_BULK, isd200_Initialization,
0 ),
[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2005-03-22 13:01    [W:0.033 / U:0.016 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site