1/* 2 * PCBIT-D interface with isdn4linux 3 * 4 * Copyright (C) 1996 Universidade de Lisboa 5 * 6 * Written by Pedro Roque Marques (roque@di.fc.ul.pt) 7 * 8 * This software may be used and distributed according to the terms of 9 * the GNU General Public License, incorporated herein by reference. 10 */ 11 12/* 13 * Fixes: 14 * 15 * Nuno Grilo <l38486@alfa.ist.utl.pt> 16 * fixed msn_list NULL pointer dereference. 17 * 18 */ 19 20#include <linux/module.h> 21 22 23#include <linux/kernel.h> 24 25#include <linux/types.h> 26#include <linux/sched.h> 27#include <linux/slab.h> 28#include <linux/mm.h> 29#include <linux/interrupt.h> 30#include <linux/string.h> 31#include <linux/skbuff.h> 32 33#include <linux/isdnif.h> 34#include <asm/string.h> 35#include <asm/io.h> 36#include <linux/ioport.h> 37 38#include "pcbit.h" 39#include "edss1.h" 40#include "layer2.h" 41#include "capi.h" 42 43 44extern ushort last_ref_num; 45 46static int pcbit_ioctl(isdn_ctrl *ctl); 47 48static char *pcbit_devname[MAX_PCBIT_CARDS] = { 49 "pcbit0", 50 "pcbit1", 51 "pcbit2", 52 "pcbit3" 53}; 54 55/* 56 * prototypes 57 */ 58 59static int pcbit_command(isdn_ctrl *ctl); 60static int pcbit_stat(u_char __user *buf, int len, int, int); 61static int pcbit_xmit(int driver, int chan, int ack, struct sk_buff *skb); 62static int pcbit_writecmd(const u_char __user *, int, int, int); 63 64static int set_protocol_running(struct pcbit_dev *dev); 65 66static void pcbit_clear_msn(struct pcbit_dev *dev); 67static void pcbit_set_msn(struct pcbit_dev *dev, char *list); 68static int pcbit_check_msn(struct pcbit_dev *dev, char *msn); 69 70 71int pcbit_init_dev(int board, int mem_base, int irq) 72{ 73 struct pcbit_dev *dev; 74 isdn_if *dev_if; 75 76 if ((dev = kzalloc(sizeof(struct pcbit_dev), GFP_KERNEL)) == NULL) 77 { 78 printk("pcbit_init: couldn't malloc pcbit_dev struct\n"); 79 return -ENOMEM; 80 } 81 82 dev_pcbit[board] = dev; 83 init_waitqueue_head(&dev->set_running_wq); 84 spin_lock_init(&dev->lock); 85 86 if (mem_base >= 0xA0000 && mem_base <= 0xFFFFF) { 87 dev->ph_mem = mem_base; 88 if (!request_mem_region(dev->ph_mem, 4096, "PCBIT mem")) { 89 printk(KERN_WARNING 90 "PCBIT: memory region %lx-%lx already in use\n", 91 dev->ph_mem, dev->ph_mem + 4096); 92 kfree(dev); 93 dev_pcbit[board] = NULL; 94 return -EACCES; 95 } 96 dev->sh_mem = ioremap(dev->ph_mem, 4096); 97 } 98 else 99 { 100 printk("memory address invalid"); 101 kfree(dev); 102 dev_pcbit[board] = NULL; 103 return -EACCES; 104 } 105 106 dev->b1 = kzalloc(sizeof(struct pcbit_chan), GFP_KERNEL); 107 if (!dev->b1) { 108 printk("pcbit_init: couldn't malloc pcbit_chan struct\n"); 109 iounmap(dev->sh_mem); 110 release_mem_region(dev->ph_mem, 4096); 111 kfree(dev); 112 return -ENOMEM; 113 } 114 115 dev->b2 = kzalloc(sizeof(struct pcbit_chan), GFP_KERNEL); 116 if (!dev->b2) { 117 printk("pcbit_init: couldn't malloc pcbit_chan struct\n"); 118 kfree(dev->b1); 119 iounmap(dev->sh_mem); 120 release_mem_region(dev->ph_mem, 4096); 121 kfree(dev); 122 return -ENOMEM; 123 } 124 125 dev->b2->id = 1; 126 127 INIT_WORK(&dev->qdelivery, pcbit_deliver); 128 129 /* 130 * interrupts 131 */ 132 133 if (request_irq(irq, &pcbit_irq_handler, 0, pcbit_devname[board], dev) != 0) 134 { 135 kfree(dev->b1); 136 kfree(dev->b2); 137 iounmap(dev->sh_mem); 138 release_mem_region(dev->ph_mem, 4096); 139 kfree(dev); 140 dev_pcbit[board] = NULL; 141 return -EIO; 142 } 143 144 dev->irq = irq; 145 146 /* next frame to be received */ 147 dev->rcv_seq = 0; 148 dev->send_seq = 0; 149 dev->unack_seq = 0; 150 151 dev->hl_hdrlen = 16; 152 153 dev_if = kmalloc(sizeof(isdn_if), GFP_KERNEL); 154 155 if (!dev_if) { 156 free_irq(irq, dev); 157 kfree(dev->b1); 158 kfree(dev->b2); 159 iounmap(dev->sh_mem); 160 release_mem_region(dev->ph_mem, 4096); 161 kfree(dev); 162 dev_pcbit[board] = NULL; 163 return -EIO; 164 } 165 166 dev->dev_if = dev_if; 167 168 dev_if->owner = THIS_MODULE; 169 170 dev_if->channels = 2; 171 172 dev_if->features = (ISDN_FEATURE_P_EURO | ISDN_FEATURE_L3_TRANS | 173 ISDN_FEATURE_L2_HDLC | ISDN_FEATURE_L2_TRANS); 174 175 dev_if->writebuf_skb = pcbit_xmit; 176 dev_if->hl_hdrlen = 16; 177 178 dev_if->maxbufsize = MAXBUFSIZE; 179 dev_if->command = pcbit_command; 180 181 dev_if->writecmd = pcbit_writecmd; 182 dev_if->readstat = pcbit_stat; 183 184 185 strcpy(dev_if->id, pcbit_devname[board]); 186 187 if (!register_isdn(dev_if)) { 188 free_irq(irq, dev); 189 kfree(dev->b1); 190 kfree(dev->b2); 191 iounmap(dev->sh_mem); 192 release_mem_region(dev->ph_mem, 4096); 193 kfree(dev); 194 dev_pcbit[board] = NULL; 195 return -EIO; 196 } 197 198 dev->id = dev_if->channels; 199 200 201 dev->l2_state = L2_DOWN; 202 dev->free = 511; 203 204 /* 205 * set_protocol_running(dev); 206 */ 207 208 return 0; 209} 210 211#ifdef MODULE 212void pcbit_terminate(int board) 213{ 214 struct pcbit_dev *dev; 215 216 dev = dev_pcbit[board]; 217 218 if (dev) { 219 /* unregister_isdn(dev->dev_if); */ 220 free_irq(dev->irq, dev); 221 pcbit_clear_msn(dev); 222 kfree(dev->dev_if); 223 if (dev->b1->fsm_timer.function) 224 del_timer(&dev->b1->fsm_timer); 225 if (dev->b2->fsm_timer.function) 226 del_timer(&dev->b2->fsm_timer); 227 kfree(dev->b1); 228 kfree(dev->b2); 229 iounmap(dev->sh_mem); 230 release_mem_region(dev->ph_mem, 4096); 231 kfree(dev); 232 } 233} 234#endif 235 236static int pcbit_command(isdn_ctrl *ctl) 237{ 238 struct pcbit_dev *dev; 239 struct pcbit_chan *chan; 240 struct callb_data info; 241 242 dev = finddev(ctl->driver); 243 244 if (!dev) 245 { 246 printk("pcbit_command: unknown device\n"); 247 return -1; 248 } 249 250 chan = (ctl->arg & 0x0F) ? dev->b2 : dev->b1; 251 252 253 switch (ctl->command) { 254 case ISDN_CMD_IOCTL: 255 return pcbit_ioctl(ctl); 256 break; 257 case ISDN_CMD_DIAL: 258 info.type = EV_USR_SETUP_REQ; 259 info.data.setup.CalledPN = (char *) &ctl->parm.setup.phone; 260 pcbit_fsm_event(dev, chan, EV_USR_SETUP_REQ, &info); 261 break; 262 case ISDN_CMD_ACCEPTD: 263 pcbit_fsm_event(dev, chan, EV_USR_SETUP_RESP, NULL); 264 break; 265 case ISDN_CMD_ACCEPTB: 266 printk("ISDN_CMD_ACCEPTB - not really needed\n"); 267 break; 268 case ISDN_CMD_HANGUP: 269 pcbit_fsm_event(dev, chan, EV_USR_RELEASE_REQ, NULL); 270 break; 271 case ISDN_CMD_SETL2: 272 chan->proto = (ctl->arg >> 8); 273 break; 274 case ISDN_CMD_CLREAZ: 275 pcbit_clear_msn(dev); 276 break; 277 case ISDN_CMD_SETEAZ: 278 pcbit_set_msn(dev, ctl->parm.num); 279 break; 280 case ISDN_CMD_SETL3: 281 if ((ctl->arg >> 8) != ISDN_PROTO_L3_TRANS) 282 printk(KERN_DEBUG "L3 protocol unknown\n"); 283 break; 284 default: 285 printk(KERN_DEBUG "pcbit_command: unknown command\n"); 286 break; 287 }; 288 289 return 0; 290} 291 292/* 293 * Another Hack :-( 294 * on some conditions the board stops sending TDATA_CONFs 295 * let's see if we can turn around the problem 296 */ 297 298#ifdef BLOCK_TIMER 299static void pcbit_block_timer(unsigned long data) 300{ 301 struct pcbit_chan *chan; 302 struct pcbit_dev *dev; 303 isdn_ctrl ictl; 304 305 chan = (struct pcbit_chan *)data; 306 307 dev = chan2dev(chan); 308 309 if (dev == NULL) { 310 printk(KERN_DEBUG "pcbit: chan2dev failed\n"); 311 return; 312 } 313 314 del_timer(&chan->block_timer); 315 chan->block_timer.function = NULL; 316 317#ifdef DEBUG 318 printk(KERN_DEBUG "pcbit_block_timer\n"); 319#endif 320 chan->queued = 0; 321 ictl.driver = dev->id; 322 ictl.command = ISDN_STAT_BSENT; 323 ictl.arg = chan->id; 324 dev->dev_if->statcallb(&ictl); 325} 326#endif 327 328static int pcbit_xmit(int driver, int chnum, int ack, struct sk_buff *skb) 329{ 330 ushort hdrlen; 331 int refnum, len; 332 struct pcbit_chan *chan; 333 struct pcbit_dev *dev; 334 335 dev = finddev(driver); 336 if (dev == NULL) 337 { 338 printk("finddev returned NULL"); 339 return -1; 340 } 341 342 chan = chnum ? dev->b2 : dev->b1; 343 344 345 if (chan->fsm_state != ST_ACTIVE) 346 return -1; 347 348 if (chan->queued >= MAX_QUEUED) 349 { 350#ifdef DEBUG_QUEUE 351 printk(KERN_DEBUG 352 "pcbit: %d packets already in queue - write fails\n", 353 chan->queued); 354#endif 355 /* 356 * packet stays on the head of the device queue 357 * since dev_start_xmit will fail 358 * see net/core/dev.c 359 */ 360#ifdef BLOCK_TIMER 361 if (chan->block_timer.function == NULL) { 362 init_timer(&chan->block_timer); 363 chan->block_timer.function = &pcbit_block_timer; 364 chan->block_timer.data = (long) chan; 365 chan->block_timer.expires = jiffies + 1 * HZ; 366 add_timer(&chan->block_timer); 367 } 368#endif 369 return 0; 370 } 371 372 373 chan->queued++; 374 375 len = skb->len; 376 377 hdrlen = capi_tdata_req(chan, skb); 378 379 refnum = last_ref_num++ & 0x7fffU; 380 chan->s_refnum = refnum; 381 382 pcbit_l2_write(dev, MSG_TDATA_REQ, refnum, skb, hdrlen); 383 384 return len; 385} 386 387static int pcbit_writecmd(const u_char __user *buf, int len, int driver, int channel) 388{ 389 struct pcbit_dev *dev; 390 int i, j; 391 const u_char *loadbuf; 392 u_char *ptr = NULL; 393 u_char *cbuf; 394 395 int errstat; 396 397 dev = finddev(driver); 398 399 if (!dev) 400 { 401 printk("pcbit_writecmd: couldn't find device"); 402 return -ENODEV; 403 } 404 405 switch (dev->l2_state) { 406 case L2_LWMODE: 407 /* check (size <= rdp_size); write buf into board */ 408 if (len < 0 || len > BANK4 + 1 || len > 1024) 409 { 410 printk("pcbit_writecmd: invalid length %d\n", len); 411 return -EINVAL; 412 } 413 414 cbuf = memdup_user(buf, len); 415 if (IS_ERR(cbuf)) 416 return PTR_ERR(cbuf); 417 418 memcpy_toio(dev->sh_mem, cbuf, len); 419 kfree(cbuf); 420 return len; 421 case L2_FWMODE: 422 /* this is the hard part */ 423 /* dumb board */ 424 /* get it into kernel space */ 425 if ((ptr = kmalloc(len, GFP_KERNEL)) == NULL) 426 return -ENOMEM; 427 if (copy_from_user(ptr, buf, len)) { 428 kfree(ptr); 429 return -EFAULT; 430 } 431 loadbuf = ptr; 432 433 errstat = 0; 434 435 for (i = 0; i < len; i++) 436 { 437 for (j = 0; j < LOAD_RETRY; j++) 438 if (!(readb(dev->sh_mem + dev->loadptr))) 439 break; 440 441 if (j == LOAD_RETRY) 442 { 443 errstat = -ETIME; 444 printk("TIMEOUT i=%d\n", i); 445 break; 446 } 447 writeb(loadbuf[i], dev->sh_mem + dev->loadptr + 1); 448 writeb(0x01, dev->sh_mem + dev->loadptr); 449 450 dev->loadptr += 2; 451 if (dev->loadptr > LOAD_ZONE_END) 452 dev->loadptr = LOAD_ZONE_START; 453 } 454 kfree(ptr); 455 456 return errstat ? errstat : len; 457 default: 458 return -EBUSY; 459 } 460} 461 462/* 463 * demultiplexing of messages 464 * 465 */ 466 467void pcbit_l3_receive(struct pcbit_dev *dev, ulong msg, 468 struct sk_buff *skb, 469 ushort hdr_len, ushort refnum) 470{ 471 struct pcbit_chan *chan; 472 struct sk_buff *skb2; 473 unsigned short len; 474 struct callb_data cbdata; 475 int complete, err; 476 isdn_ctrl ictl; 477 478 switch (msg) { 479 480 case MSG_TDATA_IND: 481 if (!(chan = capi_channel(dev, skb))) { 482 printk(KERN_WARNING 483 "CAPI header: unknown channel id\n"); 484 break; 485 } 486 chan->r_refnum = skb->data[7]; 487 skb_pull(skb, 8); 488 489 dev->dev_if->rcvcallb_skb(dev->id, chan->id, skb); 490 491 if (capi_tdata_resp(chan, &skb2) > 0) 492 pcbit_l2_write(dev, MSG_TDATA_RESP, refnum, 493 skb2, skb2->len); 494 return; 495 break; 496 case MSG_TDATA_CONF: 497 if (!(chan = capi_channel(dev, skb))) { 498 printk(KERN_WARNING 499 "CAPI header: unknown channel id\n"); 500 break; 501 } 502 503#ifdef DEBUG 504 if ((*((ushort *)(skb->data + 2))) != 0) { 505 printk(KERN_DEBUG "TDATA_CONF error\n"); 506 } 507#endif 508#ifdef BLOCK_TIMER 509 if (chan->queued == MAX_QUEUED) { 510 del_timer(&chan->block_timer); 511 chan->block_timer.function = NULL; 512 } 513 514#endif 515 chan->queued--; 516 517 ictl.driver = dev->id; 518 ictl.command = ISDN_STAT_BSENT; 519 ictl.arg = chan->id; 520 dev->dev_if->statcallb(&ictl); 521 break; 522 523 case MSG_CONN_IND: 524 /* 525 * channel: 1st not used will do 526 * if both are used we're in trouble 527 */ 528 529 if (!dev->b1->fsm_state) 530 chan = dev->b1; 531 else if (!dev->b2->fsm_state) 532 chan = dev->b2; 533 else { 534 printk(KERN_INFO 535 "Incoming connection: no channels available"); 536 537 if ((len = capi_disc_req(*(ushort *)(skb->data), &skb2, CAUSE_NOCHAN)) > 0) 538 pcbit_l2_write(dev, MSG_DISC_REQ, refnum, skb2, len); 539 break; 540 } 541 542 cbdata.data.setup.CalledPN = NULL; 543 cbdata.data.setup.CallingPN = NULL; 544 545 capi_decode_conn_ind(chan, skb, &cbdata); 546 cbdata.type = EV_NET_SETUP; 547 548 pcbit_fsm_event(dev, chan, EV_NET_SETUP, NULL); 549 550 if (pcbit_check_msn(dev, cbdata.data.setup.CallingPN)) 551 pcbit_fsm_event(dev, chan, EV_USR_PROCED_REQ, &cbdata); 552 else 553 pcbit_fsm_event(dev, chan, EV_USR_RELEASE_REQ, NULL); 554 555 kfree(cbdata.data.setup.CalledPN); 556 kfree(cbdata.data.setup.CallingPN); 557 break; 558 559 case MSG_CONN_CONF: 560 /* 561 * We should be able to find the channel by the message 562 * reference number. The current version of the firmware 563 * doesn't sent the ref number correctly. 564 */ 565#ifdef DEBUG 566 printk(KERN_DEBUG "refnum=%04x b1=%04x b2=%04x\n", refnum, 567 dev->b1->s_refnum, 568 dev->b2->s_refnum); 569#endif 570 /* We just try to find a channel in the right state */ 571 572 if (dev->b1->fsm_state == ST_CALL_INIT) 573 chan = dev->b1; 574 else { 575 if (dev->b2->s_refnum == ST_CALL_INIT) 576 chan = dev->b2; 577 else { 578 chan = NULL; 579 printk(KERN_WARNING "Connection Confirm - no channel in Call Init state\n"); 580 break; 581 } 582 } 583 if (capi_decode_conn_conf(chan, skb, &complete)) { 584 printk(KERN_DEBUG "conn_conf indicates error\n"); 585 pcbit_fsm_event(dev, chan, EV_ERROR, NULL); 586 } 587 else 588 if (complete) 589 pcbit_fsm_event(dev, chan, EV_NET_CALL_PROC, NULL); 590 else 591 pcbit_fsm_event(dev, chan, EV_NET_SETUP_ACK, NULL); 592 break; 593 case MSG_CONN_ACTV_IND: 594 595 if (!(chan = capi_channel(dev, skb))) { 596 printk(KERN_WARNING 597 "CAPI header: unknown channel id\n"); 598 break; 599 } 600 601 if (capi_decode_conn_actv_ind(chan, skb)) { 602 printk("error in capi_decode_conn_actv_ind\n"); 603 /* pcbit_fsm_event(dev, chan, EV_ERROR, NULL); */ 604 break; 605 } 606 chan->r_refnum = refnum; 607 pcbit_fsm_event(dev, chan, EV_NET_CONN, NULL); 608 break; 609 case MSG_CONN_ACTV_CONF: 610 611 if (!(chan = capi_channel(dev, skb))) { 612 printk(KERN_WARNING 613 "CAPI header: unknown channel id\n"); 614 break; 615 } 616 617 if (capi_decode_conn_actv_conf(chan, skb) == 0) 618 pcbit_fsm_event(dev, chan, EV_NET_CONN_ACK, NULL); 619 620 else 621 printk(KERN_DEBUG "decode_conn_actv_conf failed\n"); 622 break; 623 624 case MSG_SELP_CONF: 625 626 if (!(chan = capi_channel(dev, skb))) { 627 printk(KERN_WARNING 628 "CAPI header: unknown channel id\n"); 629 break; 630 } 631 632 if (!(err = capi_decode_sel_proto_conf(chan, skb))) 633 pcbit_fsm_event(dev, chan, EV_NET_SELP_RESP, NULL); 634 else { 635 /* Error */ 636 printk("error %d - capi_decode_sel_proto_conf\n", err); 637 } 638 break; 639 case MSG_ACT_TRANSP_CONF: 640 if (!(chan = capi_channel(dev, skb))) { 641 printk(KERN_WARNING 642 "CAPI header: unknown channel id\n"); 643 break; 644 } 645 646 if (!capi_decode_actv_trans_conf(chan, skb)) 647 pcbit_fsm_event(dev, chan, EV_NET_ACTV_RESP, NULL); 648 break; 649 650 case MSG_DISC_IND: 651 652 if (!(chan = capi_channel(dev, skb))) { 653 printk(KERN_WARNING 654 "CAPI header: unknown channel id\n"); 655 break; 656 } 657 658 if (!capi_decode_disc_ind(chan, skb)) 659 pcbit_fsm_event(dev, chan, EV_NET_DISC, NULL); 660 else 661 printk(KERN_WARNING "capi_decode_disc_ind - error\n"); 662 break; 663 case MSG_DISC_CONF: 664 if (!(chan = capi_channel(dev, skb))) { 665 printk(KERN_WARNING 666 "CAPI header: unknown channel id\n"); 667 break; 668 } 669 670 if (!capi_decode_disc_ind(chan, skb)) 671 pcbit_fsm_event(dev, chan, EV_NET_RELEASE, NULL); 672 else 673 printk(KERN_WARNING "capi_decode_disc_conf - error\n"); 674 break; 675 case MSG_INFO_IND: 676#ifdef DEBUG 677 printk(KERN_DEBUG "received Info Indication - discarded\n"); 678#endif 679 break; 680#ifdef DEBUG 681 case MSG_DEBUG_188: 682 capi_decode_debug_188(skb->data, skb->len); 683 break; 684 685 default: 686 printk(KERN_DEBUG "pcbit_l3_receive: unknown message %08lx\n", 687 msg); 688 break; 689#endif 690 } 691 692 kfree_skb(skb); 693 694} 695 696/* 697 * Single statbuf 698 * should be a statbuf per device 699 */ 700 701static char statbuf[STATBUF_LEN]; 702static int stat_st = 0; 703static int stat_end = 0; 704 705static int pcbit_stat(u_char __user *buf, int len, int driver, int channel) 706{ 707 int stat_count; 708 stat_count = stat_end - stat_st; 709 710 if (stat_count < 0) 711 stat_count = STATBUF_LEN - stat_st + stat_end; 712 713 /* FIXME: should we sleep and wait for more cookies ? */ 714 if (len > stat_count) 715 len = stat_count; 716 717 if (stat_st < stat_end) 718 { 719 if (copy_to_user(buf, statbuf + stat_st, len)) 720 return -EFAULT; 721 stat_st += len; 722 } 723 else 724 { 725 if (len > STATBUF_LEN - stat_st) 726 { 727 if (copy_to_user(buf, statbuf + stat_st, 728 STATBUF_LEN - stat_st)) 729 return -EFAULT; 730 if (copy_to_user(buf, statbuf, 731 len - (STATBUF_LEN - stat_st))) 732 return -EFAULT; 733 734 stat_st = len - (STATBUF_LEN - stat_st); 735 } 736 else 737 { 738 if (copy_to_user(buf, statbuf + stat_st, len)) 739 return -EFAULT; 740 741 stat_st += len; 742 743 if (stat_st == STATBUF_LEN) 744 stat_st = 0; 745 } 746 } 747 748 if (stat_st == stat_end) 749 stat_st = stat_end = 0; 750 751 return len; 752} 753 754static void pcbit_logstat(struct pcbit_dev *dev, char *str) 755{ 756 int i; 757 isdn_ctrl ictl; 758 759 for (i = stat_end; i < strlen(str); i++) 760 { 761 statbuf[i] = str[i]; 762 stat_end = (stat_end + 1) % STATBUF_LEN; 763 if (stat_end == stat_st) 764 stat_st = (stat_st + 1) % STATBUF_LEN; 765 } 766 767 ictl.command = ISDN_STAT_STAVAIL; 768 ictl.driver = dev->id; 769 ictl.arg = strlen(str); 770 dev->dev_if->statcallb(&ictl); 771} 772 773void pcbit_state_change(struct pcbit_dev *dev, struct pcbit_chan *chan, 774 unsigned short i, unsigned short ev, unsigned short f) 775{ 776 char buf[256]; 777 778 sprintf(buf, "change on device: %d channel:%d\n%s -> %s -> %s\n", 779 dev->id, chan->id, 780 isdn_state_table[i], strisdnevent(ev), isdn_state_table[f] 781 ); 782 783#ifdef DEBUG 784 printk("%s", buf); 785#endif 786 787 pcbit_logstat(dev, buf); 788} 789 790static void set_running_timeout(unsigned long ptr) 791{ 792 struct pcbit_dev *dev; 793 794#ifdef DEBUG 795 printk(KERN_DEBUG "set_running_timeout\n"); 796#endif 797 dev = (struct pcbit_dev *) ptr; 798 799 dev->l2_state = L2_DOWN; 800 wake_up_interruptible(&dev->set_running_wq); 801} 802 803static int set_protocol_running(struct pcbit_dev *dev) 804{ 805 isdn_ctrl ctl; 806 807 init_timer(&dev->set_running_timer); 808 809 dev->set_running_timer.function = &set_running_timeout; 810 dev->set_running_timer.data = (ulong) dev; 811 dev->set_running_timer.expires = jiffies + SET_RUN_TIMEOUT; 812 813 /* kick it */ 814 815 dev->l2_state = L2_STARTING; 816 817 writeb((0x80U | ((dev->rcv_seq & 0x07) << 3) | (dev->send_seq & 0x07)), 818 dev->sh_mem + BANK4); 819 820 add_timer(&dev->set_running_timer); 821 822 wait_event(dev->set_running_wq, dev->l2_state == L2_RUNNING || 823 dev->l2_state == L2_DOWN); 824 825 del_timer(&dev->set_running_timer); 826 827 if (dev->l2_state == L2_RUNNING) 828 { 829 printk(KERN_DEBUG "pcbit: running\n"); 830 831 dev->unack_seq = dev->send_seq; 832 833 dev->writeptr = dev->sh_mem; 834 dev->readptr = dev->sh_mem + BANK2; 835 836 /* tell the good news to the upper layer */ 837 ctl.driver = dev->id; 838 ctl.command = ISDN_STAT_RUN; 839 840 dev->dev_if->statcallb(&ctl); 841 } 842 else 843 { 844 printk(KERN_DEBUG "pcbit: initialization failed\n"); 845 printk(KERN_DEBUG "pcbit: firmware not loaded\n"); 846 847#ifdef DEBUG 848 printk(KERN_DEBUG "Bank3 = %02x\n", 849 readb(dev->sh_mem + BANK3)); 850#endif 851 writeb(0x40, dev->sh_mem + BANK4); 852 853 /* warn the upper layer */ 854 ctl.driver = dev->id; 855 ctl.command = ISDN_STAT_STOP; 856 857 dev->dev_if->statcallb(&ctl); 858 859 return -EL2HLT; /* Level 2 halted */ 860 } 861 862 return 0; 863} 864 865static int pcbit_ioctl(isdn_ctrl *ctl) 866{ 867 struct pcbit_dev *dev; 868 struct pcbit_ioctl *cmd; 869 870 dev = finddev(ctl->driver); 871 872 if (!dev) 873 { 874 printk(KERN_DEBUG "pcbit_ioctl: unknown device\n"); 875 return -ENODEV; 876 } 877 878 cmd = (struct pcbit_ioctl *) ctl->parm.num; 879 880 switch (ctl->arg) { 881 case PCBIT_IOCTL_GETSTAT: 882 cmd->info.l2_status = dev->l2_state; 883 break; 884 885 case PCBIT_IOCTL_STRLOAD: 886 if (dev->l2_state == L2_RUNNING) 887 return -EBUSY; 888 889 dev->unack_seq = dev->send_seq = dev->rcv_seq = 0; 890 891 dev->writeptr = dev->sh_mem; 892 dev->readptr = dev->sh_mem + BANK2; 893 894 dev->l2_state = L2_LOADING; 895 break; 896 897 case PCBIT_IOCTL_LWMODE: 898 if (dev->l2_state != L2_LOADING) 899 return -EINVAL; 900 901 dev->l2_state = L2_LWMODE; 902 break; 903 904 case PCBIT_IOCTL_FWMODE: 905 if (dev->l2_state == L2_RUNNING) 906 return -EBUSY; 907 dev->loadptr = LOAD_ZONE_START; 908 dev->l2_state = L2_FWMODE; 909 910 break; 911 case PCBIT_IOCTL_ENDLOAD: 912 if (dev->l2_state == L2_RUNNING) 913 return -EBUSY; 914 dev->l2_state = L2_DOWN; 915 break; 916 917 case PCBIT_IOCTL_SETBYTE: 918 if (dev->l2_state == L2_RUNNING) 919 return -EBUSY; 920 921 /* check addr */ 922 if (cmd->info.rdp_byte.addr > BANK4) 923 return -EFAULT; 924 925 writeb(cmd->info.rdp_byte.value, dev->sh_mem + cmd->info.rdp_byte.addr); 926 break; 927 case PCBIT_IOCTL_GETBYTE: 928 if (dev->l2_state == L2_RUNNING) 929 return -EBUSY; 930 931 /* check addr */ 932 933 if (cmd->info.rdp_byte.addr > BANK4) 934 { 935 printk("getbyte: invalid addr %04x\n", cmd->info.rdp_byte.addr); 936 return -EFAULT; 937 } 938 939 cmd->info.rdp_byte.value = readb(dev->sh_mem + cmd->info.rdp_byte.addr); 940 break; 941 case PCBIT_IOCTL_RUNNING: 942 if (dev->l2_state == L2_RUNNING) 943 return -EBUSY; 944 return set_protocol_running(dev); 945 break; 946 case PCBIT_IOCTL_WATCH188: 947 if (dev->l2_state != L2_LOADING) 948 return -EINVAL; 949 pcbit_l2_write(dev, MSG_WATCH188, 0x0001, NULL, 0); 950 break; 951 case PCBIT_IOCTL_PING188: 952 if (dev->l2_state != L2_LOADING) 953 return -EINVAL; 954 pcbit_l2_write(dev, MSG_PING188_REQ, 0x0001, NULL, 0); 955 break; 956 case PCBIT_IOCTL_APION: 957 if (dev->l2_state != L2_LOADING) 958 return -EINVAL; 959 pcbit_l2_write(dev, MSG_API_ON, 0x0001, NULL, 0); 960 break; 961 case PCBIT_IOCTL_STOP: 962 dev->l2_state = L2_DOWN; 963 writeb(0x40, dev->sh_mem + BANK4); 964 dev->rcv_seq = 0; 965 dev->send_seq = 0; 966 dev->unack_seq = 0; 967 break; 968 default: 969 printk("error: unknown ioctl\n"); 970 break; 971 }; 972 return 0; 973} 974 975/* 976 * MSN list handling 977 * 978 * if null reject all calls 979 * if first entry has null MSN accept all calls 980 */ 981 982static void pcbit_clear_msn(struct pcbit_dev *dev) 983{ 984 struct msn_entry *ptr, *back; 985 986 for (ptr = dev->msn_list; ptr;) 987 { 988 back = ptr->next; 989 kfree(ptr); 990 ptr = back; 991 } 992 993 dev->msn_list = NULL; 994} 995 996static void pcbit_set_msn(struct pcbit_dev *dev, char *list) 997{ 998 struct msn_entry *ptr; 999 struct msn_entry *back = NULL; 1000 char *cp, *sp; 1001 int len; 1002 1003 if (strlen(list) == 0) { 1004 ptr = kmalloc(sizeof(struct msn_entry), GFP_ATOMIC); 1005 if (!ptr) { 1006 printk(KERN_WARNING "kmalloc failed\n"); 1007 return; 1008 } 1009 1010 ptr->msn = NULL; 1011 1012 ptr->next = dev->msn_list; 1013 dev->msn_list = ptr; 1014 1015 return; 1016 } 1017 1018 if (dev->msn_list) 1019 for (back = dev->msn_list; back->next; back = back->next); 1020 1021 sp = list; 1022 1023 do { 1024 cp = strchr(sp, ','); 1025 if (cp) 1026 len = cp - sp; 1027 else 1028 len = strlen(sp); 1029 1030 ptr = kmalloc(sizeof(struct msn_entry), GFP_ATOMIC); 1031 1032 if (!ptr) { 1033 printk(KERN_WARNING "kmalloc failed\n"); 1034 return; 1035 } 1036 ptr->next = NULL; 1037 1038 ptr->msn = kmalloc(len + 1, GFP_ATOMIC); 1039 if (!ptr->msn) { 1040 printk(KERN_WARNING "kmalloc failed\n"); 1041 kfree(ptr); 1042 return; 1043 } 1044 1045 memcpy(ptr->msn, sp, len); 1046 ptr->msn[len] = 0; 1047 1048#ifdef DEBUG 1049 printk(KERN_DEBUG "msn: %s\n", ptr->msn); 1050#endif 1051 if (dev->msn_list == NULL) 1052 dev->msn_list = ptr; 1053 else 1054 back->next = ptr; 1055 back = ptr; 1056 sp += len; 1057 } while (cp); 1058} 1059 1060/* 1061 * check if we do signal or reject an incoming call 1062 */ 1063static int pcbit_check_msn(struct pcbit_dev *dev, char *msn) 1064{ 1065 struct msn_entry *ptr; 1066 1067 for (ptr = dev->msn_list; ptr; ptr = ptr->next) { 1068 1069 if (ptr->msn == NULL) 1070 return 1; 1071 1072 if (strcmp(ptr->msn, msn) == 0) 1073 return 1; 1074 } 1075 1076 return 0; 1077} 1078