mISDNisar.c (43321B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * mISDNisar.c ISAR (Siemens PSB 7110) specific functions 4 * 5 * Author Karsten Keil (keil@isdn4linux.de) 6 * 7 * Copyright 2009 by Karsten Keil <keil@isdn4linux.de> 8 */ 9 10/* define this to enable static debug messages, if you kernel supports 11 * dynamic debugging, you should use debugfs for this 12 */ 13/* #define DEBUG */ 14 15#include <linux/gfp.h> 16#include <linux/delay.h> 17#include <linux/vmalloc.h> 18#include <linux/mISDNhw.h> 19#include <linux/module.h> 20#include "isar.h" 21 22#define ISAR_REV "2.1" 23 24MODULE_AUTHOR("Karsten Keil"); 25MODULE_LICENSE("GPL v2"); 26MODULE_VERSION(ISAR_REV); 27 28#define DEBUG_HW_FIRMWARE_FIFO 0x10000 29 30static const u8 faxmodulation[] = {3, 24, 48, 72, 73, 74, 96, 97, 98, 121, 31 122, 145, 146}; 32#define FAXMODCNT 13 33 34static void isar_setup(struct isar_hw *); 35 36static inline int 37waitforHIA(struct isar_hw *isar, int timeout) 38{ 39 int t = timeout; 40 u8 val = isar->read_reg(isar->hw, ISAR_HIA); 41 42 while ((val & 1) && t) { 43 udelay(1); 44 t--; 45 val = isar->read_reg(isar->hw, ISAR_HIA); 46 } 47 pr_debug("%s: HIA after %dus\n", isar->name, timeout - t); 48 return timeout; 49} 50 51/* 52 * send msg to ISAR mailbox 53 * if msg is NULL use isar->buf 54 */ 55static int 56send_mbox(struct isar_hw *isar, u8 his, u8 creg, u8 len, u8 *msg) 57{ 58 if (!waitforHIA(isar, 1000)) 59 return 0; 60 pr_debug("send_mbox(%02x,%02x,%d)\n", his, creg, len); 61 isar->write_reg(isar->hw, ISAR_CTRL_H, creg); 62 isar->write_reg(isar->hw, ISAR_CTRL_L, len); 63 isar->write_reg(isar->hw, ISAR_WADR, 0); 64 if (!msg) 65 msg = isar->buf; 66 if (msg && len) { 67 isar->write_fifo(isar->hw, ISAR_MBOX, msg, len); 68 if (isar->ch[0].bch.debug & DEBUG_HW_BFIFO) { 69 int l = 0; 70 71 while (l < (int)len) { 72 hex_dump_to_buffer(msg + l, len - l, 32, 1, 73 isar->log, 256, 1); 74 pr_debug("%s: %s %02x: %s\n", isar->name, 75 __func__, l, isar->log); 76 l += 32; 77 } 78 } 79 } 80 isar->write_reg(isar->hw, ISAR_HIS, his); 81 waitforHIA(isar, 1000); 82 return 1; 83} 84 85/* 86 * receive message from ISAR mailbox 87 * if msg is NULL use isar->buf 88 */ 89static void 90rcv_mbox(struct isar_hw *isar, u8 *msg) 91{ 92 if (!msg) 93 msg = isar->buf; 94 isar->write_reg(isar->hw, ISAR_RADR, 0); 95 if (msg && isar->clsb) { 96 isar->read_fifo(isar->hw, ISAR_MBOX, msg, isar->clsb); 97 if (isar->ch[0].bch.debug & DEBUG_HW_BFIFO) { 98 int l = 0; 99 100 while (l < (int)isar->clsb) { 101 hex_dump_to_buffer(msg + l, isar->clsb - l, 32, 102 1, isar->log, 256, 1); 103 pr_debug("%s: %s %02x: %s\n", isar->name, 104 __func__, l, isar->log); 105 l += 32; 106 } 107 } 108 } 109 isar->write_reg(isar->hw, ISAR_IIA, 0); 110} 111 112static inline void 113get_irq_infos(struct isar_hw *isar) 114{ 115 isar->iis = isar->read_reg(isar->hw, ISAR_IIS); 116 isar->cmsb = isar->read_reg(isar->hw, ISAR_CTRL_H); 117 isar->clsb = isar->read_reg(isar->hw, ISAR_CTRL_L); 118 pr_debug("%s: rcv_mbox(%02x,%02x,%d)\n", isar->name, 119 isar->iis, isar->cmsb, isar->clsb); 120} 121 122/* 123 * poll answer message from ISAR mailbox 124 * should be used only with ISAR IRQs disabled before DSP was started 125 * 126 */ 127static int 128poll_mbox(struct isar_hw *isar, int maxdelay) 129{ 130 int t = maxdelay; 131 u8 irq; 132 133 irq = isar->read_reg(isar->hw, ISAR_IRQBIT); 134 while (t && !(irq & ISAR_IRQSTA)) { 135 udelay(1); 136 t--; 137 } 138 if (t) { 139 get_irq_infos(isar); 140 rcv_mbox(isar, NULL); 141 } 142 pr_debug("%s: pulled %d bytes after %d us\n", 143 isar->name, isar->clsb, maxdelay - t); 144 return t; 145} 146 147static int 148ISARVersion(struct isar_hw *isar) 149{ 150 int ver; 151 152 /* disable ISAR IRQ */ 153 isar->write_reg(isar->hw, ISAR_IRQBIT, 0); 154 isar->buf[0] = ISAR_MSG_HWVER; 155 isar->buf[1] = 0; 156 isar->buf[2] = 1; 157 if (!send_mbox(isar, ISAR_HIS_VNR, 0, 3, NULL)) 158 return -1; 159 if (!poll_mbox(isar, 1000)) 160 return -2; 161 if (isar->iis == ISAR_IIS_VNR) { 162 if (isar->clsb == 1) { 163 ver = isar->buf[0] & 0xf; 164 return ver; 165 } 166 return -3; 167 } 168 return -4; 169} 170 171static int 172load_firmware(struct isar_hw *isar, const u8 *buf, int size) 173{ 174 u32 saved_debug = isar->ch[0].bch.debug; 175 int ret, cnt; 176 u8 nom, noc; 177 u16 left, val, *sp = (u16 *)buf; 178 u8 *mp; 179 u_long flags; 180 181 struct { 182 u16 sadr; 183 u16 len; 184 u16 d_key; 185 } blk_head; 186 187 if (1 != isar->version) { 188 pr_err("%s: ISAR wrong version %d firmware download aborted\n", 189 isar->name, isar->version); 190 return -EINVAL; 191 } 192 if (!(saved_debug & DEBUG_HW_FIRMWARE_FIFO)) 193 isar->ch[0].bch.debug &= ~DEBUG_HW_BFIFO; 194 pr_debug("%s: load firmware %d words (%d bytes)\n", 195 isar->name, size / 2, size); 196 cnt = 0; 197 size /= 2; 198 /* disable ISAR IRQ */ 199 spin_lock_irqsave(isar->hwlock, flags); 200 isar->write_reg(isar->hw, ISAR_IRQBIT, 0); 201 spin_unlock_irqrestore(isar->hwlock, flags); 202 while (cnt < size) { 203 blk_head.sadr = le16_to_cpu(*sp++); 204 blk_head.len = le16_to_cpu(*sp++); 205 blk_head.d_key = le16_to_cpu(*sp++); 206 cnt += 3; 207 pr_debug("ISAR firmware block (%#x,%d,%#x)\n", 208 blk_head.sadr, blk_head.len, blk_head.d_key & 0xff); 209 left = blk_head.len; 210 if (cnt + left > size) { 211 pr_info("%s: firmware error have %d need %d words\n", 212 isar->name, size, cnt + left); 213 ret = -EINVAL; 214 goto reterrflg; 215 } 216 spin_lock_irqsave(isar->hwlock, flags); 217 if (!send_mbox(isar, ISAR_HIS_DKEY, blk_head.d_key & 0xff, 218 0, NULL)) { 219 pr_info("ISAR send_mbox dkey failed\n"); 220 ret = -ETIME; 221 goto reterror; 222 } 223 if (!poll_mbox(isar, 1000)) { 224 pr_warn("ISAR poll_mbox dkey failed\n"); 225 ret = -ETIME; 226 goto reterror; 227 } 228 spin_unlock_irqrestore(isar->hwlock, flags); 229 if ((isar->iis != ISAR_IIS_DKEY) || isar->cmsb || isar->clsb) { 230 pr_info("ISAR wrong dkey response (%x,%x,%x)\n", 231 isar->iis, isar->cmsb, isar->clsb); 232 ret = 1; 233 goto reterrflg; 234 } 235 while (left > 0) { 236 if (left > 126) 237 noc = 126; 238 else 239 noc = left; 240 nom = (2 * noc) + 3; 241 mp = isar->buf; 242 /* the ISAR is big endian */ 243 *mp++ = blk_head.sadr >> 8; 244 *mp++ = blk_head.sadr & 0xFF; 245 left -= noc; 246 cnt += noc; 247 *mp++ = noc; 248 pr_debug("%s: load %3d words at %04x\n", isar->name, 249 noc, blk_head.sadr); 250 blk_head.sadr += noc; 251 while (noc) { 252 val = le16_to_cpu(*sp++); 253 *mp++ = val >> 8; 254 *mp++ = val & 0xFF; 255 noc--; 256 } 257 spin_lock_irqsave(isar->hwlock, flags); 258 if (!send_mbox(isar, ISAR_HIS_FIRM, 0, nom, NULL)) { 259 pr_info("ISAR send_mbox prog failed\n"); 260 ret = -ETIME; 261 goto reterror; 262 } 263 if (!poll_mbox(isar, 1000)) { 264 pr_info("ISAR poll_mbox prog failed\n"); 265 ret = -ETIME; 266 goto reterror; 267 } 268 spin_unlock_irqrestore(isar->hwlock, flags); 269 if ((isar->iis != ISAR_IIS_FIRM) || 270 isar->cmsb || isar->clsb) { 271 pr_info("ISAR wrong prog response (%x,%x,%x)\n", 272 isar->iis, isar->cmsb, isar->clsb); 273 ret = -EIO; 274 goto reterrflg; 275 } 276 } 277 pr_debug("%s: ISAR firmware block %d words loaded\n", 278 isar->name, blk_head.len); 279 } 280 isar->ch[0].bch.debug = saved_debug; 281 /* 10ms delay */ 282 cnt = 10; 283 while (cnt--) 284 mdelay(1); 285 isar->buf[0] = 0xff; 286 isar->buf[1] = 0xfe; 287 isar->bstat = 0; 288 spin_lock_irqsave(isar->hwlock, flags); 289 if (!send_mbox(isar, ISAR_HIS_STDSP, 0, 2, NULL)) { 290 pr_info("ISAR send_mbox start dsp failed\n"); 291 ret = -ETIME; 292 goto reterror; 293 } 294 if (!poll_mbox(isar, 1000)) { 295 pr_info("ISAR poll_mbox start dsp failed\n"); 296 ret = -ETIME; 297 goto reterror; 298 } 299 if ((isar->iis != ISAR_IIS_STDSP) || isar->cmsb || isar->clsb) { 300 pr_info("ISAR wrong start dsp response (%x,%x,%x)\n", 301 isar->iis, isar->cmsb, isar->clsb); 302 ret = -EIO; 303 goto reterror; 304 } else 305 pr_debug("%s: ISAR start dsp success\n", isar->name); 306 307 /* NORMAL mode entered */ 308 /* Enable IRQs of ISAR */ 309 isar->write_reg(isar->hw, ISAR_IRQBIT, ISAR_IRQSTA); 310 spin_unlock_irqrestore(isar->hwlock, flags); 311 cnt = 1000; /* max 1s */ 312 while ((!isar->bstat) && cnt) { 313 mdelay(1); 314 cnt--; 315 } 316 if (!cnt) { 317 pr_info("ISAR no general status event received\n"); 318 ret = -ETIME; 319 goto reterrflg; 320 } else 321 pr_debug("%s: ISAR general status event %x\n", 322 isar->name, isar->bstat); 323 /* 10ms delay */ 324 cnt = 10; 325 while (cnt--) 326 mdelay(1); 327 isar->iis = 0; 328 spin_lock_irqsave(isar->hwlock, flags); 329 if (!send_mbox(isar, ISAR_HIS_DIAG, ISAR_CTRL_STST, 0, NULL)) { 330 pr_info("ISAR send_mbox self tst failed\n"); 331 ret = -ETIME; 332 goto reterror; 333 } 334 spin_unlock_irqrestore(isar->hwlock, flags); 335 cnt = 10000; /* max 100 ms */ 336 while ((isar->iis != ISAR_IIS_DIAG) && cnt) { 337 udelay(10); 338 cnt--; 339 } 340 mdelay(1); 341 if (!cnt) { 342 pr_info("ISAR no self tst response\n"); 343 ret = -ETIME; 344 goto reterrflg; 345 } 346 if ((isar->cmsb == ISAR_CTRL_STST) && (isar->clsb == 1) 347 && (isar->buf[0] == 0)) 348 pr_debug("%s: ISAR selftest OK\n", isar->name); 349 else { 350 pr_info("ISAR selftest not OK %x/%x/%x\n", 351 isar->cmsb, isar->clsb, isar->buf[0]); 352 ret = -EIO; 353 goto reterrflg; 354 } 355 spin_lock_irqsave(isar->hwlock, flags); 356 isar->iis = 0; 357 if (!send_mbox(isar, ISAR_HIS_DIAG, ISAR_CTRL_SWVER, 0, NULL)) { 358 pr_info("ISAR RQST SVN failed\n"); 359 ret = -ETIME; 360 goto reterror; 361 } 362 spin_unlock_irqrestore(isar->hwlock, flags); 363 cnt = 30000; /* max 300 ms */ 364 while ((isar->iis != ISAR_IIS_DIAG) && cnt) { 365 udelay(10); 366 cnt--; 367 } 368 mdelay(1); 369 if (!cnt) { 370 pr_info("ISAR no SVN response\n"); 371 ret = -ETIME; 372 goto reterrflg; 373 } else { 374 if ((isar->cmsb == ISAR_CTRL_SWVER) && (isar->clsb == 1)) { 375 pr_notice("%s: ISAR software version %#x\n", 376 isar->name, isar->buf[0]); 377 } else { 378 pr_info("%s: ISAR wrong swver response (%x,%x)" 379 " cnt(%d)\n", isar->name, isar->cmsb, 380 isar->clsb, cnt); 381 ret = -EIO; 382 goto reterrflg; 383 } 384 } 385 spin_lock_irqsave(isar->hwlock, flags); 386 isar_setup(isar); 387 spin_unlock_irqrestore(isar->hwlock, flags); 388 ret = 0; 389reterrflg: 390 spin_lock_irqsave(isar->hwlock, flags); 391reterror: 392 isar->ch[0].bch.debug = saved_debug; 393 if (ret) 394 /* disable ISAR IRQ */ 395 isar->write_reg(isar->hw, ISAR_IRQBIT, 0); 396 spin_unlock_irqrestore(isar->hwlock, flags); 397 return ret; 398} 399 400static inline void 401deliver_status(struct isar_ch *ch, int status) 402{ 403 pr_debug("%s: HL->LL FAXIND %x\n", ch->is->name, status); 404 _queue_data(&ch->bch.ch, PH_CONTROL_IND, status, 0, NULL, GFP_ATOMIC); 405} 406 407static inline void 408isar_rcv_frame(struct isar_ch *ch) 409{ 410 u8 *ptr; 411 int maxlen; 412 413 if (!ch->is->clsb) { 414 pr_debug("%s; ISAR zero len frame\n", ch->is->name); 415 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 416 return; 417 } 418 if (test_bit(FLG_RX_OFF, &ch->bch.Flags)) { 419 ch->bch.dropcnt += ch->is->clsb; 420 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 421 return; 422 } 423 switch (ch->bch.state) { 424 case ISDN_P_NONE: 425 pr_debug("%s: ISAR protocol 0 spurious IIS_RDATA %x/%x/%x\n", 426 ch->is->name, ch->is->iis, ch->is->cmsb, ch->is->clsb); 427 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 428 break; 429 case ISDN_P_B_RAW: 430 case ISDN_P_B_L2DTMF: 431 case ISDN_P_B_MODEM_ASYNC: 432 maxlen = bchannel_get_rxbuf(&ch->bch, ch->is->clsb); 433 if (maxlen < 0) { 434 pr_warn("%s.B%d: No bufferspace for %d bytes\n", 435 ch->is->name, ch->bch.nr, ch->is->clsb); 436 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 437 break; 438 } 439 rcv_mbox(ch->is, skb_put(ch->bch.rx_skb, ch->is->clsb)); 440 recv_Bchannel(&ch->bch, 0, false); 441 break; 442 case ISDN_P_B_HDLC: 443 maxlen = bchannel_get_rxbuf(&ch->bch, ch->is->clsb); 444 if (maxlen < 0) { 445 pr_warn("%s.B%d: No bufferspace for %d bytes\n", 446 ch->is->name, ch->bch.nr, ch->is->clsb); 447 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 448 break; 449 } 450 if (ch->is->cmsb & HDLC_ERROR) { 451 pr_debug("%s: ISAR frame error %x len %d\n", 452 ch->is->name, ch->is->cmsb, ch->is->clsb); 453#ifdef ERROR_STATISTIC 454 if (ch->is->cmsb & HDLC_ERR_RER) 455 ch->bch.err_inv++; 456 if (ch->is->cmsb & HDLC_ERR_CER) 457 ch->bch.err_crc++; 458#endif 459 skb_trim(ch->bch.rx_skb, 0); 460 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 461 break; 462 } 463 if (ch->is->cmsb & HDLC_FSD) 464 skb_trim(ch->bch.rx_skb, 0); 465 ptr = skb_put(ch->bch.rx_skb, ch->is->clsb); 466 rcv_mbox(ch->is, ptr); 467 if (ch->is->cmsb & HDLC_FED) { 468 if (ch->bch.rx_skb->len < 3) { /* last 2 are the FCS */ 469 pr_debug("%s: ISAR frame too short %d\n", 470 ch->is->name, ch->bch.rx_skb->len); 471 skb_trim(ch->bch.rx_skb, 0); 472 break; 473 } 474 skb_trim(ch->bch.rx_skb, ch->bch.rx_skb->len - 2); 475 recv_Bchannel(&ch->bch, 0, false); 476 } 477 break; 478 case ISDN_P_B_T30_FAX: 479 if (ch->state != STFAX_ACTIV) { 480 pr_debug("%s: isar_rcv_frame: not ACTIV\n", 481 ch->is->name); 482 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 483 if (ch->bch.rx_skb) 484 skb_trim(ch->bch.rx_skb, 0); 485 break; 486 } 487 if (!ch->bch.rx_skb) { 488 ch->bch.rx_skb = mI_alloc_skb(ch->bch.maxlen, 489 GFP_ATOMIC); 490 if (unlikely(!ch->bch.rx_skb)) { 491 pr_info("%s: B receive out of memory\n", 492 __func__); 493 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 494 break; 495 } 496 } 497 if (ch->cmd == PCTRL_CMD_FRM) { 498 rcv_mbox(ch->is, skb_put(ch->bch.rx_skb, ch->is->clsb)); 499 pr_debug("%s: isar_rcv_frame: %d\n", 500 ch->is->name, ch->bch.rx_skb->len); 501 if (ch->is->cmsb & SART_NMD) { /* ABORT */ 502 pr_debug("%s: isar_rcv_frame: no more data\n", 503 ch->is->name); 504 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 505 send_mbox(ch->is, SET_DPS(ch->dpath) | 506 ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 507 0, NULL); 508 ch->state = STFAX_ESCAPE; 509 /* set_skb_flag(skb, DF_NOMOREDATA); */ 510 } 511 recv_Bchannel(&ch->bch, 0, false); 512 if (ch->is->cmsb & SART_NMD) 513 deliver_status(ch, HW_MOD_NOCARR); 514 break; 515 } 516 if (ch->cmd != PCTRL_CMD_FRH) { 517 pr_debug("%s: isar_rcv_frame: unknown fax mode %x\n", 518 ch->is->name, ch->cmd); 519 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 520 if (ch->bch.rx_skb) 521 skb_trim(ch->bch.rx_skb, 0); 522 break; 523 } 524 /* PCTRL_CMD_FRH */ 525 if ((ch->bch.rx_skb->len + ch->is->clsb) > 526 (ch->bch.maxlen + 2)) { 527 pr_info("%s: %s incoming packet too large\n", 528 ch->is->name, __func__); 529 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 530 skb_trim(ch->bch.rx_skb, 0); 531 break; 532 } else if (ch->is->cmsb & HDLC_ERROR) { 533 pr_info("%s: ISAR frame error %x len %d\n", 534 ch->is->name, ch->is->cmsb, ch->is->clsb); 535 skb_trim(ch->bch.rx_skb, 0); 536 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 537 break; 538 } 539 if (ch->is->cmsb & HDLC_FSD) 540 skb_trim(ch->bch.rx_skb, 0); 541 ptr = skb_put(ch->bch.rx_skb, ch->is->clsb); 542 rcv_mbox(ch->is, ptr); 543 if (ch->is->cmsb & HDLC_FED) { 544 if (ch->bch.rx_skb->len < 3) { /* last 2 are the FCS */ 545 pr_info("%s: ISAR frame too short %d\n", 546 ch->is->name, ch->bch.rx_skb->len); 547 skb_trim(ch->bch.rx_skb, 0); 548 break; 549 } 550 skb_trim(ch->bch.rx_skb, ch->bch.rx_skb->len - 2); 551 recv_Bchannel(&ch->bch, 0, false); 552 } 553 if (ch->is->cmsb & SART_NMD) { /* ABORT */ 554 pr_debug("%s: isar_rcv_frame: no more data\n", 555 ch->is->name); 556 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 557 if (ch->bch.rx_skb) 558 skb_trim(ch->bch.rx_skb, 0); 559 send_mbox(ch->is, SET_DPS(ch->dpath) | 560 ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 0, NULL); 561 ch->state = STFAX_ESCAPE; 562 deliver_status(ch, HW_MOD_NOCARR); 563 } 564 break; 565 default: 566 pr_info("isar_rcv_frame protocol (%x)error\n", ch->bch.state); 567 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 568 break; 569 } 570} 571 572static void 573isar_fill_fifo(struct isar_ch *ch) 574{ 575 int count; 576 u8 msb; 577 u8 *ptr; 578 579 pr_debug("%s: ch%d tx_skb %d tx_idx %d\n", ch->is->name, ch->bch.nr, 580 ch->bch.tx_skb ? ch->bch.tx_skb->len : -1, ch->bch.tx_idx); 581 if (!(ch->is->bstat & 582 (ch->dpath == 1 ? BSTAT_RDM1 : BSTAT_RDM2))) 583 return; 584 if (!ch->bch.tx_skb) { 585 if (!test_bit(FLG_TX_EMPTY, &ch->bch.Flags) || 586 (ch->bch.state != ISDN_P_B_RAW)) 587 return; 588 count = ch->mml; 589 /* use the card buffer */ 590 memset(ch->is->buf, ch->bch.fill[0], count); 591 send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA, 592 0, count, ch->is->buf); 593 return; 594 } 595 count = ch->bch.tx_skb->len - ch->bch.tx_idx; 596 if (count <= 0) 597 return; 598 if (count > ch->mml) { 599 msb = 0; 600 count = ch->mml; 601 } else { 602 msb = HDLC_FED; 603 } 604 ptr = ch->bch.tx_skb->data + ch->bch.tx_idx; 605 if (!ch->bch.tx_idx) { 606 pr_debug("%s: frame start\n", ch->is->name); 607 if ((ch->bch.state == ISDN_P_B_T30_FAX) && 608 (ch->cmd == PCTRL_CMD_FTH)) { 609 if (count > 1) { 610 if ((ptr[0] == 0xff) && (ptr[1] == 0x13)) { 611 /* last frame */ 612 test_and_set_bit(FLG_LASTDATA, 613 &ch->bch.Flags); 614 pr_debug("%s: set LASTDATA\n", 615 ch->is->name); 616 if (msb == HDLC_FED) 617 test_and_set_bit(FLG_DLEETX, 618 &ch->bch.Flags); 619 } 620 } 621 } 622 msb |= HDLC_FST; 623 } 624 ch->bch.tx_idx += count; 625 switch (ch->bch.state) { 626 case ISDN_P_NONE: 627 pr_info("%s: wrong protocol 0\n", __func__); 628 break; 629 case ISDN_P_B_RAW: 630 case ISDN_P_B_L2DTMF: 631 case ISDN_P_B_MODEM_ASYNC: 632 send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA, 633 0, count, ptr); 634 break; 635 case ISDN_P_B_HDLC: 636 send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA, 637 msb, count, ptr); 638 break; 639 case ISDN_P_B_T30_FAX: 640 if (ch->state != STFAX_ACTIV) 641 pr_debug("%s: not ACTIV\n", ch->is->name); 642 else if (ch->cmd == PCTRL_CMD_FTH) 643 send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA, 644 msb, count, ptr); 645 else if (ch->cmd == PCTRL_CMD_FTM) 646 send_mbox(ch->is, SET_DPS(ch->dpath) | ISAR_HIS_SDATA, 647 0, count, ptr); 648 else 649 pr_debug("%s: not FTH/FTM\n", ch->is->name); 650 break; 651 default: 652 pr_info("%s: protocol(%x) error\n", 653 __func__, ch->bch.state); 654 break; 655 } 656} 657 658static inline struct isar_ch * 659sel_bch_isar(struct isar_hw *isar, u8 dpath) 660{ 661 struct isar_ch *base = &isar->ch[0]; 662 663 if ((!dpath) || (dpath > 2)) 664 return NULL; 665 if (base->dpath == dpath) 666 return base; 667 base++; 668 if (base->dpath == dpath) 669 return base; 670 return NULL; 671} 672 673static void 674send_next(struct isar_ch *ch) 675{ 676 pr_debug("%s: %s ch%d tx_skb %d tx_idx %d\n", ch->is->name, __func__, 677 ch->bch.nr, ch->bch.tx_skb ? ch->bch.tx_skb->len : -1, 678 ch->bch.tx_idx); 679 if (ch->bch.state == ISDN_P_B_T30_FAX) { 680 if (ch->cmd == PCTRL_CMD_FTH) { 681 if (test_bit(FLG_LASTDATA, &ch->bch.Flags)) { 682 pr_debug("set NMD_DATA\n"); 683 test_and_set_bit(FLG_NMD_DATA, &ch->bch.Flags); 684 } 685 } else if (ch->cmd == PCTRL_CMD_FTM) { 686 if (test_bit(FLG_DLEETX, &ch->bch.Flags)) { 687 test_and_set_bit(FLG_LASTDATA, &ch->bch.Flags); 688 test_and_set_bit(FLG_NMD_DATA, &ch->bch.Flags); 689 } 690 } 691 } 692 dev_kfree_skb(ch->bch.tx_skb); 693 if (get_next_bframe(&ch->bch)) { 694 isar_fill_fifo(ch); 695 test_and_clear_bit(FLG_TX_EMPTY, &ch->bch.Flags); 696 } else if (test_bit(FLG_TX_EMPTY, &ch->bch.Flags)) { 697 isar_fill_fifo(ch); 698 } else { 699 if (test_and_clear_bit(FLG_DLEETX, &ch->bch.Flags)) { 700 if (test_and_clear_bit(FLG_LASTDATA, 701 &ch->bch.Flags)) { 702 if (test_and_clear_bit(FLG_NMD_DATA, 703 &ch->bch.Flags)) { 704 u8 zd = 0; 705 send_mbox(ch->is, SET_DPS(ch->dpath) | 706 ISAR_HIS_SDATA, 0x01, 1, &zd); 707 } 708 test_and_set_bit(FLG_LL_OK, &ch->bch.Flags); 709 } else { 710 deliver_status(ch, HW_MOD_CONNECT); 711 } 712 } else if (test_bit(FLG_FILLEMPTY, &ch->bch.Flags)) { 713 test_and_set_bit(FLG_TX_EMPTY, &ch->bch.Flags); 714 } 715 } 716} 717 718static void 719check_send(struct isar_hw *isar, u8 rdm) 720{ 721 struct isar_ch *ch; 722 723 pr_debug("%s: rdm %x\n", isar->name, rdm); 724 if (rdm & BSTAT_RDM1) { 725 ch = sel_bch_isar(isar, 1); 726 if (ch && test_bit(FLG_ACTIVE, &ch->bch.Flags)) { 727 if (ch->bch.tx_skb && (ch->bch.tx_skb->len > 728 ch->bch.tx_idx)) 729 isar_fill_fifo(ch); 730 else 731 send_next(ch); 732 } 733 } 734 if (rdm & BSTAT_RDM2) { 735 ch = sel_bch_isar(isar, 2); 736 if (ch && test_bit(FLG_ACTIVE, &ch->bch.Flags)) { 737 if (ch->bch.tx_skb && (ch->bch.tx_skb->len > 738 ch->bch.tx_idx)) 739 isar_fill_fifo(ch); 740 else 741 send_next(ch); 742 } 743 } 744} 745 746static const char *dmril[] = {"NO SPEED", "1200/75", "NODEF2", "75/1200", "NODEF4", 747 "300", "600", "1200", "2400", "4800", "7200", 748 "9600nt", "9600t", "12000", "14400", "WRONG"}; 749static const char *dmrim[] = {"NO MOD", "NO DEF", "V32/V32b", "V22", "V21", 750 "Bell103", "V23", "Bell202", "V17", "V29", "V27ter"}; 751 752static void 753isar_pump_status_rsp(struct isar_ch *ch) { 754 u8 ril = ch->is->buf[0]; 755 u8 rim; 756 757 if (!test_and_clear_bit(ISAR_RATE_REQ, &ch->is->Flags)) 758 return; 759 if (ril > 14) { 760 pr_info("%s: wrong pstrsp ril=%d\n", ch->is->name, ril); 761 ril = 15; 762 } 763 switch (ch->is->buf[1]) { 764 case 0: 765 rim = 0; 766 break; 767 case 0x20: 768 rim = 2; 769 break; 770 case 0x40: 771 rim = 3; 772 break; 773 case 0x41: 774 rim = 4; 775 break; 776 case 0x51: 777 rim = 5; 778 break; 779 case 0x61: 780 rim = 6; 781 break; 782 case 0x71: 783 rim = 7; 784 break; 785 case 0x82: 786 rim = 8; 787 break; 788 case 0x92: 789 rim = 9; 790 break; 791 case 0xa2: 792 rim = 10; 793 break; 794 default: 795 rim = 1; 796 break; 797 } 798 sprintf(ch->conmsg, "%s %s", dmril[ril], dmrim[rim]); 799 pr_debug("%s: pump strsp %s\n", ch->is->name, ch->conmsg); 800} 801 802static void 803isar_pump_statev_modem(struct isar_ch *ch, u8 devt) { 804 u8 dps = SET_DPS(ch->dpath); 805 806 switch (devt) { 807 case PSEV_10MS_TIMER: 808 pr_debug("%s: pump stev TIMER\n", ch->is->name); 809 break; 810 case PSEV_CON_ON: 811 pr_debug("%s: pump stev CONNECT\n", ch->is->name); 812 deliver_status(ch, HW_MOD_CONNECT); 813 break; 814 case PSEV_CON_OFF: 815 pr_debug("%s: pump stev NO CONNECT\n", ch->is->name); 816 send_mbox(ch->is, dps | ISAR_HIS_PSTREQ, 0, 0, NULL); 817 deliver_status(ch, HW_MOD_NOCARR); 818 break; 819 case PSEV_V24_OFF: 820 pr_debug("%s: pump stev V24 OFF\n", ch->is->name); 821 break; 822 case PSEV_CTS_ON: 823 pr_debug("%s: pump stev CTS ON\n", ch->is->name); 824 break; 825 case PSEV_CTS_OFF: 826 pr_debug("%s pump stev CTS OFF\n", ch->is->name); 827 break; 828 case PSEV_DCD_ON: 829 pr_debug("%s: pump stev CARRIER ON\n", ch->is->name); 830 test_and_set_bit(ISAR_RATE_REQ, &ch->is->Flags); 831 send_mbox(ch->is, dps | ISAR_HIS_PSTREQ, 0, 0, NULL); 832 break; 833 case PSEV_DCD_OFF: 834 pr_debug("%s: pump stev CARRIER OFF\n", ch->is->name); 835 break; 836 case PSEV_DSR_ON: 837 pr_debug("%s: pump stev DSR ON\n", ch->is->name); 838 break; 839 case PSEV_DSR_OFF: 840 pr_debug("%s: pump stev DSR_OFF\n", ch->is->name); 841 break; 842 case PSEV_REM_RET: 843 pr_debug("%s: pump stev REMOTE RETRAIN\n", ch->is->name); 844 break; 845 case PSEV_REM_REN: 846 pr_debug("%s: pump stev REMOTE RENEGOTIATE\n", ch->is->name); 847 break; 848 case PSEV_GSTN_CLR: 849 pr_debug("%s: pump stev GSTN CLEAR\n", ch->is->name); 850 break; 851 default: 852 pr_info("u%s: unknown pump stev %x\n", ch->is->name, devt); 853 break; 854 } 855} 856 857static void 858isar_pump_statev_fax(struct isar_ch *ch, u8 devt) { 859 u8 dps = SET_DPS(ch->dpath); 860 u8 p1; 861 862 switch (devt) { 863 case PSEV_10MS_TIMER: 864 pr_debug("%s: pump stev TIMER\n", ch->is->name); 865 break; 866 case PSEV_RSP_READY: 867 pr_debug("%s: pump stev RSP_READY\n", ch->is->name); 868 ch->state = STFAX_READY; 869 deliver_status(ch, HW_MOD_READY); 870#ifdef AUTOCON 871 if (test_bit(BC_FLG_ORIG, &ch->bch.Flags)) 872 isar_pump_cmd(bch, HW_MOD_FRH, 3); 873 else 874 isar_pump_cmd(bch, HW_MOD_FTH, 3); 875#endif 876 break; 877 case PSEV_LINE_TX_H: 878 if (ch->state == STFAX_LINE) { 879 pr_debug("%s: pump stev LINE_TX_H\n", ch->is->name); 880 ch->state = STFAX_CONT; 881 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, 882 PCTRL_CMD_CONT, 0, NULL); 883 } else { 884 pr_debug("%s: pump stev LINE_TX_H wrong st %x\n", 885 ch->is->name, ch->state); 886 } 887 break; 888 case PSEV_LINE_RX_H: 889 if (ch->state == STFAX_LINE) { 890 pr_debug("%s: pump stev LINE_RX_H\n", ch->is->name); 891 ch->state = STFAX_CONT; 892 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, 893 PCTRL_CMD_CONT, 0, NULL); 894 } else { 895 pr_debug("%s: pump stev LINE_RX_H wrong st %x\n", 896 ch->is->name, ch->state); 897 } 898 break; 899 case PSEV_LINE_TX_B: 900 if (ch->state == STFAX_LINE) { 901 pr_debug("%s: pump stev LINE_TX_B\n", ch->is->name); 902 ch->state = STFAX_CONT; 903 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, 904 PCTRL_CMD_CONT, 0, NULL); 905 } else { 906 pr_debug("%s: pump stev LINE_TX_B wrong st %x\n", 907 ch->is->name, ch->state); 908 } 909 break; 910 case PSEV_LINE_RX_B: 911 if (ch->state == STFAX_LINE) { 912 pr_debug("%s: pump stev LINE_RX_B\n", ch->is->name); 913 ch->state = STFAX_CONT; 914 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, 915 PCTRL_CMD_CONT, 0, NULL); 916 } else { 917 pr_debug("%s: pump stev LINE_RX_B wrong st %x\n", 918 ch->is->name, ch->state); 919 } 920 break; 921 case PSEV_RSP_CONN: 922 if (ch->state == STFAX_CONT) { 923 pr_debug("%s: pump stev RSP_CONN\n", ch->is->name); 924 ch->state = STFAX_ACTIV; 925 test_and_set_bit(ISAR_RATE_REQ, &ch->is->Flags); 926 send_mbox(ch->is, dps | ISAR_HIS_PSTREQ, 0, 0, NULL); 927 if (ch->cmd == PCTRL_CMD_FTH) { 928 int delay = (ch->mod == 3) ? 1000 : 200; 929 /* 1s (200 ms) Flags before data */ 930 if (test_and_set_bit(FLG_FTI_RUN, 931 &ch->bch.Flags)) 932 del_timer(&ch->ftimer); 933 ch->ftimer.expires = 934 jiffies + ((delay * HZ) / 1000); 935 test_and_set_bit(FLG_LL_CONN, 936 &ch->bch.Flags); 937 add_timer(&ch->ftimer); 938 } else { 939 deliver_status(ch, HW_MOD_CONNECT); 940 } 941 } else { 942 pr_debug("%s: pump stev RSP_CONN wrong st %x\n", 943 ch->is->name, ch->state); 944 } 945 break; 946 case PSEV_FLAGS_DET: 947 pr_debug("%s: pump stev FLAGS_DET\n", ch->is->name); 948 break; 949 case PSEV_RSP_DISC: 950 pr_debug("%s: pump stev RSP_DISC state(%d)\n", 951 ch->is->name, ch->state); 952 if (ch->state == STFAX_ESCAPE) { 953 p1 = 5; 954 switch (ch->newcmd) { 955 case 0: 956 ch->state = STFAX_READY; 957 break; 958 case PCTRL_CMD_FTM: 959 p1 = 2; 960 fallthrough; 961 case PCTRL_CMD_FTH: 962 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, 963 PCTRL_CMD_SILON, 1, &p1); 964 ch->state = STFAX_SILDET; 965 break; 966 case PCTRL_CMD_FRH: 967 case PCTRL_CMD_FRM: 968 ch->mod = ch->newmod; 969 p1 = ch->newmod; 970 ch->newmod = 0; 971 ch->cmd = ch->newcmd; 972 ch->newcmd = 0; 973 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, 974 ch->cmd, 1, &p1); 975 ch->state = STFAX_LINE; 976 ch->try_mod = 3; 977 break; 978 default: 979 pr_debug("%s: RSP_DISC unknown newcmd %x\n", 980 ch->is->name, ch->newcmd); 981 break; 982 } 983 } else if (ch->state == STFAX_ACTIV) { 984 if (test_and_clear_bit(FLG_LL_OK, &ch->bch.Flags)) 985 deliver_status(ch, HW_MOD_OK); 986 else if (ch->cmd == PCTRL_CMD_FRM) 987 deliver_status(ch, HW_MOD_NOCARR); 988 else 989 deliver_status(ch, HW_MOD_FCERROR); 990 ch->state = STFAX_READY; 991 } else if (ch->state != STFAX_SILDET) { 992 /* ignore in STFAX_SILDET */ 993 ch->state = STFAX_READY; 994 deliver_status(ch, HW_MOD_FCERROR); 995 } 996 break; 997 case PSEV_RSP_SILDET: 998 pr_debug("%s: pump stev RSP_SILDET\n", ch->is->name); 999 if (ch->state == STFAX_SILDET) { 1000 ch->mod = ch->newmod; 1001 p1 = ch->newmod; 1002 ch->newmod = 0; 1003 ch->cmd = ch->newcmd; 1004 ch->newcmd = 0; 1005 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, 1006 ch->cmd, 1, &p1); 1007 ch->state = STFAX_LINE; 1008 ch->try_mod = 3; 1009 } 1010 break; 1011 case PSEV_RSP_SILOFF: 1012 pr_debug("%s: pump stev RSP_SILOFF\n", ch->is->name); 1013 break; 1014 case PSEV_RSP_FCERR: 1015 if (ch->state == STFAX_LINE) { 1016 pr_debug("%s: pump stev RSP_FCERR try %d\n", 1017 ch->is->name, ch->try_mod); 1018 if (ch->try_mod--) { 1019 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, 1020 ch->cmd, 1, &ch->mod); 1021 break; 1022 } 1023 } 1024 pr_debug("%s: pump stev RSP_FCERR\n", ch->is->name); 1025 ch->state = STFAX_ESCAPE; 1026 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, PCTRL_CMD_ESC, 1027 0, NULL); 1028 deliver_status(ch, HW_MOD_FCERROR); 1029 break; 1030 default: 1031 break; 1032 } 1033} 1034 1035void 1036mISDNisar_irq(struct isar_hw *isar) 1037{ 1038 struct isar_ch *ch; 1039 1040 get_irq_infos(isar); 1041 switch (isar->iis & ISAR_IIS_MSCMSD) { 1042 case ISAR_IIS_RDATA: 1043 ch = sel_bch_isar(isar, isar->iis >> 6); 1044 if (ch) 1045 isar_rcv_frame(ch); 1046 else { 1047 pr_debug("%s: ISAR spurious IIS_RDATA %x/%x/%x\n", 1048 isar->name, isar->iis, isar->cmsb, 1049 isar->clsb); 1050 isar->write_reg(isar->hw, ISAR_IIA, 0); 1051 } 1052 break; 1053 case ISAR_IIS_GSTEV: 1054 isar->write_reg(isar->hw, ISAR_IIA, 0); 1055 isar->bstat |= isar->cmsb; 1056 check_send(isar, isar->cmsb); 1057 break; 1058 case ISAR_IIS_BSTEV: 1059#ifdef ERROR_STATISTIC 1060 ch = sel_bch_isar(isar, isar->iis >> 6); 1061 if (ch) { 1062 if (isar->cmsb == BSTEV_TBO) 1063 ch->bch.err_tx++; 1064 if (isar->cmsb == BSTEV_RBO) 1065 ch->bch.err_rdo++; 1066 } 1067#endif 1068 pr_debug("%s: Buffer STEV dpath%d msb(%x)\n", 1069 isar->name, isar->iis >> 6, isar->cmsb); 1070 isar->write_reg(isar->hw, ISAR_IIA, 0); 1071 break; 1072 case ISAR_IIS_PSTEV: 1073 ch = sel_bch_isar(isar, isar->iis >> 6); 1074 if (ch) { 1075 rcv_mbox(isar, NULL); 1076 if (ch->bch.state == ISDN_P_B_MODEM_ASYNC) 1077 isar_pump_statev_modem(ch, isar->cmsb); 1078 else if (ch->bch.state == ISDN_P_B_T30_FAX) 1079 isar_pump_statev_fax(ch, isar->cmsb); 1080 else if (ch->bch.state == ISDN_P_B_RAW) { 1081 int tt; 1082 tt = isar->cmsb | 0x30; 1083 if (tt == 0x3e) 1084 tt = '*'; 1085 else if (tt == 0x3f) 1086 tt = '#'; 1087 else if (tt > '9') 1088 tt += 7; 1089 tt |= DTMF_TONE_VAL; 1090 _queue_data(&ch->bch.ch, PH_CONTROL_IND, 1091 MISDN_ID_ANY, sizeof(tt), &tt, 1092 GFP_ATOMIC); 1093 } else 1094 pr_debug("%s: ISAR IIS_PSTEV pm %d sta %x\n", 1095 isar->name, ch->bch.state, 1096 isar->cmsb); 1097 } else { 1098 pr_debug("%s: ISAR spurious IIS_PSTEV %x/%x/%x\n", 1099 isar->name, isar->iis, isar->cmsb, 1100 isar->clsb); 1101 isar->write_reg(isar->hw, ISAR_IIA, 0); 1102 } 1103 break; 1104 case ISAR_IIS_PSTRSP: 1105 ch = sel_bch_isar(isar, isar->iis >> 6); 1106 if (ch) { 1107 rcv_mbox(isar, NULL); 1108 isar_pump_status_rsp(ch); 1109 } else { 1110 pr_debug("%s: ISAR spurious IIS_PSTRSP %x/%x/%x\n", 1111 isar->name, isar->iis, isar->cmsb, 1112 isar->clsb); 1113 isar->write_reg(isar->hw, ISAR_IIA, 0); 1114 } 1115 break; 1116 case ISAR_IIS_DIAG: 1117 case ISAR_IIS_BSTRSP: 1118 case ISAR_IIS_IOM2RSP: 1119 rcv_mbox(isar, NULL); 1120 break; 1121 case ISAR_IIS_INVMSG: 1122 rcv_mbox(isar, NULL); 1123 pr_debug("%s: invalid msg his:%x\n", isar->name, isar->cmsb); 1124 break; 1125 default: 1126 rcv_mbox(isar, NULL); 1127 pr_debug("%s: unhandled msg iis(%x) ctrl(%x/%x)\n", 1128 isar->name, isar->iis, isar->cmsb, isar->clsb); 1129 break; 1130 } 1131} 1132EXPORT_SYMBOL(mISDNisar_irq); 1133 1134static void 1135ftimer_handler(struct timer_list *t) 1136{ 1137 struct isar_ch *ch = from_timer(ch, t, ftimer); 1138 1139 pr_debug("%s: ftimer flags %lx\n", ch->is->name, ch->bch.Flags); 1140 test_and_clear_bit(FLG_FTI_RUN, &ch->bch.Flags); 1141 if (test_and_clear_bit(FLG_LL_CONN, &ch->bch.Flags)) 1142 deliver_status(ch, HW_MOD_CONNECT); 1143} 1144 1145static void 1146setup_pump(struct isar_ch *ch) { 1147 u8 dps = SET_DPS(ch->dpath); 1148 u8 ctrl, param[6]; 1149 1150 switch (ch->bch.state) { 1151 case ISDN_P_NONE: 1152 case ISDN_P_B_RAW: 1153 case ISDN_P_B_HDLC: 1154 send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG, PMOD_BYPASS, 0, NULL); 1155 break; 1156 case ISDN_P_B_L2DTMF: 1157 if (test_bit(FLG_DTMFSEND, &ch->bch.Flags)) { 1158 param[0] = 5; /* TOA 5 db */ 1159 send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG, 1160 PMOD_DTMF_TRANS, 1, param); 1161 } else { 1162 param[0] = 40; /* REL -46 dbm */ 1163 send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG, 1164 PMOD_DTMF, 1, param); 1165 } 1166 fallthrough; 1167 case ISDN_P_B_MODEM_ASYNC: 1168 ctrl = PMOD_DATAMODEM; 1169 if (test_bit(FLG_ORIGIN, &ch->bch.Flags)) { 1170 ctrl |= PCTRL_ORIG; 1171 param[5] = PV32P6_CTN; 1172 } else { 1173 param[5] = PV32P6_ATN; 1174 } 1175 param[0] = 6; /* 6 db */ 1176 param[1] = PV32P2_V23R | PV32P2_V22A | PV32P2_V22B | 1177 PV32P2_V22C | PV32P2_V21 | PV32P2_BEL; 1178 param[2] = PV32P3_AMOD | PV32P3_V32B | PV32P3_V23B; 1179 param[3] = PV32P4_UT144; 1180 param[4] = PV32P5_UT144; 1181 send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG, ctrl, 6, param); 1182 break; 1183 case ISDN_P_B_T30_FAX: 1184 ctrl = PMOD_FAX; 1185 if (test_bit(FLG_ORIGIN, &ch->bch.Flags)) { 1186 ctrl |= PCTRL_ORIG; 1187 param[1] = PFAXP2_CTN; 1188 } else { 1189 param[1] = PFAXP2_ATN; 1190 } 1191 param[0] = 6; /* 6 db */ 1192 send_mbox(ch->is, dps | ISAR_HIS_PUMPCFG, ctrl, 2, param); 1193 ch->state = STFAX_NULL; 1194 ch->newcmd = 0; 1195 ch->newmod = 0; 1196 test_and_set_bit(FLG_FTI_RUN, &ch->bch.Flags); 1197 break; 1198 } 1199 udelay(1000); 1200 send_mbox(ch->is, dps | ISAR_HIS_PSTREQ, 0, 0, NULL); 1201 udelay(1000); 1202} 1203 1204static void 1205setup_sart(struct isar_ch *ch) { 1206 u8 dps = SET_DPS(ch->dpath); 1207 u8 ctrl, param[2] = {0, 0}; 1208 1209 switch (ch->bch.state) { 1210 case ISDN_P_NONE: 1211 send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, SMODE_DISABLE, 1212 0, NULL); 1213 break; 1214 case ISDN_P_B_RAW: 1215 case ISDN_P_B_L2DTMF: 1216 send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, SMODE_BINARY, 1217 2, param); 1218 break; 1219 case ISDN_P_B_HDLC: 1220 case ISDN_P_B_T30_FAX: 1221 send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, SMODE_HDLC, 1222 1, param); 1223 break; 1224 case ISDN_P_B_MODEM_ASYNC: 1225 ctrl = SMODE_V14 | SCTRL_HDMC_BOTH; 1226 param[0] = S_P1_CHS_8; 1227 param[1] = S_P2_BFT_DEF; 1228 send_mbox(ch->is, dps | ISAR_HIS_SARTCFG, ctrl, 2, param); 1229 break; 1230 } 1231 udelay(1000); 1232 send_mbox(ch->is, dps | ISAR_HIS_BSTREQ, 0, 0, NULL); 1233 udelay(1000); 1234} 1235 1236static void 1237setup_iom2(struct isar_ch *ch) { 1238 u8 dps = SET_DPS(ch->dpath); 1239 u8 cmsb = IOM_CTRL_ENA, msg[5] = {IOM_P1_TXD, 0, 0, 0, 0}; 1240 1241 if (ch->bch.nr == 2) { 1242 msg[1] = 1; 1243 msg[3] = 1; 1244 } 1245 switch (ch->bch.state) { 1246 case ISDN_P_NONE: 1247 cmsb = 0; 1248 /* dummy slot */ 1249 msg[1] = ch->dpath + 2; 1250 msg[3] = ch->dpath + 2; 1251 break; 1252 case ISDN_P_B_RAW: 1253 case ISDN_P_B_HDLC: 1254 break; 1255 case ISDN_P_B_MODEM_ASYNC: 1256 case ISDN_P_B_T30_FAX: 1257 cmsb |= IOM_CTRL_RCV; 1258 fallthrough; 1259 case ISDN_P_B_L2DTMF: 1260 if (test_bit(FLG_DTMFSEND, &ch->bch.Flags)) 1261 cmsb |= IOM_CTRL_RCV; 1262 cmsb |= IOM_CTRL_ALAW; 1263 break; 1264 } 1265 send_mbox(ch->is, dps | ISAR_HIS_IOM2CFG, cmsb, 5, msg); 1266 udelay(1000); 1267 send_mbox(ch->is, dps | ISAR_HIS_IOM2REQ, 0, 0, NULL); 1268 udelay(1000); 1269} 1270 1271static int 1272modeisar(struct isar_ch *ch, u32 bprotocol) 1273{ 1274 /* Here we are selecting the best datapath for requested protocol */ 1275 if (ch->bch.state == ISDN_P_NONE) { /* New Setup */ 1276 switch (bprotocol) { 1277 case ISDN_P_NONE: /* init */ 1278 if (!ch->dpath) 1279 /* no init for dpath 0 */ 1280 return 0; 1281 test_and_clear_bit(FLG_HDLC, &ch->bch.Flags); 1282 test_and_clear_bit(FLG_TRANSPARENT, &ch->bch.Flags); 1283 break; 1284 case ISDN_P_B_RAW: 1285 case ISDN_P_B_HDLC: 1286 /* best is datapath 2 */ 1287 if (!test_and_set_bit(ISAR_DP2_USE, &ch->is->Flags)) 1288 ch->dpath = 2; 1289 else if (!test_and_set_bit(ISAR_DP1_USE, 1290 &ch->is->Flags)) 1291 ch->dpath = 1; 1292 else { 1293 pr_info("modeisar both paths in use\n"); 1294 return -EBUSY; 1295 } 1296 if (bprotocol == ISDN_P_B_HDLC) 1297 test_and_set_bit(FLG_HDLC, &ch->bch.Flags); 1298 else 1299 test_and_set_bit(FLG_TRANSPARENT, 1300 &ch->bch.Flags); 1301 break; 1302 case ISDN_P_B_MODEM_ASYNC: 1303 case ISDN_P_B_T30_FAX: 1304 case ISDN_P_B_L2DTMF: 1305 /* only datapath 1 */ 1306 if (!test_and_set_bit(ISAR_DP1_USE, &ch->is->Flags)) 1307 ch->dpath = 1; 1308 else { 1309 pr_info("%s: ISAR modeisar analog functions" 1310 "only with DP1\n", ch->is->name); 1311 return -EBUSY; 1312 } 1313 break; 1314 default: 1315 pr_info("%s: protocol not known %x\n", ch->is->name, 1316 bprotocol); 1317 return -ENOPROTOOPT; 1318 } 1319 } 1320 pr_debug("%s: ISAR ch%d dp%d protocol %x->%x\n", ch->is->name, 1321 ch->bch.nr, ch->dpath, ch->bch.state, bprotocol); 1322 ch->bch.state = bprotocol; 1323 setup_pump(ch); 1324 setup_iom2(ch); 1325 setup_sart(ch); 1326 if (ch->bch.state == ISDN_P_NONE) { 1327 /* Clear resources */ 1328 if (ch->dpath == 1) 1329 test_and_clear_bit(ISAR_DP1_USE, &ch->is->Flags); 1330 else if (ch->dpath == 2) 1331 test_and_clear_bit(ISAR_DP2_USE, &ch->is->Flags); 1332 ch->dpath = 0; 1333 ch->is->ctrl(ch->is->hw, HW_DEACT_IND, ch->bch.nr); 1334 } else 1335 ch->is->ctrl(ch->is->hw, HW_ACTIVATE_IND, ch->bch.nr); 1336 return 0; 1337} 1338 1339static void 1340isar_pump_cmd(struct isar_ch *ch, u32 cmd, u8 para) 1341{ 1342 u8 dps = SET_DPS(ch->dpath); 1343 u8 ctrl = 0, nom = 0, p1 = 0; 1344 1345 pr_debug("%s: isar_pump_cmd %x/%x state(%x)\n", 1346 ch->is->name, cmd, para, ch->bch.state); 1347 switch (cmd) { 1348 case HW_MOD_FTM: 1349 if (ch->state == STFAX_READY) { 1350 p1 = para; 1351 ctrl = PCTRL_CMD_FTM; 1352 nom = 1; 1353 ch->state = STFAX_LINE; 1354 ch->cmd = ctrl; 1355 ch->mod = para; 1356 ch->newmod = 0; 1357 ch->newcmd = 0; 1358 ch->try_mod = 3; 1359 } else if ((ch->state == STFAX_ACTIV) && 1360 (ch->cmd == PCTRL_CMD_FTM) && (ch->mod == para)) 1361 deliver_status(ch, HW_MOD_CONNECT); 1362 else { 1363 ch->newmod = para; 1364 ch->newcmd = PCTRL_CMD_FTM; 1365 nom = 0; 1366 ctrl = PCTRL_CMD_ESC; 1367 ch->state = STFAX_ESCAPE; 1368 } 1369 break; 1370 case HW_MOD_FTH: 1371 if (ch->state == STFAX_READY) { 1372 p1 = para; 1373 ctrl = PCTRL_CMD_FTH; 1374 nom = 1; 1375 ch->state = STFAX_LINE; 1376 ch->cmd = ctrl; 1377 ch->mod = para; 1378 ch->newmod = 0; 1379 ch->newcmd = 0; 1380 ch->try_mod = 3; 1381 } else if ((ch->state == STFAX_ACTIV) && 1382 (ch->cmd == PCTRL_CMD_FTH) && (ch->mod == para)) 1383 deliver_status(ch, HW_MOD_CONNECT); 1384 else { 1385 ch->newmod = para; 1386 ch->newcmd = PCTRL_CMD_FTH; 1387 nom = 0; 1388 ctrl = PCTRL_CMD_ESC; 1389 ch->state = STFAX_ESCAPE; 1390 } 1391 break; 1392 case HW_MOD_FRM: 1393 if (ch->state == STFAX_READY) { 1394 p1 = para; 1395 ctrl = PCTRL_CMD_FRM; 1396 nom = 1; 1397 ch->state = STFAX_LINE; 1398 ch->cmd = ctrl; 1399 ch->mod = para; 1400 ch->newmod = 0; 1401 ch->newcmd = 0; 1402 ch->try_mod = 3; 1403 } else if ((ch->state == STFAX_ACTIV) && 1404 (ch->cmd == PCTRL_CMD_FRM) && (ch->mod == para)) 1405 deliver_status(ch, HW_MOD_CONNECT); 1406 else { 1407 ch->newmod = para; 1408 ch->newcmd = PCTRL_CMD_FRM; 1409 nom = 0; 1410 ctrl = PCTRL_CMD_ESC; 1411 ch->state = STFAX_ESCAPE; 1412 } 1413 break; 1414 case HW_MOD_FRH: 1415 if (ch->state == STFAX_READY) { 1416 p1 = para; 1417 ctrl = PCTRL_CMD_FRH; 1418 nom = 1; 1419 ch->state = STFAX_LINE; 1420 ch->cmd = ctrl; 1421 ch->mod = para; 1422 ch->newmod = 0; 1423 ch->newcmd = 0; 1424 ch->try_mod = 3; 1425 } else if ((ch->state == STFAX_ACTIV) && 1426 (ch->cmd == PCTRL_CMD_FRH) && (ch->mod == para)) 1427 deliver_status(ch, HW_MOD_CONNECT); 1428 else { 1429 ch->newmod = para; 1430 ch->newcmd = PCTRL_CMD_FRH; 1431 nom = 0; 1432 ctrl = PCTRL_CMD_ESC; 1433 ch->state = STFAX_ESCAPE; 1434 } 1435 break; 1436 case PCTRL_CMD_TDTMF: 1437 p1 = para; 1438 nom = 1; 1439 ctrl = PCTRL_CMD_TDTMF; 1440 break; 1441 } 1442 if (ctrl) 1443 send_mbox(ch->is, dps | ISAR_HIS_PUMPCTRL, ctrl, nom, &p1); 1444} 1445 1446static void 1447isar_setup(struct isar_hw *isar) 1448{ 1449 u8 msg; 1450 int i; 1451 1452 /* Dpath 1, 2 */ 1453 msg = 61; 1454 for (i = 0; i < 2; i++) { 1455 /* Buffer Config */ 1456 send_mbox(isar, (i ? ISAR_HIS_DPS2 : ISAR_HIS_DPS1) | 1457 ISAR_HIS_P12CFG, 4, 1, &msg); 1458 isar->ch[i].mml = msg; 1459 isar->ch[i].bch.state = 0; 1460 isar->ch[i].dpath = i + 1; 1461 modeisar(&isar->ch[i], ISDN_P_NONE); 1462 } 1463} 1464 1465static int 1466isar_l2l1(struct mISDNchannel *ch, struct sk_buff *skb) 1467{ 1468 struct bchannel *bch = container_of(ch, struct bchannel, ch); 1469 struct isar_ch *ich = container_of(bch, struct isar_ch, bch); 1470 int ret = -EINVAL; 1471 struct mISDNhead *hh = mISDN_HEAD_P(skb); 1472 u32 id, *val; 1473 u_long flags; 1474 1475 switch (hh->prim) { 1476 case PH_DATA_REQ: 1477 spin_lock_irqsave(ich->is->hwlock, flags); 1478 ret = bchannel_senddata(bch, skb); 1479 if (ret > 0) { /* direct TX */ 1480 ret = 0; 1481 isar_fill_fifo(ich); 1482 } 1483 spin_unlock_irqrestore(ich->is->hwlock, flags); 1484 return ret; 1485 case PH_ACTIVATE_REQ: 1486 spin_lock_irqsave(ich->is->hwlock, flags); 1487 if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags)) 1488 ret = modeisar(ich, ch->protocol); 1489 else 1490 ret = 0; 1491 spin_unlock_irqrestore(ich->is->hwlock, flags); 1492 if (!ret) 1493 _queue_data(ch, PH_ACTIVATE_IND, MISDN_ID_ANY, 0, 1494 NULL, GFP_KERNEL); 1495 break; 1496 case PH_DEACTIVATE_REQ: 1497 spin_lock_irqsave(ich->is->hwlock, flags); 1498 mISDN_clear_bchannel(bch); 1499 modeisar(ich, ISDN_P_NONE); 1500 spin_unlock_irqrestore(ich->is->hwlock, flags); 1501 _queue_data(ch, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0, 1502 NULL, GFP_KERNEL); 1503 ret = 0; 1504 break; 1505 case PH_CONTROL_REQ: 1506 val = (u32 *)skb->data; 1507 pr_debug("%s: PH_CONTROL | REQUEST %x/%x\n", ich->is->name, 1508 hh->id, *val); 1509 if ((hh->id == 0) && ((*val & ~DTMF_TONE_MASK) == 1510 DTMF_TONE_VAL)) { 1511 if (bch->state == ISDN_P_B_L2DTMF) { 1512 char tt = *val & DTMF_TONE_MASK; 1513 1514 if (tt == '*') 1515 tt = 0x1e; 1516 else if (tt == '#') 1517 tt = 0x1f; 1518 else if (tt > '9') 1519 tt -= 7; 1520 tt &= 0x1f; 1521 spin_lock_irqsave(ich->is->hwlock, flags); 1522 isar_pump_cmd(ich, PCTRL_CMD_TDTMF, tt); 1523 spin_unlock_irqrestore(ich->is->hwlock, flags); 1524 } else { 1525 pr_info("%s: DTMF send wrong protocol %x\n", 1526 __func__, bch->state); 1527 return -EINVAL; 1528 } 1529 } else if ((hh->id == HW_MOD_FRM) || (hh->id == HW_MOD_FRH) || 1530 (hh->id == HW_MOD_FTM) || (hh->id == HW_MOD_FTH)) { 1531 for (id = 0; id < FAXMODCNT; id++) 1532 if (faxmodulation[id] == *val) 1533 break; 1534 if ((FAXMODCNT > id) && 1535 test_bit(FLG_INITIALIZED, &bch->Flags)) { 1536 pr_debug("%s: isar: new mod\n", ich->is->name); 1537 isar_pump_cmd(ich, hh->id, *val); 1538 ret = 0; 1539 } else { 1540 pr_info("%s: wrong modulation\n", 1541 ich->is->name); 1542 ret = -EINVAL; 1543 } 1544 } else if (hh->id == HW_MOD_LASTDATA) 1545 test_and_set_bit(FLG_DLEETX, &bch->Flags); 1546 else { 1547 pr_info("%s: unknown PH_CONTROL_REQ %x\n", 1548 ich->is->name, hh->id); 1549 ret = -EINVAL; 1550 } 1551 fallthrough; 1552 default: 1553 pr_info("%s: %s unknown prim(%x,%x)\n", 1554 ich->is->name, __func__, hh->prim, hh->id); 1555 ret = -EINVAL; 1556 } 1557 if (!ret) 1558 dev_kfree_skb(skb); 1559 return ret; 1560} 1561 1562static int 1563channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq) 1564{ 1565 return mISDN_ctrl_bchannel(bch, cq); 1566} 1567 1568static int 1569isar_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) 1570{ 1571 struct bchannel *bch = container_of(ch, struct bchannel, ch); 1572 struct isar_ch *ich = container_of(bch, struct isar_ch, bch); 1573 int ret = -EINVAL; 1574 u_long flags; 1575 1576 pr_debug("%s: %s cmd:%x %p\n", ich->is->name, __func__, cmd, arg); 1577 switch (cmd) { 1578 case CLOSE_CHANNEL: 1579 test_and_clear_bit(FLG_OPEN, &bch->Flags); 1580 cancel_work_sync(&bch->workq); 1581 spin_lock_irqsave(ich->is->hwlock, flags); 1582 mISDN_clear_bchannel(bch); 1583 modeisar(ich, ISDN_P_NONE); 1584 spin_unlock_irqrestore(ich->is->hwlock, flags); 1585 ch->protocol = ISDN_P_NONE; 1586 ch->peer = NULL; 1587 module_put(ich->is->owner); 1588 ret = 0; 1589 break; 1590 case CONTROL_CHANNEL: 1591 ret = channel_bctrl(bch, arg); 1592 break; 1593 default: 1594 pr_info("%s: %s unknown prim(%x)\n", 1595 ich->is->name, __func__, cmd); 1596 } 1597 return ret; 1598} 1599 1600static void 1601free_isar(struct isar_hw *isar) 1602{ 1603 modeisar(&isar->ch[0], ISDN_P_NONE); 1604 modeisar(&isar->ch[1], ISDN_P_NONE); 1605 del_timer(&isar->ch[0].ftimer); 1606 del_timer(&isar->ch[1].ftimer); 1607 test_and_clear_bit(FLG_INITIALIZED, &isar->ch[0].bch.Flags); 1608 test_and_clear_bit(FLG_INITIALIZED, &isar->ch[1].bch.Flags); 1609} 1610 1611static int 1612init_isar(struct isar_hw *isar) 1613{ 1614 int cnt = 3; 1615 1616 while (cnt--) { 1617 isar->version = ISARVersion(isar); 1618 if (isar->ch[0].bch.debug & DEBUG_HW) 1619 pr_notice("%s: Testing version %d (%d time)\n", 1620 isar->name, isar->version, 3 - cnt); 1621 if (isar->version == 1) 1622 break; 1623 isar->ctrl(isar->hw, HW_RESET_REQ, 0); 1624 } 1625 if (isar->version != 1) 1626 return -EINVAL; 1627 timer_setup(&isar->ch[0].ftimer, ftimer_handler, 0); 1628 test_and_set_bit(FLG_INITIALIZED, &isar->ch[0].bch.Flags); 1629 timer_setup(&isar->ch[1].ftimer, ftimer_handler, 0); 1630 test_and_set_bit(FLG_INITIALIZED, &isar->ch[1].bch.Flags); 1631 return 0; 1632} 1633 1634static int 1635isar_open(struct isar_hw *isar, struct channel_req *rq) 1636{ 1637 struct bchannel *bch; 1638 1639 if (rq->adr.channel == 0 || rq->adr.channel > 2) 1640 return -EINVAL; 1641 if (rq->protocol == ISDN_P_NONE) 1642 return -EINVAL; 1643 bch = &isar->ch[rq->adr.channel - 1].bch; 1644 if (test_and_set_bit(FLG_OPEN, &bch->Flags)) 1645 return -EBUSY; /* b-channel can be only open once */ 1646 bch->ch.protocol = rq->protocol; 1647 rq->ch = &bch->ch; 1648 return 0; 1649} 1650 1651u32 1652mISDNisar_init(struct isar_hw *isar, void *hw) 1653{ 1654 u32 ret, i; 1655 1656 isar->hw = hw; 1657 for (i = 0; i < 2; i++) { 1658 isar->ch[i].bch.nr = i + 1; 1659 mISDN_initbchannel(&isar->ch[i].bch, MAX_DATA_MEM, 32); 1660 isar->ch[i].bch.ch.nr = i + 1; 1661 isar->ch[i].bch.ch.send = &isar_l2l1; 1662 isar->ch[i].bch.ch.ctrl = isar_bctrl; 1663 isar->ch[i].bch.hw = hw; 1664 isar->ch[i].is = isar; 1665 } 1666 1667 isar->init = &init_isar; 1668 isar->release = &free_isar; 1669 isar->firmware = &load_firmware; 1670 isar->open = &isar_open; 1671 1672 ret = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) | 1673 (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK)) | 1674 (1 << (ISDN_P_B_L2DTMF & ISDN_P_B_MASK)) | 1675 (1 << (ISDN_P_B_MODEM_ASYNC & ISDN_P_B_MASK)) | 1676 (1 << (ISDN_P_B_T30_FAX & ISDN_P_B_MASK)); 1677 1678 return ret; 1679} 1680EXPORT_SYMBOL(mISDNisar_init); 1681 1682static int __init isar_mod_init(void) 1683{ 1684 pr_notice("mISDN: ISAR driver Rev. %s\n", ISAR_REV); 1685 return 0; 1686} 1687 1688static void __exit isar_mod_cleanup(void) 1689{ 1690 pr_notice("mISDN: ISAR module unloaded\n"); 1691} 1692module_init(isar_mod_init); 1693module_exit(isar_mod_cleanup);