bk://kernel.bkbits.net/gregkh/linux/usb-2.6 oliver@neukum.org|ChangeSet|20040623224108|17255 oliver # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/06/23 15:41:08-07:00 oliver@neukum.org # [PATCH] USB: another error check in acm # # I overlooked that setting control lines in open can fail. # # - check for error doing control transfers # # Signed-Off-By: Oliver Neukum # Signed-off-by: Vojtech Pavlik # Signed-off-by: Greg Kroah-Hartman # # drivers/usb/class/cdc-acm.c # 2004/06/19 07:37:06-07:00 oliver@neukum.org +4 -1 # USB: another error check in acm # # ChangeSet # 2004/06/23 15:40:17-07:00 oliver@neukum.org # [PATCH] USB: patches to acm driver # # - races with urb->current, union header evaluation, DMA handling # # Signed-off-By: Oliver Neukum # Signed-off-by: Greg Kroah-Hartman # # drivers/usb/class/cdc-acm.h # 2004/06/19 06:59:57-07:00 oliver@neukum.org +13 -1 # USB: patches to acm driver # # drivers/usb/class/cdc-acm.c # 2004/06/19 06:59:57-07:00 oliver@neukum.org +109 -33 # USB: patches to acm driver # # ChangeSet # 2004/06/23 15:39:20-07:00 stern@rowland.harvard.edu # [PATCH] USB: Fail pending URBs in dummy_hcd upon disconnect # # This patch fixes another bug in the dummy_hcd driver. When a gadget # driver unregisters (simulating a device disconnect), dummy_hcd stops the # timer that it uses for processing outstanding URBs. Unfortunately this # means that those URBs will never be given back. The patch lets the timer # continue running; when it expires all the remaining URBs will fail so the # timer won't be reinitialized. # # # # Signed-off-by: Alan Stern # Signed-off-by: Greg Kroah-Hartman # # drivers/usb/gadget/dummy_hcd.c # 2004/06/18 10:09:56-07:00 stern@rowland.harvard.edu +1 -4 # USB: Fail pending URBs in dummy_hcd upon disconnect # # ChangeSet # 2004/06/23 15:38:17-07:00 stern@rowland.harvard.edu # [PATCH] USB: Add logical connect-change notices to the hub driver # # This patch implements the missing functionality necessary to get device # resets working fully. It adds a bit-array of ports with logical # connect-changes pending to the hub structure, so that the hub driver can # recognize that these ports should be treated as though they had # disconnected and re-connected. This is how we will handle devices that # "morph" (i.e., change their descriptors) following a reset, as might # happen with a firmware upload. # # There is also a lot of additional kerneldoc and a few small changes to # some log messages. An important restriction is that usb_reset_device() # will refuse to work if the device is suspended. Trying to reset a # suspended device leads to several problems, not least of which is that the # device's parent hub might be suspended as well. # # With this patch the device reset code is pretty much complete. However it # won't always work correctly until the device locking is straightened out. # That's coming up next. # # # # Signed-off-by: Alan Stern # Signed-off-by: Greg Kroah-Hartman # # drivers/usb/core/hub.h # 2004/06/16 08:25:28-07:00 stern@rowland.harvard.edu +2 -0 # USB: Add logical connect-change notices to the hub driver # # drivers/usb/core/hub.c # 2004/06/18 04:00:26-07:00 stern@rowland.harvard.edu +60 -21 # USB: Add logical connect-change notices to the hub driver # # ChangeSet # 2004/06/22 12:28:34-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # drivers/usb/core/devio.c # 2004/06/22 12:28:30-07:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/06/22 12:28:30-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/20 23:36:26-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # CREDITS # 2004/06/20 23:36:01-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/19 15:38:35-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # arch/ia64/defconfig # 2004/06/19 15:38:31-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/18 12:32:27-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/storage/scsiglue.c # 2004/06/18 12:32:23-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/media/Kconfig # 2004/06/18 12:32:23-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/18 12:31:30-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/06/18 12:31:26-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/storage/scsiglue.c # 2004/06/18 12:31:26-07:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/06/18 12:31:26-07:00 akpm@bix.(none) +0 -0 # Auto merged # # CREDITS # 2004/06/18 12:31:26-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/15 22:24:54-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/06/15 22:24:51-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/13 11:33:57-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/input/hiddev.c # 2004/06/13 11:33:54-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/message.c # 2004/06/13 11:33:54-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/13 11:33:07-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # MAINTAINERS # 2004/06/13 11:33:04-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/10 13:10:48-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/media/pwc-if.c # 2004/06/10 13:10:45-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/input/hiddev.c # 2004/06/10 13:10:45-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/input/hid-core.c # 2004/06/10 13:10:45-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/devio.c # 2004/06/10 13:10:44-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/09 12:17:34-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/core/usb.c # 2004/06/09 12:17:31-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/08 22:02:51-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/06/08 22:02:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/serial/cyberjack.c # 2004/06/08 22:02:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/media/pwc-if.c # 2004/06/08 22:02:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/media/Kconfig # 2004/06/08 22:02:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/gadget/ether.c # 2004/06/08 22:02:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/devio.c # 2004/06/08 22:02:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/08 12:41:28-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/06/08 12:41:24-07:00 akpm@bix.(none) +0 -1 # Auto merged # # drivers/usb/serial/cyberjack.c # 2004/06/08 12:41:24-07:00 akpm@bix.(none) +0 -6 # Auto merged # # drivers/usb/media/pwc-if.c # 2004/06/08 12:41:24-07:00 akpm@bix.(none) +0 -1 # Auto merged # # drivers/usb/media/Kconfig # 2004/06/08 12:41:24-07:00 akpm@bix.(none) +0 -1 # Auto merged # # drivers/usb/core/devio.c # 2004/06/08 12:41:24-07:00 akpm@bix.(none) +0 -1 # Auto merged # # ChangeSet # 2004/06/07 20:07:13-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/06/07 20:07:10-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/gadget/ether.c # 2004/06/07 20:07:10-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/07 14:23:17-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/gadget/ether.c # 2004/06/07 14:23:13-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/message.c # 2004/06/07 14:23:13-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/07 14:22:27-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # drivers/usb/input/hiddev.c # 2004/06/07 14:22:24-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/05 17:09:11-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # MAINTAINERS # 2004/06/05 17:09:08-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/04 02:41:08-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # drivers/usb/gadget/ether.c # 2004/06/04 02:41:05-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/03 10:45:02-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/06/03 10:44:58-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/02 23:58:29-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/core/usb.c # 2004/06/02 23:58:25-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/02 13:38:13-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/core/message.c # 2004/06/02 13:38:09-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/02 13:37:23-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/06/02 13:37:20-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/01 13:57:49-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # MAINTAINERS # 2004/06/01 13:57:45-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/30 00:23:52-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # MAINTAINERS # 2004/05/30 00:23:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # CREDITS # 2004/05/30 00:23:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/28 17:18:45-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/05/28 17:18:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/28 14:16:41-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/input/hiddev.c # 2004/05/28 14:16:37-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/28 14:15:52-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/05/28 14:15:49-07:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/05/28 14:15:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/25 13:48:31-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/input/hiddev.c # 2004/05/25 13:48:27-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/05/25 13:48:27-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/message.c # 2004/05/25 13:48:27-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/25 13:47:38-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # MAINTAINERS # 2004/05/25 13:47:34-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/24 11:48:01-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/05/24 11:47:57-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/22 23:48:51-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/05/22 23:48:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/05/22 23:48:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/21 19:09:03-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # arch/ia64/defconfig # 2004/05/21 19:09:00-07:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/05/21 19:09:00-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/19 18:31:55-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # MAINTAINERS # 2004/05/19 18:31:52-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/19 00:07:04-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/05/19 00:07:01-07:00 akpm@bix.(none) +0 -0 # Auto merged # # include/linux/pci_ids.h # 2004/05/19 00:07:01-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/05/19 00:07:01-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc/defconfig # 2004/05/19 00:07:01-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc/configs/pmac_defconfig # 2004/05/19 00:07:01-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc/configs/common_defconfig # 2004/05/19 00:07:01-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/18 14:54:09-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/05/18 14:54:06-07:00 akpm@bix.(none) +0 -0 # Auto merged # # include/linux/pci_ids.h # 2004/05/18 14:54:06-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/input/hid-core.c # 2004/05/18 14:54:06-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/05/18 14:54:06-07:00 akpm@bix.(none) +0 -0 # Auto merged # # CREDITS # 2004/05/18 14:54:06-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/16 01:52:25-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/05/16 01:52:22-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/14 21:45:47-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/05/14 21:45:43-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/14 09:41:12-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/input/hid-core.c # 2004/05/14 09:41:09-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/05/14 09:41:09-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/message.c # 2004/05/14 09:41:09-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/12 20:32:44-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/core/inode.c # 2004/05/12 20:32:41-07:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/05/12 20:32:41-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/12 01:26:11-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/input/wacom.c # 2004/05/12 01:26:08-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/input/hid-core.c # 2004/05/12 01:26:08-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/12 01:25:17-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/05/12 01:25:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/parisc/configs/c3000_defconfig # 2004/05/12 01:25:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/05/12 01:25:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/05 14:52:58-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/core/message.c # 2004/05/05 14:52:55-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/05 14:52:11-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # CREDITS # 2004/05/05 14:52:08-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/04 14:13:11-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/05/04 14:13:08-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/01 15:23:25-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # MAINTAINERS # 2004/05/01 15:23:22-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/30 22:06:45-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # drivers/usb/core/inode.c # 2004/04/30 22:06:42-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/29 16:00:47-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/04/29 16:00:44-07:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/04/29 16:00:44-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/28 13:38:52-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/input/hid-core.c # 2004/04/28 13:38:49-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/27 19:39:13-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/04/27 19:39:10-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/04/27 19:39:10-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/message.c # 2004/04/27 19:39:10-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/26 18:31:48-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/04/26 18:31:45-07:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/04/26 18:31:45-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/25 23:06:05-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/04/25 23:06:02-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/24 23:51:05-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/core/usb.c # 2004/04/24 23:51:02-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/23 12:58:38-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # CREDITS # 2004/04/23 12:58:35-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/19 19:45:10-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/04/19 19:45:07-07:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/04/19 19:45:07-07:00 akpm@bix.(none) +0 -0 # Auto merged # # CREDITS # 2004/04/19 19:45:06-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/07 20:17:13-07:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/core/message.c # 2004/04/07 20:17:11-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/02 11:35:28-08:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/pci_ids.h # 2004/04/02 11:35:25-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/01 15:16:14-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # CREDITS # 2004/04/01 15:16:11-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/31 19:24:39-08:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/03/31 19:24:37-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/03/31 19:24:37-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/message.c # 2004/03/31 19:24:37-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc64/defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc64/configs/pSeries_defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc/defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc/configs/pmac_defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc/configs/common_defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/parisc/configs/c3000_defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/configs/zx1_defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/configs/generic_defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/arm/configs/neponset_defconfig # 2004/03/31 19:24:36-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/30 20:18:36-08:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # arch/ppc64/defconfig # 2004/03/30 20:18:33-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc64/configs/pSeries_defconfig # 2004/03/30 20:18:33-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc/defconfig # 2004/03/30 20:18:33-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc/configs/pmac_defconfig # 2004/03/30 20:18:33-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ppc/configs/common_defconfig # 2004/03/30 20:18:33-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/parisc/configs/c3000_defconfig # 2004/03/30 20:18:33-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/defconfig # 2004/03/30 20:18:33-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/configs/zx1_defconfig # 2004/03/30 20:18:33-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/ia64/configs/generic_defconfig # 2004/03/30 20:18:33-08:00 akpm@bix.(none) +0 -0 # Auto merged # # arch/arm/configs/neponset_defconfig # 2004/03/30 20:18:32-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/30 12:09:32-08:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/usb.h # 2004/03/30 12:09:29-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/03/30 12:09:29-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/message.c # 2004/03/30 12:09:29-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/29 18:05:43-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # MAINTAINERS # 2004/03/29 18:05:41-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/29 13:51:58-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # CREDITS # 2004/03/29 13:51:56-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/28 12:29:41-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # drivers/usb/core/message.c # 2004/03/28 12:29:38-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/27 02:28:18-08:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # drivers/usb/input/wacom.c # 2004/03/27 02:28:16-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/26 12:24:49-08:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/usb_gadget.h # 2004/03/26 12:24:46-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/03/26 12:24:46-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/20 13:26:55-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # CREDITS # 2004/03/20 13:26:53-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/16 21:53:42-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # drivers/usb/input/wacom.c # 2004/03/16 21:53:39-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/input/hid-core.c # 2004/03/16 21:53:39-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/16 12:59:58-08:00 akpm@bix.(none) # Merge bk://kernel.bkbits.net/gregkh/linux/usb-2.6 # into bix.(none):/usr/src/bk-usb # # include/linux/usb_gadget.h # 2004/03/16 12:59:47-08:00 akpm@bix.(none) +0 -0 # Auto merged # # include/linux/usb.h # 2004/03/16 12:59:47-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/03/16 12:59:46-08:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/03/16 12:59:46-08:00 akpm@bix.(none) +0 -0 # Auto merged # # CREDITS # 2004/03/16 12:59:46-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/16 12:58:57-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # drivers/usb/input/wacom.c # 2004/03/16 12:58:47-08:00 akpm@bix.(none) +0 -4 # Auto merged # # drivers/usb/input/hid-core.c # 2004/03/16 12:58:47-08:00 akpm@bix.(none) +0 -0 # Auto merged # # CREDITS # 2004/03/16 12:58:46-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/14 11:03:00-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # include/linux/usb_gadget.h # 2004/03/14 11:02:47-08:00 akpm@bix.(none) +0 -0 # Auto merged # # include/linux/usb.h # 2004/03/14 11:02:47-08:00 akpm@bix.(none) +0 -0 # Auto merged # # drivers/usb/core/usb.c # 2004/03/14 11:02:47-08:00 akpm@bix.(none) +0 -0 # Auto merged # # MAINTAINERS # 2004/03/14 11:02:47-08:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/03/12 10:57:17-08:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-usb # # MAINTAINERS # 2004/03/12 10:57:02-08:00 akpm@bix.(none) +0 -0 # Auto merged # # CREDITS # 2004/03/12 10:57:01-08:00 akpm@bix.(none) +0 -0 # Auto merged # diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c --- a/drivers/usb/class/cdc-acm.c 2004-06-23 20:43:31 -07:00 +++ b/drivers/usb/class/cdc-acm.c 2004-06-23 20:43:31 -07:00 @@ -5,6 +5,7 @@ * Copyright (c) 1999 Pavel Machek * Copyright (c) 1999 Johannes Erdfelt * Copyright (c) 2000 Vojtech Pavlik + * Copyright (c) 2004 Oliver Neukum * * USB Abstract Control Model driver for USB modems and ISDN adapters * @@ -60,6 +61,7 @@ #include #include #include +#include #include "cdc-acm.h" @@ -108,7 +110,7 @@ { struct acm *acm = urb->context; struct usb_ctrlrequest *dr = urb->transfer_buffer; - unsigned char *data = (unsigned char *)(dr + 1); + unsigned char *data; int newctrl; int status; @@ -130,6 +132,7 @@ if (!ACM_READY(acm)) goto exit; + data = (unsigned char *)(dr + 1); switch (dr->bRequest) { case ACM_IRQ_NETWORK: @@ -139,7 +142,7 @@ case ACM_IRQ_LINE_STATE: - newctrl = le16_to_cpup((__u16 *) data); + newctrl = le16_to_cpu(get_unaligned((__u16 *) data)); if (acm->tty && !acm->clocal && (acm->ctrlin & ~newctrl & ACM_CTRL_DCD)) { dbg("calling hangup"); @@ -172,6 +175,7 @@ static void acm_read_bulk(struct urb *urb, struct pt_regs *regs) { struct acm *acm = urb->context; + dbg("Entering acm_read_bulk with status %d\n", urb->status); if (!ACM_READY(acm)) return; @@ -190,6 +194,7 @@ struct tty_struct *tty = acm->tty; unsigned char *data = urb->transfer_buffer; int i = 0; + dbg("Entering acm_rx_tasklet"); if (urb->actual_length > 0 && !acm->throttle) { for (i = 0; i < urb->actual_length && !acm->throttle; i++) { @@ -200,14 +205,20 @@ } tty_insert_flip_char(tty, data[i], 0); } + dbg("Handed %d bytes to tty layer", i+1); tty_flip_buffer_push(tty); } + spin_lock(&acm->throttle_lock); if (acm->throttle) { + dbg("Throtteling noticed"); memmove(data, data + i, urb->actual_length - i); urb->actual_length -= i; + acm->resubmit_to_unthrottle = 1; + spin_unlock(&acm->throttle_lock); return; } + spin_unlock(&acm->throttle_lock); urb->actual_length = 0; urb->dev = acm->dev; @@ -221,6 +232,7 @@ static void acm_write_bulk(struct urb *urb, struct pt_regs *regs) { struct acm *acm = (struct acm *)urb->context; + dbg("Entering acm_write_bulk with status %d\n", urb->status); if (!ACM_READY(acm)) goto out; @@ -237,7 +249,8 @@ { struct acm *acm = private; struct tty_struct *tty = acm->tty; - + dbg("Entering acm_softint.\n"); + if (!ACM_READY(acm)) return; @@ -254,6 +267,7 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) { struct acm *acm = acm_table[tty->index]; + dbg("Entering acm_tty_open.\n"); if (!acm || !acm->dev) return -EINVAL; @@ -279,7 +293,8 @@ goto bail_out_and_unlink; } - acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS); + if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS)) + goto full_bailout; /* force low_latency on so that our tty_push actually forces the data through, otherwise it is scheduled, and with high data rates data can get lost. */ @@ -290,6 +305,8 @@ up(&open_sem); return 0; +full_bailout: + usb_unlink_urb(acm->readurb); bail_out_and_unlink: usb_unlink_urb(acm->ctrlurb); bail_out: @@ -327,6 +344,7 @@ { struct acm *acm = tty->driver_data; int stat; + dbg("Entering acm_tty_write to write %d bytes from %s space,\n", count, from_user ? "user" : "kernel"); if (!ACM_READY(acm)) return -EINVAL; @@ -337,11 +355,13 @@ count = (count > acm->writesize) ? acm->writesize : count; + dbg("Get %d bytes from %s space...", count, from_user ? "user" : "kernel"); if (from_user) { - if (copy_from_user(acm->writeurb->transfer_buffer, (void __user *)buf, count)) + if (copy_from_user(acm->write_buffer, (void __user *)buf, count)) return -EFAULT; } else - memcpy(acm->writeurb->transfer_buffer, buf, count); + memcpy(acm->write_buffer, buf, count); + dbg(" Successfully copied.\n"); acm->writeurb->transfer_buffer_length = count; acm->writeurb->dev = acm->dev; @@ -378,7 +398,9 @@ struct acm *acm = tty->driver_data; if (!ACM_READY(acm)) return; + spin_lock_bh(&acm->throttle_lock); acm->throttle = 1; + spin_unlock_bh(&acm->throttle_lock); } static void acm_tty_unthrottle(struct tty_struct *tty) @@ -386,9 +408,13 @@ struct acm *acm = tty->driver_data; if (!ACM_READY(acm)) return; + spin_lock_bh(&acm->throttle_lock); acm->throttle = 0; - if (acm->readurb->status != -EINPROGRESS) + spin_unlock_bh(&acm->throttle_lock); + if (acm->resubmit_to_unthrottle) { + acm->resubmit_to_unthrottle = 0; acm_read_bulk(acm->readurb, NULL); + } } static void acm_tty_break_ctl(struct tty_struct *tty, int state) @@ -510,7 +536,11 @@ struct acm *acm; int minor; int ctrlsize,readsize; - char *buf; + u8 *buf; + u8 ac_management_function = 0; + u8 call_management_function = 0; + int call_interface_num = -1; + int data_interface_num; if (!buffer) { err("Wierd descriptor references"); @@ -531,6 +561,18 @@ } union_header = (struct union_desc *)buffer; break; + case CDC_COUNTRY_TYPE: /* maybe somehow export */ + break; /* for now we ignore it */ + case CDC_AC_MANAGEMENT_TYPE: + ac_management_function = buffer[3]; + break; + case CDC_CALL_MANAGEMENT_TYPE: + call_management_function = buffer[3]; + call_interface_num = buffer[4]; + if ((call_management_function & 3) != 3) + err("This device cannot do calls on its own. It is no modem."); + break; + default: err("Ignoring extra header"); break; @@ -546,11 +588,14 @@ } control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); - data_interface = usb_ifnum_to_if(usb_dev, union_header->bSlaveInterface0); + data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0)); if (!control_interface || !data_interface) { dev_dbg(&intf->dev,"no interfaces\n"); return -ENODEV; } + + if (data_interface_num != call_interface_num) + dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported."); if (usb_interface_claimed(data_interface)) { /* valid in this context */ dev_dbg(&intf->dev,"The data interface isn't available\n"); @@ -598,7 +643,7 @@ if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) { dev_dbg(&intf->dev, "out of memory (acm kmalloc)\n"); - return -ENOMEM; + goto alloc_fail; } memset(acm, 0, sizeof(struct acm)); @@ -609,54 +654,66 @@ acm->data = data_interface; acm->minor = minor; acm->dev = usb_dev; - + acm->ctrl_caps = ac_management_function; + acm->ctrlsize = ctrlsize; + acm->readsize = readsize; acm->bh.func = acm_rx_tasklet; acm->bh.data = (unsigned long) acm; INIT_WORK(&acm->work, acm_softint, acm); + spin_lock_init(&acm->throttle_lock); acm->ready_for_write = 1; - - if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize, GFP_KERNEL))) { - dev_dbg(&intf->dev, "out of memory (buf kmalloc)\n"); - kfree(acm); - return -ENOMEM; + buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); + if (!buf) { + dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n"); + goto alloc_fail2; + } + acm->ctrl_buffer = buf; + + buf = usb_buffer_alloc(usb_dev, readsize, GFP_KERNEL, &acm->read_dma); + if (!buf) { + dev_dbg(&intf->dev, "out of memory (read buffer alloc)\n"); + goto alloc_fail3; + } + acm->read_buffer = buf; + + buf = usb_buffer_alloc(usb_dev, acm->writesize, GFP_KERNEL, &acm->write_dma); + if (!buf) { + dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n"); + goto alloc_fail4; } + acm->write_buffer = buf; acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); if (!acm->ctrlurb) { dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n"); - kfree(acm); - kfree(buf); - return -ENOMEM; + goto alloc_fail5; } acm->readurb = usb_alloc_urb(0, GFP_KERNEL); if (!acm->readurb) { dev_dbg(&intf->dev, "out of memory (readurb kmalloc)\n"); - usb_free_urb(acm->ctrlurb); - kfree(acm); - kfree(buf); - return -ENOMEM; + goto alloc_fail6; } acm->writeurb = usb_alloc_urb(0, GFP_KERNEL); if (!acm->writeurb) { dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n"); - usb_free_urb(acm->readurb); - usb_free_urb(acm->ctrlurb); - kfree(acm); - kfree(buf); - return -ENOMEM; + goto alloc_fail7; } usb_fill_int_urb(acm->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress), - buf, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval); + acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval); + acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + acm->ctrlurb->transfer_dma = acm->ctrl_dma; usb_fill_bulk_urb(acm->readurb, usb_dev, usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress), - buf += ctrlsize, readsize, acm_read_bulk, acm); - acm->readurb->transfer_flags |= URB_NO_FSBR; + acm->read_buffer, readsize, acm_read_bulk, acm); + acm->readurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP; + acm->readurb->transfer_dma = acm->read_dma; usb_fill_bulk_urb(acm->writeurb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), - buf += readsize, acm->writesize, acm_write_bulk, acm); - acm->writeurb->transfer_flags |= URB_NO_FSBR; + acm->write_buffer, acm->writesize, acm_write_bulk, acm); + acm->writeurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP; + acm->writeurb->transfer_dma = acm->write_dma; dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor); @@ -673,17 +730,34 @@ acm_table[minor] = acm; usb_set_intfdata (intf, acm); return 0; + +alloc_fail7: + usb_free_urb(acm->readurb); +alloc_fail6: + usb_free_urb(acm->ctrlurb); +alloc_fail5: + usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma); +alloc_fail4: + usb_buffer_free(usb_dev, readsize, acm->read_buffer, acm->read_dma); +alloc_fail3: + usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); +alloc_fail2: + kfree(acm); +alloc_fail: + return -ENOMEM; } static void acm_disconnect(struct usb_interface *intf) { struct acm *acm = usb_get_intfdata (intf); + struct usb_device *usb_dev = interface_to_usbdev(intf); if (!acm || !acm->dev) { dbg("disconnect on nonexisting interface"); return; } + down(&open_sem); acm->dev = NULL; usb_set_intfdata (intf, NULL); @@ -693,7 +767,9 @@ flush_scheduled_work(); /* wait for acm_softint */ - kfree(acm->ctrlurb->transfer_buffer); + usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma); + usb_buffer_free(usb_dev, acm->readsize, acm->read_buffer, acm->read_dma); + usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma); usb_driver_release_interface(&acm_driver, acm->data); @@ -704,8 +780,11 @@ usb_free_urb(acm->readurb); usb_free_urb(acm->writeurb); kfree(acm); + up(&open_sem); return; } + + up(&open_sem); if (acm->tty) tty_hangup(acm->tty); diff -Nru a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h --- a/drivers/usb/class/cdc-acm.h 2004-06-23 20:43:31 -07:00 +++ b/drivers/usb/class/cdc-acm.h 2004-06-23 20:43:31 -07:00 @@ -86,17 +86,23 @@ struct usb_interface *data; /* data interface */ struct tty_struct *tty; /* the corresponding tty */ struct urb *ctrlurb, *readurb, *writeurb; /* urbs */ + u8 *ctrl_buffer, *read_buffer, *write_buffer; /* buffers of urbs */ + dma_addr_t ctrl_dma, read_dma, write_dma; /* dma handles of buffers */ struct acm_line line; /* line coding (bits, stop, parity) */ struct work_struct work; /* work queue entry for line discipline waking up */ struct tasklet_struct bh; /* rx processing */ + spinlock_t throttle_lock; /* synchronize throtteling and read callback */ unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */ unsigned int ctrlout; /* output control lines (DTR, RTS) */ unsigned int writesize; /* max packet size for the output bulk endpoint */ + unsigned int readsize,ctrlsize; /* buffer sizes for freeing */ unsigned int used; /* someone has this acm's device open */ unsigned int minor; /* acm minor number */ unsigned char throttle; /* throttled by tty layer */ unsigned char clocal; /* termios CLOCAL */ unsigned char ready_for_write; /* write urb can be used */ + unsigned char resubmit_to_unthrottle; /* throtteling has disabled the read urb */ + unsigned int ctrl_caps; /* control capabilities from the class specific header */ }; /* "Union Functional Descriptor" from CDC spec 5.2.3.X */ @@ -110,6 +116,12 @@ /* ... and there could be other slave interfaces */ } __attribute__ ((packed)); -#define CDC_UNION_TYPE 0x06 +/* class specific descriptor types */ +#define CDC_CALL_MANAGEMENT_TYPE 0x01 +#define CDC_AC_MANAGEMENT_TYPE 0x02 +#define CDC_UNION_TYPE 0x06 +#define CDC_COUNTRY_TYPE 0x07 + #define CDC_DATA_INTERFACE_TYPE 0x0a + diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c --- a/drivers/usb/core/hub.c 2004-06-23 20:43:31 -07:00 +++ b/drivers/usb/core/hub.c 2004-06-23 20:43:31 -07:00 @@ -1034,7 +1034,7 @@ {} #endif -/* +/** * usb_new_device - perform initial device setup (usbcore-internal) * @udev: newly addressed device (in ADDRESS state) * @@ -1333,13 +1333,14 @@ return retval; } -/* reset device, (re)assign address, get device descriptor. - * device connection is stable, no more debouncing needed. - * returns device in USB_STATE_ADDRESS, except on error. - * on error return, device is no longer usable (ref dropped). +/* Reset device, (re)assign address, get device descriptor. + * Device connection must be stable, no more debouncing needed. + * Returns device in USB_STATE_ADDRESS, except on error. * - * caller owns dev->serialize for the device, guarding against - * config changes and disconnect processing. + * If this is called for an already-existing device (as part of + * usb_reset_device), the caller must own the device lock. For a + * newly detected device that is not accessible through any global + * pointers, it's not necessary to lock the device. */ static int hub_port_init (struct usb_device *hdev, struct usb_device *udev, int port) @@ -1571,6 +1572,7 @@ /* Disconnect any existing devices under this port */ if (hdev->children[port]) usb_disconnect(&hdev->children[port]); + clear_bit(port, hub->change_bits); if (portchange & USB_PORT_STAT_C_CONNECTION) { status = hub_port_debounce(hdev, port); @@ -1785,12 +1787,15 @@ /* deal with port status changes */ for (i = 0; i < hub->descriptor->bNbrPorts; i++) { - if (!test_and_clear_bit(i+1, hub->event_bits)) + connect_change = test_bit(i, hub->change_bits); + if (!test_and_clear_bit(i+1, hub->event_bits) && + !connect_change) continue; - ret = hub_port_status(hdev, i, &portstatus, &portchange); + + ret = hub_port_status(hdev, i, + &portstatus, &portchange); if (ret < 0) continue; - connect_change = 0; if (portchange & USB_PORT_STAT_C_CONNECTION) { clear_port_feature(hdev, @@ -1819,7 +1824,7 @@ dev_err (hub_dev, "port %i " "disabled by hub (EMI?), " - "re-enabling...", + "re-enabling...\n", i + 1); connect_change = 1; } @@ -1996,23 +2001,34 @@ != 0) { dev_dbg(&udev->dev, "config index %d changed (#%d)\n", index, buf->bConfigurationValue); -/* FIXME enable this when we can re-enumerate after reset; - * until then DFU-ish drivers need this and other workarounds - */ -// break; + break; } } kfree(buf); return index != udev->descriptor.bNumConfigurations; } -/* +/** + * usb_reset_devce - perform a USB port reset to reinitialize a device + * @udev: device to reset (not in SUSPENDED or NOTATTACHED state) + * * WARNING - don't reset any device unless drivers for all of its * interfaces are expecting that reset! Maybe some driver->reset() * method should eventually help ensure sufficient cooperation. * - * This is the same as usb_reset_device() except that the caller - * already holds dev->serialize. For example, it's safe to use + * Do a port reset, reassign the device's address, and establish its + * former operating configuration. If the reset fails, or the device's + * descriptors change from their values before the reset, or the original + * configuration and altsettings cannot be restored, a flag will be set + * telling khubd to pretend the device has been disconnected and then + * re-connected. All drivers will be unbound, and the device will be + * re-enumerated and probed all over again. + * + * Returns 0 if the reset succeeded, -ENODEV if the device has been + * flagged for logical disconnection, or some other negative error code + * if the reset wasn't even attempted. + * + * The caller must own the device lock. For example, it's safe to use * this from a driver probe() routine after downloading new firmware. */ int __usb_reset_device(struct usb_device *udev) @@ -2020,13 +2036,23 @@ struct usb_device *parent = udev->parent; struct usb_device_descriptor descriptor = udev->descriptor; int i, ret, port = -1; + struct usb_hub *hub; + + if (udev->state == USB_STATE_NOTATTACHED || + udev->state == USB_STATE_SUSPENDED) { + dev_dbg(&udev->dev, "device reset not allowed in state %d\n", + udev->state); + return -EINVAL; + } + /* FIXME: This should be legal for regular hubs. Root hubs may + * have special requirements. */ if (udev->maxchild) { /* this requires hub- or hcd-specific logic; * see hub_reset() and OHCI hc_restart() */ dev_dbg(&udev->dev, "%s for hub!\n", __FUNCTION__); - return -EINVAL; + return -EISDIR; } for (i = 0; i < parent->maxchild; i++) @@ -2035,8 +2061,11 @@ break; } - if (port < 0) + if (port < 0) { + /* If this ever happens, it's very bad */ + dev_err(&udev->dev, "Can't locate device's port!\n"); return -ENOENT; + } ret = hub_port_init(parent, udev, port); if (ret < 0) @@ -2088,8 +2117,18 @@ return 0; re_enumerate: - /* FIXME make some task re-enumerate; don't just mark unusable */ hub_port_disable(parent, port); + + hub = usb_get_intfdata(parent->actconfig->interface[0]); + set_bit(port, hub->change_bits); + + spin_lock_irq(&hub_event_lock); + if (list_empty(&hub->event_list)) { + list_add_tail(&hub->event_list, &hub_event_list); + wake_up(&khubd_wait); + } + spin_unlock_irq(&hub_event_lock); + return -ENODEV; } EXPORT_SYMBOL(__usb_reset_device); diff -Nru a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h --- a/drivers/usb/core/hub.h 2004-06-23 20:43:31 -07:00 +++ b/drivers/usb/core/hub.h 2004-06-23 20:43:31 -07:00 @@ -204,6 +204,8 @@ struct list_head event_list; /* hubs w/data or errs ready */ unsigned long event_bits[1]; /* status change bitmask */ + unsigned long change_bits[1]; /* ports with logical connect + status change */ #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ #error event_bits[] is too short! #endif diff -Nru a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c --- a/drivers/usb/gadget/dummy_hcd.c 2004-06-23 20:43:31 -07:00 +++ b/drivers/usb/gadget/dummy_hcd.c 2004-06-23 20:43:31 -07:00 @@ -739,11 +739,9 @@ struct dummy_ep *ep; /* prevent any more requests */ - dum->hdev = 0; dum->address = 0; - /* this might not succeed ... */ - del_timer (&dum->timer); + /* The timer is left running so that outstanding URBs can fail */ /* nuke any pending requests first, so driver i/o is quiesced */ list_for_each_entry (ep, &dum->gadget.ep_list, ep.ep_list) @@ -784,7 +782,6 @@ driver_unregister (&driver->driver); - del_timer_sync (&dum->timer); return 0; } EXPORT_SYMBOL (usb_gadget_unregister_driver);