1 diff -urNp linux-2331/drivers/usb/storage/unusual_devs.h linux-2340/drivers/usb/storage/unusual_devs.h
2 --- linux-2331/drivers/usb/storage/unusual_devs.h
3 +++ linux-2340/drivers/usb/storage/unusual_devs.h
4 @@ -137,6 +137,12 @@ UNUSUAL_DEV( 0x04da, 0x0901, 0x0100, 0x
6 US_SC_UFI, US_PR_CBI, NULL, 0),
8 +/* From Yukihiro Nakai, via zaitcev@yahoo.com. */
9 +UNUSUAL_DEV( 0x04da, 0x0d05, 0x0000, 0x0000,
12 + US_SC_8070, US_PR_CB, NULL, 0),
14 /* Most of the following entries were developed with the help of
15 * Shuttle/SCM directly.
17 @@ -404,7 +404,7 @@ UNUSUAL_DEV( 0x0781, 0x0002, 0x0009, 0x
20 US_SC_SCSI, US_PR_BULK, NULL,
22 + US_FL_IGNORE_SER | US_FL_START_CHECK ),
24 UNUSUAL_DEV( 0x0781, 0x0100, 0x0100, 0x0100,
26 diff -urNp linux-1620/drivers/usb/storage/usb.c linux-2310/drivers/usb/storage/usb.c
27 --- linux-1620/drivers/usb/storage/usb.c
28 +++ linux-2310/drivers/usb/storage/usb.c
29 @@ -453,6 +453,20 @@ static int usb_stor_control_thread(void
30 US_DEBUGP("Faking INQUIRY command\n");
31 fill_inquiry_response(us, data_ptr, 36);
32 us->srb->result = GOOD << 1;
33 + } else if ((us->srb->cmnd[0] == START_STOP) &&
34 + (us->flags & US_FL_START_CHECK)) {
35 + unsigned char saved_cdb[6];
37 + /* Handle those devices which fake
38 + * START_STOP on us, this confuses
39 + * the hell out of media check code. */
40 + US_DEBUGP("Convering START_STOP command\n");
41 + memcpy(saved_cdb, us->srb->cmnd, 6);
42 + memset(us->srb->cmnd, 0, 6);
43 + us->srb->cmnd[0] = TEST_UNIT_READY;
44 + US_DEBUG(usb_stor_show_command(us->srb));
45 + us->proto_handler(us->srb, us);
46 + memcpy(us->srb->cmnd, saved_cdb, 6);
48 /* we've got a command, let's do it! */
49 US_DEBUG(usb_stor_show_command(us->srb));
50 diff -urNp linux-1620/drivers/usb/storage/usb.h linux-2310/drivers/usb/storage/usb.h
51 --- linux-1620/drivers/usb/storage/usb.h
52 +++ linux-2310/drivers/usb/storage/usb.h
53 @@ -98,6 +98,7 @@ struct us_unusual_dev {
54 #define US_FL_MODE_XLATE 0x00000002 /* translate _6 to _10 commands for
55 Win/MacOS compatibility */
56 #define US_FL_START_STOP 0x00000004 /* ignore START_STOP commands */
57 +#define US_FL_START_CHECK 0x00000008 /* START_STOP => TEST UNIT READY */
58 #define US_FL_IGNORE_SER 0x00000010 /* Ignore the serial number given */
59 #define US_FL_SCM_MULT_TARG 0x00000020 /* supports multiple targets */
60 #define US_FL_FIX_INQUIRY 0x00000040 /* INQUIRY response needs fixing */
61 --- linux-2.4.19/drivers/usb/usb-ohci.c 2002-08-02 17:39:45.000000000 -0700
62 +++ linux-2.4.19-p3/drivers/usb/usb-ohci.c 2002-10-23 14:22:24.000000000 -0700
63 @@ -2165,7 +2165,19 @@
65 /* Reset USB (needed by some controllers) */
66 writel (0, &ohci->regs->control);
70 + * Work around lockups in IBM i1200/i1300. We victimize all similar ALi
71 + * motherboards in the process, but it does not hurt them.
72 + * Fix from Alex T. H. Chou @ALi.
74 + if (ohci->ohci_dev->vendor == PCI_VENDOR_ID_AL &&
75 + ohci->ohci_dev->device == PCI_DEVICE_ID_AL_M5237) {
76 + /* Force a state change from USBRESET to USBOPERATIONAL */
77 + (void) readl (&ohci->regs->control); /* PCI posting above */
78 + writel (ohci->hc_control = OHCI_USB_OPER, &ohci->regs->control);
81 /* HC Reset requires max 10 ms delay */
82 writel (OHCI_HCR, &ohci->regs->cmdstatus);
83 while ((readl (&ohci->regs->cmdstatus) & OHCI_HCR) != 0) {
84 diff -urNp linux-2310/drivers/usb/inode.c linux-2330/drivers/usb/inode.c
85 --- linux-2310/drivers/usb/inode.c
86 +++ linux-2330/drivers/usb/inode.c
87 @@ -102,6 +102,27 @@ static void new_dev_inode(struct usb_dev
88 printk(KERN_ERR "usbdevfs: cannot create inode for bus %u device %u\n", busnum, devnum);
91 + if (inode->u.usbdev_i.slist.next != NULL) {
93 + * We are on the list already. This is not supposed to happen.
94 + * The suspicion is that anaconda races khubd (we always get
95 + * here at khubd context from usbdevfs_add_device, with dev
96 + * pointer set correctly, even though khubd kmalloc's it).
98 + if (inode->u.usbdev_i.p.dev != NULL &&
99 + inode->u.usbdev_i.p.dev != dev) {
100 + printk(KERN_WARNING
101 + "usbdevfs: confused by inode %d(0x%x)\n",
102 + (int) inode->i_ino, (int) inode->i_ino);
104 + if (inode->i_fop != &usbdevfs_device_file_operations) {
105 + printk(KERN_WARNING
106 + "usbdevfs: lost fops in inode %d(0x%x)\n",
107 + (int) inode->i_ino, (int) inode->i_ino);
108 + inode->i_fop = &usbdevfs_device_file_operations;
112 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
113 inode->i_uid = sb->u.usbdevfs_sb.devuid;
114 inode->i_gid = sb->u.usbdevfs_sb.devgid;
115 @@ -158,9 +179,7 @@ static void free_inode(struct inode *ino
116 inode->i_uid = inode->i_gid = 0;
118 list_del(&inode->u.usbdev_i.slist);
119 - INIT_LIST_HEAD(&inode->u.usbdev_i.slist);
120 list_del(&inode->u.usbdev_i.dlist);
121 - INIT_LIST_HEAD(&inode->u.usbdev_i.dlist);
125 @@ -512,8 +531,6 @@ static void usbdevfs_read_inode(struct i
126 inode->i_ctime = inode->i_mtime = inode->i_atime = CURRENT_TIME;
127 inode->i_mode = S_IFREG;
128 inode->i_gid = inode->i_uid = 0;
129 - INIT_LIST_HEAD(&inode->u.usbdev_i.dlist);
130 - INIT_LIST_HEAD(&inode->u.usbdev_i.slist);
131 inode->u.usbdev_i.p.dev = NULL;
132 inode->u.usbdev_i.p.bus = NULL;
133 switch (ITYPE(inode->i_ino)) {
134 diff -urNp linux-2330/drivers/usb/pegasus.h linux-2331/drivers/usb/pegasus.h
135 --- linux-2330/drivers/usb/pegasus.h
136 +++ linux-2331/drivers/usb/pegasus.h
137 @@ -164,7 +164,7 @@ PEGASUS_DEV( "USB 10/100 Fast Ethernet",
138 PEGASUS_DEV( "Accton USB 10/100 Ethernet Adapter", VENDOR_ACCTON, 0x1046,
140 PEGASUS_DEV( "SpeedStream USB 10/100 Ethernet", VENDOR_ACCTON, 0x5046,
141 - DEFAULT_GPIO_RESET )
142 + DEFAULT_GPIO_RESET | PEGASUS_II )
143 PEGASUS_DEV( "ADMtek ADM8511 \"Pegasus II\" USB Ethernet",
144 VENDOR_ADMTEK, 0x8511,
145 DEFAULT_GPIO_RESET | PEGASUS_II )