aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/ftdi_sio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/ftdi_sio.c')
-rw-r--r--drivers/usb/serial/ftdi_sio.c87
1 files changed, 28 insertions, 59 deletions
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 8a3813be1b28..824ea5e7ec8b 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -87,7 +87,6 @@ struct ftdi_sio_quirk {
87}; 87};
88 88
89static int ftdi_jtag_probe(struct usb_serial *serial); 89static int ftdi_jtag_probe(struct usb_serial *serial);
90static int ftdi_mtxorb_hack_setup(struct usb_serial *serial);
91static int ftdi_NDI_device_setup(struct usb_serial *serial); 90static int ftdi_NDI_device_setup(struct usb_serial *serial);
92static int ftdi_stmclite_probe(struct usb_serial *serial); 91static int ftdi_stmclite_probe(struct usb_serial *serial);
93static int ftdi_8u2232c_probe(struct usb_serial *serial); 92static int ftdi_8u2232c_probe(struct usb_serial *serial);
@@ -98,10 +97,6 @@ static struct ftdi_sio_quirk ftdi_jtag_quirk = {
98 .probe = ftdi_jtag_probe, 97 .probe = ftdi_jtag_probe,
99}; 98};
100 99
101static struct ftdi_sio_quirk ftdi_mtxorb_hack_quirk = {
102 .probe = ftdi_mtxorb_hack_setup,
103};
104
105static struct ftdi_sio_quirk ftdi_NDI_device_quirk = { 100static struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
106 .probe = ftdi_NDI_device_setup, 101 .probe = ftdi_NDI_device_setup,
107}; 102};
@@ -151,6 +146,7 @@ static const struct usb_device_id id_table_combined[] = {
151 { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, 146 { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) },
152 { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, 147 { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) },
153 { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, 148 { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) },
149 { USB_DEVICE(FTDI_VID, FTDI_BM_ATOM_NANO_PID) },
154 { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) }, 150 { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) },
155 { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) }, 151 { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) },
156 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) }, 152 { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) },
@@ -256,14 +252,12 @@ static const struct usb_device_id id_table_combined[] = {
256 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) }, 252 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0124_PID) },
257 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) }, 253 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0125_PID) },
258 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) }, 254 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0126_PID) },
259 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID), 255 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0127_PID) },
260 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
261 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) }, 256 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0128_PID) },
262 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) }, 257 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0129_PID) },
263 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) }, 258 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012A_PID) },
264 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) }, 259 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012B_PID) },
265 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID), 260 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012C_PID) },
266 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
267 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) }, 261 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012D_PID) },
268 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) }, 262 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012E_PID) },
269 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) }, 263 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_012F_PID) },
@@ -302,18 +296,12 @@ static const struct usb_device_id id_table_combined[] = {
302 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) }, 296 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0150_PID) },
303 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) }, 297 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0151_PID) },
304 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) }, 298 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0152_PID) },
305 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID), 299 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0153_PID) },
306 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 300 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID) },
307 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0154_PID), 301 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID) },
308 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 302 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID) },
309 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0155_PID), 303 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID) },
310 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, 304 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID) },
311 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0156_PID),
312 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
313 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0157_PID),
314 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
315 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0158_PID),
316 .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk },
317 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) }, 305 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_0159_PID) },
318 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) }, 306 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015A_PID) },
319 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) }, 307 { USB_DEVICE(MTXORB_VID, MTXORB_FTDI_RANGE_015B_PID) },
@@ -673,6 +661,8 @@ static const struct usb_device_id id_table_combined[] = {
673 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) }, 661 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) },
674 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) }, 662 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) },
675 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) }, 663 { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) },
664 { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
665 { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
676 { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) }, 666 { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
677 { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, 667 { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
678 { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) }, 668 { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) },
@@ -945,6 +935,8 @@ static const struct usb_device_id id_table_combined[] = {
945 { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) }, 935 { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) },
946 { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) }, 936 { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) },
947 { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) }, 937 { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) },
938 /* ekey Devices */
939 { USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) },
948 /* Infineon Devices */ 940 /* Infineon Devices */
949 { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) }, 941 { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) },
950 { } /* Terminating entry */ 942 { } /* Terminating entry */
@@ -1559,45 +1551,40 @@ static void ftdi_determine_type(struct usb_serial_port *port)
1559} 1551}
1560 1552
1561 1553
1562/* Determine the maximum packet size for the device. This depends on the chip 1554/*
1563 * type and the USB host capabilities. The value should be obtained from the 1555 * Determine the maximum packet size for the device. This depends on the chip
1564 * device descriptor as the chip will use the appropriate values for the host.*/ 1556 * type and the USB host capabilities. The value should be obtained from the
1557 * device descriptor as the chip will use the appropriate values for the host.
1558 */
1565static void ftdi_set_max_packet_size(struct usb_serial_port *port) 1559static void ftdi_set_max_packet_size(struct usb_serial_port *port)
1566{ 1560{
1567 struct ftdi_private *priv = usb_get_serial_port_data(port); 1561 struct ftdi_private *priv = usb_get_serial_port_data(port);
1568 struct usb_serial *serial = port->serial; 1562 struct usb_interface *interface = port->serial->interface;
1569 struct usb_device *udev = serial->dev;
1570
1571 struct usb_interface *interface = serial->interface;
1572 struct usb_endpoint_descriptor *ep_desc; 1563 struct usb_endpoint_descriptor *ep_desc;
1573
1574 unsigned num_endpoints; 1564 unsigned num_endpoints;
1575 unsigned i; 1565 unsigned i;
1576 1566
1577 num_endpoints = interface->cur_altsetting->desc.bNumEndpoints; 1567 num_endpoints = interface->cur_altsetting->desc.bNumEndpoints;
1578 dev_info(&udev->dev, "Number of endpoints %d\n", num_endpoints);
1579
1580 if (!num_endpoints) 1568 if (!num_endpoints)
1581 return; 1569 return;
1582 1570
1583 /* NOTE: some customers have programmed FT232R/FT245R devices 1571 /*
1584 * with an endpoint size of 0 - not good. In this case, we 1572 * NOTE: Some customers have programmed FT232R/FT245R devices
1573 * with an endpoint size of 0 - not good. In this case, we
1585 * want to override the endpoint descriptor setting and use a 1574 * want to override the endpoint descriptor setting and use a
1586 * value of 64 for wMaxPacketSize */ 1575 * value of 64 for wMaxPacketSize.
1576 */
1587 for (i = 0; i < num_endpoints; i++) { 1577 for (i = 0; i < num_endpoints; i++) {
1588 dev_info(&udev->dev, "Endpoint %d MaxPacketSize %d\n", i+1,
1589 interface->cur_altsetting->endpoint[i].desc.wMaxPacketSize);
1590 ep_desc = &interface->cur_altsetting->endpoint[i].desc; 1578 ep_desc = &interface->cur_altsetting->endpoint[i].desc;
1591 if (ep_desc->wMaxPacketSize == 0) { 1579 if (!ep_desc->wMaxPacketSize) {
1592 ep_desc->wMaxPacketSize = cpu_to_le16(0x40); 1580 ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
1593 dev_info(&udev->dev, "Overriding wMaxPacketSize on endpoint %d\n", i); 1581 dev_warn(&port->dev, "Overriding wMaxPacketSize on endpoint %d\n",
1582 usb_endpoint_num(ep_desc));
1594 } 1583 }
1595 } 1584 }
1596 1585
1597 /* set max packet size based on descriptor */ 1586 /* Set max packet size based on last descriptor. */
1598 priv->max_packet_size = usb_endpoint_maxp(ep_desc); 1587 priv->max_packet_size = usb_endpoint_maxp(ep_desc);
1599
1600 dev_info(&udev->dev, "Setting MaxPacketSize %d\n", priv->max_packet_size);
1601} 1588}
1602 1589
1603 1590
@@ -1866,24 +1853,6 @@ static int ftdi_stmclite_probe(struct usb_serial *serial)
1866 return 0; 1853 return 0;
1867} 1854}
1868 1855
1869/*
1870 * The Matrix Orbital VK204-25-USB has an invalid IN endpoint.
1871 * We have to correct it if we want to read from it.
1872 */
1873static int ftdi_mtxorb_hack_setup(struct usb_serial *serial)
1874{
1875 struct usb_host_endpoint *ep = serial->dev->ep_in[1];
1876 struct usb_endpoint_descriptor *ep_desc = &ep->desc;
1877
1878 if (ep->enabled && ep_desc->wMaxPacketSize == 0) {
1879 ep_desc->wMaxPacketSize = cpu_to_le16(0x40);
1880 dev_info(&serial->dev->dev,
1881 "Fixing invalid wMaxPacketSize on read pipe\n");
1882 }
1883
1884 return 0;
1885}
1886
1887static int ftdi_sio_port_remove(struct usb_serial_port *port) 1856static int ftdi_sio_port_remove(struct usb_serial_port *port)
1888{ 1857{
1889 struct ftdi_private *priv = usb_get_serial_port_data(port); 1858 struct ftdi_private *priv = usb_get_serial_port_data(port);