linux/drivers/isdn/hisax/hfc_usb.c
<<
>>
Prefs
   1/*
   2 * hfc_usb.c
   3 *
   4 * $Id: hfc_usb.c,v 2.3.2.24 2007/10/14 08:40:29 mbachem Exp $
   5 *
   6 * modular HiSax ISDN driver for Colognechip HFC-S USB chip
   7 *
   8 * Authors : Peter Sprenger (sprenger@moving-bytes.de)
   9 *           Martin Bachem (m.bachem@gmx.de, info@colognechip.com)
  10 *
  11 *           based on the first hfc_usb driver of
  12 *           Werner Cornelius (werner@isdn-development.de)
  13 *
  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)
  17 * any later version.
  18 *
  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.
  23 *
  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.
  27 *
  28 * See Version Histroy at the bottom of this file
  29 *
  30*/
  31
  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 "hisax.h"
  43#include "hisax_if.h"
  44#include "hfc_usb.h"
  45
  46static const char *hfcusb_revision =
  47    "$Revision: 2.3.2.24 $ $Date: 2007/10/14 08:40:29 $ ";
  48
  49/* Hisax debug support
  50*  debug flags defined in hfc_usb.h as HFCUSB_DBG_[*]
  51*/
  52#define __debug_variable hfc_debug
  53#include "hisax_debug.h"
  54static u_int debug;
  55module_param(debug, uint, 0);
  56static int hfc_debug;
  57
  58
  59/* private vendor specific data */
  60typedef struct {
  61        __u8 led_scheme;        // led display scheme
  62        signed short led_bits[8];       // array of 8 possible LED bitmask settings
  63        char *vend_name;        // device name
  64} hfcsusb_vdata;
  65
  66/* VID/PID device list */
  67static struct usb_device_id hfcusb_idtab[] = {
  68        {
  69         USB_DEVICE(0x0959, 0x2bd0),
  70         .driver_info = (unsigned long) &((hfcsusb_vdata)
  71                          {LED_OFF, {4, 0, 2, 1},
  72                           "ISDN USB TA (Cologne Chip HFC-S USB based)"}),
  73        },
  74        {
  75         USB_DEVICE(0x0675, 0x1688),
  76         .driver_info = (unsigned long) &((hfcsusb_vdata)
  77                          {LED_SCHEME1, {1, 2, 0, 0},
  78                           "DrayTek miniVigor 128 USB ISDN TA"}),
  79        },
  80        {
  81         USB_DEVICE(0x07b0, 0x0007),
  82         .driver_info = (unsigned long) &((hfcsusb_vdata)
  83                          {LED_SCHEME1, {0x80, -64, -32, -16},
  84                           "Billion tiny USB ISDN TA 128"}),
  85        },
  86        {
  87         USB_DEVICE(0x0742, 0x2008),
  88         .driver_info = (unsigned long) &((hfcsusb_vdata)
  89                          {LED_SCHEME1, {4, 0, 2, 1},
  90                           "Stollmann USB TA"}),
  91        },
  92        {
  93         USB_DEVICE(0x0742, 0x2009),
  94         .driver_info = (unsigned long) &((hfcsusb_vdata)
  95                          {LED_SCHEME1, {4, 0, 2, 1},
  96                           "Aceex USB ISDN TA"}),
  97        },
  98        {
  99         USB_DEVICE(0x0742, 0x200A),
 100         .driver_info = (unsigned long) &((hfcsusb_vdata)
 101                          {LED_SCHEME1, {4, 0, 2, 1},
 102                           "OEM USB ISDN TA"}),
 103        },
 104        {
 105         USB_DEVICE(0x08e3, 0x0301),
 106         .driver_info = (unsigned long) &((hfcsusb_vdata)
 107                          {LED_SCHEME1, {2, 0, 1, 4},
 108                           "Olitec USB RNIS"}),
 109        },
 110        {
 111         USB_DEVICE(0x07fa, 0x0846),
 112         .driver_info = (unsigned long) &((hfcsusb_vdata)
 113                          {LED_SCHEME1, {0x80, -64, -32, -16},
 114                           "Bewan Modem RNIS USB"}),
 115        },
 116        {
 117         USB_DEVICE(0x07fa, 0x0847),
 118         .driver_info = (unsigned long) &((hfcsusb_vdata)
 119                          {LED_SCHEME1, {0x80, -64, -32, -16},
 120                           "Djinn Numeris USB"}),
 121        },
 122        {
 123         USB_DEVICE(0x07b0, 0x0006),
 124         .driver_info = (unsigned long) &((hfcsusb_vdata)
 125                          {LED_SCHEME1, {0x80, -64, -32, -16},
 126                           "Twister ISDN TA"}),
 127        },
 128        {
 129         USB_DEVICE(0x071d, 0x1005),
 130         .driver_info = (unsigned long) &((hfcsusb_vdata)
 131                          {LED_SCHEME1, {0x02, 0, 0x01, 0x04},
 132                           "Eicon DIVA USB 4.0"}),
 133        },
 134        { }
 135};
 136
 137/* structure defining input+output fifos (interrupt/bulk mode) */
 138struct usb_fifo;                /* forward definition */
 139typedef struct iso_urb_struct {
 140        struct urb *purb;
 141        __u8 buffer[ISO_BUFFER_SIZE];   /* buffer incoming/outgoing data */
 142        struct usb_fifo *owner_fifo;    /* pointer to owner fifo */
 143} iso_urb_struct;
 144
 145struct hfcusb_data;             /* forward definition */
 146
 147typedef struct usb_fifo {
 148        int fifonum;            /* fifo index attached to this structure */
 149        int active;             /* fifo is currently active */
 150        struct hfcusb_data *hfc;        /* pointer to main structure */
 151        int pipe;               /* address of endpoint */
 152        __u8 usb_packet_maxlen; /* maximum length for usb transfer */
 153        unsigned int max_size;  /* maximum size of receive/send packet */
 154        __u8 intervall;         /* interrupt interval */
 155        struct sk_buff *skbuff; /* actual used buffer */
 156        struct urb *urb;        /* transfer structure for usb routines */
 157        __u8 buffer[128];       /* buffer incoming/outgoing data */
 158        int bit_line;           /* how much bits are in the fifo? */
 159
 160        volatile __u8 usb_transfer_mode;        /* switched between ISO and INT */
 161        iso_urb_struct iso[2];  /* need two urbs to have one always for pending */
 162        struct hisax_if *hif;   /* hisax interface */
 163        int delete_flg;         /* only delete skbuff once */
 164        int last_urblen;        /* remember length of last packet */
 165} usb_fifo;
 166
 167/* structure holding all data for one device */
 168typedef struct hfcusb_data {
 169        /* HiSax Interface for loadable Layer1 drivers */
 170        struct hisax_d_if d_if;         /* see hisax_if.h */
 171        struct hisax_b_if b_if[2];      /* see hisax_if.h */
 172        int protocol;
 173
 174        struct usb_device *dev; /* our device */
 175        int if_used;            /* used interface number */
 176        int alt_used;           /* used alternate config */
 177        int ctrl_paksize;       /* control pipe packet size */
 178        int ctrl_in_pipe,       /* handles for control pipe */
 179            ctrl_out_pipe;
 180        int cfg_used;           /* configuration index used */
 181        int vend_idx;           /* vendor found */
 182        int b_mode[2];          /* B-channel mode */
 183        int l1_activated;       /* layer 1 activated */
 184        int disc_flag;          /* TRUE if device was disonnected to avoid some USB actions */
 185        int packet_size, iso_packet_size;
 186
 187        /* control pipe background handling */
 188        ctrl_buft ctrl_buff[HFC_CTRL_BUFSIZE];  /* buffer holding queued data */
 189        volatile int ctrl_in_idx, ctrl_out_idx, ctrl_cnt;       /* input/output pointer + count */
 190        struct urb *ctrl_urb;   /* transfer structure for control channel */
 191
 192        struct usb_ctrlrequest ctrl_write;      /* buffer for control write request */
 193        struct usb_ctrlrequest ctrl_read;       /* same for read request */
 194
 195        __u8 old_led_state, led_state;
 196
 197        volatile __u8 threshold_mask;   /* threshold actually reported */
 198        volatile __u8 bch_enables;      /* or mask for sctrl_r and sctrl register values */
 199
 200        usb_fifo fifos[HFCUSB_NUM_FIFOS];       /* structure holding all fifo data */
 201
 202        volatile __u8 l1_state; /* actual l1 state */
 203        struct timer_list t3_timer;     /* timer 3 for activation/deactivation */
 204        struct timer_list t4_timer;     /* timer 4 for activation/deactivation */
 205} hfcusb_data;
 206
 207
 208static void collect_rx_frame(usb_fifo * fifo, __u8 * data, int len,
 209                             int finish);
 210
 211static inline const char *
 212symbolic(struct hfcusb_symbolic_list list[], const int num)
 213{
 214        int i;
 215        for (i = 0; list[i].name != NULL; i++)
 216                if (list[i].num == num)
 217                        return (list[i].name);
 218        return "<unknown ERROR>";
 219}
 220
 221static void
 222ctrl_start_transfer(hfcusb_data * hfc)
 223{
 224        if (hfc->ctrl_cnt) {
 225                hfc->ctrl_urb->pipe = hfc->ctrl_out_pipe;
 226                hfc->ctrl_urb->setup_packet = (u_char *) & hfc->ctrl_write;
 227                hfc->ctrl_urb->transfer_buffer = NULL;
 228                hfc->ctrl_urb->transfer_buffer_length = 0;
 229                hfc->ctrl_write.wIndex =
 230                    cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg);
 231                hfc->ctrl_write.wValue =
 232                    cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].reg_val);
 233
 234                usb_submit_urb(hfc->ctrl_urb, GFP_ATOMIC);      /* start transfer */
 235        }
 236}                               /* ctrl_start_transfer */
 237
 238static int
 239queue_control_request(hfcusb_data * hfc, __u8 reg, __u8 val, int action)
 240{
 241        ctrl_buft *buf;
 242
 243        if (hfc->ctrl_cnt >= HFC_CTRL_BUFSIZE)
 244                return (1);     /* no space left */
 245        buf = &hfc->ctrl_buff[hfc->ctrl_in_idx];        /* pointer to new index */
 246        buf->hfc_reg = reg;
 247        buf->reg_val = val;
 248        buf->action = action;
 249        if (++hfc->ctrl_in_idx >= HFC_CTRL_BUFSIZE)
 250                hfc->ctrl_in_idx = 0;   /* pointer wrap */
 251        if (++hfc->ctrl_cnt == 1)
 252                ctrl_start_transfer(hfc);
 253        return (0);
 254}
 255
 256static void
 257ctrl_complete(struct urb *urb)
 258{
 259        hfcusb_data *hfc = (hfcusb_data *) urb->context;
 260        ctrl_buft *buf;
 261
 262        urb->dev = hfc->dev;
 263        if (hfc->ctrl_cnt) {
 264                buf = &hfc->ctrl_buff[hfc->ctrl_out_idx];
 265                hfc->ctrl_cnt--;        /* decrement actual count */
 266                if (++hfc->ctrl_out_idx >= HFC_CTRL_BUFSIZE)
 267                        hfc->ctrl_out_idx = 0;  /* pointer wrap */
 268
 269                ctrl_start_transfer(hfc);       /* start next transfer */
 270        }
 271}
 272
 273/* write led data to auxport & invert if necessary */
 274static void
 275write_led(hfcusb_data * hfc, __u8 led_state)
 276{
 277        if (led_state != hfc->old_led_state) {
 278                hfc->old_led_state = led_state;
 279                queue_control_request(hfc, HFCUSB_P_DATA, led_state, 1);
 280        }
 281}
 282
 283static void
 284set_led_bit(hfcusb_data * hfc, signed short led_bits, int on)
 285{
 286        if (on) {
 287                if (led_bits < 0)
 288                        hfc->led_state &= ~abs(led_bits);
 289                else
 290                        hfc->led_state |= led_bits;
 291        } else {
 292                if (led_bits < 0)
 293                        hfc->led_state |= abs(led_bits);
 294                else
 295                        hfc->led_state &= ~led_bits;
 296        }
 297}
 298
 299/* handle LED requests */
 300static void
 301handle_led(hfcusb_data * hfc, int event)
 302{
 303        hfcsusb_vdata *driver_info =
 304            (hfcsusb_vdata *) hfcusb_idtab[hfc->vend_idx].driver_info;
 305
 306        /* if no scheme -> no LED action */
 307        if (driver_info->led_scheme == LED_OFF)
 308                return;
 309
 310        switch (event) {
 311                case LED_POWER_ON:
 312                        set_led_bit(hfc, driver_info->led_bits[0], 1);
 313                        set_led_bit(hfc, driver_info->led_bits[1], 0);
 314                        set_led_bit(hfc, driver_info->led_bits[2], 0);
 315                        set_led_bit(hfc, driver_info->led_bits[3], 0);
 316                        break;
 317                case LED_POWER_OFF:
 318                        set_led_bit(hfc, driver_info->led_bits[0], 0);
 319                        set_led_bit(hfc, driver_info->led_bits[1], 0);
 320                        set_led_bit(hfc, driver_info->led_bits[2], 0);
 321                        set_led_bit(hfc, driver_info->led_bits[3], 0);
 322                        break;
 323                case LED_S0_ON:
 324                        set_led_bit(hfc, driver_info->led_bits[1], 1);
 325                        break;
 326                case LED_S0_OFF:
 327                        set_led_bit(hfc, driver_info->led_bits[1], 0);
 328                        break;
 329                case LED_B1_ON:
 330                        set_led_bit(hfc, driver_info->led_bits[2], 1);
 331                        break;
 332                case LED_B1_OFF:
 333                        set_led_bit(hfc, driver_info->led_bits[2], 0);
 334                        break;
 335                case LED_B2_ON:
 336                        set_led_bit(hfc, driver_info->led_bits[3], 1);
 337                        break;
 338                case LED_B2_OFF:
 339                        set_led_bit(hfc, driver_info->led_bits[3], 0);
 340                        break;
 341        }
 342        write_led(hfc, hfc->led_state);
 343}
 344
 345/* ISDN l1 timer T3 expires */
 346static void
 347l1_timer_expire_t3(hfcusb_data * hfc)
 348{
 349        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc, PH_DEACTIVATE | INDICATION,
 350                           NULL);
 351
 352        DBG(HFCUSB_DBG_STATES,
 353            "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T3 expire)");
 354
 355        hfc->l1_activated = 0;
 356        handle_led(hfc, LED_S0_OFF);
 357        /* deactivate : */
 358        queue_control_request(hfc, HFCUSB_STATES, 0x10, 1);
 359        queue_control_request(hfc, HFCUSB_STATES, 3, 1);
 360}
 361
 362/* ISDN l1 timer T4 expires */
 363static void
 364l1_timer_expire_t4(hfcusb_data * hfc)
 365{
 366        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc, PH_DEACTIVATE | INDICATION,
 367                           NULL);
 368
 369        DBG(HFCUSB_DBG_STATES,
 370            "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T4 expire)");
 371
 372        hfc->l1_activated = 0;
 373        handle_led(hfc, LED_S0_OFF);
 374}
 375
 376/* S0 state changed */
 377static void
 378s0_state_handler(hfcusb_data * hfc, __u8 state)
 379{
 380        __u8 old_state;
 381
 382        old_state = hfc->l1_state;
 383        if (state == old_state || state < 1 || state > 8)
 384                return;
 385
 386        DBG(HFCUSB_DBG_STATES, "HFC-S USB: S0 statechange(%d -> %d)",
 387            old_state, state);
 388
 389        if (state < 4 || state == 7 || state == 8) {
 390                if (timer_pending(&hfc->t3_timer))
 391                        del_timer(&hfc->t3_timer);
 392                DBG(HFCUSB_DBG_STATES, "HFC-S USB: T3 deactivated");
 393        }
 394        if (state >= 7) {
 395                if (timer_pending(&hfc->t4_timer))
 396                        del_timer(&hfc->t4_timer);
 397                DBG(HFCUSB_DBG_STATES, "HFC-S USB: T4 deactivated");
 398        }
 399
 400        if (state == 7 && !hfc->l1_activated) {
 401                hfc->d_if.ifc.l1l2(&hfc->d_if.ifc,
 402                                   PH_ACTIVATE | INDICATION, NULL);
 403                DBG(HFCUSB_DBG_STATES, "HFC-S USB: PH_ACTIVATE | INDICATION sent");
 404                hfc->l1_activated = 1;
 405                handle_led(hfc, LED_S0_ON);
 406        } else if (state <= 3 /* && activated */ ) {
 407                if (old_state == 7 || old_state == 8) {
 408                        DBG(HFCUSB_DBG_STATES, "HFC-S USB: T4 activated");
 409                        if (!timer_pending(&hfc->t4_timer)) {
 410                                hfc->t4_timer.expires =
 411                                    jiffies + (HFC_TIMER_T4 * HZ) / 1000;
 412                                add_timer(&hfc->t4_timer);
 413                        }
 414                } else {
 415                        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc,
 416                                           PH_DEACTIVATE | INDICATION,
 417                                           NULL);
 418                        DBG(HFCUSB_DBG_STATES,
 419                            "HFC-S USB: PH_DEACTIVATE | INDICATION sent");
 420                        hfc->l1_activated = 0;
 421                        handle_led(hfc, LED_S0_OFF);
 422                }
 423        }
 424        hfc->l1_state = state;
 425}
 426
 427static void
 428fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,
 429              void *buf, int num_packets, int packet_size, int interval,
 430              usb_complete_t complete, void *context)
 431{
 432        int k;
 433
 434        urb->dev = dev;
 435        urb->pipe = pipe;
 436        urb->complete = complete;
 437        urb->number_of_packets = num_packets;
 438        urb->transfer_buffer_length = packet_size * num_packets;
 439        urb->context = context;
 440        urb->transfer_buffer = buf;
 441        urb->transfer_flags = URB_ISO_ASAP;
 442        urb->actual_length = 0;
 443        urb->interval = interval;
 444        for (k = 0; k < num_packets; k++) {
 445                urb->iso_frame_desc[k].offset = packet_size * k;
 446                urb->iso_frame_desc[k].length = packet_size;
 447                urb->iso_frame_desc[k].actual_length = 0;
 448        }
 449}
 450
 451/* allocs urbs and start isoc transfer with two pending urbs to avoid
 452 * gaps in the transfer chain
 453 */
 454static int
 455start_isoc_chain(usb_fifo * fifo, int num_packets_per_urb,
 456                 usb_complete_t complete, int packet_size)
 457{
 458        int i, k, errcode;
 459
 460        DBG(HFCUSB_DBG_INIT, "HFC-S USB: starting ISO-URBs for fifo:%d\n",
 461            fifo->fifonum);
 462
 463        /* allocate Memory for Iso out Urbs */
 464        for (i = 0; i < 2; i++) {
 465                if (!(fifo->iso[i].purb)) {
 466                        fifo->iso[i].purb =
 467                            usb_alloc_urb(num_packets_per_urb, GFP_KERNEL);
 468                        if (!(fifo->iso[i].purb)) {
 469                                printk(KERN_INFO
 470                                       "alloc urb for fifo %i failed!!!",
 471                                       fifo->fifonum);
 472                        }
 473                        fifo->iso[i].owner_fifo = (struct usb_fifo *) fifo;
 474
 475                        /* Init the first iso */
 476                        if (ISO_BUFFER_SIZE >=
 477                            (fifo->usb_packet_maxlen *
 478                             num_packets_per_urb)) {
 479                                fill_isoc_urb(fifo->iso[i].purb,
 480                                              fifo->hfc->dev, fifo->pipe,
 481                                              fifo->iso[i].buffer,
 482                                              num_packets_per_urb,
 483                                              fifo->usb_packet_maxlen,
 484                                              fifo->intervall, complete,
 485                                              &fifo->iso[i]);
 486                                memset(fifo->iso[i].buffer, 0,
 487                                       sizeof(fifo->iso[i].buffer));
 488                                /* defining packet delimeters in fifo->buffer */
 489                                for (k = 0; k < num_packets_per_urb; k++) {
 490                                        fifo->iso[i].purb->
 491                                            iso_frame_desc[k].offset =
 492                                            k * packet_size;
 493                                        fifo->iso[i].purb->
 494                                            iso_frame_desc[k].length =
 495                                            packet_size;
 496                                }
 497                        } else {
 498                                printk(KERN_INFO
 499                                       "HFC-S USB: ISO Buffer size to small!\n");
 500                        }
 501                }
 502                fifo->bit_line = BITLINE_INF;
 503
 504                errcode = usb_submit_urb(fifo->iso[i].purb, GFP_KERNEL);
 505                fifo->active = (errcode >= 0) ? 1 : 0;
 506                if (errcode < 0)
 507                        printk(KERN_INFO "HFC-S USB: usb_submit_urb URB nr:%d, error(%i): '%s'\n",
 508                               i, errcode, symbolic(urb_errlist, errcode));
 509        }
 510        return (fifo->active);
 511}
 512
 513/* stops running iso chain and frees their pending urbs */
 514static void
 515stop_isoc_chain(usb_fifo * fifo)
 516{
 517        int i;
 518
 519        for (i = 0; i < 2; i++) {
 520                if (fifo->iso[i].purb) {
 521                        DBG(HFCUSB_DBG_INIT,
 522                            "HFC-S USB: Stopping iso chain for fifo %i.%i",
 523                            fifo->fifonum, i);
 524                        usb_kill_urb(fifo->iso[i].purb);
 525                        usb_free_urb(fifo->iso[i].purb);
 526                        fifo->iso[i].purb = NULL;
 527                }
 528        }
 529
 530        usb_kill_urb(fifo->urb);
 531        usb_free_urb(fifo->urb);
 532        fifo->urb = NULL;
 533        fifo->active = 0;
 534}
 535
 536/* defines how much ISO packets are handled in one URB */
 537static int iso_packets[8] =
 538    { ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B,
 539        ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D
 540};
 541
 542static void
 543tx_iso_complete(struct urb *urb)
 544{
 545        iso_urb_struct *context_iso_urb = (iso_urb_struct *) urb->context;
 546        usb_fifo *fifo = context_iso_urb->owner_fifo;
 547        hfcusb_data *hfc = fifo->hfc;
 548        int k, tx_offset, num_isoc_packets, sink, len, current_len,
 549            errcode;
 550        int frame_complete, transp_mode, fifon, status;
 551        __u8 threshbit;
 552
 553        fifon = fifo->fifonum;
 554        status = urb->status;
 555
 556        tx_offset = 0;
 557
 558        /* ISO transfer only partially completed,
 559           look at individual frame status for details */
 560        if (status == -EXDEV) {
 561                DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: tx_iso_complete with -EXDEV"
 562                    ", urb->status %d, fifonum %d\n",
 563                    status, fifon);
 564
 565                for (k = 0; k < iso_packets[fifon]; ++k) {
 566                        errcode = urb->iso_frame_desc[k].status;
 567                        if (errcode)
 568                                DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: tx_iso_complete "
 569                                       "packet %i, status: %i\n",
 570                                       k, errcode);
 571                }
 572
 573                // clear status, so go on with ISO transfers
 574                status = 0;
 575        }
 576
 577        if (fifo->active && !status) {
 578                transp_mode = 0;
 579                if (fifon < 4 && hfc->b_mode[fifon / 2] == L1_MODE_TRANS)
 580                        transp_mode = 1;
 581
 582                /* is FifoFull-threshold set for our channel? */
 583                threshbit = (hfc->threshold_mask & (1 << fifon));
 584                num_isoc_packets = iso_packets[fifon];
 585
 586                /* predict dataflow to avoid fifo overflow */
 587                if (fifon >= HFCUSB_D_TX) {
 588                        sink = (threshbit) ? SINK_DMIN : SINK_DMAX;
 589                } else {
 590                        sink = (threshbit) ? SINK_MIN : SINK_MAX;
 591                }
 592                fill_isoc_urb(urb, fifo->hfc->dev, fifo->pipe,
 593                              context_iso_urb->buffer, num_isoc_packets,
 594                              fifo->usb_packet_maxlen, fifo->intervall,
 595                              tx_iso_complete, urb->context);
 596                memset(context_iso_urb->buffer, 0,
 597                       sizeof(context_iso_urb->buffer));
 598                frame_complete = 0;
 599
 600                /* Generate next ISO Packets */
 601                for (k = 0; k < num_isoc_packets; ++k) {
 602                        if (fifo->skbuff) {
 603                                len = fifo->skbuff->len;
 604                                /* we lower data margin every msec */
 605                                fifo->bit_line -= sink;
 606                                current_len = (0 - fifo->bit_line) / 8;
 607                                /* maximum 15 byte for every ISO packet makes our life easier */
 608                                if (current_len > 14)
 609                                        current_len = 14;
 610                                current_len =
 611                                    (len <=
 612                                     current_len) ? len : current_len;
 613                                /* how much bit do we put on the line? */
 614                                fifo->bit_line += current_len * 8;
 615
 616                                context_iso_urb->buffer[tx_offset] = 0;
 617                                if (current_len == len) {
 618                                        if (!transp_mode) {
 619                                                /* here frame completion */
 620                                                context_iso_urb->
 621                                                    buffer[tx_offset] = 1;
 622                                                /* add 2 byte flags and 16bit CRC at end of ISDN frame */
 623                                                fifo->bit_line += 32;
 624                                        }
 625                                        frame_complete = 1;
 626                                }
 627
 628                                memcpy(context_iso_urb->buffer +
 629                                       tx_offset + 1, fifo->skbuff->data,
 630                                       current_len);
 631                                skb_pull(fifo->skbuff, current_len);
 632
 633                                /* define packet delimeters within the URB buffer */
 634                                urb->iso_frame_desc[k].offset = tx_offset;
 635                                urb->iso_frame_desc[k].length =
 636                                    current_len + 1;
 637
 638                                tx_offset += (current_len + 1);
 639                        } else {
 640                                urb->iso_frame_desc[k].offset =
 641                                    tx_offset++;
 642
 643                                urb->iso_frame_desc[k].length = 1;
 644                                fifo->bit_line -= sink; /* we lower data margin every msec */
 645
 646                                if (fifo->bit_line < BITLINE_INF) {
 647                                        fifo->bit_line = BITLINE_INF;
 648                                }
 649                        }
 650
 651                        if (frame_complete) {
 652                                fifo->delete_flg = 1;
 653                                fifo->hif->l1l2(fifo->hif,
 654                                                PH_DATA | CONFIRM,
 655                                                (void *) (unsigned long) fifo->skbuff->
 656                                                truesize);
 657                                if (fifo->skbuff && fifo->delete_flg) {
 658                                        dev_kfree_skb_any(fifo->skbuff);
 659                                        fifo->skbuff = NULL;
 660                                        fifo->delete_flg = 0;
 661                                }
 662                                frame_complete = 0;
 663                        }
 664                }
 665                errcode = usb_submit_urb(urb, GFP_ATOMIC);
 666                if (errcode < 0) {
 667                        printk(KERN_INFO
 668                               "HFC-S USB: error submitting ISO URB: %d\n",
 669                               errcode);
 670                }
 671        } else {
 672                if (status && !hfc->disc_flag) {
 673                        printk(KERN_INFO
 674                               "HFC-S USB: tx_iso_complete: error(%i): '%s', fifonum=%d\n",
 675                               status, symbolic(urb_errlist, status), fifon);
 676                }
 677        }
 678}
 679
 680static void
 681rx_iso_complete(struct urb *urb)
 682{
 683        iso_urb_struct *context_iso_urb = (iso_urb_struct *) urb->context;
 684        usb_fifo *fifo = context_iso_urb->owner_fifo;
 685        hfcusb_data *hfc = fifo->hfc;
 686        int k, len, errcode, offset, num_isoc_packets, fifon, maxlen,
 687            status;
 688        unsigned int iso_status;
 689        __u8 *buf;
 690        static __u8 eof[8];
 691
 692        fifon = fifo->fifonum;
 693        status = urb->status;
 694
 695        if (urb->status == -EOVERFLOW) {
 696                DBG(HFCUSB_DBG_VERBOSE_USB,
 697                    "HFC-USB: ignoring USB DATAOVERRUN fifo(%i)", fifon);
 698                status = 0;
 699        }
 700
 701        /* ISO transfer only partially completed,
 702           look at individual frame status for details */
 703        if (status == -EXDEV) {
 704                DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: rx_iso_complete with -EXDEV "
 705                    "urb->status %d, fifonum %d\n",
 706                    status, fifon);
 707                status = 0;
 708        }
 709
 710        if (fifo->active && !status) {
 711                num_isoc_packets = iso_packets[fifon];
 712                maxlen = fifo->usb_packet_maxlen;
 713                for (k = 0; k < num_isoc_packets; ++k) {
 714                        len = urb->iso_frame_desc[k].actual_length;
 715                        offset = urb->iso_frame_desc[k].offset;
 716                        buf = context_iso_urb->buffer + offset;
 717                        iso_status = urb->iso_frame_desc[k].status;
 718
 719                        if (iso_status && !hfc->disc_flag)
 720                                DBG(HFCUSB_DBG_VERBOSE_USB,
 721                                    "HFC-S USB: rx_iso_complete "
 722                                    "ISO packet %i, status: %i\n",
 723                                    k, iso_status);
 724
 725                        if (fifon == HFCUSB_D_RX) {
 726                                DBG(HFCUSB_DBG_VERBOSE_USB,
 727                                       "HFC-S USB: ISO-D-RX lst_urblen:%2d "
 728                                       "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
 729                                       fifo->last_urblen, len, maxlen,
 730                                       eof[5]);
 731
 732                                DBG_PACKET(HFCUSB_DBG_VERBOSE_USB, buf, len);
 733                        }
 734
 735                        if (fifo->last_urblen != maxlen) {
 736                                /* the threshold mask is in the 2nd status byte */
 737                                hfc->threshold_mask = buf[1];
 738                                /* care for L1 state only for D-Channel
 739                                   to avoid overlapped iso completions */
 740                                if (fifon == HFCUSB_D_RX) {
 741                                        /* the S0 state is in the upper half
 742                                           of the 1st status byte */
 743                                        s0_state_handler(hfc, buf[0] >> 4);
 744                                }
 745                                eof[fifon] = buf[0] & 1;
 746                                if (len > 2)
 747                                        collect_rx_frame(fifo, buf + 2,
 748                                                         len - 2,
 749                                                         (len < maxlen) ?
 750                                                         eof[fifon] : 0);
 751                        } else {
 752                                collect_rx_frame(fifo, buf, len,
 753                                                 (len <
 754                                                  maxlen) ? eof[fifon] :
 755                                                 0);
 756                        }
 757                        fifo->last_urblen = len;
 758                }
 759
 760                fill_isoc_urb(urb, fifo->hfc->dev, fifo->pipe,
 761                              context_iso_urb->buffer, num_isoc_packets,
 762                              fifo->usb_packet_maxlen, fifo->intervall,
 763                              rx_iso_complete, urb->context);
 764                errcode = usb_submit_urb(urb, GFP_ATOMIC);
 765                if (errcode < 0) {
 766                        printk(KERN_ERR
 767                               "HFC-S USB: error submitting ISO URB: %d\n",
 768                               errcode);
 769                }
 770        } else {
 771                if (status && !hfc->disc_flag) {
 772                        printk(KERN_ERR
 773                               "HFC-S USB: rx_iso_complete : "
 774                               "urb->status %d, fifonum %d\n",
 775                               status, fifon);
 776                }
 777        }
 778}
 779
 780/* collect rx data from INT- and ISO-URBs  */
 781static void
 782collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
 783{
 784        hfcusb_data *hfc = fifo->hfc;
 785        int transp_mode, fifon;
 786
 787        fifon = fifo->fifonum;
 788        transp_mode = 0;
 789        if (fifon < 4 && hfc->b_mode[fifon / 2] == L1_MODE_TRANS)
 790                transp_mode = 1;
 791
 792        if (!fifo->skbuff) {
 793                fifo->skbuff = dev_alloc_skb(fifo->max_size + 3);
 794                if (!fifo->skbuff) {
 795                        printk(KERN_ERR
 796                               "HFC-S USB: cannot allocate buffer for fifo(%d)\n",
 797                               fifon);
 798                        return;
 799                }
 800        }
 801        if (len) {
 802                if (fifo->skbuff->len + len < fifo->max_size) {
 803                        memcpy(skb_put(fifo->skbuff, len), data, len);
 804                } else {
 805                        DBG(HFCUSB_DBG_FIFO_ERR,
 806                               "HCF-USB: got frame exceeded fifo->max_size(%d) fifo(%d)",
 807                               fifo->max_size, fifon);
 808                        DBG_SKB(HFCUSB_DBG_VERBOSE_USB, fifo->skbuff);
 809                        skb_trim(fifo->skbuff, 0);
 810                }
 811        }
 812        if (transp_mode && fifo->skbuff->len >= 128) {
 813                fifo->hif->l1l2(fifo->hif, PH_DATA | INDICATION,
 814                                fifo->skbuff);
 815                fifo->skbuff = NULL;
 816                return;
 817        }
 818        /* we have a complete hdlc packet */
 819        if (finish) {
 820                if (fifo->skbuff->len > 3 &&
 821                                !fifo->skbuff->data[fifo->skbuff->len - 1]) {
 822
 823                        if (fifon == HFCUSB_D_RX) {
 824                                DBG(HFCUSB_DBG_DCHANNEL,
 825                                    "HFC-S USB: D-RX len(%d)", fifo->skbuff->len);
 826                                DBG_SKB(HFCUSB_DBG_DCHANNEL, fifo->skbuff);
 827                        }
 828
 829                        /* remove CRC & status */
 830                        skb_trim(fifo->skbuff, fifo->skbuff->len - 3);
 831                        if (fifon == HFCUSB_PCM_RX) {
 832                                fifo->hif->l1l2(fifo->hif,
 833                                                PH_DATA_E | INDICATION,
 834                                                fifo->skbuff);
 835                        } else
 836                                fifo->hif->l1l2(fifo->hif,
 837                                                PH_DATA | INDICATION,
 838                                                fifo->skbuff);
 839                        fifo->skbuff = NULL;    /* buffer was freed from upper layer */
 840                } else {
 841                        DBG(HFCUSB_DBG_FIFO_ERR,
 842                            "HFC-S USB: ERROR frame len(%d) fifo(%d)",
 843                            fifo->skbuff->len, fifon);
 844                        DBG_SKB(HFCUSB_DBG_VERBOSE_USB, fifo->skbuff);
 845                        skb_trim(fifo->skbuff, 0);
 846                }
 847        }
 848}
 849
 850static void
 851rx_int_complete(struct urb *urb)
 852{
 853        int len;
 854        int status;
 855        __u8 *buf, maxlen, fifon;
 856        usb_fifo *fifo = (usb_fifo *) urb->context;
 857        hfcusb_data *hfc = fifo->hfc;
 858        static __u8 eof[8];
 859
 860        urb->dev = hfc->dev;    /* security init */
 861
 862        fifon = fifo->fifonum;
 863        if ((!fifo->active) || (urb->status)) {
 864                DBG(HFCUSB_DBG_INIT, "HFC-S USB: RX-Fifo %i is going down (%i)",
 865                    fifon, urb->status);
 866
 867                fifo->urb->interval = 0;        /* cancel automatic rescheduling */
 868                if (fifo->skbuff) {
 869                        dev_kfree_skb_any(fifo->skbuff);
 870                        fifo->skbuff = NULL;
 871                }
 872                return;
 873        }
 874        len = urb->actual_length;
 875        buf = fifo->buffer;
 876        maxlen = fifo->usb_packet_maxlen;
 877
 878        if (fifon == HFCUSB_D_RX) {
 879                DBG(HFCUSB_DBG_VERBOSE_USB,
 880                       "HFC-S USB: INT-D-RX lst_urblen:%2d "
 881                       "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
 882                       fifo->last_urblen, len, maxlen,
 883                       eof[5]);
 884                DBG_PACKET(HFCUSB_DBG_VERBOSE_USB, buf, len);
 885        }
 886
 887        if (fifo->last_urblen != fifo->usb_packet_maxlen) {
 888                /* the threshold mask is in the 2nd status byte */
 889                hfc->threshold_mask = buf[1];
 890                /* the S0 state is in the upper half of the 1st status byte */
 891                s0_state_handler(hfc, buf[0] >> 4);
 892                eof[fifon] = buf[0] & 1;
 893                /* if we have more than the 2 status bytes -> collect data */
 894                if (len > 2)
 895                        collect_rx_frame(fifo, buf + 2,
 896                                         urb->actual_length - 2,
 897                                         (len < maxlen) ? eof[fifon] : 0);
 898        } else {
 899                collect_rx_frame(fifo, buf, urb->actual_length,
 900                                 (len < maxlen) ? eof[fifon] : 0);
 901        }
 902        fifo->last_urblen = urb->actual_length;
 903        status = usb_submit_urb(urb, GFP_ATOMIC);
 904        if (status) {
 905                printk(KERN_INFO
 906                       "HFC-S USB: %s error resubmitting URB fifo(%d)\n",
 907                       __func__, fifon);
 908        }
 909}
 910
 911/* start initial INT-URB for certain fifo */
 912static void
 913start_int_fifo(usb_fifo * fifo)
 914{
 915        int errcode;
 916
 917        DBG(HFCUSB_DBG_INIT, "HFC-S USB: starting RX INT-URB for fifo:%d\n",
 918            fifo->fifonum);
 919
 920        if (!fifo->urb) {
 921                fifo->urb = usb_alloc_urb(0, GFP_KERNEL);
 922                if (!fifo->urb)
 923                        return;
 924        }
 925        usb_fill_int_urb(fifo->urb, fifo->hfc->dev, fifo->pipe,
 926                         fifo->buffer, fifo->usb_packet_maxlen,
 927                         rx_int_complete, fifo, fifo->intervall);
 928        fifo->active = 1;       /* must be marked active */
 929        errcode = usb_submit_urb(fifo->urb, GFP_KERNEL);
 930        if (errcode) {
 931                printk(KERN_ERR
 932                       "HFC-S USB: submit URB error(start_int_info): status:%i\n",
 933                       errcode);
 934                fifo->active = 0;
 935                fifo->skbuff = NULL;
 936        }
 937}
 938
 939static void
 940setup_bchannel(hfcusb_data * hfc, int channel, int mode)
 941{
 942        __u8 val, idx_table[2] = { 0, 2 };
 943
 944        if (hfc->disc_flag) {
 945                return;
 946        }
 947        DBG(HFCUSB_DBG_STATES, "HFC-S USB: setting channel %d to mode %d",
 948            channel, mode);
 949        hfc->b_mode[channel] = mode;
 950
 951        /* setup CON_HDLC */
 952        val = 0;
 953        if (mode != L1_MODE_NULL)
 954                val = 8;        /* enable fifo? */
 955        if (mode == L1_MODE_TRANS)
 956                val |= 2;       /* set transparent bit */
 957
 958        /* set FIFO to transmit register */
 959        queue_control_request(hfc, HFCUSB_FIFO, idx_table[channel], 1);
 960        queue_control_request(hfc, HFCUSB_CON_HDLC, val, 1);
 961        /* reset fifo */
 962        queue_control_request(hfc, HFCUSB_INC_RES_F, 2, 1);
 963        /* set FIFO to receive register */
 964        queue_control_request(hfc, HFCUSB_FIFO, idx_table[channel] + 1, 1);
 965        queue_control_request(hfc, HFCUSB_CON_HDLC, val, 1);
 966        /* reset fifo */
 967        queue_control_request(hfc, HFCUSB_INC_RES_F, 2, 1);
 968
 969        val = 0x40;
 970        if (hfc->b_mode[0])
 971                val |= 1;
 972        if (hfc->b_mode[1])
 973                val |= 2;
 974        queue_control_request(hfc, HFCUSB_SCTRL, val, 1);
 975
 976        val = 0;
 977        if (hfc->b_mode[0])
 978                val |= 1;
 979        if (hfc->b_mode[1])
 980                val |= 2;
 981        queue_control_request(hfc, HFCUSB_SCTRL_R, val, 1);
 982
 983        if (mode == L1_MODE_NULL) {
 984                if (channel)
 985                        handle_led(hfc, LED_B2_OFF);
 986                else
 987                        handle_led(hfc, LED_B1_OFF);
 988        } else {
 989                if (channel)
 990                        handle_led(hfc, LED_B2_ON);
 991                else
 992                        handle_led(hfc, LED_B1_ON);
 993        }
 994}
 995
 996static void
 997hfc_usb_l2l1(struct hisax_if *my_hisax_if, int pr, void *arg)
 998{
 999        usb_fifo *fifo = my_hisax_if->priv;
1000        hfcusb_data *hfc = fifo->hfc;
1001
1002        switch (pr) {
1003                case PH_ACTIVATE | REQUEST:
1004                        if (fifo->fifonum == HFCUSB_D_TX) {
1005                                DBG(HFCUSB_DBG_STATES,
1006                                    "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_ACTIVATE | REQUEST");
1007
1008                                if (hfc->l1_state != 3
1009                                    && hfc->l1_state != 7) {
1010                                        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc,
1011                                                           PH_DEACTIVATE |
1012                                                           INDICATION,
1013                                                           NULL);
1014                                        DBG(HFCUSB_DBG_STATES,
1015                                            "HFC-S USB: PH_DEACTIVATE | INDICATION sent (not state 3 or 7)");
1016                                } else {
1017                                        if (hfc->l1_state == 7) {       /* l1 already active */
1018                                                hfc->d_if.ifc.l1l2(&hfc->
1019                                                                   d_if.
1020                                                                   ifc,
1021                                                                   PH_ACTIVATE
1022                                                                   |
1023                                                                   INDICATION,
1024                                                                   NULL);
1025                                                DBG(HFCUSB_DBG_STATES,
1026                                                    "HFC-S USB: PH_ACTIVATE | INDICATION sent again ;)");
1027                                        } else {
1028                                                /* force sending sending INFO1 */
1029                                                queue_control_request(hfc,
1030                                                                      HFCUSB_STATES,
1031                                                                      0x14,
1032                                                                      1);
1033                                                mdelay(1);
1034                                                /* start l1 activation */
1035                                                queue_control_request(hfc,
1036                                                                      HFCUSB_STATES,
1037                                                                      0x04,
1038                                                                      1);
1039                                                if (!timer_pending
1040                                                    (&hfc->t3_timer)) {
1041                                                        hfc->t3_timer.
1042                                                            expires =
1043                                                            jiffies +
1044                                                            (HFC_TIMER_T3 *
1045                                                             HZ) / 1000;
1046                                                        add_timer(&hfc->
1047                                                                  t3_timer);
1048                                                }
1049                                        }
1050                                }
1051                        } else {
1052                                DBG(HFCUSB_DBG_STATES,
1053                                    "HFC_USB: hfc_usb_d_l2l1 B-chan: PH_ACTIVATE | REQUEST");
1054                                setup_bchannel(hfc,
1055                                            (fifo->fifonum ==
1056                                             HFCUSB_B1_TX) ? 0 : 1,
1057                                            (long) arg);
1058                                fifo->hif->l1l2(fifo->hif,
1059                                                PH_ACTIVATE | INDICATION,
1060                                                NULL);
1061                        }
1062                        break;
1063                case PH_DEACTIVATE | REQUEST:
1064                        if (fifo->fifonum == HFCUSB_D_TX) {
1065                                DBG(HFCUSB_DBG_STATES,
1066                                    "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_DEACTIVATE | REQUEST");
1067                        } else {
1068                                DBG(HFCUSB_DBG_STATES,
1069                                    "HFC_USB: hfc_usb_d_l2l1 Bx-chan: PH_DEACTIVATE | REQUEST");
1070                                setup_bchannel(hfc,
1071                                            (fifo->fifonum ==
1072                                             HFCUSB_B1_TX) ? 0 : 1,
1073                                            (int) L1_MODE_NULL);
1074                                fifo->hif->l1l2(fifo->hif,
1075                                                PH_DEACTIVATE | INDICATION,
1076                                                NULL);
1077                        }
1078                        break;
1079                case PH_DATA | REQUEST:
1080                        if (fifo->skbuff && fifo->delete_flg) {
1081                                dev_kfree_skb_any(fifo->skbuff);
1082                                fifo->skbuff = NULL;
1083                                fifo->delete_flg = 0;
1084                        }
1085                        fifo->skbuff = arg;     /* we have a new buffer */
1086                        break;
1087                default:
1088                        DBG(HFCUSB_DBG_STATES,
1089                               "HFC_USB: hfc_usb_d_l2l1: unkown state : %#x", pr);
1090                        break;
1091        }
1092}
1093
1094/* initial init HFC-S USB chip registers, HiSax interface, USB URBs */
1095static int
1096hfc_usb_init(hfcusb_data * hfc)
1097{
1098        usb_fifo *fifo;
1099        int i, err;
1100        u_char b;
1101        struct hisax_b_if *p_b_if[2];
1102
1103        /* check the chip id */
1104        if (read_usb(hfc, HFCUSB_CHIP_ID, &b) != 1) {
1105                printk(KERN_INFO "HFC-USB: cannot read chip id\n");
1106                return (1);
1107        }
1108        if (b != HFCUSB_CHIPID) {
1109                printk(KERN_INFO "HFC-S USB: Invalid chip id 0x%02x\n", b);
1110                return (1);
1111        }
1112
1113        /* first set the needed config, interface and alternate */
1114        err = usb_set_interface(hfc->dev, hfc->if_used, hfc->alt_used);
1115
1116        /* do Chip reset */
1117        write_usb(hfc, HFCUSB_CIRM, 8);
1118        /* aux = output, reset off */
1119        write_usb(hfc, HFCUSB_CIRM, 0x10);
1120
1121        /* set USB_SIZE to match wMaxPacketSize for INT or BULK transfers */
1122        write_usb(hfc, HFCUSB_USB_SIZE,
1123                  (hfc->packet_size / 8) | ((hfc->packet_size / 8) << 4));
1124
1125        /* set USB_SIZE_I to match wMaxPacketSize for ISO transfers */
1126        write_usb(hfc, HFCUSB_USB_SIZE_I, hfc->iso_packet_size);
1127
1128        /* enable PCM/GCI master mode */
1129        write_usb(hfc, HFCUSB_MST_MODE1, 0);    /* set default values */
1130        write_usb(hfc, HFCUSB_MST_MODE0, 1);    /* enable master mode */
1131
1132        /* init the fifos */
1133        write_usb(hfc, HFCUSB_F_THRES,
1134                  (HFCUSB_TX_THRESHOLD /
1135                   8) | ((HFCUSB_RX_THRESHOLD / 8) << 4));
1136
1137        fifo = hfc->fifos;
1138        for (i = 0; i < HFCUSB_NUM_FIFOS; i++) {
1139                write_usb(hfc, HFCUSB_FIFO, i); /* select the desired fifo */
1140                fifo[i].skbuff = NULL;  /* init buffer pointer */
1141                fifo[i].max_size =
1142                    (i <= HFCUSB_B2_RX) ? MAX_BCH_SIZE : MAX_DFRAME_LEN;
1143                fifo[i].last_urblen = 0;
1144                /* set 2 bit for D- & E-channel */
1145                write_usb(hfc, HFCUSB_HDLC_PAR,
1146                          ((i <= HFCUSB_B2_RX) ? 0 : 2));
1147                /* rx hdlc, enable IFF for D-channel */
1148                write_usb(hfc, HFCUSB_CON_HDLC,
1149                          ((i == HFCUSB_D_TX) ? 0x09 : 0x08));
1150                write_usb(hfc, HFCUSB_INC_RES_F, 2);    /* reset the fifo */
1151        }
1152
1153        write_usb(hfc, HFCUSB_CLKDEL, 0x0f);    /* clock delay value */
1154        write_usb(hfc, HFCUSB_STATES, 3 | 0x10);        /* set deactivated mode */
1155        write_usb(hfc, HFCUSB_STATES, 3);       /* enable state machine */
1156
1157        write_usb(hfc, HFCUSB_SCTRL_R, 0);      /* disable both B receivers */
1158        write_usb(hfc, HFCUSB_SCTRL, 0x40);     /* disable B transmitters + capacitive mode */
1159
1160        /* set both B-channel to not connected */
1161        hfc->b_mode[0] = L1_MODE_NULL;
1162        hfc->b_mode[1] = L1_MODE_NULL;
1163
1164        hfc->l1_activated = 0;
1165        hfc->disc_flag = 0;
1166        hfc->led_state = 0;
1167        hfc->old_led_state = 0;
1168
1169        /* init the t3 timer */
1170        init_timer(&hfc->t3_timer);
1171        hfc->t3_timer.data = (long) hfc;
1172        hfc->t3_timer.function = (void *) l1_timer_expire_t3;
1173
1174        /* init the t4 timer */
1175        init_timer(&hfc->t4_timer);
1176        hfc->t4_timer.data = (long) hfc;
1177        hfc->t4_timer.function = (void *) l1_timer_expire_t4;
1178
1179        /* init the background machinery for control requests */
1180        hfc->ctrl_read.bRequestType = 0xc0;
1181        hfc->ctrl_read.bRequest = 1;
1182        hfc->ctrl_read.wLength = cpu_to_le16(1);
1183        hfc->ctrl_write.bRequestType = 0x40;
1184        hfc->ctrl_write.bRequest = 0;
1185        hfc->ctrl_write.wLength = 0;
1186        usb_fill_control_urb(hfc->ctrl_urb,
1187                             hfc->dev,
1188                             hfc->ctrl_out_pipe,
1189                             (u_char *) & hfc->ctrl_write,
1190                             NULL, 0, ctrl_complete, hfc);
1191        /* Init All Fifos */
1192        for (i = 0; i < HFCUSB_NUM_FIFOS; i++) {
1193                hfc->fifos[i].iso[0].purb = NULL;
1194                hfc->fifos[i].iso[1].purb = NULL;
1195                hfc->fifos[i].active = 0;
1196        }
1197        /* register Modul to upper Hisax Layers */
1198        hfc->d_if.owner = THIS_MODULE;
1199        hfc->d_if.ifc.priv = &hfc->fifos[HFCUSB_D_TX];
1200        hfc->d_if.ifc.l2l1 = hfc_usb_l2l1;
1201        for (i = 0; i < 2; i++) {
1202                hfc->b_if[i].ifc.priv = &hfc->fifos[HFCUSB_B1_TX + i * 2];
1203                hfc->b_if[i].ifc.l2l1 = hfc_usb_l2l1;
1204                p_b_if[i] = &hfc->b_if[i];
1205        }
1206        /* default Prot: EURO ISDN, should be a module_param */
1207        hfc->protocol = 2;
1208        i = hisax_register(&hfc->d_if, p_b_if, "hfc_usb", hfc->protocol);
1209        if (i) {
1210                printk(KERN_INFO "HFC-S USB: hisax_register -> %d\n", i);
1211                return i;
1212        }
1213
1214#ifdef CONFIG_HISAX_DEBUG
1215        hfc_debug = debug;
1216#endif
1217
1218        for (i = 0; i < 4; i++)
1219                hfc->fifos[i].hif = &p_b_if[i / 2]->ifc;
1220        for (i = 4; i < 8; i++)
1221                hfc->fifos[i].hif = &hfc->d_if.ifc;
1222
1223        /* 3 (+1) INT IN + 3 ISO OUT */
1224        if (hfc->cfg_used == CNF_3INT3ISO || hfc->cfg_used == CNF_4INT3ISO) {
1225                start_int_fifo(hfc->fifos + HFCUSB_D_RX);
1226                if (hfc->fifos[HFCUSB_PCM_RX].pipe)
1227                        start_int_fifo(hfc->fifos + HFCUSB_PCM_RX);
1228                start_int_fifo(hfc->fifos + HFCUSB_B1_RX);
1229                start_int_fifo(hfc->fifos + HFCUSB_B2_RX);
1230        }
1231        /* 3 (+1) ISO IN + 3 ISO OUT */
1232        if (hfc->cfg_used == CNF_3ISO3ISO || hfc->cfg_used == CNF_4ISO3ISO) {
1233                start_isoc_chain(hfc->fifos + HFCUSB_D_RX, ISOC_PACKETS_D,
1234                                 rx_iso_complete, 16);
1235                if (hfc->fifos[HFCUSB_PCM_RX].pipe)
1236                        start_isoc_chain(hfc->fifos + HFCUSB_PCM_RX,
1237                                         ISOC_PACKETS_D, rx_iso_complete,
1238                                         16);
1239                start_isoc_chain(hfc->fifos + HFCUSB_B1_RX, ISOC_PACKETS_B,
1240                                 rx_iso_complete, 16);
1241                start_isoc_chain(hfc->fifos + HFCUSB_B2_RX, ISOC_PACKETS_B,
1242                                 rx_iso_complete, 16);
1243        }
1244
1245        start_isoc_chain(hfc->fifos + HFCUSB_D_TX, ISOC_PACKETS_D,
1246                         tx_iso_complete, 1);
1247        start_isoc_chain(hfc->fifos + HFCUSB_B1_TX, ISOC_PACKETS_B,
1248                         tx_iso_complete, 1);
1249        start_isoc_chain(hfc->fifos + HFCUSB_B2_TX, ISOC_PACKETS_B,
1250                         tx_iso_complete, 1);
1251
1252        handle_led(hfc, LED_POWER_ON);
1253
1254        return (0);
1255}
1256
1257/* initial callback for each plugged USB device */
1258static int
1259hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1260{
1261        struct usb_device *dev = interface_to_usbdev(intf);
1262        hfcusb_data *context;
1263        struct usb_host_interface *iface = intf->cur_altsetting;
1264        struct usb_host_interface *iface_used = NULL;
1265        struct usb_host_endpoint *ep;
1266        int ifnum = iface->desc.bInterfaceNumber;
1267        int i, idx, alt_idx, probe_alt_setting, vend_idx, cfg_used, *vcf,
1268            attr, cfg_found, cidx, ep_addr;
1269        int cmptbl[16], small_match, iso_packet_size, packet_size,
1270            alt_used = 0;
1271        hfcsusb_vdata *driver_info;
1272
1273        vend_idx = 0xffff;
1274        for (i = 0; hfcusb_idtab[i].idVendor; i++) {
1275                if ((le16_to_cpu(dev->descriptor.idVendor) == hfcusb_idtab[i].idVendor)
1276                    && (le16_to_cpu(dev->descriptor.idProduct) == hfcusb_idtab[i].idProduct)) {
1277                        vend_idx = i;
1278                        continue;
1279                }
1280        }
1281
1282        printk(KERN_INFO
1283               "HFC-S USB: probing interface(%d) actalt(%d) minor(%d)\n",
1284               ifnum, iface->desc.bAlternateSetting, intf->minor);
1285
1286        if (vend_idx != 0xffff) {
1287                /* if vendor and product ID is OK, start probing alternate settings */
1288                alt_idx = 0;
1289                small_match = 0xffff;
1290
1291                /* default settings */
1292                iso_packet_size = 16;
1293                packet_size = 64;
1294
1295                while (alt_idx < intf->num_altsetting) {
1296                        iface = intf->altsetting + alt_idx;
1297                        probe_alt_setting = iface->desc.bAlternateSetting;
1298                        cfg_used = 0;
1299
1300                        /* check for config EOL element */
1301                        while (validconf[cfg_used][0]) {
1302                                cfg_found = 1;
1303                                vcf = validconf[cfg_used];
1304                                /* first endpoint descriptor */
1305                                ep = iface->endpoint;
1306
1307                                memcpy(cmptbl, vcf, 16 * sizeof(int));
1308
1309                                /* check for all endpoints in this alternate setting */
1310                                for (i = 0; i < iface->desc.bNumEndpoints;
1311                                     i++) {
1312                                        ep_addr =
1313                                            ep->desc.bEndpointAddress;
1314                                        /* get endpoint base */
1315                                        idx = ((ep_addr & 0x7f) - 1) * 2;
1316                                        if (ep_addr & 0x80)
1317                                                idx++;
1318                                        attr = ep->desc.bmAttributes;
1319                                        if (cmptbl[idx] == EP_NUL) {
1320                                                cfg_found = 0;
1321                                        }
1322                                        if (attr == USB_ENDPOINT_XFER_INT
1323                                            && cmptbl[idx] == EP_INT)
1324                                                cmptbl[idx] = EP_NUL;
1325                                        if (attr == USB_ENDPOINT_XFER_BULK
1326                                            && cmptbl[idx] == EP_BLK)
1327                                                cmptbl[idx] = EP_NUL;
1328                                        if (attr == USB_ENDPOINT_XFER_ISOC
1329                                            && cmptbl[idx] == EP_ISO)
1330                                                cmptbl[idx] = EP_NUL;
1331
1332                                        /* check if all INT endpoints match minimum interval */
1333                                        if ((attr == USB_ENDPOINT_XFER_INT)
1334                                            && (ep->desc.bInterval < vcf[17])) {
1335                                                cfg_found = 0;
1336                                        }
1337                                        ep++;
1338                                }
1339                                for (i = 0; i < 16; i++) {
1340                                        /* all entries must be EP_NOP or EP_NUL for a valid config */
1341                                        if (cmptbl[i] != EP_NOP
1342                                            && cmptbl[i] != EP_NUL)
1343                                                cfg_found = 0;
1344                                }
1345                                if (cfg_found) {
1346                                        if (cfg_used < small_match) {
1347                                                small_match = cfg_used;
1348                                                alt_used =
1349                                                    probe_alt_setting;
1350                                                iface_used = iface;
1351                                        }
1352                                }
1353                                cfg_used++;
1354                        }
1355                        alt_idx++;
1356                } /* (alt_idx < intf->num_altsetting) */
1357
1358                /* found a valid USB Ta Endpint config */
1359                if (small_match != 0xffff) {
1360                        iface = iface_used;
1361                        if (!(context = kzalloc(sizeof(hfcusb_data), GFP_KERNEL)))
1362                                return (-ENOMEM);       /* got no mem */
1363
1364                        ep = iface->endpoint;
1365                        vcf = validconf[small_match];
1366
1367                        for (i = 0; i < iface->desc.bNumEndpoints; i++) {
1368                                ep_addr = ep->desc.bEndpointAddress;
1369                                /* get endpoint base */
1370                                idx = ((ep_addr & 0x7f) - 1) * 2;
1371                                if (ep_addr & 0x80)
1372                                        idx++;
1373                                cidx = idx & 7;
1374                                attr = ep->desc.bmAttributes;
1375
1376                                /* init Endpoints */
1377                                if (vcf[idx] != EP_NOP
1378                                    && vcf[idx] != EP_NUL) {
1379                                        switch (attr) {
1380                                                case USB_ENDPOINT_XFER_INT:
1381                                                        context->
1382                                                            fifos[cidx].
1383                                                            pipe =
1384                                                            usb_rcvintpipe
1385                                                            (dev,
1386                                                             ep->desc.
1387                                                             bEndpointAddress);
1388                                                        context->
1389                                                            fifos[cidx].
1390                                                            usb_transfer_mode
1391                                                            = USB_INT;
1392                                                        packet_size =
1393                                                            le16_to_cpu(ep->desc.wMaxPacketSize);
1394                                                        break;
1395                                                case USB_ENDPOINT_XFER_BULK:
1396                                                        if (ep_addr & 0x80)
1397                                                                context->
1398                                                                    fifos
1399                                                                    [cidx].
1400                                                                    pipe =
1401                                                                    usb_rcvbulkpipe
1402                                                                    (dev,
1403                                                                     ep->
1404                                                                     desc.
1405                                                                     bEndpointAddress);
1406                                                        else
1407                                                                context->
1408                                                                    fifos
1409                                                                    [cidx].
1410                                                                    pipe =
1411                                                                    usb_sndbulkpipe
1412                                                                    (dev,
1413                                                                     ep->
1414                                                                     desc.
1415                                                                     bEndpointAddress);
1416                                                        context->
1417                                                            fifos[cidx].
1418                                                            usb_transfer_mode
1419                                                            = USB_BULK;
1420                                                        packet_size =
1421                                                            le16_to_cpu(ep->desc.wMaxPacketSize);
1422                                                        break;
1423                                                case USB_ENDPOINT_XFER_ISOC:
1424                                                        if (ep_addr & 0x80)
1425                                                                context->
1426                                                                    fifos
1427                                                                    [cidx].
1428                                                                    pipe =
1429                                                                    usb_rcvisocpipe
1430                                                                    (dev,
1431                                                                     ep->
1432                                                                     desc.
1433                                                                     bEndpointAddress);
1434                                                        else
1435                                                                context->
1436                                                                    fifos
1437                                                                    [cidx].
1438                                                                    pipe =
1439                                                                    usb_sndisocpipe
1440                                                                    (dev,
1441                                                                     ep->
1442                                                                     desc.
1443                                                                     bEndpointAddress);
1444                                                        context->
1445                                                            fifos[cidx].
1446                                                            usb_transfer_mode
1447                                                            = USB_ISOC;
1448                                                        iso_packet_size =
1449                                                            le16_to_cpu(ep->desc.wMaxPacketSize);
1450                                                        break;
1451                                                default:
1452                                                        context->
1453                                                            fifos[cidx].
1454                                                            pipe = 0;
1455                                        }       /* switch attribute */
1456
1457                                        if (context->fifos[cidx].pipe) {
1458                                                context->fifos[cidx].
1459                                                    fifonum = cidx;
1460                                                context->fifos[cidx].hfc =
1461                                                    context;
1462                                                context->fifos[cidx].usb_packet_maxlen =
1463                                                    le16_to_cpu(ep->desc.wMaxPacketSize);
1464                                                context->fifos[cidx].
1465                                                    intervall =
1466                                                    ep->desc.bInterval;
1467                                                context->fifos[cidx].
1468                                                    skbuff = NULL;
1469                                        }
1470                                }
1471                                ep++;
1472                        }
1473                        context->dev = dev;     /* save device */
1474                        context->if_used = ifnum;       /* save used interface */
1475                        context->alt_used = alt_used;   /* and alternate config */
1476                        context->ctrl_paksize = dev->descriptor.bMaxPacketSize0;        /* control size */
1477                        context->cfg_used = vcf[16];    /* store used config */
1478                        context->vend_idx = vend_idx;   /* store found vendor */
1479                        context->packet_size = packet_size;
1480                        context->iso_packet_size = iso_packet_size;
1481
1482                        /* create the control pipes needed for register access */
1483                        context->ctrl_in_pipe =
1484                            usb_rcvctrlpipe(context->dev, 0);
1485                        context->ctrl_out_pipe =
1486                            usb_sndctrlpipe(context->dev, 0);
1487                        context->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
1488
1489                        driver_info =
1490                            (hfcsusb_vdata *) hfcusb_idtab[vend_idx].
1491                            driver_info;
1492                        printk(KERN_INFO "HFC-S USB: detected \"%s\"\n",
1493                               driver_info->vend_name);
1494
1495                        DBG(HFCUSB_DBG_INIT,
1496                            "HFC-S USB: Endpoint-Config: %s (if=%d alt=%d), E-Channel(%d)",
1497                            conf_str[small_match], context->if_used,
1498                            context->alt_used,
1499                            validconf[small_match][18]);
1500
1501                        /* init the chip and register the driver */
1502                        if (hfc_usb_init(context)) {
1503                                usb_kill_urb(context->ctrl_urb);
1504                                usb_free_urb(context->ctrl_urb);
1505                                context->ctrl_urb = NULL;
1506                                kfree(context);
1507                                return (-EIO);
1508                        }
1509                        usb_set_intfdata(intf, context);
1510                        return (0);
1511                }
1512        } else {
1513                printk(KERN_INFO
1514                       "HFC-S USB: no valid vendor found in USB descriptor\n");
1515        }
1516        return (-EIO);
1517}
1518
1519/* callback for unplugged USB device */
1520static void
1521hfc_usb_disconnect(struct usb_interface *intf)
1522{
1523        hfcusb_data *context = usb_get_intfdata(intf);
1524        int i;
1525
1526        handle_led(context, LED_POWER_OFF);
1527        schedule_timeout(HZ / 100);
1528
1529        printk(KERN_INFO "HFC-S USB: device disconnect\n");
1530        context->disc_flag = 1;
1531        usb_set_intfdata(intf, NULL);
1532
1533        if (timer_pending(&context->t3_timer))
1534                del_timer(&context->t3_timer);
1535        if (timer_pending(&context->t4_timer))
1536                del_timer(&context->t4_timer);
1537
1538        /* tell all fifos to terminate */
1539        for (i = 0; i < HFCUSB_NUM_FIFOS; i++) {
1540                if (context->fifos[i].usb_transfer_mode == USB_ISOC) {
1541                        if (context->fifos[i].active > 0) {
1542                                stop_isoc_chain(&context->fifos[i]);
1543                                DBG(HFCUSB_DBG_INIT,
1544                                    "HFC-S USB: %s stopping ISOC chain Fifo(%i)",
1545                                    __func__, i);
1546                        }
1547                } else {
1548                        if (context->fifos[i].active > 0) {
1549                                context->fifos[i].active = 0;
1550                                DBG(HFCUSB_DBG_INIT,
1551                                    "HFC-S USB: %s unlinking URB for Fifo(%i)",
1552                                    __func__, i);
1553                        }
1554                        usb_kill_urb(context->fifos[i].urb);
1555                        usb_free_urb(context->fifos[i].urb);
1556                        context->fifos[i].urb = NULL;
1557                }
1558                context->fifos[i].active = 0;
1559        }
1560        usb_kill_urb(context->ctrl_urb);
1561        usb_free_urb(context->ctrl_urb);
1562        context->ctrl_urb = NULL;
1563        hisax_unregister(&context->d_if);
1564        kfree(context);         /* free our structure again */
1565}
1566
1567static struct usb_driver hfc_drv = {
1568        .name  = "hfc_usb",
1569        .id_table = hfcusb_idtab,
1570        .probe = hfc_usb_probe,
1571        .disconnect = hfc_usb_disconnect,
1572};
1573
1574static void __exit
1575hfc_usb_mod_exit(void)
1576{
1577        usb_deregister(&hfc_drv); /* release our driver */
1578        printk(KERN_INFO "HFC-S USB: module removed\n");
1579}
1580
1581static int __init
1582hfc_usb_mod_init(void)
1583{
1584        char revstr[30], datestr[30], dummy[30];
1585#ifndef CONFIG_HISAX_DEBUG
1586        hfc_debug = debug;
1587#endif
1588        sscanf(hfcusb_revision,
1589               "%s %s $ %s %s %s $ ", dummy, revstr,
1590               dummy, datestr, dummy);
1591        printk(KERN_INFO
1592               "HFC-S USB: driver module revision %s date %s loaded, (debug=%i)\n",
1593               revstr, datestr, debug);
1594        if (usb_register(&hfc_drv)) {
1595                printk(KERN_INFO
1596                       "HFC-S USB: Unable to register HFC-S USB module at usb stack\n");
1597                return (-1);    /* unable to register */
1598        }
1599        return (0);
1600}
1601
1602module_init(hfc_usb_mod_init);
1603module_exit(hfc_usb_mod_exit);
1604MODULE_AUTHOR(DRIVER_AUTHOR);
1605MODULE_DESCRIPTION(DRIVER_DESC);
1606MODULE_LICENSE("GPL");
1607MODULE_DEVICE_TABLE(usb, hfcusb_idtab);
1608