diff options
Diffstat (limited to 'drivers/usb')
| -rw-r--r-- | drivers/usb/core/Kconfig | 16 | ||||
| -rw-r--r-- | drivers/usb/core/hub.c | 9 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-ep93xx.c | 2 | ||||
| -rw-r--r-- | drivers/usb/input/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/usb/input/hid-core.c | 44 | ||||
| -rw-r--r-- | drivers/usb/input/hid-ff.c | 5 | ||||
| -rw-r--r-- | drivers/usb/input/hiddev.c | 2 | ||||
| -rw-r--r-- | drivers/usb/input/usbhid.h | 3 | ||||
| -rw-r--r-- | drivers/usb/input/usbtouchscreen.c | 98 | ||||
| -rw-r--r-- | drivers/usb/net/asix.c | 18 | ||||
| -rw-r--r-- | drivers/usb/net/rndis_host.c | 23 | ||||
| -rw-r--r-- | drivers/usb/serial/funsoft.c | 2 | ||||
| -rw-r--r-- | drivers/usb/serial/option.c | 3 | ||||
| -rw-r--r-- | drivers/usb/storage/unusual_devs.h | 19 |
14 files changed, 147 insertions, 99 deletions
diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index f8324d8d06ac..3e66b2a9974a 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig | |||
| @@ -72,22 +72,6 @@ config USB_SUSPEND | |||
| 72 | 72 | ||
| 73 | If you are unsure about this, say N here. | 73 | If you are unsure about this, say N here. |
| 74 | 74 | ||
| 75 | config USB_MULTITHREAD_PROBE | ||
| 76 | bool "USB Multi-threaded probe (EXPERIMENTAL)" | ||
| 77 | depends on USB && EXPERIMENTAL | ||
| 78 | default n | ||
| 79 | help | ||
| 80 | Say Y here if you want the USB core to spawn a new thread for | ||
| 81 | every USB device that is probed. This can cause a small speedup | ||
| 82 | in boot times on systems with a lot of different USB devices. | ||
| 83 | |||
| 84 | This option should be safe to enable, but if any odd probing | ||
| 85 | problems are found, please disable it, or dynamically turn it | ||
| 86 | off in the /sys/module/usbcore/parameters/multithread_probe | ||
| 87 | file | ||
| 88 | |||
| 89 | When in doubt, say N. | ||
| 90 | |||
| 91 | config USB_OTG | 75 | config USB_OTG |
| 92 | bool | 76 | bool |
| 93 | depends on USB && EXPERIMENTAL | 77 | depends on USB && EXPERIMENTAL |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 2651c2e2a89f..1988224b362b 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -88,14 +88,7 @@ static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); | |||
| 88 | static struct task_struct *khubd_task; | 88 | static struct task_struct *khubd_task; |
| 89 | 89 | ||
| 90 | /* multithreaded probe logic */ | 90 | /* multithreaded probe logic */ |
| 91 | static int multithread_probe = | 91 | static int multithread_probe = 0; |
| 92 | #ifdef CONFIG_USB_MULTITHREAD_PROBE | ||
| 93 | 1; | ||
| 94 | #else | ||
| 95 | 0; | ||
| 96 | #endif | ||
| 97 | module_param(multithread_probe, bool, S_IRUGO); | ||
| 98 | MODULE_PARM_DESC(multithread_probe, "Run each USB device probe in a new thread"); | ||
| 99 | 92 | ||
| 100 | /* cycle leds on hubs that aren't blinking for attention */ | 93 | /* cycle leds on hubs that aren't blinking for attention */ |
| 101 | static int blinkenlights = 0; | 94 | static int blinkenlights = 0; |
diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c index 43ae696b2ec2..3348b07f0fe5 100644 --- a/drivers/usb/host/ohci-ep93xx.c +++ b/drivers/usb/host/ohci-ep93xx.c | |||
| @@ -169,7 +169,7 @@ static int ohci_hcd_ep93xx_drv_remove(struct platform_device *pdev) | |||
| 169 | static int ohci_hcd_ep93xx_drv_suspend(struct platform_device *pdev, pm_message_t state) | 169 | static int ohci_hcd_ep93xx_drv_suspend(struct platform_device *pdev, pm_message_t state) |
| 170 | { | 170 | { |
| 171 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 171 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
| 172 | struct ochi_hcd *ohci = hcd_to_ohci(hcd); | 172 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
| 173 | 173 | ||
| 174 | if (time_before(jiffies, ohci->next_statechange)) | 174 | if (time_before(jiffies, ohci->next_statechange)) |
| 175 | msleep(5); | 175 | msleep(5); |
diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig index 258a5d09d3dc..c7d887540d8d 100644 --- a/drivers/usb/input/Kconfig +++ b/drivers/usb/input/Kconfig | |||
| @@ -7,7 +7,7 @@ comment "USB Input Devices" | |||
| 7 | config USB_HID | 7 | config USB_HID |
| 8 | tristate "USB Human Interface Device (full HID) support" | 8 | tristate "USB Human Interface Device (full HID) support" |
| 9 | default y | 9 | default y |
| 10 | depends on USB | 10 | depends on USB && INPUT |
| 11 | select HID | 11 | select HID |
| 12 | ---help--- | 12 | ---help--- |
| 13 | Say Y here if you want full HID support to connect USB keyboards, | 13 | Say Y here if you want full HID support to connect USB keyboards, |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 89fa6885709b..ea3636d96e1b 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
| @@ -106,18 +106,18 @@ static void hid_reset(struct work_struct *work) | |||
| 106 | 106 | ||
| 107 | if (test_bit(HID_CLEAR_HALT, &usbhid->iofl)) { | 107 | if (test_bit(HID_CLEAR_HALT, &usbhid->iofl)) { |
| 108 | dev_dbg(&usbhid->intf->dev, "clear halt\n"); | 108 | dev_dbg(&usbhid->intf->dev, "clear halt\n"); |
| 109 | rc = usb_clear_halt(to_usb_device(hid->dev), usbhid->urbin->pipe); | 109 | rc = usb_clear_halt(hid_to_usb_dev(hid), usbhid->urbin->pipe); |
| 110 | clear_bit(HID_CLEAR_HALT, &usbhid->iofl); | 110 | clear_bit(HID_CLEAR_HALT, &usbhid->iofl); |
| 111 | hid_start_in(hid); | 111 | hid_start_in(hid); |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | else if (test_bit(HID_RESET_PENDING, &usbhid->iofl)) { | 114 | else if (test_bit(HID_RESET_PENDING, &usbhid->iofl)) { |
| 115 | dev_dbg(&usbhid->intf->dev, "resetting device\n"); | 115 | dev_dbg(&usbhid->intf->dev, "resetting device\n"); |
| 116 | rc = rc_lock = usb_lock_device_for_reset(to_usb_device(hid->dev), usbhid->intf); | 116 | rc = rc_lock = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf); |
| 117 | if (rc_lock >= 0) { | 117 | if (rc_lock >= 0) { |
| 118 | rc = usb_reset_composite_device(to_usb_device(hid->dev), usbhid->intf); | 118 | rc = usb_reset_composite_device(hid_to_usb_dev(hid), usbhid->intf); |
| 119 | if (rc_lock) | 119 | if (rc_lock) |
| 120 | usb_unlock_device(to_usb_device(hid->dev)); | 120 | usb_unlock_device(hid_to_usb_dev(hid)); |
| 121 | } | 121 | } |
| 122 | clear_bit(HID_RESET_PENDING, &usbhid->iofl); | 122 | clear_bit(HID_RESET_PENDING, &usbhid->iofl); |
| 123 | } | 123 | } |
| @@ -129,8 +129,8 @@ static void hid_reset(struct work_struct *work) | |||
| 129 | break; | 129 | break; |
| 130 | default: | 130 | default: |
| 131 | err("can't reset device, %s-%s/input%d, status %d", | 131 | err("can't reset device, %s-%s/input%d, status %d", |
| 132 | to_usb_device(hid->dev)->bus->bus_name, | 132 | hid_to_usb_dev(hid)->bus->bus_name, |
| 133 | to_usb_device(hid->dev)->devpath, | 133 | hid_to_usb_dev(hid)->devpath, |
| 134 | usbhid->ifnum, rc); | 134 | usbhid->ifnum, rc); |
| 135 | /* FALLTHROUGH */ | 135 | /* FALLTHROUGH */ |
| 136 | case -EHOSTUNREACH: | 136 | case -EHOSTUNREACH: |
| @@ -217,8 +217,8 @@ static void hid_irq_in(struct urb *urb) | |||
| 217 | clear_bit(HID_IN_RUNNING, &usbhid->iofl); | 217 | clear_bit(HID_IN_RUNNING, &usbhid->iofl); |
| 218 | if (status != -EPERM) { | 218 | if (status != -EPERM) { |
| 219 | err("can't resubmit intr, %s-%s/input%d, status %d", | 219 | err("can't resubmit intr, %s-%s/input%d, status %d", |
| 220 | to_usb_device(hid->dev)->bus->bus_name, | 220 | hid_to_usb_dev(hid)->bus->bus_name, |
| 221 | to_usb_device(hid->dev)->devpath, | 221 | hid_to_usb_dev(hid)->devpath, |
| 222 | usbhid->ifnum, status); | 222 | usbhid->ifnum, status); |
| 223 | hid_io_error(hid); | 223 | hid_io_error(hid); |
| 224 | } | 224 | } |
| @@ -251,7 +251,7 @@ static int hid_submit_out(struct hid_device *hid) | |||
| 251 | 251 | ||
| 252 | hid_output_report(report, usbhid->outbuf); | 252 | hid_output_report(report, usbhid->outbuf); |
| 253 | usbhid->urbout->transfer_buffer_length = ((report->size - 1) >> 3) + 1 + (report->id > 0); | 253 | usbhid->urbout->transfer_buffer_length = ((report->size - 1) >> 3) + 1 + (report->id > 0); |
| 254 | usbhid->urbout->dev = to_usb_device(hid->dev); | 254 | usbhid->urbout->dev = hid_to_usb_dev(hid); |
| 255 | 255 | ||
| 256 | dbg("submitting out urb"); | 256 | dbg("submitting out urb"); |
| 257 | 257 | ||
| @@ -276,13 +276,13 @@ static int hid_submit_ctrl(struct hid_device *hid) | |||
| 276 | len = ((report->size - 1) >> 3) + 1 + (report->id > 0); | 276 | len = ((report->size - 1) >> 3) + 1 + (report->id > 0); |
| 277 | if (dir == USB_DIR_OUT) { | 277 | if (dir == USB_DIR_OUT) { |
| 278 | hid_output_report(report, usbhid->ctrlbuf); | 278 | hid_output_report(report, usbhid->ctrlbuf); |
| 279 | usbhid->urbctrl->pipe = usb_sndctrlpipe(to_usb_device(hid->dev), 0); | 279 | usbhid->urbctrl->pipe = usb_sndctrlpipe(hid_to_usb_dev(hid), 0); |
| 280 | usbhid->urbctrl->transfer_buffer_length = len; | 280 | usbhid->urbctrl->transfer_buffer_length = len; |
| 281 | } else { | 281 | } else { |
| 282 | int maxpacket, padlen; | 282 | int maxpacket, padlen; |
| 283 | 283 | ||
| 284 | usbhid->urbctrl->pipe = usb_rcvctrlpipe(to_usb_device(hid->dev), 0); | 284 | usbhid->urbctrl->pipe = usb_rcvctrlpipe(hid_to_usb_dev(hid), 0); |
| 285 | maxpacket = usb_maxpacket(to_usb_device(hid->dev), usbhid->urbctrl->pipe, 0); | 285 | maxpacket = usb_maxpacket(hid_to_usb_dev(hid), usbhid->urbctrl->pipe, 0); |
| 286 | if (maxpacket > 0) { | 286 | if (maxpacket > 0) { |
| 287 | padlen = (len + maxpacket - 1) / maxpacket; | 287 | padlen = (len + maxpacket - 1) / maxpacket; |
| 288 | padlen *= maxpacket; | 288 | padlen *= maxpacket; |
| @@ -292,7 +292,7 @@ static int hid_submit_ctrl(struct hid_device *hid) | |||
| 292 | padlen = 0; | 292 | padlen = 0; |
| 293 | usbhid->urbctrl->transfer_buffer_length = padlen; | 293 | usbhid->urbctrl->transfer_buffer_length = padlen; |
| 294 | } | 294 | } |
| 295 | usbhid->urbctrl->dev = to_usb_device(hid->dev); | 295 | usbhid->urbctrl->dev = hid_to_usb_dev(hid); |
| 296 | 296 | ||
| 297 | usbhid->cr->bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE | dir; | 297 | usbhid->cr->bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE | dir; |
| 298 | usbhid->cr->bRequest = (dir == USB_DIR_OUT) ? HID_REQ_SET_REPORT : HID_REQ_GET_REPORT; | 298 | usbhid->cr->bRequest = (dir == USB_DIR_OUT) ? HID_REQ_SET_REPORT : HID_REQ_GET_REPORT; |
| @@ -582,6 +582,8 @@ void usbhid_init_reports(struct hid_device *hid) | |||
| 582 | } | 582 | } |
| 583 | 583 | ||
| 584 | #define USB_VENDOR_ID_GTCO 0x078c | 584 | #define USB_VENDOR_ID_GTCO 0x078c |
| 585 | #define USB_VENDOR_ID_GTCO_IPANEL_1 0x08ca | ||
| 586 | #define USB_VENDOR_ID_GTCO_IPANEL_2 0x5543 | ||
| 585 | #define USB_DEVICE_ID_GTCO_90 0x0090 | 587 | #define USB_DEVICE_ID_GTCO_90 0x0090 |
| 586 | #define USB_DEVICE_ID_GTCO_100 0x0100 | 588 | #define USB_DEVICE_ID_GTCO_100 0x0100 |
| 587 | #define USB_DEVICE_ID_GTCO_101 0x0101 | 589 | #define USB_DEVICE_ID_GTCO_101 0x0101 |
| @@ -627,6 +629,9 @@ void usbhid_init_reports(struct hid_device *hid) | |||
| 627 | #define USB_DEVICE_ID_GTCO_1004 0x1004 | 629 | #define USB_DEVICE_ID_GTCO_1004 0x1004 |
| 628 | #define USB_DEVICE_ID_GTCO_1005 0x1005 | 630 | #define USB_DEVICE_ID_GTCO_1005 0x1005 |
| 629 | #define USB_DEVICE_ID_GTCO_1006 0x1006 | 631 | #define USB_DEVICE_ID_GTCO_1006 0x1006 |
| 632 | #define USB_DEVICE_ID_GTCO_10 0x0010 | ||
| 633 | #define USB_DEVICE_ID_GTCO_8 0x0008 | ||
| 634 | #define USB_DEVICE_ID_GTCO_d 0x000d | ||
| 630 | 635 | ||
| 631 | #define USB_VENDOR_ID_WACOM 0x056a | 636 | #define USB_VENDOR_ID_WACOM 0x056a |
| 632 | 637 | ||
| @@ -791,6 +796,9 @@ void usbhid_init_reports(struct hid_device *hid) | |||
| 791 | #define USB_VENDOR_ID_LOGITECH 0x046d | 796 | #define USB_VENDOR_ID_LOGITECH 0x046d |
| 792 | #define USB_DEVICE_ID_LOGITECH_USB_RECEIVER 0xc101 | 797 | #define USB_DEVICE_ID_LOGITECH_USB_RECEIVER 0xc101 |
| 793 | 798 | ||
| 799 | #define USB_VENDOR_ID_IMATION 0x0718 | ||
| 800 | #define USB_DEVICE_ID_DISC_STAKKA 0xd000 | ||
| 801 | |||
| 794 | /* | 802 | /* |
| 795 | * Alphabetically sorted blacklist by quirk type. | 803 | * Alphabetically sorted blacklist by quirk type. |
| 796 | */ | 804 | */ |
| @@ -875,6 +883,10 @@ static const struct hid_blacklist { | |||
| 875 | { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004, HID_QUIRK_IGNORE }, | 883 | { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004, HID_QUIRK_IGNORE }, |
| 876 | { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005, HID_QUIRK_IGNORE }, | 884 | { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005, HID_QUIRK_IGNORE }, |
| 877 | { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006, HID_QUIRK_IGNORE }, | 885 | { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006, HID_QUIRK_IGNORE }, |
| 886 | { USB_VENDOR_ID_GTCO_IPANEL_1, USB_DEVICE_ID_GTCO_10, HID_QUIRK_IGNORE }, | ||
| 887 | { USB_VENDOR_ID_GTCO_IPANEL_2, USB_DEVICE_ID_GTCO_8, HID_QUIRK_IGNORE }, | ||
| 888 | { USB_VENDOR_ID_GTCO_IPANEL_2, USB_DEVICE_ID_GTCO_d, HID_QUIRK_IGNORE }, | ||
| 889 | { USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA, HID_QUIRK_IGNORE }, | ||
| 878 | { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE }, | 890 | { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE }, |
| 879 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE }, | 891 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE }, |
| 880 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE }, | 892 | { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE }, |
| @@ -951,7 +963,7 @@ static const struct hid_blacklist { | |||
| 951 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, | 963 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
| 952 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, | 964 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 953 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, | 965 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 954 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN }, | 966 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
| 955 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, | 967 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 956 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN }, | 968 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 957 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN }, | 969 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN }, |
| @@ -1187,7 +1199,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
| 1187 | 1199 | ||
| 1188 | hid->version = le16_to_cpu(hdesc->bcdHID); | 1200 | hid->version = le16_to_cpu(hdesc->bcdHID); |
| 1189 | hid->country = hdesc->bCountryCode; | 1201 | hid->country = hdesc->bCountryCode; |
| 1190 | hid->dev = &dev->dev; | 1202 | hid->dev = &intf->dev; |
| 1191 | usbhid->intf = intf; | 1203 | usbhid->intf = intf; |
| 1192 | usbhid->ifnum = interface->desc.bInterfaceNumber; | 1204 | usbhid->ifnum = interface->desc.bInterfaceNumber; |
| 1193 | 1205 | ||
| @@ -1282,7 +1294,7 @@ static void hid_disconnect(struct usb_interface *intf) | |||
| 1282 | usb_free_urb(usbhid->urbctrl); | 1294 | usb_free_urb(usbhid->urbctrl); |
| 1283 | usb_free_urb(usbhid->urbout); | 1295 | usb_free_urb(usbhid->urbout); |
| 1284 | 1296 | ||
| 1285 | hid_free_buffers(to_usb_device(hid->dev), hid); | 1297 | hid_free_buffers(hid_to_usb_dev(hid), hid); |
| 1286 | hid_free_device(hid); | 1298 | hid_free_device(hid); |
| 1287 | } | 1299 | } |
| 1288 | 1300 | ||
diff --git a/drivers/usb/input/hid-ff.c b/drivers/usb/input/hid-ff.c index f8f660ee3fac..59ed65e7a621 100644 --- a/drivers/usb/input/hid-ff.c +++ b/drivers/usb/input/hid-ff.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/usb.h> | 33 | #include <linux/usb.h> |
| 34 | 34 | ||
| 35 | #include <linux/hid.h> | 35 | #include <linux/hid.h> |
| 36 | #include "usbhid.h" | ||
| 36 | 37 | ||
| 37 | /* | 38 | /* |
| 38 | * This table contains pointers to initializers. To add support for new | 39 | * This table contains pointers to initializers. To add support for new |
| @@ -70,8 +71,8 @@ static struct hid_ff_initializer inits[] = { | |||
| 70 | int hid_ff_init(struct hid_device* hid) | 71 | int hid_ff_init(struct hid_device* hid) |
| 71 | { | 72 | { |
| 72 | struct hid_ff_initializer *init; | 73 | struct hid_ff_initializer *init; |
| 73 | int vendor = le16_to_cpu(to_usb_device(hid->dev)->descriptor.idVendor); | 74 | int vendor = le16_to_cpu(hid_to_usb_dev(hid)->descriptor.idVendor); |
| 74 | int product = le16_to_cpu(to_usb_device(hid->dev)->descriptor.idProduct); | 75 | int product = le16_to_cpu(hid_to_usb_dev(hid)->descriptor.idProduct); |
| 75 | 76 | ||
| 76 | for (init = inits; init->idVendor; init++) | 77 | for (init = inits; init->idVendor; init++) |
| 77 | if (init->idVendor == vendor && init->idProduct == product) | 78 | if (init->idVendor == vendor && init->idProduct == product) |
diff --git a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c index 114d6c9f64b1..a8b3d66cd498 100644 --- a/drivers/usb/input/hiddev.c +++ b/drivers/usb/input/hiddev.c | |||
| @@ -384,7 +384,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd | |||
| 384 | struct hiddev_list *list = file->private_data; | 384 | struct hiddev_list *list = file->private_data; |
| 385 | struct hiddev *hiddev = list->hiddev; | 385 | struct hiddev *hiddev = list->hiddev; |
| 386 | struct hid_device *hid = hiddev->hid; | 386 | struct hid_device *hid = hiddev->hid; |
| 387 | struct usb_device *dev = to_usb_device(hid->dev); | 387 | struct usb_device *dev = hid_to_usb_dev(hid); |
| 388 | struct hiddev_collection_info cinfo; | 388 | struct hiddev_collection_info cinfo; |
| 389 | struct hiddev_report_info rinfo; | 389 | struct hiddev_report_info rinfo; |
| 390 | struct hiddev_field_info finfo; | 390 | struct hiddev_field_info finfo; |
diff --git a/drivers/usb/input/usbhid.h b/drivers/usb/input/usbhid.h index 830107e5251f..0023f96d4294 100644 --- a/drivers/usb/input/usbhid.h +++ b/drivers/usb/input/usbhid.h | |||
| @@ -80,5 +80,8 @@ struct usbhid_device { | |||
| 80 | 80 | ||
| 81 | }; | 81 | }; |
| 82 | 82 | ||
| 83 | #define hid_to_usb_dev(hid_dev) \ | ||
| 84 | container_of(hid_dev->dev->parent, struct usb_device, dev) | ||
| 85 | |||
| 83 | #endif | 86 | #endif |
| 84 | 87 | ||
diff --git a/drivers/usb/input/usbtouchscreen.c b/drivers/usb/input/usbtouchscreen.c index 7f3c57da9bc0..86e37a20f8e5 100644 --- a/drivers/usb/input/usbtouchscreen.c +++ b/drivers/usb/input/usbtouchscreen.c | |||
| @@ -66,7 +66,7 @@ struct usbtouch_device_info { | |||
| 66 | 66 | ||
| 67 | void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len); | 67 | void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len); |
| 68 | int (*get_pkt_len) (unsigned char *pkt, int len); | 68 | int (*get_pkt_len) (unsigned char *pkt, int len); |
| 69 | int (*read_data) (unsigned char *pkt, int *x, int *y, int *touch, int *press); | 69 | int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt); |
| 70 | int (*init) (struct usbtouch_usb *usbtouch); | 70 | int (*init) (struct usbtouch_usb *usbtouch); |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
| @@ -85,6 +85,9 @@ struct usbtouch_usb { | |||
| 85 | struct usbtouch_device_info *type; | 85 | struct usbtouch_device_info *type; |
| 86 | char name[128]; | 86 | char name[128]; |
| 87 | char phys[64]; | 87 | char phys[64]; |
| 88 | |||
| 89 | int x, y; | ||
| 90 | int touch, press; | ||
| 88 | }; | 91 | }; |
| 89 | 92 | ||
| 90 | 93 | ||
| @@ -161,14 +164,14 @@ static struct usb_device_id usbtouch_devices[] = { | |||
| 161 | #define EGALAX_PKT_TYPE_REPT 0x80 | 164 | #define EGALAX_PKT_TYPE_REPT 0x80 |
| 162 | #define EGALAX_PKT_TYPE_DIAG 0x0A | 165 | #define EGALAX_PKT_TYPE_DIAG 0x0A |
| 163 | 166 | ||
| 164 | static int egalax_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | 167 | static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt) |
| 165 | { | 168 | { |
| 166 | if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT) | 169 | if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT) |
| 167 | return 0; | 170 | return 0; |
| 168 | 171 | ||
| 169 | *x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F); | 172 | dev->x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F); |
| 170 | *y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F); | 173 | dev->y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F); |
| 171 | *touch = pkt[0] & 0x01; | 174 | dev->touch = pkt[0] & 0x01; |
| 172 | 175 | ||
| 173 | return 1; | 176 | return 1; |
| 174 | } | 177 | } |
| @@ -195,11 +198,11 @@ static int egalax_get_pkt_len(unsigned char *buf, int len) | |||
| 195 | * PanJit Part | 198 | * PanJit Part |
| 196 | */ | 199 | */ |
| 197 | #ifdef CONFIG_USB_TOUCHSCREEN_PANJIT | 200 | #ifdef CONFIG_USB_TOUCHSCREEN_PANJIT |
| 198 | static int panjit_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | 201 | static int panjit_read_data(struct usbtouch_usb *dev, unsigned char *pkt) |
| 199 | { | 202 | { |
| 200 | *x = ((pkt[2] & 0x0F) << 8) | pkt[1]; | 203 | dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1]; |
| 201 | *y = ((pkt[4] & 0x0F) << 8) | pkt[3]; | 204 | dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3]; |
| 202 | *touch = pkt[0] & 0x01; | 205 | dev->touch = pkt[0] & 0x01; |
| 203 | 206 | ||
| 204 | return 1; | 207 | return 1; |
| 205 | } | 208 | } |
| @@ -215,11 +218,11 @@ static int panjit_read_data(unsigned char *pkt, int *x, int *y, int *touch, int | |||
| 215 | #define MTOUCHUSB_RESET 7 | 218 | #define MTOUCHUSB_RESET 7 |
| 216 | #define MTOUCHUSB_REQ_CTRLLR_ID 10 | 219 | #define MTOUCHUSB_REQ_CTRLLR_ID 10 |
| 217 | 220 | ||
| 218 | static int mtouch_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | 221 | static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) |
| 219 | { | 222 | { |
| 220 | *x = (pkt[8] << 8) | pkt[7]; | 223 | dev->x = (pkt[8] << 8) | pkt[7]; |
| 221 | *y = (pkt[10] << 8) | pkt[9]; | 224 | dev->y = (pkt[10] << 8) | pkt[9]; |
| 222 | *touch = (pkt[2] & 0x40) ? 1 : 0; | 225 | dev->touch = (pkt[2] & 0x40) ? 1 : 0; |
| 223 | 226 | ||
| 224 | return 1; | 227 | return 1; |
| 225 | } | 228 | } |
| @@ -260,14 +263,32 @@ static int mtouch_init(struct usbtouch_usb *usbtouch) | |||
| 260 | * ITM Part | 263 | * ITM Part |
| 261 | */ | 264 | */ |
| 262 | #ifdef CONFIG_USB_TOUCHSCREEN_ITM | 265 | #ifdef CONFIG_USB_TOUCHSCREEN_ITM |
| 263 | static int itm_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | 266 | static int itm_read_data(struct usbtouch_usb *dev, unsigned char *pkt) |
| 264 | { | 267 | { |
| 265 | *x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F); | 268 | int touch; |
| 266 | *y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F); | 269 | /* |
| 267 | *press = ((pkt[2] & 0x01) << 7) | (pkt[5] & 0x7F); | 270 | * ITM devices report invalid x/y data if not touched. |
| 268 | *touch = ~pkt[7] & 0x20; | 271 | * if the screen was touched before but is not touched any more |
| 272 | * report touch as 0 with the last valid x/y data once. then stop | ||
| 273 | * reporting data until touched again. | ||
| 274 | */ | ||
| 275 | dev->press = ((pkt[2] & 0x01) << 7) | (pkt[5] & 0x7F); | ||
| 276 | |||
| 277 | touch = ~pkt[7] & 0x20; | ||
| 278 | if (!touch) { | ||
| 279 | if (dev->touch) { | ||
| 280 | dev->touch = 0; | ||
| 281 | return 1; | ||
| 282 | } | ||
| 269 | 283 | ||
| 270 | return *touch; | 284 | return 0; |
| 285 | } | ||
| 286 | |||
| 287 | dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F); | ||
| 288 | dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F); | ||
| 289 | dev->touch = touch; | ||
| 290 | |||
| 291 | return 1; | ||
| 271 | } | 292 | } |
| 272 | #endif | 293 | #endif |
| 273 | 294 | ||
| @@ -276,7 +297,7 @@ static int itm_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *pr | |||
| 276 | * eTurboTouch part | 297 | * eTurboTouch part |
| 277 | */ | 298 | */ |
| 278 | #ifdef CONFIG_USB_TOUCHSCREEN_ETURBO | 299 | #ifdef CONFIG_USB_TOUCHSCREEN_ETURBO |
| 279 | static int eturbo_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | 300 | static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt) |
| 280 | { | 301 | { |
| 281 | unsigned int shift; | 302 | unsigned int shift; |
| 282 | 303 | ||
| @@ -285,9 +306,9 @@ static int eturbo_read_data(unsigned char *pkt, int *x, int *y, int *touch, int | |||
| 285 | return 0; | 306 | return 0; |
| 286 | 307 | ||
| 287 | shift = (6 - (pkt[0] & 0x03)); | 308 | shift = (6 - (pkt[0] & 0x03)); |
| 288 | *x = ((pkt[3] << 7) | pkt[4]) >> shift; | 309 | dev->x = ((pkt[3] << 7) | pkt[4]) >> shift; |
| 289 | *y = ((pkt[1] << 7) | pkt[2]) >> shift; | 310 | dev->y = ((pkt[1] << 7) | pkt[2]) >> shift; |
| 290 | *touch = (pkt[0] & 0x10) ? 1 : 0; | 311 | dev->touch = (pkt[0] & 0x10) ? 1 : 0; |
| 291 | 312 | ||
| 292 | return 1; | 313 | return 1; |
| 293 | } | 314 | } |
| @@ -307,14 +328,14 @@ static int eturbo_get_pkt_len(unsigned char *buf, int len) | |||
| 307 | * Gunze part | 328 | * Gunze part |
| 308 | */ | 329 | */ |
| 309 | #ifdef CONFIG_USB_TOUCHSCREEN_GUNZE | 330 | #ifdef CONFIG_USB_TOUCHSCREEN_GUNZE |
| 310 | static int gunze_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | 331 | static int gunze_read_data(struct usbtouch_usb *dev, unsigned char *pkt) |
| 311 | { | 332 | { |
| 312 | if (!(pkt[0] & 0x80) || ((pkt[1] | pkt[2] | pkt[3]) & 0x80)) | 333 | if (!(pkt[0] & 0x80) || ((pkt[1] | pkt[2] | pkt[3]) & 0x80)) |
| 313 | return 0; | 334 | return 0; |
| 314 | 335 | ||
| 315 | *x = ((pkt[0] & 0x1F) << 7) | (pkt[2] & 0x7F); | 336 | dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[2] & 0x7F); |
| 316 | *y = ((pkt[1] & 0x1F) << 7) | (pkt[3] & 0x7F); | 337 | dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[3] & 0x7F); |
| 317 | *touch = pkt[0] & 0x20; | 338 | dev->touch = pkt[0] & 0x20; |
| 318 | 339 | ||
| 319 | return 1; | 340 | return 1; |
| 320 | } | 341 | } |
| @@ -383,11 +404,11 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch) | |||
| 383 | } | 404 | } |
| 384 | 405 | ||
| 385 | 406 | ||
| 386 | static int dmc_tsc10_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | 407 | static int dmc_tsc10_read_data(struct usbtouch_usb *dev, unsigned char *pkt) |
| 387 | { | 408 | { |
| 388 | *x = ((pkt[2] & 0x03) << 8) | pkt[1]; | 409 | dev->x = ((pkt[2] & 0x03) << 8) | pkt[1]; |
| 389 | *y = ((pkt[4] & 0x03) << 8) | pkt[3]; | 410 | dev->y = ((pkt[4] & 0x03) << 8) | pkt[3]; |
| 390 | *touch = pkt[0] & 0x01; | 411 | dev->touch = pkt[0] & 0x01; |
| 391 | 412 | ||
| 392 | return 1; | 413 | return 1; |
| 393 | } | 414 | } |
| @@ -492,23 +513,22 @@ static struct usbtouch_device_info usbtouch_dev_info[] = { | |||
| 492 | static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch, | 513 | static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch, |
| 493 | unsigned char *pkt, int len) | 514 | unsigned char *pkt, int len) |
| 494 | { | 515 | { |
| 495 | int x, y, touch, press; | ||
| 496 | struct usbtouch_device_info *type = usbtouch->type; | 516 | struct usbtouch_device_info *type = usbtouch->type; |
| 497 | 517 | ||
| 498 | if (!type->read_data(pkt, &x, &y, &touch, &press)) | 518 | if (!type->read_data(usbtouch, pkt)) |
| 499 | return; | 519 | return; |
| 500 | 520 | ||
| 501 | input_report_key(usbtouch->input, BTN_TOUCH, touch); | 521 | input_report_key(usbtouch->input, BTN_TOUCH, usbtouch->touch); |
| 502 | 522 | ||
| 503 | if (swap_xy) { | 523 | if (swap_xy) { |
| 504 | input_report_abs(usbtouch->input, ABS_X, y); | 524 | input_report_abs(usbtouch->input, ABS_X, usbtouch->y); |
| 505 | input_report_abs(usbtouch->input, ABS_Y, x); | 525 | input_report_abs(usbtouch->input, ABS_Y, usbtouch->x); |
| 506 | } else { | 526 | } else { |
| 507 | input_report_abs(usbtouch->input, ABS_X, x); | 527 | input_report_abs(usbtouch->input, ABS_X, usbtouch->x); |
| 508 | input_report_abs(usbtouch->input, ABS_Y, y); | 528 | input_report_abs(usbtouch->input, ABS_Y, usbtouch->y); |
| 509 | } | 529 | } |
| 510 | if (type->max_press) | 530 | if (type->max_press) |
| 511 | input_report_abs(usbtouch->input, ABS_PRESSURE, press); | 531 | input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press); |
| 512 | input_sync(usbtouch->input); | 532 | input_sync(usbtouch->input); |
| 513 | } | 533 | } |
| 514 | 534 | ||
diff --git a/drivers/usb/net/asix.c b/drivers/usb/net/asix.c index f538013965b0..896449f0cf85 100644 --- a/drivers/usb/net/asix.c +++ b/drivers/usb/net/asix.c | |||
| @@ -898,7 +898,7 @@ static int ax88772_link_reset(struct usbnet *dev) | |||
| 898 | 898 | ||
| 899 | static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) | 899 | static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) |
| 900 | { | 900 | { |
| 901 | int ret; | 901 | int ret, embd_phy; |
| 902 | void *buf; | 902 | void *buf; |
| 903 | u16 rx_ctl; | 903 | u16 rx_ctl; |
| 904 | struct asix_data *data = (struct asix_data *)&dev->data; | 904 | struct asix_data *data = (struct asix_data *)&dev->data; |
| @@ -919,13 +919,15 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 919 | AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5)) < 0) | 919 | AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5)) < 0) |
| 920 | goto out2; | 920 | goto out2; |
| 921 | 921 | ||
| 922 | /* 0x10 is the phy id of the embedded 10/100 ethernet phy */ | ||
| 923 | embd_phy = ((asix_get_phy_addr(dev) & 0x1f) == 0x10 ? 1 : 0); | ||
| 922 | if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, | 924 | if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, |
| 923 | 1, 0, 0, buf)) < 0) { | 925 | embd_phy, 0, 0, buf)) < 0) { |
| 924 | dbg("Select PHY #1 failed: %d", ret); | 926 | dbg("Select PHY #1 failed: %d", ret); |
| 925 | goto out2; | 927 | goto out2; |
| 926 | } | 928 | } |
| 927 | 929 | ||
| 928 | if ((ret = asix_sw_reset(dev, AX_SWRESET_IPPD)) < 0) | 930 | if ((ret = asix_sw_reset(dev, AX_SWRESET_IPPD | AX_SWRESET_PRL)) < 0) |
| 929 | goto out2; | 931 | goto out2; |
| 930 | 932 | ||
| 931 | msleep(150); | 933 | msleep(150); |
| @@ -933,8 +935,14 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 933 | goto out2; | 935 | goto out2; |
| 934 | 936 | ||
| 935 | msleep(150); | 937 | msleep(150); |
| 936 | if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL | AX_SWRESET_PRL)) < 0) | 938 | if (embd_phy) { |
| 937 | goto out2; | 939 | if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL)) < 0) |
| 940 | goto out2; | ||
| 941 | } | ||
| 942 | else { | ||
| 943 | if ((ret = asix_sw_reset(dev, AX_SWRESET_PRTE)) < 0) | ||
| 944 | goto out2; | ||
| 945 | } | ||
| 938 | 946 | ||
| 939 | msleep(150); | 947 | msleep(150); |
| 940 | rx_ctl = asix_read_rx_ctl(dev); | 948 | rx_ctl = asix_read_rx_ctl(dev); |
diff --git a/drivers/usb/net/rndis_host.c b/drivers/usb/net/rndis_host.c index ea5f44de3de2..a322a16d9cf8 100644 --- a/drivers/usb/net/rndis_host.c +++ b/drivers/usb/net/rndis_host.c | |||
| @@ -379,6 +379,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 379 | { | 379 | { |
| 380 | int retval; | 380 | int retval; |
| 381 | struct net_device *net = dev->net; | 381 | struct net_device *net = dev->net; |
| 382 | struct cdc_state *info = (void *) &dev->data; | ||
| 382 | union { | 383 | union { |
| 383 | void *buf; | 384 | void *buf; |
| 384 | struct rndis_msg_hdr *header; | 385 | struct rndis_msg_hdr *header; |
| @@ -397,7 +398,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 397 | return -ENOMEM; | 398 | return -ENOMEM; |
| 398 | retval = usbnet_generic_cdc_bind(dev, intf); | 399 | retval = usbnet_generic_cdc_bind(dev, intf); |
| 399 | if (retval < 0) | 400 | if (retval < 0) |
| 400 | goto done; | 401 | goto fail; |
| 401 | 402 | ||
| 402 | net->hard_header_len += sizeof (struct rndis_data_hdr); | 403 | net->hard_header_len += sizeof (struct rndis_data_hdr); |
| 403 | 404 | ||
| @@ -412,10 +413,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 412 | if (unlikely(retval < 0)) { | 413 | if (unlikely(retval < 0)) { |
| 413 | /* it might not even be an RNDIS device!! */ | 414 | /* it might not even be an RNDIS device!! */ |
| 414 | dev_err(&intf->dev, "RNDIS init failed, %d\n", retval); | 415 | dev_err(&intf->dev, "RNDIS init failed, %d\n", retval); |
| 415 | fail: | 416 | goto fail_and_release; |
| 416 | usb_driver_release_interface(driver_of(intf), | ||
| 417 | ((struct cdc_state *)&(dev->data))->data); | ||
| 418 | goto done; | ||
| 419 | } | 417 | } |
| 420 | dev->hard_mtu = le32_to_cpu(u.init_c->max_transfer_size); | 418 | dev->hard_mtu = le32_to_cpu(u.init_c->max_transfer_size); |
| 421 | /* REVISIT: peripheral "alignment" request is ignored ... */ | 419 | /* REVISIT: peripheral "alignment" request is ignored ... */ |
| @@ -431,7 +429,7 @@ fail: | |||
| 431 | retval = rndis_command(dev, u.header); | 429 | retval = rndis_command(dev, u.header); |
| 432 | if (unlikely(retval < 0)) { | 430 | if (unlikely(retval < 0)) { |
| 433 | dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval); | 431 | dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval); |
| 434 | goto fail; | 432 | goto fail_and_release; |
| 435 | } | 433 | } |
| 436 | tmp = le32_to_cpu(u.get_c->offset); | 434 | tmp = le32_to_cpu(u.get_c->offset); |
| 437 | if (unlikely((tmp + 8) > (1024 - ETH_ALEN) | 435 | if (unlikely((tmp + 8) > (1024 - ETH_ALEN) |
| @@ -439,7 +437,7 @@ fail: | |||
| 439 | dev_err(&intf->dev, "rndis ethaddr off %d len %d ?\n", | 437 | dev_err(&intf->dev, "rndis ethaddr off %d len %d ?\n", |
| 440 | tmp, le32_to_cpu(u.get_c->len)); | 438 | tmp, le32_to_cpu(u.get_c->len)); |
| 441 | retval = -EDOM; | 439 | retval = -EDOM; |
| 442 | goto fail; | 440 | goto fail_and_release; |
| 443 | } | 441 | } |
| 444 | memcpy(net->dev_addr, tmp + (char *)&u.get_c->request_id, ETH_ALEN); | 442 | memcpy(net->dev_addr, tmp + (char *)&u.get_c->request_id, ETH_ALEN); |
| 445 | 443 | ||
| @@ -455,11 +453,18 @@ fail: | |||
| 455 | retval = rndis_command(dev, u.header); | 453 | retval = rndis_command(dev, u.header); |
| 456 | if (unlikely(retval < 0)) { | 454 | if (unlikely(retval < 0)) { |
| 457 | dev_err(&intf->dev, "rndis set packet filter, %d\n", retval); | 455 | dev_err(&intf->dev, "rndis set packet filter, %d\n", retval); |
| 458 | goto fail; | 456 | goto fail_and_release; |
| 459 | } | 457 | } |
| 460 | 458 | ||
| 461 | retval = 0; | 459 | retval = 0; |
| 462 | done: | 460 | |
| 461 | kfree(u.buf); | ||
| 462 | return retval; | ||
| 463 | |||
| 464 | fail_and_release: | ||
| 465 | usb_set_intfdata(info->data, NULL); | ||
| 466 | usb_driver_release_interface(driver_of(intf), info->data); | ||
| 467 | fail: | ||
| 463 | kfree(u.buf); | 468 | kfree(u.buf); |
| 464 | return retval; | 469 | return retval; |
| 465 | } | 470 | } |
diff --git a/drivers/usb/serial/funsoft.c b/drivers/usb/serial/funsoft.c index 31501c9361b9..2bebd63d5ed1 100644 --- a/drivers/usb/serial/funsoft.c +++ b/drivers/usb/serial/funsoft.c | |||
| @@ -27,7 +27,7 @@ MODULE_DEVICE_TABLE(usb, id_table); | |||
| 27 | static int funsoft_ioctl(struct usb_serial_port *port, struct file *file, | 27 | static int funsoft_ioctl(struct usb_serial_port *port, struct file *file, |
| 28 | unsigned int cmd, unsigned long arg) | 28 | unsigned int cmd, unsigned long arg) |
| 29 | { | 29 | { |
| 30 | struct termios t; | 30 | struct ktermios t; |
| 31 | 31 | ||
| 32 | dbg("%s - port %d, cmd 0x%04x", __FUNCTION__, port->number, cmd); | 32 | dbg("%s - port %d, cmd 0x%04x", __FUNCTION__, port->number, cmd); |
| 33 | 33 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 5ca04e82ea19..0fed43a96871 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -78,6 +78,7 @@ static int option_send_setup(struct usb_serial_port *port); | |||
| 78 | #define OPTION_PRODUCT_FUSION2 0x6300 | 78 | #define OPTION_PRODUCT_FUSION2 0x6300 |
| 79 | #define OPTION_PRODUCT_COBRA 0x6500 | 79 | #define OPTION_PRODUCT_COBRA 0x6500 |
| 80 | #define OPTION_PRODUCT_COBRA2 0x6600 | 80 | #define OPTION_PRODUCT_COBRA2 0x6600 |
| 81 | #define OPTION_PRODUCT_GTMAX36 0x6701 | ||
| 81 | #define HUAWEI_PRODUCT_E600 0x1001 | 82 | #define HUAWEI_PRODUCT_E600 0x1001 |
| 82 | #define HUAWEI_PRODUCT_E220 0x1003 | 83 | #define HUAWEI_PRODUCT_E220 0x1003 |
| 83 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 | 84 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 |
| @@ -90,6 +91,7 @@ static struct usb_device_id option_ids[] = { | |||
| 90 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, | 91 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, |
| 91 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, | 92 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, |
| 92 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, | 93 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, |
| 94 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTMAX36) }, | ||
| 93 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 95 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
| 94 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) }, | 96 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) }, |
| 95 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 97 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
| @@ -104,6 +106,7 @@ static struct usb_device_id option_ids1[] = { | |||
| 104 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, | 106 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) }, |
| 105 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, | 107 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) }, |
| 106 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, | 108 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, |
| 109 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTMAX36) }, | ||
| 107 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 110 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
| 108 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) }, | 111 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) }, |
| 109 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 112 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index cddef3efba0a..b49f2a78189e 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -197,6 +197,13 @@ UNUSUAL_DEV( 0x0421, 0x047c, 0x0370, 0x0370, | |||
| 197 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 197 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 198 | US_FL_MAX_SECTORS_64 ), | 198 | US_FL_MAX_SECTORS_64 ), |
| 199 | 199 | ||
| 200 | /* Reported by Manuel Osdoba <manuel.osdoba@tu-ilmenau.de> */ | ||
| 201 | UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x0452, | ||
| 202 | "Nokia", | ||
| 203 | "Nokia 6233", | ||
| 204 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 205 | US_FL_MAX_SECTORS_64 ), | ||
| 206 | |||
| 200 | /* Reported by Alex Corcoles <alex@corcoles.net> */ | 207 | /* Reported by Alex Corcoles <alex@corcoles.net> */ |
| 201 | UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370, | 208 | UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370, |
| 202 | "Nokia", | 209 | "Nokia", |
| @@ -254,6 +261,18 @@ UNUSUAL_DEV( 0x045a, 0x5210, 0x0101, 0x0101, | |||
| 254 | US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0), | 261 | US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0), |
| 255 | #endif | 262 | #endif |
| 256 | 263 | ||
| 264 | /* | ||
| 265 | * This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.) | ||
| 266 | * Reported by Pete Zaitcev <zaitcev@redhat.com> | ||
| 267 | * This device chokes on both version of MODE SENSE which we have, so | ||
| 268 | * use_10_for_ms is not effective, and we use US_FL_NO_WP_DETECT. | ||
| 269 | */ | ||
| 270 | UNUSUAL_DEV( 0x046b, 0xff40, 0x0100, 0x0100, | ||
| 271 | "AMI", | ||
| 272 | "Virtual Floppy", | ||
| 273 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 274 | US_FL_NO_WP_DETECT), | ||
| 275 | |||
| 257 | /* Patch submitted by Philipp Friedrich <philipp@void.at> */ | 276 | /* Patch submitted by Philipp Friedrich <philipp@void.at> */ |
| 258 | UNUSUAL_DEV( 0x0482, 0x0100, 0x0100, 0x0100, | 277 | UNUSUAL_DEV( 0x0482, 0x0100, 0x0100, 0x0100, |
| 259 | "Kyocera", | 278 | "Kyocera", |
