diff options
author | Paul Mackerras <paulus@samba.org> | 2006-07-31 20:37:25 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-07-31 20:37:25 -0400 |
commit | 57cad8084e0837e0f2c97da789ec9b3f36809be9 (patch) | |
tree | e9c790afb4286f78cb08d9664f58baa7e876fe55 /drivers/usb | |
parent | cb18bd40030c879cd93fef02fd579f74dbab473d (diff) | |
parent | 49b1e3ea19b1c95c2f012b8331ffb3b169e4c042 (diff) |
Merge branch 'merge'
Diffstat (limited to 'drivers/usb')
75 files changed, 991 insertions, 735 deletions
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 7fdbc5dad5fd..2ee742d40c43 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig | |||
@@ -23,6 +23,7 @@ config USB_ARCH_HAS_OHCI | |||
23 | default y if ARCH_LH7A404 | 23 | default y if ARCH_LH7A404 |
24 | default y if ARCH_S3C2410 | 24 | default y if ARCH_S3C2410 |
25 | default y if PXA27x | 25 | default y if PXA27x |
26 | default y if ARCH_EP93XX | ||
26 | default y if ARCH_AT91RM9200 | 27 | default y if ARCH_AT91RM9200 |
27 | # PPC: | 28 | # PPC: |
28 | default y if STB03xxx | 29 | default y if STB03xxx |
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index c7123bf71c58..4710eb02ed64 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile | |||
@@ -48,7 +48,7 @@ obj-$(CONFIG_USB_MICROTEK) += image/ | |||
48 | obj-$(CONFIG_USB_SERIAL) += serial/ | 48 | obj-$(CONFIG_USB_SERIAL) += serial/ |
49 | 49 | ||
50 | obj-$(CONFIG_USB_AUERSWALD) += misc/ | 50 | obj-$(CONFIG_USB_AUERSWALD) += misc/ |
51 | obj-$(CONFIG_USB_CY7C63) += misc/ | 51 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= misc/ |
52 | obj-$(CONFIG_USB_CYTHERM) += misc/ | 52 | obj-$(CONFIG_USB_CYTHERM) += misc/ |
53 | obj-$(CONFIG_USB_EMI26) += misc/ | 53 | obj-$(CONFIG_USB_EMI26) += misc/ |
54 | obj-$(CONFIG_USB_EMI62) += misc/ | 54 | obj-$(CONFIG_USB_EMI62) += misc/ |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 3670d77e912c..ca90326f2f5c 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -291,13 +291,13 @@ static void acm_read_bulk(struct urb *urb, struct pt_regs *regs) | |||
291 | struct acm_ru *rcv = urb->context; | 291 | struct acm_ru *rcv = urb->context; |
292 | struct acm *acm = rcv->instance; | 292 | struct acm *acm = rcv->instance; |
293 | int status = urb->status; | 293 | int status = urb->status; |
294 | dbg("Entering acm_read_bulk with status %d\n", urb->status); | 294 | dbg("Entering acm_read_bulk with status %d", urb->status); |
295 | 295 | ||
296 | if (!ACM_READY(acm)) | 296 | if (!ACM_READY(acm)) |
297 | return; | 297 | return; |
298 | 298 | ||
299 | if (status) | 299 | if (status) |
300 | dev_dbg(&acm->data->dev, "bulk rx status %d\n", status); | 300 | dev_dbg(&acm->data->dev, "bulk rx status %d", status); |
301 | 301 | ||
302 | buf = rcv->buffer; | 302 | buf = rcv->buffer; |
303 | buf->size = urb->actual_length; | 303 | buf->size = urb->actual_length; |
@@ -343,7 +343,7 @@ next_buffer: | |||
343 | list_del(&buf->list); | 343 | list_del(&buf->list); |
344 | spin_unlock(&acm->read_lock); | 344 | spin_unlock(&acm->read_lock); |
345 | 345 | ||
346 | dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d\n", buf, buf->size); | 346 | dbg("acm_rx_tasklet: procesing buf 0x%p, size = %d", buf, buf->size); |
347 | 347 | ||
348 | tty_buffer_request_room(tty, buf->size); | 348 | tty_buffer_request_room(tty, buf->size); |
349 | if (!acm->throttle) | 349 | if (!acm->throttle) |
@@ -394,7 +394,7 @@ urbs: | |||
394 | rcv->urb->transfer_dma = buf->dma; | 394 | rcv->urb->transfer_dma = buf->dma; |
395 | rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 395 | rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
396 | 396 | ||
397 | dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p\n", rcv->urb, rcv, buf); | 397 | dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf); |
398 | 398 | ||
399 | /* This shouldn't kill the driver as unsuccessful URBs are returned to the | 399 | /* This shouldn't kill the driver as unsuccessful URBs are returned to the |
400 | free-urbs-pool and resubmited ASAP */ | 400 | free-urbs-pool and resubmited ASAP */ |
@@ -413,7 +413,7 @@ static void acm_write_bulk(struct urb *urb, struct pt_regs *regs) | |||
413 | { | 413 | { |
414 | struct acm *acm = (struct acm *)urb->context; | 414 | struct acm *acm = (struct acm *)urb->context; |
415 | 415 | ||
416 | dbg("Entering acm_write_bulk with status %d\n", urb->status); | 416 | dbg("Entering acm_write_bulk with status %d", urb->status); |
417 | 417 | ||
418 | acm_write_done(acm); | 418 | acm_write_done(acm); |
419 | acm_write_start(acm); | 419 | acm_write_start(acm); |
@@ -424,7 +424,7 @@ static void acm_write_bulk(struct urb *urb, struct pt_regs *regs) | |||
424 | static void acm_softint(void *private) | 424 | static void acm_softint(void *private) |
425 | { | 425 | { |
426 | struct acm *acm = private; | 426 | struct acm *acm = private; |
427 | dbg("Entering acm_softint.\n"); | 427 | dbg("Entering acm_softint."); |
428 | 428 | ||
429 | if (!ACM_READY(acm)) | 429 | if (!ACM_READY(acm)) |
430 | return; | 430 | return; |
@@ -440,7 +440,7 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) | |||
440 | struct acm *acm; | 440 | struct acm *acm; |
441 | int rv = -EINVAL; | 441 | int rv = -EINVAL; |
442 | int i; | 442 | int i; |
443 | dbg("Entering acm_tty_open.\n"); | 443 | dbg("Entering acm_tty_open."); |
444 | 444 | ||
445 | mutex_lock(&open_mutex); | 445 | mutex_lock(&open_mutex); |
446 | 446 | ||
@@ -541,7 +541,7 @@ static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int c | |||
541 | int wbn; | 541 | int wbn; |
542 | struct acm_wb *wb; | 542 | struct acm_wb *wb; |
543 | 543 | ||
544 | dbg("Entering acm_tty_write to write %d bytes,\n", count); | 544 | dbg("Entering acm_tty_write to write %d bytes,", count); |
545 | 545 | ||
546 | if (!ACM_READY(acm)) | 546 | if (!ACM_READY(acm)) |
547 | return -EINVAL; | 547 | return -EINVAL; |
@@ -793,7 +793,7 @@ static int acm_probe (struct usb_interface *intf, | |||
793 | 793 | ||
794 | if (!buflen) { | 794 | if (!buflen) { |
795 | if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) { | 795 | if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) { |
796 | dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n"); | 796 | dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint"); |
797 | buflen = intf->cur_altsetting->endpoint->extralen; | 797 | buflen = intf->cur_altsetting->endpoint->extralen; |
798 | buffer = intf->cur_altsetting->endpoint->extra; | 798 | buffer = intf->cur_altsetting->endpoint->extra; |
799 | } else { | 799 | } else { |
@@ -842,24 +842,24 @@ next_desc: | |||
842 | 842 | ||
843 | if (!union_header) { | 843 | if (!union_header) { |
844 | if (call_interface_num > 0) { | 844 | if (call_interface_num > 0) { |
845 | dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n"); | 845 | dev_dbg(&intf->dev,"No union descriptor, using call management descriptor"); |
846 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num)); | 846 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num)); |
847 | control_interface = intf; | 847 | control_interface = intf; |
848 | } else { | 848 | } else { |
849 | dev_dbg(&intf->dev,"No union descriptor, giving up\n"); | 849 | dev_dbg(&intf->dev,"No union descriptor, giving up"); |
850 | return -ENODEV; | 850 | return -ENODEV; |
851 | } | 851 | } |
852 | } else { | 852 | } else { |
853 | control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); | 853 | control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0); |
854 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0)); | 854 | data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0)); |
855 | if (!control_interface || !data_interface) { | 855 | if (!control_interface || !data_interface) { |
856 | dev_dbg(&intf->dev,"no interfaces\n"); | 856 | dev_dbg(&intf->dev,"no interfaces"); |
857 | return -ENODEV; | 857 | return -ENODEV; |
858 | } | 858 | } |
859 | } | 859 | } |
860 | 860 | ||
861 | if (data_interface_num != call_interface_num) | 861 | if (data_interface_num != call_interface_num) |
862 | dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n"); | 862 | dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported."); |
863 | 863 | ||
864 | skip_normal_probe: | 864 | skip_normal_probe: |
865 | 865 | ||
@@ -867,7 +867,7 @@ skip_normal_probe: | |||
867 | if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) { | 867 | if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) { |
868 | if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) { | 868 | if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) { |
869 | struct usb_interface *t; | 869 | struct usb_interface *t; |
870 | dev_dbg(&intf->dev,"Your device has switched interfaces.\n"); | 870 | dev_dbg(&intf->dev,"Your device has switched interfaces."); |
871 | 871 | ||
872 | t = control_interface; | 872 | t = control_interface; |
873 | control_interface = data_interface; | 873 | control_interface = data_interface; |
@@ -878,7 +878,7 @@ skip_normal_probe: | |||
878 | } | 878 | } |
879 | 879 | ||
880 | if (usb_interface_claimed(data_interface)) { /* valid in this context */ | 880 | if (usb_interface_claimed(data_interface)) { /* valid in this context */ |
881 | dev_dbg(&intf->dev,"The data interface isn't available\n"); | 881 | dev_dbg(&intf->dev,"The data interface isn't available"); |
882 | return -EBUSY; | 882 | return -EBUSY; |
883 | } | 883 | } |
884 | 884 | ||
@@ -895,7 +895,7 @@ skip_normal_probe: | |||
895 | if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) { | 895 | if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) { |
896 | /* descriptors are swapped */ | 896 | /* descriptors are swapped */ |
897 | struct usb_endpoint_descriptor *t; | 897 | struct usb_endpoint_descriptor *t; |
898 | dev_dbg(&intf->dev,"The data interface has switched endpoints\n"); | 898 | dev_dbg(&intf->dev,"The data interface has switched endpoints"); |
899 | 899 | ||
900 | t = epread; | 900 | t = epread; |
901 | epread = epwrite; | 901 | epread = epwrite; |
@@ -910,7 +910,7 @@ skip_normal_probe: | |||
910 | } | 910 | } |
911 | 911 | ||
912 | if (!(acm = kzalloc(sizeof(struct acm), GFP_KERNEL))) { | 912 | if (!(acm = kzalloc(sizeof(struct acm), GFP_KERNEL))) { |
913 | dev_dbg(&intf->dev, "out of memory (acm kzalloc)\n"); | 913 | dev_dbg(&intf->dev, "out of memory (acm kzalloc)"); |
914 | goto alloc_fail; | 914 | goto alloc_fail; |
915 | } | 915 | } |
916 | 916 | ||
@@ -936,26 +936,26 @@ skip_normal_probe: | |||
936 | 936 | ||
937 | buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); | 937 | buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma); |
938 | if (!buf) { | 938 | if (!buf) { |
939 | dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n"); | 939 | dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)"); |
940 | goto alloc_fail2; | 940 | goto alloc_fail2; |
941 | } | 941 | } |
942 | acm->ctrl_buffer = buf; | 942 | acm->ctrl_buffer = buf; |
943 | 943 | ||
944 | if (acm_write_buffers_alloc(acm) < 0) { | 944 | if (acm_write_buffers_alloc(acm) < 0) { |
945 | dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n"); | 945 | dev_dbg(&intf->dev, "out of memory (write buffer alloc)"); |
946 | goto alloc_fail4; | 946 | goto alloc_fail4; |
947 | } | 947 | } |
948 | 948 | ||
949 | acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); | 949 | acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); |
950 | if (!acm->ctrlurb) { | 950 | if (!acm->ctrlurb) { |
951 | dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n"); | 951 | dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)"); |
952 | goto alloc_fail5; | 952 | goto alloc_fail5; |
953 | } | 953 | } |
954 | for (i = 0; i < num_rx_buf; i++) { | 954 | for (i = 0; i < num_rx_buf; i++) { |
955 | struct acm_ru *rcv = &(acm->ru[i]); | 955 | struct acm_ru *rcv = &(acm->ru[i]); |
956 | 956 | ||
957 | if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) { | 957 | if (!(rcv->urb = usb_alloc_urb(0, GFP_KERNEL))) { |
958 | dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)\n"); | 958 | dev_dbg(&intf->dev, "out of memory (read urbs usb_alloc_urb)"); |
959 | goto alloc_fail7; | 959 | goto alloc_fail7; |
960 | } | 960 | } |
961 | 961 | ||
@@ -966,13 +966,13 @@ skip_normal_probe: | |||
966 | struct acm_rb *buf = &(acm->rb[i]); | 966 | struct acm_rb *buf = &(acm->rb[i]); |
967 | 967 | ||
968 | if (!(buf->base = usb_buffer_alloc(acm->dev, readsize, GFP_KERNEL, &buf->dma))) { | 968 | if (!(buf->base = usb_buffer_alloc(acm->dev, readsize, GFP_KERNEL, &buf->dma))) { |
969 | dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)\n"); | 969 | dev_dbg(&intf->dev, "out of memory (read bufs usb_buffer_alloc)"); |
970 | goto alloc_fail7; | 970 | goto alloc_fail7; |
971 | } | 971 | } |
972 | } | 972 | } |
973 | acm->writeurb = usb_alloc_urb(0, GFP_KERNEL); | 973 | acm->writeurb = usb_alloc_urb(0, GFP_KERNEL); |
974 | if (!acm->writeurb) { | 974 | if (!acm->writeurb) { |
975 | dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n"); | 975 | dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)"); |
976 | goto alloc_fail7; | 976 | goto alloc_fail7; |
977 | } | 977 | } |
978 | 978 | ||
@@ -1086,6 +1086,9 @@ static struct usb_device_id acm_ids[] = { | |||
1086 | { USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */ | 1086 | { USB_DEVICE(0x0ace, 0x1608), /* ZyDAS 56K USB MODEM */ |
1087 | .driver_info = SINGLE_RX_URB, /* firmware bug */ | 1087 | .driver_info = SINGLE_RX_URB, /* firmware bug */ |
1088 | }, | 1088 | }, |
1089 | { USB_DEVICE(0x0ace, 0x1611), /* ZyDAS 56K USB MODEM - new version */ | ||
1090 | .driver_info = SINGLE_RX_URB, /* firmware bug */ | ||
1091 | }, | ||
1089 | /* control interfaces with various AT-command sets */ | 1092 | /* control interfaces with various AT-command sets */ |
1090 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, | 1093 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
1091 | USB_CDC_ACM_PROTO_AT_V25TER) }, | 1094 | USB_CDC_ACM_PROTO_AT_V25TER) }, |
diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index a08787e253aa..6e3b5358a760 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig | |||
@@ -31,9 +31,6 @@ config USB_DEVICEFS | |||
31 | For the format of the various /proc/bus/usb/ files, please read | 31 | For the format of the various /proc/bus/usb/ files, please read |
32 | <file:Documentation/usb/proc_usb_info.txt>. | 32 | <file:Documentation/usb/proc_usb_info.txt>. |
33 | 33 | ||
34 | Please note that this code is completely unrelated to devfs, the | ||
35 | "/dev file system support". | ||
36 | |||
37 | Most users want to say Y here. | 34 | Most users want to say Y here. |
38 | 35 | ||
39 | config USB_BANDWIDTH | 36 | config USB_BANDWIDTH |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 875596e98e42..26c8cb5f3e67 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -1790,7 +1790,10 @@ static int finish_device_resume(struct usb_device *udev) | |||
1790 | * and device drivers will know about any resume quirks. | 1790 | * and device drivers will know about any resume quirks. |
1791 | */ | 1791 | */ |
1792 | status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); | 1792 | status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus); |
1793 | if (status < 2) | 1793 | if (status >= 0) |
1794 | status = (status == 2 ? 0 : -ENODEV); | ||
1795 | |||
1796 | if (status) | ||
1794 | dev_dbg(&udev->dev, | 1797 | dev_dbg(&udev->dev, |
1795 | "gone after usb resume? status %d\n", | 1798 | "gone after usb resume? status %d\n", |
1796 | status); | 1799 | status); |
@@ -1879,7 +1882,12 @@ hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) | |||
1879 | dev_dbg(hub->intfdev, | 1882 | dev_dbg(hub->intfdev, |
1880 | "port %d status %04x.%04x after resume, %d\n", | 1883 | "port %d status %04x.%04x after resume, %d\n", |
1881 | port1, portchange, devstatus, status); | 1884 | port1, portchange, devstatus, status); |
1885 | if (status >= 0) | ||
1886 | status = -ENODEV; | ||
1882 | } else { | 1887 | } else { |
1888 | if (portchange & USB_PORT_STAT_C_SUSPEND) | ||
1889 | clear_port_feature(hub->hdev, port1, | ||
1890 | USB_PORT_FEAT_C_SUSPEND); | ||
1883 | /* TRSMRCY = 10 msec */ | 1891 | /* TRSMRCY = 10 msec */ |
1884 | msleep(10); | 1892 | msleep(10); |
1885 | if (udev) | 1893 | if (udev) |
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index f48c3dbc367a..3182c2224ba2 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c | |||
@@ -695,7 +695,7 @@ static void usbfs_remove_device(struct usb_device *dev) | |||
695 | wake_up_all(&ds->wait); | 695 | wake_up_all(&ds->wait); |
696 | list_del_init(&ds->list); | 696 | list_del_init(&ds->list); |
697 | if (ds->discsignr) { | 697 | if (ds->discsignr) { |
698 | sinfo.si_signo = SIGPIPE; | 698 | sinfo.si_signo = ds->discsignr; |
699 | sinfo.si_errno = EPIPE; | 699 | sinfo.si_errno = EPIPE; |
700 | sinfo.si_code = SI_ASYNCIO; | 700 | sinfo.si_code = SI_ASYNCIO; |
701 | sinfo.si_addr = ds->disccontext; | 701 | sinfo.si_addr = ds->disccontext; |
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c index f7c6d758e1b0..53d584589c26 100644 --- a/drivers/usb/gadget/epautoconf.c +++ b/drivers/usb/gadget/epautoconf.c | |||
@@ -34,12 +34,12 @@ | |||
34 | 34 | ||
35 | 35 | ||
36 | /* we must assign addresses for configurable endpoints (like net2280) */ | 36 | /* we must assign addresses for configurable endpoints (like net2280) */ |
37 | static __initdata unsigned epnum; | 37 | static __devinitdata unsigned epnum; |
38 | 38 | ||
39 | // #define MANY_ENDPOINTS | 39 | // #define MANY_ENDPOINTS |
40 | #ifdef MANY_ENDPOINTS | 40 | #ifdef MANY_ENDPOINTS |
41 | /* more than 15 configurable endpoints */ | 41 | /* more than 15 configurable endpoints */ |
42 | static __initdata unsigned in_epnum; | 42 | static __devinitdata unsigned in_epnum; |
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | 45 | ||
@@ -59,7 +59,7 @@ static __initdata unsigned in_epnum; | |||
59 | * NOTE: each endpoint is unidirectional, as specified by its USB | 59 | * NOTE: each endpoint is unidirectional, as specified by its USB |
60 | * descriptor; and isn't specific to a configuration or altsetting. | 60 | * descriptor; and isn't specific to a configuration or altsetting. |
61 | */ | 61 | */ |
62 | static int __init | 62 | static int __devinit |
63 | ep_matches ( | 63 | ep_matches ( |
64 | struct usb_gadget *gadget, | 64 | struct usb_gadget *gadget, |
65 | struct usb_ep *ep, | 65 | struct usb_ep *ep, |
@@ -73,7 +73,7 @@ ep_matches ( | |||
73 | /* endpoint already claimed? */ | 73 | /* endpoint already claimed? */ |
74 | if (0 != ep->driver_data) | 74 | if (0 != ep->driver_data) |
75 | return 0; | 75 | return 0; |
76 | 76 | ||
77 | /* only support ep0 for portable CONTROL traffic */ | 77 | /* only support ep0 for portable CONTROL traffic */ |
78 | type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; | 78 | type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; |
79 | if (USB_ENDPOINT_XFER_CONTROL == type) | 79 | if (USB_ENDPOINT_XFER_CONTROL == type) |
@@ -186,7 +186,7 @@ ep_matches ( | |||
186 | return 1; | 186 | return 1; |
187 | } | 187 | } |
188 | 188 | ||
189 | static struct usb_ep * __init | 189 | static struct usb_ep * __devinit |
190 | find_ep (struct usb_gadget *gadget, const char *name) | 190 | find_ep (struct usb_gadget *gadget, const char *name) |
191 | { | 191 | { |
192 | struct usb_ep *ep; | 192 | struct usb_ep *ep; |
@@ -228,7 +228,7 @@ find_ep (struct usb_gadget *gadget, const char *name) | |||
228 | * | 228 | * |
229 | * On failure, this returns a null endpoint descriptor. | 229 | * On failure, this returns a null endpoint descriptor. |
230 | */ | 230 | */ |
231 | struct usb_ep * __init usb_ep_autoconfig ( | 231 | struct usb_ep * __devinit usb_ep_autoconfig ( |
232 | struct usb_gadget *gadget, | 232 | struct usb_gadget *gadget, |
233 | struct usb_endpoint_descriptor *desc | 233 | struct usb_endpoint_descriptor *desc |
234 | ) | 234 | ) |
@@ -276,7 +276,7 @@ struct usb_ep * __init usb_ep_autoconfig ( | |||
276 | return ep; | 276 | return ep; |
277 | } | 277 | } |
278 | 278 | ||
279 | /* Second, look at endpoints until an unclaimed one looks usable */ | 279 | /* Second, look at endpoints until an unclaimed one looks usable */ |
280 | list_for_each_entry (ep, &gadget->ep_list, ep_list) { | 280 | list_for_each_entry (ep, &gadget->ep_list, ep_list) { |
281 | if (ep_matches (gadget, ep, desc)) | 281 | if (ep_matches (gadget, ep, desc)) |
282 | return ep; | 282 | return ep; |
@@ -295,7 +295,7 @@ struct usb_ep * __init usb_ep_autoconfig ( | |||
295 | * state such as ep->driver_data and the record of assigned endpoints | 295 | * state such as ep->driver_data and the record of assigned endpoints |
296 | * used by usb_ep_autoconfig(). | 296 | * used by usb_ep_autoconfig(). |
297 | */ | 297 | */ |
298 | void __init usb_ep_autoconfig_reset (struct usb_gadget *gadget) | 298 | void __devinit usb_ep_autoconfig_reset (struct usb_gadget *gadget) |
299 | { | 299 | { |
300 | struct usb_ep *ep; | 300 | struct usb_ep *ep; |
301 | 301 | ||
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 8320fcef0425..4fe1bec1c255 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c | |||
@@ -2131,7 +2131,7 @@ eth_req_free (struct usb_ep *ep, struct usb_request *req) | |||
2131 | } | 2131 | } |
2132 | 2132 | ||
2133 | 2133 | ||
2134 | static void __exit | 2134 | static void /* __init_or_exit */ |
2135 | eth_unbind (struct usb_gadget *gadget) | 2135 | eth_unbind (struct usb_gadget *gadget) |
2136 | { | 2136 | { |
2137 | struct eth_dev *dev = get_gadget_data (gadget); | 2137 | struct eth_dev *dev = get_gadget_data (gadget); |
@@ -2158,7 +2158,7 @@ eth_unbind (struct usb_gadget *gadget) | |||
2158 | set_gadget_data (gadget, NULL); | 2158 | set_gadget_data (gadget, NULL); |
2159 | } | 2159 | } |
2160 | 2160 | ||
2161 | static u8 __init nibble (unsigned char c) | 2161 | static u8 __devinit nibble (unsigned char c) |
2162 | { | 2162 | { |
2163 | if (likely (isdigit (c))) | 2163 | if (likely (isdigit (c))) |
2164 | return c - '0'; | 2164 | return c - '0'; |
@@ -2168,7 +2168,7 @@ static u8 __init nibble (unsigned char c) | |||
2168 | return 0; | 2168 | return 0; |
2169 | } | 2169 | } |
2170 | 2170 | ||
2171 | static int __init get_ether_addr(const char *str, u8 *dev_addr) | 2171 | static int __devinit get_ether_addr(const char *str, u8 *dev_addr) |
2172 | { | 2172 | { |
2173 | if (str) { | 2173 | if (str) { |
2174 | unsigned i; | 2174 | unsigned i; |
@@ -2189,7 +2189,7 @@ static int __init get_ether_addr(const char *str, u8 *dev_addr) | |||
2189 | return 1; | 2189 | return 1; |
2190 | } | 2190 | } |
2191 | 2191 | ||
2192 | static int __init | 2192 | static int __devinit |
2193 | eth_bind (struct usb_gadget *gadget) | 2193 | eth_bind (struct usb_gadget *gadget) |
2194 | { | 2194 | { |
2195 | struct eth_dev *dev; | 2195 | struct eth_dev *dev; |
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index b1a9cf06f3e6..8d7f1e84cd7b 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c | |||
@@ -3691,7 +3691,7 @@ static void lun_release(struct device *dev) | |||
3691 | kref_put(&fsg->ref, fsg_release); | 3691 | kref_put(&fsg->ref, fsg_release); |
3692 | } | 3692 | } |
3693 | 3693 | ||
3694 | static void __exit fsg_unbind(struct usb_gadget *gadget) | 3694 | static void /* __init_or_exit */ fsg_unbind(struct usb_gadget *gadget) |
3695 | { | 3695 | { |
3696 | struct fsg_dev *fsg = get_gadget_data(gadget); | 3696 | struct fsg_dev *fsg = get_gadget_data(gadget); |
3697 | int i; | 3697 | int i; |
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c index 354670d12308..408c3380d602 100644 --- a/drivers/usb/gadget/rndis.c +++ b/drivers/usb/gadget/rndis.c | |||
@@ -1398,7 +1398,7 @@ static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS]; | |||
1398 | #endif /* CONFIG_USB_GADGET_DEBUG_FILES */ | 1398 | #endif /* CONFIG_USB_GADGET_DEBUG_FILES */ |
1399 | 1399 | ||
1400 | 1400 | ||
1401 | int __init rndis_init (void) | 1401 | int __devinit rndis_init (void) |
1402 | { | 1402 | { |
1403 | u8 i; | 1403 | u8 i; |
1404 | 1404 | ||
diff --git a/drivers/usb/gadget/rndis.h b/drivers/usb/gadget/rndis.h index 2956608be751..4c3c7259f019 100644 --- a/drivers/usb/gadget/rndis.h +++ b/drivers/usb/gadget/rndis.h | |||
@@ -264,7 +264,7 @@ int rndis_signal_disconnect (int configNr); | |||
264 | int rndis_state (int configNr); | 264 | int rndis_state (int configNr); |
265 | extern void rndis_set_host_mac (int configNr, const u8 *addr); | 265 | extern void rndis_set_host_mac (int configNr, const u8 *addr); |
266 | 266 | ||
267 | int __init rndis_init (void); | 267 | int __devinit rndis_init (void); |
268 | void rndis_exit (void); | 268 | void rndis_exit (void); |
269 | 269 | ||
270 | #endif /* _LINUX_RNDIS_H */ | 270 | #endif /* _LINUX_RNDIS_H */ |
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index 30d7664d449d..e762aa19ab0a 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c | |||
@@ -1473,7 +1473,7 @@ autoconf_fail: | |||
1473 | * Called on module unload. Frees the control request and device | 1473 | * Called on module unload. Frees the control request and device |
1474 | * structure. | 1474 | * structure. |
1475 | */ | 1475 | */ |
1476 | static void __exit gs_unbind(struct usb_gadget *gadget) | 1476 | static void /* __init_or_exit */ gs_unbind(struct usb_gadget *gadget) |
1477 | { | 1477 | { |
1478 | struct gs_dev *dev = get_gadget_data(gadget); | 1478 | struct gs_dev *dev = get_gadget_data(gadget); |
1479 | 1479 | ||
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index 3a08a7ab4ce0..b7018ee487ea 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c | |||
@@ -1121,7 +1121,7 @@ zero_autoresume (unsigned long _dev) | |||
1121 | 1121 | ||
1122 | /*-------------------------------------------------------------------------*/ | 1122 | /*-------------------------------------------------------------------------*/ |
1123 | 1123 | ||
1124 | static void __exit | 1124 | static void /* __init_or_exit */ |
1125 | zero_unbind (struct usb_gadget *gadget) | 1125 | zero_unbind (struct usb_gadget *gadget) |
1126 | { | 1126 | { |
1127 | struct zero_dev *dev = get_gadget_data (gadget); | 1127 | struct zero_dev *dev = get_gadget_data (gadget); |
diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c index d66867aa527e..26ed757d22a6 100644 --- a/drivers/usb/host/ehci-au1xxx.c +++ b/drivers/usb/host/ehci-au1xxx.c | |||
@@ -41,8 +41,6 @@ | |||
41 | #endif | 41 | #endif |
42 | #define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN) | 42 | #define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN) |
43 | 43 | ||
44 | #endif /* Au1200 */ | ||
45 | |||
46 | extern int usb_disabled(void); | 44 | extern int usb_disabled(void); |
47 | 45 | ||
48 | /*-------------------------------------------------------------------------*/ | 46 | /*-------------------------------------------------------------------------*/ |
@@ -107,9 +105,9 @@ int usb_ehci_au1xxx_probe(const struct hc_driver *driver, | |||
107 | 105 | ||
108 | /* Au1200 AB USB does not support coherent memory */ | 106 | /* Au1200 AB USB does not support coherent memory */ |
109 | if (!(read_c0_prid() & 0xff)) { | 107 | if (!(read_c0_prid() & 0xff)) { |
110 | pr_info("%s: this is chip revision AB!\n", dev->dev.name); | 108 | pr_info("%s: this is chip revision AB!\n", dev->name); |
111 | pr_info("%s: update your board or re-configure the kernel\n", | 109 | pr_info("%s: update your board or re-configure the kernel\n", |
112 | dev->dev.name); | 110 | dev->name); |
113 | return -ENODEV; | 111 | return -ENODEV; |
114 | } | 112 | } |
115 | #endif | 113 | #endif |
@@ -228,9 +226,8 @@ static const struct hc_driver ehci_au1xxx_hc_driver = { | |||
228 | 226 | ||
229 | /*-------------------------------------------------------------------------*/ | 227 | /*-------------------------------------------------------------------------*/ |
230 | 228 | ||
231 | static int ehci_hcd_au1xxx_drv_probe(struct device *dev) | 229 | static int ehci_hcd_au1xxx_drv_probe(struct platform_device *pdev) |
232 | { | 230 | { |
233 | struct platform_device *pdev = to_platform_device(dev); | ||
234 | struct usb_hcd *hcd = NULL; | 231 | struct usb_hcd *hcd = NULL; |
235 | int ret; | 232 | int ret; |
236 | 233 | ||
@@ -243,10 +240,9 @@ static int ehci_hcd_au1xxx_drv_probe(struct device *dev) | |||
243 | return ret; | 240 | return ret; |
244 | } | 241 | } |
245 | 242 | ||
246 | static int ehci_hcd_au1xxx_drv_remove(struct device *dev) | 243 | static int ehci_hcd_au1xxx_drv_remove(struct platform_device *pdev) |
247 | { | 244 | { |
248 | struct platform_device *pdev = to_platform_device(dev); | 245 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
249 | struct usb_hcd *hcd = dev_get_drvdata(dev); | ||
250 | 246 | ||
251 | usb_ehci_au1xxx_remove(hcd, pdev); | 247 | usb_ehci_au1xxx_remove(hcd, pdev); |
252 | return 0; | 248 | return 0; |
@@ -269,12 +265,13 @@ static int ehci_hcd_au1xxx_drv_resume(struct device *dev) | |||
269 | } | 265 | } |
270 | */ | 266 | */ |
271 | MODULE_ALIAS("au1xxx-ehci"); | 267 | MODULE_ALIAS("au1xxx-ehci"); |
272 | /* FIXME use "struct platform_driver" */ | 268 | static struct platform_driver ehci_hcd_au1xxx_driver = { |
273 | static struct device_driver ehci_hcd_au1xxx_driver = { | ||
274 | .name = "au1xxx-ehci", | ||
275 | .bus = &platform_bus_type, | ||
276 | .probe = ehci_hcd_au1xxx_drv_probe, | 269 | .probe = ehci_hcd_au1xxx_drv_probe, |
277 | .remove = ehci_hcd_au1xxx_drv_remove, | 270 | .remove = ehci_hcd_au1xxx_drv_remove, |
278 | /*.suspend = ehci_hcd_au1xxx_drv_suspend, */ | 271 | /*.suspend = ehci_hcd_au1xxx_drv_suspend, */ |
279 | /*.resume = ehci_hcd_au1xxx_drv_resume, */ | 272 | /*.resume = ehci_hcd_au1xxx_drv_resume, */ |
273 | .driver = { | ||
274 | .name = "au1xxx-ehci", | ||
275 | .bus = &platform_bus_type | ||
276 | } | ||
280 | }; | 277 | }; |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index cee6f538de0a..85b0b4ad4c16 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -625,10 +625,11 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd, struct pt_regs *regs) | |||
625 | writel (status | CMD_RUN, &ehci->regs->command); | 625 | writel (status | CMD_RUN, &ehci->regs->command); |
626 | 626 | ||
627 | while (i--) { | 627 | while (i--) { |
628 | status = readl (&ehci->regs->port_status [i]); | 628 | int pstatus = readl (&ehci->regs->port_status [i]); |
629 | if (status & PORT_OWNER) | 629 | |
630 | if (pstatus & PORT_OWNER) | ||
630 | continue; | 631 | continue; |
631 | if (!(status & PORT_RESUME) | 632 | if (!(pstatus & PORT_RESUME) |
632 | || ehci->reset_done [i] != 0) | 633 | || ehci->reset_done [i] != 0) |
633 | continue; | 634 | continue; |
634 | 635 | ||
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c index 689261e44018..822914e2f43b 100644 --- a/drivers/usb/host/ohci-au1xxx.c +++ b/drivers/usb/host/ohci-au1xxx.c | |||
@@ -101,13 +101,16 @@ static void au1xxx_start_ohc(struct platform_device *dev) | |||
101 | 101 | ||
102 | #endif /* Au1200 */ | 102 | #endif /* Au1200 */ |
103 | 103 | ||
104 | #ifndef CONFIG_SOC_AU1200 | ||
104 | /* wait for reset complete (read register twice; see au1500 errata) */ | 105 | /* wait for reset complete (read register twice; see au1500 errata) */ |
105 | while (au_readl(USB_HOST_CONFIG), | 106 | while (au_readl(USB_HOST_CONFIG), |
106 | !(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD)) | 107 | !(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD)) |
108 | #endif | ||
107 | udelay(1000); | 109 | udelay(1000); |
108 | 110 | ||
109 | printk(KERN_DEBUG __FILE__ | 111 | printk(KERN_DEBUG __FILE__ |
110 | ": Clock to USB host has been enabled \n"); | 112 | ": Clock to USB host has been enabled \n"); |
113 | #endif | ||
111 | } | 114 | } |
112 | 115 | ||
113 | static void au1xxx_stop_ohc(struct platform_device *dev) | 116 | static void au1xxx_stop_ohc(struct platform_device *dev) |
@@ -157,9 +160,9 @@ static int usb_ohci_au1xxx_probe(const struct hc_driver *driver, | |||
157 | /* Au1200 AB USB does not support coherent memory */ | 160 | /* Au1200 AB USB does not support coherent memory */ |
158 | if (!(read_c0_prid() & 0xff)) { | 161 | if (!(read_c0_prid() & 0xff)) { |
159 | pr_info("%s: this is chip revision AB !!\n", | 162 | pr_info("%s: this is chip revision AB !!\n", |
160 | dev->dev.name); | 163 | dev->name); |
161 | pr_info("%s: update your board or re-configure the kernel\n", | 164 | pr_info("%s: update your board or re-configure the kernel\n", |
162 | dev->dev.name); | 165 | dev->name); |
163 | return -ENODEV; | 166 | return -ENODEV; |
164 | } | 167 | } |
165 | #endif | 168 | #endif |
diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c new file mode 100644 index 000000000000..6531c4d26527 --- /dev/null +++ b/drivers/usb/host/ohci-ep93xx.c | |||
@@ -0,0 +1,225 @@ | |||
1 | /* | ||
2 | * OHCI HCD (Host Controller Driver) for USB. | ||
3 | * | ||
4 | * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> | ||
5 | * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net> | ||
6 | * (C) Copyright 2002 Hewlett-Packard Company | ||
7 | * | ||
8 | * Bus Glue for ep93xx. | ||
9 | * | ||
10 | * Written by Christopher Hoover <ch@hpl.hp.com> | ||
11 | * Based on fragments of previous driver by Russell King et al. | ||
12 | * | ||
13 | * Modified for LH7A404 from ohci-sa1111.c | ||
14 | * by Durgesh Pattamatta <pattamattad@sharpsec.com> | ||
15 | * | ||
16 | * Modified for pxa27x from ohci-lh7a404.c | ||
17 | * by Nick Bane <nick@cecomputing.co.uk> 26-8-2004 | ||
18 | * | ||
19 | * Modified for ep93xx from ohci-pxa27x.c | ||
20 | * by Lennert Buytenhek <buytenh@wantstofly.org> 28-2-2006 | ||
21 | * Based on an earlier driver by Ray Lehtiniemi | ||
22 | * | ||
23 | * This file is licenced under the GPL. | ||
24 | */ | ||
25 | |||
26 | #include <linux/clk.h> | ||
27 | #include <linux/device.h> | ||
28 | #include <linux/signal.h> | ||
29 | #include <linux/platform_device.h> | ||
30 | |||
31 | #include <asm/mach-types.h> | ||
32 | #include <asm/hardware.h> | ||
33 | |||
34 | static struct clk *usb_host_clock; | ||
35 | |||
36 | static void ep93xx_start_hc(struct device *dev) | ||
37 | { | ||
38 | clk_enable(usb_host_clock); | ||
39 | } | ||
40 | |||
41 | static void ep93xx_stop_hc(struct device *dev) | ||
42 | { | ||
43 | clk_disable(usb_host_clock); | ||
44 | } | ||
45 | |||
46 | static int usb_hcd_ep93xx_probe(const struct hc_driver *driver, | ||
47 | struct platform_device *pdev) | ||
48 | { | ||
49 | int retval; | ||
50 | struct usb_hcd *hcd; | ||
51 | |||
52 | if (pdev->resource[1].flags != IORESOURCE_IRQ) { | ||
53 | pr_debug("resource[1] is not IORESOURCE_IRQ"); | ||
54 | return -ENOMEM; | ||
55 | } | ||
56 | |||
57 | hcd = usb_create_hcd(driver, &pdev->dev, "ep93xx"); | ||
58 | if (hcd == NULL) | ||
59 | return -ENOMEM; | ||
60 | |||
61 | hcd->rsrc_start = pdev->resource[0].start; | ||
62 | hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1; | ||
63 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | ||
64 | usb_put_hcd(hcd); | ||
65 | retval = -EBUSY; | ||
66 | goto err1; | ||
67 | } | ||
68 | |||
69 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | ||
70 | if (hcd->regs == NULL) { | ||
71 | pr_debug("ioremap failed"); | ||
72 | retval = -ENOMEM; | ||
73 | goto err2; | ||
74 | } | ||
75 | |||
76 | usb_host_clock = clk_get(&pdev->dev, "usb_host"); | ||
77 | ep93xx_start_hc(&pdev->dev); | ||
78 | |||
79 | ohci_hcd_init(hcd_to_ohci(hcd)); | ||
80 | |||
81 | retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT); | ||
82 | if (retval == 0) | ||
83 | return retval; | ||
84 | |||
85 | ep93xx_stop_hc(&pdev->dev); | ||
86 | iounmap(hcd->regs); | ||
87 | err2: | ||
88 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
89 | err1: | ||
90 | usb_put_hcd(hcd); | ||
91 | |||
92 | return retval; | ||
93 | } | ||
94 | |||
95 | static void usb_hcd_ep93xx_remove(struct usb_hcd *hcd, | ||
96 | struct platform_device *pdev) | ||
97 | { | ||
98 | usb_remove_hcd(hcd); | ||
99 | ep93xx_stop_hc(&pdev->dev); | ||
100 | clk_put(usb_host_clock); | ||
101 | iounmap(hcd->regs); | ||
102 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | ||
103 | usb_put_hcd(hcd); | ||
104 | } | ||
105 | |||
106 | static int __devinit ohci_ep93xx_start(struct usb_hcd *hcd) | ||
107 | { | ||
108 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
109 | int ret; | ||
110 | |||
111 | if ((ret = ohci_init(ohci)) < 0) | ||
112 | return ret; | ||
113 | |||
114 | if ((ret = ohci_run(ohci)) < 0) { | ||
115 | err("can't start %s", hcd->self.bus_name); | ||
116 | ohci_stop(hcd); | ||
117 | return ret; | ||
118 | } | ||
119 | |||
120 | return 0; | ||
121 | } | ||
122 | |||
123 | static struct hc_driver ohci_ep93xx_hc_driver = { | ||
124 | .description = hcd_name, | ||
125 | .product_desc = "EP93xx OHCI", | ||
126 | .hcd_priv_size = sizeof(struct ohci_hcd), | ||
127 | .irq = ohci_irq, | ||
128 | .flags = HCD_USB11 | HCD_MEMORY, | ||
129 | .start = ohci_ep93xx_start, | ||
130 | .stop = ohci_stop, | ||
131 | .urb_enqueue = ohci_urb_enqueue, | ||
132 | .urb_dequeue = ohci_urb_dequeue, | ||
133 | .endpoint_disable = ohci_endpoint_disable, | ||
134 | .get_frame_number = ohci_get_frame, | ||
135 | .hub_status_data = ohci_hub_status_data, | ||
136 | .hub_control = ohci_hub_control, | ||
137 | #ifdef CONFIG_PM | ||
138 | .bus_suspend = ohci_bus_suspend, | ||
139 | .bus_resume = ohci_bus_resume, | ||
140 | #endif | ||
141 | .start_port_reset = ohci_start_port_reset, | ||
142 | }; | ||
143 | |||
144 | extern int usb_disabled(void); | ||
145 | |||
146 | static int ohci_hcd_ep93xx_drv_probe(struct platform_device *pdev) | ||
147 | { | ||
148 | int ret; | ||
149 | |||
150 | ret = -ENODEV; | ||
151 | if (!usb_disabled()) | ||
152 | ret = usb_hcd_ep93xx_probe(&ohci_ep93xx_hc_driver, pdev); | ||
153 | |||
154 | return ret; | ||
155 | } | ||
156 | |||
157 | static int ohci_hcd_ep93xx_drv_remove(struct platform_device *pdev) | ||
158 | { | ||
159 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
160 | |||
161 | usb_hcd_ep93xx_remove(hcd, pdev); | ||
162 | |||
163 | return 0; | ||
164 | } | ||
165 | |||
166 | #ifdef CONFIG_PM | ||
167 | static int ohci_hcd_ep93xx_drv_suspend(struct platform_device *pdev, pm_message_t state) | ||
168 | { | ||
169 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
170 | struct ochi_hcd *ohci = hcd_to_ohci(hcd); | ||
171 | |||
172 | if (time_before(jiffies, ohci->next_statechange)) | ||
173 | msleep(5); | ||
174 | ohci->next_statechange = jiffies; | ||
175 | |||
176 | ep93xx_stop_hc(&pdev->dev); | ||
177 | hcd->state = HC_STATE_SUSPENDED; | ||
178 | pdev->dev.power.power_state = PMSG_SUSPEND; | ||
179 | |||
180 | return 0; | ||
181 | } | ||
182 | |||
183 | static int ohci_hcd_ep93xx_drv_resume(struct platform_device *pdev) | ||
184 | { | ||
185 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | ||
186 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | ||
187 | int status; | ||
188 | |||
189 | if (time_before(jiffies, ohci->next_statechange)) | ||
190 | msleep(5); | ||
191 | ohci->next_statechange = jiffies; | ||
192 | |||
193 | ep93xx_start_hc(&pdev->dev); | ||
194 | pdev->dev.power.power_state = PMSG_ON; | ||
195 | usb_hcd_resume_root_hub(hcd); | ||
196 | |||
197 | return 0; | ||
198 | } | ||
199 | #endif | ||
200 | |||
201 | |||
202 | static struct platform_driver ohci_hcd_ep93xx_driver = { | ||
203 | .probe = ohci_hcd_ep93xx_drv_probe, | ||
204 | .remove = ohci_hcd_ep93xx_drv_remove, | ||
205 | #ifdef CONFIG_PM | ||
206 | .suspend = ohci_hcd_ep93xx_drv_suspend, | ||
207 | .resume = ohci_hcd_ep93xx_drv_resume, | ||
208 | #endif | ||
209 | .driver = { | ||
210 | .name = "ep93xx-ohci", | ||
211 | }, | ||
212 | }; | ||
213 | |||
214 | static int __init ohci_hcd_ep93xx_init(void) | ||
215 | { | ||
216 | return platform_driver_register(&ohci_hcd_ep93xx_driver); | ||
217 | } | ||
218 | |||
219 | static void __exit ohci_hcd_ep93xx_cleanup(void) | ||
220 | { | ||
221 | platform_driver_unregister(&ohci_hcd_ep93xx_driver); | ||
222 | } | ||
223 | |||
224 | module_init(ohci_hcd_ep93xx_init); | ||
225 | module_exit(ohci_hcd_ep93xx_cleanup); | ||
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 8fb842ed5f6e..afef5ac35b4a 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -901,6 +901,10 @@ MODULE_LICENSE ("GPL"); | |||
901 | #include "ohci-pxa27x.c" | 901 | #include "ohci-pxa27x.c" |
902 | #endif | 902 | #endif |
903 | 903 | ||
904 | #ifdef CONFIG_ARCH_EP93XX | ||
905 | #include "ohci-ep93xx.c" | ||
906 | #endif | ||
907 | |||
904 | #ifdef CONFIG_SOC_AU1X00 | 908 | #ifdef CONFIG_SOC_AU1X00 |
905 | #include "ohci-au1xxx.c" | 909 | #include "ohci-au1xxx.c" |
906 | #endif | 910 | #endif |
@@ -919,6 +923,7 @@ MODULE_LICENSE ("GPL"); | |||
919 | || defined(CONFIG_ARCH_OMAP) \ | 923 | || defined(CONFIG_ARCH_OMAP) \ |
920 | || defined (CONFIG_ARCH_LH7A404) \ | 924 | || defined (CONFIG_ARCH_LH7A404) \ |
921 | || defined (CONFIG_PXA27x) \ | 925 | || defined (CONFIG_PXA27x) \ |
926 | || defined (CONFIG_ARCH_EP93XX) \ | ||
922 | || defined (CONFIG_SOC_AU1X00) \ | 927 | || defined (CONFIG_SOC_AU1X00) \ |
923 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ | 928 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ |
924 | || defined (CONFIG_ARCH_AT91RM9200) \ | 929 | || defined (CONFIG_ARCH_AT91RM9200) \ |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 0bb972b58336..5b0a23fd798b 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -581,14 +581,14 @@ static int ohci_hub_control ( | |||
581 | break; | 581 | break; |
582 | case GetHubStatus: | 582 | case GetHubStatus: |
583 | temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE); | 583 | temp = roothub_status (ohci) & ~(RH_HS_CRWE | RH_HS_DRWE); |
584 | *(__le32 *) buf = cpu_to_le32 (temp); | 584 | put_unaligned(cpu_to_le32 (temp), (__le32 *) buf); |
585 | break; | 585 | break; |
586 | case GetPortStatus: | 586 | case GetPortStatus: |
587 | if (!wIndex || wIndex > ports) | 587 | if (!wIndex || wIndex > ports) |
588 | goto error; | 588 | goto error; |
589 | wIndex--; | 589 | wIndex--; |
590 | temp = roothub_portstatus (ohci, wIndex); | 590 | temp = roothub_portstatus (ohci, wIndex); |
591 | *(__le32 *) buf = cpu_to_le32 (temp); | 591 | put_unaligned(cpu_to_le32 (temp), (__le32 *) buf); |
592 | 592 | ||
593 | #ifndef OHCI_VERBOSE_DEBUG | 593 | #ifndef OHCI_VERBOSE_DEBUG |
594 | if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ | 594 | if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index dff60568b4a1..20861650905e 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
@@ -167,8 +167,6 @@ static int __devinit mmio_resource_enabled(struct pci_dev *pdev, int idx) | |||
167 | static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | 167 | static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) |
168 | { | 168 | { |
169 | void __iomem *base; | 169 | void __iomem *base; |
170 | int wait_time; | ||
171 | u32 control; | ||
172 | 170 | ||
173 | if (!mmio_resource_enabled(pdev, 0)) | 171 | if (!mmio_resource_enabled(pdev, 0)) |
174 | return; | 172 | return; |
@@ -179,9 +177,10 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
179 | 177 | ||
180 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ | 178 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ |
181 | #ifndef __hppa__ | 179 | #ifndef __hppa__ |
182 | control = readl(base + OHCI_CONTROL); | 180 | { |
181 | u32 control = readl(base + OHCI_CONTROL); | ||
183 | if (control & OHCI_CTRL_IR) { | 182 | if (control & OHCI_CTRL_IR) { |
184 | wait_time = 500; /* arbitrary; 5 seconds */ | 183 | int wait_time = 500; /* arbitrary; 5 seconds */ |
185 | writel(OHCI_INTR_OC, base + OHCI_INTRENABLE); | 184 | writel(OHCI_INTR_OC, base + OHCI_INTRENABLE); |
186 | writel(OHCI_OCR, base + OHCI_CMDSTATUS); | 185 | writel(OHCI_OCR, base + OHCI_CMDSTATUS); |
187 | while (wait_time > 0 && | 186 | while (wait_time > 0 && |
@@ -198,6 +197,7 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
198 | /* reset controller, preserving RWC */ | 197 | /* reset controller, preserving RWC */ |
199 | writel(control & OHCI_CTRL_RWC, base + OHCI_CONTROL); | 198 | writel(control & OHCI_CTRL_RWC, base + OHCI_CONTROL); |
200 | } | 199 | } |
200 | } | ||
201 | #endif | 201 | #endif |
202 | 202 | ||
203 | /* | 203 | /* |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index b9fb9687f926..8ea9c915fbf9 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
@@ -1507,6 +1507,9 @@ void hid_init_reports(struct hid_device *hid) | |||
1507 | #define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 | 1507 | #define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 |
1508 | #define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866 | 1508 | #define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866 |
1509 | 1509 | ||
1510 | #define USB_VENDOR_ID_WISEGROUP_LTD 0x6677 | ||
1511 | #define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802 | ||
1512 | |||
1510 | #define USB_VENDOR_ID_CODEMERCS 0x07c0 | 1513 | #define USB_VENDOR_ID_CODEMERCS 0x07c0 |
1511 | #define USB_DEVICE_ID_CODEMERCS_IOW40 0x1500 | 1514 | #define USB_DEVICE_ID_CODEMERCS_IOW40 0x1500 |
1512 | #define USB_DEVICE_ID_CODEMERCS_IOW24 0x1501 | 1515 | #define USB_DEVICE_ID_CODEMERCS_IOW24 0x1501 |
@@ -1670,6 +1673,7 @@ static const struct hid_blacklist { | |||
1670 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET }, | 1673 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET }, |
1671 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET }, | 1674 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET }, |
1672 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, | 1675 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, |
1676 | { USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, | ||
1673 | 1677 | ||
1674 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, | 1678 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, |
1675 | { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, | 1679 | { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, |
diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index daa486dde8cf..88928a4be805 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig | |||
@@ -88,19 +88,19 @@ config USB_LED | |||
88 | To compile this driver as a module, choose M here: the | 88 | To compile this driver as a module, choose M here: the |
89 | module will be called usbled. | 89 | module will be called usbled. |
90 | 90 | ||
91 | config USB_CY7C63 | 91 | config USB_CYPRESS_CY7C63 |
92 | tristate "Cypress CY7C63xxx USB driver support" | 92 | tristate "Cypress CY7C63xxx USB driver support" |
93 | depends on USB | 93 | depends on USB |
94 | help | 94 | help |
95 | Say Y here if you want to connect a Cypress CY7C63xxx | 95 | Say Y here if you want to connect a Cypress CY7C63xxx |
96 | micro controller to your computer's USB port. This driver | 96 | micro controller to your computer's USB port. Currently this |
97 | supports the pre-programmed devices (incl. firmware) by | 97 | driver supports the pre-programmed devices (incl. firmware) |
98 | AK Modul-Bus Computer GmbH. | 98 | by AK Modul-Bus Computer GmbH. |
99 | 99 | ||
100 | Please see: http://www.ak-modul-bus.de/stat/mikrocontroller.html | 100 | Please see: http://www.ak-modul-bus.de/stat/mikrocontroller.html |
101 | 101 | ||
102 | To compile this driver as a module, choose M here: the | 102 | To compile this driver as a module, choose M here: the |
103 | module will be called cy7c63. | 103 | module will be called cypress_cy7c63. |
104 | 104 | ||
105 | config USB_CYTHERM | 105 | config USB_CYTHERM |
106 | tristate "Cypress USB thermometer driver support" | 106 | tristate "Cypress USB thermometer driver support" |
diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile index f25a97227297..2927260c5812 100644 --- a/drivers/usb/misc/Makefile +++ b/drivers/usb/misc/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o | 6 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o |
7 | obj-$(CONFIG_USB_CY7C63) += cy7c63.o | 7 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o |
8 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o | 8 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o |
9 | obj-$(CONFIG_USB_EMI26) += emi26.o | 9 | obj-$(CONFIG_USB_EMI26) += emi26.o |
10 | obj-$(CONFIG_USB_EMI62) += emi62.o | 10 | obj-$(CONFIG_USB_EMI62) += emi62.o |
diff --git a/drivers/usb/misc/cy7c63.c b/drivers/usb/misc/cy7c63.c deleted file mode 100644 index 8a1c10b89b76..000000000000 --- a/drivers/usb/misc/cy7c63.c +++ /dev/null | |||
@@ -1,244 +0,0 @@ | |||
1 | /* | ||
2 | * cy7c63.c | ||
3 | * | ||
4 | * Copyright (c) 2006 Oliver Bock (bock@fh-wolfenbuettel.de) | ||
5 | * | ||
6 | * This driver is based on the Cypress Thermometer USB Driver by | ||
7 | * Marcus Maul and the 2.0 version of Greg Kroah-Hartman's | ||
8 | * USB Skeleton driver. | ||
9 | * | ||
10 | * Is is a generic driver for the Cypress CY7C63000 family. | ||
11 | * For the time being it enables you to toggle the single I/O ports | ||
12 | * of the device. | ||
13 | * | ||
14 | * Supported vendors: AK Modul-Bus Computer GmbH | ||
15 | * Supported devices: CY7C63001A-PC (to be continued...) | ||
16 | * Supported functions: Read/Write Ports (to be continued...) | ||
17 | * | ||
18 | * Chipsets families: CY7C63000, CY7C63001, CY7C63100, CY7C63101 | ||
19 | * | ||
20 | * | ||
21 | * This program is free software; you can redistribute it and/or | ||
22 | * modify it under the terms of the GNU General Public License as | ||
23 | * published by the Free Software Foundation, version 2. | ||
24 | */ | ||
25 | |||
26 | #include <linux/init.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <linux/kernel.h> | ||
29 | #include <linux/usb.h> | ||
30 | |||
31 | #define DRIVER_AUTHOR "Oliver Bock (bock@fh-wolfenbuettel.de)" | ||
32 | #define DRIVER_DESC "Cypress CY7C63xxx USB driver" | ||
33 | |||
34 | #define CY7C63_VENDOR_ID 0xa2c | ||
35 | #define CY7C63_PRODUCT_ID 0x8 | ||
36 | |||
37 | #define CY7C63_READ_PORT 0x4 | ||
38 | #define CY7C63_WRITE_PORT 0x5 | ||
39 | #define CY7C63_READ_RAM 0x2 | ||
40 | #define CY7C63_WRITE_RAM 0x3 | ||
41 | #define CY7C63_READ_ROM 0x1 | ||
42 | |||
43 | #define CY7C63_READ_PORT_ID0 0 | ||
44 | #define CY7C63_WRITE_PORT_ID0 0 | ||
45 | #define CY7C63_READ_PORT_ID1 0x2 | ||
46 | #define CY7C63_WRITE_PORT_ID1 1 | ||
47 | |||
48 | #define CY7C63_MAX_REQSIZE 8 | ||
49 | |||
50 | |||
51 | /* table of devices that work with this driver */ | ||
52 | static struct usb_device_id cy7c63_table [] = { | ||
53 | { USB_DEVICE(CY7C63_VENDOR_ID, CY7C63_PRODUCT_ID) }, | ||
54 | { } | ||
55 | }; | ||
56 | MODULE_DEVICE_TABLE(usb, cy7c63_table); | ||
57 | |||
58 | /* structure to hold all of our device specific stuff */ | ||
59 | struct cy7c63 { | ||
60 | struct usb_device * udev; | ||
61 | char port0; | ||
62 | char port1; | ||
63 | }; | ||
64 | |||
65 | /* used to send usb control messages to device */ | ||
66 | int vendor_command(struct cy7c63 *dev, unsigned char request, | ||
67 | unsigned char address, unsigned char data) { | ||
68 | |||
69 | int retval = 0; | ||
70 | unsigned int pipe; | ||
71 | unsigned char *iobuf; | ||
72 | |||
73 | /* allocate some memory for the i/o buffer*/ | ||
74 | iobuf = kzalloc(CY7C63_MAX_REQSIZE, GFP_KERNEL); | ||
75 | if (!iobuf) { | ||
76 | dev_err(&dev->udev->dev, "Out of memory!\n"); | ||
77 | retval = -ENOMEM; | ||
78 | goto error; | ||
79 | } | ||
80 | |||
81 | dev_dbg(&dev->udev->dev, "Sending usb_control_msg (data: %d)\n", data); | ||
82 | |||
83 | /* prepare usb control message and send it upstream */ | ||
84 | pipe = usb_rcvctrlpipe(dev->udev, 0); | ||
85 | retval = usb_control_msg(dev->udev, pipe, request, | ||
86 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER, | ||
87 | address, data, iobuf, CY7C63_MAX_REQSIZE, | ||
88 | USB_CTRL_GET_TIMEOUT); | ||
89 | |||
90 | /* store returned data (more READs to be added!) */ | ||
91 | switch (request) { | ||
92 | case CY7C63_READ_PORT: | ||
93 | if (address == CY7C63_READ_PORT_ID0) { | ||
94 | dev->port0 = iobuf[1]; | ||
95 | dev_dbg(&dev->udev->dev, | ||
96 | "READ_PORT0 returned: %d\n",dev->port0); | ||
97 | } | ||
98 | else if (address == CY7C63_READ_PORT_ID1) { | ||
99 | dev->port1 = iobuf[1]; | ||
100 | dev_dbg(&dev->udev->dev, | ||
101 | "READ_PORT1 returned: %d\n",dev->port1); | ||
102 | } | ||
103 | break; | ||
104 | } | ||
105 | |||
106 | kfree(iobuf); | ||
107 | error: | ||
108 | return retval; | ||
109 | } | ||
110 | |||
111 | #define get_set_port(num,read_id,write_id) \ | ||
112 | static ssize_t set_port##num(struct device *dev, struct device_attribute *attr, \ | ||
113 | const char *buf, size_t count) { \ | ||
114 | \ | ||
115 | int value; \ | ||
116 | int result = 0; \ | ||
117 | \ | ||
118 | struct usb_interface *intf = to_usb_interface(dev); \ | ||
119 | struct cy7c63 *cyp = usb_get_intfdata(intf); \ | ||
120 | \ | ||
121 | dev_dbg(&cyp->udev->dev, "WRITE_PORT%d called\n", num); \ | ||
122 | \ | ||
123 | /* validate input data */ \ | ||
124 | if (sscanf(buf, "%d", &value) < 1) { \ | ||
125 | result = -EINVAL; \ | ||
126 | goto error; \ | ||
127 | } \ | ||
128 | if (value>255 || value<0) { \ | ||
129 | result = -EINVAL; \ | ||
130 | goto error; \ | ||
131 | } \ | ||
132 | \ | ||
133 | result = vendor_command(cyp, CY7C63_WRITE_PORT, write_id, \ | ||
134 | (unsigned char)value); \ | ||
135 | \ | ||
136 | dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n",result); \ | ||
137 | error: \ | ||
138 | return result < 0 ? result : count; \ | ||
139 | } \ | ||
140 | \ | ||
141 | static ssize_t get_port##num(struct device *dev, \ | ||
142 | struct device_attribute *attr, char *buf) { \ | ||
143 | \ | ||
144 | int result = 0; \ | ||
145 | \ | ||
146 | struct usb_interface *intf = to_usb_interface(dev); \ | ||
147 | struct cy7c63 *cyp = usb_get_intfdata(intf); \ | ||
148 | \ | ||
149 | dev_dbg(&cyp->udev->dev, "READ_PORT%d called\n", num); \ | ||
150 | \ | ||
151 | result = vendor_command(cyp, CY7C63_READ_PORT, read_id, 0); \ | ||
152 | \ | ||
153 | dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result); \ | ||
154 | \ | ||
155 | return sprintf(buf, "%d", cyp->port##num); \ | ||
156 | } \ | ||
157 | static DEVICE_ATTR(port##num, S_IWUGO | S_IRUGO, get_port##num, set_port##num); | ||
158 | |||
159 | get_set_port(0, CY7C63_READ_PORT_ID0, CY7C63_WRITE_PORT_ID0); | ||
160 | get_set_port(1, CY7C63_READ_PORT_ID1, CY7C63_WRITE_PORT_ID1); | ||
161 | |||
162 | static int cy7c63_probe(struct usb_interface *interface, | ||
163 | const struct usb_device_id *id) { | ||
164 | |||
165 | struct cy7c63 *dev = NULL; | ||
166 | int retval = -ENOMEM; | ||
167 | |||
168 | /* allocate memory for our device state and initialize it */ | ||
169 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
170 | if (dev == NULL) { | ||
171 | dev_err(&dev->udev->dev, "Out of memory!\n"); | ||
172 | goto error; | ||
173 | } | ||
174 | |||
175 | dev->udev = usb_get_dev(interface_to_usbdev(interface)); | ||
176 | |||
177 | /* save our data pointer in this interface device */ | ||
178 | usb_set_intfdata(interface, dev); | ||
179 | |||
180 | /* create device attribute files */ | ||
181 | device_create_file(&interface->dev, &dev_attr_port0); | ||
182 | device_create_file(&interface->dev, &dev_attr_port1); | ||
183 | |||
184 | /* let the user know what node this device is now attached to */ | ||
185 | dev_info(&interface->dev, | ||
186 | "Cypress CY7C63xxx device now attached\n"); | ||
187 | |||
188 | retval = 0; | ||
189 | error: | ||
190 | return retval; | ||
191 | } | ||
192 | |||
193 | static void cy7c63_disconnect(struct usb_interface *interface) { | ||
194 | |||
195 | struct cy7c63 *dev; | ||
196 | |||
197 | dev = usb_get_intfdata(interface); | ||
198 | usb_set_intfdata(interface, NULL); | ||
199 | |||
200 | /* remove device attribute files */ | ||
201 | device_remove_file(&interface->dev, &dev_attr_port0); | ||
202 | device_remove_file(&interface->dev, &dev_attr_port1); | ||
203 | |||
204 | usb_put_dev(dev->udev); | ||
205 | |||
206 | dev_info(&interface->dev, | ||
207 | "Cypress CY7C63xxx device now disconnected\n"); | ||
208 | |||
209 | kfree(dev); | ||
210 | } | ||
211 | |||
212 | static struct usb_driver cy7c63_driver = { | ||
213 | .name = "cy7c63", | ||
214 | .probe = cy7c63_probe, | ||
215 | .disconnect = cy7c63_disconnect, | ||
216 | .id_table = cy7c63_table, | ||
217 | }; | ||
218 | |||
219 | static int __init cy7c63_init(void) { | ||
220 | |||
221 | int result; | ||
222 | |||
223 | /* register this driver with the USB subsystem */ | ||
224 | result = usb_register(&cy7c63_driver); | ||
225 | if (result) { | ||
226 | err("Function usb_register failed! Error number: %d\n", result); | ||
227 | } | ||
228 | |||
229 | return result; | ||
230 | } | ||
231 | |||
232 | static void __exit cy7c63_exit(void) { | ||
233 | |||
234 | /* deregister this driver with the USB subsystem */ | ||
235 | usb_deregister(&cy7c63_driver); | ||
236 | } | ||
237 | |||
238 | module_init(cy7c63_init); | ||
239 | module_exit(cy7c63_exit); | ||
240 | |||
241 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
242 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
243 | |||
244 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/misc/cypress_cy7c63.c b/drivers/usb/misc/cypress_cy7c63.c new file mode 100644 index 000000000000..e091d327bd9e --- /dev/null +++ b/drivers/usb/misc/cypress_cy7c63.c | |||
@@ -0,0 +1,279 @@ | |||
1 | /* | ||
2 | * cypress_cy7c63.c | ||
3 | * | ||
4 | * Copyright (c) 2006 Oliver Bock (o.bock@fh-wolfenbuettel.de) | ||
5 | * | ||
6 | * This driver is based on the Cypress USB Driver by Marcus Maul | ||
7 | * (cyport) and the 2.0 version of Greg Kroah-Hartman's | ||
8 | * USB Skeleton driver. | ||
9 | * | ||
10 | * This is a generic driver for the Cypress CY7C63xxx family. | ||
11 | * For the time being it enables you to read from and write to | ||
12 | * the single I/O ports of the device. | ||
13 | * | ||
14 | * Supported vendors: AK Modul-Bus Computer GmbH | ||
15 | * Supported devices: CY7C63001A-PC (to be continued...) | ||
16 | * Supported functions: Read/Write Ports (to be continued...) | ||
17 | * | ||
18 | * | ||
19 | * This program is free software; you can redistribute it and/or | ||
20 | * modify it under the terms of the GNU General Public License as | ||
21 | * published by the Free Software Foundation, version 2. | ||
22 | */ | ||
23 | |||
24 | #include <linux/init.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/usb.h> | ||
28 | |||
29 | #define DRIVER_AUTHOR "Oliver Bock (o.bock@fh-wolfenbuettel.de)" | ||
30 | #define DRIVER_DESC "Cypress CY7C63xxx USB driver" | ||
31 | |||
32 | #define CYPRESS_VENDOR_ID 0xa2c | ||
33 | #define CYPRESS_PRODUCT_ID 0x8 | ||
34 | |||
35 | #define CYPRESS_READ_PORT 0x4 | ||
36 | #define CYPRESS_WRITE_PORT 0x5 | ||
37 | |||
38 | #define CYPRESS_READ_RAM 0x2 | ||
39 | #define CYPRESS_WRITE_RAM 0x3 | ||
40 | #define CYPRESS_READ_ROM 0x1 | ||
41 | |||
42 | #define CYPRESS_READ_PORT_ID0 0 | ||
43 | #define CYPRESS_WRITE_PORT_ID0 0 | ||
44 | #define CYPRESS_READ_PORT_ID1 0x2 | ||
45 | #define CYPRESS_WRITE_PORT_ID1 1 | ||
46 | |||
47 | #define CYPRESS_MAX_REQSIZE 8 | ||
48 | |||
49 | |||
50 | /* table of devices that work with this driver */ | ||
51 | static struct usb_device_id cypress_table [] = { | ||
52 | { USB_DEVICE(CYPRESS_VENDOR_ID, CYPRESS_PRODUCT_ID) }, | ||
53 | { } | ||
54 | }; | ||
55 | MODULE_DEVICE_TABLE(usb, cypress_table); | ||
56 | |||
57 | /* structure to hold all of our device specific stuff */ | ||
58 | struct cypress { | ||
59 | struct usb_device * udev; | ||
60 | unsigned char port[2]; | ||
61 | }; | ||
62 | |||
63 | /* used to send usb control messages to device */ | ||
64 | static int vendor_command(struct cypress *dev, unsigned char request, | ||
65 | unsigned char address, unsigned char data) | ||
66 | { | ||
67 | int retval = 0; | ||
68 | unsigned int pipe; | ||
69 | unsigned char *iobuf; | ||
70 | |||
71 | /* allocate some memory for the i/o buffer*/ | ||
72 | iobuf = kzalloc(CYPRESS_MAX_REQSIZE, GFP_KERNEL); | ||
73 | if (!iobuf) { | ||
74 | dev_err(&dev->udev->dev, "Out of memory!\n"); | ||
75 | retval = -ENOMEM; | ||
76 | goto error; | ||
77 | } | ||
78 | |||
79 | dev_dbg(&dev->udev->dev, "Sending usb_control_msg (data: %d)\n", data); | ||
80 | |||
81 | /* prepare usb control message and send it upstream */ | ||
82 | pipe = usb_rcvctrlpipe(dev->udev, 0); | ||
83 | retval = usb_control_msg(dev->udev, pipe, request, | ||
84 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER, | ||
85 | address, data, iobuf, CYPRESS_MAX_REQSIZE, | ||
86 | USB_CTRL_GET_TIMEOUT); | ||
87 | |||
88 | /* store returned data (more READs to be added) */ | ||
89 | switch (request) { | ||
90 | case CYPRESS_READ_PORT: | ||
91 | if (address == CYPRESS_READ_PORT_ID0) { | ||
92 | dev->port[0] = iobuf[1]; | ||
93 | dev_dbg(&dev->udev->dev, | ||
94 | "READ_PORT0 returned: %d\n", | ||
95 | dev->port[0]); | ||
96 | } | ||
97 | else if (address == CYPRESS_READ_PORT_ID1) { | ||
98 | dev->port[1] = iobuf[1]; | ||
99 | dev_dbg(&dev->udev->dev, | ||
100 | "READ_PORT1 returned: %d\n", | ||
101 | dev->port[1]); | ||
102 | } | ||
103 | break; | ||
104 | } | ||
105 | |||
106 | kfree(iobuf); | ||
107 | error: | ||
108 | return retval; | ||
109 | } | ||
110 | |||
111 | /* write port value */ | ||
112 | static ssize_t write_port(struct device *dev, struct device_attribute *attr, | ||
113 | const char *buf, size_t count, | ||
114 | int port_num, int write_id) | ||
115 | { | ||
116 | int value = -1; | ||
117 | int result = 0; | ||
118 | |||
119 | struct usb_interface *intf = to_usb_interface(dev); | ||
120 | struct cypress *cyp = usb_get_intfdata(intf); | ||
121 | |||
122 | dev_dbg(&cyp->udev->dev, "WRITE_PORT%d called\n", port_num); | ||
123 | |||
124 | /* validate input data */ | ||
125 | if (sscanf(buf, "%d", &value) < 1) { | ||
126 | result = -EINVAL; | ||
127 | goto error; | ||
128 | } | ||
129 | if (value < 0 || value > 255) { | ||
130 | result = -EINVAL; | ||
131 | goto error; | ||
132 | } | ||
133 | |||
134 | result = vendor_command(cyp, CYPRESS_WRITE_PORT, write_id, | ||
135 | (unsigned char)value); | ||
136 | |||
137 | dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result); | ||
138 | error: | ||
139 | return result < 0 ? result : count; | ||
140 | } | ||
141 | |||
142 | /* attribute callback handler (write) */ | ||
143 | static ssize_t set_port0_handler(struct device *dev, | ||
144 | struct device_attribute *attr, | ||
145 | const char *buf, size_t count) | ||
146 | { | ||
147 | return write_port(dev, attr, buf, count, 0, CYPRESS_WRITE_PORT_ID0); | ||
148 | } | ||
149 | |||
150 | /* attribute callback handler (write) */ | ||
151 | static ssize_t set_port1_handler(struct device *dev, | ||
152 | struct device_attribute *attr, | ||
153 | const char *buf, size_t count) | ||
154 | { | ||
155 | return write_port(dev, attr, buf, count, 1, CYPRESS_WRITE_PORT_ID1); | ||
156 | } | ||
157 | |||
158 | /* read port value */ | ||
159 | static ssize_t read_port(struct device *dev, struct device_attribute *attr, | ||
160 | char *buf, int port_num, int read_id) | ||
161 | { | ||
162 | int result = 0; | ||
163 | |||
164 | struct usb_interface *intf = to_usb_interface(dev); | ||
165 | struct cypress *cyp = usb_get_intfdata(intf); | ||
166 | |||
167 | dev_dbg(&cyp->udev->dev, "READ_PORT%d called\n", port_num); | ||
168 | |||
169 | result = vendor_command(cyp, CYPRESS_READ_PORT, read_id, 0); | ||
170 | |||
171 | dev_dbg(&cyp->udev->dev, "Result of vendor_command: %d\n\n", result); | ||
172 | |||
173 | return sprintf(buf, "%d", cyp->port[port_num]); | ||
174 | } | ||
175 | |||
176 | /* attribute callback handler (read) */ | ||
177 | static ssize_t get_port0_handler(struct device *dev, | ||
178 | struct device_attribute *attr, char *buf) | ||
179 | { | ||
180 | return read_port(dev, attr, buf, 0, CYPRESS_READ_PORT_ID0); | ||
181 | } | ||
182 | |||
183 | /* attribute callback handler (read) */ | ||
184 | static ssize_t get_port1_handler(struct device *dev, | ||
185 | struct device_attribute *attr, char *buf) | ||
186 | { | ||
187 | return read_port(dev, attr, buf, 1, CYPRESS_READ_PORT_ID1); | ||
188 | } | ||
189 | |||
190 | static DEVICE_ATTR(port0, S_IWUGO | S_IRUGO, | ||
191 | get_port0_handler, set_port0_handler); | ||
192 | |||
193 | static DEVICE_ATTR(port1, S_IWUGO | S_IRUGO, | ||
194 | get_port1_handler, set_port1_handler); | ||
195 | |||
196 | |||
197 | static int cypress_probe(struct usb_interface *interface, | ||
198 | const struct usb_device_id *id) | ||
199 | { | ||
200 | struct cypress *dev = NULL; | ||
201 | int retval = -ENOMEM; | ||
202 | |||
203 | /* allocate memory for our device state and initialize it */ | ||
204 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
205 | if (dev == NULL) { | ||
206 | dev_err(&dev->udev->dev, "Out of memory!\n"); | ||
207 | goto error; | ||
208 | } | ||
209 | |||
210 | dev->udev = usb_get_dev(interface_to_usbdev(interface)); | ||
211 | |||
212 | /* save our data pointer in this interface device */ | ||
213 | usb_set_intfdata(interface, dev); | ||
214 | |||
215 | /* create device attribute files */ | ||
216 | device_create_file(&interface->dev, &dev_attr_port0); | ||
217 | device_create_file(&interface->dev, &dev_attr_port1); | ||
218 | |||
219 | /* let the user know that the device is now attached */ | ||
220 | dev_info(&interface->dev, | ||
221 | "Cypress CY7C63xxx device now attached\n"); | ||
222 | |||
223 | retval = 0; | ||
224 | error: | ||
225 | return retval; | ||
226 | } | ||
227 | |||
228 | static void cypress_disconnect(struct usb_interface *interface) | ||
229 | { | ||
230 | struct cypress *dev; | ||
231 | |||
232 | dev = usb_get_intfdata(interface); | ||
233 | usb_set_intfdata(interface, NULL); | ||
234 | |||
235 | /* remove device attribute files */ | ||
236 | device_remove_file(&interface->dev, &dev_attr_port0); | ||
237 | device_remove_file(&interface->dev, &dev_attr_port1); | ||
238 | |||
239 | usb_put_dev(dev->udev); | ||
240 | |||
241 | dev_info(&interface->dev, | ||
242 | "Cypress CY7C63xxx device now disconnected\n"); | ||
243 | |||
244 | kfree(dev); | ||
245 | } | ||
246 | |||
247 | static struct usb_driver cypress_driver = { | ||
248 | .name = "cypress_cy7c63", | ||
249 | .probe = cypress_probe, | ||
250 | .disconnect = cypress_disconnect, | ||
251 | .id_table = cypress_table, | ||
252 | }; | ||
253 | |||
254 | static int __init cypress_init(void) | ||
255 | { | ||
256 | int result; | ||
257 | |||
258 | /* register this driver with the USB subsystem */ | ||
259 | result = usb_register(&cypress_driver); | ||
260 | if (result) { | ||
261 | err("Function usb_register failed! Error number: %d\n", result); | ||
262 | } | ||
263 | |||
264 | return result; | ||
265 | } | ||
266 | |||
267 | static void __exit cypress_exit(void) | ||
268 | { | ||
269 | /* deregister this driver with the USB subsystem */ | ||
270 | usb_deregister(&cypress_driver); | ||
271 | } | ||
272 | |||
273 | module_init(cypress_init); | ||
274 | module_exit(cypress_exit); | ||
275 | |||
276 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
277 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
278 | |||
279 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/misc/usblcd.c b/drivers/usb/misc/usblcd.c index c82c402285a0..e095772dd8e9 100644 --- a/drivers/usb/misc/usblcd.c +++ b/drivers/usb/misc/usblcd.c | |||
@@ -200,10 +200,8 @@ static ssize_t lcd_write(struct file *file, const char __user * user_buffer, siz | |||
200 | 200 | ||
201 | /* create a urb, and a buffer for it, and copy the data to the urb */ | 201 | /* create a urb, and a buffer for it, and copy the data to the urb */ |
202 | urb = usb_alloc_urb(0, GFP_KERNEL); | 202 | urb = usb_alloc_urb(0, GFP_KERNEL); |
203 | if (!urb) { | 203 | if (!urb) |
204 | retval = -ENOMEM; | 204 | return -ENOMEM; |
205 | goto error; | ||
206 | } | ||
207 | 205 | ||
208 | buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma); | 206 | buf = usb_buffer_alloc(dev->udev, count, GFP_KERNEL, &urb->transfer_dma); |
209 | if (!buf) { | 207 | if (!buf) { |
diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c index e02c1a30c4cd..f961a770cee2 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c | |||
@@ -64,7 +64,6 @@ struct mon_reader_text { | |||
64 | }; | 64 | }; |
65 | 65 | ||
66 | static void mon_text_ctor(void *, kmem_cache_t *, unsigned long); | 66 | static void mon_text_ctor(void *, kmem_cache_t *, unsigned long); |
67 | static void mon_text_dtor(void *, kmem_cache_t *, unsigned long); | ||
68 | 67 | ||
69 | /* | 68 | /* |
70 | * mon_text_submit | 69 | * mon_text_submit |
@@ -268,7 +267,7 @@ static int mon_text_open(struct inode *inode, struct file *file) | |||
268 | (long)rp); | 267 | (long)rp); |
269 | rp->e_slab = kmem_cache_create(rp->slab_name, | 268 | rp->e_slab = kmem_cache_create(rp->slab_name, |
270 | sizeof(struct mon_event_text), sizeof(long), 0, | 269 | sizeof(struct mon_event_text), sizeof(long), 0, |
271 | mon_text_ctor, mon_text_dtor); | 270 | mon_text_ctor, NULL); |
272 | if (rp->e_slab == NULL) { | 271 | if (rp->e_slab == NULL) { |
273 | rc = -ENOMEM; | 272 | rc = -ENOMEM; |
274 | goto err_slab; | 273 | goto err_slab; |
@@ -459,7 +458,3 @@ static void mon_text_ctor(void *mem, kmem_cache_t *slab, unsigned long sflags) | |||
459 | memset(mem, 0xe5, sizeof(struct mon_event_text)); | 458 | memset(mem, 0xe5, sizeof(struct mon_event_text)); |
460 | } | 459 | } |
461 | 460 | ||
462 | static void mon_text_dtor(void *mem, kmem_cache_t *slab, unsigned long sflags) | ||
463 | { | ||
464 | ; | ||
465 | } | ||
diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index 718f8e2b552b..e5e6e4f3ef87 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c | |||
@@ -128,11 +128,13 @@ | |||
128 | #define VENDOR_ID_MELCO 0x0411 | 128 | #define VENDOR_ID_MELCO 0x0411 |
129 | #define VENDOR_ID_MICRONET 0x3980 | 129 | #define VENDOR_ID_MICRONET 0x3980 |
130 | #define VENDOR_ID_LONGSHINE 0x07b8 | 130 | #define VENDOR_ID_LONGSHINE 0x07b8 |
131 | #define VENDOR_ID_ZYXEL 0x0586 | ||
131 | 132 | ||
132 | #define PRODUCT_ID_RTL8150 0x8150 | 133 | #define PRODUCT_ID_RTL8150 0x8150 |
133 | #define PRODUCT_ID_LUAKTX 0x0012 | 134 | #define PRODUCT_ID_LUAKTX 0x0012 |
134 | #define PRODUCT_ID_LCS8138TX 0x401a | 135 | #define PRODUCT_ID_LCS8138TX 0x401a |
135 | #define PRODUCT_ID_SP128AR 0x0003 | 136 | #define PRODUCT_ID_SP128AR 0x0003 |
137 | #define PRODUCT_ID_PRESTIGE 0x401a | ||
136 | 138 | ||
137 | #undef EEPROM_WRITE | 139 | #undef EEPROM_WRITE |
138 | 140 | ||
@@ -142,6 +144,7 @@ static struct usb_device_id rtl8150_table[] = { | |||
142 | {USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)}, | 144 | {USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)}, |
143 | {USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)}, | 145 | {USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)}, |
144 | {USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)}, | 146 | {USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)}, |
147 | {USB_DEVICE(VENDOR_ID_ZYXEL, PRODUCT_ID_PRESTIGE)}, | ||
145 | {} | 148 | {} |
146 | }; | 149 | }; |
147 | 150 | ||
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index 8bd44fda5eaf..ac33bd47cfce 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
@@ -456,6 +456,17 @@ config USB_SERIAL_SAFE_PADDED | |||
456 | bool "USB Secure Encapsulated Driver - Padded" | 456 | bool "USB Secure Encapsulated Driver - Padded" |
457 | depends on USB_SERIAL_SAFE | 457 | depends on USB_SERIAL_SAFE |
458 | 458 | ||
459 | config USB_SERIAL_SIERRAWIRELESS | ||
460 | tristate "USB Sierra Wireless Driver" | ||
461 | depends on USB_SERIAL | ||
462 | help | ||
463 | Say M here if you want to use a Sierra Wireless device (if | ||
464 | using an PC 5220 or AC580 please use the Airprime driver | ||
465 | instead). | ||
466 | |||
467 | To compile this driver as a module, choose M here: the | ||
468 | module will be called sierra. | ||
469 | |||
459 | config USB_SERIAL_TI | 470 | config USB_SERIAL_TI |
460 | tristate "USB TI 3410/5052 Serial Driver" | 471 | tristate "USB TI 3410/5052 Serial Driver" |
461 | depends on USB_SERIAL | 472 | depends on USB_SERIAL |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 5a0960fc9d3e..35d4acc7f1d3 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
@@ -39,6 +39,7 @@ obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o | |||
39 | obj-$(CONFIG_USB_SERIAL_OPTION) += option.o | 39 | obj-$(CONFIG_USB_SERIAL_OPTION) += option.o |
40 | obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o | 40 | obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o |
41 | obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o | 41 | obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o |
42 | obj-$(CONFIG_USB_SERIAL_SIERRAWIRELESS) += sierra.o | ||
42 | obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o | 43 | obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o |
43 | obj-$(CONFIG_USB_SERIAL_VISOR) += visor.o | 44 | obj-$(CONFIG_USB_SERIAL_VISOR) += visor.o |
44 | obj-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat.o | 45 | obj-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat.o |
diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c index 94b9ba0ff875..62082532a8b3 100644 --- a/drivers/usb/serial/airprime.c +++ b/drivers/usb/serial/airprime.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/tty.h> | 13 | #include <linux/tty.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include "usb-serial.h" | 16 | #include <linux/usb/serial.h> |
17 | 17 | ||
18 | static struct usb_device_id id_table [] = { | 18 | static struct usb_device_id id_table [] = { |
19 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ | 19 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ |
diff --git a/drivers/usb/serial/anydata.c b/drivers/usb/serial/anydata.c index 343f6f228220..01843ef8c11e 100644 --- a/drivers/usb/serial/anydata.c +++ b/drivers/usb/serial/anydata.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/tty.h> | 13 | #include <linux/tty.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include "usb-serial.h" | 16 | #include <linux/usb/serial.h> |
17 | 17 | ||
18 | static struct usb_device_id id_table [] = { | 18 | static struct usb_device_id id_table [] = { |
19 | { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */ | 19 | { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */ |
@@ -71,7 +71,7 @@ static int anydata_open(struct usb_serial_port *port, struct file *filp) | |||
71 | port->bulk_in_endpointAddress), | 71 | port->bulk_in_endpointAddress), |
72 | port->read_urb->transfer_buffer, | 72 | port->read_urb->transfer_buffer, |
73 | port->read_urb->transfer_buffer_length, | 73 | port->read_urb->transfer_buffer_length, |
74 | usb_serial_generic_write_bulk_callback, port); | 74 | usb_serial_generic_read_bulk_callback, port); |
75 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | 75 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); |
76 | if (result) | 76 | if (result) |
77 | dev_err(&port->dev, | 77 | dev_err(&port->dev, |
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index 8dec796222a0..970d9ef0a7a5 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
@@ -21,7 +21,7 @@ | |||
21 | #include <linux/tty.h> | 21 | #include <linux/tty.h> |
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/usb.h> | 23 | #include <linux/usb.h> |
24 | #include "usb-serial.h" | 24 | #include <linux/usb/serial.h> |
25 | 25 | ||
26 | 26 | ||
27 | static int debug; | 27 | static int debug; |
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index 3faa7aa0111a..70ece9e01ce4 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c | |||
@@ -74,7 +74,7 @@ | |||
74 | #include <linux/spinlock.h> | 74 | #include <linux/spinlock.h> |
75 | #include <asm/uaccess.h> | 75 | #include <asm/uaccess.h> |
76 | #include <linux/usb.h> | 76 | #include <linux/usb.h> |
77 | #include "usb-serial.h" | 77 | #include <linux/usb/serial.h> |
78 | #include "belkin_sa.h" | 78 | #include "belkin_sa.h" |
79 | 79 | ||
80 | static int debug; | 80 | static int debug; |
diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c index f2d993b70c18..6542f220468f 100644 --- a/drivers/usb/serial/bus.c +++ b/drivers/usb/serial/bus.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/tty.h> | 13 | #include <linux/tty.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include "usb-serial.h" | 16 | #include <linux/usb/serial.h> |
17 | 17 | ||
18 | static int usb_serial_device_match (struct device *dev, struct device_driver *drv) | 18 | static int usb_serial_device_match (struct device *dev, struct device_driver *drv) |
19 | { | 19 | { |
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 3d456b32c316..3a9073dbfe6a 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c | |||
@@ -17,11 +17,10 @@ | |||
17 | #include <linux/tty.h> | 17 | #include <linux/tty.h> |
18 | #include <linux/console.h> | 18 | #include <linux/console.h> |
19 | #include <linux/usb.h> | 19 | #include <linux/usb.h> |
20 | #include <linux/usb/serial.h> | ||
20 | 21 | ||
21 | static int debug; | 22 | static int debug; |
22 | 23 | ||
23 | #include "usb-serial.h" | ||
24 | |||
25 | struct usbcons_info { | 24 | struct usbcons_info { |
26 | int magic; | 25 | int magic; |
27 | int break_flag; | 26 | int break_flag; |
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index df0a4f98b4ae..486c7411b9a7 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/moduleparam.h> | 26 | #include <linux/moduleparam.h> |
27 | #include <linux/usb.h> | 27 | #include <linux/usb.h> |
28 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
29 | #include "usb-serial.h" | 29 | #include <linux/usb/serial.h> |
30 | 30 | ||
31 | /* | 31 | /* |
32 | * Version Information | 32 | * Version Information |
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 49b51ab0d4cb..6286aba86fae 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <linux/spinlock.h> | 39 | #include <linux/spinlock.h> |
40 | #include <asm/uaccess.h> | 40 | #include <asm/uaccess.h> |
41 | #include <linux/usb.h> | 41 | #include <linux/usb.h> |
42 | #include "usb-serial.h" | 42 | #include <linux/usb/serial.h> |
43 | 43 | ||
44 | #define CYBERJACK_LOCAL_BUF_SIZE 32 | 44 | #define CYBERJACK_LOCAL_BUF_SIZE 32 |
45 | 45 | ||
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 4ff2dfb299bd..ee70fddcab60 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -59,11 +59,11 @@ | |||
59 | #include <linux/moduleparam.h> | 59 | #include <linux/moduleparam.h> |
60 | #include <linux/spinlock.h> | 60 | #include <linux/spinlock.h> |
61 | #include <linux/usb.h> | 61 | #include <linux/usb.h> |
62 | #include <linux/usb/serial.h> | ||
62 | #include <linux/serial.h> | 63 | #include <linux/serial.h> |
63 | #include <linux/delay.h> | 64 | #include <linux/delay.h> |
64 | #include <asm/uaccess.h> | 65 | #include <asm/uaccess.h> |
65 | 66 | ||
66 | #include "usb-serial.h" | ||
67 | #include "cypress_m8.h" | 67 | #include "cypress_m8.h" |
68 | 68 | ||
69 | 69 | ||
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index 6953d3ef5738..9b225183fc7a 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
@@ -246,7 +246,7 @@ | |||
246 | #include <asm/uaccess.h> | 246 | #include <asm/uaccess.h> |
247 | #include <linux/usb.h> | 247 | #include <linux/usb.h> |
248 | #include <linux/wait.h> | 248 | #include <linux/wait.h> |
249 | #include "usb-serial.h" | 249 | #include <linux/usb/serial.h> |
250 | 250 | ||
251 | /* Defines */ | 251 | /* Defines */ |
252 | 252 | ||
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index 1e2b31eeb497..daafe405d86d 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c | |||
@@ -62,7 +62,7 @@ | |||
62 | #include <linux/spinlock.h> | 62 | #include <linux/spinlock.h> |
63 | #include <asm/uaccess.h> | 63 | #include <asm/uaccess.h> |
64 | #include <linux/usb.h> | 64 | #include <linux/usb.h> |
65 | #include "usb-serial.h" | 65 | #include <linux/usb/serial.h> |
66 | 66 | ||
67 | static int debug; | 67 | static int debug; |
68 | 68 | ||
diff --git a/drivers/usb/serial/ezusb.c b/drivers/usb/serial/ezusb.c index debc3b0f9662..5169c2d154ab 100644 --- a/drivers/usb/serial/ezusb.c +++ b/drivers/usb/serial/ezusb.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/tty.h> | 15 | #include <linux/tty.h> |
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/usb.h> | 17 | #include <linux/usb.h> |
18 | #include "usb-serial.h" | 18 | #include <linux/usb/serial.h> |
19 | 19 | ||
20 | /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ | 20 | /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */ |
21 | #define CPUCS_REG 0x7F92 | 21 | #define CPUCS_REG 0x7F92 |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 8a74b19f1283..b458aedc5fb6 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -257,7 +257,7 @@ | |||
257 | #include <asm/uaccess.h> | 257 | #include <asm/uaccess.h> |
258 | #include <linux/usb.h> | 258 | #include <linux/usb.h> |
259 | #include <linux/serial.h> | 259 | #include <linux/serial.h> |
260 | #include "usb-serial.h" | 260 | #include <linux/usb/serial.h> |
261 | #include "ftdi_sio.h" | 261 | #include "ftdi_sio.h" |
262 | 262 | ||
263 | /* | 263 | /* |
@@ -313,6 +313,7 @@ static struct usb_device_id id_table_combined [] = { | |||
313 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, | 313 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, |
314 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, | 314 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, |
315 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, | 315 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, |
316 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, | ||
316 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, | 317 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, |
317 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, | 318 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
318 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, | 319 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
@@ -500,6 +501,8 @@ static struct usb_device_id id_table_combined [] = { | |||
500 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) }, | 501 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) }, |
501 | { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, | 502 | { USB_DEVICE(FTDI_VID, FTDI_ACG_HFDUAL_PID) }, |
502 | { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, | 503 | { USB_DEVICE(FTDI_VID, FTDI_YEI_SERVOCENTER31_PID) }, |
504 | { USB_DEVICE(FTDI_VID, FTDI_THORLABS_PID) }, | ||
505 | { USB_DEVICE(TESTO_VID, TESTO_USB_INTERFACE_PID) }, | ||
503 | { }, /* Optional parameter entry */ | 506 | { }, /* Optional parameter entry */ |
504 | { } /* Terminating entry */ | 507 | { } /* Terminating entry */ |
505 | }; | 508 | }; |
@@ -548,11 +551,17 @@ struct ftdi_private { | |||
548 | spinlock_t rx_lock; /* spinlock for receive state */ | 551 | spinlock_t rx_lock; /* spinlock for receive state */ |
549 | struct work_struct rx_work; | 552 | struct work_struct rx_work; |
550 | int rx_processed; | 553 | int rx_processed; |
554 | unsigned long rx_bytes; | ||
551 | 555 | ||
552 | __u16 interface; /* FT2232C port interface (0 for FT232/245) */ | 556 | __u16 interface; /* FT2232C port interface (0 for FT232/245) */ |
553 | 557 | ||
554 | int force_baud; /* if non-zero, force the baud rate to this value */ | 558 | int force_baud; /* if non-zero, force the baud rate to this value */ |
555 | int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */ | 559 | int force_rtscts; /* if non-zero, force RTS-CTS to always be enabled */ |
560 | |||
561 | spinlock_t tx_lock; /* spinlock for transmit state */ | ||
562 | unsigned long tx_bytes; | ||
563 | unsigned long tx_outstanding_bytes; | ||
564 | unsigned long tx_outstanding_urbs; | ||
556 | }; | 565 | }; |
557 | 566 | ||
558 | /* Used for TIOCMIWAIT */ | 567 | /* Used for TIOCMIWAIT */ |
@@ -626,6 +635,9 @@ static struct usb_serial_driver ftdi_sio_device = { | |||
626 | #define HIGH 1 | 635 | #define HIGH 1 |
627 | #define LOW 0 | 636 | #define LOW 0 |
628 | 637 | ||
638 | /* number of outstanding urbs to prevent userspace DoS from happening */ | ||
639 | #define URB_UPPER_LIMIT 42 | ||
640 | |||
629 | /* | 641 | /* |
630 | * *************************************************************************** | 642 | * *************************************************************************** |
631 | * Utlity functions | 643 | * Utlity functions |
@@ -1156,6 +1168,7 @@ static int ftdi_sio_attach (struct usb_serial *serial) | |||
1156 | } | 1168 | } |
1157 | 1169 | ||
1158 | spin_lock_init(&priv->rx_lock); | 1170 | spin_lock_init(&priv->rx_lock); |
1171 | spin_lock_init(&priv->tx_lock); | ||
1159 | init_waitqueue_head(&priv->delta_msr_wait); | 1172 | init_waitqueue_head(&priv->delta_msr_wait); |
1160 | /* This will push the characters through immediately rather | 1173 | /* This will push the characters through immediately rather |
1161 | than queue a task to deliver them */ | 1174 | than queue a task to deliver them */ |
@@ -1270,6 +1283,13 @@ static int ftdi_open (struct usb_serial_port *port, struct file *filp) | |||
1270 | 1283 | ||
1271 | dbg("%s", __FUNCTION__); | 1284 | dbg("%s", __FUNCTION__); |
1272 | 1285 | ||
1286 | spin_lock_irqsave(&priv->tx_lock, flags); | ||
1287 | priv->tx_bytes = 0; | ||
1288 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1289 | spin_lock_irqsave(&priv->rx_lock, flags); | ||
1290 | priv->rx_bytes = 0; | ||
1291 | spin_unlock_irqrestore(&priv->rx_lock, flags); | ||
1292 | |||
1273 | if (port->tty) | 1293 | if (port->tty) |
1274 | port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; | 1294 | port->tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; |
1275 | 1295 | ||
@@ -1372,6 +1392,7 @@ static int ftdi_write (struct usb_serial_port *port, | |||
1372 | int data_offset ; /* will be 1 for the SIO and 0 otherwise */ | 1392 | int data_offset ; /* will be 1 for the SIO and 0 otherwise */ |
1373 | int status; | 1393 | int status; |
1374 | int transfer_size; | 1394 | int transfer_size; |
1395 | unsigned long flags; | ||
1375 | 1396 | ||
1376 | dbg("%s port %d, %d bytes", __FUNCTION__, port->number, count); | 1397 | dbg("%s port %d, %d bytes", __FUNCTION__, port->number, count); |
1377 | 1398 | ||
@@ -1379,6 +1400,13 @@ static int ftdi_write (struct usb_serial_port *port, | |||
1379 | dbg("write request of 0 bytes"); | 1400 | dbg("write request of 0 bytes"); |
1380 | return 0; | 1401 | return 0; |
1381 | } | 1402 | } |
1403 | spin_lock_irqsave(&priv->tx_lock, flags); | ||
1404 | if (priv->tx_outstanding_urbs > URB_UPPER_LIMIT) { | ||
1405 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1406 | dbg("%s - write limit hit\n", __FUNCTION__); | ||
1407 | return 0; | ||
1408 | } | ||
1409 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1382 | 1410 | ||
1383 | data_offset = priv->write_offset; | 1411 | data_offset = priv->write_offset; |
1384 | dbg("data_offset set to %d",data_offset); | 1412 | dbg("data_offset set to %d",data_offset); |
@@ -1445,6 +1473,12 @@ static int ftdi_write (struct usb_serial_port *port, | |||
1445 | err("%s - failed submitting write urb, error %d", __FUNCTION__, status); | 1473 | err("%s - failed submitting write urb, error %d", __FUNCTION__, status); |
1446 | count = status; | 1474 | count = status; |
1447 | kfree (buffer); | 1475 | kfree (buffer); |
1476 | } else { | ||
1477 | spin_lock_irqsave(&priv->tx_lock, flags); | ||
1478 | ++priv->tx_outstanding_urbs; | ||
1479 | priv->tx_outstanding_bytes += count; | ||
1480 | priv->tx_bytes += count; | ||
1481 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1448 | } | 1482 | } |
1449 | 1483 | ||
1450 | /* we are done with this urb, so let the host driver | 1484 | /* we are done with this urb, so let the host driver |
@@ -1460,7 +1494,11 @@ static int ftdi_write (struct usb_serial_port *port, | |||
1460 | 1494 | ||
1461 | static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs) | 1495 | static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs) |
1462 | { | 1496 | { |
1497 | unsigned long flags; | ||
1463 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; | 1498 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; |
1499 | struct ftdi_private *priv; | ||
1500 | int data_offset; /* will be 1 for the SIO and 0 otherwise */ | ||
1501 | unsigned long countback; | ||
1464 | 1502 | ||
1465 | /* free up the transfer buffer, as usb_free_urb() does not do this */ | 1503 | /* free up the transfer buffer, as usb_free_urb() does not do this */ |
1466 | kfree (urb->transfer_buffer); | 1504 | kfree (urb->transfer_buffer); |
@@ -1472,34 +1510,67 @@ static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs) | |||
1472 | return; | 1510 | return; |
1473 | } | 1511 | } |
1474 | 1512 | ||
1513 | priv = usb_get_serial_port_data(port); | ||
1514 | if (!priv) { | ||
1515 | dbg("%s - bad port private data pointer - exiting", __FUNCTION__); | ||
1516 | return; | ||
1517 | } | ||
1518 | /* account for transferred data */ | ||
1519 | countback = urb->actual_length; | ||
1520 | data_offset = priv->write_offset; | ||
1521 | if (data_offset > 0) { | ||
1522 | /* Subtract the control bytes */ | ||
1523 | countback -= (data_offset * ((countback + (PKTSZ - 1)) / PKTSZ)); | ||
1524 | } | ||
1525 | spin_lock_irqsave(&priv->tx_lock, flags); | ||
1526 | --priv->tx_outstanding_urbs; | ||
1527 | priv->tx_outstanding_bytes -= countback; | ||
1528 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1529 | |||
1475 | usb_serial_port_softint(port); | 1530 | usb_serial_port_softint(port); |
1476 | } /* ftdi_write_bulk_callback */ | 1531 | } /* ftdi_write_bulk_callback */ |
1477 | 1532 | ||
1478 | 1533 | ||
1479 | static int ftdi_write_room( struct usb_serial_port *port ) | 1534 | static int ftdi_write_room( struct usb_serial_port *port ) |
1480 | { | 1535 | { |
1536 | struct ftdi_private *priv = usb_get_serial_port_data(port); | ||
1537 | int room; | ||
1538 | unsigned long flags; | ||
1539 | |||
1481 | dbg("%s - port %d", __FUNCTION__, port->number); | 1540 | dbg("%s - port %d", __FUNCTION__, port->number); |
1482 | 1541 | ||
1483 | /* | 1542 | spin_lock_irqsave(&priv->tx_lock, flags); |
1484 | * We really can take anything the user throws at us | 1543 | if (priv->tx_outstanding_urbs < URB_UPPER_LIMIT) { |
1485 | * but let's pick a nice big number to tell the tty | 1544 | /* |
1486 | * layer that we have lots of free space | 1545 | * We really can take anything the user throws at us |
1487 | */ | 1546 | * but let's pick a nice big number to tell the tty |
1488 | return 2048; | 1547 | * layer that we have lots of free space |
1548 | */ | ||
1549 | room = 2048; | ||
1550 | } else { | ||
1551 | room = 0; | ||
1552 | } | ||
1553 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
1554 | return room; | ||
1489 | } /* ftdi_write_room */ | 1555 | } /* ftdi_write_room */ |
1490 | 1556 | ||
1491 | 1557 | ||
1492 | static int ftdi_chars_in_buffer (struct usb_serial_port *port) | 1558 | static int ftdi_chars_in_buffer (struct usb_serial_port *port) |
1493 | { /* ftdi_chars_in_buffer */ | 1559 | { /* ftdi_chars_in_buffer */ |
1560 | struct ftdi_private *priv = usb_get_serial_port_data(port); | ||
1561 | int buffered; | ||
1562 | unsigned long flags; | ||
1563 | |||
1494 | dbg("%s - port %d", __FUNCTION__, port->number); | 1564 | dbg("%s - port %d", __FUNCTION__, port->number); |
1495 | 1565 | ||
1496 | /* | 1566 | spin_lock_irqsave(&priv->tx_lock, flags); |
1497 | * We can't really account for how much data we | 1567 | buffered = (int)priv->tx_outstanding_bytes; |
1498 | * have sent out, but hasn't made it through to the | 1568 | spin_unlock_irqrestore(&priv->tx_lock, flags); |
1499 | * device, so just tell the tty layer that everything | 1569 | if (buffered < 0) { |
1500 | * is flushed. | 1570 | err("%s outstanding tx bytes is negative!", __FUNCTION__); |
1501 | */ | 1571 | buffered = 0; |
1502 | return 0; | 1572 | } |
1573 | return buffered; | ||
1503 | } /* ftdi_chars_in_buffer */ | 1574 | } /* ftdi_chars_in_buffer */ |
1504 | 1575 | ||
1505 | 1576 | ||
@@ -1509,6 +1580,8 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs) | |||
1509 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; | 1580 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; |
1510 | struct tty_struct *tty; | 1581 | struct tty_struct *tty; |
1511 | struct ftdi_private *priv; | 1582 | struct ftdi_private *priv; |
1583 | unsigned long countread; | ||
1584 | unsigned long flags; | ||
1512 | 1585 | ||
1513 | if (urb->number_of_packets > 0) { | 1586 | if (urb->number_of_packets > 0) { |
1514 | err("%s transfer_buffer_length %d actual_length %d number of packets %d",__FUNCTION__, | 1587 | err("%s transfer_buffer_length %d actual_length %d number of packets %d",__FUNCTION__, |
@@ -1543,6 +1616,13 @@ static void ftdi_read_bulk_callback (struct urb *urb, struct pt_regs *regs) | |||
1543 | return; | 1616 | return; |
1544 | } | 1617 | } |
1545 | 1618 | ||
1619 | /* count data bytes, but not status bytes */ | ||
1620 | countread = urb->actual_length; | ||
1621 | countread -= 2 * ((countread + (PKTSZ - 1)) / PKTSZ); | ||
1622 | spin_lock_irqsave(&priv->rx_lock, flags); | ||
1623 | priv->rx_bytes += countread; | ||
1624 | spin_unlock_irqrestore(&priv->rx_lock, flags); | ||
1625 | |||
1546 | ftdi_process_read(port); | 1626 | ftdi_process_read(port); |
1547 | 1627 | ||
1548 | } /* ftdi_read_bulk_callback */ | 1628 | } /* ftdi_read_bulk_callback */ |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 6ab2ac845bd7..04ef90fcb876 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
@@ -36,6 +36,9 @@ | |||
36 | #define FTDI_ACTZWAVE_PID 0xF2D0 | 36 | #define FTDI_ACTZWAVE_PID 0xF2D0 |
37 | 37 | ||
38 | 38 | ||
39 | /* www.starting-point-systems.com µChameleon device */ | ||
40 | #define FTDI_MICRO_CHAMELEON_PID 0xCAA0 /* Product Id */ | ||
41 | |||
39 | /* www.irtrans.de device */ | 42 | /* www.irtrans.de device */ |
40 | #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */ | 43 | #define FTDI_IRTRANS_PID 0xFC60 /* Product Id */ |
41 | 44 | ||
@@ -442,6 +445,18 @@ | |||
442 | */ | 445 | */ |
443 | #define FTDI_YEI_SERVOCENTER31_PID 0xE050 /* YEI ServoCenter3.1 USB */ | 446 | #define FTDI_YEI_SERVOCENTER31_PID 0xE050 /* YEI ServoCenter3.1 USB */ |
444 | 447 | ||
448 | /* | ||
449 | * ThorLabs USB motor drivers | ||
450 | */ | ||
451 | #define FTDI_THORLABS_PID 0xfaf0 /* ThorLabs USB motor drivers */ | ||
452 | |||
453 | /* | ||
454 | * Testo products (http://www.testo.com/) | ||
455 | * Submitted by Colin Leroy | ||
456 | */ | ||
457 | #define TESTO_VID 0x128D | ||
458 | #define TESTO_USB_INTERFACE_PID 0x0001 | ||
459 | |||
445 | /* Commands */ | 460 | /* Commands */ |
446 | #define FTDI_SIO_RESET 0 /* Reset the port */ | 461 | #define FTDI_SIO_RESET 0 /* Reset the port */ |
447 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ | 462 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ |
diff --git a/drivers/usb/serial/funsoft.c b/drivers/usb/serial/funsoft.c index 803721b97e2e..77b977206a8c 100644 --- a/drivers/usb/serial/funsoft.c +++ b/drivers/usb/serial/funsoft.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/tty.h> | 13 | #include <linux/tty.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
16 | #include "usb-serial.h" | 16 | #include <linux/usb/serial.h> |
17 | 17 | ||
18 | static struct usb_device_id id_table [] = { | 18 | static struct usb_device_id id_table [] = { |
19 | { USB_DEVICE(0x1404, 0xcddc) }, | 19 | { USB_DEVICE(0x1404, 0xcddc) }, |
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 1f5d1620baa1..727852634be9 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/spinlock.h> | 35 | #include <linux/spinlock.h> |
36 | #include <asm/uaccess.h> | 36 | #include <asm/uaccess.h> |
37 | #include <linux/usb.h> | 37 | #include <linux/usb.h> |
38 | #include <linux/usb/serial.h> | ||
38 | 39 | ||
39 | /* the mode to be set when the port ist opened */ | 40 | /* the mode to be set when the port ist opened */ |
40 | static int initial_mode = 1; | 41 | static int initial_mode = 1; |
@@ -42,8 +43,6 @@ static int initial_mode = 1; | |||
42 | /* debug flag */ | 43 | /* debug flag */ |
43 | static int debug = 0; | 44 | static int debug = 0; |
44 | 45 | ||
45 | #include "usb-serial.h" | ||
46 | |||
47 | #define GARMIN_VENDOR_ID 0x091E | 46 | #define GARMIN_VENDOR_ID 0x091E |
48 | 47 | ||
49 | /* | 48 | /* |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 945b8bb38c92..172713556393 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -17,8 +17,8 @@ | |||
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/moduleparam.h> | 18 | #include <linux/moduleparam.h> |
19 | #include <linux/usb.h> | 19 | #include <linux/usb.h> |
20 | #include <linux/usb/serial.h> | ||
20 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
21 | #include "usb-serial.h" | ||
22 | 22 | ||
23 | static int debug; | 23 | static int debug; |
24 | 24 | ||
@@ -285,6 +285,7 @@ void usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *reg | |||
285 | if (result) | 285 | if (result) |
286 | dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); | 286 | dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); |
287 | } | 287 | } |
288 | EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback); | ||
288 | 289 | ||
289 | void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs) | 290 | void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs) |
290 | { | 291 | { |
diff --git a/drivers/usb/serial/hp4x.c b/drivers/usb/serial/hp4x.c index 7e06358b0310..ebcac701b069 100644 --- a/drivers/usb/serial/hp4x.c +++ b/drivers/usb/serial/hp4x.c | |||
@@ -17,7 +17,7 @@ | |||
17 | #include <linux/tty.h> | 17 | #include <linux/tty.h> |
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/usb.h> | 19 | #include <linux/usb.h> |
20 | #include "usb-serial.h" | 20 | #include <linux/usb/serial.h> |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * Version Information | 23 | * Version Information |
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index bd2c05dac2a9..c49976c3ad52 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
@@ -44,7 +44,7 @@ | |||
44 | #include <linux/wait.h> | 44 | #include <linux/wait.h> |
45 | #include <asm/uaccess.h> | 45 | #include <asm/uaccess.h> |
46 | #include <linux/usb.h> | 46 | #include <linux/usb.h> |
47 | #include "usb-serial.h" | 47 | #include <linux/usb/serial.h> |
48 | #include "io_edgeport.h" | 48 | #include "io_edgeport.h" |
49 | #include "io_ionsp.h" /* info for the iosp messages */ | 49 | #include "io_ionsp.h" /* info for the iosp messages */ |
50 | #include "io_16654.h" /* 16654 UART defines */ | 50 | #include "io_16654.h" /* 16654 UART defines */ |
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index 723a12ae87b5..17c5b1d2311a 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
@@ -39,8 +39,8 @@ | |||
39 | #include <asm/uaccess.h> | 39 | #include <asm/uaccess.h> |
40 | #include <asm/semaphore.h> | 40 | #include <asm/semaphore.h> |
41 | #include <linux/usb.h> | 41 | #include <linux/usb.h> |
42 | #include <linux/usb/serial.h> | ||
42 | 43 | ||
43 | #include "usb-serial.h" | ||
44 | #include "io_16654.h" | 44 | #include "io_16654.h" |
45 | #include "io_usbvend.h" | 45 | #include "io_usbvend.h" |
46 | #include "io_ti.h" | 46 | #include "io_ti.h" |
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index dbcfe172a5cc..59c5d999009a 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
@@ -55,7 +55,7 @@ | |||
55 | #include <linux/spinlock.h> | 55 | #include <linux/spinlock.h> |
56 | #include <asm/uaccess.h> | 56 | #include <asm/uaccess.h> |
57 | #include <linux/usb.h> | 57 | #include <linux/usb.h> |
58 | #include "usb-serial.h" | 58 | #include <linux/usb/serial.h> |
59 | #include "ipaq.h" | 59 | #include "ipaq.h" |
60 | 60 | ||
61 | #define KP_RETRIES 100 | 61 | #define KP_RETRIES 100 |
@@ -70,6 +70,8 @@ | |||
70 | 70 | ||
71 | static __u16 product, vendor; | 71 | static __u16 product, vendor; |
72 | static int debug; | 72 | static int debug; |
73 | static int connect_retries = KP_RETRIES; | ||
74 | static int initial_wait; | ||
73 | 75 | ||
74 | /* Function prototypes for an ipaq */ | 76 | /* Function prototypes for an ipaq */ |
75 | static int ipaq_open (struct usb_serial_port *port, struct file *filp); | 77 | static int ipaq_open (struct usb_serial_port *port, struct file *filp); |
@@ -582,7 +584,7 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) | |||
582 | struct ipaq_private *priv; | 584 | struct ipaq_private *priv; |
583 | struct ipaq_packet *pkt; | 585 | struct ipaq_packet *pkt; |
584 | int i, result = 0; | 586 | int i, result = 0; |
585 | int retries = KP_RETRIES; | 587 | int retries = connect_retries; |
586 | 588 | ||
587 | dbg("%s - port %d", __FUNCTION__, port->number); | 589 | dbg("%s - port %d", __FUNCTION__, port->number); |
588 | 590 | ||
@@ -646,16 +648,12 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) | |||
646 | port->read_urb->transfer_buffer_length = URBDATA_SIZE; | 648 | port->read_urb->transfer_buffer_length = URBDATA_SIZE; |
647 | port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE; | 649 | port->bulk_out_size = port->write_urb->transfer_buffer_length = URBDATA_SIZE; |
648 | 650 | ||
651 | msleep(1000*initial_wait); | ||
649 | /* Start reading from the device */ | 652 | /* Start reading from the device */ |
650 | usb_fill_bulk_urb(port->read_urb, serial->dev, | 653 | usb_fill_bulk_urb(port->read_urb, serial->dev, |
651 | usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), | 654 | usb_rcvbulkpipe(serial->dev, port->bulk_in_endpointAddress), |
652 | port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, | 655 | port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length, |
653 | ipaq_read_bulk_callback, port); | 656 | ipaq_read_bulk_callback, port); |
654 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | ||
655 | if (result) { | ||
656 | err("%s - failed submitting read urb, error %d", __FUNCTION__, result); | ||
657 | goto error; | ||
658 | } | ||
659 | 657 | ||
660 | /* | 658 | /* |
661 | * Send out control message observed in win98 sniffs. Not sure what | 659 | * Send out control message observed in win98 sniffs. Not sure what |
@@ -670,8 +668,14 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) | |||
670 | usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21, | 668 | usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21, |
671 | 0x1, 0, NULL, 0, 100); | 669 | 0x1, 0, NULL, 0, 100); |
672 | if (result == 0) { | 670 | if (result == 0) { |
671 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | ||
672 | if (result) { | ||
673 | err("%s - failed submitting read urb, error %d", __FUNCTION__, result); | ||
674 | goto error; | ||
675 | } | ||
673 | return 0; | 676 | return 0; |
674 | } | 677 | } |
678 | msleep(1000); | ||
675 | } | 679 | } |
676 | err("%s - failed doing control urb, error %d", __FUNCTION__, result); | 680 | err("%s - failed doing control urb, error %d", __FUNCTION__, result); |
677 | goto error; | 681 | goto error; |
@@ -854,6 +858,7 @@ static void ipaq_write_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
854 | 858 | ||
855 | if (urb->status) { | 859 | if (urb->status) { |
856 | dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); | 860 | dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); |
861 | return; | ||
857 | } | 862 | } |
858 | 863 | ||
859 | spin_lock_irqsave(&write_list_lock, flags); | 864 | spin_lock_irqsave(&write_list_lock, flags); |
@@ -966,3 +971,9 @@ MODULE_PARM_DESC(vendor, "User specified USB idVendor"); | |||
966 | 971 | ||
967 | module_param(product, ushort, 0); | 972 | module_param(product, ushort, 0); |
968 | MODULE_PARM_DESC(product, "User specified USB idProduct"); | 973 | MODULE_PARM_DESC(product, "User specified USB idProduct"); |
974 | |||
975 | module_param(connect_retries, int, S_IRUGO|S_IWUSR); | ||
976 | MODULE_PARM_DESC(connect_retries, "Maximum number of connect retries (one second each)"); | ||
977 | |||
978 | module_param(initial_wait, int, S_IRUGO|S_IWUSR); | ||
979 | MODULE_PARM_DESC(initial_wait, "Time to wait before attempting a connection (in seconds)"); | ||
diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c index a4a0bfeaab00..87306cb6f9f5 100644 --- a/drivers/usb/serial/ipw.c +++ b/drivers/usb/serial/ipw.c | |||
@@ -46,8 +46,8 @@ | |||
46 | #include <linux/module.h> | 46 | #include <linux/module.h> |
47 | #include <linux/spinlock.h> | 47 | #include <linux/spinlock.h> |
48 | #include <linux/usb.h> | 48 | #include <linux/usb.h> |
49 | #include <linux/usb/serial.h> | ||
49 | #include <asm/uaccess.h> | 50 | #include <asm/uaccess.h> |
50 | #include "usb-serial.h" | ||
51 | 51 | ||
52 | /* | 52 | /* |
53 | * Version Information | 53 | * Version Information |
@@ -373,6 +373,8 @@ static void ipw_write_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
373 | 373 | ||
374 | dbg("%s", __FUNCTION__); | 374 | dbg("%s", __FUNCTION__); |
375 | 375 | ||
376 | port->write_urb_busy = 0; | ||
377 | |||
376 | if (urb->status) | 378 | if (urb->status) |
377 | dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); | 379 | dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); |
378 | 380 | ||
diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 2cf1fed3de43..1738b0b6a376 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c | |||
@@ -57,7 +57,7 @@ | |||
57 | #include <linux/spinlock.h> | 57 | #include <linux/spinlock.h> |
58 | #include <asm/uaccess.h> | 58 | #include <asm/uaccess.h> |
59 | #include <linux/usb.h> | 59 | #include <linux/usb.h> |
60 | #include "usb-serial.h" | 60 | #include <linux/usb/serial.h> |
61 | 61 | ||
62 | /* | 62 | /* |
63 | * Version Information | 63 | * Version Information |
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index d7c58f1bc960..015ad6cc1bbb 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -107,7 +107,7 @@ | |||
107 | #include <linux/spinlock.h> | 107 | #include <linux/spinlock.h> |
108 | #include <asm/uaccess.h> | 108 | #include <asm/uaccess.h> |
109 | #include <linux/usb.h> | 109 | #include <linux/usb.h> |
110 | #include "usb-serial.h" | 110 | #include <linux/usb/serial.h> |
111 | #include "keyspan.h" | 111 | #include "keyspan.h" |
112 | 112 | ||
113 | static int debug; | 113 | static int debug; |
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index 03ab3c0f3cce..49b8dc039d1f 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c | |||
@@ -78,6 +78,7 @@ | |||
78 | #include <linux/workqueue.h> | 78 | #include <linux/workqueue.h> |
79 | #include <asm/uaccess.h> | 79 | #include <asm/uaccess.h> |
80 | #include <linux/usb.h> | 80 | #include <linux/usb.h> |
81 | #include <linux/usb/serial.h> | ||
81 | 82 | ||
82 | static int debug; | 83 | static int debug; |
83 | 84 | ||
@@ -107,8 +108,6 @@ struct ezusb_hex_record { | |||
107 | #include "xircom_pgs_fw.h" | 108 | #include "xircom_pgs_fw.h" |
108 | #endif | 109 | #endif |
109 | 110 | ||
110 | #include "usb-serial.h" | ||
111 | |||
112 | /* | 111 | /* |
113 | * Version Information | 112 | * Version Information |
114 | */ | 113 | */ |
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index b45ff3e7ab40..2a2f3e2da055 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c | |||
@@ -55,7 +55,7 @@ | |||
55 | #include <linux/module.h> | 55 | #include <linux/module.h> |
56 | #include <asm/uaccess.h> | 56 | #include <asm/uaccess.h> |
57 | #include <linux/usb.h> | 57 | #include <linux/usb.h> |
58 | #include "usb-serial.h" | 58 | #include <linux/usb/serial.h> |
59 | #include "kl5kusb105.h" | 59 | #include "kl5kusb105.h" |
60 | 60 | ||
61 | static int debug; | 61 | static int debug; |
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 457733374772..d50dce034958 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -46,8 +46,8 @@ | |||
46 | #include <linux/spinlock.h> | 46 | #include <linux/spinlock.h> |
47 | #include <asm/uaccess.h> | 47 | #include <asm/uaccess.h> |
48 | #include <linux/usb.h> | 48 | #include <linux/usb.h> |
49 | #include <linux/usb/serial.h> | ||
49 | #include <linux/ioctl.h> | 50 | #include <linux/ioctl.h> |
50 | #include "usb-serial.h" | ||
51 | #include "kobil_sct.h" | 51 | #include "kobil_sct.h" |
52 | 52 | ||
53 | static int debug; | 53 | static int debug; |
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index ca05d3275f3e..f4d4305c2c02 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
@@ -75,7 +75,7 @@ | |||
75 | #include <linux/spinlock.h> | 75 | #include <linux/spinlock.h> |
76 | #include <asm/uaccess.h> | 76 | #include <asm/uaccess.h> |
77 | #include <linux/usb.h> | 77 | #include <linux/usb.h> |
78 | #include "usb-serial.h" | 78 | #include <linux/usb/serial.h> |
79 | #include "mct_u232.h" | 79 | #include "mct_u232.h" |
80 | 80 | ||
81 | /* | 81 | /* |
diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c index 7f544081032e..ac3f8b5d2c49 100644 --- a/drivers/usb/serial/navman.c +++ b/drivers/usb/serial/navman.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <linux/tty_flip.h> | 14 | #include <linux/tty_flip.h> |
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/usb.h> | 16 | #include <linux/usb.h> |
17 | #include "usb-serial.h" | 17 | #include <linux/usb/serial.h> |
18 | 18 | ||
19 | static int debug; | 19 | static int debug; |
20 | 20 | ||
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index cfb711a21a45..e49f40913c27 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c | |||
@@ -46,7 +46,7 @@ | |||
46 | #include <linux/spinlock.h> | 46 | #include <linux/spinlock.h> |
47 | #include <asm/uaccess.h> | 47 | #include <asm/uaccess.h> |
48 | #include <linux/usb.h> | 48 | #include <linux/usb.h> |
49 | #include "usb-serial.h" | 49 | #include <linux/usb/serial.h> |
50 | 50 | ||
51 | static int debug; | 51 | static int debug; |
52 | 52 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 78ad4b3126a6..f0530c1d7b7a 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -35,6 +35,7 @@ | |||
35 | 2006-06-01 v0.6.2 add backwards-compatibility stuff | 35 | 2006-06-01 v0.6.2 add backwards-compatibility stuff |
36 | 2006-06-01 v0.6.3 add Novatel Wireless | 36 | 2006-06-01 v0.6.3 add Novatel Wireless |
37 | 2006-06-01 v0.7 Option => GSM | 37 | 2006-06-01 v0.7 Option => GSM |
38 | 2006-06-01 v0.7.1 add COBRA2 | ||
38 | 39 | ||
39 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> | 40 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> |
40 | 41 | ||
@@ -53,7 +54,7 @@ | |||
53 | device features. | 54 | device features. |
54 | */ | 55 | */ |
55 | 56 | ||
56 | #define DRIVER_VERSION "v0.7.0" | 57 | #define DRIVER_VERSION "v0.7.1" |
57 | #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" | 58 | #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" |
58 | #define DRIVER_DESC "USB Driver for GSM modems" | 59 | #define DRIVER_DESC "USB Driver for GSM modems" |
59 | 60 | ||
@@ -64,7 +65,7 @@ | |||
64 | #include <linux/tty_flip.h> | 65 | #include <linux/tty_flip.h> |
65 | #include <linux/module.h> | 66 | #include <linux/module.h> |
66 | #include <linux/usb.h> | 67 | #include <linux/usb.h> |
67 | #include "usb-serial.h" | 68 | #include <linux/usb/serial.h> |
68 | 69 | ||
69 | /* Function prototypes */ | 70 | /* Function prototypes */ |
70 | static int option_open(struct usb_serial_port *port, struct file *filp); | 71 | static int option_open(struct usb_serial_port *port, struct file *filp); |
@@ -102,6 +103,7 @@ static int option_send_setup(struct usb_serial_port *port); | |||
102 | #define OPTION_PRODUCT_FUSION 0x6000 | 103 | #define OPTION_PRODUCT_FUSION 0x6000 |
103 | #define OPTION_PRODUCT_FUSION2 0x6300 | 104 | #define OPTION_PRODUCT_FUSION2 0x6300 |
104 | #define OPTION_PRODUCT_COBRA 0x6500 | 105 | #define OPTION_PRODUCT_COBRA 0x6500 |
106 | #define OPTION_PRODUCT_COBRA2 0x6600 | ||
105 | #define HUAWEI_PRODUCT_E600 0x1001 | 107 | #define HUAWEI_PRODUCT_E600 0x1001 |
106 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 | 108 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 |
107 | #define SIERRAWIRELESS_PRODUCT_MC8755 0x6802 | 109 | #define SIERRAWIRELESS_PRODUCT_MC8755 0x6802 |
@@ -112,6 +114,7 @@ static struct usb_device_id option_ids[] = { | |||
112 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, | 114 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, |
113 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, | 115 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, |
114 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, | 116 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, |
117 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, | ||
115 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 118 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
116 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 119 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
117 | { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) }, | 120 | { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) }, |
@@ -124,6 +127,7 @@ static struct usb_device_id option_ids1[] = { | |||
124 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, | 127 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, |
125 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, | 128 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, |
126 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, | 129 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, |
130 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, | ||
127 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 131 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
128 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 132 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
129 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, | 133 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index de93a2b909e7..259db31b65c1 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
28 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
29 | #include <linux/usb.h> | 29 | #include <linux/usb.h> |
30 | #include "usb-serial.h" | 30 | #include <linux/usb/serial.h> |
31 | #include "pl2303.h" | 31 | #include "pl2303.h" |
32 | 32 | ||
33 | /* | 33 | /* |
@@ -52,6 +52,7 @@ struct pl2303_buf { | |||
52 | static struct usb_device_id id_table [] = { | 52 | static struct usb_device_id id_table [] = { |
53 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) }, | 53 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) }, |
54 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) }, | 54 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ2) }, |
55 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_DCU11) }, | ||
55 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) }, | 56 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_RSAQ3) }, |
56 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) }, | 57 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_PHAROS) }, |
57 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, | 58 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, |
@@ -79,6 +80,7 @@ static struct usb_device_id id_table [] = { | |||
79 | { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) }, | 80 | { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) }, |
80 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, | 81 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, |
81 | { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, | 82 | { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, |
83 | { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) }, | ||
82 | { } /* Terminating entry */ | 84 | { } /* Terminating entry */ |
83 | }; | 85 | }; |
84 | 86 | ||
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index 7f29e81d3e35..d9c1e6e0b4b3 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #define PL2303_VENDOR_ID 0x067b | 10 | #define PL2303_VENDOR_ID 0x067b |
11 | #define PL2303_PRODUCT_ID 0x2303 | 11 | #define PL2303_PRODUCT_ID 0x2303 |
12 | #define PL2303_PRODUCT_ID_RSAQ2 0x04bb | 12 | #define PL2303_PRODUCT_ID_RSAQ2 0x04bb |
13 | #define PL2303_PRODUCT_ID_DCU11 0x1234 | ||
13 | #define PL2303_PRODUCT_ID_PHAROS 0xaaa0 | 14 | #define PL2303_PRODUCT_ID_PHAROS 0xaaa0 |
14 | #define PL2303_PRODUCT_ID_RSAQ3 0xaaa2 | 15 | #define PL2303_PRODUCT_ID_RSAQ3 0xaaa2 |
15 | 16 | ||
@@ -84,3 +85,7 @@ | |||
84 | /* Ours Technology Inc DKU-5 clone, chipset: Prolific Technology Inc */ | 85 | /* Ours Technology Inc DKU-5 clone, chipset: Prolific Technology Inc */ |
85 | #define OTI_VENDOR_ID 0x0ea0 | 86 | #define OTI_VENDOR_ID 0x0ea0 |
86 | #define OTI_PRODUCT_ID 0x6858 | 87 | #define OTI_PRODUCT_ID 0x6858 |
88 | |||
89 | /* DATAPILOT Universal-2 Phone Cable */ | ||
90 | #define DATAPILOT_U2_VENDOR_ID 0x0731 | ||
91 | #define DATAPILOT_U2_PRODUCT_ID 0x2003 | ||
diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index 897d8447252b..789771ecdb11 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c | |||
@@ -71,7 +71,7 @@ | |||
71 | #include <linux/spinlock.h> | 71 | #include <linux/spinlock.h> |
72 | #include <asm/uaccess.h> | 72 | #include <asm/uaccess.h> |
73 | #include <linux/usb.h> | 73 | #include <linux/usb.h> |
74 | #include "usb-serial.h" | 74 | #include <linux/usb/serial.h> |
75 | 75 | ||
76 | 76 | ||
77 | #ifndef CONFIG_USB_SAFE_PADDED | 77 | #ifndef CONFIG_USB_SAFE_PADDED |
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c new file mode 100644 index 000000000000..d29638daa987 --- /dev/null +++ b/drivers/usb/serial/sierra.c | |||
@@ -0,0 +1,75 @@ | |||
1 | /* | ||
2 | * Sierra Wireless CDMA Wireless Serial USB driver | ||
3 | * | ||
4 | * Current Copy modified by: Kevin Lloyd <linux@sierrawireless.com> | ||
5 | * Original Copyright (C) 2005-2006 Greg Kroah-Hartman <gregkh@suse.de> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License version | ||
9 | * 2 as published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/tty.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/usb.h> | ||
17 | #include <linux/usb/serial.h> | ||
18 | |||
19 | static struct usb_device_id id_table [] = { | ||
20 | { USB_DEVICE(0x1199, 0x0018) }, /* Sierra Wireless MC5720 */ | ||
21 | { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */ | ||
22 | { USB_DEVICE(0x1199, 0x0017) }, /* Sierra Wireless EM5625 */ | ||
23 | { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */ | ||
24 | { USB_DEVICE(0x1199, 0x6802) }, /* Sierra Wireless MC8755 */ | ||
25 | { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */ | ||
26 | { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 */ | ||
27 | { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */ | ||
28 | /* Following devices are supported in the airprime.c driver */ | ||
29 | /* { USB_DEVICE(0x1199, 0x0112) }, */ /* Sierra Wireless AirCard 580 */ | ||
30 | /* { USB_DEVICE(0x0F3D, 0x0112) }, */ /* AirPrime/Sierra PC 5220 */ | ||
31 | { } | ||
32 | }; | ||
33 | MODULE_DEVICE_TABLE(usb, id_table); | ||
34 | |||
35 | static struct usb_driver sierra_driver = { | ||
36 | .name = "sierra_wireless", | ||
37 | .probe = usb_serial_probe, | ||
38 | .disconnect = usb_serial_disconnect, | ||
39 | .id_table = id_table, | ||
40 | }; | ||
41 | |||
42 | static struct usb_serial_driver sierra_device = { | ||
43 | .driver = { | ||
44 | .owner = THIS_MODULE, | ||
45 | .name = "Sierra_Wireless", | ||
46 | }, | ||
47 | .id_table = id_table, | ||
48 | .num_interrupt_in = NUM_DONT_CARE, | ||
49 | .num_bulk_in = NUM_DONT_CARE, | ||
50 | .num_bulk_out = NUM_DONT_CARE, | ||
51 | .num_ports = 3, | ||
52 | }; | ||
53 | |||
54 | static int __init sierra_init(void) | ||
55 | { | ||
56 | int retval; | ||
57 | |||
58 | retval = usb_serial_register(&sierra_device); | ||
59 | if (retval) | ||
60 | return retval; | ||
61 | retval = usb_register(&sierra_driver); | ||
62 | if (retval) | ||
63 | usb_serial_deregister(&sierra_device); | ||
64 | return retval; | ||
65 | } | ||
66 | |||
67 | static void __exit sierra_exit(void) | ||
68 | { | ||
69 | usb_deregister(&sierra_driver); | ||
70 | usb_serial_deregister(&sierra_device); | ||
71 | } | ||
72 | |||
73 | module_init(sierra_init); | ||
74 | module_exit(sierra_exit); | ||
75 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index a9afff31a921..ac9b8ee52d44 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
@@ -83,8 +83,8 @@ | |||
83 | #include <asm/uaccess.h> | 83 | #include <asm/uaccess.h> |
84 | #include <asm/semaphore.h> | 84 | #include <asm/semaphore.h> |
85 | #include <linux/usb.h> | 85 | #include <linux/usb.h> |
86 | #include <linux/usb/serial.h> | ||
86 | 87 | ||
87 | #include "usb-serial.h" | ||
88 | #include "ti_usb_3410_5052.h" | 88 | #include "ti_usb_3410_5052.h" |
89 | #include "ti_fw_3410.h" /* firmware image for 3410 */ | 89 | #include "ti_fw_3410.h" /* firmware image for 3410 */ |
90 | #include "ti_fw_5052.h" /* firmware image for 5052 */ | 90 | #include "ti_fw_5052.h" /* firmware image for 5052 */ |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index b59a0536ea5c..12c1694d322e 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/smp_lock.h> | 31 | #include <linux/smp_lock.h> |
32 | #include <asm/uaccess.h> | 32 | #include <asm/uaccess.h> |
33 | #include <linux/usb.h> | 33 | #include <linux/usb.h> |
34 | #include "usb-serial.h" | 34 | #include <linux/usb/serial.h> |
35 | #include "pl2303.h" | 35 | #include "pl2303.h" |
36 | 36 | ||
37 | /* | 37 | /* |
@@ -40,6 +40,8 @@ | |||
40 | #define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/" | 40 | #define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/" |
41 | #define DRIVER_DESC "USB Serial Driver core" | 41 | #define DRIVER_DESC "USB Serial Driver core" |
42 | 42 | ||
43 | static void port_free(struct usb_serial_port *port); | ||
44 | |||
43 | /* Driver structure we register with the USB core */ | 45 | /* Driver structure we register with the USB core */ |
44 | static struct usb_driver usb_serial_driver = { | 46 | static struct usb_driver usb_serial_driver = { |
45 | .name = "usbserial", | 47 | .name = "usbserial", |
@@ -146,23 +148,10 @@ static void destroy_serial(struct kref *kref) | |||
146 | port = serial->port[i]; | 148 | port = serial->port[i]; |
147 | if (!port) | 149 | if (!port) |
148 | continue; | 150 | continue; |
149 | usb_kill_urb(port->read_urb); | 151 | port_free(port); |
150 | usb_free_urb(port->read_urb); | ||
151 | usb_kill_urb(port->write_urb); | ||
152 | usb_free_urb(port->write_urb); | ||
153 | usb_kill_urb(port->interrupt_in_urb); | ||
154 | usb_free_urb(port->interrupt_in_urb); | ||
155 | usb_kill_urb(port->interrupt_out_urb); | ||
156 | usb_free_urb(port->interrupt_out_urb); | ||
157 | kfree(port->bulk_in_buffer); | ||
158 | kfree(port->bulk_out_buffer); | ||
159 | kfree(port->interrupt_in_buffer); | ||
160 | kfree(port->interrupt_out_buffer); | ||
161 | } | 152 | } |
162 | } | 153 | } |
163 | 154 | ||
164 | flush_scheduled_work(); /* port->work */ | ||
165 | |||
166 | usb_put_dev(serial->dev); | 155 | usb_put_dev(serial->dev); |
167 | 156 | ||
168 | /* free up any memory that we allocated */ | 157 | /* free up any memory that we allocated */ |
@@ -564,6 +553,11 @@ static void port_release(struct device *dev) | |||
564 | struct usb_serial_port *port = to_usb_serial_port(dev); | 553 | struct usb_serial_port *port = to_usb_serial_port(dev); |
565 | 554 | ||
566 | dbg ("%s - %s", __FUNCTION__, dev->bus_id); | 555 | dbg ("%s - %s", __FUNCTION__, dev->bus_id); |
556 | port_free(port); | ||
557 | } | ||
558 | |||
559 | static void port_free(struct usb_serial_port *port) | ||
560 | { | ||
567 | usb_kill_urb(port->read_urb); | 561 | usb_kill_urb(port->read_urb); |
568 | usb_free_urb(port->read_urb); | 562 | usb_free_urb(port->read_urb); |
569 | usb_kill_urb(port->write_urb); | 563 | usb_kill_urb(port->write_urb); |
@@ -576,6 +570,7 @@ static void port_release(struct device *dev) | |||
576 | kfree(port->bulk_out_buffer); | 570 | kfree(port->bulk_out_buffer); |
577 | kfree(port->interrupt_in_buffer); | 571 | kfree(port->interrupt_in_buffer); |
578 | kfree(port->interrupt_out_buffer); | 572 | kfree(port->interrupt_out_buffer); |
573 | flush_scheduled_work(); /* port->work */ | ||
579 | kfree(port); | 574 | kfree(port); |
580 | } | 575 | } |
581 | 576 | ||
diff --git a/drivers/usb/serial/usb-serial.h b/drivers/usb/serial/usb-serial.h deleted file mode 100644 index 0f2802a60194..000000000000 --- a/drivers/usb/serial/usb-serial.h +++ /dev/null | |||
@@ -1,300 +0,0 @@ | |||
1 | /* | ||
2 | * USB Serial Converter driver | ||
3 | * | ||
4 | * Copyright (C) 1999 - 2005 | ||
5 | * Greg Kroah-Hartman (greg@kroah.com) | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | |||
14 | #ifndef __LINUX_USB_SERIAL_H | ||
15 | #define __LINUX_USB_SERIAL_H | ||
16 | |||
17 | #include <linux/kref.h> | ||
18 | #include <linux/mutex.h> | ||
19 | |||
20 | #define SERIAL_TTY_MAJOR 188 /* Nice legal number now */ | ||
21 | #define SERIAL_TTY_MINORS 255 /* loads of devices :) */ | ||
22 | |||
23 | #define MAX_NUM_PORTS 8 /* The maximum number of ports one device can grab at once */ | ||
24 | |||
25 | /* parity check flag */ | ||
26 | #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) | ||
27 | |||
28 | /** | ||
29 | * usb_serial_port: structure for the specific ports of a device. | ||
30 | * @serial: pointer back to the struct usb_serial owner of this port. | ||
31 | * @tty: pointer to the corresponding tty for this port. | ||
32 | * @lock: spinlock to grab when updating portions of this structure. | ||
33 | * @mutex: mutex used to synchronize serial_open() and serial_close() | ||
34 | * access for this port. | ||
35 | * @number: the number of the port (the minor number). | ||
36 | * @interrupt_in_buffer: pointer to the interrupt in buffer for this port. | ||
37 | * @interrupt_in_urb: pointer to the interrupt in struct urb for this port. | ||
38 | * @interrupt_in_endpointAddress: endpoint address for the interrupt in pipe | ||
39 | * for this port. | ||
40 | * @interrupt_out_buffer: pointer to the interrupt out buffer for this port. | ||
41 | * @interrupt_out_size: the size of the interrupt_out_buffer, in bytes. | ||
42 | * @interrupt_out_urb: pointer to the interrupt out struct urb for this port. | ||
43 | * @interrupt_out_endpointAddress: endpoint address for the interrupt out pipe | ||
44 | * for this port. | ||
45 | * @bulk_in_buffer: pointer to the bulk in buffer for this port. | ||
46 | * @read_urb: pointer to the bulk in struct urb for this port. | ||
47 | * @bulk_in_endpointAddress: endpoint address for the bulk in pipe for this | ||
48 | * port. | ||
49 | * @bulk_out_buffer: pointer to the bulk out buffer for this port. | ||
50 | * @bulk_out_size: the size of the bulk_out_buffer, in bytes. | ||
51 | * @write_urb: pointer to the bulk out struct urb for this port. | ||
52 | * @bulk_out_endpointAddress: endpoint address for the bulk out pipe for this | ||
53 | * port. | ||
54 | * @write_wait: a wait_queue_head_t used by the port. | ||
55 | * @work: work queue entry for the line discipline waking up. | ||
56 | * @open_count: number of times this port has been opened. | ||
57 | * | ||
58 | * This structure is used by the usb-serial core and drivers for the specific | ||
59 | * ports of a device. | ||
60 | */ | ||
61 | struct usb_serial_port { | ||
62 | struct usb_serial * serial; | ||
63 | struct tty_struct * tty; | ||
64 | spinlock_t lock; | ||
65 | struct mutex mutex; | ||
66 | unsigned char number; | ||
67 | |||
68 | unsigned char * interrupt_in_buffer; | ||
69 | struct urb * interrupt_in_urb; | ||
70 | __u8 interrupt_in_endpointAddress; | ||
71 | |||
72 | unsigned char * interrupt_out_buffer; | ||
73 | int interrupt_out_size; | ||
74 | struct urb * interrupt_out_urb; | ||
75 | __u8 interrupt_out_endpointAddress; | ||
76 | |||
77 | unsigned char * bulk_in_buffer; | ||
78 | int bulk_in_size; | ||
79 | struct urb * read_urb; | ||
80 | __u8 bulk_in_endpointAddress; | ||
81 | |||
82 | unsigned char * bulk_out_buffer; | ||
83 | int bulk_out_size; | ||
84 | struct urb * write_urb; | ||
85 | int write_urb_busy; | ||
86 | __u8 bulk_out_endpointAddress; | ||
87 | |||
88 | wait_queue_head_t write_wait; | ||
89 | struct work_struct work; | ||
90 | int open_count; | ||
91 | struct device dev; | ||
92 | }; | ||
93 | #define to_usb_serial_port(d) container_of(d, struct usb_serial_port, dev) | ||
94 | |||
95 | /* get and set the port private data pointer helper functions */ | ||
96 | static inline void *usb_get_serial_port_data (struct usb_serial_port *port) | ||
97 | { | ||
98 | return dev_get_drvdata(&port->dev); | ||
99 | } | ||
100 | |||
101 | static inline void usb_set_serial_port_data (struct usb_serial_port *port, void *data) | ||
102 | { | ||
103 | dev_set_drvdata(&port->dev, data); | ||
104 | } | ||
105 | |||
106 | /** | ||
107 | * usb_serial - structure used by the usb-serial core for a device | ||
108 | * @dev: pointer to the struct usb_device for this device | ||
109 | * @type: pointer to the struct usb_serial_driver for this device | ||
110 | * @interface: pointer to the struct usb_interface for this device | ||
111 | * @minor: the starting minor number for this device | ||
112 | * @num_ports: the number of ports this device has | ||
113 | * @num_interrupt_in: number of interrupt in endpoints we have | ||
114 | * @num_interrupt_out: number of interrupt out endpoints we have | ||
115 | * @num_bulk_in: number of bulk in endpoints we have | ||
116 | * @num_bulk_out: number of bulk out endpoints we have | ||
117 | * @port: array of struct usb_serial_port structures for the different ports. | ||
118 | * @private: place to put any driver specific information that is needed. The | ||
119 | * usb-serial driver is required to manage this data, the usb-serial core | ||
120 | * will not touch this. Use usb_get_serial_data() and | ||
121 | * usb_set_serial_data() to access this. | ||
122 | */ | ||
123 | struct usb_serial { | ||
124 | struct usb_device * dev; | ||
125 | struct usb_serial_driver * type; | ||
126 | struct usb_interface * interface; | ||
127 | unsigned char minor; | ||
128 | unsigned char num_ports; | ||
129 | unsigned char num_port_pointers; | ||
130 | char num_interrupt_in; | ||
131 | char num_interrupt_out; | ||
132 | char num_bulk_in; | ||
133 | char num_bulk_out; | ||
134 | struct usb_serial_port * port[MAX_NUM_PORTS]; | ||
135 | struct kref kref; | ||
136 | void * private; | ||
137 | }; | ||
138 | #define to_usb_serial(d) container_of(d, struct usb_serial, kref) | ||
139 | |||
140 | #define NUM_DONT_CARE (-1) | ||
141 | |||
142 | /* get and set the serial private data pointer helper functions */ | ||
143 | static inline void *usb_get_serial_data (struct usb_serial *serial) | ||
144 | { | ||
145 | return serial->private; | ||
146 | } | ||
147 | |||
148 | static inline void usb_set_serial_data (struct usb_serial *serial, void *data) | ||
149 | { | ||
150 | serial->private = data; | ||
151 | } | ||
152 | |||
153 | /** | ||
154 | * usb_serial_driver - describes a usb serial driver | ||
155 | * @description: pointer to a string that describes this driver. This string used | ||
156 | * in the syslog messages when a device is inserted or removed. | ||
157 | * @id_table: pointer to a list of usb_device_id structures that define all | ||
158 | * of the devices this structure can support. | ||
159 | * @num_interrupt_in: the number of interrupt in endpoints this device will | ||
160 | * have. | ||
161 | * @num_interrupt_out: the number of interrupt out endpoints this device will | ||
162 | * have. | ||
163 | * @num_bulk_in: the number of bulk in endpoints this device will have. | ||
164 | * @num_bulk_out: the number of bulk out endpoints this device will have. | ||
165 | * @num_ports: the number of different ports this device will have. | ||
166 | * @calc_num_ports: pointer to a function to determine how many ports this | ||
167 | * device has dynamically. It will be called after the probe() | ||
168 | * callback is called, but before attach() | ||
169 | * @probe: pointer to the driver's probe function. | ||
170 | * This will be called when the device is inserted into the system, | ||
171 | * but before the device has been fully initialized by the usb_serial | ||
172 | * subsystem. Use this function to download any firmware to the device, | ||
173 | * or any other early initialization that might be needed. | ||
174 | * Return 0 to continue on with the initialization sequence. Anything | ||
175 | * else will abort it. | ||
176 | * @attach: pointer to the driver's attach function. | ||
177 | * This will be called when the struct usb_serial structure is fully set | ||
178 | * set up. Do any local initialization of the device, or any private | ||
179 | * memory structure allocation at this point in time. | ||
180 | * @shutdown: pointer to the driver's shutdown function. This will be | ||
181 | * called when the device is removed from the system. | ||
182 | * | ||
183 | * This structure is defines a USB Serial driver. It provides all of | ||
184 | * the information that the USB serial core code needs. If the function | ||
185 | * pointers are defined, then the USB serial core code will call them when | ||
186 | * the corresponding tty port functions are called. If they are not | ||
187 | * called, the generic serial function will be used instead. | ||
188 | * | ||
189 | * The driver.owner field should be set to the module owner of this driver. | ||
190 | * The driver.name field should be set to the name of this driver (remember | ||
191 | * it will show up in sysfs, so it needs to be short and to the point. | ||
192 | * Useing the module name is a good idea.) | ||
193 | */ | ||
194 | struct usb_serial_driver { | ||
195 | const char *description; | ||
196 | const struct usb_device_id *id_table; | ||
197 | char num_interrupt_in; | ||
198 | char num_interrupt_out; | ||
199 | char num_bulk_in; | ||
200 | char num_bulk_out; | ||
201 | char num_ports; | ||
202 | |||
203 | struct list_head driver_list; | ||
204 | struct device_driver driver; | ||
205 | |||
206 | int (*probe) (struct usb_serial *serial, const struct usb_device_id *id); | ||
207 | int (*attach) (struct usb_serial *serial); | ||
208 | int (*calc_num_ports) (struct usb_serial *serial); | ||
209 | |||
210 | void (*shutdown) (struct usb_serial *serial); | ||
211 | |||
212 | int (*port_probe) (struct usb_serial_port *port); | ||
213 | int (*port_remove) (struct usb_serial_port *port); | ||
214 | |||
215 | /* serial function calls */ | ||
216 | int (*open) (struct usb_serial_port *port, struct file * filp); | ||
217 | void (*close) (struct usb_serial_port *port, struct file * filp); | ||
218 | int (*write) (struct usb_serial_port *port, const unsigned char *buf, int count); | ||
219 | int (*write_room) (struct usb_serial_port *port); | ||
220 | int (*ioctl) (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg); | ||
221 | void (*set_termios) (struct usb_serial_port *port, struct termios * old); | ||
222 | void (*break_ctl) (struct usb_serial_port *port, int break_state); | ||
223 | int (*chars_in_buffer) (struct usb_serial_port *port); | ||
224 | void (*throttle) (struct usb_serial_port *port); | ||
225 | void (*unthrottle) (struct usb_serial_port *port); | ||
226 | int (*tiocmget) (struct usb_serial_port *port, struct file *file); | ||
227 | int (*tiocmset) (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear); | ||
228 | |||
229 | void (*read_int_callback)(struct urb *urb, struct pt_regs *regs); | ||
230 | void (*write_int_callback)(struct urb *urb, struct pt_regs *regs); | ||
231 | void (*read_bulk_callback)(struct urb *urb, struct pt_regs *regs); | ||
232 | void (*write_bulk_callback)(struct urb *urb, struct pt_regs *regs); | ||
233 | }; | ||
234 | #define to_usb_serial_driver(d) container_of(d, struct usb_serial_driver, driver) | ||
235 | |||
236 | extern int usb_serial_register(struct usb_serial_driver *driver); | ||
237 | extern void usb_serial_deregister(struct usb_serial_driver *driver); | ||
238 | extern void usb_serial_port_softint(struct usb_serial_port *port); | ||
239 | |||
240 | extern int usb_serial_probe(struct usb_interface *iface, const struct usb_device_id *id); | ||
241 | extern void usb_serial_disconnect(struct usb_interface *iface); | ||
242 | |||
243 | extern int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *data, int length, __u8 bRequest); | ||
244 | extern int ezusb_set_reset (struct usb_serial *serial, unsigned char reset_bit); | ||
245 | |||
246 | /* USB Serial console functions */ | ||
247 | #ifdef CONFIG_USB_SERIAL_CONSOLE | ||
248 | extern void usb_serial_console_init (int debug, int minor); | ||
249 | extern void usb_serial_console_exit (void); | ||
250 | extern void usb_serial_console_disconnect(struct usb_serial *serial); | ||
251 | #else | ||
252 | static inline void usb_serial_console_init (int debug, int minor) { } | ||
253 | static inline void usb_serial_console_exit (void) { } | ||
254 | static inline void usb_serial_console_disconnect(struct usb_serial *serial) {} | ||
255 | #endif | ||
256 | |||
257 | /* Functions needed by other parts of the usbserial core */ | ||
258 | extern struct usb_serial *usb_serial_get_by_index (unsigned int minor); | ||
259 | extern void usb_serial_put(struct usb_serial *serial); | ||
260 | extern int usb_serial_generic_open (struct usb_serial_port *port, struct file *filp); | ||
261 | extern int usb_serial_generic_write (struct usb_serial_port *port, const unsigned char *buf, int count); | ||
262 | extern void usb_serial_generic_close (struct usb_serial_port *port, struct file *filp); | ||
263 | extern int usb_serial_generic_write_room (struct usb_serial_port *port); | ||
264 | extern int usb_serial_generic_chars_in_buffer (struct usb_serial_port *port); | ||
265 | extern void usb_serial_generic_read_bulk_callback (struct urb *urb, struct pt_regs *regs); | ||
266 | extern void usb_serial_generic_write_bulk_callback (struct urb *urb, struct pt_regs *regs); | ||
267 | extern void usb_serial_generic_shutdown (struct usb_serial *serial); | ||
268 | extern int usb_serial_generic_register (int debug); | ||
269 | extern void usb_serial_generic_deregister (void); | ||
270 | |||
271 | extern int usb_serial_bus_register (struct usb_serial_driver *device); | ||
272 | extern void usb_serial_bus_deregister (struct usb_serial_driver *device); | ||
273 | |||
274 | extern struct usb_serial_driver usb_serial_generic_device; | ||
275 | extern struct bus_type usb_serial_bus_type; | ||
276 | extern struct tty_driver *usb_serial_tty_driver; | ||
277 | |||
278 | static inline void usb_serial_debug_data(int debug, | ||
279 | struct device *dev, | ||
280 | const char *function, int size, | ||
281 | const unsigned char *data) | ||
282 | { | ||
283 | int i; | ||
284 | |||
285 | if (debug) { | ||
286 | dev_printk(KERN_DEBUG, dev, "%s - length = %d, data = ", function, size); | ||
287 | for (i = 0; i < size; ++i) | ||
288 | printk ("%.2x ", data[i]); | ||
289 | printk ("\n"); | ||
290 | } | ||
291 | } | ||
292 | |||
293 | /* Use our own dbg macro */ | ||
294 | #undef dbg | ||
295 | #define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , ## arg); } while (0) | ||
296 | |||
297 | |||
298 | |||
299 | #endif /* ifdef __LINUX_USB_SERIAL_H */ | ||
300 | |||
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index 95a2936e902e..88949f7884ca 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
26 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
27 | #include <linux/usb.h> | 27 | #include <linux/usb.h> |
28 | #include "usb-serial.h" | 28 | #include <linux/usb/serial.h> |
29 | #include "visor.h" | 29 | #include "visor.h" |
30 | 30 | ||
31 | /* | 31 | /* |
@@ -302,7 +302,6 @@ static int visor_open (struct usb_serial_port *port, struct file *filp) | |||
302 | spin_lock_irqsave(&priv->lock, flags); | 302 | spin_lock_irqsave(&priv->lock, flags); |
303 | priv->bytes_in = 0; | 303 | priv->bytes_in = 0; |
304 | priv->bytes_out = 0; | 304 | priv->bytes_out = 0; |
305 | priv->outstanding_urbs = 0; | ||
306 | priv->throttled = 0; | 305 | priv->throttled = 0; |
307 | spin_unlock_irqrestore(&priv->lock, flags); | 306 | spin_unlock_irqrestore(&priv->lock, flags); |
308 | 307 | ||
@@ -435,13 +434,25 @@ static int visor_write (struct usb_serial_port *port, const unsigned char *buf, | |||
435 | 434 | ||
436 | static int visor_write_room (struct usb_serial_port *port) | 435 | static int visor_write_room (struct usb_serial_port *port) |
437 | { | 436 | { |
437 | struct visor_private *priv = usb_get_serial_port_data(port); | ||
438 | unsigned long flags; | ||
439 | |||
438 | dbg("%s - port %d", __FUNCTION__, port->number); | 440 | dbg("%s - port %d", __FUNCTION__, port->number); |
439 | 441 | ||
440 | /* | 442 | /* |
441 | * We really can take anything the user throws at us | 443 | * We really can take anything the user throws at us |
442 | * but let's pick a nice big number to tell the tty | 444 | * but let's pick a nice big number to tell the tty |
443 | * layer that we have lots of free space | 445 | * layer that we have lots of free space, unless we don't. |
444 | */ | 446 | */ |
447 | |||
448 | spin_lock_irqsave(&priv->lock, flags); | ||
449 | if (priv->outstanding_urbs > URB_UPPER_LIMIT * 2 / 3) { | ||
450 | spin_unlock_irqrestore(&priv->lock, flags); | ||
451 | dbg("%s - write limit hit\n", __FUNCTION__); | ||
452 | return 0; | ||
453 | } | ||
454 | spin_unlock_irqrestore(&priv->lock, flags); | ||
455 | |||
445 | return 2048; | 456 | return 2048; |
446 | } | 457 | } |
447 | 458 | ||
@@ -758,15 +769,22 @@ static int visor_calc_num_ports (struct usb_serial *serial) | |||
758 | 769 | ||
759 | static int generic_startup(struct usb_serial *serial) | 770 | static int generic_startup(struct usb_serial *serial) |
760 | { | 771 | { |
772 | struct usb_serial_port **ports = serial->port; | ||
761 | struct visor_private *priv; | 773 | struct visor_private *priv; |
762 | int i; | 774 | int i; |
763 | 775 | ||
764 | for (i = 0; i < serial->num_ports; ++i) { | 776 | for (i = 0; i < serial->num_ports; ++i) { |
765 | priv = kzalloc (sizeof(*priv), GFP_KERNEL); | 777 | priv = kzalloc (sizeof(*priv), GFP_KERNEL); |
766 | if (!priv) | 778 | if (!priv) { |
779 | while (i-- != 0) { | ||
780 | priv = usb_get_serial_port_data(ports[i]); | ||
781 | usb_set_serial_port_data(ports[i], NULL); | ||
782 | kfree(priv); | ||
783 | } | ||
767 | return -ENOMEM; | 784 | return -ENOMEM; |
785 | } | ||
768 | spin_lock_init(&priv->lock); | 786 | spin_lock_init(&priv->lock); |
769 | usb_set_serial_port_data(serial->port[i], priv); | 787 | usb_set_serial_port_data(ports[i], priv); |
770 | } | 788 | } |
771 | return 0; | 789 | return 0; |
772 | } | 790 | } |
@@ -876,7 +894,18 @@ static int clie_5_attach (struct usb_serial *serial) | |||
876 | 894 | ||
877 | static void visor_shutdown (struct usb_serial *serial) | 895 | static void visor_shutdown (struct usb_serial *serial) |
878 | { | 896 | { |
897 | struct visor_private *priv; | ||
898 | int i; | ||
899 | |||
879 | dbg("%s", __FUNCTION__); | 900 | dbg("%s", __FUNCTION__); |
901 | |||
902 | for (i = 0; i < serial->num_ports; i++) { | ||
903 | priv = usb_get_serial_port_data(serial->port[i]); | ||
904 | if (priv) { | ||
905 | usb_set_serial_port_data(serial->port[i], NULL); | ||
906 | kfree(priv); | ||
907 | } | ||
908 | } | ||
880 | } | 909 | } |
881 | 910 | ||
882 | static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) | 911 | static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg) |
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index 540438c3f381..6e6c7934be32 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c | |||
@@ -79,7 +79,7 @@ | |||
79 | #include <linux/usb.h> | 79 | #include <linux/usb.h> |
80 | #include <linux/serial_reg.h> | 80 | #include <linux/serial_reg.h> |
81 | #include <linux/serial.h> | 81 | #include <linux/serial.h> |
82 | #include "usb-serial.h" | 82 | #include <linux/usb/serial.h> |
83 | #include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */ | 83 | #include "whiteheat_fw.h" /* firmware for the ConnectTech WhiteHEAT device */ |
84 | #include "whiteheat.h" /* WhiteHEAT specific commands */ | 84 | #include "whiteheat.h" /* WhiteHEAT specific commands */ |
85 | 85 | ||
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 5715291ba540..a4b7df9ff8c1 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c | |||
@@ -112,13 +112,11 @@ static int slave_configure(struct scsi_device *sdev) | |||
112 | if (sdev->scsi_level < SCSI_2) | 112 | if (sdev->scsi_level < SCSI_2) |
113 | sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2; | 113 | sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2; |
114 | 114 | ||
115 | /* According to the technical support people at Genesys Logic, | 115 | /* Many devices have trouble transfering more than 32KB at a time, |
116 | * devices using their chips have problems transferring more than | 116 | * while others have trouble with more than 64K. At this time we |
117 | * 32 KB at a time. In practice people have found that 64 KB | 117 | * are limiting both to 32K (64 sectores). |
118 | * works okay and that's what Windows does. But we'll be | 118 | */ |
119 | * conservative; people can always use the sysfs interface to | 119 | if ((us->flags & US_FL_MAX_SECTORS_64) && |
120 | * increase max_sectors. */ | ||
121 | if (le16_to_cpu(us->pusb_dev->descriptor.idVendor) == USB_VENDOR_ID_GENESYS && | ||
122 | sdev->request_queue->max_sectors > 64) | 120 | sdev->request_queue->max_sectors > 64) |
123 | blk_queue_max_sectors(sdev->request_queue, 64); | 121 | blk_queue_max_sectors(sdev->request_queue, 64); |
124 | 122 | ||
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index eb7188b3565c..d6acc92a4ae3 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c | |||
@@ -180,7 +180,7 @@ static int usb_stor_msg_common(struct us_data *us, int timeout) | |||
180 | if (timeleft <= 0) { | 180 | if (timeleft <= 0) { |
181 | US_DEBUGP("%s -- cancelling URB\n", | 181 | US_DEBUGP("%s -- cancelling URB\n", |
182 | timeleft == 0 ? "Timeout" : "Signal"); | 182 | timeleft == 0 ? "Timeout" : "Signal"); |
183 | usb_unlink_urb(us->current_urb); | 183 | usb_kill_urb(us->current_urb); |
184 | } | 184 | } |
185 | 185 | ||
186 | /* return the URB status */ | 186 | /* return the URB status */ |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index c7e84e653df9..a5ca449f6e64 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -112,6 +112,19 @@ UNUSUAL_DEV( 0x0411, 0x001c, 0x0113, 0x0113, | |||
112 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 112 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
113 | US_FL_FIX_INQUIRY ), | 113 | US_FL_FIX_INQUIRY ), |
114 | 114 | ||
115 | /* Submitted by Ernestas Vaiciukevicius <ernisv@gmail.com> */ | ||
116 | UNUSUAL_DEV( 0x0419, 0x0100, 0x0100, 0x0100, | ||
117 | "Samsung Info. Systems America, Inc.", | ||
118 | "MP3 Player", | ||
119 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
120 | US_FL_IGNORE_RESIDUE ), | ||
121 | |||
122 | /* Reported by Orgad Shaneh <orgads@gmail.com> */ | ||
123 | UNUSUAL_DEV( 0x0419, 0xaace, 0x0100, 0x0100, | ||
124 | "Samsung", "MP3 Player", | ||
125 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
126 | US_FL_IGNORE_RESIDUE ), | ||
127 | |||
115 | /* Reported by Christian Leber <christian@leber.de> */ | 128 | /* Reported by Christian Leber <christian@leber.de> */ |
116 | UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100, | 129 | UNUSUAL_DEV( 0x0419, 0xaaf5, 0x0100, 0x0100, |
117 | "TrekStor", | 130 | "TrekStor", |
@@ -132,6 +145,14 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100, | |||
132 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 145 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
133 | US_FL_IGNORE_RESIDUE ), | 146 | US_FL_IGNORE_RESIDUE ), |
134 | 147 | ||
148 | /* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and | ||
149 | * Einar Th. Einarsson <einarthered@gmail.com> */ | ||
150 | UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100, | ||
151 | "Nokia", | ||
152 | "N91", | ||
153 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
154 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | ||
155 | |||
135 | /* Reported by Jiri Slaby <jirislaby@gmail.com> and | 156 | /* Reported by Jiri Slaby <jirislaby@gmail.com> and |
136 | * Rene C. Castberg <Rene@Castberg.org> */ | 157 | * Rene C. Castberg <Rene@Castberg.org> */ |
137 | UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, | 158 | UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, |
@@ -140,6 +161,13 @@ UNUSUAL_DEV( 0x0421, 0x0446, 0x0100, 0x0100, | |||
140 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 161 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
141 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | 162 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), |
142 | 163 | ||
164 | /* Reported by Matthew Bloch <matthew@bytemark.co.uk> */ | ||
165 | UNUSUAL_DEV( 0x0421, 0x044e, 0x0100, 0x0100, | ||
166 | "Nokia", | ||
167 | "E61", | ||
168 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
169 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | ||
170 | |||
143 | /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */ | 171 | /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */ |
144 | UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, | 172 | UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, |
145 | "SMSC", | 173 | "SMSC", |
@@ -473,10 +501,11 @@ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450, | |||
473 | US_SC_SCSI, US_PR_DEVICE, NULL, | 501 | US_SC_SCSI, US_PR_DEVICE, NULL, |
474 | US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ), | 502 | US_FL_SINGLE_LUN | US_FL_NOT_LOCKABLE | US_FL_NO_WP_DETECT ), |
475 | 503 | ||
476 | /* This entry is needed because the device reports Sub=ff */ | 504 | /* Submitted by Lars Jacob <jacob.lars@googlemail.com> |
477 | UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0600, | 505 | * This entry is needed because the device reports Sub=ff */ |
506 | UNUSUAL_DEV( 0x054c, 0x0010, 0x0500, 0x0610, | ||
478 | "Sony", | 507 | "Sony", |
479 | "DSC-T1/T5", | 508 | "DSC-T1/T5/H5", |
480 | US_SC_8070, US_PR_DEVICE, NULL, | 509 | US_SC_8070, US_PR_DEVICE, NULL, |
481 | US_FL_SINGLE_LUN ), | 510 | US_FL_SINGLE_LUN ), |
482 | 511 | ||
@@ -708,18 +737,22 @@ UNUSUAL_DEV( 0x05dc, 0xb002, 0x0000, 0x0113, | |||
708 | * They were originally reported by Alexander Oltu | 737 | * They were originally reported by Alexander Oltu |
709 | * <alexander@all-2.com> and Peter Marks <peter.marks@turner.com> | 738 | * <alexander@all-2.com> and Peter Marks <peter.marks@turner.com> |
710 | * respectively. | 739 | * respectively. |
740 | * | ||
741 | * US_FL_GO_SLOW and US_FL_MAX_SECTORS_64 added by Phil Dibowitz | ||
742 | * <phil@ipom.com> as these flags were made and hard-coded | ||
743 | * special-cases were pulled from scsiglue.c. | ||
711 | */ | 744 | */ |
712 | UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff, | 745 | UNUSUAL_DEV( 0x05e3, 0x0701, 0x0000, 0xffff, |
713 | "Genesys Logic", | 746 | "Genesys Logic", |
714 | "USB to IDE Optical", | 747 | "USB to IDE Optical", |
715 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 748 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
716 | US_FL_GO_SLOW ), | 749 | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), |
717 | 750 | ||
718 | UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff, | 751 | UNUSUAL_DEV( 0x05e3, 0x0702, 0x0000, 0xffff, |
719 | "Genesys Logic", | 752 | "Genesys Logic", |
720 | "USB to IDE Disk", | 753 | "USB to IDE Disk", |
721 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 754 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
722 | US_FL_GO_SLOW ), | 755 | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ), |
723 | 756 | ||
724 | /* Reported by Hanno Boeck <hanno@gmx.de> | 757 | /* Reported by Hanno Boeck <hanno@gmx.de> |
725 | * Taken from the Lycoris Kernel */ | 758 | * Taken from the Lycoris Kernel */ |
@@ -1196,6 +1229,14 @@ UNUSUAL_DEV( 0x0ea0, 0x6828, 0x0110, 0x0110, | |||
1196 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1229 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1197 | US_FL_IGNORE_RESIDUE ), | 1230 | US_FL_IGNORE_RESIDUE ), |
1198 | 1231 | ||
1232 | /* Reported by Benjamin Schiller <sbenni@gmx.de> | ||
1233 | * It is also sold by Easylite as DJ 20 */ | ||
1234 | UNUSUAL_DEV( 0x0ed1, 0x7636, 0x0103, 0x0103, | ||
1235 | "Typhoon", | ||
1236 | "My DJ 1820", | ||
1237 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1238 | US_FL_IGNORE_RESIDUE | US_FL_GO_SLOW | US_FL_MAX_SECTORS_64), | ||
1239 | |||
1199 | /* Reported by Michael Stattmann <michael@stattmann.com> */ | 1240 | /* Reported by Michael Stattmann <michael@stattmann.com> */ |
1200 | UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, | 1241 | UNUSUAL_DEV( 0x0fce, 0xd008, 0x0000, 0x0000, |
1201 | "Sony Ericsson", | 1242 | "Sony Ericsson", |
@@ -1227,6 +1268,15 @@ UNUSUAL_DEV( 0x1370, 0x6828, 0x0110, 0x0110, | |||
1227 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1268 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1228 | US_FL_IGNORE_RESIDUE ), | 1269 | US_FL_IGNORE_RESIDUE ), |
1229 | 1270 | ||
1271 | /* patch submitted by Davide Perini <perini.davide@dpsoftware.org> | ||
1272 | * and Renato Perini <rperini@email.it> | ||
1273 | */ | ||
1274 | UNUSUAL_DEV( 0x22b8, 0x3010, 0x0001, 0x0001, | ||
1275 | "Motorola", | ||
1276 | "RAZR V3x", | ||
1277 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1278 | US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ), | ||
1279 | |||
1230 | /* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */ | 1280 | /* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */ |
1231 | UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, | 1281 | UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, |
1232 | "MPIO", | 1282 | "MPIO", |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 1185acac4b21..5ee19be52f65 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
@@ -55,6 +55,7 @@ | |||
55 | #include <linux/slab.h> | 55 | #include <linux/slab.h> |
56 | #include <linux/kthread.h> | 56 | #include <linux/kthread.h> |
57 | #include <linux/mutex.h> | 57 | #include <linux/mutex.h> |
58 | #include <linux/utsrelease.h> | ||
58 | 59 | ||
59 | #include <scsi/scsi.h> | 60 | #include <scsi/scsi.h> |
60 | #include <scsi/scsi_cmnd.h> | 61 | #include <scsi/scsi_cmnd.h> |
@@ -373,8 +374,12 @@ static int usb_stor_control_thread(void * __us) | |||
373 | /* lock access to the state */ | 374 | /* lock access to the state */ |
374 | scsi_lock(host); | 375 | scsi_lock(host); |
375 | 376 | ||
377 | /* did the command already complete because of a disconnect? */ | ||
378 | if (!us->srb) | ||
379 | ; /* nothing to do */ | ||
380 | |||
376 | /* indicate that the command is done */ | 381 | /* indicate that the command is done */ |
377 | if (us->srb->result != DID_ABORT << 16) { | 382 | else if (us->srb->result != DID_ABORT << 16) { |
378 | US_DEBUGP("scsi cmd done, result=0x%x\n", | 383 | US_DEBUGP("scsi cmd done, result=0x%x\n", |
379 | us->srb->result); | 384 | us->srb->result); |
380 | us->srb->scsi_done(us->srb); | 385 | us->srb->scsi_done(us->srb); |
@@ -524,7 +529,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
524 | if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE)) | 529 | if (msg >= 0 && !(us->flags & US_FL_NEED_OVERRIDE)) |
525 | printk(KERN_NOTICE USB_STORAGE "This device " | 530 | printk(KERN_NOTICE USB_STORAGE "This device " |
526 | "(%04x,%04x,%04x S %02x P %02x)" | 531 | "(%04x,%04x,%04x S %02x P %02x)" |
527 | " has %s in unusual_devs.h\n" | 532 | " has %s in unusual_devs.h (kernel" |
533 | " %s)\n" | ||
528 | " Please send a copy of this message to " | 534 | " Please send a copy of this message to " |
529 | "<linux-usb-devel@lists.sourceforge.net>\n", | 535 | "<linux-usb-devel@lists.sourceforge.net>\n", |
530 | le16_to_cpu(ddesc->idVendor), | 536 | le16_to_cpu(ddesc->idVendor), |
@@ -532,7 +538,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
532 | le16_to_cpu(ddesc->bcdDevice), | 538 | le16_to_cpu(ddesc->bcdDevice), |
533 | idesc->bInterfaceSubClass, | 539 | idesc->bInterfaceSubClass, |
534 | idesc->bInterfaceProtocol, | 540 | idesc->bInterfaceProtocol, |
535 | msgs[msg]); | 541 | msgs[msg], |
542 | UTS_RELEASE); | ||
536 | } | 543 | } |
537 | } | 544 | } |
538 | 545 | ||
@@ -836,32 +843,34 @@ static void dissociate_dev(struct us_data *us) | |||
836 | * the host */ | 843 | * the host */ |
837 | static void quiesce_and_remove_host(struct us_data *us) | 844 | static void quiesce_and_remove_host(struct us_data *us) |
838 | { | 845 | { |
846 | struct Scsi_Host *host = us_to_host(us); | ||
847 | |||
839 | /* Prevent new USB transfers, stop the current command, and | 848 | /* Prevent new USB transfers, stop the current command, and |
840 | * interrupt a SCSI-scan or device-reset delay */ | 849 | * interrupt a SCSI-scan or device-reset delay */ |
850 | scsi_lock(host); | ||
841 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); | 851 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); |
852 | scsi_unlock(host); | ||
842 | usb_stor_stop_transport(us); | 853 | usb_stor_stop_transport(us); |
843 | wake_up(&us->delay_wait); | 854 | wake_up(&us->delay_wait); |
844 | 855 | ||
845 | /* It doesn't matter if the SCSI-scanning thread is still running. | 856 | /* It doesn't matter if the SCSI-scanning thread is still running. |
846 | * The thread will exit when it sees the DISCONNECTING flag. */ | 857 | * The thread will exit when it sees the DISCONNECTING flag. */ |
847 | 858 | ||
848 | /* Wait for the current command to finish, then remove the host */ | ||
849 | mutex_lock(&us->dev_mutex); | ||
850 | mutex_unlock(&us->dev_mutex); | ||
851 | |||
852 | /* queuecommand won't accept any new commands and the control | 859 | /* queuecommand won't accept any new commands and the control |
853 | * thread won't execute a previously-queued command. If there | 860 | * thread won't execute a previously-queued command. If there |
854 | * is such a command pending, complete it with an error. */ | 861 | * is such a command pending, complete it with an error. */ |
862 | mutex_lock(&us->dev_mutex); | ||
855 | if (us->srb) { | 863 | if (us->srb) { |
856 | us->srb->result = DID_NO_CONNECT << 16; | 864 | us->srb->result = DID_NO_CONNECT << 16; |
857 | scsi_lock(us_to_host(us)); | 865 | scsi_lock(host); |
858 | us->srb->scsi_done(us->srb); | 866 | us->srb->scsi_done(us->srb); |
859 | us->srb = NULL; | 867 | us->srb = NULL; |
860 | scsi_unlock(us_to_host(us)); | 868 | scsi_unlock(host); |
861 | } | 869 | } |
870 | mutex_unlock(&us->dev_mutex); | ||
862 | 871 | ||
863 | /* Now we own no commands so it's safe to remove the SCSI host */ | 872 | /* Now we own no commands so it's safe to remove the SCSI host */ |
864 | scsi_remove_host(us_to_host(us)); | 873 | scsi_remove_host(host); |
865 | } | 874 | } |
866 | 875 | ||
867 | /* Second stage of disconnect processing: deallocate all resources */ | 876 | /* Second stage of disconnect processing: deallocate all resources */ |
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h index 5284abe1b5eb..21f3ddbc9080 100644 --- a/drivers/usb/storage/usb.h +++ b/drivers/usb/storage/usb.h | |||
@@ -176,8 +176,4 @@ extern void fill_inquiry_response(struct us_data *us, | |||
176 | #define scsi_unlock(host) spin_unlock_irq(host->host_lock) | 176 | #define scsi_unlock(host) spin_unlock_irq(host->host_lock) |
177 | #define scsi_lock(host) spin_lock_irq(host->host_lock) | 177 | #define scsi_lock(host) spin_lock_irq(host->host_lock) |
178 | 178 | ||
179 | |||
180 | /* Vendor ID list for devices that require special handling */ | ||
181 | #define USB_VENDOR_ID_GENESYS 0x05e3 /* Genesys Logic */ | ||
182 | |||
183 | #endif | 179 | #endif |