From: Greg KH To: torvalds@transmeta.com Cc: linux-usb-devel@lists.sourceforge.net Subject: [BK PATCH] USB changes for 2.5.15 This includes 8 new changesets from the last round that I posted. Pull from: bk://linuxusb.bkbits.net/linus-2.5 drivers/usb/core/hcd.c | 7 drivers/usb/core/hcd.h | 3 drivers/usb/core/hub.c | 99 + drivers/usb/core/hub.h | 28 drivers/usb/core/usb.c | 119 + drivers/usb/host/Config.in | 15 drivers/usb/host/Makefile | 5 drivers/usb/host/ehci-hcd.c | 97 - drivers/usb/host/ehci-q.c | 19 drivers/usb/host/uhci-debug.c | 580 +++++++ drivers/usb/host/uhci-hcd.c | 2633 ++++++++++++++++++++++++++++++++++++ drivers/usb/host/uhci-hcd.h | 389 +++++ drivers/usb/host/uhci-hub.c | 184 ++ drivers/usb/host/uhci.c | 104 - drivers/usb/host/uhci.h | 6 drivers/usb/host/usb-ohci.c | 24 drivers/usb/host/usb-uhci-dbg.c | 151 ++ drivers/usb/host/usb-uhci-hcd.c | 645 ++++++++ drivers/usb/host/usb-uhci-hcd.h | 247 +++ drivers/usb/host/usb-uhci-hub.c | 213 ++ drivers/usb/host/usb-uhci-mem.c | 722 +++++++++ drivers/usb/host/usb-uhci-q.c | 1320 ++++++++++++++++++ drivers/usb/host/usb-uhci.c | 14 drivers/usb/media/usbvideo.c | 4 drivers/usb/net/cdc-ether.c | 4 drivers/usb/net/pegasus.c | 4 drivers/usb/net/usbnet.c | 4 drivers/usb/storage/Config.help | 4 drivers/usb/storage/Config.in | 1 drivers/usb/storage/Makefile | 1 drivers/usb/storage/datafab.c | 40 drivers/usb/storage/debug.c | 11 drivers/usb/storage/freecom.c | 2 drivers/usb/storage/isd200.c | 364 ++-- drivers/usb/storage/jumpshot.c | 45 drivers/usb/storage/protocol.c | 68 drivers/usb/storage/scsiglue.c | 159 +- drivers/usb/storage/sddr09.c | 33 drivers/usb/storage/sddr55.c | 1135 +++++++++++++++ drivers/usb/storage/sddr55.h | 34 drivers/usb/storage/shuttle_usbat.c | 25 drivers/usb/storage/transport.c | 583 +++++-- drivers/usb/storage/transport.h | 8 drivers/usb/storage/unusual_devs.h | 96 + drivers/usb/storage/usb.c | 84 - drivers/usb/storage/usb.h | 27 include/linux/usb.h | 78 - 47 files changed, 9589 insertions(+), 849 deletions(-) ------ ChangeSet@1.556, 2002-05-17 13:55:50-07:00, greg@kroah.com [PATCH] USB - Host controller Config.in changes - Commented out the usb-ohci driver. This is part of the migration away from this driver, to the ohci-hcd driver. - Prevented the two UHCI_HCD drivers from both being compiled into the kernel at the same time. drivers/usb/host/Config.in | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) ------ ChangeSet@1.555, 2002-05-17 13:55:34-07:00, greg@kroah.com [PATCH] USB - fix a compiler warning in the core code This removes a compiler warning due to my previous patch. drivers/usb/core/usb.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) ------ ChangeSet@1.554, 2002-05-17 09:58:38-07:00, greg@kroah.com USB Config.in and Makefile fixups fixed up the Config.in and Makefile merge due to there being 2 uhci-hcd drivers added at once. drivers/usb/host/Config.in | 3 ++- drivers/usb/host/Makefile | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) ------ ChangeSet@1.553, 2002-05-17 09:48:54-07:00, acher@in.tum.de [PATCH] USB-UHCI-HCD After maturing for more than a month, I decided that it's enough... So here's the patch for the HCD-version of usb-uhci, I called it usb-uhci-hcd. For me, the usual devices work (TM). Since the internals haven't changed much, I don't expect much difference to usb-uhci in functionality and performance. There is one major improvement: I've added a (preliminary) watchdog, that regularly checks whether UHCI interrupts are coming through. If they are "missing", ie. the HC halted without saying so, the HC is "re-animated" by a real and clean restart, which is (internally) equivalent to a module-reload. This is especially for VIA-chips which get comatose quite easily by babble or other incorrect transfers. The side effect is, of course, disconnects for all connected devices, but they re-appear after a few seconds and were dead before anyway. So keyboard and mouse work again, which is IMO a _very_ useful thing :-) Another point: The watchdog (currently with moderate 8 interrupts/s) detects IRQ-problems, so the misleading "device doesn't accept new device"-message is replaced by an immediate error. More comments and the separation into multiple files (I've taken ohci-hcd as an example) should make the code more concise... A few things are still on the todo-list and will come later: - A few watchdog modifications (fewer interrupts, better diagnostics) - Support for module "tune"-parameters for breadth/depth search, debug etc. - interval support for ISO - More SMP-tests - maybe changes for reference counting when it is clear what survives :-) drivers/usb/host/usb-uhci-dbg.c | 151 ++++ drivers/usb/host/usb-uhci-hcd.c | 645 +++++++++++++++++++ drivers/usb/host/usb-uhci-hcd.h | 247 +++++++ drivers/usb/host/usb-uhci-hub.c | 213 ++++++ drivers/usb/host/usb-uhci-mem.c | 722 +++++++++++++++++++++ drivers/usb/host/usb-uhci-q.c | 1320 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 3298 insertions(+) ------ ChangeSet@1.552, 2002-05-16 15:40:19-07:00, greg@kroah.com Change to the USB core to retry failed devices on startup. Based on a patch from Georg Acher drivers/usb/core/usb.c | 36 ++++++++++++++++++++++++++---------- 1 files changed, 26 insertions(+), 10 deletions(-) ------ ChangeSet@1.551, 2002-05-16 11:50:50-07:00, johannes@erdfelt.com [PATCH] 2.4.19-pre8 uhci.c incorrect bit operations Woops, I sent the wrong version. There was one extra line that was required. drivers/usb/host/uhci.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) ------ ChangeSet@1.550, 2002-05-16 11:50:34-07:00, johannes@erdfelt.com [PATCH] 2.4.19-pre8 uhci.c incorrect bit operations This fixes up a couple of problems I came across while working on uhci-hcd. There are a couple of places where shifts are used where they shouldn't be and others where should be. This cleans up a couple of cases and tidys it up. The patch is relative to 2.4.19-pre8 and my other patches, but it's alright to wait for 2.4.20. It should also be applied to 2.5. drivers/usb/host/uhci.c | 18 +++++++++--------- drivers/usb/host/uhci.h | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) ------ ChangeSet@1.549, 2002-05-16 11:09:10-07:00, johannes@erdfelt.com [PATCH] uhci-hcd for 2.5.15 So I finally hunkered down and got uhci-hcd working. I was surprised how easy it was to make the modifications for hcd.c. This patch has received a moderate amount of testing so far. I've played with various devices and haven't had any problems. I won't claim it's bug free yet and I'll continue doing more testing. The patch includes a small change to hcd.c to not call free_config if the HCD doesn't implement it. There are some other messages that get printed such as: hcd.c: usb_hcd_pci_remove 00:10.0, count != 1 but it appears from the code that this is just a soft warning that all of the references to the bus aren't freed yet. This isn't a bug. Differences from usb-uhci/usb-uhci-hcd: - Cleaner code. uhci-hcd is based off of uhci, so it maintains the same look and feel as well as readability. - Faster. The tests I've run so far show that uhci-hcd is faster in every case than usb-uhci-hcd - It does not have the watchdog type feature for VIA chipsets. It's something that is definately possible to implement, but I'd like to find out what Windows does first. Differences from uhci: - Modified to use the hcd.c framework. This removed a significant amount of code and nesessitated lots of little changes. - Big endian support. I haven't been able to test it on a big endian machine yet, but atleast 90+% of the work should be done. Once I get my PowerPC working again, I'll test this and submit any appropriate patches. This was the biggest functional change between uhci.c. - No more urb->next processing. Completely ripped out. - urb->interval support for Isochronous pipes. - A couple of bug fixes for some problems I noticed while working on the code. These will be submitted for uhci.c in a seperate email. drivers/usb/core/hcd.c | 3 drivers/usb/host/Config.in | 2 drivers/usb/host/Makefile | 2 drivers/usb/host/uhci-debug.c | 580 +++++++++ drivers/usb/host/uhci-hcd.c | 2633 ++++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/uhci-hcd.h | 389 ++++++ drivers/usb/host/uhci-hub.c | 184 ++ 7 files changed, 3790 insertions(+), 3 deletions(-) ------ ChangeSet@1.548, 2002-05-13 15:51:10-07:00, greg@kroah.com USB sddr55 minor patch to enable a MDSM-B reader This was forgotten in the previous sddr55 patch import, and is needed to support the MDSM-B reader devices. Thanks to Andries.Brouwer@cwi.nl for the 2.4.x version of the patch. drivers/usb/storage/unusual_devs.h | 9 +++++++++ 1 files changed, 9 insertions(+) ------ ChangeSet@1.547, 2002-05-13 14:52:23-07:00, greg@kroah.com [PATCH] USB device reference counting api cleanup changes This patch replaces the awkwardly named usb_inc_dev_use() and usb_dec_dev_use() with usb_get_dev() and usb_put_dev() to match the naming convention of the rest of the kernel's reference counted structures. It also does away with the special case of usb_free_dev(), and has usb_put_dev() be the same thing (through a #define, just like usb_free_urb() works.) Now when the last person calls usb_put_dev() or usb_free_dev() the structure is cleaned up. This allows the different host controller drivers to implement their logic differently if they want to (as they do), and everyone can be happy and stop arguing about the "proper" way to write their host controller drivers :) drivers/usb/core/hcd.c | 4 ++-- drivers/usb/core/usb.c | 43 +++++++++++++++++++++++++++++++++++-------- drivers/usb/host/uhci.c | 14 +++++++------- drivers/usb/host/usb-ohci.c | 24 ++++++++++++------------ drivers/usb/host/usb-uhci.c | 14 +++++++------- drivers/usb/media/usbvideo.c | 4 ++-- drivers/usb/net/cdc-ether.c | 4 ++-- drivers/usb/net/pegasus.c | 4 ++-- drivers/usb/net/usbnet.c | 4 ++-- drivers/usb/storage/usb.c | 20 ++++++++++---------- include/linux/usb.h | 34 +++------------------------------- 11 files changed, 84 insertions(+), 85 deletions(-) ------ ChangeSet@1.546, 2002-05-13 14:48:22-07:00, johannes@erdfelt.com [PATCH] USB device reference counting fix for uhci.c and usb core Earlier in the 2.5 development cycle a patch was applied that changed the reference counting behaviour for USB devices. There are a couple of problems with the change: - It made the USB code more complicated as a whole with the introduction of an additional cleanup path for devices. Using the traditional method of reference counting, cleanup is handled implictly - It reduces functionality by requiring a callback for all references to the device, but doesn't provide a method of providing callbacks for references. It relies on the hardcoded device driver ->disconnect and HCD ->deallocate method for callbacks The traditional method of using reference counting supports as many reference users as needed, without complicating it with mandatory callbacks to cleanup references. The change in 2.5 also only helps catch one subset of programming problem in device drivers, the case where it decrements too many times. That is of dubious debugging value. So, this patch reverts the change and makes the reference counting behave like it does in the rest of the kernel as well as how the USB code does in 2.4. This patch doesn't remove all of the superfluous code. Some drivers, like usb-ohci, ohci-hcd and ehci-hcd have some code that is no longer needed. I wanted to spend some more time with those drivers since the changes weren't as trivial as uhci.c and usb-uhci.c. I've tested with uhci and usb-ohci with no adverse effects. drivers/usb/core/hcd.h | 3 --- drivers/usb/core/usb.c | 20 +++++++------------- drivers/usb/host/uhci.c | 15 --------------- include/linux/usb.h | 25 +++++++------------------ 4 files changed, 14 insertions(+), 49 deletions(-) ------ ChangeSet@1.545, 2002-05-13 14:48:05-07:00, greg@kroah.com [PATCH] usb_submit_urb fix for broken usb devices added check for wMaxPacketSize of 0, which is a messed up device, but seems to be legal according to the USB spec. Thanks to Johannes for figuring out the problem, and providing an original version of this patch. drivers/usb/core/usb.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) ------ ChangeSet@1.544, 2002-05-13 14:25:19-07:00, manfred@colorfullife.com [PATCH] usb-storage locking fixes I found several SMP and UP locking errors in usb-storage, attached is a patch: Changes: * srb->result is a bitfield, several << 1 were missing. * add scsi_lock calls around midlayer calls, release the lock before calling usb functions that might sleep. * replace the queue semaphore with a queue spinlocks, queuecommand is called from bh context. drivers/usb/storage/datafab.c | 2 +- drivers/usb/storage/isd200.c | 2 +- drivers/usb/storage/jumpshot.c | 2 +- drivers/usb/storage/scsiglue.c | 26 ++++++++++++++++++++------ drivers/usb/storage/usb.c | 31 +++++++++++++++++-------------- drivers/usb/storage/usb.h | 14 +++++++++++++- 6 files changed, 53 insertions(+), 24 deletions(-) ------ ChangeSet@1.543, 2002-05-11 22:18:37-07:00, greg@kroah.com USB storage added Sandisk SDDR-55 driver from Simon Munton drivers/usb/storage/Config.help | 4 drivers/usb/storage/Config.in | 1 drivers/usb/storage/Makefile | 1 drivers/usb/storage/sddr55.c | 1135 +++++++++++++++++++++++++++++++++++++ drivers/usb/storage/sddr55.h | 34 + drivers/usb/storage/transport.h | 3 drivers/usb/storage/unusual_devs.h | 8 drivers/usb/storage/usb.c | 12 8 files changed, 1198 insertions(+) ------ ChangeSet@1.542, 2002-05-11 22:05:14-07:00, greg@kroah.com USB storage drivers fix for scsi memory address changes. Now the datafab and jumpshot drivers build properly. drivers/usb/storage/datafab.c | 8 ++++---- drivers/usb/storage/jumpshot.c | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) ------ ChangeSet@1.541, 2002-05-11 22:04:21-07:00, greg@kroah.com USB storage fixed typo in variable name. drivers/usb/storage/shuttle_usbat.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) ------ ChangeSet@1.540, 2002-05-11 21:48:09-07:00, greg@kroah.com USB storage sync up with both the -dj and cvs version of the usb-storage code. drivers/usb/storage/datafab.c | 30 + drivers/usb/storage/debug.c | 11 drivers/usb/storage/freecom.c | 2 drivers/usb/storage/isd200.c | 362 ++++++++++------------ drivers/usb/storage/jumpshot.c | 35 +- drivers/usb/storage/protocol.c | 68 ++-- drivers/usb/storage/scsiglue.c | 133 +++----- drivers/usb/storage/sddr09.c | 33 -- drivers/usb/storage/shuttle_usbat.c | 23 - drivers/usb/storage/transport.c | 583 ++++++++++++++++++++++-------------- drivers/usb/storage/transport.h | 5 drivers/usb/storage/unusual_devs.h | 79 ++++ drivers/usb/storage/usb.c | 21 - drivers/usb/storage/usb.h | 13 14 files changed, 832 insertions(+), 566 deletions(-) ------ ChangeSet@1.539, 2002-05-11 21:16:49-07:00, johannes@erdfelt.com [PATCH] uhci.c FSBR timeout There was a discussion a long time ago about how safe the bit operations were as well as recently. set_bit/clear_bit are not safe on x86 UP, nor are they safe on other architectures. It's also unclear from the UHCI spec if the HC's are safe with respect to atomic updates to the status field. This patch ditches all of the uses of set_bit and clear_bit and changes the algorithm that depended on it. The FSBR timeout algorithm would reenable FSBR for transfers when they started making progress again. So instead of trying for this best case, we convert the transfer over to depth first from the standard breadth first. To make sure the transfer doesn't hog all of the bandwidth, every 5th TD is left in breadth first mode. This will ensure other transfers get some bandwidth. It's not perfect, but I think it's a good compromise. Note: td->info is read only by the HC, so we can touch it whenever we want. drivers/usb/host/uhci.c | 57 +++++++++++++++++++++++++++--------------------- 1 files changed, 33 insertions(+), 24 deletions(-) ------ ChangeSet@1.538, 2002-05-11 21:16:35-07:00, david-b@pacbell.net [PATCH] -- hub/tt error recovery This patch adds missing functionality to the transaction translator support for USB 2.0 hubs: - moves the 'struct usb_tt' definition to "hub.h" from - adds state to it as neeed for some control/bulk error recovery - teaches the hub driver how to use that state (via keventd) - adds a call letting HCDs trigger that recovery drivers/usb/core/hub.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ drivers/usb/core/hub.h | 28 +++++++++++++ drivers/usb/core/usb.c | 7 +-- include/linux/usb.h | 19 +-------- 4 files changed, 133 insertions(+), 20 deletions(-) ------ ChangeSet@1.537, 2002-05-11 21:16:19-07:00, david-b@pacbell.net [PATCH] -- ehci misc FIXMEs This addresses FIXME comments in the EHCI code, notably: - telling the hub driver to clear up TT error state (relies on the hub error recovery patch I just sent) - using 64bit PCI DMA where appropriate - handling BIOS handoff as neeed except that the repository that you are pushing to is 45 changesets ahead of your repository. Please do a "bk pull" to get these changes or do a "bk pull -nl" to see what they are. drivers/usb/host/ehci-hcd.c | 97 +++++++++++++++++++++++++++++++------------- drivers/usb/host/ehci-q.c | 19 ++++---- 2 files changed, 78 insertions(+), 38 deletions(-) ------