1 /* $Id: elsa_ser.c,v 2.14.2.3 2004/02/11 13:21:33 keil Exp $
 
   3  * stuff for the serial modem on ELSA cards
 
   5  * This software may be used and distributed according to the terms
 
   6  * of the GNU General Public License, incorporated herein by reference.
 
  10 #include <linux/config.h>
 
  11 #include <linux/serial.h>
 
  12 #include <linux/serial_reg.h>
 
  14 #define MAX_MODEM_BUF   256
 
  15 #define WAKEUP_CHARS    (MAX_MODEM_BUF/2)
 
  16 #define RS_ISR_PASS_LIMIT 256
 
  17 #define BASE_BAUD ( 1843200 / 16 )
 
  19 //#define SERIAL_DEBUG_OPEN 1
 
  20 //#define SERIAL_DEBUG_INTR 1
 
  21 //#define SERIAL_DEBUG_FLOW 1
 
  22 #undef SERIAL_DEBUG_OPEN
 
  23 #undef SERIAL_DEBUG_INTR
 
  24 #undef SERIAL_DEBUG_FLOW
 
  25 #undef SERIAL_DEBUG_REG
 
  26 //#define SERIAL_DEBUG_REG 1
 
  28 #ifdef SERIAL_DEBUG_REG
 
  29 static u_char deb[32];
 
  30 const char *ModemIn[] = {"RBR","IER","IIR","LCR","MCR","LSR","MSR","SCR"};
 
  31 const char *ModemOut[] = {"THR","IER","FCR","LCR","MCR","LSR","MSR","SCR"};
 
  34 static char *MInit_1 = "AT&F&C1E0&D2\r\0";
 
  35 static char *MInit_2 = "ATL2M1S64=13\r\0";
 
  36 static char *MInit_3 = "AT+FCLASS=0\r\0";
 
  37 static char *MInit_4 = "ATV1S2=128X1\r\0";
 
  38 static char *MInit_5 = "AT\\V8\\N3\r\0";
 
  39 static char *MInit_6 = "ATL0M0&G0%E1\r\0";
 
  40 static char *MInit_7 = "AT%L1%M0%C3\r\0";
 
  42 static char *MInit_speed28800 = "AT%G0%B28800\r\0";
 
  44 static char *MInit_dialout = "ATs7=60 x1 d\r\0";
 
  45 static char *MInit_dialin = "ATs7=60 x1 a\r\0";
 
  48 static inline unsigned int serial_in(struct IsdnCardState *cs, int offset)
 
  50 #ifdef SERIAL_DEBUG_REG
 
  51         u_int val = inb(cs->hw.elsa.base + 8 + offset);
 
  52         debugl1(cs,"in   %s %02x",ModemIn[offset], val);
 
  55         return inb(cs->hw.elsa.base + 8 + offset);
 
  59 static inline unsigned int serial_inp(struct IsdnCardState *cs, int offset)
 
  61 #ifdef SERIAL_DEBUG_REG
 
  62 #ifdef CONFIG_SERIAL_NOPAUSE_IO
 
  63         u_int val = inb(cs->hw.elsa.base + 8 + offset);
 
  64         debugl1(cs,"inp  %s %02x",ModemIn[offset], val);
 
  66         u_int val = inb_p(cs->hw.elsa.base + 8 + offset);
 
  67         debugl1(cs,"inP  %s %02x",ModemIn[offset], val);
 
  71 #ifdef CONFIG_SERIAL_NOPAUSE_IO
 
  72         return inb(cs->hw.elsa.base + 8 + offset);
 
  74         return inb_p(cs->hw.elsa.base + 8 + offset);
 
  79 static inline void serial_out(struct IsdnCardState *cs, int offset, int value)
 
  81 #ifdef SERIAL_DEBUG_REG
 
  82         debugl1(cs,"out  %s %02x",ModemOut[offset], value);
 
  84         outb(value, cs->hw.elsa.base + 8 + offset);
 
  87 static inline void serial_outp(struct IsdnCardState *cs, int offset,
 
  90 #ifdef SERIAL_DEBUG_REG
 
  91 #ifdef CONFIG_SERIAL_NOPAUSE_IO
 
  92         debugl1(cs,"outp %s %02x",ModemOut[offset], value);
 
  94         debugl1(cs,"outP %s %02x",ModemOut[offset], value);
 
  97 #ifdef CONFIG_SERIAL_NOPAUSE_IO
 
  98         outb(value, cs->hw.elsa.base + 8 + offset);
 
 100         outb_p(value, cs->hw.elsa.base + 8 + offset);
 
 105  * This routine is called to set the UART divisor registers to match
 
 106  * the specified baud rate for a serial port.
 
 108 static void change_speed(struct IsdnCardState *cs, int baud)
 
 110         int     quot = 0, baud_base;
 
 111         unsigned cval, fcr = 0;
 
 115         /* byte size and parity */
 
 116         cval = 0x03; bits = 10;
 
 117         /* Determine divisor based on baud rate */
 
 118         baud_base = BASE_BAUD;
 
 119         quot = baud_base / baud;
 
 120         /* If the quotient is ever zero, default to 9600 bps */
 
 122                 quot = baud_base / 9600;
 
 125         if ((baud_base / quot) < 2400)
 
 126                 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
 
 128                 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_8;
 
 129         serial_outp(cs, UART_FCR, fcr);
 
 130         /* CTS flow control flag and modem status interrupts */
 
 131         cs->hw.elsa.IER &= ~UART_IER_MSI;
 
 132         cs->hw.elsa.IER |= UART_IER_MSI;
 
 133         serial_outp(cs, UART_IER, cs->hw.elsa.IER);
 
 135         debugl1(cs,"modem quot=0x%x", quot);
 
 136         serial_outp(cs, UART_LCR, cval | UART_LCR_DLAB);/* set DLAB */
 
 137         serial_outp(cs, UART_DLL, quot & 0xff);         /* LS of divisor */
 
 138         serial_outp(cs, UART_DLM, quot >> 8);           /* MS of divisor */
 
 139         serial_outp(cs, UART_LCR, cval);                /* reset DLAB */
 
 140         serial_inp(cs, UART_RX);
 
 143 static int mstartup(struct IsdnCardState *cs)
 
 148          * Clear the FIFO buffers and disable them
 
 149          * (they will be reenabled in change_speed())
 
 151         serial_outp(cs, UART_FCR, (UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT));
 
 154          * At this point there's no way the LSR could still be 0xFF;
 
 155          * if it is, then bail out, because there's likely no UART
 
 158         if (serial_inp(cs, UART_LSR) == 0xff) {
 
 164          * Clear the interrupt registers.
 
 166         (void) serial_inp(cs, UART_RX);
 
 167         (void) serial_inp(cs, UART_IIR);
 
 168         (void) serial_inp(cs, UART_MSR);
 
 171          * Now, initialize the UART 
 
 173         serial_outp(cs, UART_LCR, UART_LCR_WLEN8);      /* reset DLAB */
 
 176         cs->hw.elsa.MCR = UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2;
 
 177         serial_outp(cs, UART_MCR, cs->hw.elsa.MCR);
 
 180          * Finally, enable interrupts
 
 182         cs->hw.elsa.IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
 
 183         serial_outp(cs, UART_IER, cs->hw.elsa.IER);     /* enable interrupts */
 
 186          * And clear the interrupt registers again for luck.
 
 188         (void)serial_inp(cs, UART_LSR);
 
 189         (void)serial_inp(cs, UART_RX);
 
 190         (void)serial_inp(cs, UART_IIR);
 
 191         (void)serial_inp(cs, UART_MSR);
 
 193         cs->hw.elsa.transcnt = cs->hw.elsa.transp = 0;
 
 194         cs->hw.elsa.rcvcnt = cs->hw.elsa.rcvp =0;
 
 197          * and set the speed of the serial port
 
 199         change_speed(cs, BASE_BAUD);
 
 200         cs->hw.elsa.MFlag = 1;
 
 206  * This routine will shutdown a serial port; interrupts are disabled, and
 
 207  * DTR is dropped if the hangup on close termio flag is on.
 
 209 static void mshutdown(struct IsdnCardState *cs)
 
 212 #ifdef SERIAL_DEBUG_OPEN
 
 213         printk(KERN_DEBUG"Shutting down serial ....");
 
 217          * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
 
 218          * here so the queue might never be waken up
 
 222         serial_outp(cs, UART_IER, 0x00);        /* disable all intrs */
 
 223         cs->hw.elsa.MCR &= ~UART_MCR_OUT2;
 
 225         /* disable break condition */
 
 226         serial_outp(cs, UART_LCR, serial_inp(cs, UART_LCR) & ~UART_LCR_SBC);
 
 228         cs->hw.elsa.MCR &= ~(UART_MCR_DTR|UART_MCR_RTS);
 
 229         serial_outp(cs, UART_MCR, cs->hw.elsa.MCR);
 
 232         serial_outp(cs, UART_FCR, (UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT));
 
 233         serial_inp(cs, UART_RX);    /* read data port to reset things */
 
 235 #ifdef SERIAL_DEBUG_OPEN
 
 241 write_modem(struct BCState *bcs) {
 
 243         struct IsdnCardState *cs = bcs->cs;
 
 248         if (bcs->tx_skb->len <= 0)
 
 250         len = bcs->tx_skb->len;
 
 251         if (len > MAX_MODEM_BUF - cs->hw.elsa.transcnt)
 
 252                 len = MAX_MODEM_BUF - cs->hw.elsa.transcnt;
 
 253         fp = cs->hw.elsa.transcnt + cs->hw.elsa.transp;
 
 254         fp &= (MAX_MODEM_BUF -1);
 
 256         if (count > MAX_MODEM_BUF - fp) {
 
 257                 count = MAX_MODEM_BUF - fp;
 
 258                 memcpy(cs->hw.elsa.transbuf + fp, bcs->tx_skb->data, count);
 
 259                 skb_pull(bcs->tx_skb, count);
 
 260                 cs->hw.elsa.transcnt += count;
 
 265         memcpy((cs->hw.elsa.transbuf + fp), bcs->tx_skb->data, count);
 
 266         skb_pull(bcs->tx_skb, count);
 
 267         cs->hw.elsa.transcnt += count;
 
 270         if (cs->hw.elsa.transcnt && 
 
 271             !(cs->hw.elsa.IER & UART_IER_THRI)) {
 
 272                         cs->hw.elsa.IER |= UART_IER_THRI;
 
 273                 serial_outp(cs, UART_IER, cs->hw.elsa.IER);
 
 279 modem_fill(struct BCState *bcs) {
 
 282                 if (bcs->tx_skb->len) {
 
 286                         if (test_bit(FLG_LLI_L1WAKEUP,&bcs->st->lli.flag) &&
 
 287                                 (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
 
 289                                 spin_lock_irqsave(&bcs->aclock, flags);
 
 290                                 bcs->ackcnt += bcs->hw.hscx.count;
 
 291                                 spin_unlock_irqrestore(&bcs->aclock, flags);
 
 292                                 schedule_event(bcs, B_ACKPENDING);
 
 294                         dev_kfree_skb_any(bcs->tx_skb);
 
 298         if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
 
 299                 bcs->hw.hscx.count = 0;
 
 300                 test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
 
 303                 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
 
 304                 schedule_event(bcs, B_XMTBUFREADY);
 
 308 static inline void receive_chars(struct IsdnCardState *cs,
 
 315                 ch = serial_in(cs, UART_RX);
 
 316                 if (cs->hw.elsa.rcvcnt >= MAX_MODEM_BUF)
 
 318                 cs->hw.elsa.rcvbuf[cs->hw.elsa.rcvcnt++] = ch;
 
 319 #ifdef SERIAL_DEBUG_INTR
 
 320                 printk("DR%02x:%02x...", ch, *status);
 
 322                 if (*status & (UART_LSR_BI | UART_LSR_PE |
 
 323                                UART_LSR_FE | UART_LSR_OE)) {
 
 325 #ifdef SERIAL_DEBUG_INTR
 
 326                         printk("handling exept....");
 
 329                 *status = serial_inp(cs, UART_LSR);
 
 330         } while (*status & UART_LSR_DR);
 
 331         if (cs->hw.elsa.MFlag == 2) {
 
 332                 if (!(skb = dev_alloc_skb(cs->hw.elsa.rcvcnt)))
 
 333                         printk(KERN_WARNING "ElsaSER: receive out of memory\n");
 
 335                         memcpy(skb_put(skb, cs->hw.elsa.rcvcnt), cs->hw.elsa.rcvbuf, 
 
 337                         skb_queue_tail(& cs->hw.elsa.bcs->rqueue, skb);
 
 339                 schedule_event(cs->hw.elsa.bcs, B_RCVBUFREADY);
 
 344                 t += sprintf(t, "modem read cnt %d", cs->hw.elsa.rcvcnt);
 
 345                 QuickHex(t, cs->hw.elsa.rcvbuf, cs->hw.elsa.rcvcnt);
 
 348         cs->hw.elsa.rcvcnt = 0;
 
 351 static inline void transmit_chars(struct IsdnCardState *cs, int *intr_done)
 
 355         debugl1(cs, "transmit_chars: p(%x) cnt(%x)", cs->hw.elsa.transp, 
 
 356                 cs->hw.elsa.transcnt);
 
 358         if (cs->hw.elsa.transcnt <= 0) {
 
 359                 cs->hw.elsa.IER &= ~UART_IER_THRI;
 
 360                 serial_out(cs, UART_IER, cs->hw.elsa.IER);
 
 365                 serial_outp(cs, UART_TX, cs->hw.elsa.transbuf[cs->hw.elsa.transp++]);
 
 366                 if (cs->hw.elsa.transp >= MAX_MODEM_BUF)
 
 367                         cs->hw.elsa.transp=0;
 
 368                 if (--cs->hw.elsa.transcnt <= 0)
 
 370         } while (--count > 0);
 
 371         if ((cs->hw.elsa.transcnt < WAKEUP_CHARS) && (cs->hw.elsa.MFlag==2))
 
 372                 modem_fill(cs->hw.elsa.bcs);
 
 374 #ifdef SERIAL_DEBUG_INTR
 
 379         if (cs->hw.elsa.transcnt <= 0) {
 
 380                 cs->hw.elsa.IER &= ~UART_IER_THRI;
 
 381                 serial_outp(cs, UART_IER, cs->hw.elsa.IER);
 
 386 static void rs_interrupt_elsa(int irq, struct IsdnCardState *cs)
 
 388         int status, iir, msr;
 
 389         int pass_counter = 0;
 
 391 #ifdef SERIAL_DEBUG_INTR
 
 392         printk("rs_interrupt_single(%d)...", irq);
 
 396                 status = serial_inp(cs, UART_LSR);
 
 397                 debugl1(cs,"rs LSR %02x", status);
 
 398 #ifdef SERIAL_DEBUG_INTR
 
 399                 printk("status = %x...", status);
 
 401                 if (status & UART_LSR_DR)
 
 402                         receive_chars(cs, &status);
 
 403                 if (status & UART_LSR_THRE)
 
 404                         transmit_chars(cs, NULL);
 
 405                 if (pass_counter++ > RS_ISR_PASS_LIMIT) {
 
 406                         printk("rs_single loop break.\n");
 
 409                 iir = serial_inp(cs, UART_IIR);
 
 410                 debugl1(cs,"rs IIR %02x", iir);
 
 411                 if ((iir & 0xf) == 0) {
 
 412                         msr = serial_inp(cs, UART_MSR);
 
 413                         debugl1(cs,"rs MSR %02x", msr);
 
 415         } while (!(iir & UART_IIR_NO_INT));
 
 416 #ifdef SERIAL_DEBUG_INTR
 
 421 extern int open_hscxstate(struct IsdnCardState *cs, struct BCState *bcs);
 
 422 extern void modehscx(struct BCState *bcs, int mode, int bc);
 
 423 extern void hscx_l2l1(struct PStack *st, int pr, void *arg);
 
 426 close_elsastate(struct BCState *bcs)
 
 428         modehscx(bcs, 0, bcs->channel);
 
 429         if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
 
 430                 if (bcs->hw.hscx.rcvbuf) {
 
 431                         if (bcs->mode != L1_MODE_MODEM)
 
 432                                 kfree(bcs->hw.hscx.rcvbuf);
 
 433                         bcs->hw.hscx.rcvbuf = NULL;
 
 435                 skb_queue_purge(&bcs->rqueue);
 
 436                 skb_queue_purge(&bcs->squeue);
 
 438                         dev_kfree_skb_any(bcs->tx_skb);
 
 440                         test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
 
 446 modem_write_cmd(struct IsdnCardState *cs, u_char *buf, int len) {
 
 452         if (len > (MAX_MODEM_BUF - cs->hw.elsa.transcnt)) {
 
 455         fp = cs->hw.elsa.transcnt + cs->hw.elsa.transp;
 
 456         fp &= (MAX_MODEM_BUF -1);
 
 458         if (count > MAX_MODEM_BUF - fp) {
 
 459                 count = MAX_MODEM_BUF - fp;
 
 460                 memcpy(cs->hw.elsa.transbuf + fp, msg, count);
 
 461                 cs->hw.elsa.transcnt += count;
 
 466         memcpy(cs->hw.elsa.transbuf + fp, msg, count);
 
 467         cs->hw.elsa.transcnt += count;
 
 468         if (cs->hw.elsa.transcnt && 
 
 469             !(cs->hw.elsa.IER & UART_IER_THRI)) {
 
 470                 cs->hw.elsa.IER |= UART_IER_THRI;
 
 471                 serial_outp(cs, UART_IER, cs->hw.elsa.IER);
 
 476 modem_set_init(struct IsdnCardState *cs) {
 
 479 #define RCV_DELAY 20000 
 
 480         modem_write_cmd(cs, MInit_1, strlen(MInit_1));
 
 482         while(timeout-- && cs->hw.elsa.transcnt)
 
 484         debugl1(cs, "msi tout=%d", timeout);
 
 486         modem_write_cmd(cs, MInit_2, strlen(MInit_2));
 
 488         while(timeout-- && cs->hw.elsa.transcnt)
 
 490         debugl1(cs, "msi tout=%d", timeout);
 
 492         modem_write_cmd(cs, MInit_3, strlen(MInit_3));
 
 494         while(timeout-- && cs->hw.elsa.transcnt)
 
 496         debugl1(cs, "msi tout=%d", timeout);
 
 498         modem_write_cmd(cs, MInit_4, strlen(MInit_4));
 
 500         while(timeout-- && cs->hw.elsa.transcnt)
 
 502         debugl1(cs, "msi tout=%d", timeout);
 
 504         modem_write_cmd(cs, MInit_5, strlen(MInit_5));
 
 506         while(timeout-- && cs->hw.elsa.transcnt)
 
 508         debugl1(cs, "msi tout=%d", timeout);
 
 510         modem_write_cmd(cs, MInit_6, strlen(MInit_6));
 
 512         while(timeout-- && cs->hw.elsa.transcnt)
 
 514         debugl1(cs, "msi tout=%d", timeout);
 
 516         modem_write_cmd(cs, MInit_7, strlen(MInit_7));
 
 518         while(timeout-- && cs->hw.elsa.transcnt)
 
 520         debugl1(cs, "msi tout=%d", timeout);
 
 525 modem_set_dial(struct IsdnCardState *cs, int outgoing) {
 
 527 #define RCV_DELAY 20000 
 
 529         modem_write_cmd(cs, MInit_speed28800, strlen(MInit_speed28800));
 
 531         while(timeout-- && cs->hw.elsa.transcnt)
 
 533         debugl1(cs, "msi tout=%d", timeout);
 
 536                 modem_write_cmd(cs, MInit_dialout, strlen(MInit_dialout));
 
 538                 modem_write_cmd(cs, MInit_dialin, strlen(MInit_dialin));
 
 540         while(timeout-- && cs->hw.elsa.transcnt)
 
 542         debugl1(cs, "msi tout=%d", timeout);
 
 547 modem_l2l1(struct PStack *st, int pr, void *arg)
 
 549         struct BCState *bcs = st->l1.bcs;
 
 550         struct sk_buff *skb = arg;
 
 553         if (pr == (PH_DATA | REQUEST)) {
 
 554                 spin_lock_irqsave(&bcs->cs->lock, flags);
 
 556                         skb_queue_tail(&bcs->squeue, skb);
 
 559                         test_and_set_bit(BC_FLG_BUSY, &bcs->Flag);
 
 560                         bcs->hw.hscx.count = 0;
 
 563                 spin_unlock_irqrestore(&bcs->cs->lock, flags);
 
 564         } else if (pr == (PH_ACTIVATE | REQUEST)) {
 
 565                 test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag);
 
 566                 st->l1.l1l2(st, PH_ACTIVATE | CONFIRM, NULL);
 
 567                 set_arcofi(bcs->cs, st->l1.bc);
 
 569                 modem_set_dial(bcs->cs, test_bit(FLG_ORIG, &st->l2.flag));
 
 570                 bcs->cs->hw.elsa.MFlag=2;
 
 571         } else if (pr == (PH_DEACTIVATE | REQUEST)) {
 
 572                 test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag);
 
 573                 bcs->cs->dc.isac.arcofi_bc = st->l1.bc;
 
 574                 arcofi_fsm(bcs->cs, ARCOFI_START, &ARCOFI_XOP_0);
 
 575                 interruptible_sleep_on(&bcs->cs->dc.isac.arcofi_wait);
 
 576                 bcs->cs->hw.elsa.MFlag=1;
 
 578                 printk(KERN_WARNING"ElsaSer: unknown pr %x\n", pr);
 
 583 setstack_elsa(struct PStack *st, struct BCState *bcs)
 
 586         bcs->channel = st->l1.bc;
 
 587         switch (st->l1.mode) {
 
 590                         if (open_hscxstate(st->l1.hardware, bcs))
 
 592                         st->l2.l2l1 = hscx_l2l1;
 
 595                         bcs->mode = L1_MODE_MODEM;
 
 596                         if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
 
 597                                 bcs->hw.hscx.rcvbuf = bcs->cs->hw.elsa.rcvbuf;
 
 598                                 skb_queue_head_init(&bcs->rqueue);
 
 599                                 skb_queue_head_init(&bcs->squeue);
 
 602                         test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
 
 604                         bcs->hw.hscx.rcvidx = 0;
 
 606                         bcs->cs->hw.elsa.bcs = bcs;
 
 607                         st->l2.l2l1 = modem_l2l1;
 
 611         setstack_manager(st);
 
 618 init_modem(struct IsdnCardState *cs) {
 
 620         cs->bcs[0].BC_SetStack = setstack_elsa;
 
 621         cs->bcs[1].BC_SetStack = setstack_elsa;
 
 622         cs->bcs[0].BC_Close = close_elsastate;
 
 623         cs->bcs[1].BC_Close = close_elsastate;
 
 624         if (!(cs->hw.elsa.rcvbuf = kmalloc(MAX_MODEM_BUF,
 
 627                         "Elsa: No modem mem hw.elsa.rcvbuf\n");
 
 630         if (!(cs->hw.elsa.transbuf = kmalloc(MAX_MODEM_BUF,
 
 633                         "Elsa: No modem mem hw.elsa.transbuf\n");
 
 634                 kfree(cs->hw.elsa.rcvbuf);
 
 635                 cs->hw.elsa.rcvbuf = NULL;
 
 639                 printk(KERN_WARNING "Elsa: problem startup modem\n");
 
 645 release_modem(struct IsdnCardState *cs) {
 
 647         cs->hw.elsa.MFlag = 0;
 
 648         if (cs->hw.elsa.transbuf) {
 
 649                 if (cs->hw.elsa.rcvbuf) {
 
 651                         kfree(cs->hw.elsa.rcvbuf);
 
 652                         cs->hw.elsa.rcvbuf = NULL;
 
 654                 kfree(cs->hw.elsa.transbuf);
 
 655                 cs->hw.elsa.transbuf = NULL;