linux/drivers/isdn/hardware/mISDN/hfcsusb.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* hfcsusb.c
   3 * mISDN driver for Colognechip HFC-S USB chip
   4 *
   5 * Copyright 2001 by Peter Sprenger (sprenger@moving-bytes.de)
   6 * Copyright 2008 by Martin Bachem (info@bachem-it.com)
   7 *
   8 * module params
   9 *   debug=<n>, default=0, with n=0xHHHHGGGG
  10 *      H - l1 driver flags described in hfcsusb.h
  11 *      G - common mISDN debug flags described at mISDNhw.h
  12 *
  13 *   poll=<n>, default 128
  14 *     n : burst size of PH_DATA_IND at transparent rx data
  15 *
  16 * Revision: 0.3.3 (socket), 2008-11-05
  17 */
  18
  19#include <linux/module.h>
  20#include <linux/delay.h>
  21#include <linux/usb.h>
  22#include <linux/mISDNhw.h>
  23#include <linux/slab.h>
  24#include "hfcsusb.h"
  25
  26static unsigned int debug;
  27static int poll = DEFAULT_TRANSP_BURST_SZ;
  28
  29static LIST_HEAD(HFClist);
  30static DEFINE_RWLOCK(HFClock);
  31
  32
  33MODULE_AUTHOR("Martin Bachem");
  34MODULE_LICENSE("GPL");
  35module_param(debug, uint, S_IRUGO | S_IWUSR);
  36module_param(poll, int, 0);
  37
  38static int hfcsusb_cnt;
  39
  40/* some function prototypes */
  41static void hfcsusb_ph_command(struct hfcsusb *hw, u_char command);
  42static void release_hw(struct hfcsusb *hw);
  43static void reset_hfcsusb(struct hfcsusb *hw);
  44static void setPortMode(struct hfcsusb *hw);
  45static void hfcsusb_start_endpoint(struct hfcsusb *hw, int channel);
  46static void hfcsusb_stop_endpoint(struct hfcsusb *hw, int channel);
  47static int  hfcsusb_setup_bch(struct bchannel *bch, int protocol);
  48static void deactivate_bchannel(struct bchannel *bch);
  49static int  hfcsusb_ph_info(struct hfcsusb *hw);
  50
  51/* start next background transfer for control channel */
  52static void
  53ctrl_start_transfer(struct hfcsusb *hw)
  54{
  55        if (debug & DBG_HFC_CALL_TRACE)
  56                printk(KERN_DEBUG "%s: %s\n", hw->name, __func__);
  57
  58        if (hw->ctrl_cnt) {
  59                hw->ctrl_urb->pipe = hw->ctrl_out_pipe;
  60                hw->ctrl_urb->setup_packet = (u_char *)&hw->ctrl_write;
  61                hw->ctrl_urb->transfer_buffer = NULL;
  62                hw->ctrl_urb->transfer_buffer_length = 0;
  63                hw->ctrl_write.wIndex =
  64                        cpu_to_le16(hw->ctrl_buff[hw->ctrl_out_idx].hfcs_reg);
  65                hw->ctrl_write.wValue =
  66                        cpu_to_le16(hw->ctrl_buff[hw->ctrl_out_idx].reg_val);
  67
  68                usb_submit_urb(hw->ctrl_urb, GFP_ATOMIC);
  69        }
  70}
  71
  72/*
  73 * queue a control transfer request to write HFC-S USB
  74 * chip register using CTRL resuest queue
  75 */
  76static int write_reg(struct hfcsusb *hw, __u8 reg, __u8 val)
  77{
  78        struct ctrl_buf *buf;
  79
  80        if (debug & DBG_HFC_CALL_TRACE)
  81                printk(KERN_DEBUG "%s: %s reg(0x%02x) val(0x%02x)\n",
  82                       hw->name, __func__, reg, val);
  83
  84        spin_lock(&hw->ctrl_lock);
  85        if (hw->ctrl_cnt >= HFC_CTRL_BUFSIZE) {
  86                spin_unlock(&hw->ctrl_lock);
  87                return 1;
  88        }
  89        buf = &hw->ctrl_buff[hw->ctrl_in_idx];
  90        buf->hfcs_reg = reg;
  91        buf->reg_val = val;
  92        if (++hw->ctrl_in_idx >= HFC_CTRL_BUFSIZE)
  93                hw->ctrl_in_idx = 0;
  94        if (++hw->ctrl_cnt == 1)
  95                ctrl_start_transfer(hw);
  96        spin_unlock(&hw->ctrl_lock);
  97
  98        return 0;
  99}
 100
 101/* control completion routine handling background control cmds */
 102static void
 103ctrl_complete(struct urb *urb)
 104{
 105        struct hfcsusb *hw = (struct hfcsusb *) urb->context;
 106
 107        if (debug & DBG_HFC_CALL_TRACE)
 108                printk(KERN_DEBUG "%s: %s\n", hw->name, __func__);
 109
 110        urb->dev = hw->dev;
 111        if (hw->ctrl_cnt) {
 112                hw->ctrl_cnt--; /* decrement actual count */
 113                if (++hw->ctrl_out_idx >= HFC_CTRL_BUFSIZE)
 114                        hw->ctrl_out_idx = 0;   /* pointer wrap */
 115
 116                ctrl_start_transfer(hw); /* start next transfer */
 117        }
 118}
 119
 120/* handle LED bits   */
 121static void
 122set_led_bit(struct hfcsusb *hw, signed short led_bits, int set_on)
 123{
 124        if (set_on) {
 125                if (led_bits < 0)
 126                        hw->led_state &= ~abs(led_bits);
 127                else
 128                        hw->led_state |= led_bits;
 129        } else {
 130                if (led_bits < 0)
 131                        hw->led_state |= abs(led_bits);
 132                else
 133                        hw->led_state &= ~led_bits;
 134        }
 135}
 136
 137/* handle LED requests  */
 138static void
 139handle_led(struct hfcsusb *hw, int event)
 140{
 141        struct hfcsusb_vdata *driver_info = (struct hfcsusb_vdata *)
 142                hfcsusb_idtab[hw->vend_idx].driver_info;
 143        __u8 tmpled;
 144
 145        if (driver_info->led_scheme == LED_OFF)
 146                return;
 147        tmpled = hw->led_state;
 148
 149        switch (event) {
 150        case LED_POWER_ON:
 151                set_led_bit(hw, driver_info->led_bits[0], 1);
 152                set_led_bit(hw, driver_info->led_bits[1], 0);
 153                set_led_bit(hw, driver_info->led_bits[2], 0);
 154                set_led_bit(hw, driver_info->led_bits[3], 0);
 155                break;
 156        case LED_POWER_OFF:
 157                set_led_bit(hw, driver_info->led_bits[0], 0);
 158                set_led_bit(hw, driver_info->led_bits[1], 0);
 159                set_led_bit(hw, driver_info->led_bits[2], 0);
 160                set_led_bit(hw, driver_info->led_bits[3], 0);
 161                break;
 162        case LED_S0_ON:
 163                set_led_bit(hw, driver_info->led_bits[1], 1);
 164                break;
 165        case LED_S0_OFF:
 166                set_led_bit(hw, driver_info->led_bits[1], 0);
 167                break;
 168        case LED_B1_ON:
 169                set_led_bit(hw, driver_info->led_bits[2], 1);
 170                break;
 171        case LED_B1_OFF:
 172                set_led_bit(hw, driver_info->led_bits[2], 0);
 173                break;
 174        case LED_B2_ON:
 175                set_led_bit(hw, driver_info->led_bits[3], 1);
 176                break;
 177        case LED_B2_OFF:
 178                set_led_bit(hw, driver_info->led_bits[3], 0);
 179                break;
 180        }
 181
 182        if (hw->led_state != tmpled) {
 183                if (debug & DBG_HFC_CALL_TRACE)
 184                        printk(KERN_DEBUG "%s: %s reg(0x%02x) val(x%02x)\n",
 185                               hw->name, __func__,
 186                               HFCUSB_P_DATA, hw->led_state);
 187
 188                write_reg(hw, HFCUSB_P_DATA, hw->led_state);
 189        }
 190}
 191
 192/*
 193 * Layer2 -> Layer 1 Bchannel data
 194 */
 195static int
 196hfcusb_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb)
 197{
 198        struct bchannel         *bch = container_of(ch, struct bchannel, ch);
 199        struct hfcsusb          *hw = bch->hw;
 200        int                     ret = -EINVAL;
 201        struct mISDNhead        *hh = mISDN_HEAD_P(skb);
 202        u_long                  flags;
 203
 204        if (debug & DBG_HFC_CALL_TRACE)
 205                printk(KERN_DEBUG "%s: %s\n", hw->name, __func__);
 206
 207        switch (hh->prim) {
 208        case PH_DATA_REQ:
 209                spin_lock_irqsave(&hw->lock, flags);
 210                ret = bchannel_senddata(bch, skb);
 211                spin_unlock_irqrestore(&hw->lock, flags);
 212                if (debug & DBG_HFC_CALL_TRACE)
 213                        printk(KERN_DEBUG "%s: %s PH_DATA_REQ ret(%i)\n",
 214                               hw->name, __func__, ret);
 215                if (ret > 0)
 216                        ret = 0;
 217                return ret;
 218        case PH_ACTIVATE_REQ:
 219                if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags)) {
 220                        hfcsusb_start_endpoint(hw, bch->nr - 1);
 221                        ret = hfcsusb_setup_bch(bch, ch->protocol);
 222                } else
 223                        ret = 0;
 224                if (!ret)
 225                        _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY,
 226                                    0, NULL, GFP_KERNEL);
 227                break;
 228        case PH_DEACTIVATE_REQ:
 229                deactivate_bchannel(bch);
 230                _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY,
 231                            0, NULL, GFP_KERNEL);
 232                ret = 0;
 233                break;
 234        }
 235        if (!ret)
 236                dev_kfree_skb(skb);
 237        return ret;
 238}
 239
 240/*
 241 * send full D/B channel status information
 242 * as MPH_INFORMATION_IND
 243 */
 244static int
 245hfcsusb_ph_info(struct hfcsusb *hw)
 246{
 247        struct ph_info *phi;
 248        struct dchannel *dch = &hw->dch;
 249        int i;
 250
 251        phi = kzalloc(struct_size(phi, bch, dch->dev.nrbchan), GFP_ATOMIC);
 252        if (!phi)
 253                return -ENOMEM;
 254
 255        phi->dch.ch.protocol = hw->protocol;
 256        phi->dch.ch.Flags = dch->Flags;
 257        phi->dch.state = dch->state;
 258        phi->dch.num_bch = dch->dev.nrbchan;
 259        for (i = 0; i < dch->dev.nrbchan; i++) {
 260                phi->bch[i].protocol = hw->bch[i].ch.protocol;
 261                phi->bch[i].Flags = hw->bch[i].Flags;
 262        }
 263        _queue_data(&dch->dev.D, MPH_INFORMATION_IND, MISDN_ID_ANY,
 264                    struct_size(phi, bch, dch->dev.nrbchan), phi, GFP_ATOMIC);
 265        kfree(phi);
 266
 267        return 0;
 268}
 269
 270/*
 271 * Layer2 -> Layer 1 Dchannel data
 272 */
 273static int
 274hfcusb_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb)
 275{
 276        struct mISDNdevice      *dev = container_of(ch, struct mISDNdevice, D);
 277        struct dchannel         *dch = container_of(dev, struct dchannel, dev);
 278        struct mISDNhead        *hh = mISDN_HEAD_P(skb);
 279        struct hfcsusb          *hw = dch->hw;
 280        int                     ret = -EINVAL;
 281        u_long                  flags;
 282
 283        switch (hh->prim) {
 284        case PH_DATA_REQ:
 285                if (debug & DBG_HFC_CALL_TRACE)
 286                        printk(KERN_DEBUG "%s: %s: PH_DATA_REQ\n",
 287                               hw->name, __func__);
 288
 289                spin_lock_irqsave(&hw->lock, flags);
 290                ret = dchannel_senddata(dch, skb);
 291                spin_unlock_irqrestore(&hw->lock, flags);
 292                if (ret > 0) {
 293                        ret = 0;
 294                        queue_ch_frame(ch, PH_DATA_CNF, hh->id, NULL);
 295                }
 296                break;
 297
 298        case PH_ACTIVATE_REQ:
 299                if (debug & DBG_HFC_CALL_TRACE)
 300                        printk(KERN_DEBUG "%s: %s: PH_ACTIVATE_REQ %s\n",
 301                               hw->name, __func__,
 302                               (hw->protocol == ISDN_P_NT_S0) ? "NT" : "TE");
 303
 304                if (hw->protocol == ISDN_P_NT_S0) {
 305                        ret = 0;
 306                        if (test_bit(FLG_ACTIVE, &dch->Flags)) {
 307                                _queue_data(&dch->dev.D,
 308                                            PH_ACTIVATE_IND, MISDN_ID_ANY, 0,
 309                                            NULL, GFP_ATOMIC);
 310                        } else {
 311                                hfcsusb_ph_command(hw,
 312                                                   HFC_L1_ACTIVATE_NT);
 313                                test_and_set_bit(FLG_L2_ACTIVATED,
 314                                                 &dch->Flags);
 315                        }
 316                } else {
 317                        hfcsusb_ph_command(hw, HFC_L1_ACTIVATE_TE);
 318                        ret = l1_event(dch->l1, hh->prim);
 319                }
 320                break;
 321
 322        case PH_DEACTIVATE_REQ:
 323                if (debug & DBG_HFC_CALL_TRACE)
 324                        printk(KERN_DEBUG "%s: %s: PH_DEACTIVATE_REQ\n",
 325                               hw->name, __func__);
 326                test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
 327
 328                if (hw->protocol == ISDN_P_NT_S0) {
 329                        hfcsusb_ph_command(hw, HFC_L1_DEACTIVATE_NT);
 330                        spin_lock_irqsave(&hw->lock, flags);
 331                        skb_queue_purge(&dch->squeue);
 332                        if (dch->tx_skb) {
 333                                dev_kfree_skb(dch->tx_skb);
 334                                dch->tx_skb = NULL;
 335                        }
 336                        dch->tx_idx = 0;
 337                        if (dch->rx_skb) {
 338                                dev_kfree_skb(dch->rx_skb);
 339                                dch->rx_skb = NULL;
 340                        }
 341                        test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
 342                        spin_unlock_irqrestore(&hw->lock, flags);
 343#ifdef FIXME
 344                        if (test_and_clear_bit(FLG_L1_BUSY, &dch->Flags))
 345                                dchannel_sched_event(&hc->dch, D_CLEARBUSY);
 346#endif
 347                        ret = 0;
 348                } else
 349                        ret = l1_event(dch->l1, hh->prim);
 350                break;
 351        case MPH_INFORMATION_REQ:
 352                ret = hfcsusb_ph_info(hw);
 353                break;
 354        }
 355
 356        return ret;
 357}
 358
 359/*
 360 * Layer 1 callback function
 361 */
 362static int
 363hfc_l1callback(struct dchannel *dch, u_int cmd)
 364{
 365        struct hfcsusb *hw = dch->hw;
 366
 367        if (debug & DBG_HFC_CALL_TRACE)
 368                printk(KERN_DEBUG "%s: %s cmd 0x%x\n",
 369                       hw->name, __func__, cmd);
 370
 371        switch (cmd) {
 372        case INFO3_P8:
 373        case INFO3_P10:
 374        case HW_RESET_REQ:
 375        case HW_POWERUP_REQ:
 376                break;
 377
 378        case HW_DEACT_REQ:
 379                skb_queue_purge(&dch->squeue);
 380                if (dch->tx_skb) {
 381                        dev_kfree_skb(dch->tx_skb);
 382                        dch->tx_skb = NULL;
 383                }
 384                dch->tx_idx = 0;
 385                if (dch->rx_skb) {
 386                        dev_kfree_skb(dch->rx_skb);
 387                        dch->rx_skb = NULL;
 388                }
 389                test_and_clear_bit(FLG_TX_BUSY, &dch->Flags);
 390                break;
 391        case PH_ACTIVATE_IND:
 392                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
 393                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
 394                            GFP_ATOMIC);
 395                break;
 396        case PH_DEACTIVATE_IND:
 397                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
 398                _queue_data(&dch->dev.D, cmd, MISDN_ID_ANY, 0, NULL,
 399                            GFP_ATOMIC);
 400                break;
 401        default:
 402                if (dch->debug & DEBUG_HW)
 403                        printk(KERN_DEBUG "%s: %s: unknown cmd %x\n",
 404                               hw->name, __func__, cmd);
 405                return -1;
 406        }
 407        return hfcsusb_ph_info(hw);
 408}
 409
 410static int
 411open_dchannel(struct hfcsusb *hw, struct mISDNchannel *ch,
 412              struct channel_req *rq)
 413{
 414        int err = 0;
 415
 416        if (debug & DEBUG_HW_OPEN)
 417                printk(KERN_DEBUG "%s: %s: dev(%d) open addr(%i) from %p\n",
 418                       hw->name, __func__, hw->dch.dev.id, rq->adr.channel,
 419                       __builtin_return_address(0));
 420        if (rq->protocol == ISDN_P_NONE)
 421                return -EINVAL;
 422
 423        test_and_clear_bit(FLG_ACTIVE, &hw->dch.Flags);
 424        test_and_clear_bit(FLG_ACTIVE, &hw->ech.Flags);
 425        hfcsusb_start_endpoint(hw, HFC_CHAN_D);
 426
 427        /* E-Channel logging */
 428        if (rq->adr.channel == 1) {
 429                if (hw->fifos[HFCUSB_PCM_RX].pipe) {
 430                        hfcsusb_start_endpoint(hw, HFC_CHAN_E);
 431                        set_bit(FLG_ACTIVE, &hw->ech.Flags);
 432                        _queue_data(&hw->ech.dev.D, PH_ACTIVATE_IND,
 433                                    MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
 434                } else
 435                        return -EINVAL;
 436        }
 437
 438        if (!hw->initdone) {
 439                hw->protocol = rq->protocol;
 440                if (rq->protocol == ISDN_P_TE_S0) {
 441                        err = create_l1(&hw->dch, hfc_l1callback);
 442                        if (err)
 443                                return err;
 444                }
 445                setPortMode(hw);
 446                ch->protocol = rq->protocol;
 447                hw->initdone = 1;
 448        } else {
 449                if (rq->protocol != ch->protocol)
 450                        return -EPROTONOSUPPORT;
 451        }
 452
 453        if (((ch->protocol == ISDN_P_NT_S0) && (hw->dch.state == 3)) ||
 454            ((ch->protocol == ISDN_P_TE_S0) && (hw->dch.state == 7)))
 455                _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY,
 456                            0, NULL, GFP_KERNEL);
 457        rq->ch = ch;
 458        if (!try_module_get(THIS_MODULE))
 459                printk(KERN_WARNING "%s: %s: cannot get module\n",
 460                       hw->name, __func__);
 461        return 0;
 462}
 463
 464static int
 465open_bchannel(struct hfcsusb *hw, struct channel_req *rq)
 466{
 467        struct bchannel         *bch;
 468
 469        if (rq->adr.channel == 0 || rq->adr.channel > 2)
 470                return -EINVAL;
 471        if (rq->protocol == ISDN_P_NONE)
 472                return -EINVAL;
 473
 474        if (debug & DBG_HFC_CALL_TRACE)
 475                printk(KERN_DEBUG "%s: %s B%i\n",
 476                       hw->name, __func__, rq->adr.channel);
 477
 478        bch = &hw->bch[rq->adr.channel - 1];
 479        if (test_and_set_bit(FLG_OPEN, &bch->Flags))
 480                return -EBUSY; /* b-channel can be only open once */
 481        bch->ch.protocol = rq->protocol;
 482        rq->ch = &bch->ch;
 483
 484        if (!try_module_get(THIS_MODULE))
 485                printk(KERN_WARNING "%s: %s:cannot get module\n",
 486                       hw->name, __func__);
 487        return 0;
 488}
 489
 490static int
 491channel_ctrl(struct hfcsusb *hw, struct mISDN_ctrl_req *cq)
 492{
 493        int ret = 0;
 494
 495        if (debug & DBG_HFC_CALL_TRACE)
 496                printk(KERN_DEBUG "%s: %s op(0x%x) channel(0x%x)\n",
 497                       hw->name, __func__, (cq->op), (cq->channel));
 498
 499        switch (cq->op) {
 500        case MISDN_CTRL_GETOP:
 501                cq->op = MISDN_CTRL_LOOP | MISDN_CTRL_CONNECT |
 502                        MISDN_CTRL_DISCONNECT;
 503                break;
 504        default:
 505                printk(KERN_WARNING "%s: %s: unknown Op %x\n",
 506                       hw->name, __func__, cq->op);
 507                ret = -EINVAL;
 508                break;
 509        }
 510        return ret;
 511}
 512
 513/*
 514 * device control function
 515 */
 516static int
 517hfc_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
 518{
 519        struct mISDNdevice      *dev = container_of(ch, struct mISDNdevice, D);
 520        struct dchannel         *dch = container_of(dev, struct dchannel, dev);
 521        struct hfcsusb          *hw = dch->hw;
 522        struct channel_req      *rq;
 523        int                     err = 0;
 524
 525        if (dch->debug & DEBUG_HW)
 526                printk(KERN_DEBUG "%s: %s: cmd:%x %p\n",
 527                       hw->name, __func__, cmd, arg);
 528        switch (cmd) {
 529        case OPEN_CHANNEL:
 530                rq = arg;
 531                if ((rq->protocol == ISDN_P_TE_S0) ||
 532                    (rq->protocol == ISDN_P_NT_S0))
 533                        err = open_dchannel(hw, ch, rq);
 534                else
 535                        err = open_bchannel(hw, rq);
 536                if (!err)
 537                        hw->open++;
 538                break;
 539        case CLOSE_CHANNEL:
 540                hw->open--;
 541                if (debug & DEBUG_HW_OPEN)
 542                        printk(KERN_DEBUG
 543                               "%s: %s: dev(%d) close from %p (open %d)\n",
 544                               hw->name, __func__, hw->dch.dev.id,
 545                               __builtin_return_address(0), hw->open);
 546                if (!hw->open) {
 547                        hfcsusb_stop_endpoint(hw, HFC_CHAN_D);
 548                        if (hw->fifos[HFCUSB_PCM_RX].pipe)
 549                                hfcsusb_stop_endpoint(hw, HFC_CHAN_E);
 550                        handle_led(hw, LED_POWER_ON);
 551                }
 552                module_put(THIS_MODULE);
 553                break;
 554        case CONTROL_CHANNEL:
 555                err = channel_ctrl(hw, arg);
 556                break;
 557        default:
 558                if (dch->debug & DEBUG_HW)
 559                        printk(KERN_DEBUG "%s: %s: unknown command %x\n",
 560                               hw->name, __func__, cmd);
 561                return -EINVAL;
 562        }
 563        return err;
 564}
 565
 566/*
 567 * S0 TE state change event handler
 568 */
 569static void
 570ph_state_te(struct dchannel *dch)
 571{
 572        struct hfcsusb *hw = dch->hw;
 573
 574        if (debug & DEBUG_HW) {
 575                if (dch->state <= HFC_MAX_TE_LAYER1_STATE)
 576                        printk(KERN_DEBUG "%s: %s: %s\n", hw->name, __func__,
 577                               HFC_TE_LAYER1_STATES[dch->state]);
 578                else
 579                        printk(KERN_DEBUG "%s: %s: TE F%d\n",
 580                               hw->name, __func__, dch->state);
 581        }
 582
 583        switch (dch->state) {
 584        case 0:
 585                l1_event(dch->l1, HW_RESET_IND);
 586                break;
 587        case 3:
 588                l1_event(dch->l1, HW_DEACT_IND);
 589                break;
 590        case 5:
 591        case 8:
 592                l1_event(dch->l1, ANYSIGNAL);
 593                break;
 594        case 6:
 595                l1_event(dch->l1, INFO2);
 596                break;
 597        case 7:
 598                l1_event(dch->l1, INFO4_P8);
 599                break;
 600        }
 601        if (dch->state == 7)
 602                handle_led(hw, LED_S0_ON);
 603        else
 604                handle_led(hw, LED_S0_OFF);
 605}
 606
 607/*
 608 * S0 NT state change event handler
 609 */
 610static void
 611ph_state_nt(struct dchannel *dch)
 612{
 613        struct hfcsusb *hw = dch->hw;
 614
 615        if (debug & DEBUG_HW) {
 616                if (dch->state <= HFC_MAX_NT_LAYER1_STATE)
 617                        printk(KERN_DEBUG "%s: %s: %s\n",
 618                               hw->name, __func__,
 619                               HFC_NT_LAYER1_STATES[dch->state]);
 620
 621                else
 622                        printk(KERN_INFO DRIVER_NAME "%s: %s: NT G%d\n",
 623                               hw->name, __func__, dch->state);
 624        }
 625
 626        switch (dch->state) {
 627        case (1):
 628                test_and_clear_bit(FLG_ACTIVE, &dch->Flags);
 629                test_and_clear_bit(FLG_L2_ACTIVATED, &dch->Flags);
 630                hw->nt_timer = 0;
 631                hw->timers &= ~NT_ACTIVATION_TIMER;
 632                handle_led(hw, LED_S0_OFF);
 633                break;
 634
 635        case (2):
 636                if (hw->nt_timer < 0) {
 637                        hw->nt_timer = 0;
 638                        hw->timers &= ~NT_ACTIVATION_TIMER;
 639                        hfcsusb_ph_command(dch->hw, HFC_L1_DEACTIVATE_NT);
 640                } else {
 641                        hw->timers |= NT_ACTIVATION_TIMER;
 642                        hw->nt_timer = NT_T1_COUNT;
 643                        /* allow G2 -> G3 transition */
 644                        write_reg(hw, HFCUSB_STATES, 2 | HFCUSB_NT_G2_G3);
 645                }
 646                break;
 647        case (3):
 648                hw->nt_timer = 0;
 649                hw->timers &= ~NT_ACTIVATION_TIMER;
 650                test_and_set_bit(FLG_ACTIVE, &dch->Flags);
 651                _queue_data(&dch->dev.D, PH_ACTIVATE_IND,
 652                            MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
 653                handle_led(hw, LED_S0_ON);
 654                break;
 655        case (4):
 656                hw->nt_timer = 0;
 657                hw->timers &= ~NT_ACTIVATION_TIMER;
 658                break;
 659        default:
 660                break;
 661        }
 662        hfcsusb_ph_info(hw);
 663}
 664
 665static void
 666ph_state(struct dchannel *dch)
 667{
 668        struct hfcsusb *hw = dch->hw;
 669
 670        if (hw->protocol == ISDN_P_NT_S0)
 671                ph_state_nt(dch);
 672        else if (hw->protocol == ISDN_P_TE_S0)
 673                ph_state_te(dch);
 674}
 675
 676/*
 677 * disable/enable BChannel for desired protocoll
 678 */
 679static int
 680hfcsusb_setup_bch(struct bchannel *bch, int protocol)
 681{
 682        struct hfcsusb *hw = bch->hw;
 683        __u8 conhdlc, sctrl, sctrl_r;
 684
 685        if (debug & DEBUG_HW)
 686                printk(KERN_DEBUG "%s: %s: protocol %x-->%x B%d\n",
 687                       hw->name, __func__, bch->state, protocol,
 688                       bch->nr);
 689
 690        /* setup val for CON_HDLC */
 691        conhdlc = 0;
 692        if (protocol > ISDN_P_NONE)
 693                conhdlc = 8;    /* enable FIFO */
 694
 695        switch (protocol) {
 696        case (-1):      /* used for init */
 697                bch->state = -1;
 698                fallthrough;
 699        case (ISDN_P_NONE):
 700                if (bch->state == ISDN_P_NONE)
 701                        return 0; /* already in idle state */
 702                bch->state = ISDN_P_NONE;
 703                clear_bit(FLG_HDLC, &bch->Flags);
 704                clear_bit(FLG_TRANSPARENT, &bch->Flags);
 705                break;
 706        case (ISDN_P_B_RAW):
 707                conhdlc |= 2;
 708                bch->state = protocol;
 709                set_bit(FLG_TRANSPARENT, &bch->Flags);
 710                break;
 711        case (ISDN_P_B_HDLC):
 712                bch->state = protocol;
 713                set_bit(FLG_HDLC, &bch->Flags);
 714                break;
 715        default:
 716                if (debug & DEBUG_HW)
 717                        printk(KERN_DEBUG "%s: %s: prot not known %x\n",
 718                               hw->name, __func__, protocol);
 719                return -ENOPROTOOPT;
 720        }
 721
 722        if (protocol >= ISDN_P_NONE) {
 723                write_reg(hw, HFCUSB_FIFO, (bch->nr == 1) ? 0 : 2);
 724                write_reg(hw, HFCUSB_CON_HDLC, conhdlc);
 725                write_reg(hw, HFCUSB_INC_RES_F, 2);
 726                write_reg(hw, HFCUSB_FIFO, (bch->nr == 1) ? 1 : 3);
 727                write_reg(hw, HFCUSB_CON_HDLC, conhdlc);
 728                write_reg(hw, HFCUSB_INC_RES_F, 2);
 729
 730                sctrl = 0x40 + ((hw->protocol == ISDN_P_TE_S0) ? 0x00 : 0x04);
 731                sctrl_r = 0x0;
 732                if (test_bit(FLG_ACTIVE, &hw->bch[0].Flags)) {
 733                        sctrl |= 1;
 734                        sctrl_r |= 1;
 735                }
 736                if (test_bit(FLG_ACTIVE, &hw->bch[1].Flags)) {
 737                        sctrl |= 2;
 738                        sctrl_r |= 2;
 739                }
 740                write_reg(hw, HFCUSB_SCTRL, sctrl);
 741                write_reg(hw, HFCUSB_SCTRL_R, sctrl_r);
 742
 743                if (protocol > ISDN_P_NONE)
 744                        handle_led(hw, (bch->nr == 1) ? LED_B1_ON : LED_B2_ON);
 745                else
 746                        handle_led(hw, (bch->nr == 1) ? LED_B1_OFF :
 747                                   LED_B2_OFF);
 748        }
 749        return hfcsusb_ph_info(hw);
 750}
 751
 752static void
 753hfcsusb_ph_command(struct hfcsusb *hw, u_char command)
 754{
 755        if (debug & DEBUG_HW)
 756                printk(KERN_DEBUG "%s: %s: %x\n",
 757                       hw->name, __func__, command);
 758
 759        switch (command) {
 760        case HFC_L1_ACTIVATE_TE:
 761                /* force sending sending INFO1 */
 762                write_reg(hw, HFCUSB_STATES, 0x14);
 763                /* start l1 activation */
 764                write_reg(hw, HFCUSB_STATES, 0x04);
 765                break;
 766
 767        case HFC_L1_FORCE_DEACTIVATE_TE:
 768                write_reg(hw, HFCUSB_STATES, 0x10);
 769                write_reg(hw, HFCUSB_STATES, 0x03);
 770                break;
 771
 772        case HFC_L1_ACTIVATE_NT:
 773                if (hw->dch.state == 3)
 774                        _queue_data(&hw->dch.dev.D, PH_ACTIVATE_IND,
 775                                    MISDN_ID_ANY, 0, NULL, GFP_ATOMIC);
 776                else
 777                        write_reg(hw, HFCUSB_STATES, HFCUSB_ACTIVATE |
 778                                  HFCUSB_DO_ACTION | HFCUSB_NT_G2_G3);
 779                break;
 780
 781        case HFC_L1_DEACTIVATE_NT:
 782                write_reg(hw, HFCUSB_STATES,
 783                          HFCUSB_DO_ACTION);
 784                break;
 785        }
 786}
 787
 788/*
 789 * Layer 1 B-channel hardware access
 790 */
 791static int
 792channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
 793{
 794        return mISDN_ctrl_bchannel(bch, cq);
 795}
 796
 797/* collect data from incoming interrupt or isochron USB data */
 798static void
 799hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
 800                 int finish)
 801{
 802        struct hfcsusb  *hw = fifo->hw;
 803        struct sk_buff  *rx_skb = NULL;
 804        int             maxlen = 0;
 805        int             fifon = fifo->fifonum;
 806        int             i;
 807        int             hdlc = 0;
 808        unsigned long   flags;
 809
 810        if (debug & DBG_HFC_CALL_TRACE)
 811                printk(KERN_DEBUG "%s: %s: fifo(%i) len(%i) "
 812                       "dch(%p) bch(%p) ech(%p)\n",
 813                       hw->name, __func__, fifon, len,
 814                       fifo->dch, fifo->bch, fifo->ech);
 815
 816        if (!len)
 817                return;
 818
 819        if ((!!fifo->dch + !!fifo->bch + !!fifo->ech) != 1) {
 820                printk(KERN_DEBUG "%s: %s: undefined channel\n",
 821                       hw->name, __func__);
 822                return;
 823        }
 824
 825        spin_lock_irqsave(&hw->lock, flags);
 826        if (fifo->dch) {
 827                rx_skb = fifo->dch->rx_skb;
 828                maxlen = fifo->dch->maxlen;
 829                hdlc = 1;
 830        }
 831        if (fifo->bch) {
 832                if (test_bit(FLG_RX_OFF, &fifo->bch->Flags)) {
 833                        fifo->bch->dropcnt += len;
 834                        spin_unlock_irqrestore(&hw->lock, flags);
 835                        return;
 836                }
 837                maxlen = bchannel_get_rxbuf(fifo->bch, len);
 838                rx_skb = fifo->bch->rx_skb;
 839                if (maxlen < 0) {
 840                        if (rx_skb)
 841                                skb_trim(rx_skb, 0);
 842                        pr_warn("%s.B%d: No bufferspace for %d bytes\n",
 843                                hw->name, fifo->bch->nr, len);
 844                        spin_unlock_irqrestore(&hw->lock, flags);
 845                        return;
 846                }
 847                maxlen = fifo->bch->maxlen;
 848                hdlc = test_bit(FLG_HDLC, &fifo->bch->Flags);
 849        }
 850        if (fifo->ech) {
 851                rx_skb = fifo->ech->rx_skb;
 852                maxlen = fifo->ech->maxlen;
 853                hdlc = 1;
 854        }
 855
 856        if (fifo->dch || fifo->ech) {
 857                if (!rx_skb) {
 858                        rx_skb = mI_alloc_skb(maxlen, GFP_ATOMIC);
 859                        if (rx_skb) {
 860                                if (fifo->dch)
 861                                        fifo->dch->rx_skb = rx_skb;
 862                                if (fifo->ech)
 863                                        fifo->ech->rx_skb = rx_skb;
 864                                skb_trim(rx_skb, 0);
 865                        } else {
 866                                printk(KERN_DEBUG "%s: %s: No mem for rx_skb\n",
 867                                       hw->name, __func__);
 868                                spin_unlock_irqrestore(&hw->lock, flags);
 869                                return;
 870                        }
 871                }
 872                /* D/E-Channel SKB range check */
 873                if ((rx_skb->len + len) >= MAX_DFRAME_LEN_L1) {
 874                        printk(KERN_DEBUG "%s: %s: sbk mem exceeded "
 875                               "for fifo(%d) HFCUSB_D_RX\n",
 876                               hw->name, __func__, fifon);
 877                        skb_trim(rx_skb, 0);
 878                        spin_unlock_irqrestore(&hw->lock, flags);
 879                        return;
 880                }
 881        }
 882
 883        skb_put_data(rx_skb, data, len);
 884
 885        if (hdlc) {
 886                /* we have a complete hdlc packet */
 887                if (finish) {
 888                        if ((rx_skb->len > 3) &&
 889                            (!(rx_skb->data[rx_skb->len - 1]))) {
 890                                if (debug & DBG_HFC_FIFO_VERBOSE) {
 891                                        printk(KERN_DEBUG "%s: %s: fifon(%i)"
 892                                               " new RX len(%i): ",
 893                                               hw->name, __func__, fifon,
 894                                               rx_skb->len);
 895                                        i = 0;
 896                                        while (i < rx_skb->len)
 897                                                printk("%02x ",
 898                                                       rx_skb->data[i++]);
 899                                        printk("\n");
 900                                }
 901
 902                                /* remove CRC & status */
 903                                skb_trim(rx_skb, rx_skb->len - 3);
 904
 905                                if (fifo->dch)
 906                                        recv_Dchannel(fifo->dch);
 907                                if (fifo->bch)
 908                                        recv_Bchannel(fifo->bch, MISDN_ID_ANY,
 909                                                      0);
 910                                if (fifo->ech)
 911                                        recv_Echannel(fifo->ech,
 912                                                      &hw->dch);
 913                        } else {
 914                                if (debug & DBG_HFC_FIFO_VERBOSE) {
 915                                        printk(KERN_DEBUG
 916                                               "%s: CRC or minlen ERROR fifon(%i) "
 917                                               "RX len(%i): ",
 918                                               hw->name, fifon, rx_skb->len);
 919                                        i = 0;
 920                                        while (i < rx_skb->len)
 921                                                printk("%02x ",
 922                                                       rx_skb->data[i++]);
 923                                        printk("\n");
 924                                }
 925                                skb_trim(rx_skb, 0);
 926                        }
 927                }
 928        } else {
 929                /* deliver transparent data to layer2 */
 930                recv_Bchannel(fifo->bch, MISDN_ID_ANY, false);
 931        }
 932        spin_unlock_irqrestore(&hw->lock, flags);
 933}
 934
 935static void
 936fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,
 937              void *buf, int num_packets, int packet_size, int interval,
 938              usb_complete_t complete, void *context)
 939{
 940        int k;
 941
 942        usb_fill_bulk_urb(urb, dev, pipe, buf, packet_size * num_packets,
 943                          complete, context);
 944
 945        urb->number_of_packets = num_packets;
 946        urb->transfer_flags = URB_ISO_ASAP;
 947        urb->actual_length = 0;
 948        urb->interval = interval;
 949
 950        for (k = 0; k < num_packets; k++) {
 951                urb->iso_frame_desc[k].offset = packet_size * k;
 952                urb->iso_frame_desc[k].length = packet_size;
 953                urb->iso_frame_desc[k].actual_length = 0;
 954        }
 955}
 956
 957/* receive completion routine for all ISO tx fifos   */
 958static void
 959rx_iso_complete(struct urb *urb)
 960{
 961        struct iso_urb *context_iso_urb = (struct iso_urb *) urb->context;
 962        struct usb_fifo *fifo = context_iso_urb->owner_fifo;
 963        struct hfcsusb *hw = fifo->hw;
 964        int k, len, errcode, offset, num_isoc_packets, fifon, maxlen,
 965                status, iso_status, i;
 966        __u8 *buf;
 967        static __u8 eof[8];
 968        __u8 s0_state;
 969        unsigned long flags;
 970
 971        fifon = fifo->fifonum;
 972        status = urb->status;
 973
 974        spin_lock_irqsave(&hw->lock, flags);
 975        if (fifo->stop_gracefull) {
 976                fifo->stop_gracefull = 0;
 977                fifo->active = 0;
 978                spin_unlock_irqrestore(&hw->lock, flags);
 979                return;
 980        }
 981        spin_unlock_irqrestore(&hw->lock, flags);
 982
 983        /*
 984         * ISO transfer only partially completed,
 985         * look at individual frame status for details
 986         */
 987        if (status == -EXDEV) {
 988                if (debug & DEBUG_HW)
 989                        printk(KERN_DEBUG "%s: %s: with -EXDEV "
 990                               "urb->status %d, fifonum %d\n",
 991                               hw->name, __func__,  status, fifon);
 992
 993                /* clear status, so go on with ISO transfers */
 994                status = 0;
 995        }
 996
 997        s0_state = 0;
 998        if (fifo->active && !status) {
 999                num_isoc_packets = iso_packets[fifon];
1000                maxlen = fifo->usb_packet_maxlen;
1001
1002                for (k = 0; k < num_isoc_packets; ++k) {
1003                        len = urb->iso_frame_desc[k].actual_length;
1004                        offset = urb->iso_frame_desc[k].offset;
1005                        buf = context_iso_urb->buffer + offset;
1006                        iso_status = urb->iso_frame_desc[k].status;
1007
1008                        if (iso_status && (debug & DBG_HFC_FIFO_VERBOSE)) {
1009                                printk(KERN_DEBUG "%s: %s: "
1010                                       "ISO packet %i, status: %i\n",
1011                                       hw->name, __func__, k, iso_status);
1012                        }
1013
1014                        /* USB data log for every D ISO in */
1015                        if ((fifon == HFCUSB_D_RX) &&
1016                            (debug & DBG_HFC_USB_VERBOSE)) {
1017                                printk(KERN_DEBUG
1018                                       "%s: %s: %d (%d/%d) len(%d) ",
1019                                       hw->name, __func__, urb->start_frame,
1020                                       k, num_isoc_packets - 1,
1021                                       len);
1022                                for (i = 0; i < len; i++)
1023                                        printk("%x ", buf[i]);
1024                                printk("\n");
1025                        }
1026
1027                        if (!iso_status) {
1028                                if (fifo->last_urblen != maxlen) {
1029                                        /*
1030                                         * save fifo fill-level threshold bits
1031                                         * to use them later in TX ISO URB
1032                                         * completions
1033                                         */
1034                                        hw->threshold_mask = buf[1];
1035
1036                                        if (fifon == HFCUSB_D_RX)
1037                                                s0_state = (buf[0] >> 4);
1038
1039                                        eof[fifon] = buf[0] & 1;
1040                                        if (len > 2)
1041                                                hfcsusb_rx_frame(fifo, buf + 2,
1042                                                                 len - 2, (len < maxlen)
1043                                                                 ? eof[fifon] : 0);
1044                                } else
1045                                        hfcsusb_rx_frame(fifo, buf, len,
1046                                                         (len < maxlen) ?
1047                                                         eof[fifon] : 0);
1048                                fifo->last_urblen = len;
1049                        }
1050                }
1051
1052                /* signal S0 layer1 state change */
1053                if ((s0_state) && (hw->initdone) &&
1054                    (s0_state != hw->dch.state)) {
1055                        hw->dch.state = s0_state;
1056                        schedule_event(&hw->dch, FLG_PHCHANGE);
1057                }
1058
1059                fill_isoc_urb(urb, fifo->hw->dev, fifo->pipe,
1060                              context_iso_urb->buffer, num_isoc_packets,
1061                              fifo->usb_packet_maxlen, fifo->intervall,
1062                              (usb_complete_t)rx_iso_complete, urb->context);
1063                errcode = usb_submit_urb(urb, GFP_ATOMIC);
1064                if (errcode < 0) {
1065                        if (debug & DEBUG_HW)
1066                                printk(KERN_DEBUG "%s: %s: error submitting "
1067                                       "ISO URB: %d\n",
1068                                       hw->name, __func__, errcode);
1069                }
1070        } else {
1071                if (status && (debug & DBG_HFC_URB_INFO))
1072                        printk(KERN_DEBUG "%s: %s: rx_iso_complete : "
1073                               "urb->status %d, fifonum %d\n",
1074                               hw->name, __func__, status, fifon);
1075        }
1076}
1077
1078/* receive completion routine for all interrupt rx fifos */
1079static void
1080rx_int_complete(struct urb *urb)
1081{
1082        int len, status, i;
1083        __u8 *buf, maxlen, fifon;
1084        struct usb_fifo *fifo = (struct usb_fifo *) urb->context;
1085        struct hfcsusb *hw = fifo->hw;
1086        static __u8 eof[8];
1087        unsigned long flags;
1088
1089        spin_lock_irqsave(&hw->lock, flags);
1090        if (fifo->stop_gracefull) {
1091                fifo->stop_gracefull = 0;
1092                fifo->active = 0;
1093                spin_unlock_irqrestore(&hw->lock, flags);
1094                return;
1095        }
1096        spin_unlock_irqrestore(&hw->lock, flags);
1097
1098        fifon = fifo->fifonum;
1099        if ((!fifo->active) || (urb->status)) {
1100                if (debug & DBG_HFC_URB_ERROR)
1101                        printk(KERN_DEBUG
1102                               "%s: %s: RX-Fifo %i is going down (%i)\n",
1103                               hw->name, __func__, fifon, urb->status);
1104
1105                fifo->urb->interval = 0; /* cancel automatic rescheduling */
1106                return;
1107        }
1108        len = urb->actual_length;
1109        buf = fifo->buffer;
1110        maxlen = fifo->usb_packet_maxlen;
1111
1112        /* USB data log for every D INT in */
1113        if ((fifon == HFCUSB_D_RX) && (debug & DBG_HFC_USB_VERBOSE)) {
1114                printk(KERN_DEBUG "%s: %s: D RX INT len(%d) ",
1115                       hw->name, __func__, len);
1116                for (i = 0; i < len; i++)
1117                        printk("%02x ", buf[i]);
1118                printk("\n");
1119        }
1120
1121        if (fifo->last_urblen != fifo->usb_packet_maxlen) {
1122                /* the threshold mask is in the 2nd status byte */
1123                hw->threshold_mask = buf[1];
1124
1125                /* signal S0 layer1 state change */
1126                if (hw->initdone && ((buf[0] >> 4) != hw->dch.state)) {
1127                        hw->dch.state = (buf[0] >> 4);
1128                        schedule_event(&hw->dch, FLG_PHCHANGE);
1129                }
1130
1131                eof[fifon] = buf[0] & 1;
1132                /* if we have more than the 2 status bytes -> collect data */
1133                if (len > 2)
1134                        hfcsusb_rx_frame(fifo, buf + 2,
1135                                         urb->actual_length - 2,
1136                                         (len < maxlen) ? eof[fifon] : 0);
1137        } else {
1138                hfcsusb_rx_frame(fifo, buf, urb->actual_length,
1139                                 (len < maxlen) ? eof[fifon] : 0);
1140        }
1141        fifo->last_urblen = urb->actual_length;
1142
1143        status = usb_submit_urb(urb, GFP_ATOMIC);
1144        if (status) {
1145                if (debug & DEBUG_HW)
1146                        printk(KERN_DEBUG "%s: %s: error resubmitting USB\n",
1147                               hw->name, __func__);
1148        }
1149}
1150
1151/* transmit completion routine for all ISO tx fifos */
1152static void
1153tx_iso_complete(struct urb *urb)
1154{
1155        struct iso_urb *context_iso_urb = (struct iso_urb *) urb->context;
1156        struct usb_fifo *fifo = context_iso_urb->owner_fifo;
1157        struct hfcsusb *hw = fifo->hw;
1158        struct sk_buff *tx_skb;
1159        int k, tx_offset, num_isoc_packets, sink, remain, current_len,
1160                errcode, hdlc, i;
1161        int *tx_idx;
1162        int frame_complete, fifon, status, fillempty = 0;
1163        __u8 threshbit, *p;
1164        unsigned long flags;
1165
1166        spin_lock_irqsave(&hw->lock, flags);
1167        if (fifo->stop_gracefull) {
1168                fifo->stop_gracefull = 0;
1169                fifo->active = 0;
1170                spin_unlock_irqrestore(&hw->lock, flags);
1171                return;
1172        }
1173
1174        if (fifo->dch) {
1175                tx_skb = fifo->dch->tx_skb;
1176                tx_idx = &fifo->dch->tx_idx;
1177                hdlc = 1;
1178        } else if (fifo->bch) {
1179                tx_skb = fifo->bch->tx_skb;
1180                tx_idx = &fifo->bch->tx_idx;
1181                hdlc = test_bit(FLG_HDLC, &fifo->bch->Flags);
1182                if (!tx_skb && !hdlc &&
1183                    test_bit(FLG_FILLEMPTY, &fifo->bch->Flags))
1184                        fillempty = 1;
1185        } else {
1186                printk(KERN_DEBUG "%s: %s: neither BCH nor DCH\n",
1187                       hw->name, __func__);
1188                spin_unlock_irqrestore(&hw->lock, flags);
1189                return;
1190        }
1191
1192        fifon = fifo->fifonum;
1193        status = urb->status;
1194
1195        tx_offset = 0;
1196
1197        /*
1198         * ISO transfer only partially completed,
1199         * look at individual frame status for details
1200         */
1201        if (status == -EXDEV) {
1202                if (debug & DBG_HFC_URB_ERROR)
1203                        printk(KERN_DEBUG "%s: %s: "
1204                               "-EXDEV (%i) fifon (%d)\n",
1205                               hw->name, __func__, status, fifon);
1206
1207                /* clear status, so go on with ISO transfers */
1208                status = 0;
1209        }
1210
1211        if (fifo->active && !status) {
1212                /* is FifoFull-threshold set for our channel? */
1213                threshbit = (hw->threshold_mask & (1 << fifon));
1214                num_isoc_packets = iso_packets[fifon];
1215
1216                /* predict dataflow to avoid fifo overflow */
1217                if (fifon >= HFCUSB_D_TX)
1218                        sink = (threshbit) ? SINK_DMIN : SINK_DMAX;
1219                else
1220                        sink = (threshbit) ? SINK_MIN : SINK_MAX;
1221                fill_isoc_urb(urb, fifo->hw->dev, fifo->pipe,
1222                              context_iso_urb->buffer, num_isoc_packets,
1223                              fifo->usb_packet_maxlen, fifo->intervall,
1224                              (usb_complete_t)tx_iso_complete, urb->context);
1225                memset(context_iso_urb->buffer, 0,
1226                       sizeof(context_iso_urb->buffer));
1227                frame_complete = 0;
1228
1229                for (k = 0; k < num_isoc_packets; ++k) {
1230                        /* analyze tx success of previous ISO packets */
1231                        if (debug & DBG_HFC_URB_ERROR) {
1232                                errcode = urb->iso_frame_desc[k].status;
1233                                if (errcode) {
1234                                        printk(KERN_DEBUG "%s: %s: "
1235                                               "ISO packet %i, status: %i\n",
1236                                               hw->name, __func__, k, errcode);
1237                                }
1238                        }
1239
1240                        /* Generate next ISO Packets */
1241                        if (tx_skb)
1242                                remain = tx_skb->len - *tx_idx;
1243                        else if (fillempty)
1244                                remain = 15; /* > not complete */
1245                        else
1246                                remain = 0;
1247
1248                        if (remain > 0) {
1249                                fifo->bit_line -= sink;
1250                                current_len = (0 - fifo->bit_line) / 8;
1251                                if (current_len > 14)
1252                                        current_len = 14;
1253                                if (current_len < 0)
1254                                        current_len = 0;
1255                                if (remain < current_len)
1256                                        current_len = remain;
1257
1258                                /* how much bit do we put on the line? */
1259                                fifo->bit_line += current_len * 8;
1260
1261                                context_iso_urb->buffer[tx_offset] = 0;
1262                                if (current_len == remain) {
1263                                        if (hdlc) {
1264                                                /* signal frame completion */
1265                                                context_iso_urb->
1266                                                        buffer[tx_offset] = 1;
1267                                                /* add 2 byte flags and 16bit
1268                                                 * CRC at end of ISDN frame */
1269                                                fifo->bit_line += 32;
1270                                        }
1271                                        frame_complete = 1;
1272                                }
1273
1274                                /* copy tx data to iso-urb buffer */
1275                                p = context_iso_urb->buffer + tx_offset + 1;
1276                                if (fillempty) {
1277                                        memset(p, fifo->bch->fill[0],
1278                                               current_len);
1279                                } else {
1280                                        memcpy(p, (tx_skb->data + *tx_idx),
1281                                               current_len);
1282                                        *tx_idx += current_len;
1283                                }
1284                                urb->iso_frame_desc[k].offset = tx_offset;
1285                                urb->iso_frame_desc[k].length = current_len + 1;
1286
1287                                /* USB data log for every D ISO out */
1288                                if ((fifon == HFCUSB_D_RX) && !fillempty &&
1289                                    (debug & DBG_HFC_USB_VERBOSE)) {
1290                                        printk(KERN_DEBUG
1291                                               "%s: %s (%d/%d) offs(%d) len(%d) ",
1292                                               hw->name, __func__,
1293                                               k, num_isoc_packets - 1,
1294                                               urb->iso_frame_desc[k].offset,
1295                                               urb->iso_frame_desc[k].length);
1296
1297                                        for (i = urb->iso_frame_desc[k].offset;
1298                                             i < (urb->iso_frame_desc[k].offset
1299                                                  + urb->iso_frame_desc[k].length);
1300                                             i++)
1301                                                printk("%x ",
1302                                                       context_iso_urb->buffer[i]);
1303
1304                                        printk(" skb->len(%i) tx-idx(%d)\n",
1305                                               tx_skb->len, *tx_idx);
1306                                }
1307
1308                                tx_offset += (current_len + 1);
1309                        } else {
1310                                urb->iso_frame_desc[k].offset = tx_offset++;
1311                                urb->iso_frame_desc[k].length = 1;
1312                                /* we lower data margin every msec */
1313                                fifo->bit_line -= sink;
1314                                if (fifo->bit_line < BITLINE_INF)
1315                                        fifo->bit_line = BITLINE_INF;
1316                        }
1317
1318                        if (frame_complete) {
1319                                frame_complete = 0;
1320
1321                                if (debug & DBG_HFC_FIFO_VERBOSE) {
1322                                        printk(KERN_DEBUG  "%s: %s: "
1323                                               "fifon(%i) new TX len(%i): ",
1324                                               hw->name, __func__,
1325                                               fifon, tx_skb->len);
1326                                        i = 0;
1327                                        while (i < tx_skb->len)
1328                                                printk("%02x ",
1329                                                       tx_skb->data[i++]);
1330                                        printk("\n");
1331                                }
1332
1333                                dev_kfree_skb(tx_skb);
1334                                tx_skb = NULL;
1335                                if (fifo->dch && get_next_dframe(fifo->dch))
1336                                        tx_skb = fifo->dch->tx_skb;
1337                                else if (fifo->bch &&
1338                                         get_next_bframe(fifo->bch))
1339                                        tx_skb = fifo->bch->tx_skb;
1340                        }
1341                }
1342                errcode = usb_submit_urb(urb, GFP_ATOMIC);
1343                if (errcode < 0) {
1344                        if (debug & DEBUG_HW)
1345                                printk(KERN_DEBUG
1346                                       "%s: %s: error submitting ISO URB: %d \n",
1347                                       hw->name, __func__, errcode);
1348                }
1349
1350                /*
1351                 * abuse DChannel tx iso completion to trigger NT mode state
1352                 * changes tx_iso_complete is assumed to be called every
1353                 * fifo->intervall (ms)
1354                 */
1355                if ((fifon == HFCUSB_D_TX) && (hw->protocol == ISDN_P_NT_S0)
1356                    && (hw->timers & NT_ACTIVATION_TIMER)) {
1357                        if ((--hw->nt_timer) < 0)
1358                                schedule_event(&hw->dch, FLG_PHCHANGE);
1359                }
1360
1361        } else {
1362                if (status && (debug & DBG_HFC_URB_ERROR))
1363                        printk(KERN_DEBUG  "%s: %s: urb->status %s (%i)"
1364                               "fifonum=%d\n",
1365                               hw->name, __func__,
1366                               symbolic(urb_errlist, status), status, fifon);
1367        }
1368        spin_unlock_irqrestore(&hw->lock, flags);
1369}
1370
1371/*
1372 * allocs urbs and start isoc transfer with two pending urbs to avoid
1373 * gaps in the transfer chain
1374 */
1375static int
1376start_isoc_chain(struct usb_fifo *fifo, int num_packets_per_urb,
1377                 usb_complete_t complete, int packet_size)
1378{
1379        struct hfcsusb *hw = fifo->hw;
1380        int i, k, errcode;
1381
1382        if (debug)
1383                printk(KERN_DEBUG "%s: %s: fifo %i\n",
1384                       hw->name, __func__, fifo->fifonum);
1385
1386        /* allocate Memory for Iso out Urbs */
1387        for (i = 0; i < 2; i++) {
1388                if (!(fifo->iso[i].urb)) {
1389                        fifo->iso[i].urb =
1390                                usb_alloc_urb(num_packets_per_urb, GFP_KERNEL);
1391                        if (!(fifo->iso[i].urb)) {
1392                                printk(KERN_DEBUG
1393                                       "%s: %s: alloc urb for fifo %i failed",
1394                                       hw->name, __func__, fifo->fifonum);
1395                                continue;
1396                        }
1397                        fifo->iso[i].owner_fifo = (struct usb_fifo *) fifo;
1398                        fifo->iso[i].indx = i;
1399
1400                        /* Init the first iso */
1401                        if (ISO_BUFFER_SIZE >=
1402                            (fifo->usb_packet_maxlen *
1403                             num_packets_per_urb)) {
1404                                fill_isoc_urb(fifo->iso[i].urb,
1405                                              fifo->hw->dev, fifo->pipe,
1406                                              fifo->iso[i].buffer,
1407                                              num_packets_per_urb,
1408                                              fifo->usb_packet_maxlen,
1409                                              fifo->intervall, complete,
1410                                              &fifo->iso[i]);
1411                                memset(fifo->iso[i].buffer, 0,
1412                                       sizeof(fifo->iso[i].buffer));
1413
1414                                for (k = 0; k < num_packets_per_urb; k++) {
1415                                        fifo->iso[i].urb->
1416                                                iso_frame_desc[k].offset =
1417                                                k * packet_size;
1418                                        fifo->iso[i].urb->
1419                                                iso_frame_desc[k].length =
1420                                                packet_size;
1421                                }
1422                        } else {
1423                                printk(KERN_DEBUG
1424                                       "%s: %s: ISO Buffer size to small!\n",
1425                                       hw->name, __func__);
1426                        }
1427                }
1428                fifo->bit_line = BITLINE_INF;
1429
1430                errcode = usb_submit_urb(fifo->iso[i].urb, GFP_KERNEL);
1431                fifo->active = (errcode >= 0) ? 1 : 0;
1432                fifo->stop_gracefull = 0;
1433                if (errcode < 0) {
1434                        printk(KERN_DEBUG "%s: %s: %s URB nr:%d\n",
1435                               hw->name, __func__,
1436                               symbolic(urb_errlist, errcode), i);
1437                }
1438        }
1439        return fifo->active;
1440}
1441
1442static void
1443stop_iso_gracefull(struct usb_fifo *fifo)
1444{
1445        struct hfcsusb *hw = fifo->hw;
1446        int i, timeout;
1447        u_long flags;
1448
1449        for (i = 0; i < 2; i++) {
1450                spin_lock_irqsave(&hw->lock, flags);
1451                if (debug)
1452                        printk(KERN_DEBUG "%s: %s for fifo %i.%i\n",
1453                               hw->name, __func__, fifo->fifonum, i);
1454                fifo->stop_gracefull = 1;
1455                spin_unlock_irqrestore(&hw->lock, flags);
1456        }
1457
1458        for (i = 0; i < 2; i++) {
1459                timeout = 3;
1460                while (fifo->stop_gracefull && timeout--)
1461                        schedule_timeout_interruptible((HZ / 1000) * 16);
1462                if (debug && fifo->stop_gracefull)
1463                        printk(KERN_DEBUG "%s: ERROR %s for fifo %i.%i\n",
1464                               hw->name, __func__, fifo->fifonum, i);
1465        }
1466}
1467
1468static void
1469stop_int_gracefull(struct usb_fifo *fifo)
1470{
1471        struct hfcsusb *hw = fifo->hw;
1472        int timeout;
1473        u_long flags;
1474
1475        spin_lock_irqsave(&hw->lock, flags);
1476        if (debug)
1477                printk(KERN_DEBUG "%s: %s for fifo %i\n",
1478                       hw->name, __func__, fifo->fifonum);
1479        fifo->stop_gracefull = 1;
1480        spin_unlock_irqrestore(&hw->lock, flags);
1481
1482        timeout = 3;
1483        while (fifo->stop_gracefull && timeout--)
1484                schedule_timeout_interruptible((HZ / 1000) * 3);
1485        if (debug && fifo->stop_gracefull)
1486                printk(KERN_DEBUG "%s: ERROR %s for fifo %i\n",
1487                       hw->name, __func__, fifo->fifonum);
1488}
1489
1490/* start the interrupt transfer for the given fifo */
1491static void
1492start_int_fifo(struct usb_fifo *fifo)
1493{
1494        struct hfcsusb *hw = fifo->hw;
1495        int errcode;
1496
1497        if (debug)
1498                printk(KERN_DEBUG "%s: %s: INT IN fifo:%d\n",
1499                       hw->name, __func__, fifo->fifonum);
1500
1501        if (!fifo->urb) {
1502                fifo->urb = usb_alloc_urb(0, GFP_KERNEL);
1503                if (!fifo->urb)
1504                        return;
1505        }
1506        usb_fill_int_urb(fifo->urb, fifo->hw->dev, fifo->pipe,
1507                         fifo->buffer, fifo->usb_packet_maxlen,
1508                         (usb_complete_t)rx_int_complete, fifo, fifo->intervall);
1509        fifo->active = 1;
1510        fifo->stop_gracefull = 0;
1511        errcode = usb_submit_urb(fifo->urb, GFP_KERNEL);
1512        if (errcode) {
1513                printk(KERN_DEBUG "%s: %s: submit URB: status:%i\n",
1514                       hw->name, __func__, errcode);
1515                fifo->active = 0;
1516        }
1517}
1518
1519static void
1520setPortMode(struct hfcsusb *hw)
1521{
1522        if (debug & DEBUG_HW)
1523                printk(KERN_DEBUG "%s: %s %s\n", hw->name, __func__,
1524                       (hw->protocol == ISDN_P_TE_S0) ? "TE" : "NT");
1525
1526        if (hw->protocol == ISDN_P_TE_S0) {
1527                write_reg(hw, HFCUSB_SCTRL, 0x40);
1528                write_reg(hw, HFCUSB_SCTRL_E, 0x00);
1529                write_reg(hw, HFCUSB_CLKDEL, CLKDEL_TE);
1530                write_reg(hw, HFCUSB_STATES, 3 | 0x10);
1531                write_reg(hw, HFCUSB_STATES, 3);
1532        } else {
1533                write_reg(hw, HFCUSB_SCTRL, 0x44);
1534                write_reg(hw, HFCUSB_SCTRL_E, 0x09);
1535                write_reg(hw, HFCUSB_CLKDEL, CLKDEL_NT);
1536                write_reg(hw, HFCUSB_STATES, 1 | 0x10);
1537                write_reg(hw, HFCUSB_STATES, 1);
1538        }
1539}
1540
1541static void
1542reset_hfcsusb(struct hfcsusb *hw)
1543{
1544        struct usb_fifo *fifo;
1545        int i;
1546
1547        if (debug & DEBUG_HW)
1548                printk(KERN_DEBUG "%s: %s\n", hw->name, __func__);
1549
1550        /* do Chip reset */
1551        write_reg(hw, HFCUSB_CIRM, 8);
1552
1553        /* aux = output, reset off */
1554        write_reg(hw, HFCUSB_CIRM, 0x10);
1555
1556        /* set USB_SIZE to match the wMaxPacketSize for INT or BULK transfers */
1557        write_reg(hw, HFCUSB_USB_SIZE, (hw->packet_size / 8) |
1558                  ((hw->packet_size / 8) << 4));
1559
1560        /* set USB_SIZE_I to match the the wMaxPacketSize for ISO transfers */
1561        write_reg(hw, HFCUSB_USB_SIZE_I, hw->iso_packet_size);
1562
1563        /* enable PCM/GCI master mode */
1564        write_reg(hw, HFCUSB_MST_MODE1, 0);     /* set default values */
1565        write_reg(hw, HFCUSB_MST_MODE0, 1);     /* enable master mode */
1566
1567        /* init the fifos */
1568        write_reg(hw, HFCUSB_F_THRES,
1569                  (HFCUSB_TX_THRESHOLD / 8) | ((HFCUSB_RX_THRESHOLD / 8) << 4));
1570
1571        fifo = hw->fifos;
1572        for (i = 0; i < HFCUSB_NUM_FIFOS; i++) {
1573                write_reg(hw, HFCUSB_FIFO, i);  /* select the desired fifo */
1574                fifo[i].max_size =
1575                        (i <= HFCUSB_B2_RX) ? MAX_BCH_SIZE : MAX_DFRAME_LEN;
1576                fifo[i].last_urblen = 0;
1577
1578                /* set 2 bit for D- & E-channel */
1579                write_reg(hw, HFCUSB_HDLC_PAR, ((i <= HFCUSB_B2_RX) ? 0 : 2));
1580
1581                /* enable all fifos */
1582                if (i == HFCUSB_D_TX)
1583                        write_reg(hw, HFCUSB_CON_HDLC,
1584                                  (hw->protocol == ISDN_P_NT_S0) ? 0x08 : 0x09);
1585                else
1586                        write_reg(hw, HFCUSB_CON_HDLC, 0x08);
1587                write_reg(hw, HFCUSB_INC_RES_F, 2); /* reset the fifo */
1588        }
1589
1590        write_reg(hw, HFCUSB_SCTRL_R, 0); /* disable both B receivers */
1591        handle_led(hw, LED_POWER_ON);
1592}
1593
1594/* start USB data pipes dependand on device's endpoint configuration */
1595static void
1596hfcsusb_start_endpoint(struct hfcsusb *hw, int channel)
1597{
1598        /* quick check if endpoint already running */
1599        if ((channel == HFC_CHAN_D) && (hw->fifos[HFCUSB_D_RX].active))
1600                return;
1601        if ((channel == HFC_CHAN_B1) && (hw->fifos[HFCUSB_B1_RX].active))
1602                return;
1603        if ((channel == HFC_CHAN_B2) && (hw->fifos[HFCUSB_B2_RX].active))
1604                return;
1605        if ((channel == HFC_CHAN_E) && (hw->fifos[HFCUSB_PCM_RX].active))
1606                return;
1607
1608        /* start rx endpoints using USB INT IN method */
1609        if (hw->cfg_used == CNF_3INT3ISO || hw->cfg_used == CNF_4INT3ISO)
1610                start_int_fifo(hw->fifos + channel * 2 + 1);
1611
1612        /* start rx endpoints using USB ISO IN method */
1613        if (hw->cfg_used == CNF_3ISO3ISO || hw->cfg_used == CNF_4ISO3ISO) {
1614                switch (channel) {
1615                case HFC_CHAN_D:
1616                        start_isoc_chain(hw->fifos + HFCUSB_D_RX,
1617                                         ISOC_PACKETS_D,
1618                                         (usb_complete_t)rx_iso_complete,
1619                                         16);
1620                        break;
1621                case HFC_CHAN_E:
1622                        start_isoc_chain(hw->fifos + HFCUSB_PCM_RX,
1623                                         ISOC_PACKETS_D,
1624                                         (usb_complete_t)rx_iso_complete,
1625                                         16);
1626                        break;
1627                case HFC_CHAN_B1:
1628                        start_isoc_chain(hw->fifos + HFCUSB_B1_RX,
1629                                         ISOC_PACKETS_B,
1630                                         (usb_complete_t)rx_iso_complete,
1631                                         16);
1632                        break;
1633                case HFC_CHAN_B2:
1634                        start_isoc_chain(hw->fifos + HFCUSB_B2_RX,
1635                                         ISOC_PACKETS_B,
1636                                         (usb_complete_t)rx_iso_complete,
1637                                         16);
1638                        break;
1639                }
1640        }
1641
1642        /* start tx endpoints using USB ISO OUT method */
1643        switch (channel) {
1644        case HFC_CHAN_D:
1645                start_isoc_chain(hw->fifos + HFCUSB_D_TX,
1646                                 ISOC_PACKETS_B,
1647                                 (usb_complete_t)tx_iso_complete, 1);
1648                break;
1649        case HFC_CHAN_B1:
1650                start_isoc_chain(hw->fifos + HFCUSB_B1_TX,
1651                                 ISOC_PACKETS_D,
1652                                 (usb_complete_t)tx_iso_complete, 1);
1653                break;
1654        case HFC_CHAN_B2:
1655                start_isoc_chain(hw->fifos + HFCUSB_B2_TX,
1656                                 ISOC_PACKETS_B,
1657                                 (usb_complete_t)tx_iso_complete, 1);
1658                break;
1659        }
1660}
1661
1662/* stop USB data pipes dependand on device's endpoint configuration */
1663static void
1664hfcsusb_stop_endpoint(struct hfcsusb *hw, int channel)
1665{
1666        /* quick check if endpoint currently running */
1667        if ((channel == HFC_CHAN_D) && (!hw->fifos[HFCUSB_D_RX].active))
1668                return;
1669        if ((channel == HFC_CHAN_B1) && (!hw->fifos[HFCUSB_B1_RX].active))
1670                return;
1671        if ((channel == HFC_CHAN_B2) && (!hw->fifos[HFCUSB_B2_RX].active))
1672                return;
1673        if ((channel == HFC_CHAN_E) && (!hw->fifos[HFCUSB_PCM_RX].active))
1674                return;
1675
1676        /* rx endpoints using USB INT IN method */
1677        if (hw->cfg_used == CNF_3INT3ISO || hw->cfg_used == CNF_4INT3ISO)
1678                stop_int_gracefull(hw->fifos + channel * 2 + 1);
1679
1680        /* rx endpoints using USB ISO IN method */
1681        if (hw->cfg_used == CNF_3ISO3ISO || hw->cfg_used == CNF_4ISO3ISO)
1682                stop_iso_gracefull(hw->fifos + channel * 2 + 1);
1683
1684        /* tx endpoints using USB ISO OUT method */
1685        if (channel != HFC_CHAN_E)
1686                stop_iso_gracefull(hw->fifos + channel * 2);
1687}
1688
1689
1690/* Hardware Initialization */
1691static int
1692setup_hfcsusb(struct hfcsusb *hw)
1693{
1694        void *dmabuf = kmalloc(sizeof(u_char), GFP_KERNEL);
1695        u_char b;
1696        int ret;
1697
1698        if (debug & DBG_HFC_CALL_TRACE)
1699                printk(KERN_DEBUG "%s: %s\n", hw->name, __func__);
1700
1701        if (!dmabuf)
1702                return -ENOMEM;
1703
1704        ret = read_reg_atomic(hw, HFCUSB_CHIP_ID, dmabuf);
1705
1706        memcpy(&b, dmabuf, sizeof(u_char));
1707        kfree(dmabuf);
1708
1709        /* check the chip id */
1710        if (ret != 1) {
1711                printk(KERN_DEBUG "%s: %s: cannot read chip id\n",
1712                       hw->name, __func__);
1713                return 1;
1714        }
1715        if (b != HFCUSB_CHIPID) {
1716                printk(KERN_DEBUG "%s: %s: Invalid chip id 0x%02x\n",
1717                       hw->name, __func__, b);
1718                return 1;
1719        }
1720
1721        /* first set the needed config, interface and alternate */
1722        (void) usb_set_interface(hw->dev, hw->if_used, hw->alt_used);
1723
1724        hw->led_state = 0;
1725
1726        /* init the background machinery for control requests */
1727        hw->ctrl_read.bRequestType = 0xc0;
1728        hw->ctrl_read.bRequest = 1;
1729        hw->ctrl_read.wLength = cpu_to_le16(1);
1730        hw->ctrl_write.bRequestType = 0x40;
1731        hw->ctrl_write.bRequest = 0;
1732        hw->ctrl_write.wLength = 0;
1733        usb_fill_control_urb(hw->ctrl_urb, hw->dev, hw->ctrl_out_pipe,
1734                             (u_char *)&hw->ctrl_write, NULL, 0,
1735                             (usb_complete_t)ctrl_complete, hw);
1736
1737        reset_hfcsusb(hw);
1738        return 0;
1739}
1740
1741static void
1742release_hw(struct hfcsusb *hw)
1743{
1744        if (debug & DBG_HFC_CALL_TRACE)
1745                printk(KERN_DEBUG "%s: %s\n", hw->name, __func__);
1746
1747        /*
1748         * stop all endpoints gracefully
1749         * TODO: mISDN_core should generate CLOSE_CHANNEL
1750         *       signals after calling mISDN_unregister_device()
1751         */
1752        hfcsusb_stop_endpoint(hw, HFC_CHAN_D);
1753        hfcsusb_stop_endpoint(hw, HFC_CHAN_B1);
1754        hfcsusb_stop_endpoint(hw, HFC_CHAN_B2);
1755        if (hw->fifos[HFCUSB_PCM_RX].pipe)
1756                hfcsusb_stop_endpoint(hw, HFC_CHAN_E);
1757        if (hw->protocol == ISDN_P_TE_S0)
1758                l1_event(hw->dch.l1, CLOSE_CHANNEL);
1759
1760        mISDN_unregister_device(&hw->dch.dev);
1761        mISDN_freebchannel(&hw->bch[1]);
1762        mISDN_freebchannel(&hw->bch[0]);
1763        mISDN_freedchannel(&hw->dch);
1764
1765        if (hw->ctrl_urb) {
1766                usb_kill_urb(hw->ctrl_urb);
1767                usb_free_urb(hw->ctrl_urb);
1768                hw->ctrl_urb = NULL;
1769        }
1770
1771        if (hw->intf)
1772                usb_set_intfdata(hw->intf, NULL);
1773        list_del(&hw->list);
1774        kfree(hw);
1775        hw = NULL;
1776}
1777
1778static void
1779deactivate_bchannel(struct bchannel *bch)
1780{
1781        struct hfcsusb *hw = bch->hw;
1782        u_long flags;
1783
1784        if (bch->debug & DEBUG_HW)
1785                printk(KERN_DEBUG "%s: %s: bch->nr(%i)\n",
1786                       hw->name, __func__, bch->nr);
1787
1788        spin_lock_irqsave(&hw->lock, flags);
1789        mISDN_clear_bchannel(bch);
1790        spin_unlock_irqrestore(&hw->lock, flags);
1791        hfcsusb_setup_bch(bch, ISDN_P_NONE);
1792        hfcsusb_stop_endpoint(hw, bch->nr - 1);
1793}
1794
1795/*
1796 * Layer 1 B-channel hardware access
1797 */
1798static int
1799hfc_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
1800{
1801        struct bchannel *bch = container_of(ch, struct bchannel, ch);
1802        int             ret = -EINVAL;
1803
1804        if (bch->debug & DEBUG_HW)
1805                printk(KERN_DEBUG "%s: cmd:%x %p\n", __func__, cmd, arg);
1806
1807        switch (cmd) {
1808        case HW_TESTRX_RAW:
1809        case HW_TESTRX_HDLC:
1810        case HW_TESTRX_OFF:
1811                ret = -EINVAL;
1812                break;
1813
1814        case CLOSE_CHANNEL:
1815                test_and_clear_bit(FLG_OPEN, &bch->Flags);
1816                deactivate_bchannel(bch);
1817                ch->protocol = ISDN_P_NONE;
1818                ch->peer = NULL;
1819                module_put(THIS_MODULE);
1820                ret = 0;
1821                break;
1822        case CONTROL_CHANNEL:
1823                ret = channel_bctrl(bch, arg);
1824                break;
1825        default:
1826                printk(KERN_WARNING "%s: unknown prim(%x)\n",
1827                       __func__, cmd);
1828        }
1829        return ret;
1830}
1831
1832static int
1833setup_instance(struct hfcsusb *hw, struct device *parent)
1834{
1835        u_long  flags;
1836        int     err, i;
1837
1838        if (debug & DBG_HFC_CALL_TRACE)
1839                printk(KERN_DEBUG "%s: %s\n", hw->name, __func__);
1840
1841        spin_lock_init(&hw->ctrl_lock);
1842        spin_lock_init(&hw->lock);
1843
1844        mISDN_initdchannel(&hw->dch, MAX_DFRAME_LEN_L1, ph_state);
1845        hw->dch.debug = debug & 0xFFFF;
1846        hw->dch.hw = hw;
1847        hw->dch.dev.Dprotocols = (1 << ISDN_P_TE_S0) | (1 << ISDN_P_NT_S0);
1848        hw->dch.dev.D.send = hfcusb_l2l1D;
1849        hw->dch.dev.D.ctrl = hfc_dctrl;
1850
1851        /* enable E-Channel logging */
1852        if (hw->fifos[HFCUSB_PCM_RX].pipe)
1853                mISDN_initdchannel(&hw->ech, MAX_DFRAME_LEN_L1, NULL);
1854
1855        hw->dch.dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |
1856                (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));
1857        hw->dch.dev.nrbchan = 2;
1858        for (i = 0; i < 2; i++) {
1859                hw->bch[i].nr = i + 1;
1860                set_channelmap(i + 1, hw->dch.dev.channelmap);
1861                hw->bch[i].debug = debug;
1862                mISDN_initbchannel(&hw->bch[i], MAX_DATA_MEM, poll >> 1);
1863                hw->bch[i].hw = hw;
1864                hw->bch[i].ch.send = hfcusb_l2l1B;
1865                hw->bch[i].ch.ctrl = hfc_bctrl;
1866                hw->bch[i].ch.nr = i + 1;
1867                list_add(&hw->bch[i].ch.list, &hw->dch.dev.bchannels);
1868        }
1869
1870        hw->fifos[HFCUSB_B1_TX].bch = &hw->bch[0];
1871        hw->fifos[HFCUSB_B1_RX].bch = &hw->bch[0];
1872        hw->fifos[HFCUSB_B2_TX].bch = &hw->bch[1];
1873        hw->fifos[HFCUSB_B2_RX].bch = &hw->bch[1];
1874        hw->fifos[HFCUSB_D_TX].dch = &hw->dch;
1875        hw->fifos[HFCUSB_D_RX].dch = &hw->dch;
1876        hw->fifos[HFCUSB_PCM_RX].ech = &hw->ech;
1877        hw->fifos[HFCUSB_PCM_TX].ech = &hw->ech;
1878
1879        err = setup_hfcsusb(hw);
1880        if (err)
1881                goto out;
1882
1883        snprintf(hw->name, MISDN_MAX_IDLEN - 1, "%s.%d", DRIVER_NAME,
1884                 hfcsusb_cnt + 1);
1885        printk(KERN_INFO "%s: registered as '%s'\n",
1886               DRIVER_NAME, hw->name);
1887
1888        err = mISDN_register_device(&hw->dch.dev, parent, hw->name);
1889        if (err)
1890                goto out;
1891
1892        hfcsusb_cnt++;
1893        write_lock_irqsave(&HFClock, flags);
1894        list_add_tail(&hw->list, &HFClist);
1895        write_unlock_irqrestore(&HFClock, flags);
1896        return 0;
1897
1898out:
1899        mISDN_freebchannel(&hw->bch[1]);
1900        mISDN_freebchannel(&hw->bch[0]);
1901        mISDN_freedchannel(&hw->dch);
1902        kfree(hw);
1903        return err;
1904}
1905
1906static int
1907hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1908{
1909        struct hfcsusb                  *hw;
1910        struct usb_device               *dev = interface_to_usbdev(intf);
1911        struct usb_host_interface       *iface = intf->cur_altsetting;
1912        struct usb_host_interface       *iface_used = NULL;
1913        struct usb_host_endpoint        *ep;
1914        struct hfcsusb_vdata            *driver_info;
1915        int ifnum = iface->desc.bInterfaceNumber, i, idx, alt_idx,
1916                probe_alt_setting, vend_idx, cfg_used, *vcf, attr, cfg_found,
1917                ep_addr, cmptbl[16], small_match, iso_packet_size, packet_size,
1918                alt_used = 0;
1919
1920        vend_idx = 0xffff;
1921        for (i = 0; hfcsusb_idtab[i].idVendor; i++) {
1922                if ((le16_to_cpu(dev->descriptor.idVendor)
1923                     == hfcsusb_idtab[i].idVendor) &&
1924                    (le16_to_cpu(dev->descriptor.idProduct)
1925                     == hfcsusb_idtab[i].idProduct)) {
1926                        vend_idx = i;
1927                        continue;
1928                }
1929        }
1930
1931        printk(KERN_DEBUG
1932               "%s: interface(%d) actalt(%d) minor(%d) vend_idx(%d)\n",
1933               __func__, ifnum, iface->desc.bAlternateSetting,
1934               intf->minor, vend_idx);
1935
1936        if (vend_idx == 0xffff) {
1937                printk(KERN_WARNING
1938                       "%s: no valid vendor found in USB descriptor\n",
1939                       __func__);
1940                return -EIO;
1941        }
1942        /* if vendor and product ID is OK, start probing alternate settings */
1943        alt_idx = 0;
1944        small_match = -1;
1945
1946        /* default settings */
1947        iso_packet_size = 16;
1948        packet_size = 64;
1949
1950        while (alt_idx < intf->num_altsetting) {
1951                iface = intf->altsetting + alt_idx;
1952                probe_alt_setting = iface->desc.bAlternateSetting;
1953                cfg_used = 0;
1954
1955                while (validconf[cfg_used][0]) {
1956                        cfg_found = 1;
1957                        vcf = validconf[cfg_used];
1958                        ep = iface->endpoint;
1959                        memcpy(cmptbl, vcf, 16 * sizeof(int));
1960
1961                        /* check for all endpoints in this alternate setting */
1962                        for (i = 0; i < iface->desc.bNumEndpoints; i++) {
1963                                ep_addr = ep->desc.bEndpointAddress;
1964
1965                                /* get endpoint base */
1966                                idx = ((ep_addr & 0x7f) - 1) * 2;
1967                                if (idx > 15)
1968                                        return -EIO;
1969
1970                                if (ep_addr & 0x80)
1971                                        idx++;
1972                                attr = ep->desc.bmAttributes;
1973
1974                                if (cmptbl[idx] != EP_NOP) {
1975                                        if (cmptbl[idx] == EP_NUL)
1976                                                cfg_found = 0;
1977                                        if (attr == USB_ENDPOINT_XFER_INT
1978                                            && cmptbl[idx] == EP_INT)
1979                                                cmptbl[idx] = EP_NUL;
1980                                        if (attr == USB_ENDPOINT_XFER_BULK
1981                                            && cmptbl[idx] == EP_BLK)
1982                                                cmptbl[idx] = EP_NUL;
1983                                        if (attr == USB_ENDPOINT_XFER_ISOC
1984                                            && cmptbl[idx] == EP_ISO)
1985                                                cmptbl[idx] = EP_NUL;
1986
1987                                        if (attr == USB_ENDPOINT_XFER_INT &&
1988                                            ep->desc.bInterval < vcf[17]) {
1989                                                cfg_found = 0;
1990                                        }
1991                                }
1992                                ep++;
1993                        }
1994
1995                        for (i = 0; i < 16; i++)
1996                                if (cmptbl[i] != EP_NOP && cmptbl[i] != EP_NUL)
1997                                        cfg_found = 0;
1998
1999                        if (cfg_found) {
2000                                if (small_match < cfg_used) {
2001                                        small_match = cfg_used;
2002                                        alt_used = probe_alt_setting;
2003                                        iface_used = iface;
2004                                }
2005                        }
2006                        cfg_used++;
2007                }
2008                alt_idx++;
2009        }       /* (alt_idx < intf->num_altsetting) */
2010
2011        /* not found a valid USB Ta Endpoint config */
2012        if (small_match == -1)
2013                return -EIO;
2014
2015        iface = iface_used;
2016        hw = kzalloc(sizeof(struct hfcsusb), GFP_KERNEL);
2017        if (!hw)
2018                return -ENOMEM; /* got no mem */
2019        snprintf(hw->name, MISDN_MAX_IDLEN - 1, "%s", DRIVER_NAME);
2020
2021        ep = iface->endpoint;
2022        vcf = validconf[small_match];
2023
2024        for (i = 0; i < iface->desc.bNumEndpoints; i++) {
2025                struct usb_fifo *f;
2026
2027                ep_addr = ep->desc.bEndpointAddress;
2028                /* get endpoint base */
2029                idx = ((ep_addr & 0x7f) - 1) * 2;
2030                if (ep_addr & 0x80)
2031                        idx++;
2032                f = &hw->fifos[idx & 7];
2033
2034                /* init Endpoints */
2035                if (vcf[idx] == EP_NOP || vcf[idx] == EP_NUL) {
2036                        ep++;
2037                        continue;
2038                }
2039                switch (ep->desc.bmAttributes) {
2040                case USB_ENDPOINT_XFER_INT:
2041                        f->pipe = usb_rcvintpipe(dev,
2042                                                 ep->desc.bEndpointAddress);
2043                        f->usb_transfer_mode = USB_INT;
2044                        packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
2045                        break;
2046                case USB_ENDPOINT_XFER_BULK:
2047                        if (ep_addr & 0x80)
2048                                f->pipe = usb_rcvbulkpipe(dev,
2049                                                          ep->desc.bEndpointAddress);
2050                        else
2051                                f->pipe = usb_sndbulkpipe(dev,
2052                                                          ep->desc.bEndpointAddress);
2053                        f->usb_transfer_mode = USB_BULK;
2054                        packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
2055                        break;
2056                case USB_ENDPOINT_XFER_ISOC:
2057                        if (ep_addr & 0x80)
2058                                f->pipe = usb_rcvisocpipe(dev,
2059                                                          ep->desc.bEndpointAddress);
2060                        else
2061                                f->pipe = usb_sndisocpipe(dev,
2062                                                          ep->desc.bEndpointAddress);
2063                        f->usb_transfer_mode = USB_ISOC;
2064                        iso_packet_size = le16_to_cpu(ep->desc.wMaxPacketSize);
2065                        break;
2066                default:
2067                        f->pipe = 0;
2068                }
2069
2070                if (f->pipe) {
2071                        f->fifonum = idx & 7;
2072                        f->hw = hw;
2073                        f->usb_packet_maxlen =
2074                                le16_to_cpu(ep->desc.wMaxPacketSize);
2075                        f->intervall = ep->desc.bInterval;
2076                }
2077                ep++;
2078        }
2079        hw->dev = dev; /* save device */
2080        hw->if_used = ifnum; /* save used interface */
2081        hw->alt_used = alt_used; /* and alternate config */
2082        hw->ctrl_paksize = dev->descriptor.bMaxPacketSize0; /* control size */
2083        hw->cfg_used = vcf[16]; /* store used config */
2084        hw->vend_idx = vend_idx; /* store found vendor */
2085        hw->packet_size = packet_size;
2086        hw->iso_packet_size = iso_packet_size;
2087
2088        /* create the control pipes needed for register access */
2089        hw->ctrl_in_pipe = usb_rcvctrlpipe(hw->dev, 0);
2090        hw->ctrl_out_pipe = usb_sndctrlpipe(hw->dev, 0);
2091
2092        driver_info = (struct hfcsusb_vdata *)
2093                      hfcsusb_idtab[vend_idx].driver_info;
2094
2095        hw->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
2096        if (!hw->ctrl_urb) {
2097                pr_warn("%s: No memory for control urb\n",
2098                        driver_info->vend_name);
2099                kfree(hw);
2100                return -ENOMEM;
2101        }
2102
2103        pr_info("%s: %s: detected \"%s\" (%s, if=%d alt=%d)\n",
2104                hw->name, __func__, driver_info->vend_name,
2105                conf_str[small_match], ifnum, alt_used);
2106
2107        if (setup_instance(hw, dev->dev.parent))
2108                return -EIO;
2109
2110        hw->intf = intf;
2111        usb_set_intfdata(hw->intf, hw);
2112        return 0;
2113}
2114
2115/* function called when an active device is removed */
2116static void
2117hfcsusb_disconnect(struct usb_interface *intf)
2118{
2119        struct hfcsusb *hw = usb_get_intfdata(intf);
2120        struct hfcsusb *next;
2121        int cnt = 0;
2122
2123        printk(KERN_INFO "%s: device disconnected\n", hw->name);
2124
2125        handle_led(hw, LED_POWER_OFF);
2126        release_hw(hw);
2127
2128        list_for_each_entry_safe(hw, next, &HFClist, list)
2129                cnt++;
2130        if (!cnt)
2131                hfcsusb_cnt = 0;
2132
2133        usb_set_intfdata(intf, NULL);
2134}
2135
2136static struct usb_driver hfcsusb_drv = {
2137        .name = DRIVER_NAME,
2138        .id_table = hfcsusb_idtab,
2139        .probe = hfcsusb_probe,
2140        .disconnect = hfcsusb_disconnect,
2141        .disable_hub_initiated_lpm = 1,
2142};
2143
2144module_usb_driver(hfcsusb_drv);
2145