[PATCH] getting rid of all casts of k[cmz]alloc() calls
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / usb / misc / auerswald.c
1 /*****************************************************************************/
2 /*
3 * auerswald.c -- Auerswald PBX/System Telephone usb driver.
4 *
5 * Copyright (C) 2001 Wolfgang Mües (wolfgang@iksw-muees.de)
6 *
7 * Very much code of this driver is borrowed from dabusb.c (Deti Fliegl)
8 * and from the USB Skeleton driver (Greg Kroah-Hartman). Thank you.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */
24 /*****************************************************************************/
25
26 /* Standard Linux module include files */
27 #include <asm/uaccess.h>
28 #include <asm/byteorder.h>
29 #include <linux/slab.h>
30 #include <linux/module.h>
31 #include <linux/init.h>
32 #include <linux/wait.h>
33 #include <linux/usb.h>
34
35 /*-------------------------------------------------------------------*/
36 /* Debug support */
37 #ifdef DEBUG
38 #define dump( adr, len) \
39 do { \
40 unsigned int u; \
41 printk (KERN_DEBUG); \
42 for (u = 0; u < len; u++) \
43 printk (" %02X", adr[u] & 0xFF); \
44 printk ("\n"); \
45 } while (0)
46 #else
47 #define dump( adr, len)
48 #endif
49
50 /*-------------------------------------------------------------------*/
51 /* Version Information */
52 #define DRIVER_VERSION "0.9.11"
53 #define DRIVER_AUTHOR "Wolfgang Mües <wolfgang@iksw-muees.de>"
54 #define DRIVER_DESC "Auerswald PBX/System Telephone usb driver"
55
56 /*-------------------------------------------------------------------*/
57 /* Private declarations for Auerswald USB driver */
58
59 /* Auerswald Vendor ID */
60 #define ID_AUERSWALD 0x09BF
61
62 #define AUER_MINOR_BASE 112 /* auerswald driver minor number */
63
64 /* we can have up to this number of device plugged in at once */
65 #define AUER_MAX_DEVICES 16
66
67
68 /* Number of read buffers for each device */
69 #define AU_RBUFFERS 10
70
71 /* Number of chain elements for each control chain */
72 #define AUCH_ELEMENTS 20
73
74 /* Number of retries in communication */
75 #define AU_RETRIES 10
76
77 /*-------------------------------------------------------------------*/
78 /* vendor specific protocol */
79 /* Header Byte */
80 #define AUH_INDIRMASK 0x80 /* mask for direct/indirect bit */
81 #define AUH_DIRECT 0x00 /* data is for USB device */
82 #define AUH_INDIRECT 0x80 /* USB device is relay */
83
84 #define AUH_SPLITMASK 0x40 /* mask for split bit */
85 #define AUH_UNSPLIT 0x00 /* data block is full-size */
86 #define AUH_SPLIT 0x40 /* data block is part of a larger one,
87 split-byte follows */
88
89 #define AUH_TYPEMASK 0x3F /* mask for type of data transfer */
90 #define AUH_TYPESIZE 0x40 /* different types */
91 #define AUH_DCHANNEL 0x00 /* D channel data */
92 #define AUH_B1CHANNEL 0x01 /* B1 channel transparent */
93 #define AUH_B2CHANNEL 0x02 /* B2 channel transparent */
94 /* 0x03..0x0F reserved for driver internal use */
95 #define AUH_COMMAND 0x10 /* Command channel */
96 #define AUH_BPROT 0x11 /* Configuration block protocol */
97 #define AUH_DPROTANA 0x12 /* D channel protocol analyzer */
98 #define AUH_TAPI 0x13 /* telephone api data (ATD) */
99 /* 0x14..0x3F reserved for other protocols */
100 #define AUH_UNASSIGNED 0xFF /* if char device has no assigned service */
101 #define AUH_FIRSTUSERCH 0x11 /* first channel which is available for driver users */
102
103 #define AUH_SIZE 1 /* Size of Header Byte */
104
105 /* Split Byte. Only present if split bit in header byte set.*/
106 #define AUS_STARTMASK 0x80 /* mask for first block of splitted frame */
107 #define AUS_FIRST 0x80 /* first block */
108 #define AUS_FOLLOW 0x00 /* following block */
109
110 #define AUS_ENDMASK 0x40 /* mask for last block of splitted frame */
111 #define AUS_END 0x40 /* last block */
112 #define AUS_NOEND 0x00 /* not the last block */
113
114 #define AUS_LENMASK 0x3F /* mask for block length information */
115
116 /* Request types */
117 #define AUT_RREQ (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER) /* Read Request */
118 #define AUT_WREQ (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER) /* Write Request */
119
120 /* Vendor Requests */
121 #define AUV_GETINFO 0x00 /* GetDeviceInfo */
122 #define AUV_WBLOCK 0x01 /* Write Block */
123 #define AUV_RBLOCK 0x02 /* Read Block */
124 #define AUV_CHANNELCTL 0x03 /* Channel Control */
125 #define AUV_DUMMY 0x04 /* Dummy Out for retry */
126
127 /* Device Info Types */
128 #define AUDI_NUMBCH 0x0000 /* Number of supported B channels */
129 #define AUDI_OUTFSIZE 0x0001 /* Size of OUT B channel fifos */
130 #define AUDI_MBCTRANS 0x0002 /* max. Blocklength of control transfer */
131
132 /* Interrupt endpoint definitions */
133 #define AU_IRQENDP 1 /* Endpoint number */
134 #define AU_IRQCMDID 16 /* Command-block ID */
135 #define AU_BLOCKRDY 0 /* Command: Block data ready on ctl endpoint */
136 #define AU_IRQMINSIZE 5 /* Nr. of bytes decoded in this driver */
137
138 /* Device String Descriptors */
139 #define AUSI_VENDOR 1 /* "Auerswald GmbH & Co. KG" */
140 #define AUSI_DEVICE 2 /* Name of the Device */
141 #define AUSI_SERIALNR 3 /* Serial Number */
142 #define AUSI_MSN 4 /* "MSN ..." (first) Multiple Subscriber Number */
143
144 #define AUSI_DLEN 100 /* Max. Length of Device Description */
145
146 #define AUV_RETRY 0x101 /* First Firmware version which can do control retries */
147
148 /*-------------------------------------------------------------------*/
149 /* External data structures / Interface */
150 typedef struct
151 {
152 char __user *buf; /* return buffer for string contents */
153 unsigned int bsize; /* size of return buffer */
154 } audevinfo_t,*paudevinfo_t;
155
156 /* IO controls */
157 #define IOCTL_AU_SLEN _IOR( 'U', 0xF0, int) /* return the max. string descriptor length */
158 #define IOCTL_AU_DEVINFO _IOWR('U', 0xF1, audevinfo_t) /* get name of a specific device */
159 #define IOCTL_AU_SERVREQ _IOW( 'U', 0xF2, int) /* request a service channel */
160 #define IOCTL_AU_BUFLEN _IOR( 'U', 0xF3, int) /* return the max. buffer length for the device */
161 #define IOCTL_AU_RXAVAIL _IOR( 'U', 0xF4, int) /* return != 0 if Receive Data available */
162 #define IOCTL_AU_CONNECT _IOR( 'U', 0xF5, int) /* return != 0 if connected to a service channel */
163 #define IOCTL_AU_TXREADY _IOR( 'U', 0xF6, int) /* return != 0 if Transmitt channel ready to send */
164 /* 'U' 0xF7..0xFF reseved */
165
166 /*-------------------------------------------------------------------*/
167 /* Internal data structures */
168
169 /* ..................................................................*/
170 /* urb chain element */
171 struct auerchain; /* forward for circular reference */
172 typedef struct
173 {
174 struct auerchain *chain; /* pointer to the chain to which this element belongs */
175 struct urb * urbp; /* pointer to attached urb */
176 void *context; /* saved URB context */
177 usb_complete_t complete; /* saved URB completion function */
178 struct list_head list; /* to include element into a list */
179 } auerchainelement_t,*pauerchainelement_t;
180
181 /* urb chain */
182 typedef struct auerchain
183 {
184 pauerchainelement_t active; /* element which is submitted to urb */
185 spinlock_t lock; /* protection agains interrupts */
186 struct list_head waiting_list; /* list of waiting elements */
187 struct list_head free_list; /* list of available elements */
188 } auerchain_t,*pauerchain_t;
189
190 /* urb blocking completion helper struct */
191 typedef struct
192 {
193 wait_queue_head_t wqh; /* wait for completion */
194 unsigned int done; /* completion flag */
195 } auerchain_chs_t,*pauerchain_chs_t;
196
197 /* ...................................................................*/
198 /* buffer element */
199 struct auerbufctl; /* forward */
200 typedef struct
201 {
202 char *bufp; /* reference to allocated data buffer */
203 unsigned int len; /* number of characters in data buffer */
204 unsigned int retries; /* for urb retries */
205 struct usb_ctrlrequest *dr; /* for setup data in control messages */
206 struct urb * urbp; /* USB urb */
207 struct auerbufctl *list; /* pointer to list */
208 struct list_head buff_list; /* reference to next buffer in list */
209 } auerbuf_t,*pauerbuf_t;
210
211 /* buffer list control block */
212 typedef struct auerbufctl
213 {
214 spinlock_t lock; /* protection in interrupt */
215 struct list_head free_buff_list;/* free buffers */
216 struct list_head rec_buff_list; /* buffers with receive data */
217 } auerbufctl_t,*pauerbufctl_t;
218
219 /* ...................................................................*/
220 /* service context */
221 struct auerscon; /* forward */
222 typedef void (*auer_dispatch_t)(struct auerscon*, pauerbuf_t);
223 typedef void (*auer_disconn_t) (struct auerscon*);
224 typedef struct auerscon
225 {
226 unsigned int id; /* protocol service id AUH_xxxx */
227 auer_dispatch_t dispatch; /* dispatch read buffer */
228 auer_disconn_t disconnect; /* disconnect from device, wake up all char readers */
229 } auerscon_t,*pauerscon_t;
230
231 /* ...................................................................*/
232 /* USB device context */
233 typedef struct
234 {
235 struct semaphore mutex; /* protection in user context */
236 char name[20]; /* name of the /dev/usb entry */
237 unsigned int dtindex; /* index in the device table */
238 struct usb_device * usbdev; /* USB device handle */
239 int open_count; /* count the number of open character channels */
240 char dev_desc[AUSI_DLEN];/* for storing a textual description */
241 unsigned int maxControlLength; /* max. Length of control paket (without header) */
242 struct urb * inturbp; /* interrupt urb */
243 char * intbufp; /* data buffer for interrupt urb */
244 unsigned int irqsize; /* size of interrupt endpoint 1 */
245 struct auerchain controlchain; /* for chaining of control messages */
246 auerbufctl_t bufctl; /* Buffer control for control transfers */
247 pauerscon_t services[AUH_TYPESIZE];/* context pointers for each service */
248 unsigned int version; /* Version of the device */
249 wait_queue_head_t bufferwait; /* wait for a control buffer */
250 } auerswald_t,*pauerswald_t;
251
252 /* ................................................................... */
253 /* character device context */
254 typedef struct
255 {
256 struct semaphore mutex; /* protection in user context */
257 pauerswald_t auerdev; /* context pointer of assigned device */
258 auerbufctl_t bufctl; /* controls the buffer chain */
259 auerscon_t scontext; /* service context */
260 wait_queue_head_t readwait; /* for synchronous reading */
261 struct semaphore readmutex; /* protection against multiple reads */
262 pauerbuf_t readbuf; /* buffer held for partial reading */
263 unsigned int readoffset; /* current offset in readbuf */
264 unsigned int removed; /* is != 0 if device is removed */
265 } auerchar_t,*pauerchar_t;
266
267
268 /*-------------------------------------------------------------------*/
269 /* Forwards */
270 static void auerswald_ctrlread_complete (struct urb * urb);
271 static void auerswald_removeservice (pauerswald_t cp, pauerscon_t scp);
272 static struct usb_driver auerswald_driver;
273
274
275 /*-------------------------------------------------------------------*/
276 /* USB chain helper functions */
277 /* -------------------------- */
278
279 /* completion function for chained urbs */
280 static void auerchain_complete (struct urb * urb)
281 {
282 unsigned long flags;
283 int result;
284
285 /* get pointer to element and to chain */
286 pauerchainelement_t acep = (pauerchainelement_t) urb->context;
287 pauerchain_t acp = acep->chain;
288
289 /* restore original entries in urb */
290 urb->context = acep->context;
291 urb->complete = acep->complete;
292
293 dbg ("auerchain_complete called");
294
295 /* call original completion function
296 NOTE: this function may lead to more urbs submitted into the chain.
297 (no chain lock at calling complete()!)
298 acp->active != NULL is protecting us against recursion.*/
299 urb->complete (urb);
300
301 /* detach element from chain data structure */
302 spin_lock_irqsave (&acp->lock, flags);
303 if (acp->active != acep) /* paranoia debug check */
304 dbg ("auerchain_complete: completion on non-active element called!");
305 else
306 acp->active = NULL;
307
308 /* add the used chain element to the list of free elements */
309 list_add_tail (&acep->list, &acp->free_list);
310 acep = NULL;
311
312 /* is there a new element waiting in the chain? */
313 if (!acp->active && !list_empty (&acp->waiting_list)) {
314 /* yes: get the entry */
315 struct list_head *tmp = acp->waiting_list.next;
316 list_del (tmp);
317 acep = list_entry (tmp, auerchainelement_t, list);
318 acp->active = acep;
319 }
320 spin_unlock_irqrestore (&acp->lock, flags);
321
322 /* submit the new urb */
323 if (acep) {
324 urb = acep->urbp;
325 dbg ("auerchain_complete: submitting next urb from chain");
326 urb->status = 0; /* needed! */
327 result = usb_submit_urb(urb, GFP_ATOMIC);
328
329 /* check for submit errors */
330 if (result) {
331 urb->status = result;
332 dbg("auerchain_complete: usb_submit_urb with error code %d", result);
333 /* and do error handling via *this* completion function (recursive) */
334 auerchain_complete( urb);
335 }
336 } else {
337 /* simple return without submitting a new urb.
338 The empty chain is detected with acp->active == NULL. */
339 };
340 }
341
342
343 /* submit function for chained urbs
344 this function may be called from completion context or from user space!
345 early = 1 -> submit in front of chain
346 */
347 static int auerchain_submit_urb_list (pauerchain_t acp, struct urb * urb, int early)
348 {
349 int result;
350 unsigned long flags;
351 pauerchainelement_t acep = NULL;
352
353 dbg ("auerchain_submit_urb called");
354
355 /* try to get a chain element */
356 spin_lock_irqsave (&acp->lock, flags);
357 if (!list_empty (&acp->free_list)) {
358 /* yes: get the entry */
359 struct list_head *tmp = acp->free_list.next;
360 list_del (tmp);
361 acep = list_entry (tmp, auerchainelement_t, list);
362 }
363 spin_unlock_irqrestore (&acp->lock, flags);
364
365 /* if no chain element available: return with error */
366 if (!acep) {
367 return -ENOMEM;
368 }
369
370 /* fill in the new chain element values */
371 acep->chain = acp;
372 acep->context = urb->context;
373 acep->complete = urb->complete;
374 acep->urbp = urb;
375 INIT_LIST_HEAD (&acep->list);
376
377 /* modify urb */
378 urb->context = acep;
379 urb->complete = auerchain_complete;
380 urb->status = -EINPROGRESS; /* usb_submit_urb does this, too */
381
382 /* add element to chain - or start it immediately */
383 spin_lock_irqsave (&acp->lock, flags);
384 if (acp->active) {
385 /* there is traffic in the chain, simple add element to chain */
386 if (early) {
387 dbg ("adding new urb to head of chain");
388 list_add (&acep->list, &acp->waiting_list);
389 } else {
390 dbg ("adding new urb to end of chain");
391 list_add_tail (&acep->list, &acp->waiting_list);
392 }
393 acep = NULL;
394 } else {
395 /* the chain is empty. Prepare restart */
396 acp->active = acep;
397 }
398 /* Spin has to be removed before usb_submit_urb! */
399 spin_unlock_irqrestore (&acp->lock, flags);
400
401 /* Submit urb if immediate restart */
402 if (acep) {
403 dbg("submitting urb immediate");
404 urb->status = 0; /* needed! */
405 result = usb_submit_urb(urb, GFP_ATOMIC);
406 /* check for submit errors */
407 if (result) {
408 urb->status = result;
409 dbg("auerchain_submit_urb: usb_submit_urb with error code %d", result);
410 /* and do error handling via completion function */
411 auerchain_complete( urb);
412 }
413 }
414
415 return 0;
416 }
417
418 /* submit function for chained urbs
419 this function may be called from completion context or from user space!
420 */
421 static int auerchain_submit_urb (pauerchain_t acp, struct urb * urb)
422 {
423 return auerchain_submit_urb_list (acp, urb, 0);
424 }
425
426 /* cancel an urb which is submitted to the chain
427 the result is 0 if the urb is cancelled, or -EINPROGRESS if
428 the function is successfully started.
429 */
430 static int auerchain_unlink_urb (pauerchain_t acp, struct urb * urb)
431 {
432 unsigned long flags;
433 struct urb * urbp;
434 pauerchainelement_t acep;
435 struct list_head *tmp;
436
437 dbg ("auerchain_unlink_urb called");
438
439 /* search the chain of waiting elements */
440 spin_lock_irqsave (&acp->lock, flags);
441 list_for_each (tmp, &acp->waiting_list) {
442 acep = list_entry (tmp, auerchainelement_t, list);
443 if (acep->urbp == urb) {
444 list_del (tmp);
445 urb->context = acep->context;
446 urb->complete = acep->complete;
447 list_add_tail (&acep->list, &acp->free_list);
448 spin_unlock_irqrestore (&acp->lock, flags);
449 dbg ("unlink waiting urb");
450 urb->status = -ENOENT;
451 urb->complete (urb);
452 return 0;
453 }
454 }
455 /* not found. */
456 spin_unlock_irqrestore (&acp->lock, flags);
457
458 /* get the active urb */
459 acep = acp->active;
460 if (acep) {
461 urbp = acep->urbp;
462
463 /* check if we have to cancel the active urb */
464 if (urbp == urb) {
465 /* note that there is a race condition between the check above
466 and the unlink() call because of no lock. This race is harmless,
467 because the usb module will detect the unlink() after completion.
468 We can't use the acp->lock here because the completion function
469 wants to grab it.
470 */
471 dbg ("unlink active urb");
472 return usb_unlink_urb (urbp);
473 }
474 }
475
476 /* not found anyway
477 ... is some kind of success
478 */
479 dbg ("urb to unlink not found in chain");
480 return 0;
481 }
482
483 /* cancel all urbs which are in the chain.
484 this function must not be called from interrupt or completion handler.
485 */
486 static void auerchain_unlink_all (pauerchain_t acp)
487 {
488 unsigned long flags;
489 struct urb * urbp;
490 pauerchainelement_t acep;
491
492 dbg ("auerchain_unlink_all called");
493
494 /* clear the chain of waiting elements */
495 spin_lock_irqsave (&acp->lock, flags);
496 while (!list_empty (&acp->waiting_list)) {
497 /* get the next entry */
498 struct list_head *tmp = acp->waiting_list.next;
499 list_del (tmp);
500 acep = list_entry (tmp, auerchainelement_t, list);
501 urbp = acep->urbp;
502 urbp->context = acep->context;
503 urbp->complete = acep->complete;
504 list_add_tail (&acep->list, &acp->free_list);
505 spin_unlock_irqrestore (&acp->lock, flags);
506 dbg ("unlink waiting urb");
507 urbp->status = -ENOENT;
508 urbp->complete (urbp);
509 spin_lock_irqsave (&acp->lock, flags);
510 }
511 spin_unlock_irqrestore (&acp->lock, flags);
512
513 /* clear the active urb */
514 acep = acp->active;
515 if (acep) {
516 urbp = acep->urbp;
517 dbg ("unlink active urb");
518 usb_kill_urb (urbp);
519 }
520 }
521
522
523 /* free the chain.
524 this function must not be called from interrupt or completion handler.
525 */
526 static void auerchain_free (pauerchain_t acp)
527 {
528 unsigned long flags;
529 pauerchainelement_t acep;
530
531 dbg ("auerchain_free called");
532
533 /* first, cancel all pending urbs */
534 auerchain_unlink_all (acp);
535
536 /* free the elements */
537 spin_lock_irqsave (&acp->lock, flags);
538 while (!list_empty (&acp->free_list)) {
539 /* get the next entry */
540 struct list_head *tmp = acp->free_list.next;
541 list_del (tmp);
542 spin_unlock_irqrestore (&acp->lock, flags);
543 acep = list_entry (tmp, auerchainelement_t, list);
544 kfree (acep);
545 spin_lock_irqsave (&acp->lock, flags);
546 }
547 spin_unlock_irqrestore (&acp->lock, flags);
548 }
549
550
551 /* Init the chain control structure */
552 static void auerchain_init (pauerchain_t acp)
553 {
554 /* init the chain data structure */
555 acp->active = NULL;
556 spin_lock_init (&acp->lock);
557 INIT_LIST_HEAD (&acp->waiting_list);
558 INIT_LIST_HEAD (&acp->free_list);
559 }
560
561 /* setup a chain.
562 It is assumed that there is no concurrency while setting up the chain
563 requirement: auerchain_init()
564 */
565 static int auerchain_setup (pauerchain_t acp, unsigned int numElements)
566 {
567 pauerchainelement_t acep;
568
569 dbg ("auerchain_setup called with %d elements", numElements);
570
571 /* fill the list of free elements */
572 for (;numElements; numElements--) {
573 acep = kzalloc(sizeof(auerchainelement_t), GFP_KERNEL);
574 if (!acep)
575 goto ac_fail;
576 INIT_LIST_HEAD (&acep->list);
577 list_add_tail (&acep->list, &acp->free_list);
578 }
579 return 0;
580
581 ac_fail:/* free the elements */
582 while (!list_empty (&acp->free_list)) {
583 /* get the next entry */
584 struct list_head *tmp = acp->free_list.next;
585 list_del (tmp);
586 acep = list_entry (tmp, auerchainelement_t, list);
587 kfree (acep);
588 }
589 return -ENOMEM;
590 }
591
592
593 /* completion handler for synchronous chained URBs */
594 static void auerchain_blocking_completion (struct urb *urb)
595 {
596 pauerchain_chs_t pchs = (pauerchain_chs_t)urb->context;
597 pchs->done = 1;
598 wmb();
599 wake_up (&pchs->wqh);
600 }
601
602
603 /* Starts chained urb and waits for completion or timeout */
604 static int auerchain_start_wait_urb (pauerchain_t acp, struct urb *urb, int timeout, int* actual_length)
605 {
606 auerchain_chs_t chs;
607 int status;
608
609 dbg ("auerchain_start_wait_urb called");
610 init_waitqueue_head (&chs.wqh);
611 chs.done = 0;
612
613 urb->context = &chs;
614 status = auerchain_submit_urb (acp, urb);
615 if (status)
616 /* something went wrong */
617 return status;
618
619 timeout = wait_event_timeout(chs.wqh, chs.done, timeout);
620
621 if (!timeout && !chs.done) {
622 if (urb->status != -EINPROGRESS) { /* No callback?!! */
623 dbg ("auerchain_start_wait_urb: raced timeout");
624 status = urb->status;
625 } else {
626 dbg ("auerchain_start_wait_urb: timeout");
627 auerchain_unlink_urb (acp, urb); /* remove urb safely */
628 status = -ETIMEDOUT;
629 }
630 } else
631 status = urb->status;
632
633 if (actual_length)
634 *actual_length = urb->actual_length;
635
636 return status;
637 }
638
639
640 /* auerchain_control_msg - Builds a control urb, sends it off and waits for completion
641 acp: pointer to the auerchain
642 dev: pointer to the usb device to send the message to
643 pipe: endpoint "pipe" to send the message to
644 request: USB message request value
645 requesttype: USB message request type value
646 value: USB message value
647 index: USB message index value
648 data: pointer to the data to send
649 size: length in bytes of the data to send
650 timeout: time to wait for the message to complete before timing out (if 0 the wait is forever)
651
652 This function sends a simple control message to a specified endpoint
653 and waits for the message to complete, or timeout.
654
655 If successful, it returns the transferred length, otherwise a negative error number.
656
657 Don't use this function from within an interrupt context, like a
658 bottom half handler. If you need an asynchronous message, or need to send
659 a message from within interrupt context, use auerchain_submit_urb()
660 */
661 static int auerchain_control_msg (pauerchain_t acp, struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype,
662 __u16 value, __u16 index, void *data, __u16 size, int timeout)
663 {
664 int ret;
665 struct usb_ctrlrequest *dr;
666 struct urb *urb;
667 int length;
668
669 dbg ("auerchain_control_msg");
670 dr = kmalloc (sizeof (struct usb_ctrlrequest), GFP_KERNEL);
671 if (!dr)
672 return -ENOMEM;
673 urb = usb_alloc_urb (0, GFP_KERNEL);
674 if (!urb) {
675 kfree (dr);
676 return -ENOMEM;
677 }
678
679 dr->bRequestType = requesttype;
680 dr->bRequest = request;
681 dr->wValue = cpu_to_le16 (value);
682 dr->wIndex = cpu_to_le16 (index);
683 dr->wLength = cpu_to_le16 (size);
684
685 usb_fill_control_urb (urb, dev, pipe, (unsigned char*)dr, data, size, /* build urb */
686 auerchain_blocking_completion, NULL);
687 ret = auerchain_start_wait_urb (acp, urb, timeout, &length);
688
689 usb_free_urb (urb);
690 kfree (dr);
691
692 if (ret < 0)
693 return ret;
694 else
695 return length;
696 }
697
698
699 /*-------------------------------------------------------------------*/
700 /* Buffer List helper functions */
701
702 /* free a single auerbuf */
703 static void auerbuf_free (pauerbuf_t bp)
704 {
705 kfree(bp->bufp);
706 kfree(bp->dr);
707 usb_free_urb(bp->urbp);
708 kfree(bp);
709 }
710
711 /* free the buffers from an auerbuf list */
712 static void auerbuf_free_list (struct list_head *q)
713 {
714 struct list_head *tmp;
715 struct list_head *p;
716 pauerbuf_t bp;
717
718 dbg ("auerbuf_free_list");
719 for (p = q->next; p != q;) {
720 bp = list_entry (p, auerbuf_t, buff_list);
721 tmp = p->next;
722 list_del (p);
723 p = tmp;
724 auerbuf_free (bp);
725 }
726 }
727
728 /* init the members of a list control block */
729 static void auerbuf_init (pauerbufctl_t bcp)
730 {
731 dbg ("auerbuf_init");
732 spin_lock_init (&bcp->lock);
733 INIT_LIST_HEAD (&bcp->free_buff_list);
734 INIT_LIST_HEAD (&bcp->rec_buff_list);
735 }
736
737 /* free all buffers from an auerbuf chain */
738 static void auerbuf_free_buffers (pauerbufctl_t bcp)
739 {
740 unsigned long flags;
741 dbg ("auerbuf_free_buffers");
742
743 spin_lock_irqsave (&bcp->lock, flags);
744
745 auerbuf_free_list (&bcp->free_buff_list);
746 auerbuf_free_list (&bcp->rec_buff_list);
747
748 spin_unlock_irqrestore (&bcp->lock, flags);
749 }
750
751 /* setup a list of buffers */
752 /* requirement: auerbuf_init() */
753 static int auerbuf_setup (pauerbufctl_t bcp, unsigned int numElements, unsigned int bufsize)
754 {
755 pauerbuf_t bep = NULL;
756
757 dbg ("auerbuf_setup called with %d elements of %d bytes", numElements, bufsize);
758
759 /* fill the list of free elements */
760 for (;numElements; numElements--) {
761 bep = kzalloc(sizeof(auerbuf_t), GFP_KERNEL);
762 if (!bep)
763 goto bl_fail;
764 bep->list = bcp;
765 INIT_LIST_HEAD (&bep->buff_list);
766 bep->bufp = kmalloc (bufsize, GFP_KERNEL);
767 if (!bep->bufp)
768 goto bl_fail;
769 bep->dr = kmalloc(sizeof (struct usb_ctrlrequest), GFP_KERNEL);
770 if (!bep->dr)
771 goto bl_fail;
772 bep->urbp = usb_alloc_urb (0, GFP_KERNEL);
773 if (!bep->urbp)
774 goto bl_fail;
775 list_add_tail (&bep->buff_list, &bcp->free_buff_list);
776 }
777 return 0;
778
779 bl_fail:/* not enough memory. Free allocated elements */
780 dbg ("auerbuf_setup: no more memory");
781 auerbuf_free(bep);
782 auerbuf_free_buffers (bcp);
783 return -ENOMEM;
784 }
785
786 /* insert a used buffer into the free list */
787 static void auerbuf_releasebuf( pauerbuf_t bp)
788 {
789 unsigned long flags;
790 pauerbufctl_t bcp = bp->list;
791 bp->retries = 0;
792
793 dbg ("auerbuf_releasebuf called");
794 spin_lock_irqsave (&bcp->lock, flags);
795 list_add_tail (&bp->buff_list, &bcp->free_buff_list);
796 spin_unlock_irqrestore (&bcp->lock, flags);
797 }
798
799
800 /*-------------------------------------------------------------------*/
801 /* Completion handlers */
802
803 /* Values of urb->status or results of usb_submit_urb():
804 0 Initial, OK
805 -EINPROGRESS during submission until end
806 -ENOENT if urb is unlinked
807 -ETIME Device did not respond
808 -ENOMEM Memory Overflow
809 -ENODEV Specified USB-device or bus doesn't exist
810 -ENXIO URB already queued
811 -EINVAL a) Invalid transfer type specified (or not supported)
812 b) Invalid interrupt interval (0n256)
813 -EAGAIN a) Specified ISO start frame too early
814 b) (using ISO-ASAP) Too much scheduled for the future wait some time and try again.
815 -EFBIG Too much ISO frames requested (currently uhci900)
816 -EPIPE Specified pipe-handle/Endpoint is already stalled
817 -EMSGSIZE Endpoint message size is zero, do interface/alternate setting
818 -EPROTO a) Bitstuff error
819 b) Unknown USB error
820 -EILSEQ CRC mismatch
821 -ENOSR Buffer error
822 -EREMOTEIO Short packet detected
823 -EXDEV ISO transfer only partially completed look at individual frame status for details
824 -EINVAL ISO madness, if this happens: Log off and go home
825 -EOVERFLOW babble
826 */
827
828 /* check if a status code allows a retry */
829 static int auerswald_status_retry (int status)
830 {
831 switch (status) {
832 case 0:
833 case -ETIME:
834 case -EOVERFLOW:
835 case -EAGAIN:
836 case -EPIPE:
837 case -EPROTO:
838 case -EILSEQ:
839 case -ENOSR:
840 case -EREMOTEIO:
841 return 1; /* do a retry */
842 }
843 return 0; /* no retry possible */
844 }
845
846 /* Completion of asynchronous write block */
847 static void auerchar_ctrlwrite_complete (struct urb * urb)
848 {
849 pauerbuf_t bp = (pauerbuf_t) urb->context;
850 pauerswald_t cp = ((pauerswald_t)((char *)(bp->list)-(unsigned long)(&((pauerswald_t)0)->bufctl)));
851 dbg ("auerchar_ctrlwrite_complete called");
852
853 /* reuse the buffer */
854 auerbuf_releasebuf (bp);
855 /* Wake up all processes waiting for a buffer */
856 wake_up (&cp->bufferwait);
857 }
858
859 /* Completion handler for dummy retry packet */
860 static void auerswald_ctrlread_wretcomplete (struct urb * urb)
861 {
862 pauerbuf_t bp = (pauerbuf_t) urb->context;
863 pauerswald_t cp;
864 int ret;
865 dbg ("auerswald_ctrlread_wretcomplete called");
866 dbg ("complete with status: %d", urb->status);
867 cp = ((pauerswald_t)((char *)(bp->list)-(unsigned long)(&((pauerswald_t)0)->bufctl)));
868
869 /* check if it is possible to advance */
870 if (!auerswald_status_retry (urb->status) || !cp->usbdev) {
871 /* reuse the buffer */
872 err ("control dummy: transmission error %d, can not retry", urb->status);
873 auerbuf_releasebuf (bp);
874 /* Wake up all processes waiting for a buffer */
875 wake_up (&cp->bufferwait);
876 return;
877 }
878
879 /* fill the control message */
880 bp->dr->bRequestType = AUT_RREQ;
881 bp->dr->bRequest = AUV_RBLOCK;
882 bp->dr->wLength = bp->dr->wValue; /* temporary stored */
883 bp->dr->wValue = cpu_to_le16 (1); /* Retry Flag */
884 /* bp->dr->index = channel id; remains */
885 usb_fill_control_urb (bp->urbp, cp->usbdev, usb_rcvctrlpipe (cp->usbdev, 0),
886 (unsigned char*)bp->dr, bp->bufp, le16_to_cpu (bp->dr->wLength),
887 auerswald_ctrlread_complete,bp);
888
889 /* submit the control msg as next paket */
890 ret = auerchain_submit_urb_list (&cp->controlchain, bp->urbp, 1);
891 if (ret) {
892 dbg ("auerswald_ctrlread_complete: nonzero result of auerchain_submit_urb_list %d", ret);
893 bp->urbp->status = ret;
894 auerswald_ctrlread_complete (bp->urbp);
895 }
896 }
897
898 /* completion handler for receiving of control messages */
899 static void auerswald_ctrlread_complete (struct urb * urb)
900 {
901 unsigned int serviceid;
902 pauerswald_t cp;
903 pauerscon_t scp;
904 pauerbuf_t bp = (pauerbuf_t) urb->context;
905 int ret;
906 dbg ("auerswald_ctrlread_complete called");
907
908 cp = ((pauerswald_t)((char *)(bp->list)-(unsigned long)(&((pauerswald_t)0)->bufctl)));
909
910 /* check if there is valid data in this urb */
911 if (urb->status) {
912 dbg ("complete with non-zero status: %d", urb->status);
913 /* should we do a retry? */
914 if (!auerswald_status_retry (urb->status)
915 || !cp->usbdev
916 || (cp->version < AUV_RETRY)
917 || (bp->retries >= AU_RETRIES)) {
918 /* reuse the buffer */
919 err ("control read: transmission error %d, can not retry", urb->status);
920 auerbuf_releasebuf (bp);
921 /* Wake up all processes waiting for a buffer */
922 wake_up (&cp->bufferwait);
923 return;
924 }
925 bp->retries++;
926 dbg ("Retry count = %d", bp->retries);
927 /* send a long dummy control-write-message to allow device firmware to react */
928 bp->dr->bRequestType = AUT_WREQ;
929 bp->dr->bRequest = AUV_DUMMY;
930 bp->dr->wValue = bp->dr->wLength; /* temporary storage */
931 // bp->dr->wIndex channel ID remains
932 bp->dr->wLength = cpu_to_le16 (32); /* >= 8 bytes */
933 usb_fill_control_urb (bp->urbp, cp->usbdev, usb_sndctrlpipe (cp->usbdev, 0),
934 (unsigned char*)bp->dr, bp->bufp, 32,
935 auerswald_ctrlread_wretcomplete,bp);
936
937 /* submit the control msg as next paket */
938 ret = auerchain_submit_urb_list (&cp->controlchain, bp->urbp, 1);
939 if (ret) {
940 dbg ("auerswald_ctrlread_complete: nonzero result of auerchain_submit_urb_list %d", ret);
941 bp->urbp->status = ret;
942 auerswald_ctrlread_wretcomplete (bp->urbp);
943 }
944 return;
945 }
946
947 /* get the actual bytecount (incl. headerbyte) */
948 bp->len = urb->actual_length;
949 serviceid = bp->bufp[0] & AUH_TYPEMASK;
950 dbg ("Paket with serviceid %d and %d bytes received", serviceid, bp->len);
951
952 /* dispatch the paket */
953 scp = cp->services[serviceid];
954 if (scp) {
955 /* look, Ma, a listener! */
956 scp->dispatch (scp, bp);
957 }
958
959 /* release the paket */
960 auerbuf_releasebuf (bp);
961 /* Wake up all processes waiting for a buffer */
962 wake_up (&cp->bufferwait);
963 }
964
965 /*-------------------------------------------------------------------*/
966 /* Handling of Interrupt Endpoint */
967 /* This interrupt Endpoint is used to inform the host about waiting
968 messages from the USB device.
969 */
970 /* int completion handler. */
971 static void auerswald_int_complete (struct urb * urb)
972 {
973 unsigned long flags;
974 unsigned int channelid;
975 unsigned int bytecount;
976 int ret;
977 pauerbuf_t bp = NULL;
978 pauerswald_t cp = (pauerswald_t) urb->context;
979
980 dbg ("%s called", __FUNCTION__);
981
982 switch (urb->status) {
983 case 0:
984 /* success */
985 break;
986 case -ECONNRESET:
987 case -ENOENT:
988 case -ESHUTDOWN:
989 /* this urb is terminated, clean up */
990 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
991 return;
992 default:
993 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
994 goto exit;
995 }
996
997 /* check if all needed data was received */
998 if (urb->actual_length < AU_IRQMINSIZE) {
999 dbg ("invalid data length received: %d bytes", urb->actual_length);
1000 goto exit;
1001 }
1002
1003 /* check the command code */
1004 if (cp->intbufp[0] != AU_IRQCMDID) {
1005 dbg ("invalid command received: %d", cp->intbufp[0]);
1006 goto exit;
1007 }
1008
1009 /* check the command type */
1010 if (cp->intbufp[1] != AU_BLOCKRDY) {
1011 dbg ("invalid command type received: %d", cp->intbufp[1]);
1012 goto exit;
1013 }
1014
1015 /* now extract the information */
1016 channelid = cp->intbufp[2];
1017 bytecount = (unsigned char)cp->intbufp[3];
1018 bytecount |= (unsigned char)cp->intbufp[4] << 8;
1019
1020 /* check the channel id */
1021 if (channelid >= AUH_TYPESIZE) {
1022 dbg ("invalid channel id received: %d", channelid);
1023 goto exit;
1024 }
1025
1026 /* check the byte count */
1027 if (bytecount > (cp->maxControlLength+AUH_SIZE)) {
1028 dbg ("invalid byte count received: %d", bytecount);
1029 goto exit;
1030 }
1031 dbg ("Service Channel = %d", channelid);
1032 dbg ("Byte Count = %d", bytecount);
1033
1034 /* get a buffer for the next data paket */
1035 spin_lock_irqsave (&cp->bufctl.lock, flags);
1036 if (!list_empty (&cp->bufctl.free_buff_list)) {
1037 /* yes: get the entry */
1038 struct list_head *tmp = cp->bufctl.free_buff_list.next;
1039 list_del (tmp);
1040 bp = list_entry (tmp, auerbuf_t, buff_list);
1041 }
1042 spin_unlock_irqrestore (&cp->bufctl.lock, flags);
1043
1044 /* if no buffer available: skip it */
1045 if (!bp) {
1046 dbg ("auerswald_int_complete: no data buffer available");
1047 /* can we do something more?
1048 This is a big problem: if this int packet is ignored, the
1049 device will wait forever and not signal any more data.
1050 The only real solution is: having enough buffers!
1051 Or perhaps temporary disabling the int endpoint?
1052 */
1053 goto exit;
1054 }
1055
1056 /* fill the control message */
1057 bp->dr->bRequestType = AUT_RREQ;
1058 bp->dr->bRequest = AUV_RBLOCK;
1059 bp->dr->wValue = cpu_to_le16 (0);
1060 bp->dr->wIndex = cpu_to_le16 (channelid | AUH_DIRECT | AUH_UNSPLIT);
1061 bp->dr->wLength = cpu_to_le16 (bytecount);
1062 usb_fill_control_urb (bp->urbp, cp->usbdev, usb_rcvctrlpipe (cp->usbdev, 0),
1063 (unsigned char*)bp->dr, bp->bufp, bytecount,
1064 auerswald_ctrlread_complete,bp);
1065
1066 /* submit the control msg */
1067 ret = auerchain_submit_urb (&cp->controlchain, bp->urbp);
1068 if (ret) {
1069 dbg ("auerswald_int_complete: nonzero result of auerchain_submit_urb %d", ret);
1070 bp->urbp->status = ret;
1071 auerswald_ctrlread_complete( bp->urbp);
1072 /* here applies the same problem as above: device locking! */
1073 }
1074 exit:
1075 ret = usb_submit_urb (urb, GFP_ATOMIC);
1076 if (ret)
1077 err ("%s - usb_submit_urb failed with result %d",
1078 __FUNCTION__, ret);
1079 }
1080
1081 /* int memory deallocation
1082 NOTE: no mutex please!
1083 */
1084 static void auerswald_int_free (pauerswald_t cp)
1085 {
1086 if (cp->inturbp) {
1087 usb_free_urb(cp->inturbp);
1088 cp->inturbp = NULL;
1089 }
1090 kfree(cp->intbufp);
1091 cp->intbufp = NULL;
1092 }
1093
1094 /* This function is called to activate the interrupt
1095 endpoint. This function returns 0 if successful or an error code.
1096 NOTE: no mutex please!
1097 */
1098 static int auerswald_int_open (pauerswald_t cp)
1099 {
1100 int ret;
1101 struct usb_host_endpoint *ep;
1102 int irqsize;
1103 dbg ("auerswald_int_open");
1104
1105 ep = cp->usbdev->ep_in[AU_IRQENDP];
1106 if (!ep) {
1107 ret = -EFAULT;
1108 goto intoend;
1109 }
1110 irqsize = le16_to_cpu(ep->desc.wMaxPacketSize);
1111 cp->irqsize = irqsize;
1112
1113 /* allocate the urb and data buffer */
1114 if (!cp->inturbp) {
1115 cp->inturbp = usb_alloc_urb (0, GFP_KERNEL);
1116 if (!cp->inturbp) {
1117 ret = -ENOMEM;
1118 goto intoend;
1119 }
1120 }
1121 if (!cp->intbufp) {
1122 cp->intbufp = kmalloc (irqsize, GFP_KERNEL);
1123 if (!cp->intbufp) {
1124 ret = -ENOMEM;
1125 goto intoend;
1126 }
1127 }
1128 /* setup urb */
1129 usb_fill_int_urb (cp->inturbp, cp->usbdev,
1130 usb_rcvintpipe (cp->usbdev,AU_IRQENDP), cp->intbufp,
1131 irqsize, auerswald_int_complete, cp, ep->desc.bInterval);
1132 /* start the urb */
1133 cp->inturbp->status = 0; /* needed! */
1134 ret = usb_submit_urb (cp->inturbp, GFP_KERNEL);
1135
1136 intoend:
1137 if (ret < 0) {
1138 /* activation of interrupt endpoint has failed. Now clean up. */
1139 dbg ("auerswald_int_open: activation of int endpoint failed");
1140
1141 /* deallocate memory */
1142 auerswald_int_free (cp);
1143 }
1144 return ret;
1145 }
1146
1147 /* This function is called to deactivate the interrupt
1148 endpoint. This function returns 0 if successful or an error code.
1149 NOTE: no mutex please!
1150 */
1151 static void auerswald_int_release (pauerswald_t cp)
1152 {
1153 dbg ("auerswald_int_release");
1154
1155 /* stop the int endpoint */
1156 usb_kill_urb (cp->inturbp);
1157
1158 /* deallocate memory */
1159 auerswald_int_free (cp);
1160 }
1161
1162 /* --------------------------------------------------------------------- */
1163 /* Helper functions */
1164
1165 /* wake up waiting readers */
1166 static void auerchar_disconnect (pauerscon_t scp)
1167 {
1168 pauerchar_t ccp = ((pauerchar_t)((char *)(scp)-(unsigned long)(&((pauerchar_t)0)->scontext)));
1169 dbg ("auerchar_disconnect called");
1170 ccp->removed = 1;
1171 wake_up (&ccp->readwait);
1172 }
1173
1174
1175 /* dispatch a read paket to a waiting character device */
1176 static void auerchar_ctrlread_dispatch (pauerscon_t scp, pauerbuf_t bp)
1177 {
1178 unsigned long flags;
1179 pauerchar_t ccp;
1180 pauerbuf_t newbp = NULL;
1181 char * charp;
1182 dbg ("auerchar_ctrlread_dispatch called");
1183 ccp = ((pauerchar_t)((char *)(scp)-(unsigned long)(&((pauerchar_t)0)->scontext)));
1184
1185 /* get a read buffer from character device context */
1186 spin_lock_irqsave (&ccp->bufctl.lock, flags);
1187 if (!list_empty (&ccp->bufctl.free_buff_list)) {
1188 /* yes: get the entry */
1189 struct list_head *tmp = ccp->bufctl.free_buff_list.next;
1190 list_del (tmp);
1191 newbp = list_entry (tmp, auerbuf_t, buff_list);
1192 }
1193 spin_unlock_irqrestore (&ccp->bufctl.lock, flags);
1194
1195 if (!newbp) {
1196 dbg ("No read buffer available, discard paket!");
1197 return; /* no buffer, no dispatch */
1198 }
1199
1200 /* copy information to new buffer element
1201 (all buffers have the same length) */
1202 charp = newbp->bufp;
1203 newbp->bufp = bp->bufp;
1204 bp->bufp = charp;
1205 newbp->len = bp->len;
1206
1207 /* insert new buffer in read list */
1208 spin_lock_irqsave (&ccp->bufctl.lock, flags);
1209 list_add_tail (&newbp->buff_list, &ccp->bufctl.rec_buff_list);
1210 spin_unlock_irqrestore (&ccp->bufctl.lock, flags);
1211 dbg ("read buffer appended to rec_list");
1212
1213 /* wake up pending synchronous reads */
1214 wake_up (&ccp->readwait);
1215 }
1216
1217
1218 /* Delete an auerswald driver context */
1219 static void auerswald_delete( pauerswald_t cp)
1220 {
1221 dbg( "auerswald_delete");
1222 if (cp == NULL)
1223 return;
1224
1225 /* Wake up all processes waiting for a buffer */
1226 wake_up (&cp->bufferwait);
1227
1228 /* Cleaning up */
1229 auerswald_int_release (cp);
1230 auerchain_free (&cp->controlchain);
1231 auerbuf_free_buffers (&cp->bufctl);
1232
1233 /* release the memory */
1234 kfree( cp);
1235 }
1236
1237
1238 /* Delete an auerswald character context */
1239 static void auerchar_delete( pauerchar_t ccp)
1240 {
1241 dbg ("auerchar_delete");
1242 if (ccp == NULL)
1243 return;
1244
1245 /* wake up pending synchronous reads */
1246 ccp->removed = 1;
1247 wake_up (&ccp->readwait);
1248
1249 /* remove the read buffer */
1250 if (ccp->readbuf) {
1251 auerbuf_releasebuf (ccp->readbuf);
1252 ccp->readbuf = NULL;
1253 }
1254
1255 /* remove the character buffers */
1256 auerbuf_free_buffers (&ccp->bufctl);
1257
1258 /* release the memory */
1259 kfree( ccp);
1260 }
1261
1262
1263 /* add a new service to the device
1264 scp->id must be set!
1265 return: 0 if OK, else error code
1266 */
1267 static int auerswald_addservice (pauerswald_t cp, pauerscon_t scp)
1268 {
1269 int ret;
1270
1271 /* is the device available? */
1272 if (!cp->usbdev) {
1273 dbg ("usbdev == NULL");
1274 return -EIO; /*no: can not add a service, sorry*/
1275 }
1276
1277 /* is the service available? */
1278 if (cp->services[scp->id]) {
1279 dbg ("service is busy");
1280 return -EBUSY;
1281 }
1282
1283 /* device is available, service is free */
1284 cp->services[scp->id] = scp;
1285
1286 /* register service in device */
1287 ret = auerchain_control_msg(
1288 &cp->controlchain, /* pointer to control chain */
1289 cp->usbdev, /* pointer to device */
1290 usb_sndctrlpipe (cp->usbdev, 0), /* pipe to control endpoint */
1291 AUV_CHANNELCTL, /* USB message request value */
1292 AUT_WREQ, /* USB message request type value */
1293 0x01, /* open USB message value */
1294 scp->id, /* USB message index value */
1295 NULL, /* pointer to the data to send */
1296 0, /* length in bytes of the data to send */
1297 HZ * 2); /* time to wait for the message to complete before timing out */
1298 if (ret < 0) {
1299 dbg ("auerswald_addservice: auerchain_control_msg returned error code %d", ret);
1300 /* undo above actions */
1301 cp->services[scp->id] = NULL;
1302 return ret;
1303 }
1304
1305 dbg ("auerswald_addservice: channel open OK");
1306 return 0;
1307 }
1308
1309
1310 /* remove a service from the the device
1311 scp->id must be set! */
1312 static void auerswald_removeservice (pauerswald_t cp, pauerscon_t scp)
1313 {
1314 dbg ("auerswald_removeservice called");
1315
1316 /* check if we have a service allocated */
1317 if (scp->id == AUH_UNASSIGNED)
1318 return;
1319
1320 /* If there is a device: close the channel */
1321 if (cp->usbdev) {
1322 /* Close the service channel inside the device */
1323 int ret = auerchain_control_msg(
1324 &cp->controlchain, /* pointer to control chain */
1325 cp->usbdev, /* pointer to device */
1326 usb_sndctrlpipe (cp->usbdev, 0), /* pipe to control endpoint */
1327 AUV_CHANNELCTL, /* USB message request value */
1328 AUT_WREQ, /* USB message request type value */
1329 0x00, // close /* USB message value */
1330 scp->id, /* USB message index value */
1331 NULL, /* pointer to the data to send */
1332 0, /* length in bytes of the data to send */
1333 HZ * 2); /* time to wait for the message to complete before timing out */
1334 if (ret < 0) {
1335 dbg ("auerswald_removeservice: auerchain_control_msg returned error code %d", ret);
1336 }
1337 else {
1338 dbg ("auerswald_removeservice: channel close OK");
1339 }
1340 }
1341
1342 /* remove the service from the device */
1343 cp->services[scp->id] = NULL;
1344 scp->id = AUH_UNASSIGNED;
1345 }
1346
1347
1348 /* --------------------------------------------------------------------- */
1349 /* Char device functions */
1350
1351 /* Open a new character device */
1352 static int auerchar_open (struct inode *inode, struct file *file)
1353 {
1354 int dtindex = iminor(inode);
1355 pauerswald_t cp = NULL;
1356 pauerchar_t ccp = NULL;
1357 struct usb_interface *intf;
1358 int ret;
1359
1360 /* minor number in range? */
1361 if (dtindex < 0) {
1362 return -ENODEV;
1363 }
1364 intf = usb_find_interface(&auerswald_driver, dtindex);
1365 if (!intf) {
1366 return -ENODEV;
1367 }
1368
1369 /* usb device available? */
1370 cp = usb_get_intfdata (intf);
1371 if (cp == NULL) {
1372 return -ENODEV;
1373 }
1374 if (down_interruptible (&cp->mutex)) {
1375 return -ERESTARTSYS;
1376 }
1377
1378 /* we have access to the device. Now lets allocate memory */
1379 ccp = (pauerchar_t) kmalloc(sizeof(auerchar_t), GFP_KERNEL);
1380 if (ccp == NULL) {
1381 err ("out of memory");
1382 ret = -ENOMEM;
1383 goto ofail;
1384 }
1385
1386 /* Initialize device descriptor */
1387 memset( ccp, 0, sizeof(auerchar_t));
1388 init_MUTEX( &ccp->mutex);
1389 init_MUTEX( &ccp->readmutex);
1390 auerbuf_init (&ccp->bufctl);
1391 ccp->scontext.id = AUH_UNASSIGNED;
1392 ccp->scontext.dispatch = auerchar_ctrlread_dispatch;
1393 ccp->scontext.disconnect = auerchar_disconnect;
1394 init_waitqueue_head (&ccp->readwait);
1395
1396 ret = auerbuf_setup (&ccp->bufctl, AU_RBUFFERS, cp->maxControlLength+AUH_SIZE);
1397 if (ret) {
1398 goto ofail;
1399 }
1400
1401 cp->open_count++;
1402 ccp->auerdev = cp;
1403 dbg("open %s as /dev/%s", cp->dev_desc, cp->name);
1404 up (&cp->mutex);
1405
1406 /* file IO stuff */
1407 file->f_pos = 0;
1408 file->private_data = ccp;
1409 return nonseekable_open(inode, file);
1410
1411 /* Error exit */
1412 ofail: up (&cp->mutex);
1413 auerchar_delete (ccp);
1414 return ret;
1415 }
1416
1417
1418 /* IOCTL functions */
1419 static int auerchar_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
1420 {
1421 pauerchar_t ccp = (pauerchar_t) file->private_data;
1422 int ret = 0;
1423 audevinfo_t devinfo;
1424 pauerswald_t cp = NULL;
1425 unsigned int u;
1426 unsigned int __user *user_arg = (unsigned int __user *)arg;
1427
1428 dbg ("ioctl");
1429
1430 /* get the mutexes */
1431 if (down_interruptible (&ccp->mutex)) {
1432 return -ERESTARTSYS;
1433 }
1434 cp = ccp->auerdev;
1435 if (!cp) {
1436 up (&ccp->mutex);
1437 return -ENODEV;
1438 }
1439 if (down_interruptible (&cp->mutex)) {
1440 up(&ccp->mutex);
1441 return -ERESTARTSYS;
1442 }
1443
1444 /* Check for removal */
1445 if (!cp->usbdev) {
1446 up(&cp->mutex);
1447 up(&ccp->mutex);
1448 return -ENODEV;
1449 }
1450
1451 switch (cmd) {
1452
1453 /* return != 0 if Transmitt channel ready to send */
1454 case IOCTL_AU_TXREADY:
1455 dbg ("IOCTL_AU_TXREADY");
1456 u = ccp->auerdev
1457 && (ccp->scontext.id != AUH_UNASSIGNED)
1458 && !list_empty (&cp->bufctl.free_buff_list);
1459 ret = put_user (u, user_arg);
1460 break;
1461
1462 /* return != 0 if connected to a service channel */
1463 case IOCTL_AU_CONNECT:
1464 dbg ("IOCTL_AU_CONNECT");
1465 u = (ccp->scontext.id != AUH_UNASSIGNED);
1466 ret = put_user (u, user_arg);
1467 break;
1468
1469 /* return != 0 if Receive Data available */
1470 case IOCTL_AU_RXAVAIL:
1471 dbg ("IOCTL_AU_RXAVAIL");
1472 if (ccp->scontext.id == AUH_UNASSIGNED) {
1473 ret = -EIO;
1474 break;
1475 }
1476 u = 0; /* no data */
1477 if (ccp->readbuf) {
1478 int restlen = ccp->readbuf->len - ccp->readoffset;
1479 if (restlen > 0)
1480 u = 1;
1481 }
1482 if (!u) {
1483 if (!list_empty (&ccp->bufctl.rec_buff_list)) {
1484 u = 1;
1485 }
1486 }
1487 ret = put_user (u, user_arg);
1488 break;
1489
1490 /* return the max. buffer length for the device */
1491 case IOCTL_AU_BUFLEN:
1492 dbg ("IOCTL_AU_BUFLEN");
1493 u = cp->maxControlLength;
1494 ret = put_user (u, user_arg);
1495 break;
1496
1497 /* requesting a service channel */
1498 case IOCTL_AU_SERVREQ:
1499 dbg ("IOCTL_AU_SERVREQ");
1500 /* requesting a service means: release the previous one first */
1501 auerswald_removeservice (cp, &ccp->scontext);
1502 /* get the channel number */
1503 ret = get_user (u, user_arg);
1504 if (ret) {
1505 break;
1506 }
1507 if ((u < AUH_FIRSTUSERCH) || (u >= AUH_TYPESIZE)) {
1508 ret = -EIO;
1509 break;
1510 }
1511 dbg ("auerchar service request parameters are ok");
1512 ccp->scontext.id = u;
1513
1514 /* request the service now */
1515 ret = auerswald_addservice (cp, &ccp->scontext);
1516 if (ret) {
1517 /* no: revert service entry */
1518 ccp->scontext.id = AUH_UNASSIGNED;
1519 }
1520 break;
1521
1522 /* get a string descriptor for the device */
1523 case IOCTL_AU_DEVINFO:
1524 dbg ("IOCTL_AU_DEVINFO");
1525 if (copy_from_user (&devinfo, (void __user *) arg, sizeof (audevinfo_t))) {
1526 ret = -EFAULT;
1527 break;
1528 }
1529 u = strlen(cp->dev_desc)+1;
1530 if (u > devinfo.bsize) {
1531 u = devinfo.bsize;
1532 }
1533 ret = copy_to_user(devinfo.buf, cp->dev_desc, u) ? -EFAULT : 0;
1534 break;
1535
1536 /* get the max. string descriptor length */
1537 case IOCTL_AU_SLEN:
1538 dbg ("IOCTL_AU_SLEN");
1539 u = AUSI_DLEN;
1540 ret = put_user (u, user_arg);
1541 break;
1542
1543 default:
1544 dbg ("IOCTL_AU_UNKNOWN");
1545 ret = -ENOIOCTLCMD;
1546 break;
1547 }
1548 /* release the mutexes */
1549 up(&cp->mutex);
1550 up(&ccp->mutex);
1551 return ret;
1552 }
1553
1554 /* Read data from the device */
1555 static ssize_t auerchar_read (struct file *file, char __user *buf, size_t count, loff_t * ppos)
1556 {
1557 unsigned long flags;
1558 pauerchar_t ccp = (pauerchar_t) file->private_data;
1559 pauerbuf_t bp = NULL;
1560 wait_queue_t wait;
1561
1562 dbg ("auerchar_read");
1563
1564 /* Error checking */
1565 if (!ccp)
1566 return -EIO;
1567 if (*ppos)
1568 return -ESPIPE;
1569 if (count == 0)
1570 return 0;
1571
1572 /* get the mutex */
1573 if (down_interruptible (&ccp->mutex))
1574 return -ERESTARTSYS;
1575
1576 /* Can we expect to read something? */
1577 if (ccp->scontext.id == AUH_UNASSIGNED) {
1578 up (&ccp->mutex);
1579 return -EIO;
1580 }
1581
1582 /* only one reader per device allowed */
1583 if (down_interruptible (&ccp->readmutex)) {
1584 up (&ccp->mutex);
1585 return -ERESTARTSYS;
1586 }
1587
1588 /* read data from readbuf, if available */
1589 doreadbuf:
1590 bp = ccp->readbuf;
1591 if (bp) {
1592 /* read the maximum bytes */
1593 int restlen = bp->len - ccp->readoffset;
1594 if (restlen < 0)
1595 restlen = 0;
1596 if (count > restlen)
1597 count = restlen;
1598 if (count) {
1599 if (copy_to_user (buf, bp->bufp+ccp->readoffset, count)) {
1600 dbg ("auerswald_read: copy_to_user failed");
1601 up (&ccp->readmutex);
1602 up (&ccp->mutex);
1603 return -EFAULT;
1604 }
1605 }
1606 /* advance the read offset */
1607 ccp->readoffset += count;
1608 restlen -= count;
1609 // reuse the read buffer
1610 if (restlen <= 0) {
1611 auerbuf_releasebuf (bp);
1612 ccp->readbuf = NULL;
1613 }
1614 /* return with number of bytes read */
1615 if (count) {
1616 up (&ccp->readmutex);
1617 up (&ccp->mutex);
1618 return count;
1619 }
1620 }
1621
1622 /* a read buffer is not available. Try to get the next data block. */
1623 doreadlist:
1624 /* Preparing for sleep */
1625 init_waitqueue_entry (&wait, current);
1626 set_current_state (TASK_INTERRUPTIBLE);
1627 add_wait_queue (&ccp->readwait, &wait);
1628
1629 bp = NULL;
1630 spin_lock_irqsave (&ccp->bufctl.lock, flags);
1631 if (!list_empty (&ccp->bufctl.rec_buff_list)) {
1632 /* yes: get the entry */
1633 struct list_head *tmp = ccp->bufctl.rec_buff_list.next;
1634 list_del (tmp);
1635 bp = list_entry (tmp, auerbuf_t, buff_list);
1636 }
1637 spin_unlock_irqrestore (&ccp->bufctl.lock, flags);
1638
1639 /* have we got data? */
1640 if (bp) {
1641 ccp->readbuf = bp;
1642 ccp->readoffset = AUH_SIZE; /* for headerbyte */
1643 set_current_state (TASK_RUNNING);
1644 remove_wait_queue (&ccp->readwait, &wait);
1645 goto doreadbuf; /* now we can read! */
1646 }
1647
1648 /* no data available. Should we wait? */
1649 if (file->f_flags & O_NONBLOCK) {
1650 dbg ("No read buffer available, returning -EAGAIN");
1651 set_current_state (TASK_RUNNING);
1652 remove_wait_queue (&ccp->readwait, &wait);
1653 up (&ccp->readmutex);
1654 up (&ccp->mutex);
1655 return -EAGAIN; /* nonblocking, no data available */
1656 }
1657
1658 /* yes, we should wait! */
1659 up (&ccp->mutex); /* allow other operations while we wait */
1660 schedule();
1661 remove_wait_queue (&ccp->readwait, &wait);
1662 if (signal_pending (current)) {
1663 /* waked up by a signal */
1664 up (&ccp->readmutex);
1665 return -ERESTARTSYS;
1666 }
1667
1668 /* Anything left to read? */
1669 if ((ccp->scontext.id == AUH_UNASSIGNED) || ccp->removed) {
1670 up (&ccp->readmutex);
1671 return -EIO;
1672 }
1673
1674 if (down_interruptible (&ccp->mutex)) {
1675 up (&ccp->readmutex);
1676 return -ERESTARTSYS;
1677 }
1678
1679 /* try to read the incoming data again */
1680 goto doreadlist;
1681 }
1682
1683
1684 /* Write a data block into the right service channel of the device */
1685 static ssize_t auerchar_write (struct file *file, const char __user *buf, size_t len, loff_t *ppos)
1686 {
1687 pauerchar_t ccp = (pauerchar_t) file->private_data;
1688 pauerswald_t cp = NULL;
1689 pauerbuf_t bp;
1690 unsigned long flags;
1691 int ret;
1692 wait_queue_t wait;
1693
1694 dbg ("auerchar_write %zd bytes", len);
1695
1696 /* Error checking */
1697 if (!ccp)
1698 return -EIO;
1699 if (*ppos)
1700 return -ESPIPE;
1701 if (len == 0)
1702 return 0;
1703
1704 write_again:
1705 /* get the mutex */
1706 if (down_interruptible (&ccp->mutex))
1707 return -ERESTARTSYS;
1708
1709 /* Can we expect to write something? */
1710 if (ccp->scontext.id == AUH_UNASSIGNED) {
1711 up (&ccp->mutex);
1712 return -EIO;
1713 }
1714
1715 cp = ccp->auerdev;
1716 if (!cp) {
1717 up (&ccp->mutex);
1718 return -ERESTARTSYS;
1719 }
1720 if (down_interruptible (&cp->mutex)) {
1721 up (&ccp->mutex);
1722 return -ERESTARTSYS;
1723 }
1724 if (!cp->usbdev) {
1725 up (&cp->mutex);
1726 up (&ccp->mutex);
1727 return -EIO;
1728 }
1729 /* Prepare for sleep */
1730 init_waitqueue_entry (&wait, current);
1731 set_current_state (TASK_INTERRUPTIBLE);
1732 add_wait_queue (&cp->bufferwait, &wait);
1733
1734 /* Try to get a buffer from the device pool.
1735 We can't use a buffer from ccp->bufctl because the write
1736 command will last beond a release() */
1737 bp = NULL;
1738 spin_lock_irqsave (&cp->bufctl.lock, flags);
1739 if (!list_empty (&cp->bufctl.free_buff_list)) {
1740 /* yes: get the entry */
1741 struct list_head *tmp = cp->bufctl.free_buff_list.next;
1742 list_del (tmp);
1743 bp = list_entry (tmp, auerbuf_t, buff_list);
1744 }
1745 spin_unlock_irqrestore (&cp->bufctl.lock, flags);
1746
1747 /* are there any buffers left? */
1748 if (!bp) {
1749 up (&cp->mutex);
1750 up (&ccp->mutex);
1751
1752 /* NONBLOCK: don't wait */
1753 if (file->f_flags & O_NONBLOCK) {
1754 set_current_state (TASK_RUNNING);
1755 remove_wait_queue (&cp->bufferwait, &wait);
1756 return -EAGAIN;
1757 }
1758
1759 /* BLOCKING: wait */
1760 schedule();
1761 remove_wait_queue (&cp->bufferwait, &wait);
1762 if (signal_pending (current)) {
1763 /* waked up by a signal */
1764 return -ERESTARTSYS;
1765 }
1766 goto write_again;
1767 } else {
1768 set_current_state (TASK_RUNNING);
1769 remove_wait_queue (&cp->bufferwait, &wait);
1770 }
1771
1772 /* protect against too big write requests */
1773 if (len > cp->maxControlLength)
1774 len = cp->maxControlLength;
1775
1776 /* Fill the buffer */
1777 if (copy_from_user ( bp->bufp+AUH_SIZE, buf, len)) {
1778 dbg ("copy_from_user failed");
1779 auerbuf_releasebuf (bp);
1780 /* Wake up all processes waiting for a buffer */
1781 wake_up (&cp->bufferwait);
1782 up (&cp->mutex);
1783 up (&ccp->mutex);
1784 return -EFAULT;
1785 }
1786
1787 /* set the header byte */
1788 *(bp->bufp) = ccp->scontext.id | AUH_DIRECT | AUH_UNSPLIT;
1789
1790 /* Set the transfer Parameters */
1791 bp->len = len+AUH_SIZE;
1792 bp->dr->bRequestType = AUT_WREQ;
1793 bp->dr->bRequest = AUV_WBLOCK;
1794 bp->dr->wValue = cpu_to_le16 (0);
1795 bp->dr->wIndex = cpu_to_le16 (ccp->scontext.id | AUH_DIRECT | AUH_UNSPLIT);
1796 bp->dr->wLength = cpu_to_le16 (len+AUH_SIZE);
1797 usb_fill_control_urb (bp->urbp, cp->usbdev, usb_sndctrlpipe (cp->usbdev, 0),
1798 (unsigned char*)bp->dr, bp->bufp, len+AUH_SIZE,
1799 auerchar_ctrlwrite_complete, bp);
1800 /* up we go */
1801 ret = auerchain_submit_urb (&cp->controlchain, bp->urbp);
1802 up (&cp->mutex);
1803 if (ret) {
1804 dbg ("auerchar_write: nonzero result of auerchain_submit_urb %d", ret);
1805 auerbuf_releasebuf (bp);
1806 /* Wake up all processes waiting for a buffer */
1807 wake_up (&cp->bufferwait);
1808 up (&ccp->mutex);
1809 return -EIO;
1810 }
1811 else {
1812 dbg ("auerchar_write: Write OK");
1813 up (&ccp->mutex);
1814 return len;
1815 }
1816 }
1817
1818
1819 /* Close a character device */
1820 static int auerchar_release (struct inode *inode, struct file *file)
1821 {
1822 pauerchar_t ccp = (pauerchar_t) file->private_data;
1823 pauerswald_t cp;
1824 dbg("release");
1825
1826 /* get the mutexes */
1827 if (down_interruptible (&ccp->mutex)) {
1828 return -ERESTARTSYS;
1829 }
1830 cp = ccp->auerdev;
1831 if (cp) {
1832 if (down_interruptible (&cp->mutex)) {
1833 up (&ccp->mutex);
1834 return -ERESTARTSYS;
1835 }
1836 /* remove an open service */
1837 auerswald_removeservice (cp, &ccp->scontext);
1838 /* detach from device */
1839 if ((--cp->open_count <= 0) && (cp->usbdev == NULL)) {
1840 /* usb device waits for removal */
1841 up (&cp->mutex);
1842 auerswald_delete (cp);
1843 } else {
1844 up (&cp->mutex);
1845 }
1846 cp = NULL;
1847 ccp->auerdev = NULL;
1848 }
1849 up (&ccp->mutex);
1850 auerchar_delete (ccp);
1851
1852 return 0;
1853 }
1854
1855
1856 /*----------------------------------------------------------------------*/
1857 /* File operation structure */
1858 static const struct file_operations auerswald_fops =
1859 {
1860 .owner = THIS_MODULE,
1861 .llseek = no_llseek,
1862 .read = auerchar_read,
1863 .write = auerchar_write,
1864 .ioctl = auerchar_ioctl,
1865 .open = auerchar_open,
1866 .release = auerchar_release,
1867 };
1868
1869 static struct usb_class_driver auerswald_class = {
1870 .name = "auer%d",
1871 .fops = &auerswald_fops,
1872 .minor_base = AUER_MINOR_BASE,
1873 };
1874
1875
1876 /* --------------------------------------------------------------------- */
1877 /* Special USB driver functions */
1878
1879 /* Probe if this driver wants to serve an USB device
1880
1881 This entry point is called whenever a new device is attached to the bus.
1882 Then the device driver has to create a new instance of its internal data
1883 structures for the new device.
1884
1885 The dev argument specifies the device context, which contains pointers
1886 to all USB descriptors. The interface argument specifies the interface
1887 number. If a USB driver wants to bind itself to a particular device and
1888 interface it has to return a pointer. This pointer normally references
1889 the device driver's context structure.
1890
1891 Probing normally is done by checking the vendor and product identifications
1892 or the class and subclass definitions. If they match the interface number
1893 is compared with the ones supported by the driver. When probing is done
1894 class based it might be necessary to parse some more USB descriptors because
1895 the device properties can differ in a wide range.
1896 */
1897 static int auerswald_probe (struct usb_interface *intf,
1898 const struct usb_device_id *id)
1899 {
1900 struct usb_device *usbdev = interface_to_usbdev(intf);
1901 pauerswald_t cp = NULL;
1902 unsigned int u = 0;
1903 __le16 *pbuf;
1904 int ret;
1905
1906 dbg ("probe: vendor id 0x%x, device id 0x%x",
1907 le16_to_cpu(usbdev->descriptor.idVendor),
1908 le16_to_cpu(usbdev->descriptor.idProduct));
1909
1910 /* we use only the first -and only- interface */
1911 if (intf->altsetting->desc.bInterfaceNumber != 0)
1912 return -ENODEV;
1913
1914 /* allocate memory for our device and initialize it */
1915 cp = kmalloc (sizeof(auerswald_t), GFP_KERNEL);
1916 if (cp == NULL) {
1917 err ("out of memory");
1918 goto pfail;
1919 }
1920
1921 /* Initialize device descriptor */
1922 memset (cp, 0, sizeof(auerswald_t));
1923 init_MUTEX (&cp->mutex);
1924 cp->usbdev = usbdev;
1925 auerchain_init (&cp->controlchain);
1926 auerbuf_init (&cp->bufctl);
1927 init_waitqueue_head (&cp->bufferwait);
1928
1929 ret = usb_register_dev(intf, &auerswald_class);
1930 if (ret) {
1931 err ("Not able to get a minor for this device.");
1932 goto pfail;
1933 }
1934
1935 /* Give the device a name */
1936 sprintf (cp->name, "usb/auer%d", intf->minor);
1937
1938 /* Store the index */
1939 cp->dtindex = intf->minor;
1940
1941 /* Get the usb version of the device */
1942 cp->version = le16_to_cpu(cp->usbdev->descriptor.bcdDevice);
1943 dbg ("Version is %X", cp->version);
1944
1945 /* allow some time to settle the device */
1946 msleep(334);
1947
1948 /* Try to get a suitable textual description of the device */
1949 /* Device name:*/
1950 ret = usb_string( cp->usbdev, AUSI_DEVICE, cp->dev_desc, AUSI_DLEN-1);
1951 if (ret >= 0) {
1952 u += ret;
1953 /* Append Serial Number */
1954 memcpy(&cp->dev_desc[u], ",Ser# ", 6);
1955 u += 6;
1956 ret = usb_string( cp->usbdev, AUSI_SERIALNR, &cp->dev_desc[u], AUSI_DLEN-u-1);
1957 if (ret >= 0) {
1958 u += ret;
1959 /* Append subscriber number */
1960 memcpy(&cp->dev_desc[u], ", ", 2);
1961 u += 2;
1962 ret = usb_string( cp->usbdev, AUSI_MSN, &cp->dev_desc[u], AUSI_DLEN-u-1);
1963 if (ret >= 0) {
1964 u += ret;
1965 }
1966 }
1967 }
1968 cp->dev_desc[u] = '\0';
1969 info("device is a %s", cp->dev_desc);
1970
1971 /* get the maximum allowed control transfer length */
1972 pbuf = kmalloc(2, GFP_KERNEL); /* use an allocated buffer because of urb target */
1973 if (!pbuf) {
1974 err( "out of memory");
1975 goto pfail;
1976 }
1977 ret = usb_control_msg(cp->usbdev, /* pointer to device */
1978 usb_rcvctrlpipe( cp->usbdev, 0 ), /* pipe to control endpoint */
1979 AUV_GETINFO, /* USB message request value */
1980 AUT_RREQ, /* USB message request type value */
1981 0, /* USB message value */
1982 AUDI_MBCTRANS, /* USB message index value */
1983 pbuf, /* pointer to the receive buffer */
1984 2, /* length of the buffer */
1985 2000); /* time to wait for the message to complete before timing out */
1986 if (ret == 2) {
1987 cp->maxControlLength = le16_to_cpup(pbuf);
1988 kfree(pbuf);
1989 dbg("setup: max. allowed control transfersize is %d bytes", cp->maxControlLength);
1990 } else {
1991 kfree(pbuf);
1992 err("setup: getting max. allowed control transfer length failed with error %d", ret);
1993 goto pfail;
1994 }
1995
1996 /* allocate a chain for the control messages */
1997 if (auerchain_setup (&cp->controlchain, AUCH_ELEMENTS)) {
1998 err ("out of memory");
1999 goto pfail;
2000 }
2001
2002 /* allocate buffers for control messages */
2003 if (auerbuf_setup (&cp->bufctl, AU_RBUFFERS, cp->maxControlLength+AUH_SIZE)) {
2004 err ("out of memory");
2005 goto pfail;
2006 }
2007
2008 /* start the interrupt endpoint */
2009 if (auerswald_int_open (cp)) {
2010 err ("int endpoint failed");
2011 goto pfail;
2012 }
2013
2014 /* all OK */
2015 usb_set_intfdata (intf, cp);
2016 return 0;
2017
2018 /* Error exit: clean up the memory */
2019 pfail: auerswald_delete (cp);
2020 return -EIO;
2021 }
2022
2023
2024 /* Disconnect driver from a served device
2025
2026 This function is called whenever a device which was served by this driver
2027 is disconnected.
2028
2029 The argument dev specifies the device context and the driver_context
2030 returns a pointer to the previously registered driver_context of the
2031 probe function. After returning from the disconnect function the USB
2032 framework completely deallocates all data structures associated with
2033 this device. So especially the usb_device structure must not be used
2034 any longer by the usb driver.
2035 */
2036 static void auerswald_disconnect (struct usb_interface *intf)
2037 {
2038 pauerswald_t cp = usb_get_intfdata (intf);
2039 unsigned int u;
2040
2041 usb_set_intfdata (intf, NULL);
2042 if (!cp)
2043 return;
2044
2045 down (&cp->mutex);
2046 info ("device /dev/%s now disconnecting", cp->name);
2047
2048 /* give back our USB minor number */
2049 usb_deregister_dev(intf, &auerswald_class);
2050
2051 /* Stop the interrupt endpoint */
2052 auerswald_int_release (cp);
2053
2054 /* remove the control chain allocated in auerswald_probe
2055 This has the benefit of
2056 a) all pending (a)synchronous urbs are unlinked
2057 b) all buffers dealing with urbs are reclaimed
2058 */
2059 auerchain_free (&cp->controlchain);
2060
2061 if (cp->open_count == 0) {
2062 /* nobody is using this device. So we can clean up now */
2063 up (&cp->mutex);/* up() is possible here because no other task
2064 can open the device (see above). I don't want
2065 to kfree() a locked mutex. */
2066 auerswald_delete (cp);
2067 } else {
2068 /* device is used. Remove the pointer to the
2069 usb device (it's not valid any more). The last
2070 release() will do the clean up */
2071 cp->usbdev = NULL;
2072 up (&cp->mutex);
2073 /* Terminate waiting writers */
2074 wake_up (&cp->bufferwait);
2075 /* Inform all waiting readers */
2076 for ( u = 0; u < AUH_TYPESIZE; u++) {
2077 pauerscon_t scp = cp->services[u];
2078 if (scp)
2079 scp->disconnect( scp);
2080 }
2081 }
2082 }
2083
2084 /* Descriptor for the devices which are served by this driver.
2085 NOTE: this struct is parsed by the usbmanager install scripts.
2086 Don't change without caution!
2087 */
2088 static struct usb_device_id auerswald_ids [] = {
2089 { USB_DEVICE (ID_AUERSWALD, 0x00C0) }, /* COMpact 2104 USB */
2090 { USB_DEVICE (ID_AUERSWALD, 0x00DB) }, /* COMpact 4410/2206 USB */
2091 { USB_DEVICE (ID_AUERSWALD, 0x00DC) }, /* COMpact 4406 DSL */
2092 { USB_DEVICE (ID_AUERSWALD, 0x00DD) }, /* COMpact 2204 USB */
2093 { USB_DEVICE (ID_AUERSWALD, 0x00F1) }, /* Comfort 2000 System Telephone */
2094 { USB_DEVICE (ID_AUERSWALD, 0x00F2) }, /* Comfort 1200 System Telephone */
2095 { } /* Terminating entry */
2096 };
2097
2098 /* Standard module device table */
2099 MODULE_DEVICE_TABLE (usb, auerswald_ids);
2100
2101 /* Standard usb driver struct */
2102 static struct usb_driver auerswald_driver = {
2103 .name = "auerswald",
2104 .probe = auerswald_probe,
2105 .disconnect = auerswald_disconnect,
2106 .id_table = auerswald_ids,
2107 };
2108
2109
2110 /* --------------------------------------------------------------------- */
2111 /* Module loading/unloading */
2112
2113 /* Driver initialisation. Called after module loading.
2114 NOTE: there is no concurrency at _init
2115 */
2116 static int __init auerswald_init (void)
2117 {
2118 int result;
2119 dbg ("init");
2120
2121 /* register driver at the USB subsystem */
2122 result = usb_register (&auerswald_driver);
2123 if (result < 0) {
2124 err ("driver could not be registered");
2125 return -1;
2126 }
2127 return 0;
2128 }
2129
2130 /* Driver deinit. Called before module removal.
2131 NOTE: there is no concurrency at _cleanup
2132 */
2133 static void __exit auerswald_cleanup (void)
2134 {
2135 dbg ("cleanup");
2136 usb_deregister (&auerswald_driver);
2137 }
2138
2139 /* --------------------------------------------------------------------- */
2140 /* Linux device driver module description */
2141
2142 MODULE_AUTHOR (DRIVER_AUTHOR);
2143 MODULE_DESCRIPTION (DRIVER_DESC);
2144 MODULE_LICENSE ("GPL");
2145
2146 module_init (auerswald_init);
2147 module_exit (auerswald_cleanup);
2148
2149 /* --------------------------------------------------------------------- */
2150