aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/core')
-rw-r--r--drivers/usb/core/hcd.c10
-rw-r--r--drivers/usb/core/hub.c2
-rw-r--r--drivers/usb/core/message.c94
-rw-r--r--drivers/usb/core/otg_productlist.h114
4 files changed, 207 insertions, 13 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 9dd79769cad1..21fa337edb46 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1964,6 +1964,16 @@ reset:
return ret;
}
+void usb_hcd_fixup_endpoint(struct usb_device *udev,
+ struct usb_host_endpoint *ep, int interval)
+{
+ struct usb_hcd *hcd;
+
+ hcd = bus_to_hcd(udev->bus);
+ if (hcd->driver->fixup_endpoint)
+ hcd->driver->fixup_endpoint(hcd, udev, ep, interval);
+}
+
/* Disables the endpoint: synchronizes with the hcd to make sure all
* endpoint state is gone from hardware. usb_hcd_flush_endpoint() must
* have been called previously. Use for set_configuration, set_interface,
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 256fe8c86828..49107595caa8 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -5788,7 +5788,7 @@ static void port_event(struct usb_hub *hub, int port1)
port_dev->over_current_count++;
port_over_current_notify(port_dev);
- dev_dbg(&port_dev->dev, "over-current change #%u\n",
+ dev_notice(&port_dev->dev, "over-current change #%u\n",
port_dev->over_current_count);
usb_clear_port_feature(hdev, port1,
USB_PORT_FEAT_C_OVER_CURRENT);
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index d2b2787be409..94df7eadf330 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -1267,6 +1267,21 @@ static void remove_intf_ep_devs(struct usb_interface *intf)
intf->ep_devs_created = 0;
}
+void usb_fixup_endpoint(struct usb_device *dev, int epaddr, int interval)
+{
+ unsigned int epnum = epaddr & USB_ENDPOINT_NUMBER_MASK;
+ struct usb_host_endpoint *ep;
+
+ if (usb_endpoint_out(epaddr))
+ ep = dev->ep_out[epnum];
+ else
+ ep = dev->ep_in[epnum];
+
+ if (ep && usb_endpoint_xfer_int(&ep->desc))
+ usb_hcd_fixup_endpoint(dev, ep, interval);
+}
+EXPORT_SYMBOL_GPL(usb_fixup_endpoint);
+
/**
* usb_disable_endpoint -- Disable an endpoint by address
* @dev: the device whose endpoint is being disabled
@@ -2180,6 +2195,85 @@ free_interfaces:
if (cp->string == NULL &&
!(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
cp->string = usb_cache_string(dev, cp->desc.iConfiguration);
+/* Uncomment this define to enable the HS Electrical Test support */
+#define DWC_HS_ELECT_TST 1
+#ifdef DWC_HS_ELECT_TST
+ /* Here we implement the HS Electrical Test support. The
+ * tester uses a vendor ID of 0x1A0A to indicate we should
+ * run a special test sequence. The product ID tells us
+ * which sequence to run. We invoke the test sequence by
+ * sending a non-standard SetFeature command to our root
+ * hub port. Our dwc_otg_hcd_hub_control() routine will
+ * recognize the command and perform the desired test
+ * sequence.
+ */
+ if (dev->descriptor.idVendor == 0x1A0A) {
+ /* HSOTG Electrical Test */
+ dev_warn(&dev->dev, "VID from HSOTG Electrical Test Fixture\n");
+
+ if (dev->bus && dev->bus->root_hub) {
+ struct usb_device *hdev = dev->bus->root_hub;
+ dev_warn(&dev->dev, "Got PID 0x%x\n", dev->descriptor.idProduct);
+
+ switch (dev->descriptor.idProduct) {
+ case 0x0101: /* TEST_SE0_NAK */
+ dev_warn(&dev->dev, "TEST_SE0_NAK\n");
+ usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
+ USB_REQ_SET_FEATURE, USB_RT_PORT,
+ USB_PORT_FEAT_TEST, 0x300, NULL, 0, HZ);
+ break;
+
+ case 0x0102: /* TEST_J */
+ dev_warn(&dev->dev, "TEST_J\n");
+ usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
+ USB_REQ_SET_FEATURE, USB_RT_PORT,
+ USB_PORT_FEAT_TEST, 0x100, NULL, 0, HZ);
+ break;
+
+ case 0x0103: /* TEST_K */
+ dev_warn(&dev->dev, "TEST_K\n");
+ usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
+ USB_REQ_SET_FEATURE, USB_RT_PORT,
+ USB_PORT_FEAT_TEST, 0x200, NULL, 0, HZ);
+ break;
+
+ case 0x0104: /* TEST_PACKET */
+ dev_warn(&dev->dev, "TEST_PACKET\n");
+ usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
+ USB_REQ_SET_FEATURE, USB_RT_PORT,
+ USB_PORT_FEAT_TEST, 0x400, NULL, 0, HZ);
+ break;
+
+ case 0x0105: /* TEST_FORCE_ENABLE */
+ dev_warn(&dev->dev, "TEST_FORCE_ENABLE\n");
+ usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
+ USB_REQ_SET_FEATURE, USB_RT_PORT,
+ USB_PORT_FEAT_TEST, 0x500, NULL, 0, HZ);
+ break;
+
+ case 0x0106: /* HS_HOST_PORT_SUSPEND_RESUME */
+ dev_warn(&dev->dev, "HS_HOST_PORT_SUSPEND_RESUME\n");
+ usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
+ USB_REQ_SET_FEATURE, USB_RT_PORT,
+ USB_PORT_FEAT_TEST, 0x600, NULL, 0, 40 * HZ);
+ break;
+
+ case 0x0107: /* SINGLE_STEP_GET_DEVICE_DESCRIPTOR setup */
+ dev_warn(&dev->dev, "SINGLE_STEP_GET_DEVICE_DESCRIPTOR setup\n");
+ usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
+ USB_REQ_SET_FEATURE, USB_RT_PORT,
+ USB_PORT_FEAT_TEST, 0x700, NULL, 0, 40 * HZ);
+ break;
+
+ case 0x0108: /* SINGLE_STEP_GET_DEVICE_DESCRIPTOR execute */
+ dev_warn(&dev->dev, "SINGLE_STEP_GET_DEVICE_DESCRIPTOR execute\n");
+ usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
+ USB_REQ_SET_FEATURE, USB_RT_PORT,
+ USB_PORT_FEAT_TEST, 0x800, NULL, 0, 40 * HZ);
+ }
+ }
+ }
+#endif /* DWC_HS_ELECT_TST */
/* Now that the interfaces are installed, re-enable LPM. */
usb_unlocked_enable_lpm(dev);
diff --git a/drivers/usb/core/otg_productlist.h b/drivers/usb/core/otg_productlist.h
index db67df29fb2b..b16e528859a8 100644
--- a/drivers/usb/core/otg_productlist.h
+++ b/drivers/usb/core/otg_productlist.h
@@ -11,33 +11,82 @@
static struct usb_device_id productlist_table[] = {
/* hubs are optional in OTG, but very handy ... */
+#define CERT_WITHOUT_HUBS
+#if defined(CERT_WITHOUT_HUBS)
+{ USB_DEVICE( 0x0000, 0x0000 ), }, /* Root HUB Only*/
+#else
{ USB_DEVICE_INFO(USB_CLASS_HUB, 0, 0), },
{ USB_DEVICE_INFO(USB_CLASS_HUB, 0, 1), },
+{ USB_DEVICE_INFO(USB_CLASS_HUB, 0, 2), },
+#endif
#ifdef CONFIG_USB_PRINTER /* ignoring nonstatic linkage! */
/* FIXME actually, printers are NOT supposed to use device classes;
* they're supposed to use interface classes...
*/
-{ USB_DEVICE_INFO(7, 1, 1) },
-{ USB_DEVICE_INFO(7, 1, 2) },
-{ USB_DEVICE_INFO(7, 1, 3) },
+//{ USB_DEVICE_INFO(7, 1, 1) },
+//{ USB_DEVICE_INFO(7, 1, 2) },
+//{ USB_DEVICE_INFO(7, 1, 3) },
#endif
#ifdef CONFIG_USB_NET_CDCETHER
/* Linux-USB CDC Ethernet gadget */
-{ USB_DEVICE(0x0525, 0xa4a1), },
+//{ USB_DEVICE(0x0525, 0xa4a1), },
/* Linux-USB CDC Ethernet + RNDIS gadget */
-{ USB_DEVICE(0x0525, 0xa4a2), },
+//{ USB_DEVICE(0x0525, 0xa4a2), },
#endif
#if IS_ENABLED(CONFIG_USB_TEST)
/* gadget zero, for testing */
-{ USB_DEVICE(0x0525, 0xa4a0), },
+//{ USB_DEVICE(0x0525, 0xa4a0), },
#endif
+/* OPT Tester */
+{ USB_DEVICE( 0x1a0a, 0x0101 ), }, /* TEST_SE0_NAK */
+{ USB_DEVICE( 0x1a0a, 0x0102 ), }, /* Test_J */
+{ USB_DEVICE( 0x1a0a, 0x0103 ), }, /* Test_K */
+{ USB_DEVICE( 0x1a0a, 0x0104 ), }, /* Test_PACKET */
+{ USB_DEVICE( 0x1a0a, 0x0105 ), }, /* Test_FORCE_ENABLE */
+{ USB_DEVICE( 0x1a0a, 0x0106 ), }, /* HS_PORT_SUSPEND_RESUME */
+{ USB_DEVICE( 0x1a0a, 0x0107 ), }, /* SINGLE_STEP_GET_DESCRIPTOR setup */
+{ USB_DEVICE( 0x1a0a, 0x0108 ), }, /* SINGLE_STEP_GET_DESCRIPTOR execute */
+
+/* Sony cameras */
+{ USB_DEVICE_VER(0x054c,0x0010,0x0410, 0x0500), },
+
+/* Memory Devices */
+//{ USB_DEVICE( 0x0781, 0x5150 ), }, /* SanDisk */
+//{ USB_DEVICE( 0x05DC, 0x0080 ), }, /* Lexar */
+//{ USB_DEVICE( 0x4146, 0x9281 ), }, /* IOMEGA */
+//{ USB_DEVICE( 0x067b, 0x2507 ), }, /* Hammer 20GB External HD */
+{ USB_DEVICE( 0x0EA0, 0x2168 ), }, /* Ours Technology Inc. (BUFFALO ClipDrive)*/
+//{ USB_DEVICE( 0x0457, 0x0150 ), }, /* Silicon Integrated Systems Corp. */
+
+/* HP Printers */
+//{ USB_DEVICE( 0x03F0, 0x1102 ), }, /* HP Photosmart 245 */
+//{ USB_DEVICE( 0x03F0, 0x1302 ), }, /* HP Photosmart 370 Series */
+
+/* Speakers */
+//{ USB_DEVICE( 0x0499, 0x3002 ), }, /* YAMAHA YST-MS35D USB Speakers */
+//{ USB_DEVICE( 0x0672, 0x1041 ), }, /* Labtec USB Headset */
+
{ } /* Terminating entry */
};
+static inline void report_errors(struct usb_device *dev)
+{
+ /* OTG MESSAGE: report errors here, customize to match your product */
+ dev_info(&dev->dev, "device Vendor:%04x Product:%04x is not supported\n",
+ le16_to_cpu(dev->descriptor.idVendor),
+ le16_to_cpu(dev->descriptor.idProduct));
+ if (USB_CLASS_HUB == dev->descriptor.bDeviceClass){
+ dev_printk(KERN_CRIT, &dev->dev, "Unsupported Hub Topology\n");
+ } else {
+ dev_printk(KERN_CRIT, &dev->dev, "Attached Device is not Supported\n");
+ }
+}
+
+
static int is_targeted(struct usb_device *dev)
{
struct usb_device_id *id = productlist_table;
@@ -87,16 +136,57 @@ static int is_targeted(struct usb_device *dev)
continue;
return 1;
- }
+ /* NOTE: can't use usb_match_id() since interface caches
+ * aren't set up yet. this is cut/paste from that code.
+ */
+ for (id = productlist_table; id->match_flags; id++) {
+#ifdef DEBUG
+ dev_dbg(&dev->dev,
+ "ID: V:%04x P:%04x DC:%04x SC:%04x PR:%04x \n",
+ id->idVendor,
+ id->idProduct,
+ id->bDeviceClass,
+ id->bDeviceSubClass,
+ id->bDeviceProtocol);
+#endif
- /* add other match criteria here ... */
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
+ id->idVendor != le16_to_cpu(dev->descriptor.idVendor))
+ continue;
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
+ id->idProduct != le16_to_cpu(dev->descriptor.idProduct))
+ continue;
- /* OTG MESSAGE: report errors here, customize to match your product */
- dev_err(&dev->dev, "device v%04x p%04x is not supported\n",
- le16_to_cpu(dev->descriptor.idVendor),
- le16_to_cpu(dev->descriptor.idProduct));
+ /* No need to test id->bcdDevice_lo != 0, since 0 is never
+ greater than any unsigned number. */
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) &&
+ (id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice)))
+ continue;
+
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) &&
+ (id->bcdDevice_hi < le16_to_cpu(dev->descriptor.bcdDevice)))
+ continue;
+
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) &&
+ (id->bDeviceClass != dev->descriptor.bDeviceClass))
+ continue;
+
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) &&
+ (id->bDeviceSubClass != dev->descriptor.bDeviceSubClass))
+ continue;
+
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) &&
+ (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol))
+ continue;
+
+ return 1;
+ }
+ }
+
+ /* add other match criteria here ... */
+ report_errors(dev);
return 0;
}