USB: serial: metro-usb: Fix idProduct for Uni-Directional mode.
[cascardo/linux.git] / drivers / usb / serial / metro-usb.c
1 /*
2   Some of this code is credited to Linux USB open source files that are
3   distributed with Linux.
4
5   Copyright:    2007 Metrologic Instruments. All rights reserved.
6   Copyright:    2011 Azimut Ltd. <http://azimutrzn.ru/>
7 */
8
9 #include <linux/kernel.h>
10 #include <linux/init.h>
11 #include <linux/tty.h>
12 #include <linux/module.h>
13 #include <linux/usb.h>
14 #include <linux/errno.h>
15 #include <linux/slab.h>
16 #include <linux/tty_driver.h>
17 #include <linux/tty_flip.h>
18 #include <linux/moduleparam.h>
19 #include <linux/spinlock.h>
20 #include <linux/errno.h>
21 #include <linux/uaccess.h>
22 #include <linux/usb/serial.h>
23
24 /* Version Information */
25 #define DRIVER_VERSION "v1.2.0.0"
26 #define DRIVER_DESC "Metrologic Instruments Inc. - USB-POS driver"
27
28 /* Product information. */
29 #define FOCUS_VENDOR_ID                 0x0C2E
30 #define FOCUS_PRODUCT_ID_BI             0x0720
31 #define FOCUS_PRODUCT_ID_UNI            0x0700
32
33 #define METROUSB_SET_REQUEST_TYPE       0x40
34 #define METROUSB_SET_MODEM_CTRL_REQUEST 10
35 #define METROUSB_SET_BREAK_REQUEST      0x40
36 #define METROUSB_MCR_NONE               0x08    /* Deactivate DTR and RTS. */
37 #define METROUSB_MCR_RTS                0x0a    /* Activate RTS. */
38 #define METROUSB_MCR_DTR                0x09    /* Activate DTR. */
39 #define WDR_TIMEOUT                     5000    /* default urb timeout. */
40
41 /* Private data structure. */
42 struct metrousb_private {
43         spinlock_t lock;
44         int throttled;
45         unsigned long control_state;
46 };
47
48 /* Device table list. */
49 static struct usb_device_id id_table[] = {
50         { USB_DEVICE(FOCUS_VENDOR_ID, FOCUS_PRODUCT_ID_BI) },
51         { USB_DEVICE(FOCUS_VENDOR_ID, FOCUS_PRODUCT_ID_UNI) },
52         { }, /* Terminating entry. */
53 };
54 MODULE_DEVICE_TABLE(usb, id_table);
55
56 /* Input parameter constants. */
57 static bool debug;
58
59 static void metrousb_read_int_callback(struct urb *urb)
60 {
61         struct usb_serial_port *port = urb->context;
62         struct metrousb_private *metro_priv = usb_get_serial_port_data(port);
63         struct tty_struct *tty;
64         unsigned char *data = urb->transfer_buffer;
65         int throttled = 0;
66         int result = 0;
67         unsigned long flags = 0;
68
69         dev_dbg(&port->dev, "%s\n", __func__);
70
71         switch (urb->status) {
72         case 0:
73                 /* Success status, read from the port. */
74                 break;
75         case -ECONNRESET:
76         case -ENOENT:
77         case -ESHUTDOWN:
78                 /* urb has been terminated. */
79                 dev_dbg(&port->dev,
80                         "%s - urb shutting down, error code=%d\n",
81                         __func__, result);
82                 return;
83         default:
84                 dev_dbg(&port->dev,
85                         "%s - non-zero urb received, error code=%d\n",
86                         __func__, result);
87                 goto exit;
88         }
89
90
91         /* Set the data read from the usb port into the serial port buffer. */
92         tty = tty_port_tty_get(&port->port);
93         if (!tty) {
94                 dev_dbg(&port->dev, "%s - bad tty pointer - exiting\n",
95                         __func__);
96                 return;
97         }
98
99         if (tty && urb->actual_length) {
100                 /* Loop through the data copying each byte to the tty layer. */
101                 tty_insert_flip_string(tty, data, urb->actual_length);
102
103                 /* Force the data to the tty layer. */
104                 tty_flip_buffer_push(tty);
105         }
106         tty_kref_put(tty);
107
108         /* Set any port variables. */
109         spin_lock_irqsave(&metro_priv->lock, flags);
110         throttled = metro_priv->throttled;
111         spin_unlock_irqrestore(&metro_priv->lock, flags);
112
113         /* Continue trying to read if set. */
114         if (!throttled) {
115                 usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev,
116                                  usb_rcvintpipe(port->serial->dev, port->interrupt_in_endpointAddress),
117                                  port->interrupt_in_urb->transfer_buffer,
118                                  port->interrupt_in_urb->transfer_buffer_length,
119                                  metrousb_read_int_callback, port, 1);
120
121                 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
122
123                 if (result)
124                         dev_dbg(&port->dev,
125                                 "%s - failed submitting interrupt in urb, error code=%d\n",
126                                 __func__, result);
127         }
128         return;
129
130 exit:
131         /* Try to resubmit the urb. */
132         result = usb_submit_urb(urb, GFP_ATOMIC);
133         if (result)
134                 dev_dbg(&port->dev,
135                         "%s - failed submitting interrupt in urb, error code=%d\n",
136                         __func__, result);
137 }
138
139 static void metrousb_cleanup(struct usb_serial_port *port)
140 {
141         dev_dbg(&port->dev, "%s\n", __func__);
142
143         if (port->serial->dev) {
144                 /* Shutdown any interrupt in urbs. */
145                 if (port->interrupt_in_urb) {
146                         usb_unlink_urb(port->interrupt_in_urb);
147                         usb_kill_urb(port->interrupt_in_urb);
148                 }
149         }
150 }
151
152 static int metrousb_open(struct tty_struct *tty, struct usb_serial_port *port)
153 {
154         struct usb_serial *serial = port->serial;
155         struct metrousb_private *metro_priv = usb_get_serial_port_data(port);
156         unsigned long flags = 0;
157         int result = 0;
158
159         dev_dbg(&port->dev, "%s\n", __func__);
160
161         /* Make sure the urb is initialized. */
162         if (!port->interrupt_in_urb) {
163                 dev_dbg(&port->dev, "%s - interrupt urb not initialized\n",
164                         __func__);
165                 return -ENODEV;
166         }
167
168         /* Set the private data information for the port. */
169         spin_lock_irqsave(&metro_priv->lock, flags);
170         metro_priv->control_state = 0;
171         metro_priv->throttled = 0;
172         spin_unlock_irqrestore(&metro_priv->lock, flags);
173
174         /*
175          * Force low_latency on so that our tty_push actually forces the data
176          * through, otherwise it is scheduled, and with high data rates (like
177          * with OHCI) data can get lost.
178          */
179         if (tty)
180                 tty->low_latency = 1;
181
182         /* Clear the urb pipe. */
183         usb_clear_halt(serial->dev, port->interrupt_in_urb->pipe);
184
185         /* Start reading from the device */
186         usb_fill_int_urb(port->interrupt_in_urb, serial->dev,
187                           usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress),
188                            port->interrupt_in_urb->transfer_buffer,
189                            port->interrupt_in_urb->transfer_buffer_length,
190                            metrousb_read_int_callback, port, 1);
191         result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
192
193         if (result) {
194                 dev_dbg(&port->dev,
195                         "%s - failed submitting interrupt in urb, error code=%d\n",
196                         __func__, result);
197                 goto exit;
198         }
199
200         dev_dbg(&port->dev, "%s - port open\n", __func__);
201 exit:
202         return result;
203 }
204
205 static int metrousb_set_modem_ctrl(struct usb_serial *serial, unsigned int control_state)
206 {
207         int retval = 0;
208         unsigned char mcr = METROUSB_MCR_NONE;
209
210         dev_dbg(&serial->dev->dev, "%s - control state = %d\n",
211                 __func__, control_state);
212
213         /* Set the modem control value. */
214         if (control_state & TIOCM_DTR)
215                 mcr |= METROUSB_MCR_DTR;
216         if (control_state & TIOCM_RTS)
217                 mcr |= METROUSB_MCR_RTS;
218
219         /* Send the command to the usb port. */
220         retval = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
221                                 METROUSB_SET_REQUEST_TYPE, METROUSB_SET_MODEM_CTRL_REQUEST,
222                                 control_state, 0, NULL, 0, WDR_TIMEOUT);
223         if (retval < 0)
224                 dev_dbg(&serial->dev->dev,
225                         "%s - set modem ctrl=0x%x failed, error code=%d\n",
226                         __func__, mcr, retval);
227
228         return retval;
229 }
230
231 static void metrousb_shutdown(struct usb_serial *serial)
232 {
233         int i = 0;
234
235         dev_dbg(&serial->dev->dev, "%s\n", __func__);
236
237         /* Stop reading and writing on all ports. */
238         for (i = 0; i < serial->num_ports; ++i) {
239                 /* Close any open urbs. */
240                 metrousb_cleanup(serial->port[i]);
241
242                 /* Free memory. */
243                 kfree(usb_get_serial_port_data(serial->port[i]));
244                 usb_set_serial_port_data(serial->port[i], NULL);
245
246                 dev_dbg(&serial->dev->dev, "%s - freed port number=%d\n",
247                         __func__, serial->port[i]->number);
248         }
249 }
250
251 static int metrousb_startup(struct usb_serial *serial)
252 {
253         struct metrousb_private *metro_priv;
254         struct usb_serial_port *port;
255         int i = 0;
256
257         dev_dbg(&serial->dev->dev, "%s\n", __func__);
258
259         /* Loop through the serial ports setting up the private structures.
260          * Currently we only use one port. */
261         for (i = 0; i < serial->num_ports; ++i) {
262                 port = serial->port[i];
263
264                 /* Declare memory. */
265                 metro_priv = kzalloc(sizeof(struct metrousb_private), GFP_KERNEL);
266                 if (!metro_priv)
267                         return -ENOMEM;
268
269                 /* Initialize memory. */
270                 spin_lock_init(&metro_priv->lock);
271                 usb_set_serial_port_data(port, metro_priv);
272
273                 dev_dbg(&serial->dev->dev, "%s - port number=%d\n ",
274                         __func__, port->number);
275         }
276
277         return 0;
278 }
279
280 static void metrousb_throttle(struct tty_struct *tty)
281 {
282         struct usb_serial_port *port = tty->driver_data;
283         struct metrousb_private *metro_priv = usb_get_serial_port_data(port);
284         unsigned long flags = 0;
285
286         dev_dbg(tty->dev, "%s\n", __func__);
287
288         /* Set the private information for the port to stop reading data. */
289         spin_lock_irqsave(&metro_priv->lock, flags);
290         metro_priv->throttled = 1;
291         spin_unlock_irqrestore(&metro_priv->lock, flags);
292 }
293
294 static int metrousb_tiocmget(struct tty_struct *tty)
295 {
296         unsigned long control_state = 0;
297         struct usb_serial_port *port = tty->driver_data;
298         struct metrousb_private *metro_priv = usb_get_serial_port_data(port);
299         unsigned long flags = 0;
300
301         dev_dbg(tty->dev, "%s\n", __func__);
302
303         spin_lock_irqsave(&metro_priv->lock, flags);
304         control_state = metro_priv->control_state;
305         spin_unlock_irqrestore(&metro_priv->lock, flags);
306
307         return control_state;
308 }
309
310 static int metrousb_tiocmset(struct tty_struct *tty,
311                              unsigned int set, unsigned int clear)
312 {
313         struct usb_serial_port *port = tty->driver_data;
314         struct usb_serial *serial = port->serial;
315         struct metrousb_private *metro_priv = usb_get_serial_port_data(port);
316         unsigned long flags = 0;
317         unsigned long control_state = 0;
318
319         dev_dbg(tty->dev, "%s - set=%d, clear=%d\n", __func__, set, clear);
320
321         spin_lock_irqsave(&metro_priv->lock, flags);
322         control_state = metro_priv->control_state;
323
324         /* Set the RTS and DTR values. */
325         if (set & TIOCM_RTS)
326                 control_state |= TIOCM_RTS;
327         if (set & TIOCM_DTR)
328                 control_state |= TIOCM_DTR;
329         if (clear & TIOCM_RTS)
330                 control_state &= ~TIOCM_RTS;
331         if (clear & TIOCM_DTR)
332                 control_state &= ~TIOCM_DTR;
333
334         metro_priv->control_state = control_state;
335         spin_unlock_irqrestore(&metro_priv->lock, flags);
336         return metrousb_set_modem_ctrl(serial, control_state);
337 }
338
339 static void metrousb_unthrottle(struct tty_struct *tty)
340 {
341         struct usb_serial_port *port = tty->driver_data;
342         struct metrousb_private *metro_priv = usb_get_serial_port_data(port);
343         unsigned long flags = 0;
344         int result = 0;
345
346         dev_dbg(tty->dev, "%s\n", __func__);
347
348         /* Set the private information for the port to resume reading data. */
349         spin_lock_irqsave(&metro_priv->lock, flags);
350         metro_priv->throttled = 0;
351         spin_unlock_irqrestore(&metro_priv->lock, flags);
352
353         /* Submit the urb to read from the port. */
354         port->interrupt_in_urb->dev = port->serial->dev;
355         result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
356         if (result)
357                 dev_dbg(tty->dev,
358                         "failed submitting interrupt in urb error code=%d\n",
359                         result);
360 }
361
362 static struct usb_driver metrousb_driver = {
363         .name =         "metro-usb",
364         .probe =        usb_serial_probe,
365         .disconnect =   usb_serial_disconnect,
366         .id_table =     id_table
367 };
368
369 static struct usb_serial_driver metrousb_device = {
370         .driver = {
371                 .owner =        THIS_MODULE,
372                 .name =         "metro-usb",
373         },
374         .description            = "Metrologic USB to serial converter.",
375         .id_table               = id_table,
376         .num_ports              = 1,
377         .open                   = metrousb_open,
378         .close                  = metrousb_cleanup,
379         .read_int_callback      = metrousb_read_int_callback,
380         .attach                 = metrousb_startup,
381         .release                = metrousb_shutdown,
382         .throttle               = metrousb_throttle,
383         .unthrottle             = metrousb_unthrottle,
384         .tiocmget               = metrousb_tiocmget,
385         .tiocmset               = metrousb_tiocmset,
386 };
387
388 static struct usb_serial_driver * const serial_drivers[] = {
389         &metrousb_device,
390         NULL,
391 };
392
393 module_usb_serial_driver(metrousb_driver, serial_drivers);
394
395 MODULE_LICENSE("GPL");
396 MODULE_AUTHOR("Philip Nicastro");
397 MODULE_AUTHOR("Aleksey Babahin <tamerlan311@gmail.com>");
398 MODULE_DESCRIPTION(DRIVER_DESC);
399
400 /* Module input parameters */
401 module_param(debug, bool, S_IRUGO | S_IWUSR);
402 MODULE_PARM_DESC(debug, "Print debug info (bool 1=on, 0=off)");