4 * $Id: hfc_usb.c,v 2.3.2.13 2006/02/17 17:17:22 mbachem Exp $
6 * modular HiSax ISDN driver for Colognechip HFC-S USB chip
8 * Authors : Peter Sprenger (sprenger@moving-bytes.de)
9 * Martin Bachem (info@colognechip.com)
11 * based on the first hfc_usb driver of
12 * Werner Cornelius (werner@isdn-development.de)
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2, or (at your option)
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 * See Version Histroy at the bottom of this file
32 #include <linux/types.h>
33 #include <linux/stddef.h>
34 #include <linux/timer.h>
35 #include <linux/init.h>
36 #include <linux/module.h>
37 #include <linux/kernel_stat.h>
38 #include <linux/usb.h>
39 #include <linux/kernel.h>
40 #include <linux/smp_lock.h>
45 static const char *hfcusb_revision
=
46 "$Revision: 2.3.2.13 $ $Date: 2006/02/17 17:17:22 $ ";
48 /* Hisax debug support
49 * use "modprobe debug=x" where x is bitfield of USB_DBG & ISDN_DBG
51 #ifdef CONFIG_HISAX_DEBUG
52 #include <linux/moduleparam.h>
53 #define __debug_variable hfc_debug
54 #include "hisax_debug.h"
56 module_param(debug
, uint
, 0);
60 /* private vendor specific data */
62 __u8 led_scheme
; // led display scheme
63 signed short led_bits
[8]; // array of 8 possible LED bitmask settings
64 char *vend_name
; // device name
67 /****************************************/
68 /* data defining the devices to be used */
69 /****************************************/
70 static struct usb_device_id hfcusb_idtab
[] = {
72 USB_DEVICE(0x0959, 0x2bd0),
73 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
74 {LED_OFF
, {4, 0, 2, 1},
75 "ISDN USB TA (Cologne Chip HFC-S USB based)"}),
78 USB_DEVICE(0x0675, 0x1688),
79 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
80 {LED_SCHEME1
, {1, 2, 0, 0},
81 "DrayTek miniVigor 128 USB ISDN TA"}),
84 USB_DEVICE(0x07b0, 0x0007),
85 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
86 {LED_SCHEME1
, {0x80, -64, -32, -16},
87 "Billion tiny USB ISDN TA 128"}),
90 USB_DEVICE(0x0742, 0x2008),
91 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
92 {LED_SCHEME1
, {4, 0, 2, 1},
96 USB_DEVICE(0x0742, 0x2009),
97 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
98 {LED_SCHEME1
, {4, 0, 2, 1},
99 "Aceex USB ISDN TA"}),
102 USB_DEVICE(0x0742, 0x200A),
103 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
104 {LED_SCHEME1
, {4, 0, 2, 1},
108 USB_DEVICE(0x08e3, 0x0301),
109 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
110 {LED_SCHEME1
, {2, 0, 1, 4},
114 USB_DEVICE(0x07fa, 0x0846),
115 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
116 {LED_SCHEME1
, {0x80, -64, -32, -16},
117 "Bewan Modem RNIS USB"}),
120 USB_DEVICE(0x07fa, 0x0847),
121 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
122 {LED_SCHEME1
, {0x80, -64, -32, -16},
123 "Djinn Numeris USB"}),
126 USB_DEVICE(0x07b0, 0x0006),
127 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
128 {LED_SCHEME1
, {0x80, -64, -32, -16},
134 /***************************************************************/
135 /* structure defining input+output fifos (interrupt/bulk mode) */
136 /***************************************************************/
137 struct usb_fifo
; /* forward definition */
138 typedef struct iso_urb_struct
{
140 __u8 buffer
[ISO_BUFFER_SIZE
]; /* buffer incoming/outgoing data */
141 struct usb_fifo
*owner_fifo
; /* pointer to owner fifo */
145 struct hfcusb_data
; /* forward definition */
146 typedef struct usb_fifo
{
147 int fifonum
; /* fifo index attached to this structure */
148 int active
; /* fifo is currently active */
149 struct hfcusb_data
*hfc
; /* pointer to main structure */
150 int pipe
; /* address of endpoint */
151 __u8 usb_packet_maxlen
; /* maximum length for usb transfer */
152 unsigned int max_size
; /* maximum size of receive/send packet */
153 __u8 intervall
; /* interrupt interval */
154 struct sk_buff
*skbuff
; /* actual used buffer */
155 struct urb
*urb
; /* transfer structure for usb routines */
156 __u8 buffer
[128]; /* buffer incoming/outgoing data */
157 int bit_line
; /* how much bits are in the fifo? */
159 volatile __u8 usb_transfer_mode
; /* switched between ISO and INT */
160 iso_urb_struct iso
[2]; /* need two urbs to have one always for pending */
161 struct hisax_if
*hif
; /* hisax interface */
162 int delete_flg
; /* only delete skbuff once */
163 int last_urblen
; /* remember length of last packet */
167 /*********************************************/
168 /* structure holding all data for one device */
169 /*********************************************/
170 typedef struct hfcusb_data
{
171 /* HiSax Interface for loadable Layer1 drivers */
172 struct hisax_d_if d_if
; /* see hisax_if.h */
173 struct hisax_b_if b_if
[2]; /* see hisax_if.h */
176 struct usb_device
*dev
; /* our device */
177 int if_used
; /* used interface number */
178 int alt_used
; /* used alternate config */
179 int ctrl_paksize
; /* control pipe packet size */
180 int ctrl_in_pipe
, ctrl_out_pipe
; /* handles for control pipe */
181 int cfg_used
; /* configuration index used */
182 int vend_idx
; /* vendor found */
183 int b_mode
[2]; /* B-channel mode */
184 int l1_activated
; /* layer 1 activated */
185 int disc_flag
; /* 'true' if device was disonnected to avoid some USB actions */
186 int packet_size
, iso_packet_size
;
188 /* control pipe background handling */
189 ctrl_buft ctrl_buff
[HFC_CTRL_BUFSIZE
]; /* buffer holding queued data */
190 volatile int ctrl_in_idx
, ctrl_out_idx
, ctrl_cnt
; /* input/output pointer + count */
191 struct urb
*ctrl_urb
; /* transfer structure for control channel */
193 struct usb_ctrlrequest ctrl_write
; /* buffer for control write request */
194 struct usb_ctrlrequest ctrl_read
; /* same for read request */
196 __u8 old_led_state
, led_state
, led_new_data
, led_b_active
;
198 volatile __u8 threshold_mask
; /* threshold actually reported */
199 volatile __u8 bch_enables
; /* or mask for sctrl_r and sctrl register values */
201 usb_fifo fifos
[HFCUSB_NUM_FIFOS
]; /* structure holding all fifo data */
203 volatile __u8 l1_state
; /* actual l1 state */
204 struct timer_list t3_timer
; /* timer 3 for activation/deactivation */
205 struct timer_list t4_timer
; /* timer 4 for activation/deactivation */
209 static void collect_rx_frame(usb_fifo
* fifo
, __u8
* data
, int len
,
213 static inline const char *
214 symbolic(struct hfcusb_symbolic_list list
[], const int num
)
217 for (i
= 0; list
[i
].name
!= NULL
; i
++)
218 if (list
[i
].num
== num
)
219 return (list
[i
].name
);
220 return "<unknown ERROR>";
224 /******************************************************/
225 /* start next background transfer for control channel */
226 /******************************************************/
228 ctrl_start_transfer(hfcusb_data
* hfc
)
231 hfc
->ctrl_urb
->pipe
= hfc
->ctrl_out_pipe
;
232 hfc
->ctrl_urb
->setup_packet
= (u_char
*) & hfc
->ctrl_write
;
233 hfc
->ctrl_urb
->transfer_buffer
= NULL
;
234 hfc
->ctrl_urb
->transfer_buffer_length
= 0;
235 hfc
->ctrl_write
.wIndex
=
236 cpu_to_le16(hfc
->ctrl_buff
[hfc
->ctrl_out_idx
].hfc_reg
);
237 hfc
->ctrl_write
.wValue
=
238 cpu_to_le16(hfc
->ctrl_buff
[hfc
->ctrl_out_idx
].reg_val
);
240 usb_submit_urb(hfc
->ctrl_urb
, GFP_ATOMIC
); /* start transfer */
242 } /* ctrl_start_transfer */
244 /************************************/
245 /* queue a control transfer request */
246 /* return 0 on success. */
247 /************************************/
249 queue_control_request(hfcusb_data
* hfc
, __u8 reg
, __u8 val
, int action
)
253 if (hfc
->ctrl_cnt
>= HFC_CTRL_BUFSIZE
)
254 return (1); /* no space left */
255 buf
= &hfc
->ctrl_buff
[hfc
->ctrl_in_idx
]; /* pointer to new index */
258 buf
->action
= action
;
259 if (++hfc
->ctrl_in_idx
>= HFC_CTRL_BUFSIZE
)
260 hfc
->ctrl_in_idx
= 0; /* pointer wrap */
261 if (++hfc
->ctrl_cnt
== 1)
262 ctrl_start_transfer(hfc
);
264 } /* queue_control_request */
267 control_action_handler(hfcusb_data
* hfc
, int reg
, int val
, int action
)
270 return (1); /* no action defined */
274 /***************************************************************/
275 /* control completion routine handling background control cmds */
276 /***************************************************************/
278 ctrl_complete(struct urb
*urb
)
280 hfcusb_data
*hfc
= (hfcusb_data
*) urb
->context
;
285 buf
= &hfc
->ctrl_buff
[hfc
->ctrl_out_idx
];
286 control_action_handler(hfc
, buf
->hfc_reg
, buf
->reg_val
,
289 hfc
->ctrl_cnt
--; /* decrement actual count */
290 if (++hfc
->ctrl_out_idx
>= HFC_CTRL_BUFSIZE
)
291 hfc
->ctrl_out_idx
= 0; /* pointer wrap */
293 ctrl_start_transfer(hfc
); /* start next transfer */
295 } /* ctrl_complete */
297 /***************************************************/
298 /* write led data to auxport & invert if necessary */
299 /***************************************************/
301 write_led(hfcusb_data
* hfc
, __u8 led_state
)
303 if (led_state
!= hfc
->old_led_state
) {
304 hfc
->old_led_state
= led_state
;
305 queue_control_request(hfc
, HFCUSB_P_DATA
, led_state
, 1);
309 /**************************/
310 /* handle LED bits */
311 /**************************/
313 set_led_bit(hfcusb_data
* hfc
, signed short led_bits
, int unset
)
317 hfc
->led_state
|= abs(led_bits
);
319 hfc
->led_state
&= ~led_bits
;
322 hfc
->led_state
&= ~abs(led_bits
);
324 hfc
->led_state
|= led_bits
;
328 /**************************/
329 /* handle LED requests */
330 /**************************/
332 handle_led(hfcusb_data
* hfc
, int event
)
334 hfcsusb_vdata
*driver_info
=
335 (hfcsusb_vdata
*) hfcusb_idtab
[hfc
->vend_idx
].driver_info
;
337 /* if no scheme -> no LED action */
338 if (driver_info
->led_scheme
== LED_OFF
)
343 set_led_bit(hfc
, driver_info
->led_bits
[0],
345 set_led_bit(hfc
, driver_info
->led_bits
[1],
347 set_led_bit(hfc
, driver_info
->led_bits
[2],
349 set_led_bit(hfc
, driver_info
->led_bits
[3],
352 case LED_POWER_OFF
: /* no Power off handling */
355 set_led_bit(hfc
, driver_info
->led_bits
[1],
359 set_led_bit(hfc
, driver_info
->led_bits
[1],
363 set_led_bit(hfc
, driver_info
->led_bits
[2],
367 set_led_bit(hfc
, driver_info
->led_bits
[2],
371 set_led_bit(hfc
, driver_info
->led_bits
[3],
375 set_led_bit(hfc
, driver_info
->led_bits
[3],
379 write_led(hfc
, hfc
->led_state
);
382 /********************************/
383 /* called when timer t3 expires */
384 /********************************/
386 l1_timer_expire_t3(hfcusb_data
* hfc
)
388 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
, PH_DEACTIVATE
| INDICATION
,
390 #ifdef CONFIG_HISAX_DEBUG
392 "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T3 expire)");
394 hfc
->l1_activated
= false;
395 handle_led(hfc
, LED_S0_OFF
);
397 queue_control_request(hfc
, HFCUSB_STATES
, 0x10, 1);
398 queue_control_request(hfc
, HFCUSB_STATES
, 3, 1);
401 /********************************/
402 /* called when timer t4 expires */
403 /********************************/
405 l1_timer_expire_t4(hfcusb_data
* hfc
)
407 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
, PH_DEACTIVATE
| INDICATION
,
409 #ifdef CONFIG_HISAX_DEBUG
411 "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T4 expire)");
413 hfc
->l1_activated
= false;
414 handle_led(hfc
, LED_S0_OFF
);
417 /*****************************/
418 /* handle S0 state changes */
419 /*****************************/
421 state_handler(hfcusb_data
* hfc
, __u8 state
)
425 old_state
= hfc
->l1_state
;
426 if (state
== old_state
|| state
< 1 || state
> 8)
429 #ifdef CONFIG_HISAX_DEBUG
430 DBG(ISDN_DBG
, "HFC-S USB: new S0 state:%d old_state:%d", state
,
433 if (state
< 4 || state
== 7 || state
== 8) {
434 if (timer_pending(&hfc
->t3_timer
))
435 del_timer(&hfc
->t3_timer
);
436 #ifdef CONFIG_HISAX_DEBUG
437 DBG(ISDN_DBG
, "HFC-S USB: T3 deactivated");
441 if (timer_pending(&hfc
->t4_timer
))
442 del_timer(&hfc
->t4_timer
);
443 #ifdef CONFIG_HISAX_DEBUG
444 DBG(ISDN_DBG
, "HFC-S USB: T4 deactivated");
448 if (state
== 7 && !hfc
->l1_activated
) {
449 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
,
450 PH_ACTIVATE
| INDICATION
, NULL
);
451 #ifdef CONFIG_HISAX_DEBUG
452 DBG(ISDN_DBG
, "HFC-S USB: PH_ACTIVATE | INDICATION sent");
454 hfc
->l1_activated
= true;
455 handle_led(hfc
, LED_S0_ON
);
456 } else if (state
<= 3 /* && activated */ ) {
457 if (old_state
== 7 || old_state
== 8) {
458 #ifdef CONFIG_HISAX_DEBUG
459 DBG(ISDN_DBG
, "HFC-S USB: T4 activated");
461 if (!timer_pending(&hfc
->t4_timer
)) {
462 hfc
->t4_timer
.expires
=
463 jiffies
+ (HFC_TIMER_T4
* HZ
) / 1000;
464 add_timer(&hfc
->t4_timer
);
467 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
,
468 PH_DEACTIVATE
| INDICATION
,
470 #ifdef CONFIG_HISAX_DEBUG
472 "HFC-S USB: PH_DEACTIVATE | INDICATION sent");
474 hfc
->l1_activated
= false;
475 handle_led(hfc
, LED_S0_OFF
);
478 hfc
->l1_state
= state
;
481 /* prepare iso urb */
483 fill_isoc_urb(struct urb
*urb
, struct usb_device
*dev
, unsigned int pipe
,
484 void *buf
, int num_packets
, int packet_size
, int interval
,
485 usb_complete_t complete
, void *context
)
489 spin_lock_init(&urb
->lock
);
492 urb
->complete
= complete
;
493 urb
->number_of_packets
= num_packets
;
494 urb
->transfer_buffer_length
= packet_size
* num_packets
;
495 urb
->context
= context
;
496 urb
->transfer_buffer
= buf
;
497 urb
->transfer_flags
= URB_ISO_ASAP
;
498 urb
->actual_length
= 0;
499 urb
->interval
= interval
;
500 for (k
= 0; k
< num_packets
; k
++) {
501 urb
->iso_frame_desc
[k
].offset
= packet_size
* k
;
502 urb
->iso_frame_desc
[k
].length
= packet_size
;
503 urb
->iso_frame_desc
[k
].actual_length
= 0;
507 /* allocs urbs and start isoc transfer with two pending urbs to avoid
508 gaps in the transfer chain */
510 start_isoc_chain(usb_fifo
* fifo
, int num_packets_per_urb
,
511 usb_complete_t complete
, int packet_size
)
515 printk(KERN_INFO
"HFC-S USB: starting ISO-chain for Fifo %i\n",
518 /* allocate Memory for Iso out Urbs */
519 for (i
= 0; i
< 2; i
++) {
520 if (!(fifo
->iso
[i
].purb
)) {
522 usb_alloc_urb(num_packets_per_urb
, GFP_KERNEL
);
523 if (!(fifo
->iso
[i
].purb
)) {
525 "alloc urb for fifo %i failed!!!",
528 fifo
->iso
[i
].owner_fifo
= (struct usb_fifo
*) fifo
;
530 /* Init the first iso */
531 if (ISO_BUFFER_SIZE
>=
532 (fifo
->usb_packet_maxlen
*
533 num_packets_per_urb
)) {
534 fill_isoc_urb(fifo
->iso
[i
].purb
,
535 fifo
->hfc
->dev
, fifo
->pipe
,
538 fifo
->usb_packet_maxlen
,
539 fifo
->intervall
, complete
,
541 memset(fifo
->iso
[i
].buffer
, 0,
542 sizeof(fifo
->iso
[i
].buffer
));
543 /* defining packet delimeters in fifo->buffer */
544 for (k
= 0; k
< num_packets_per_urb
; k
++) {
546 iso_frame_desc
[k
].offset
=
549 iso_frame_desc
[k
].length
=
554 "HFC-S USB: ISO Buffer size to small!\n");
557 fifo
->bit_line
= BITLINE_INF
;
559 errcode
= usb_submit_urb(fifo
->iso
[i
].purb
, GFP_KERNEL
);
560 fifo
->active
= (errcode
>= 0) ? 1 : 0;
562 printk(KERN_INFO
"HFC-S USB: %s URB nr:%d\n",
563 symbolic(urb_errlist
, errcode
), i
);
566 return (fifo
->active
);
569 /* stops running iso chain and frees their pending urbs */
571 stop_isoc_chain(usb_fifo
* fifo
)
575 for (i
= 0; i
< 2; i
++) {
576 if (fifo
->iso
[i
].purb
) {
577 #ifdef CONFIG_HISAX_DEBUG
579 "HFC-S USB: Stopping iso chain for fifo %i.%i",
582 usb_unlink_urb(fifo
->iso
[i
].purb
);
583 usb_free_urb(fifo
->iso
[i
].purb
);
584 fifo
->iso
[i
].purb
= NULL
;
588 usb_unlink_urb(fifo
->urb
);
589 usb_free_urb(fifo
->urb
);
595 /* defines how much ISO packets are handled in one URB */
596 static int iso_packets
[8] =
597 { ISOC_PACKETS_B
, ISOC_PACKETS_B
, ISOC_PACKETS_B
, ISOC_PACKETS_B
,
598 ISOC_PACKETS_D
, ISOC_PACKETS_D
, ISOC_PACKETS_D
, ISOC_PACKETS_D
601 /*****************************************************/
602 /* transmit completion routine for all ISO tx fifos */
603 /*****************************************************/
605 tx_iso_complete(struct urb
*urb
)
607 iso_urb_struct
*context_iso_urb
= (iso_urb_struct
*) urb
->context
;
608 usb_fifo
*fifo
= context_iso_urb
->owner_fifo
;
609 hfcusb_data
*hfc
= fifo
->hfc
;
610 int k
, tx_offset
, num_isoc_packets
, sink
, len
, current_len
,
612 int frame_complete
, transp_mode
, fifon
, status
;
614 __u8 threshtable
[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 };
616 fifon
= fifo
->fifonum
;
617 status
= urb
->status
;
621 if (fifo
->active
&& !status
) {
623 if (fifon
< 4 && hfc
->b_mode
[fifon
/ 2] == L1_MODE_TRANS
)
626 /* is FifoFull-threshold set for our channel? */
627 threshbit
= threshtable
[fifon
] & hfc
->threshold_mask
;
628 num_isoc_packets
= iso_packets
[fifon
];
630 /* predict dataflow to avoid fifo overflow */
631 if (fifon
>= HFCUSB_D_TX
) {
632 sink
= (threshbit
) ? SINK_DMIN
: SINK_DMAX
;
634 sink
= (threshbit
) ? SINK_MIN
: SINK_MAX
;
636 fill_isoc_urb(urb
, fifo
->hfc
->dev
, fifo
->pipe
,
637 context_iso_urb
->buffer
, num_isoc_packets
,
638 fifo
->usb_packet_maxlen
, fifo
->intervall
,
639 tx_iso_complete
, urb
->context
);
640 memset(context_iso_urb
->buffer
, 0,
641 sizeof(context_iso_urb
->buffer
));
642 frame_complete
= false;
643 /* Generate next Iso Packets */
644 for (k
= 0; k
< num_isoc_packets
; ++k
) {
646 len
= fifo
->skbuff
->len
;
647 /* we lower data margin every msec */
648 fifo
->bit_line
-= sink
;
649 current_len
= (0 - fifo
->bit_line
) / 8;
650 /* maximum 15 byte for every ISO packet makes our life easier */
651 if (current_len
> 14)
655 current_len
) ? len
: current_len
;
656 /* how much bit do we put on the line? */
657 fifo
->bit_line
+= current_len
* 8;
659 context_iso_urb
->buffer
[tx_offset
] = 0;
660 if (current_len
== len
) {
662 /* here frame completion */
664 buffer
[tx_offset
] = 1;
665 /* add 2 byte flags and 16bit CRC at end of ISDN frame */
666 fifo
->bit_line
+= 32;
668 frame_complete
= true;
671 memcpy(context_iso_urb
->buffer
+
672 tx_offset
+ 1, fifo
->skbuff
->data
,
674 skb_pull(fifo
->skbuff
, current_len
);
676 /* define packet delimeters within the URB buffer */
677 urb
->iso_frame_desc
[k
].offset
= tx_offset
;
678 urb
->iso_frame_desc
[k
].length
=
681 tx_offset
+= (current_len
+ 1);
683 urb
->iso_frame_desc
[k
].offset
=
686 urb
->iso_frame_desc
[k
].length
= 1;
687 fifo
->bit_line
-= sink
; /* we lower data margin every msec */
689 if (fifo
->bit_line
< BITLINE_INF
) {
690 fifo
->bit_line
= BITLINE_INF
;
694 if (frame_complete
) {
695 fifo
->delete_flg
= true;
696 fifo
->hif
->l1l2(fifo
->hif
,
698 (void *) (unsigned long) fifo
->skbuff
->
700 if (fifo
->skbuff
&& fifo
->delete_flg
) {
701 dev_kfree_skb_any(fifo
->skbuff
);
703 fifo
->delete_flg
= false;
705 frame_complete
= false;
708 errcode
= usb_submit_urb(urb
, GFP_ATOMIC
);
711 "HFC-S USB: error submitting ISO URB: %d \n",
715 if (status
&& !hfc
->disc_flag
) {
717 "HFC-S USB: tx_iso_complete : urb->status %s (%i), fifonum=%d\n",
718 symbolic(urb_errlist
, status
), status
,
722 } /* tx_iso_complete */
724 /*****************************************************/
725 /* receive completion routine for all ISO tx fifos */
726 /*****************************************************/
728 rx_iso_complete(struct urb
*urb
)
730 iso_urb_struct
*context_iso_urb
= (iso_urb_struct
*) urb
->context
;
731 usb_fifo
*fifo
= context_iso_urb
->owner_fifo
;
732 hfcusb_data
*hfc
= fifo
->hfc
;
733 int k
, len
, errcode
, offset
, num_isoc_packets
, fifon
, maxlen
,
735 unsigned int iso_status
;
738 #ifdef CONFIG_HISAX_DEBUG
742 fifon
= fifo
->fifonum
;
743 status
= urb
->status
;
745 if (urb
->status
== -EOVERFLOW
) {
746 #ifdef CONFIG_HISAX_DEBUG
748 "HFC-USB: ignoring USB DATAOVERRUN for fifo %i \n",
753 if (fifo
->active
&& !status
) {
754 num_isoc_packets
= iso_packets
[fifon
];
755 maxlen
= fifo
->usb_packet_maxlen
;
756 for (k
= 0; k
< num_isoc_packets
; ++k
) {
757 len
= urb
->iso_frame_desc
[k
].actual_length
;
758 offset
= urb
->iso_frame_desc
[k
].offset
;
759 buf
= context_iso_urb
->buffer
+ offset
;
760 iso_status
= urb
->iso_frame_desc
[k
].status
;
761 #ifdef CONFIG_HISAX_DEBUG
762 if (iso_status
&& !hfc
->disc_flag
)
764 "HFC-S USB: ISO packet failure - status:%x",
767 if ((fifon
== 5) && (debug
> 1)) {
769 "HFC-S USB: ISO-D-RX lst_urblen:%2d "
770 "act_urblen:%2d max-urblen:%2d "
772 fifo
->last_urblen
, len
, maxlen
,
774 for (i
= 0; i
< len
; i
++)
775 printk("%.2x ", buf
[i
]);
779 if (fifo
->last_urblen
!= maxlen
) {
780 /* the threshold mask is in the 2nd status byte */
781 hfc
->threshold_mask
= buf
[1];
782 /* care for L1 state only for D-Channel
783 to avoid overlapped iso completions */
785 /* the S0 state is in the upper half
786 of the 1st status byte */
787 state_handler(hfc
, buf
[0] >> 4);
789 eof
[fifon
] = buf
[0] & 1;
791 collect_rx_frame(fifo
, buf
+ 2,
797 collect_rx_frame(fifo
, buf
, len
,
799 maxlen
) ? eof
[fifon
] :
802 fifo
->last_urblen
= len
;
805 fill_isoc_urb(urb
, fifo
->hfc
->dev
, fifo
->pipe
,
806 context_iso_urb
->buffer
, num_isoc_packets
,
807 fifo
->usb_packet_maxlen
, fifo
->intervall
,
808 rx_iso_complete
, urb
->context
);
809 errcode
= usb_submit_urb(urb
, GFP_ATOMIC
);
812 "HFC-S USB: error submitting ISO URB: %d \n",
816 if (status
&& !hfc
->disc_flag
) {
818 "HFC-S USB: rx_iso_complete : "
819 "urb->status %d, fifonum %d\n",
823 } /* rx_iso_complete */
825 /*****************************************************/
826 /* collect data from interrupt or isochron in */
827 /*****************************************************/
829 collect_rx_frame(usb_fifo
* fifo
, __u8
* data
, int len
, int finish
)
831 hfcusb_data
*hfc
= fifo
->hfc
;
832 int transp_mode
, fifon
;
833 #ifdef CONFIG_HISAX_DEBUG
836 fifon
= fifo
->fifonum
;
838 if (fifon
< 4 && hfc
->b_mode
[fifon
/ 2] == L1_MODE_TRANS
)
842 fifo
->skbuff
= dev_alloc_skb(fifo
->max_size
+ 3);
845 "HFC-S USB: cannot allocate buffer (dev_alloc_skb) fifo:%d\n",
851 if (fifo
->skbuff
->len
+ len
< fifo
->max_size
) {
852 memcpy(skb_put(fifo
->skbuff
, len
), data
, len
);
854 #ifdef CONFIG_HISAX_DEBUG
855 printk(KERN_INFO
"HFC-S USB: ");
856 for (i
= 0; i
< 15; i
++)
858 fifo
->skbuff
->data
[fifo
->skbuff
->
863 "HCF-USB: got frame exceeded fifo->max_size:%d on fifo:%d\n",
864 fifo
->max_size
, fifon
);
867 if (transp_mode
&& fifo
->skbuff
->len
>= 128) {
868 fifo
->hif
->l1l2(fifo
->hif
, PH_DATA
| INDICATION
,
873 /* we have a complete hdlc packet */
875 if ((!fifo
->skbuff
->data
[fifo
->skbuff
->len
- 1])
876 && (fifo
->skbuff
->len
> 3)) {
877 /* remove CRC & status */
878 skb_trim(fifo
->skbuff
, fifo
->skbuff
->len
- 3);
879 if (fifon
== HFCUSB_PCM_RX
) {
880 fifo
->hif
->l1l2(fifo
->hif
,
881 PH_DATA_E
| INDICATION
,
884 fifo
->hif
->l1l2(fifo
->hif
,
885 PH_DATA
| INDICATION
,
887 fifo
->skbuff
= NULL
; /* buffer was freed from upper layer */
889 if (fifo
->skbuff
->len
> 3) {
891 "HFC-S USB: got frame %d bytes but CRC ERROR on fifo:%d!!!\n",
892 fifo
->skbuff
->len
, fifon
);
893 #ifdef CONFIG_HISAX_DEBUG
895 printk(KERN_INFO
"HFC-S USB: ");
896 for (i
= 0; i
< 15; i
++)
905 #ifdef CONFIG_HISAX_DEBUG
908 "HFC-S USB: frame to small (%d bytes)!!!\n",
912 skb_trim(fifo
->skbuff
, 0);
917 /***********************************************/
918 /* receive completion routine for all rx fifos */
919 /***********************************************/
921 rx_complete(struct urb
*urb
)
925 __u8
*buf
, maxlen
, fifon
;
926 usb_fifo
*fifo
= (usb_fifo
*) urb
->context
;
927 hfcusb_data
*hfc
= fifo
->hfc
;
929 #ifdef CONFIG_HISAX_DEBUG
933 urb
->dev
= hfc
->dev
; /* security init */
935 fifon
= fifo
->fifonum
;
936 if ((!fifo
->active
) || (urb
->status
)) {
937 #ifdef CONFIG_HISAX_DEBUG
938 DBG(USB_DBG
, "HFC-S USB: RX-Fifo %i is going down (%i)",
941 fifo
->urb
->interval
= 0; /* cancel automatic rescheduling */
943 dev_kfree_skb_any(fifo
->skbuff
);
948 len
= urb
->actual_length
;
950 maxlen
= fifo
->usb_packet_maxlen
;
952 #ifdef CONFIG_HISAX_DEBUG
953 if ((fifon
== 5) && (debug
> 1)) {
955 "HFC-S USB: INT-D-RX lst_urblen:%2d act_urblen:%2d max-urblen:%2d EOF:0x%0x DATA: ",
956 fifo
->last_urblen
, len
, maxlen
, eof
[5]);
957 for (i
= 0; i
< len
; i
++)
958 printk("%.2x ", buf
[i
]);
963 if (fifo
->last_urblen
!= fifo
->usb_packet_maxlen
) {
964 /* the threshold mask is in the 2nd status byte */
965 hfc
->threshold_mask
= buf
[1];
966 /* the S0 state is in the upper half of the 1st status byte */
967 state_handler(hfc
, buf
[0] >> 4);
968 eof
[fifon
] = buf
[0] & 1;
969 /* if we have more than the 2 status bytes -> collect data */
971 collect_rx_frame(fifo
, buf
+ 2,
972 urb
->actual_length
- 2,
973 (len
< maxlen
) ? eof
[fifon
] : 0);
975 collect_rx_frame(fifo
, buf
, urb
->actual_length
,
976 (len
< maxlen
) ? eof
[fifon
] : 0);
978 fifo
->last_urblen
= urb
->actual_length
;
979 status
= usb_submit_urb(urb
, GFP_ATOMIC
);
982 "HFC-S USB: error resubmitting URN at rx_complete...\n");
986 /***************************************************/
987 /* start the interrupt transfer for the given fifo */
988 /***************************************************/
990 start_int_fifo(usb_fifo
* fifo
)
994 printk(KERN_INFO
"HFC-S USB: starting intr IN fifo:%d\n",
998 fifo
->urb
= usb_alloc_urb(0, GFP_KERNEL
);
1002 usb_fill_int_urb(fifo
->urb
, fifo
->hfc
->dev
, fifo
->pipe
,
1003 fifo
->buffer
, fifo
->usb_packet_maxlen
,
1004 rx_complete
, fifo
, fifo
->intervall
);
1005 fifo
->active
= 1; /* must be marked active */
1006 errcode
= usb_submit_urb(fifo
->urb
, GFP_KERNEL
);
1009 "HFC-S USB: submit URB error(start_int_info): status:%i\n",
1012 fifo
->skbuff
= NULL
;
1014 } /* start_int_fifo */
1016 /*****************************/
1017 /* set the B-channel mode */
1018 /*****************************/
1020 set_hfcmode(hfcusb_data
* hfc
, int channel
, int mode
)
1022 __u8 val
, idx_table
[2] = { 0, 2 };
1024 if (hfc
->disc_flag
) {
1027 #ifdef CONFIG_HISAX_DEBUG
1028 DBG(ISDN_DBG
, "HFC-S USB: setting channel %d to mode %d", channel
,
1031 hfc
->b_mode
[channel
] = mode
;
1033 /* setup CON_HDLC */
1035 if (mode
!= L1_MODE_NULL
)
1036 val
= 8; /* enable fifo? */
1037 if (mode
== L1_MODE_TRANS
)
1038 val
|= 2; /* set transparent bit */
1040 /* set FIFO to transmit register */
1041 queue_control_request(hfc
, HFCUSB_FIFO
, idx_table
[channel
], 1);
1042 queue_control_request(hfc
, HFCUSB_CON_HDLC
, val
, 1);
1044 queue_control_request(hfc
, HFCUSB_INC_RES_F
, 2, 1);
1045 /* set FIFO to receive register */
1046 queue_control_request(hfc
, HFCUSB_FIFO
, idx_table
[channel
] + 1, 1);
1047 queue_control_request(hfc
, HFCUSB_CON_HDLC
, val
, 1);
1049 queue_control_request(hfc
, HFCUSB_INC_RES_F
, 2, 1);
1056 queue_control_request(hfc
, HFCUSB_SCTRL
, val
, 1);
1063 queue_control_request(hfc
, HFCUSB_SCTRL_R
, val
, 1);
1065 if (mode
== L1_MODE_NULL
) {
1067 handle_led(hfc
, LED_B2_OFF
);
1069 handle_led(hfc
, LED_B1_OFF
);
1072 handle_led(hfc
, LED_B2_ON
);
1074 handle_led(hfc
, LED_B1_ON
);
1079 hfc_usb_l2l1(struct hisax_if
*my_hisax_if
, int pr
, void *arg
)
1081 usb_fifo
*fifo
= my_hisax_if
->priv
;
1082 hfcusb_data
*hfc
= fifo
->hfc
;
1085 case PH_ACTIVATE
| REQUEST
:
1086 if (fifo
->fifonum
== HFCUSB_D_TX
) {
1087 #ifdef CONFIG_HISAX_DEBUG
1089 "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_ACTIVATE | REQUEST");
1091 if (hfc
->l1_state
!= 3
1092 && hfc
->l1_state
!= 7) {
1093 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
,
1097 #ifdef CONFIG_HISAX_DEBUG
1099 "HFC-S USB: PH_DEACTIVATE | INDICATION sent (not state 3 or 7)");
1102 if (hfc
->l1_state
== 7) { /* l1 already active */
1103 hfc
->d_if
.ifc
.l1l2(&hfc
->
1110 #ifdef CONFIG_HISAX_DEBUG
1112 "HFC-S USB: PH_ACTIVATE | INDICATION sent again ;)");
1115 /* force sending sending INFO1 */
1116 queue_control_request(hfc
,
1121 /* start l1 activation */
1122 queue_control_request(hfc
,
1139 #ifdef CONFIG_HISAX_DEBUG
1141 "HFC_USB: hfc_usb_d_l2l1 Bx-chan: PH_ACTIVATE | REQUEST");
1145 HFCUSB_B1_TX
) ? 0 : 1,
1147 fifo
->hif
->l1l2(fifo
->hif
,
1148 PH_ACTIVATE
| INDICATION
,
1152 case PH_DEACTIVATE
| REQUEST
:
1153 if (fifo
->fifonum
== HFCUSB_D_TX
) {
1154 #ifdef CONFIG_HISAX_DEBUG
1156 "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_DEACTIVATE | REQUEST");
1159 "HFC-S USB: ISDN TE device should not deativate...\n");
1161 #ifdef CONFIG_HISAX_DEBUG
1163 "HFC_USB: hfc_usb_d_l2l1 Bx-chan: PH_DEACTIVATE | REQUEST");
1167 HFCUSB_B1_TX
) ? 0 : 1,
1168 (int) L1_MODE_NULL
);
1169 fifo
->hif
->l1l2(fifo
->hif
,
1170 PH_DEACTIVATE
| INDICATION
,
1174 case PH_DATA
| REQUEST
:
1175 if (fifo
->skbuff
&& fifo
->delete_flg
) {
1176 dev_kfree_skb_any(fifo
->skbuff
);
1177 fifo
->skbuff
= NULL
;
1178 fifo
->delete_flg
= false;
1180 fifo
->skbuff
= arg
; /* we have a new buffer */
1184 "HFC_USB: hfc_usb_d_l2l1: unkown state : %#x\n",
1190 /***************************************************************************/
1191 /* usb_init is called once when a new matching device is detected to setup */
1192 /* main parameters. It registers the driver at the main hisax module. */
1193 /* on success 0 is returned. */
1194 /***************************************************************************/
1196 usb_init(hfcusb_data
* hfc
)
1201 struct hisax_b_if
*p_b_if
[2];
1203 /* check the chip id */
1204 if (read_usb(hfc
, HFCUSB_CHIP_ID
, &b
) != 1) {
1205 printk(KERN_INFO
"HFC-USB: cannot read chip id\n");
1208 if (b
!= HFCUSB_CHIPID
) {
1209 printk(KERN_INFO
"HFC-S USB: Invalid chip id 0x%02x\n", b
);
1213 /* first set the needed config, interface and alternate */
1214 err
= usb_set_interface(hfc
->dev
, hfc
->if_used
, hfc
->alt_used
);
1217 write_usb(hfc
, HFCUSB_CIRM
, 8);
1218 /* aux = output, reset off */
1219 write_usb(hfc
, HFCUSB_CIRM
, 0x10);
1221 /* set USB_SIZE to match the the wMaxPacketSize for INT or BULK transfers */
1222 write_usb(hfc
, HFCUSB_USB_SIZE
,
1223 (hfc
->packet_size
/ 8) | ((hfc
->packet_size
/ 8) << 4));
1225 /* set USB_SIZE_I to match the the wMaxPacketSize for ISO transfers */
1226 write_usb(hfc
, HFCUSB_USB_SIZE_I
, hfc
->iso_packet_size
);
1228 /* enable PCM/GCI master mode */
1229 write_usb(hfc
, HFCUSB_MST_MODE1
, 0); /* set default values */
1230 write_usb(hfc
, HFCUSB_MST_MODE0
, 1); /* enable master mode */
1232 /* init the fifos */
1233 write_usb(hfc
, HFCUSB_F_THRES
,
1234 (HFCUSB_TX_THRESHOLD
/
1235 8) | ((HFCUSB_RX_THRESHOLD
/ 8) << 4));
1238 for (i
= 0; i
< HFCUSB_NUM_FIFOS
; i
++) {
1239 write_usb(hfc
, HFCUSB_FIFO
, i
); /* select the desired fifo */
1240 fifo
[i
].skbuff
= NULL
; /* init buffer pointer */
1242 (i
<= HFCUSB_B2_RX
) ? MAX_BCH_SIZE
: MAX_DFRAME_LEN
;
1243 fifo
[i
].last_urblen
= 0;
1244 /* set 2 bit for D- & E-channel */
1245 write_usb(hfc
, HFCUSB_HDLC_PAR
,
1246 ((i
<= HFCUSB_B2_RX
) ? 0 : 2));
1247 /* rx hdlc, enable IFF for D-channel */
1248 write_usb(hfc
, HFCUSB_CON_HDLC
,
1249 ((i
== HFCUSB_D_TX
) ? 0x09 : 0x08));
1250 write_usb(hfc
, HFCUSB_INC_RES_F
, 2); /* reset the fifo */
1253 write_usb(hfc
, HFCUSB_CLKDEL
, 0x0f); /* clock delay value */
1254 write_usb(hfc
, HFCUSB_STATES
, 3 | 0x10); /* set deactivated mode */
1255 write_usb(hfc
, HFCUSB_STATES
, 3); /* enable state machine */
1257 write_usb(hfc
, HFCUSB_SCTRL_R
, 0); /* disable both B receivers */
1258 write_usb(hfc
, HFCUSB_SCTRL
, 0x40); /* disable B transmitters + capacitive mode */
1260 /* set both B-channel to not connected */
1261 hfc
->b_mode
[0] = L1_MODE_NULL
;
1262 hfc
->b_mode
[1] = L1_MODE_NULL
;
1264 hfc
->l1_activated
= false;
1265 hfc
->disc_flag
= false;
1267 hfc
->led_new_data
= 0;
1268 hfc
->old_led_state
= 0;
1270 /* init the t3 timer */
1271 init_timer(&hfc
->t3_timer
);
1272 hfc
->t3_timer
.data
= (long) hfc
;
1273 hfc
->t3_timer
.function
= (void *) l1_timer_expire_t3
;
1275 /* init the t4 timer */
1276 init_timer(&hfc
->t4_timer
);
1277 hfc
->t4_timer
.data
= (long) hfc
;
1278 hfc
->t4_timer
.function
= (void *) l1_timer_expire_t4
;
1280 /* init the background machinery for control requests */
1281 hfc
->ctrl_read
.bRequestType
= 0xc0;
1282 hfc
->ctrl_read
.bRequest
= 1;
1283 hfc
->ctrl_read
.wLength
= cpu_to_le16(1);
1284 hfc
->ctrl_write
.bRequestType
= 0x40;
1285 hfc
->ctrl_write
.bRequest
= 0;
1286 hfc
->ctrl_write
.wLength
= 0;
1287 usb_fill_control_urb(hfc
->ctrl_urb
,
1290 (u_char
*) & hfc
->ctrl_write
,
1291 NULL
, 0, ctrl_complete
, hfc
);
1292 /* Init All Fifos */
1293 for (i
= 0; i
< HFCUSB_NUM_FIFOS
; i
++) {
1294 hfc
->fifos
[i
].iso
[0].purb
= NULL
;
1295 hfc
->fifos
[i
].iso
[1].purb
= NULL
;
1296 hfc
->fifos
[i
].active
= 0;
1298 /* register Modul to upper Hisax Layers */
1299 hfc
->d_if
.owner
= THIS_MODULE
;
1300 hfc
->d_if
.ifc
.priv
= &hfc
->fifos
[HFCUSB_D_TX
];
1301 hfc
->d_if
.ifc
.l2l1
= hfc_usb_l2l1
;
1302 for (i
= 0; i
< 2; i
++) {
1303 hfc
->b_if
[i
].ifc
.priv
= &hfc
->fifos
[HFCUSB_B1_TX
+ i
* 2];
1304 hfc
->b_if
[i
].ifc
.l2l1
= hfc_usb_l2l1
;
1305 p_b_if
[i
] = &hfc
->b_if
[i
];
1307 /* default Prot: EURO ISDN, should be a module_param */
1309 hisax_register(&hfc
->d_if
, p_b_if
, "hfc_usb", hfc
->protocol
);
1311 #ifdef CONFIG_HISAX_DEBUG
1315 for (i
= 0; i
< 4; i
++)
1316 hfc
->fifos
[i
].hif
= &p_b_if
[i
/ 2]->ifc
;
1317 for (i
= 4; i
< 8; i
++)
1318 hfc
->fifos
[i
].hif
= &hfc
->d_if
.ifc
;
1320 /* 3 (+1) INT IN + 3 ISO OUT */
1321 if (hfc
->cfg_used
== CNF_3INT3ISO
|| hfc
->cfg_used
== CNF_4INT3ISO
) {
1322 start_int_fifo(hfc
->fifos
+ HFCUSB_D_RX
);
1323 if (hfc
->fifos
[HFCUSB_PCM_RX
].pipe
)
1324 start_int_fifo(hfc
->fifos
+ HFCUSB_PCM_RX
);
1325 start_int_fifo(hfc
->fifos
+ HFCUSB_B1_RX
);
1326 start_int_fifo(hfc
->fifos
+ HFCUSB_B2_RX
);
1328 /* 3 (+1) ISO IN + 3 ISO OUT */
1329 if (hfc
->cfg_used
== CNF_3ISO3ISO
|| hfc
->cfg_used
== CNF_4ISO3ISO
) {
1330 start_isoc_chain(hfc
->fifos
+ HFCUSB_D_RX
, ISOC_PACKETS_D
,
1331 rx_iso_complete
, 16);
1332 if (hfc
->fifos
[HFCUSB_PCM_RX
].pipe
)
1333 start_isoc_chain(hfc
->fifos
+ HFCUSB_PCM_RX
,
1334 ISOC_PACKETS_D
, rx_iso_complete
,
1336 start_isoc_chain(hfc
->fifos
+ HFCUSB_B1_RX
, ISOC_PACKETS_B
,
1337 rx_iso_complete
, 16);
1338 start_isoc_chain(hfc
->fifos
+ HFCUSB_B2_RX
, ISOC_PACKETS_B
,
1339 rx_iso_complete
, 16);
1342 start_isoc_chain(hfc
->fifos
+ HFCUSB_D_TX
, ISOC_PACKETS_D
,
1343 tx_iso_complete
, 1);
1344 start_isoc_chain(hfc
->fifos
+ HFCUSB_B1_TX
, ISOC_PACKETS_B
,
1345 tx_iso_complete
, 1);
1346 start_isoc_chain(hfc
->fifos
+ HFCUSB_B2_TX
, ISOC_PACKETS_B
,
1347 tx_iso_complete
, 1);
1349 handle_led(hfc
, LED_POWER_ON
);
1354 /*************************************************/
1355 /* function called to probe a new plugged device */
1356 /*************************************************/
1358 hfc_usb_probe(struct usb_interface
*intf
, const struct usb_device_id
*id
)
1360 struct usb_device
*dev
= interface_to_usbdev(intf
);
1361 hfcusb_data
*context
;
1362 struct usb_host_interface
*iface
= intf
->cur_altsetting
;
1363 struct usb_host_interface
*iface_used
= NULL
;
1364 struct usb_host_endpoint
*ep
;
1365 int ifnum
= iface
->desc
.bInterfaceNumber
;
1366 int i
, idx
, alt_idx
, probe_alt_setting
, vend_idx
, cfg_used
, *vcf
,
1367 attr
, cfg_found
, cidx
, ep_addr
;
1368 int cmptbl
[16], small_match
, iso_packet_size
, packet_size
,
1370 hfcsusb_vdata
*driver_info
;
1373 for (i
= 0; hfcusb_idtab
[i
].idVendor
; i
++) {
1374 if ((le16_to_cpu(dev
->descriptor
.idVendor
) == hfcusb_idtab
[i
].idVendor
)
1375 && (le16_to_cpu(dev
->descriptor
.idProduct
) == hfcusb_idtab
[i
].idProduct
)) {
1381 #ifdef CONFIG_HISAX_DEBUG
1383 "HFC-USB: probing interface(%d) actalt(%d) minor(%d)\n", ifnum
,
1384 iface
->desc
.bAlternateSetting
, intf
->minor
);
1387 "HFC-S USB: probing interface(%d) actalt(%d) minor(%d)\n",
1388 ifnum
, iface
->desc
.bAlternateSetting
, intf
->minor
);
1390 if (vend_idx
!= 0xffff) {
1391 /* if vendor and product ID is OK, start probing alternate settings */
1393 small_match
= 0xffff;
1395 /* default settings */
1396 iso_packet_size
= 16;
1399 while (alt_idx
< intf
->num_altsetting
) {
1400 iface
= intf
->altsetting
+ alt_idx
;
1401 probe_alt_setting
= iface
->desc
.bAlternateSetting
;
1404 /* check for config EOL element */
1405 while (validconf
[cfg_used
][0]) {
1407 vcf
= validconf
[cfg_used
];
1408 /* first endpoint descriptor */
1409 ep
= iface
->endpoint
;
1410 #ifdef CONFIG_HISAX_DEBUG
1412 "HFC-S USB: (if=%d alt=%d cfg_used=%d)\n",
1413 ifnum
, probe_alt_setting
, cfg_used
);
1415 memcpy(cmptbl
, vcf
, 16 * sizeof(int));
1417 /* check for all endpoints in this alternate setting */
1418 for (i
= 0; i
< iface
->desc
.bNumEndpoints
;
1421 ep
->desc
.bEndpointAddress
;
1422 /* get endpoint base */
1423 idx
= ((ep_addr
& 0x7f) - 1) * 2;
1426 attr
= ep
->desc
.bmAttributes
;
1427 if (cmptbl
[idx
] == EP_NUL
) {
1430 if (attr
== USB_ENDPOINT_XFER_INT
1431 && cmptbl
[idx
] == EP_INT
)
1432 cmptbl
[idx
] = EP_NUL
;
1433 if (attr
== USB_ENDPOINT_XFER_BULK
1434 && cmptbl
[idx
] == EP_BLK
)
1435 cmptbl
[idx
] = EP_NUL
;
1436 if (attr
== USB_ENDPOINT_XFER_ISOC
1437 && cmptbl
[idx
] == EP_ISO
)
1438 cmptbl
[idx
] = EP_NUL
;
1440 /* check if all INT endpoints match minimum interval */
1441 if (attr
== USB_ENDPOINT_XFER_INT
1442 && ep
->desc
.bInterval
<
1444 #ifdef CONFIG_HISAX_DEBUG
1447 "HFC-S USB: Interrupt Endpoint interval < %d found - skipping config",
1454 for (i
= 0; i
< 16; i
++) {
1455 /* all entries must be EP_NOP or EP_NUL for a valid config */
1456 if (cmptbl
[i
] != EP_NOP
1457 && cmptbl
[i
] != EP_NUL
)
1461 if (cfg_used
< small_match
) {
1462 small_match
= cfg_used
;
1467 #ifdef CONFIG_HISAX_DEBUG
1469 "HFC-USB: small_match=%x %x\n",
1470 small_match
, alt_used
);
1476 } /* (alt_idx < intf->num_altsetting) */
1478 /* found a valid USB Ta Endpint config */
1479 if (small_match
!= 0xffff) {
1483 kzalloc(sizeof(hfcusb_data
), GFP_KERNEL
)))
1484 return (-ENOMEM
); /* got no mem */
1486 ep
= iface
->endpoint
;
1487 vcf
= validconf
[small_match
];
1489 for (i
= 0; i
< iface
->desc
.bNumEndpoints
; i
++) {
1490 ep_addr
= ep
->desc
.bEndpointAddress
;
1491 /* get endpoint base */
1492 idx
= ((ep_addr
& 0x7f) - 1) * 2;
1496 attr
= ep
->desc
.bmAttributes
;
1498 /* init Endpoints */
1499 if (vcf
[idx
] != EP_NOP
1500 && vcf
[idx
] != EP_NUL
) {
1502 case USB_ENDPOINT_XFER_INT
:
1515 le16_to_cpu(ep
->desc
.wMaxPacketSize
);
1517 case USB_ENDPOINT_XFER_BULK
:
1543 le16_to_cpu(ep
->desc
.wMaxPacketSize
);
1545 case USB_ENDPOINT_XFER_ISOC
:
1571 le16_to_cpu(ep
->desc
.wMaxPacketSize
);
1577 } /* switch attribute */
1579 if (context
->fifos
[cidx
].pipe
) {
1580 context
->fifos
[cidx
].
1582 context
->fifos
[cidx
].hfc
=
1584 context
->fifos
[cidx
].usb_packet_maxlen
=
1585 le16_to_cpu(ep
->desc
.wMaxPacketSize
);
1586 context
->fifos
[cidx
].
1589 context
->fifos
[cidx
].
1595 context
->dev
= dev
; /* save device */
1596 context
->if_used
= ifnum
; /* save used interface */
1597 context
->alt_used
= alt_used
; /* and alternate config */
1598 context
->ctrl_paksize
= dev
->descriptor
.bMaxPacketSize0
; /* control size */
1599 context
->cfg_used
= vcf
[16]; /* store used config */
1600 context
->vend_idx
= vend_idx
; /* store found vendor */
1601 context
->packet_size
= packet_size
;
1602 context
->iso_packet_size
= iso_packet_size
;
1604 /* create the control pipes needed for register access */
1605 context
->ctrl_in_pipe
=
1606 usb_rcvctrlpipe(context
->dev
, 0);
1607 context
->ctrl_out_pipe
=
1608 usb_sndctrlpipe(context
->dev
, 0);
1609 context
->ctrl_urb
= usb_alloc_urb(0, GFP_KERNEL
);
1612 (hfcsusb_vdata
*) hfcusb_idtab
[vend_idx
].
1614 printk(KERN_INFO
"HFC-S USB: detected \"%s\"\n",
1615 driver_info
->vend_name
);
1616 #ifdef CONFIG_HISAX_DEBUG
1618 "HFC-S USB: Endpoint-Config: %s (if=%d alt=%d)\n",
1619 conf_str
[small_match
], context
->if_used
,
1622 "HFC-S USB: E-channel (\"ECHO:\") logging ");
1623 if (validconf
[small_match
][18])
1624 printk(" possible\n");
1626 printk("NOT possible\n");
1628 /* init the chip and register the driver */
1629 if (usb_init(context
)) {
1630 if (context
->ctrl_urb
) {
1631 usb_unlink_urb(context
->ctrl_urb
);
1632 usb_free_urb(context
->ctrl_urb
);
1633 context
->ctrl_urb
= NULL
;
1638 usb_set_intfdata(intf
, context
);
1643 "HFC-S USB: no valid vendor found in USB descriptor\n");
1648 /****************************************************/
1649 /* function called when an active device is removed */
1650 /****************************************************/
1652 hfc_usb_disconnect(struct usb_interface
1655 hfcusb_data
*context
= usb_get_intfdata(intf
);
1657 printk(KERN_INFO
"HFC-S USB: device disconnect\n");
1658 context
->disc_flag
= true;
1659 usb_set_intfdata(intf
, NULL
);
1662 if (timer_pending(&context
->t3_timer
))
1663 del_timer(&context
->t3_timer
);
1664 if (timer_pending(&context
->t4_timer
))
1665 del_timer(&context
->t4_timer
);
1666 /* tell all fifos to terminate */
1667 for (i
= 0; i
< HFCUSB_NUM_FIFOS
; i
++) {
1668 if (context
->fifos
[i
].usb_transfer_mode
== USB_ISOC
) {
1669 if (context
->fifos
[i
].active
> 0) {
1670 stop_isoc_chain(&context
->fifos
[i
]);
1671 #ifdef CONFIG_HISAX_DEBUG
1673 "HFC-S USB: hfc_usb_disconnect: stopping ISOC chain Fifo no %i",
1678 if (context
->fifos
[i
].active
> 0) {
1679 context
->fifos
[i
].active
= 0;
1680 #ifdef CONFIG_HISAX_DEBUG
1682 "HFC-S USB: hfc_usb_disconnect: unlinking URB for Fifo no %i",
1686 if (context
->fifos
[i
].urb
) {
1687 usb_unlink_urb(context
->fifos
[i
].urb
);
1688 usb_free_urb(context
->fifos
[i
].urb
);
1689 context
->fifos
[i
].urb
= NULL
;
1692 context
->fifos
[i
].active
= 0;
1694 /* wait for all URBS to terminate */
1696 if (context
->ctrl_urb
) {
1697 usb_unlink_urb(context
->ctrl_urb
);
1698 usb_free_urb(context
->ctrl_urb
);
1699 context
->ctrl_urb
= NULL
;
1701 hisax_unregister(&context
->d_if
);
1702 kfree(context
); /* free our structure again */
1703 } /* hfc_usb_disconnect */
1705 /************************************/
1706 /* our driver information structure */
1707 /************************************/
1708 static struct usb_driver hfc_drv
= {
1710 .id_table
= hfcusb_idtab
,
1711 .probe
= hfc_usb_probe
,
1712 .disconnect
= hfc_usb_disconnect
,
1717 #ifdef CONFIG_HISAX_DEBUG
1718 DBG(USB_DBG
, "HFC-S USB: calling \"hfc_usb_exit\" ...");
1720 usb_deregister(&hfc_drv
); /* release our driver */
1721 printk(KERN_INFO
"HFC-S USB: module removed\n");
1727 #ifndef CONFIG_HISAX_DEBUG
1728 unsigned int debug
= -1;
1730 char revstr
[30], datestr
[30], dummy
[30];
1731 sscanf(hfcusb_revision
,
1732 "%s %s $ %s %s %s $ ", dummy
, revstr
,
1733 dummy
, datestr
, dummy
);
1735 "HFC-S USB: driver module revision %s date %s loaded, (debug=%i)\n",
1736 revstr
, datestr
, debug
);
1737 if (usb_register(&hfc_drv
)) {
1739 "HFC-S USB: Unable to register HFC-S USB module at usb stack\n");
1740 return (-1); /* unable to register */
1745 module_init(hfc_usb_init
);
1746 module_exit(hfc_usb_exit
);
1747 MODULE_AUTHOR(DRIVER_AUTHOR
);
1748 MODULE_DESCRIPTION(DRIVER_DESC
);
1749 MODULE_LICENSE("GPL");
1750 MODULE_DEVICE_TABLE(usb
, hfcusb_idtab
);