4 * $Id: hfc_usb.c,v 2.3.2.24 2007/10/14 08:40:29 mbachem Exp $
6 * modular HiSax ISDN driver for Colognechip HFC-S USB chip
8 * Authors : Peter Sprenger (sprenger@moving-bytes.de)
9 * Martin Bachem (m.bachem@gmx.de, 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/sched.h>
41 #include <linux/moduleparam.h>
42 #include <linux/slab.h>
47 static const char *hfcusb_revision
=
48 "$Revision: 2.3.2.24 $ $Date: 2007/10/14 08:40:29 $ ";
50 /* Hisax debug support
51 * debug flags defined in hfc_usb.h as HFCUSB_DBG_[*]
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 /* VID/PID device list */
68 static struct usb_device_id hfcusb_idtab
[] = {
70 USB_DEVICE(0x0959, 0x2bd0),
71 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
72 {LED_OFF
, {4, 0, 2, 1},
73 "ISDN USB TA (Cologne Chip HFC-S USB based)"}),
76 USB_DEVICE(0x0675, 0x1688),
77 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
78 {LED_SCHEME1
, {1, 2, 0, 0},
79 "DrayTek miniVigor 128 USB ISDN TA"}),
82 USB_DEVICE(0x07b0, 0x0007),
83 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
84 {LED_SCHEME1
, {0x80, -64, -32, -16},
85 "Billion tiny USB ISDN TA 128"}),
88 USB_DEVICE(0x0742, 0x2008),
89 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
90 {LED_SCHEME1
, {4, 0, 2, 1},
94 USB_DEVICE(0x0742, 0x2009),
95 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
96 {LED_SCHEME1
, {4, 0, 2, 1},
97 "Aceex USB ISDN TA"}),
100 USB_DEVICE(0x0742, 0x200A),
101 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
102 {LED_SCHEME1
, {4, 0, 2, 1},
106 USB_DEVICE(0x08e3, 0x0301),
107 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
108 {LED_SCHEME1
, {2, 0, 1, 4},
112 USB_DEVICE(0x07fa, 0x0846),
113 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
114 {LED_SCHEME1
, {0x80, -64, -32, -16},
115 "Bewan Modem RNIS USB"}),
118 USB_DEVICE(0x07fa, 0x0847),
119 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
120 {LED_SCHEME1
, {0x80, -64, -32, -16},
121 "Djinn Numeris USB"}),
124 USB_DEVICE(0x07b0, 0x0006),
125 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
126 {LED_SCHEME1
, {0x80, -64, -32, -16},
130 USB_DEVICE(0x071d, 0x1005),
131 .driver_info
= (unsigned long) &((hfcsusb_vdata
)
132 {LED_SCHEME1
, {0x02, 0, 0x01, 0x04},
133 "Eicon DIVA USB 4.0"}),
138 /* structure defining input+output fifos (interrupt/bulk mode) */
139 struct usb_fifo
; /* forward definition */
140 typedef struct iso_urb_struct
{
142 __u8 buffer
[ISO_BUFFER_SIZE
]; /* buffer incoming/outgoing data */
143 struct usb_fifo
*owner_fifo
; /* pointer to owner fifo */
146 struct hfcusb_data
; /* forward definition */
148 typedef struct usb_fifo
{
149 int fifonum
; /* fifo index attached to this structure */
150 int active
; /* fifo is currently active */
151 struct hfcusb_data
*hfc
; /* pointer to main structure */
152 int pipe
; /* address of endpoint */
153 __u8 usb_packet_maxlen
; /* maximum length for usb transfer */
154 unsigned int max_size
; /* maximum size of receive/send packet */
155 __u8 intervall
; /* interrupt interval */
156 struct sk_buff
*skbuff
; /* actual used buffer */
157 struct urb
*urb
; /* transfer structure for usb routines */
158 __u8 buffer
[128]; /* buffer incoming/outgoing data */
159 int bit_line
; /* how much bits are in the fifo? */
161 volatile __u8 usb_transfer_mode
; /* switched between ISO and INT */
162 iso_urb_struct iso
[2]; /* need two urbs to have one always for pending */
163 struct hisax_if
*hif
; /* hisax interface */
164 int delete_flg
; /* only delete skbuff once */
165 int last_urblen
; /* remember length of last packet */
168 /* structure holding all data for one device */
169 typedef struct hfcusb_data
{
170 /* HiSax Interface for loadable Layer1 drivers */
171 struct hisax_d_if d_if
; /* see hisax_if.h */
172 struct hisax_b_if b_if
[2]; /* see hisax_if.h */
175 struct usb_device
*dev
; /* our device */
176 int if_used
; /* used interface number */
177 int alt_used
; /* used alternate config */
178 int ctrl_paksize
; /* control pipe packet size */
179 int ctrl_in_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
;
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
,
212 static inline const char *
213 symbolic(struct hfcusb_symbolic_list list
[], const int num
)
216 for (i
= 0; list
[i
].name
!= NULL
; i
++)
217 if (list
[i
].num
== num
)
218 return (list
[i
].name
);
219 return "<unknown ERROR>";
223 ctrl_start_transfer(hfcusb_data
*hfc
)
226 hfc
->ctrl_urb
->pipe
= hfc
->ctrl_out_pipe
;
227 hfc
->ctrl_urb
->setup_packet
= (u_char
*)&hfc
->ctrl_write
;
228 hfc
->ctrl_urb
->transfer_buffer
= NULL
;
229 hfc
->ctrl_urb
->transfer_buffer_length
= 0;
230 hfc
->ctrl_write
.wIndex
=
231 cpu_to_le16(hfc
->ctrl_buff
[hfc
->ctrl_out_idx
].hfc_reg
);
232 hfc
->ctrl_write
.wValue
=
233 cpu_to_le16(hfc
->ctrl_buff
[hfc
->ctrl_out_idx
].reg_val
);
235 usb_submit_urb(hfc
->ctrl_urb
, GFP_ATOMIC
); /* start transfer */
237 } /* ctrl_start_transfer */
240 queue_control_request(hfcusb_data
*hfc
, __u8 reg
, __u8 val
, int action
)
244 if (hfc
->ctrl_cnt
>= HFC_CTRL_BUFSIZE
)
245 return (1); /* no space left */
246 buf
= &hfc
->ctrl_buff
[hfc
->ctrl_in_idx
]; /* pointer to new index */
249 buf
->action
= action
;
250 if (++hfc
->ctrl_in_idx
>= HFC_CTRL_BUFSIZE
)
251 hfc
->ctrl_in_idx
= 0; /* pointer wrap */
252 if (++hfc
->ctrl_cnt
== 1)
253 ctrl_start_transfer(hfc
);
258 ctrl_complete(struct urb
*urb
)
260 hfcusb_data
*hfc
= (hfcusb_data
*) urb
->context
;
264 hfc
->ctrl_cnt
--; /* decrement actual count */
265 if (++hfc
->ctrl_out_idx
>= HFC_CTRL_BUFSIZE
)
266 hfc
->ctrl_out_idx
= 0; /* pointer wrap */
268 ctrl_start_transfer(hfc
); /* start next transfer */
272 /* write led data to auxport & invert if necessary */
274 write_led(hfcusb_data
*hfc
, __u8 led_state
)
276 if (led_state
!= hfc
->old_led_state
) {
277 hfc
->old_led_state
= led_state
;
278 queue_control_request(hfc
, HFCUSB_P_DATA
, led_state
, 1);
283 set_led_bit(hfcusb_data
*hfc
, signed short led_bits
, int on
)
287 hfc
->led_state
&= ~abs(led_bits
);
289 hfc
->led_state
|= led_bits
;
292 hfc
->led_state
|= abs(led_bits
);
294 hfc
->led_state
&= ~led_bits
;
298 /* handle LED requests */
300 handle_led(hfcusb_data
*hfc
, int event
)
302 hfcsusb_vdata
*driver_info
=
303 (hfcsusb_vdata
*) hfcusb_idtab
[hfc
->vend_idx
].driver_info
;
305 /* if no scheme -> no LED action */
306 if (driver_info
->led_scheme
== LED_OFF
)
311 set_led_bit(hfc
, driver_info
->led_bits
[0], 1);
312 set_led_bit(hfc
, driver_info
->led_bits
[1], 0);
313 set_led_bit(hfc
, driver_info
->led_bits
[2], 0);
314 set_led_bit(hfc
, driver_info
->led_bits
[3], 0);
317 set_led_bit(hfc
, driver_info
->led_bits
[0], 0);
318 set_led_bit(hfc
, driver_info
->led_bits
[1], 0);
319 set_led_bit(hfc
, driver_info
->led_bits
[2], 0);
320 set_led_bit(hfc
, driver_info
->led_bits
[3], 0);
323 set_led_bit(hfc
, driver_info
->led_bits
[1], 1);
326 set_led_bit(hfc
, driver_info
->led_bits
[1], 0);
329 set_led_bit(hfc
, driver_info
->led_bits
[2], 1);
332 set_led_bit(hfc
, driver_info
->led_bits
[2], 0);
335 set_led_bit(hfc
, driver_info
->led_bits
[3], 1);
338 set_led_bit(hfc
, driver_info
->led_bits
[3], 0);
341 write_led(hfc
, hfc
->led_state
);
344 /* ISDN l1 timer T3 expires */
346 l1_timer_expire_t3(hfcusb_data
*hfc
)
348 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
, PH_DEACTIVATE
| INDICATION
,
351 DBG(HFCUSB_DBG_STATES
,
352 "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T3 expire)");
354 hfc
->l1_activated
= 0;
355 handle_led(hfc
, LED_S0_OFF
);
357 queue_control_request(hfc
, HFCUSB_STATES
, 0x10, 1);
358 queue_control_request(hfc
, HFCUSB_STATES
, 3, 1);
361 /* ISDN l1 timer T4 expires */
363 l1_timer_expire_t4(hfcusb_data
*hfc
)
365 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
, PH_DEACTIVATE
| INDICATION
,
368 DBG(HFCUSB_DBG_STATES
,
369 "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T4 expire)");
371 hfc
->l1_activated
= 0;
372 handle_led(hfc
, LED_S0_OFF
);
375 /* S0 state changed */
377 s0_state_handler(hfcusb_data
*hfc
, __u8 state
)
381 old_state
= hfc
->l1_state
;
382 if (state
== old_state
|| state
< 1 || state
> 8)
385 DBG(HFCUSB_DBG_STATES
, "HFC-S USB: S0 statechange(%d -> %d)",
388 if (state
< 4 || state
== 7 || state
== 8) {
389 if (timer_pending(&hfc
->t3_timer
))
390 del_timer(&hfc
->t3_timer
);
391 DBG(HFCUSB_DBG_STATES
, "HFC-S USB: T3 deactivated");
394 if (timer_pending(&hfc
->t4_timer
))
395 del_timer(&hfc
->t4_timer
);
396 DBG(HFCUSB_DBG_STATES
, "HFC-S USB: T4 deactivated");
399 if (state
== 7 && !hfc
->l1_activated
) {
400 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
,
401 PH_ACTIVATE
| INDICATION
, NULL
);
402 DBG(HFCUSB_DBG_STATES
, "HFC-S USB: PH_ACTIVATE | INDICATION sent");
403 hfc
->l1_activated
= 1;
404 handle_led(hfc
, LED_S0_ON
);
405 } else if (state
<= 3 /* && activated */) {
406 if (old_state
== 7 || old_state
== 8) {
407 DBG(HFCUSB_DBG_STATES
, "HFC-S USB: T4 activated");
408 if (!timer_pending(&hfc
->t4_timer
)) {
409 hfc
->t4_timer
.expires
=
410 jiffies
+ (HFC_TIMER_T4
* HZ
) / 1000;
411 add_timer(&hfc
->t4_timer
);
414 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
,
415 PH_DEACTIVATE
| INDICATION
,
417 DBG(HFCUSB_DBG_STATES
,
418 "HFC-S USB: PH_DEACTIVATE | INDICATION sent");
419 hfc
->l1_activated
= 0;
420 handle_led(hfc
, LED_S0_OFF
);
423 hfc
->l1_state
= state
;
427 fill_isoc_urb(struct urb
*urb
, struct usb_device
*dev
, unsigned int pipe
,
428 void *buf
, int num_packets
, int packet_size
, int interval
,
429 usb_complete_t complete
, void *context
)
435 urb
->complete
= complete
;
436 urb
->number_of_packets
= num_packets
;
437 urb
->transfer_buffer_length
= packet_size
* num_packets
;
438 urb
->context
= context
;
439 urb
->transfer_buffer
= buf
;
440 urb
->transfer_flags
= URB_ISO_ASAP
;
441 urb
->actual_length
= 0;
442 urb
->interval
= interval
;
443 for (k
= 0; k
< num_packets
; k
++) {
444 urb
->iso_frame_desc
[k
].offset
= packet_size
* k
;
445 urb
->iso_frame_desc
[k
].length
= packet_size
;
446 urb
->iso_frame_desc
[k
].actual_length
= 0;
450 /* allocs urbs and start isoc transfer with two pending urbs to avoid
451 * gaps in the transfer chain
454 start_isoc_chain(usb_fifo
*fifo
, int num_packets_per_urb
,
455 usb_complete_t complete
, int packet_size
)
459 DBG(HFCUSB_DBG_INIT
, "HFC-S USB: starting ISO-URBs for fifo:%d\n",
462 /* allocate Memory for Iso out Urbs */
463 for (i
= 0; i
< 2; i
++) {
464 if (!(fifo
->iso
[i
].purb
)) {
466 usb_alloc_urb(num_packets_per_urb
, GFP_KERNEL
);
467 if (!(fifo
->iso
[i
].purb
)) {
469 "alloc urb for fifo %i failed!!!",
472 fifo
->iso
[i
].owner_fifo
= (struct usb_fifo
*) fifo
;
474 /* Init the first iso */
475 if (ISO_BUFFER_SIZE
>=
476 (fifo
->usb_packet_maxlen
*
477 num_packets_per_urb
)) {
478 fill_isoc_urb(fifo
->iso
[i
].purb
,
479 fifo
->hfc
->dev
, fifo
->pipe
,
482 fifo
->usb_packet_maxlen
,
483 fifo
->intervall
, complete
,
485 memset(fifo
->iso
[i
].buffer
, 0,
486 sizeof(fifo
->iso
[i
].buffer
));
487 /* defining packet delimeters in fifo->buffer */
488 for (k
= 0; k
< num_packets_per_urb
; k
++) {
490 iso_frame_desc
[k
].offset
=
493 iso_frame_desc
[k
].length
=
498 "HFC-S USB: ISO Buffer size to small!\n");
501 fifo
->bit_line
= BITLINE_INF
;
503 errcode
= usb_submit_urb(fifo
->iso
[i
].purb
, GFP_KERNEL
);
504 fifo
->active
= (errcode
>= 0) ? 1 : 0;
506 printk(KERN_INFO
"HFC-S USB: usb_submit_urb URB nr:%d, error(%i): '%s'\n",
507 i
, errcode
, symbolic(urb_errlist
, errcode
));
509 return (fifo
->active
);
512 /* stops running iso chain and frees their pending urbs */
514 stop_isoc_chain(usb_fifo
*fifo
)
518 for (i
= 0; i
< 2; i
++) {
519 if (fifo
->iso
[i
].purb
) {
521 "HFC-S USB: Stopping iso chain for fifo %i.%i",
523 usb_kill_urb(fifo
->iso
[i
].purb
);
524 usb_free_urb(fifo
->iso
[i
].purb
);
525 fifo
->iso
[i
].purb
= NULL
;
529 usb_kill_urb(fifo
->urb
);
530 usb_free_urb(fifo
->urb
);
535 /* defines how much ISO packets are handled in one URB */
536 static int iso_packets
[8] =
537 { ISOC_PACKETS_B
, ISOC_PACKETS_B
, ISOC_PACKETS_B
, ISOC_PACKETS_B
,
538 ISOC_PACKETS_D
, ISOC_PACKETS_D
, ISOC_PACKETS_D
, ISOC_PACKETS_D
542 tx_iso_complete(struct urb
*urb
)
544 iso_urb_struct
*context_iso_urb
= (iso_urb_struct
*) urb
->context
;
545 usb_fifo
*fifo
= context_iso_urb
->owner_fifo
;
546 hfcusb_data
*hfc
= fifo
->hfc
;
547 int k
, tx_offset
, num_isoc_packets
, sink
, len
, current_len
,
549 int frame_complete
, transp_mode
, fifon
, status
;
552 fifon
= fifo
->fifonum
;
553 status
= urb
->status
;
557 /* ISO transfer only partially completed,
558 look at individual frame status for details */
559 if (status
== -EXDEV
) {
560 DBG(HFCUSB_DBG_VERBOSE_USB
, "HFC-S USB: tx_iso_complete with -EXDEV"
561 ", urb->status %d, fifonum %d\n",
564 for (k
= 0; k
< iso_packets
[fifon
]; ++k
) {
565 errcode
= urb
->iso_frame_desc
[k
].status
;
567 DBG(HFCUSB_DBG_VERBOSE_USB
, "HFC-S USB: tx_iso_complete "
568 "packet %i, status: %i\n",
572 // clear status, so go on with ISO transfers
576 if (fifo
->active
&& !status
) {
578 if (fifon
< 4 && hfc
->b_mode
[fifon
/ 2] == L1_MODE_TRANS
)
581 /* is FifoFull-threshold set for our channel? */
582 threshbit
= (hfc
->threshold_mask
& (1 << fifon
));
583 num_isoc_packets
= iso_packets
[fifon
];
585 /* predict dataflow to avoid fifo overflow */
586 if (fifon
>= HFCUSB_D_TX
) {
587 sink
= (threshbit
) ? SINK_DMIN
: SINK_DMAX
;
589 sink
= (threshbit
) ? SINK_MIN
: SINK_MAX
;
591 fill_isoc_urb(urb
, fifo
->hfc
->dev
, fifo
->pipe
,
592 context_iso_urb
->buffer
, num_isoc_packets
,
593 fifo
->usb_packet_maxlen
, fifo
->intervall
,
594 tx_iso_complete
, urb
->context
);
595 memset(context_iso_urb
->buffer
, 0,
596 sizeof(context_iso_urb
->buffer
));
599 /* Generate next ISO Packets */
600 for (k
= 0; k
< num_isoc_packets
; ++k
) {
602 len
= fifo
->skbuff
->len
;
603 /* we lower data margin every msec */
604 fifo
->bit_line
-= sink
;
605 current_len
= (0 - fifo
->bit_line
) / 8;
606 /* maximum 15 byte for every ISO packet makes our life easier */
607 if (current_len
> 14)
611 current_len
) ? len
: current_len
;
612 /* how much bit do we put on the line? */
613 fifo
->bit_line
+= current_len
* 8;
615 context_iso_urb
->buffer
[tx_offset
] = 0;
616 if (current_len
== len
) {
618 /* here frame completion */
620 buffer
[tx_offset
] = 1;
621 /* add 2 byte flags and 16bit CRC at end of ISDN frame */
622 fifo
->bit_line
+= 32;
627 memcpy(context_iso_urb
->buffer
+
628 tx_offset
+ 1, fifo
->skbuff
->data
,
630 skb_pull(fifo
->skbuff
, current_len
);
632 /* define packet delimeters within the URB buffer */
633 urb
->iso_frame_desc
[k
].offset
= tx_offset
;
634 urb
->iso_frame_desc
[k
].length
=
637 tx_offset
+= (current_len
+ 1);
639 urb
->iso_frame_desc
[k
].offset
=
642 urb
->iso_frame_desc
[k
].length
= 1;
643 fifo
->bit_line
-= sink
; /* we lower data margin every msec */
645 if (fifo
->bit_line
< BITLINE_INF
) {
646 fifo
->bit_line
= BITLINE_INF
;
650 if (frame_complete
) {
651 fifo
->delete_flg
= 1;
652 fifo
->hif
->l1l2(fifo
->hif
,
654 (void *) (unsigned long) fifo
->skbuff
->
656 if (fifo
->skbuff
&& fifo
->delete_flg
) {
657 dev_kfree_skb_any(fifo
->skbuff
);
659 fifo
->delete_flg
= 0;
664 errcode
= usb_submit_urb(urb
, GFP_ATOMIC
);
667 "HFC-S USB: error submitting ISO URB: %d\n",
671 if (status
&& !hfc
->disc_flag
) {
673 "HFC-S USB: tx_iso_complete: error(%i): '%s', fifonum=%d\n",
674 status
, symbolic(urb_errlist
, status
), fifon
);
680 rx_iso_complete(struct urb
*urb
)
682 iso_urb_struct
*context_iso_urb
= (iso_urb_struct
*) urb
->context
;
683 usb_fifo
*fifo
= context_iso_urb
->owner_fifo
;
684 hfcusb_data
*hfc
= fifo
->hfc
;
685 int k
, len
, errcode
, offset
, num_isoc_packets
, fifon
, maxlen
,
687 unsigned int iso_status
;
691 fifon
= fifo
->fifonum
;
692 status
= urb
->status
;
694 if (urb
->status
== -EOVERFLOW
) {
695 DBG(HFCUSB_DBG_VERBOSE_USB
,
696 "HFC-USB: ignoring USB DATAOVERRUN fifo(%i)", fifon
);
700 /* ISO transfer only partially completed,
701 look at individual frame status for details */
702 if (status
== -EXDEV
) {
703 DBG(HFCUSB_DBG_VERBOSE_USB
, "HFC-S USB: rx_iso_complete with -EXDEV "
704 "urb->status %d, fifonum %d\n",
709 if (fifo
->active
&& !status
) {
710 num_isoc_packets
= iso_packets
[fifon
];
711 maxlen
= fifo
->usb_packet_maxlen
;
712 for (k
= 0; k
< num_isoc_packets
; ++k
) {
713 len
= urb
->iso_frame_desc
[k
].actual_length
;
714 offset
= urb
->iso_frame_desc
[k
].offset
;
715 buf
= context_iso_urb
->buffer
+ offset
;
716 iso_status
= urb
->iso_frame_desc
[k
].status
;
718 if (iso_status
&& !hfc
->disc_flag
)
719 DBG(HFCUSB_DBG_VERBOSE_USB
,
720 "HFC-S USB: rx_iso_complete "
721 "ISO packet %i, status: %i\n",
724 if (fifon
== HFCUSB_D_RX
) {
725 DBG(HFCUSB_DBG_VERBOSE_USB
,
726 "HFC-S USB: ISO-D-RX lst_urblen:%2d "
727 "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
728 fifo
->last_urblen
, len
, maxlen
,
731 DBG_PACKET(HFCUSB_DBG_VERBOSE_USB
, buf
, len
);
734 if (fifo
->last_urblen
!= maxlen
) {
735 /* the threshold mask is in the 2nd status byte */
736 hfc
->threshold_mask
= buf
[1];
737 /* care for L1 state only for D-Channel
738 to avoid overlapped iso completions */
739 if (fifon
== HFCUSB_D_RX
) {
740 /* the S0 state is in the upper half
741 of the 1st status byte */
742 s0_state_handler(hfc
, buf
[0] >> 4);
744 eof
[fifon
] = buf
[0] & 1;
746 collect_rx_frame(fifo
, buf
+ 2,
751 collect_rx_frame(fifo
, buf
, len
,
753 maxlen
) ? eof
[fifon
] :
756 fifo
->last_urblen
= len
;
759 fill_isoc_urb(urb
, fifo
->hfc
->dev
, fifo
->pipe
,
760 context_iso_urb
->buffer
, num_isoc_packets
,
761 fifo
->usb_packet_maxlen
, fifo
->intervall
,
762 rx_iso_complete
, urb
->context
);
763 errcode
= usb_submit_urb(urb
, GFP_ATOMIC
);
766 "HFC-S USB: error submitting ISO URB: %d\n",
770 if (status
&& !hfc
->disc_flag
) {
772 "HFC-S USB: rx_iso_complete : "
773 "urb->status %d, fifonum %d\n",
779 /* collect rx data from INT- and ISO-URBs */
781 collect_rx_frame(usb_fifo
*fifo
, __u8
*data
, int len
, int finish
)
783 hfcusb_data
*hfc
= fifo
->hfc
;
784 int transp_mode
, fifon
;
786 fifon
= fifo
->fifonum
;
788 if (fifon
< 4 && hfc
->b_mode
[fifon
/ 2] == L1_MODE_TRANS
)
792 fifo
->skbuff
= dev_alloc_skb(fifo
->max_size
+ 3);
795 "HFC-S USB: cannot allocate buffer for fifo(%d)\n",
801 if (fifo
->skbuff
->len
+ len
< fifo
->max_size
) {
802 memcpy(skb_put(fifo
->skbuff
, len
), data
, len
);
804 DBG(HFCUSB_DBG_FIFO_ERR
,
805 "HCF-USB: got frame exceeded fifo->max_size(%d) fifo(%d)",
806 fifo
->max_size
, fifon
);
807 DBG_SKB(HFCUSB_DBG_VERBOSE_USB
, fifo
->skbuff
);
808 skb_trim(fifo
->skbuff
, 0);
811 if (transp_mode
&& fifo
->skbuff
->len
>= 128) {
812 fifo
->hif
->l1l2(fifo
->hif
, PH_DATA
| INDICATION
,
817 /* we have a complete hdlc packet */
819 if (fifo
->skbuff
->len
> 3 &&
820 !fifo
->skbuff
->data
[fifo
->skbuff
->len
- 1]) {
822 if (fifon
== HFCUSB_D_RX
) {
823 DBG(HFCUSB_DBG_DCHANNEL
,
824 "HFC-S USB: D-RX len(%d)", fifo
->skbuff
->len
);
825 DBG_SKB(HFCUSB_DBG_DCHANNEL
, fifo
->skbuff
);
828 /* remove CRC & status */
829 skb_trim(fifo
->skbuff
, fifo
->skbuff
->len
- 3);
830 if (fifon
== HFCUSB_PCM_RX
) {
831 fifo
->hif
->l1l2(fifo
->hif
,
832 PH_DATA_E
| INDICATION
,
835 fifo
->hif
->l1l2(fifo
->hif
,
836 PH_DATA
| INDICATION
,
838 fifo
->skbuff
= NULL
; /* buffer was freed from upper layer */
840 DBG(HFCUSB_DBG_FIFO_ERR
,
841 "HFC-S USB: ERROR frame len(%d) fifo(%d)",
842 fifo
->skbuff
->len
, fifon
);
843 DBG_SKB(HFCUSB_DBG_VERBOSE_USB
, fifo
->skbuff
);
844 skb_trim(fifo
->skbuff
, 0);
850 rx_int_complete(struct urb
*urb
)
854 __u8
*buf
, maxlen
, fifon
;
855 usb_fifo
*fifo
= (usb_fifo
*) urb
->context
;
856 hfcusb_data
*hfc
= fifo
->hfc
;
859 urb
->dev
= hfc
->dev
; /* security init */
861 fifon
= fifo
->fifonum
;
862 if ((!fifo
->active
) || (urb
->status
)) {
863 DBG(HFCUSB_DBG_INIT
, "HFC-S USB: RX-Fifo %i is going down (%i)",
866 fifo
->urb
->interval
= 0; /* cancel automatic rescheduling */
868 dev_kfree_skb_any(fifo
->skbuff
);
873 len
= urb
->actual_length
;
875 maxlen
= fifo
->usb_packet_maxlen
;
877 if (fifon
== HFCUSB_D_RX
) {
878 DBG(HFCUSB_DBG_VERBOSE_USB
,
879 "HFC-S USB: INT-D-RX lst_urblen:%2d "
880 "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
881 fifo
->last_urblen
, len
, maxlen
,
883 DBG_PACKET(HFCUSB_DBG_VERBOSE_USB
, buf
, len
);
886 if (fifo
->last_urblen
!= fifo
->usb_packet_maxlen
) {
887 /* the threshold mask is in the 2nd status byte */
888 hfc
->threshold_mask
= buf
[1];
889 /* the S0 state is in the upper half of the 1st status byte */
890 s0_state_handler(hfc
, buf
[0] >> 4);
891 eof
[fifon
] = buf
[0] & 1;
892 /* if we have more than the 2 status bytes -> collect data */
894 collect_rx_frame(fifo
, buf
+ 2,
895 urb
->actual_length
- 2,
896 (len
< maxlen
) ? eof
[fifon
] : 0);
898 collect_rx_frame(fifo
, buf
, urb
->actual_length
,
899 (len
< maxlen
) ? eof
[fifon
] : 0);
901 fifo
->last_urblen
= urb
->actual_length
;
902 status
= usb_submit_urb(urb
, GFP_ATOMIC
);
905 "HFC-S USB: %s error resubmitting URB fifo(%d)\n",
910 /* start initial INT-URB for certain fifo */
912 start_int_fifo(usb_fifo
*fifo
)
916 DBG(HFCUSB_DBG_INIT
, "HFC-S USB: starting RX INT-URB for fifo:%d\n",
920 fifo
->urb
= usb_alloc_urb(0, GFP_KERNEL
);
924 usb_fill_int_urb(fifo
->urb
, fifo
->hfc
->dev
, fifo
->pipe
,
925 fifo
->buffer
, fifo
->usb_packet_maxlen
,
926 rx_int_complete
, fifo
, fifo
->intervall
);
927 fifo
->active
= 1; /* must be marked active */
928 errcode
= usb_submit_urb(fifo
->urb
, GFP_KERNEL
);
931 "HFC-S USB: submit URB error(start_int_info): status:%i\n",
939 setup_bchannel(hfcusb_data
*hfc
, int channel
, int mode
)
941 __u8 val
, idx_table
[2] = { 0, 2 };
943 if (hfc
->disc_flag
) {
946 DBG(HFCUSB_DBG_STATES
, "HFC-S USB: setting channel %d to mode %d",
948 hfc
->b_mode
[channel
] = mode
;
952 if (mode
!= L1_MODE_NULL
)
953 val
= 8; /* enable fifo? */
954 if (mode
== L1_MODE_TRANS
)
955 val
|= 2; /* set transparent bit */
957 /* set FIFO to transmit register */
958 queue_control_request(hfc
, HFCUSB_FIFO
, idx_table
[channel
], 1);
959 queue_control_request(hfc
, HFCUSB_CON_HDLC
, val
, 1);
961 queue_control_request(hfc
, HFCUSB_INC_RES_F
, 2, 1);
962 /* set FIFO to receive register */
963 queue_control_request(hfc
, HFCUSB_FIFO
, idx_table
[channel
] + 1, 1);
964 queue_control_request(hfc
, HFCUSB_CON_HDLC
, val
, 1);
966 queue_control_request(hfc
, HFCUSB_INC_RES_F
, 2, 1);
973 queue_control_request(hfc
, HFCUSB_SCTRL
, val
, 1);
980 queue_control_request(hfc
, HFCUSB_SCTRL_R
, val
, 1);
982 if (mode
== L1_MODE_NULL
) {
984 handle_led(hfc
, LED_B2_OFF
);
986 handle_led(hfc
, LED_B1_OFF
);
989 handle_led(hfc
, LED_B2_ON
);
991 handle_led(hfc
, LED_B1_ON
);
996 hfc_usb_l2l1(struct hisax_if
*my_hisax_if
, int pr
, void *arg
)
998 usb_fifo
*fifo
= my_hisax_if
->priv
;
999 hfcusb_data
*hfc
= fifo
->hfc
;
1002 case PH_ACTIVATE
| REQUEST
:
1003 if (fifo
->fifonum
== HFCUSB_D_TX
) {
1004 DBG(HFCUSB_DBG_STATES
,
1005 "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_ACTIVATE | REQUEST");
1007 if (hfc
->l1_state
!= 3
1008 && hfc
->l1_state
!= 7) {
1009 hfc
->d_if
.ifc
.l1l2(&hfc
->d_if
.ifc
,
1013 DBG(HFCUSB_DBG_STATES
,
1014 "HFC-S USB: PH_DEACTIVATE | INDICATION sent (not state 3 or 7)");
1016 if (hfc
->l1_state
== 7) { /* l1 already active */
1017 hfc
->d_if
.ifc
.l1l2(&hfc
->
1024 DBG(HFCUSB_DBG_STATES
,
1025 "HFC-S USB: PH_ACTIVATE | INDICATION sent again ;)");
1027 /* force sending sending INFO1 */
1028 queue_control_request(hfc
,
1033 /* start l1 activation */
1034 queue_control_request(hfc
,
1051 DBG(HFCUSB_DBG_STATES
,
1052 "HFC_USB: hfc_usb_d_l2l1 B-chan: PH_ACTIVATE | REQUEST");
1055 HFCUSB_B1_TX
) ? 0 : 1,
1057 fifo
->hif
->l1l2(fifo
->hif
,
1058 PH_ACTIVATE
| INDICATION
,
1062 case PH_DEACTIVATE
| REQUEST
:
1063 if (fifo
->fifonum
== HFCUSB_D_TX
) {
1064 DBG(HFCUSB_DBG_STATES
,
1065 "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_DEACTIVATE | REQUEST");
1067 DBG(HFCUSB_DBG_STATES
,
1068 "HFC_USB: hfc_usb_d_l2l1 Bx-chan: PH_DEACTIVATE | REQUEST");
1071 HFCUSB_B1_TX
) ? 0 : 1,
1072 (int) L1_MODE_NULL
);
1073 fifo
->hif
->l1l2(fifo
->hif
,
1074 PH_DEACTIVATE
| INDICATION
,
1078 case PH_DATA
| REQUEST
:
1079 if (fifo
->skbuff
&& fifo
->delete_flg
) {
1080 dev_kfree_skb_any(fifo
->skbuff
);
1081 fifo
->skbuff
= NULL
;
1082 fifo
->delete_flg
= 0;
1084 fifo
->skbuff
= arg
; /* we have a new buffer */
1087 DBG(HFCUSB_DBG_STATES
,
1088 "HFC_USB: hfc_usb_d_l2l1: unknown state : %#x", pr
);
1093 /* initial init HFC-S USB chip registers, HiSax interface, USB URBs */
1095 hfc_usb_init(hfcusb_data
*hfc
)
1100 struct hisax_b_if
*p_b_if
[2];
1102 /* check the chip id */
1103 if (read_usb(hfc
, HFCUSB_CHIP_ID
, &b
) != 1) {
1104 printk(KERN_INFO
"HFC-USB: cannot read chip id\n");
1107 if (b
!= HFCUSB_CHIPID
) {
1108 printk(KERN_INFO
"HFC-S USB: Invalid chip id 0x%02x\n", b
);
1112 /* first set the needed config, interface and alternate */
1113 usb_set_interface(hfc
->dev
, hfc
->if_used
, hfc
->alt_used
);
1116 write_usb(hfc
, HFCUSB_CIRM
, 8);
1117 /* aux = output, reset off */
1118 write_usb(hfc
, HFCUSB_CIRM
, 0x10);
1120 /* set USB_SIZE to match wMaxPacketSize for INT or BULK transfers */
1121 write_usb(hfc
, HFCUSB_USB_SIZE
,
1122 (hfc
->packet_size
/ 8) | ((hfc
->packet_size
/ 8) << 4));
1124 /* set USB_SIZE_I to match wMaxPacketSize for ISO transfers */
1125 write_usb(hfc
, HFCUSB_USB_SIZE_I
, hfc
->iso_packet_size
);
1127 /* enable PCM/GCI master mode */
1128 write_usb(hfc
, HFCUSB_MST_MODE1
, 0); /* set default values */
1129 write_usb(hfc
, HFCUSB_MST_MODE0
, 1); /* enable master mode */
1131 /* init the fifos */
1132 write_usb(hfc
, HFCUSB_F_THRES
,
1133 (HFCUSB_TX_THRESHOLD
/
1134 8) | ((HFCUSB_RX_THRESHOLD
/ 8) << 4));
1137 for (i
= 0; i
< HFCUSB_NUM_FIFOS
; i
++) {
1138 write_usb(hfc
, HFCUSB_FIFO
, i
); /* select the desired fifo */
1139 fifo
[i
].skbuff
= NULL
; /* init buffer pointer */
1141 (i
<= HFCUSB_B2_RX
) ? MAX_BCH_SIZE
: MAX_DFRAME_LEN
;
1142 fifo
[i
].last_urblen
= 0;
1143 /* set 2 bit for D- & E-channel */
1144 write_usb(hfc
, HFCUSB_HDLC_PAR
,
1145 ((i
<= HFCUSB_B2_RX
) ? 0 : 2));
1146 /* rx hdlc, enable IFF for D-channel */
1147 write_usb(hfc
, HFCUSB_CON_HDLC
,
1148 ((i
== HFCUSB_D_TX
) ? 0x09 : 0x08));
1149 write_usb(hfc
, HFCUSB_INC_RES_F
, 2); /* reset the fifo */
1152 write_usb(hfc
, HFCUSB_CLKDEL
, 0x0f); /* clock delay value */
1153 write_usb(hfc
, HFCUSB_STATES
, 3 | 0x10); /* set deactivated mode */
1154 write_usb(hfc
, HFCUSB_STATES
, 3); /* enable state machine */
1156 write_usb(hfc
, HFCUSB_SCTRL_R
, 0); /* disable both B receivers */
1157 write_usb(hfc
, HFCUSB_SCTRL
, 0x40); /* disable B transmitters + capacitive mode */
1159 /* set both B-channel to not connected */
1160 hfc
->b_mode
[0] = L1_MODE_NULL
;
1161 hfc
->b_mode
[1] = L1_MODE_NULL
;
1163 hfc
->l1_activated
= 0;
1166 hfc
->old_led_state
= 0;
1168 /* init the t3 timer */
1169 init_timer(&hfc
->t3_timer
);
1170 hfc
->t3_timer
.data
= (long) hfc
;
1171 hfc
->t3_timer
.function
= (void *) l1_timer_expire_t3
;
1173 /* init the t4 timer */
1174 init_timer(&hfc
->t4_timer
);
1175 hfc
->t4_timer
.data
= (long) hfc
;
1176 hfc
->t4_timer
.function
= (void *) l1_timer_expire_t4
;
1178 /* init the background machinery for control requests */
1179 hfc
->ctrl_read
.bRequestType
= 0xc0;
1180 hfc
->ctrl_read
.bRequest
= 1;
1181 hfc
->ctrl_read
.wLength
= cpu_to_le16(1);
1182 hfc
->ctrl_write
.bRequestType
= 0x40;
1183 hfc
->ctrl_write
.bRequest
= 0;
1184 hfc
->ctrl_write
.wLength
= 0;
1185 usb_fill_control_urb(hfc
->ctrl_urb
,
1188 (u_char
*)&hfc
->ctrl_write
,
1189 NULL
, 0, ctrl_complete
, hfc
);
1190 /* Init All Fifos */
1191 for (i
= 0; i
< HFCUSB_NUM_FIFOS
; i
++) {
1192 hfc
->fifos
[i
].iso
[0].purb
= NULL
;
1193 hfc
->fifos
[i
].iso
[1].purb
= NULL
;
1194 hfc
->fifos
[i
].active
= 0;
1196 /* register Modul to upper Hisax Layers */
1197 hfc
->d_if
.owner
= THIS_MODULE
;
1198 hfc
->d_if
.ifc
.priv
= &hfc
->fifos
[HFCUSB_D_TX
];
1199 hfc
->d_if
.ifc
.l2l1
= hfc_usb_l2l1
;
1200 for (i
= 0; i
< 2; i
++) {
1201 hfc
->b_if
[i
].ifc
.priv
= &hfc
->fifos
[HFCUSB_B1_TX
+ i
* 2];
1202 hfc
->b_if
[i
].ifc
.l2l1
= hfc_usb_l2l1
;
1203 p_b_if
[i
] = &hfc
->b_if
[i
];
1205 /* default Prot: EURO ISDN, should be a module_param */
1207 i
= hisax_register(&hfc
->d_if
, p_b_if
, "hfc_usb", hfc
->protocol
);
1209 printk(KERN_INFO
"HFC-S USB: hisax_register -> %d\n", i
);
1213 #ifdef CONFIG_HISAX_DEBUG
1217 for (i
= 0; i
< 4; i
++)
1218 hfc
->fifos
[i
].hif
= &p_b_if
[i
/ 2]->ifc
;
1219 for (i
= 4; i
< 8; i
++)
1220 hfc
->fifos
[i
].hif
= &hfc
->d_if
.ifc
;
1222 /* 3 (+1) INT IN + 3 ISO OUT */
1223 if (hfc
->cfg_used
== CNF_3INT3ISO
|| hfc
->cfg_used
== CNF_4INT3ISO
) {
1224 start_int_fifo(hfc
->fifos
+ HFCUSB_D_RX
);
1225 if (hfc
->fifos
[HFCUSB_PCM_RX
].pipe
)
1226 start_int_fifo(hfc
->fifos
+ HFCUSB_PCM_RX
);
1227 start_int_fifo(hfc
->fifos
+ HFCUSB_B1_RX
);
1228 start_int_fifo(hfc
->fifos
+ HFCUSB_B2_RX
);
1230 /* 3 (+1) ISO IN + 3 ISO OUT */
1231 if (hfc
->cfg_used
== CNF_3ISO3ISO
|| hfc
->cfg_used
== CNF_4ISO3ISO
) {
1232 start_isoc_chain(hfc
->fifos
+ HFCUSB_D_RX
, ISOC_PACKETS_D
,
1233 rx_iso_complete
, 16);
1234 if (hfc
->fifos
[HFCUSB_PCM_RX
].pipe
)
1235 start_isoc_chain(hfc
->fifos
+ HFCUSB_PCM_RX
,
1236 ISOC_PACKETS_D
, rx_iso_complete
,
1238 start_isoc_chain(hfc
->fifos
+ HFCUSB_B1_RX
, ISOC_PACKETS_B
,
1239 rx_iso_complete
, 16);
1240 start_isoc_chain(hfc
->fifos
+ HFCUSB_B2_RX
, ISOC_PACKETS_B
,
1241 rx_iso_complete
, 16);
1244 start_isoc_chain(hfc
->fifos
+ HFCUSB_D_TX
, ISOC_PACKETS_D
,
1245 tx_iso_complete
, 1);
1246 start_isoc_chain(hfc
->fifos
+ HFCUSB_B1_TX
, ISOC_PACKETS_B
,
1247 tx_iso_complete
, 1);
1248 start_isoc_chain(hfc
->fifos
+ HFCUSB_B2_TX
, ISOC_PACKETS_B
,
1249 tx_iso_complete
, 1);
1251 handle_led(hfc
, LED_POWER_ON
);
1256 /* initial callback for each plugged USB device */
1258 hfc_usb_probe(struct usb_interface
*intf
, const struct usb_device_id
*id
)
1260 struct usb_device
*dev
= interface_to_usbdev(intf
);
1261 hfcusb_data
*context
;
1262 struct usb_host_interface
*iface
= intf
->cur_altsetting
;
1263 struct usb_host_interface
*iface_used
= NULL
;
1264 struct usb_host_endpoint
*ep
;
1265 int ifnum
= iface
->desc
.bInterfaceNumber
;
1266 int i
, idx
, alt_idx
, probe_alt_setting
, vend_idx
, cfg_used
, *vcf
,
1267 attr
, cfg_found
, cidx
, ep_addr
;
1268 int cmptbl
[16], small_match
, iso_packet_size
, packet_size
,
1270 hfcsusb_vdata
*driver_info
;
1273 for (i
= 0; hfcusb_idtab
[i
].idVendor
; i
++) {
1274 if ((le16_to_cpu(dev
->descriptor
.idVendor
) == hfcusb_idtab
[i
].idVendor
)
1275 && (le16_to_cpu(dev
->descriptor
.idProduct
) == hfcusb_idtab
[i
].idProduct
)) {
1282 "HFC-S USB: probing interface(%d) actalt(%d) minor(%d)\n",
1283 ifnum
, iface
->desc
.bAlternateSetting
, intf
->minor
);
1285 if (vend_idx
!= 0xffff) {
1286 /* if vendor and product ID is OK, start probing alternate settings */
1288 small_match
= 0xffff;
1290 /* default settings */
1291 iso_packet_size
= 16;
1294 while (alt_idx
< intf
->num_altsetting
) {
1295 iface
= intf
->altsetting
+ alt_idx
;
1296 probe_alt_setting
= iface
->desc
.bAlternateSetting
;
1299 /* check for config EOL element */
1300 while (validconf
[cfg_used
][0]) {
1302 vcf
= validconf
[cfg_used
];
1303 /* first endpoint descriptor */
1304 ep
= iface
->endpoint
;
1306 memcpy(cmptbl
, vcf
, 16 * sizeof(int));
1308 /* check for all endpoints in this alternate setting */
1309 for (i
= 0; i
< iface
->desc
.bNumEndpoints
;
1312 ep
->desc
.bEndpointAddress
;
1313 /* get endpoint base */
1314 idx
= ((ep_addr
& 0x7f) - 1) * 2;
1317 attr
= ep
->desc
.bmAttributes
;
1318 if (cmptbl
[idx
] == EP_NUL
) {
1321 if (attr
== USB_ENDPOINT_XFER_INT
1322 && cmptbl
[idx
] == EP_INT
)
1323 cmptbl
[idx
] = EP_NUL
;
1324 if (attr
== USB_ENDPOINT_XFER_BULK
1325 && cmptbl
[idx
] == EP_BLK
)
1326 cmptbl
[idx
] = EP_NUL
;
1327 if (attr
== USB_ENDPOINT_XFER_ISOC
1328 && cmptbl
[idx
] == EP_ISO
)
1329 cmptbl
[idx
] = EP_NUL
;
1331 /* check if all INT endpoints match minimum interval */
1332 if ((attr
== USB_ENDPOINT_XFER_INT
)
1333 && (ep
->desc
.bInterval
< vcf
[17])) {
1338 for (i
= 0; i
< 16; i
++) {
1339 /* all entries must be EP_NOP or EP_NUL for a valid config */
1340 if (cmptbl
[i
] != EP_NOP
1341 && cmptbl
[i
] != EP_NUL
)
1345 if (cfg_used
< small_match
) {
1346 small_match
= cfg_used
;
1355 } /* (alt_idx < intf->num_altsetting) */
1357 /* found a valid USB Ta Endpint config */
1358 if (small_match
!= 0xffff) {
1360 if (!(context
= kzalloc(sizeof(hfcusb_data
), GFP_KERNEL
)))
1361 return (-ENOMEM
); /* got no mem */
1363 ep
= iface
->endpoint
;
1364 vcf
= validconf
[small_match
];
1366 for (i
= 0; i
< iface
->desc
.bNumEndpoints
; i
++) {
1367 ep_addr
= ep
->desc
.bEndpointAddress
;
1368 /* get endpoint base */
1369 idx
= ((ep_addr
& 0x7f) - 1) * 2;
1373 attr
= ep
->desc
.bmAttributes
;
1375 /* init Endpoints */
1376 if (vcf
[idx
] != EP_NOP
1377 && vcf
[idx
] != EP_NUL
) {
1379 case USB_ENDPOINT_XFER_INT
:
1392 le16_to_cpu(ep
->desc
.wMaxPacketSize
);
1394 case USB_ENDPOINT_XFER_BULK
:
1420 le16_to_cpu(ep
->desc
.wMaxPacketSize
);
1422 case USB_ENDPOINT_XFER_ISOC
:
1448 le16_to_cpu(ep
->desc
.wMaxPacketSize
);
1454 } /* switch attribute */
1456 if (context
->fifos
[cidx
].pipe
) {
1457 context
->fifos
[cidx
].
1459 context
->fifos
[cidx
].hfc
=
1461 context
->fifos
[cidx
].usb_packet_maxlen
=
1462 le16_to_cpu(ep
->desc
.wMaxPacketSize
);
1463 context
->fifos
[cidx
].
1466 context
->fifos
[cidx
].
1472 context
->dev
= dev
; /* save device */
1473 context
->if_used
= ifnum
; /* save used interface */
1474 context
->alt_used
= alt_used
; /* and alternate config */
1475 context
->ctrl_paksize
= dev
->descriptor
.bMaxPacketSize0
; /* control size */
1476 context
->cfg_used
= vcf
[16]; /* store used config */
1477 context
->vend_idx
= vend_idx
; /* store found vendor */
1478 context
->packet_size
= packet_size
;
1479 context
->iso_packet_size
= iso_packet_size
;
1481 /* create the control pipes needed for register access */
1482 context
->ctrl_in_pipe
=
1483 usb_rcvctrlpipe(context
->dev
, 0);
1484 context
->ctrl_out_pipe
=
1485 usb_sndctrlpipe(context
->dev
, 0);
1487 driver_info
= (hfcsusb_vdata
*)
1488 hfcusb_idtab
[vend_idx
].driver_info
;
1490 context
->ctrl_urb
= usb_alloc_urb(0, GFP_KERNEL
);
1492 if (!context
->ctrl_urb
) {
1493 pr_warn("%s: No memory for control urb\n",
1494 driver_info
->vend_name
);
1499 pr_info("HFC-S USB: detected \"%s\"\n",
1500 driver_info
->vend_name
);
1502 DBG(HFCUSB_DBG_INIT
,
1503 "HFC-S USB: Endpoint-Config: %s (if=%d alt=%d), E-Channel(%d)",
1504 conf_str
[small_match
], context
->if_used
,
1506 validconf
[small_match
][18]);
1508 /* init the chip and register the driver */
1509 if (hfc_usb_init(context
)) {
1510 usb_kill_urb(context
->ctrl_urb
);
1511 usb_free_urb(context
->ctrl_urb
);
1512 context
->ctrl_urb
= NULL
;
1516 usb_set_intfdata(intf
, context
);
1521 "HFC-S USB: no valid vendor found in USB descriptor\n");
1526 /* callback for unplugged USB device */
1528 hfc_usb_disconnect(struct usb_interface
*intf
)
1530 hfcusb_data
*context
= usb_get_intfdata(intf
);
1533 handle_led(context
, LED_POWER_OFF
);
1534 schedule_timeout(HZ
/ 100);
1536 printk(KERN_INFO
"HFC-S USB: device disconnect\n");
1537 context
->disc_flag
= 1;
1538 usb_set_intfdata(intf
, NULL
);
1540 if (timer_pending(&context
->t3_timer
))
1541 del_timer(&context
->t3_timer
);
1542 if (timer_pending(&context
->t4_timer
))
1543 del_timer(&context
->t4_timer
);
1545 /* tell all fifos to terminate */
1546 for (i
= 0; i
< HFCUSB_NUM_FIFOS
; i
++) {
1547 if (context
->fifos
[i
].usb_transfer_mode
== USB_ISOC
) {
1548 if (context
->fifos
[i
].active
> 0) {
1549 stop_isoc_chain(&context
->fifos
[i
]);
1550 DBG(HFCUSB_DBG_INIT
,
1551 "HFC-S USB: %s stopping ISOC chain Fifo(%i)",
1555 if (context
->fifos
[i
].active
> 0) {
1556 context
->fifos
[i
].active
= 0;
1557 DBG(HFCUSB_DBG_INIT
,
1558 "HFC-S USB: %s unlinking URB for Fifo(%i)",
1561 usb_kill_urb(context
->fifos
[i
].urb
);
1562 usb_free_urb(context
->fifos
[i
].urb
);
1563 context
->fifos
[i
].urb
= NULL
;
1565 context
->fifos
[i
].active
= 0;
1567 usb_kill_urb(context
->ctrl_urb
);
1568 usb_free_urb(context
->ctrl_urb
);
1569 context
->ctrl_urb
= NULL
;
1570 hisax_unregister(&context
->d_if
);
1571 kfree(context
); /* free our structure again */
1574 static struct usb_driver hfc_drv
= {
1576 .id_table
= hfcusb_idtab
,
1577 .probe
= hfc_usb_probe
,
1578 .disconnect
= hfc_usb_disconnect
,
1579 .disable_hub_initiated_lpm
= 1,
1583 hfc_usb_mod_exit(void)
1585 usb_deregister(&hfc_drv
); /* release our driver */
1586 printk(KERN_INFO
"HFC-S USB: module removed\n");
1590 hfc_usb_mod_init(void)
1592 char revstr
[30], datestr
[30], dummy
[30];
1593 #ifndef CONFIG_HISAX_DEBUG
1596 sscanf(hfcusb_revision
,
1597 "%s %s $ %s %s %s $ ", dummy
, revstr
,
1598 dummy
, datestr
, dummy
);
1600 "HFC-S USB: driver module revision %s date %s loaded, (debug=%i)\n",
1601 revstr
, datestr
, debug
);
1602 if (usb_register(&hfc_drv
)) {
1604 "HFC-S USB: Unable to register HFC-S USB module at usb stack\n");
1605 return (-1); /* unable to register */
1610 module_init(hfc_usb_mod_init
);
1611 module_exit(hfc_usb_mod_exit
);
1612 MODULE_AUTHOR(DRIVER_AUTHOR
);
1613 MODULE_DESCRIPTION(DRIVER_DESC
);
1614 MODULE_LICENSE("GPL");
1615 MODULE_DEVICE_TABLE(usb
, hfcusb_idtab
);