]> err.no Git - linux-2.6/blob - drivers/usb/serial/aircable.c
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[linux-2.6] / drivers / usb / serial / aircable.c
1 /*
2  * AIRcable USB Bluetooth Dongle Driver.
3  *
4  * Copyright (C) 2006 Manuel Francisco Naranjo (naranjo.manuel@gmail.com)
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 2 as published by the
7  * Free Software Foundation.
8  *
9  * The device works as an standard CDC device, it has 2 interfaces, the first
10  * one is for firmware access and the second is the serial one.
11  * The protocol is very simply, there are two posibilities reading or writing.
12  * When writting the first urb must have a Header that starts with 0x20 0x29 the
13  * next two bytes must say how much data will be sended.
14  * When reading the process is almost equal except that the header starts with
15  * 0x00 0x20.
16  *
17  * The device simply need some stuff to understand data comming from the usb
18  * buffer: The First and Second byte is used for a Header, the Third and Fourth
19  * tells the  device the amount of information the package holds.
20  * Packages are 60 bytes long Header Stuff.
21  * When writting to the device the first two bytes of the header are 0x20 0x29
22  * When reading the bytes are 0x00 0x20, or 0x00 0x10, there is an strange
23  * situation, when too much data arrives to the device because it sends the data
24  * but with out the header. I will use a simply hack to override this situation,
25  * if there is data coming that does not contain any header, then that is data
26  * that must go directly to the tty, as there is no documentation about if there
27  * is any other control code, I will simply check for the first
28  * one.
29  *
30  * The driver registers himself with the USB-serial core and the USB Core. I had
31  * to implement a probe function agains USB-serial, because other way, the
32  * driver was attaching himself to both interfaces. I have tryed with different
33  * configurations of usb_serial_driver with out exit, only the probe function
34  * could handle this correctly.
35  *
36  * I have taken some info from a Greg Kroah-Hartman article:
37  * http://www.linuxjournal.com/article/6573
38  * And from Linux Device Driver Kit CD, which is a great work, the authors taken
39  * the work to recompile lots of information an knowladge in drivers development
40  * and made it all avaible inside a cd.
41  * URL: http://kernel.org/pub/linux/kernel/people/gregkh/ddk/
42  *
43  */
44
45 #include <linux/tty.h>
46 #include <linux/tty_flip.h>
47 #include <linux/circ_buf.h>
48 #include <linux/usb.h>
49 #include <linux/usb/serial.h>
50
51 static int debug;
52
53 /* Vendor and Product ID */
54 #define AIRCABLE_VID            0x16CA
55 #define AIRCABLE_USB_PID        0x1502
56
57 /* write buffer size defines */
58 #define AIRCABLE_BUF_SIZE       2048
59
60 /* Protocol Stuff */
61 #define HCI_HEADER_LENGTH       0x4
62 #define TX_HEADER_0             0x20
63 #define TX_HEADER_1             0x29
64 #define RX_HEADER_0             0x00
65 #define RX_HEADER_1             0x20
66 #define MAX_HCI_FRAMESIZE       60
67 #define HCI_COMPLETE_FRAME      64
68
69 /* rx_flags */
70 #define THROTTLED               0x01
71 #define ACTUALLY_THROTTLED      0x02
72
73 /*
74  * Version Information
75  */
76 #define DRIVER_VERSION "v1.0b2"
77 #define DRIVER_AUTHOR "Naranjo, Manuel Francisco <naranjo.manuel@gmail.com>"
78 #define DRIVER_DESC "AIRcable USB Driver"
79
80 /* ID table that will be registered with USB core */
81 static struct usb_device_id id_table [] = {
82         { USB_DEVICE(AIRCABLE_VID, AIRCABLE_USB_PID) },
83         { },
84 };
85 MODULE_DEVICE_TABLE(usb, id_table);
86
87
88 /* Internal Structure */
89 struct aircable_private {
90         spinlock_t rx_lock;             /* spinlock for the receive lines */
91         struct circ_buf *tx_buf;        /* write buffer */
92         struct circ_buf *rx_buf;        /* read buffer */
93         int rx_flags;                   /* for throttilng */
94         struct work_struct rx_work;     /* work cue for the receiving line */
95 };
96
97 /* Private methods */
98
99 /* Circular Buffer Methods, code from ti_usb_3410_5052 used */
100 /*
101  * serial_buf_clear
102  *
103  * Clear out all data in the circular buffer.
104  */
105 static void serial_buf_clear(struct circ_buf *cb)
106 {
107         cb->head = cb->tail = 0;
108 }
109
110 /*
111  * serial_buf_alloc
112  *
113  * Allocate a circular buffer and all associated memory.
114  */
115 static struct circ_buf *serial_buf_alloc(void)
116 {
117         struct circ_buf *cb;
118         cb = kmalloc(sizeof(struct circ_buf), GFP_KERNEL);
119         if (cb == NULL)
120                 return NULL;
121         cb->buf = kmalloc(AIRCABLE_BUF_SIZE, GFP_KERNEL);
122         if (cb->buf == NULL) {
123                 kfree(cb);
124                 return NULL;
125         }
126         serial_buf_clear(cb);
127         return cb;
128 }
129
130 /*
131  * serial_buf_free
132  *
133  * Free the buffer and all associated memory.
134  */
135 static void serial_buf_free(struct circ_buf *cb)
136 {
137         kfree(cb->buf);
138         kfree(cb);
139 }
140
141 /*
142  * serial_buf_data_avail
143  *
144  * Return the number of bytes of data available in the circular
145  * buffer.
146  */
147 static int serial_buf_data_avail(struct circ_buf *cb)
148 {
149         return CIRC_CNT(cb->head,cb->tail,AIRCABLE_BUF_SIZE);
150 }
151
152 /*
153  * serial_buf_put
154  *
155  * Copy data data from a user buffer and put it into the circular buffer.
156  * Restrict to the amount of space available.
157  *
158  * Return the number of bytes copied.
159  */
160 static int serial_buf_put(struct circ_buf *cb, const char *buf, int count)
161 {
162         int c, ret = 0;
163         while (1) {
164                 c = CIRC_SPACE_TO_END(cb->head, cb->tail, AIRCABLE_BUF_SIZE);
165                 if (count < c)
166                         c = count;
167                 if (c <= 0)
168                         break;
169                 memcpy(cb->buf + cb->head, buf, c);
170                 cb->head = (cb->head + c) & (AIRCABLE_BUF_SIZE-1);
171                 buf += c;
172                 count -= c;
173                 ret= c;
174         }
175         return ret;
176 }
177
178 /*
179  * serial_buf_get
180  *
181  * Get data from the circular buffer and copy to the given buffer.
182  * Restrict to the amount of data available.
183  *
184  * Return the number of bytes copied.
185  */
186 static int serial_buf_get(struct circ_buf *cb, char *buf, int count)
187 {
188         int c, ret = 0;
189         while (1) {
190                 c = CIRC_CNT_TO_END(cb->head, cb->tail, AIRCABLE_BUF_SIZE);
191                 if (count < c)
192                         c = count;
193                 if (c <= 0)
194                         break;
195                 memcpy(buf, cb->buf + cb->tail, c);
196                 cb->tail = (cb->tail + c) & (AIRCABLE_BUF_SIZE-1);
197                 buf += c;
198                 count -= c;
199                 ret= c;
200         }
201         return ret;
202 }
203
204 /* End of circula buffer methods */
205
206 static void aircable_send(struct usb_serial_port *port)
207 {
208         int count, result;
209         struct aircable_private *priv = usb_get_serial_port_data(port);
210         unsigned char* buf;
211         dbg("%s - port %d", __FUNCTION__, port->number);
212         if (port->write_urb_busy)
213                 return;
214
215         count = min(serial_buf_data_avail(priv->tx_buf), MAX_HCI_FRAMESIZE);
216         if (count == 0)
217                 return;
218
219         buf = kzalloc(count + HCI_HEADER_LENGTH, GFP_ATOMIC);
220         if (!buf) {
221                 err("%s- kzalloc(%d) failed.", __FUNCTION__,
222                     count + HCI_HEADER_LENGTH);
223                 return;
224         }
225
226         buf[0] = TX_HEADER_0;
227         buf[1] = TX_HEADER_1;
228         buf[2] = (unsigned char)count;
229         buf[3] = (unsigned char)(count >> 8);
230         serial_buf_get(priv->tx_buf,buf + HCI_HEADER_LENGTH, MAX_HCI_FRAMESIZE);
231
232         memcpy(port->write_urb->transfer_buffer, buf,
233                count + HCI_HEADER_LENGTH);
234
235         kfree(buf);
236         port->write_urb_busy = 1;
237         usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
238                               count + HCI_HEADER_LENGTH,
239                               port->write_urb->transfer_buffer);
240         port->write_urb->transfer_buffer_length = count + HCI_HEADER_LENGTH;
241         port->write_urb->dev = port->serial->dev;
242         result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
243
244         if (result) {
245                 dev_err(&port->dev,
246                         "%s - failed submitting write urb, error %d\n",
247                         __FUNCTION__, result);
248                 port->write_urb_busy = 0;
249         }
250
251         schedule_work(&port->work);
252 }
253
254 static void aircable_read(void *params)
255 {
256         struct usb_serial_port *port = params;
257         struct aircable_private *priv = usb_get_serial_port_data(port);
258         struct tty_struct *tty;
259         unsigned char *data;
260         int count;
261         if (priv->rx_flags & THROTTLED){
262                 if (priv->rx_flags & ACTUALLY_THROTTLED)
263                         schedule_work(&priv->rx_work);
264                 return;
265         }
266
267         /* By now I will flush data to the tty in packages of no more than
268          * 64 bytes, to ensure I do not get throttled.
269          * Ask USB mailing list for better aproach.
270          */
271         tty = port->tty;
272
273         if (!tty) {
274                 schedule_work(&priv->rx_work);
275                 err("%s - No tty available", __FUNCTION__);
276                 return ;
277         }
278
279         count = min(64, serial_buf_data_avail(priv->rx_buf));
280
281         if (count <= 0)
282                 return; //We have finished sending everything.
283
284         tty_prepare_flip_string(tty, &data, count);
285         if (!data){
286                 err("%s- kzalloc(%d) failed.", __FUNCTION__, count);
287                 return;
288         }
289
290         serial_buf_get(priv->rx_buf, data, count);
291
292         tty_flip_buffer_push(tty);
293
294         if (serial_buf_data_avail(priv->rx_buf))
295                 schedule_work(&priv->rx_work);
296
297         return;
298 }
299 /* End of private methods */
300
301 static int aircable_probe(struct usb_serial *serial,
302                           const struct usb_device_id *id)
303 {
304         struct usb_host_interface *iface_desc = serial->interface->cur_altsetting;
305         struct usb_endpoint_descriptor *endpoint;
306         int num_bulk_out=0;
307         int i;
308
309         for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
310                 endpoint = &iface_desc->endpoint[i].desc;
311                 if (usb_endpoint_is_bulk_out(endpoint)) {
312                         dbg("found bulk out on endpoint %d", i);
313                         ++num_bulk_out;
314                 }
315         }
316
317         if (num_bulk_out == 0) {
318                 dbg("Invalid interface, discarding");
319                 return -ENODEV;
320         }
321
322         return 0;
323 }
324
325 static int aircable_attach (struct usb_serial *serial)
326 {
327         struct usb_serial_port *port = serial->port[0];
328         struct aircable_private *priv;
329
330         priv = kzalloc(sizeof(struct aircable_private), GFP_KERNEL);
331         if (!priv){
332                 err("%s- kmalloc(%Zd) failed.", __FUNCTION__,
333                         sizeof(struct aircable_private));
334                 return -ENOMEM;
335         }
336
337         /* Allocation of Circular Buffers */
338         priv->tx_buf = serial_buf_alloc();
339         if (priv->tx_buf == NULL) {
340                 kfree(priv);
341                 return -ENOMEM;
342         }
343
344         priv->rx_buf = serial_buf_alloc();
345         if (priv->rx_buf == NULL) {
346                 kfree(priv->tx_buf);
347                 kfree(priv);
348                 return -ENOMEM;
349         }
350
351         priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
352         INIT_WORK(&priv->rx_work, aircable_read, port);
353
354         usb_set_serial_port_data(serial->port[0], priv);
355
356         return 0;
357 }
358
359 static void aircable_shutdown(struct usb_serial *serial)
360 {
361
362         struct usb_serial_port *port = serial->port[0];
363         struct aircable_private *priv = usb_get_serial_port_data(port);
364
365         dbg("%s", __FUNCTION__);
366
367         if (priv) {
368                 serial_buf_free(priv->tx_buf);
369                 serial_buf_free(priv->rx_buf);
370                 usb_set_serial_port_data(port, NULL);
371                 kfree(priv);
372         }
373 }
374
375 static int aircable_write_room(struct usb_serial_port *port)
376 {
377         struct aircable_private *priv = usb_get_serial_port_data(port);
378         return serial_buf_data_avail(priv->tx_buf);
379 }
380
381 static int aircable_write(struct usb_serial_port *port,
382                           const unsigned char *source, int count)
383 {
384         struct aircable_private *priv = usb_get_serial_port_data(port);
385         int temp;
386
387         dbg("%s - port %d, %d bytes", __FUNCTION__, port->number, count);
388
389         usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, source);
390
391         if (!count){
392                 dbg("%s - write request of 0 bytes", __FUNCTION__);
393                 return count;
394         }
395
396         temp = serial_buf_put(priv->tx_buf, source, count);
397
398         aircable_send(port);
399
400         if (count > AIRCABLE_BUF_SIZE)
401                 count = AIRCABLE_BUF_SIZE;
402
403         return count;
404
405 }
406
407 static void aircable_write_bulk_callback(struct urb *urb)
408 {
409         struct usb_serial_port *port = urb->context;
410         int result;
411
412         dbg("%s - urb->status: %d", __FUNCTION__ , urb->status);
413
414         /* This has been taken from cypress_m8.c cypress_write_int_callback */
415         switch (urb->status) {
416                 case 0:
417                         /* success */
418                         break;
419                 case -ECONNRESET:
420                 case -ENOENT:
421                 case -ESHUTDOWN:
422                         /* this urb is terminated, clean up */
423                         dbg("%s - urb shutting down with status: %d",
424                             __FUNCTION__, urb->status);
425                         port->write_urb_busy = 0;
426                         return;
427                 default:
428                         /* error in the urb, so we have to resubmit it */
429                         dbg("%s - Overflow in write", __FUNCTION__);
430                         dbg("%s - nonzero write bulk status received: %d",
431                             __FUNCTION__, urb->status);
432                         port->write_urb->transfer_buffer_length = 1;
433                         port->write_urb->dev = port->serial->dev;
434                         result = usb_submit_urb(port->write_urb, GFP_KERNEL);
435                         if (result)
436                                 dev_err(&urb->dev->dev,
437                                         "%s - failed resubmitting write urb, error %d\n",
438                                         __FUNCTION__, result);
439                         else
440                                 return;
441         }
442
443         port->write_urb_busy = 0;
444
445         aircable_send(port);
446 }
447
448 static void aircable_read_bulk_callback(struct urb *urb)
449 {
450         struct usb_serial_port *port = urb->context;
451         struct aircable_private *priv = usb_get_serial_port_data(port);
452         struct tty_struct *tty;
453         unsigned long no_packages, remaining, package_length, i;
454         int result, shift = 0;
455         unsigned char *temp;
456
457         dbg("%s - port %d", __FUNCTION__, port->number);
458
459         if (urb->status) {
460                 dbg("%s - urb->status = %d", __FUNCTION__, urb->status);
461                 if (!port->open_count) {
462                         dbg("%s - port is closed, exiting.", __FUNCTION__);
463                         return;
464                 }
465                 if (urb->status == -EPROTO) {
466                         dbg("%s - caught -EPROTO, resubmitting the urb",
467                             __FUNCTION__);
468                         usb_fill_bulk_urb(port->read_urb, port->serial->dev,
469                                           usb_rcvbulkpipe(port->serial->dev,
470                                                           port->bulk_in_endpointAddress),
471                                           port->read_urb->transfer_buffer,
472                                           port->read_urb->transfer_buffer_length,
473                                           aircable_read_bulk_callback, port);
474
475                         result = usb_submit_urb(urb, GFP_ATOMIC);
476                         if (result)
477                                 dev_err(&urb->dev->dev,
478                                         "%s - failed resubmitting read urb, error %d\n",
479                                         __FUNCTION__, result);
480                         return;
481                 }
482                 dbg("%s - unable to handle the error, exiting.", __FUNCTION__);
483                 return;
484         }
485
486         usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
487                                 urb->actual_length,urb->transfer_buffer);
488
489         tty = port->tty;
490         if (tty && urb->actual_length) {
491                 if (urb->actual_length <= 2) {
492                         /* This is an incomplete package */
493                         serial_buf_put(priv->rx_buf, urb->transfer_buffer,
494                                        urb->actual_length);
495                 } else {
496                         temp = urb->transfer_buffer;
497                         if (temp[0] == RX_HEADER_0)
498                                 shift = HCI_HEADER_LENGTH;
499
500                         remaining = urb->actual_length;
501                         no_packages = urb->actual_length / (HCI_COMPLETE_FRAME);
502
503                         if (urb->actual_length % HCI_COMPLETE_FRAME != 0)
504                                 no_packages+=1;
505
506                         for (i = 0; i < no_packages ;i++) {
507                                 if (remaining > (HCI_COMPLETE_FRAME))
508                                         package_length = HCI_COMPLETE_FRAME;
509                                 else
510                                         package_length = remaining;
511                                 remaining -= package_length;
512
513                                 serial_buf_put(priv->rx_buf,
514                                         urb->transfer_buffer + shift +
515                                         (HCI_COMPLETE_FRAME) * (i),
516                                         package_length - shift);
517                         }
518                 }
519                 aircable_read(port);
520         }
521
522         /* Schedule the next read _if_ we are still open */
523         if (port->open_count) {
524                 usb_fill_bulk_urb(port->read_urb, port->serial->dev,
525                                   usb_rcvbulkpipe(port->serial->dev,
526                                                   port->bulk_in_endpointAddress),
527                                   port->read_urb->transfer_buffer,
528                                   port->read_urb->transfer_buffer_length,
529                                   aircable_read_bulk_callback, port);
530
531                 result = usb_submit_urb(urb, GFP_ATOMIC);
532                 if (result)
533                         dev_err(&urb->dev->dev,
534                                 "%s - failed resubmitting read urb, error %d\n",
535                                 __FUNCTION__, result);
536         }
537
538         return;
539 }
540
541 /* Based on ftdi_sio.c throttle */
542 static void aircable_throttle(struct usb_serial_port *port)
543 {
544         struct aircable_private *priv = usb_get_serial_port_data(port);
545         unsigned long flags;
546
547         dbg("%s - port %d", __FUNCTION__, port->number);
548
549         spin_lock_irqsave(&priv->rx_lock, flags);
550         priv->rx_flags |= THROTTLED;
551         spin_unlock_irqrestore(&priv->rx_lock, flags);
552 }
553
554 /* Based on ftdi_sio.c unthrottle */
555 static void aircable_unthrottle(struct usb_serial_port *port)
556 {
557         struct aircable_private *priv = usb_get_serial_port_data(port);
558         int actually_throttled;
559         unsigned long flags;
560
561         dbg("%s - port %d", __FUNCTION__, port->number);
562
563         spin_lock_irqsave(&priv->rx_lock, flags);
564         actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED;
565         priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
566         spin_unlock_irqrestore(&priv->rx_lock, flags);
567
568         if (actually_throttled)
569                 schedule_work(&priv->rx_work);
570 }
571
572 static struct usb_serial_driver aircable_device = {
573         .description =          "aircable",
574         .id_table =             id_table,
575         .num_ports =            1,
576         .attach =               aircable_attach,
577         .probe =                aircable_probe,
578         .shutdown =             aircable_shutdown,
579         .write =                aircable_write,
580         .write_room =           aircable_write_room,
581         .write_bulk_callback =  aircable_write_bulk_callback,
582         .read_bulk_callback =   aircable_read_bulk_callback,
583         .throttle =             aircable_throttle,
584         .unthrottle =           aircable_unthrottle,
585 };
586
587 static struct usb_driver aircable_driver = {
588         .name =         "aircable",
589         .probe =        usb_serial_probe,
590         .disconnect =   usb_serial_disconnect,
591         .id_table =     id_table,
592 };
593
594 static int __init aircable_init (void)
595 {
596         int retval;
597         retval = usb_serial_register(&aircable_device);
598         if (retval)
599                 goto failed_serial_register;
600         retval = usb_register(&aircable_driver);
601         if (retval)
602                 goto failed_usb_register;
603         return 0;
604
605 failed_serial_register:
606         usb_serial_deregister(&aircable_device);
607 failed_usb_register:
608         return retval;
609 }
610
611 static void __exit aircable_exit (void)
612 {
613         usb_deregister(&aircable_driver);
614         usb_serial_deregister(&aircable_device);
615 }
616
617 MODULE_AUTHOR(DRIVER_AUTHOR);
618 MODULE_DESCRIPTION(DRIVER_DESC);
619 MODULE_VERSION(DRIVER_VERSION);
620 MODULE_LICENSE("GPL");
621
622 module_init(aircable_init);
623 module_exit(aircable_exit);
624
625 module_param(debug, bool, S_IRUGO | S_IWUSR);
626 MODULE_PARM_DESC(debug, "Debug enabled or not");