diff options
Diffstat (limited to 'drivers/usb/serial/ftdi_sio.c')
-rw-r--r-- | drivers/usb/serial/ftdi_sio.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index fb0d537435eb..44ab12986805 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -33,7 +33,6 @@ | |||
33 | 33 | ||
34 | #include <linux/kernel.h> | 34 | #include <linux/kernel.h> |
35 | #include <linux/errno.h> | 35 | #include <linux/errno.h> |
36 | #include <linux/init.h> | ||
37 | #include <linux/slab.h> | 36 | #include <linux/slab.h> |
38 | #include <linux/tty.h> | 37 | #include <linux/tty.h> |
39 | #include <linux/tty_driver.h> | 38 | #include <linux/tty_driver.h> |
@@ -145,7 +144,7 @@ static struct ftdi_sio_quirk ftdi_8u2232c_quirk = { | |||
145 | * Device ID not listed? Test it using | 144 | * Device ID not listed? Test it using |
146 | * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report. | 145 | * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report. |
147 | */ | 146 | */ |
148 | static struct usb_device_id id_table_combined [] = { | 147 | static const struct usb_device_id id_table_combined[] = { |
149 | { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) }, | 148 | { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) }, |
150 | { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, | 149 | { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, |
151 | { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, | 150 | { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, |
@@ -153,6 +152,7 @@ static struct usb_device_id id_table_combined [] = { | |||
153 | { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, | 152 | { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, |
154 | { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, | 153 | { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, |
155 | { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) }, | 154 | { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) }, |
155 | { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) }, | ||
156 | { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) }, | 156 | { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) }, |
157 | { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) }, | 157 | { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_1_PID) }, |
158 | { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) }, | 158 | { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_2_PID) }, |
@@ -192,6 +192,8 @@ static struct usb_device_id id_table_combined [] = { | |||
192 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, | 192 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) }, |
193 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, | 193 | { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) }, |
194 | { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, | 194 | { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) }, |
195 | { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_LP101_PID) }, | ||
196 | { USB_DEVICE(FTDI_VID, FTDI_TAGSYS_P200X_PID) }, | ||
195 | { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) }, | 197 | { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) }, |
196 | { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) }, | 198 | { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) }, |
197 | { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) }, | 199 | { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) }, |
@@ -905,6 +907,8 @@ static struct usb_device_id id_table_combined [] = { | |||
905 | /* Crucible Devices */ | 907 | /* Crucible Devices */ |
906 | { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, | 908 | { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, |
907 | { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, | 909 | { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) }, |
910 | /* Cressi Devices */ | ||
911 | { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) }, | ||
908 | { } /* Terminating entry */ | 912 | { } /* Terminating entry */ |
909 | }; | 913 | }; |
910 | 914 | ||
@@ -1695,11 +1699,8 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) | |||
1695 | 1699 | ||
1696 | 1700 | ||
1697 | priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL); | 1701 | priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL); |
1698 | if (!priv) { | 1702 | if (!priv) |
1699 | dev_err(&port->dev, "%s- kmalloc(%Zd) failed.\n", __func__, | ||
1700 | sizeof(struct ftdi_private)); | ||
1701 | return -ENOMEM; | 1703 | return -ENOMEM; |
1702 | } | ||
1703 | 1704 | ||
1704 | mutex_init(&priv->cfg_lock); | 1705 | mutex_init(&priv->cfg_lock); |
1705 | 1706 | ||
@@ -2124,10 +2125,20 @@ static void ftdi_set_termios(struct tty_struct *tty, | |||
2124 | } | 2125 | } |
2125 | 2126 | ||
2126 | /* | 2127 | /* |
2127 | * All FTDI UART chips are limited to CS7/8. We won't pretend to | 2128 | * All FTDI UART chips are limited to CS7/8. We shouldn't pretend to |
2128 | * support CS5/6 and revert the CSIZE setting instead. | 2129 | * support CS5/6 and revert the CSIZE setting instead. |
2130 | * | ||
2131 | * CS5 however is used to control some smartcard readers which abuse | ||
2132 | * this limitation to switch modes. Original FTDI chips fall back to | ||
2133 | * eight data bits. | ||
2134 | * | ||
2135 | * TODO: Implement a quirk to only allow this with mentioned | ||
2136 | * readers. One I know of (Argolis Smartreader V1) | ||
2137 | * returns "USB smartcard server" as iInterface string. | ||
2138 | * The vendor didn't bother with a custom VID/PID of | ||
2139 | * course. | ||
2129 | */ | 2140 | */ |
2130 | if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) { | 2141 | if (C_CSIZE(tty) == CS6) { |
2131 | dev_warn(ddev, "requested CSIZE setting not supported\n"); | 2142 | dev_warn(ddev, "requested CSIZE setting not supported\n"); |
2132 | 2143 | ||
2133 | termios->c_cflag &= ~CSIZE; | 2144 | termios->c_cflag &= ~CSIZE; |
@@ -2174,6 +2185,9 @@ no_skip: | |||
2174 | urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE; | 2185 | urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE; |
2175 | } | 2186 | } |
2176 | switch (cflag & CSIZE) { | 2187 | switch (cflag & CSIZE) { |
2188 | case CS5: | ||
2189 | dev_dbg(ddev, "Setting CS5 quirk\n"); | ||
2190 | break; | ||
2177 | case CS7: | 2191 | case CS7: |
2178 | urb_value |= 7; | 2192 | urb_value |= 7; |
2179 | dev_dbg(ddev, "Setting CS7\n"); | 2193 | dev_dbg(ddev, "Setting CS7\n"); |
@@ -2383,8 +2397,6 @@ static int ftdi_ioctl(struct tty_struct *tty, | |||
2383 | { | 2397 | { |
2384 | struct usb_serial_port *port = tty->driver_data; | 2398 | struct usb_serial_port *port = tty->driver_data; |
2385 | 2399 | ||
2386 | dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd); | ||
2387 | |||
2388 | /* Based on code from acm.c and others */ | 2400 | /* Based on code from acm.c and others */ |
2389 | switch (cmd) { | 2401 | switch (cmd) { |
2390 | 2402 | ||
@@ -2401,11 +2413,7 @@ static int ftdi_ioctl(struct tty_struct *tty, | |||
2401 | default: | 2413 | default: |
2402 | break; | 2414 | break; |
2403 | } | 2415 | } |
2404 | /* This is not necessarily an error - turns out the higher layers | 2416 | |
2405 | * will do some ioctls themselves (see comment above) | ||
2406 | */ | ||
2407 | dev_dbg(&port->dev, "%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h\n", | ||
2408 | __func__, cmd); | ||
2409 | return -ENOIOCTLCMD; | 2417 | return -ENOIOCTLCMD; |
2410 | } | 2418 | } |
2411 | 2419 | ||