1/* 2 * Copyright 2003 Digi International (www.digi.com) 3 * Scott H Kilau <Scott_Kilau at digi dot com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2, or (at your option) 8 * any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the 12 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 13 * PURPOSE. See the GNU General Public License for more details. 14 * 15 */ 16 17/* 18 * In the original out of kernel Digi dgap driver, firmware 19 * loading was done via user land to driver handshaking. 20 * 21 * For cards that support a concentrator (port expander), 22 * I believe the concentrator its self told the card which 23 * concentrator is actually attached and then that info 24 * was used to tell user land which concentrator firmware 25 * image was to be downloaded. I think even the BIOS or 26 * FEP images required could change with the connection 27 * of a particular concentrator. 28 * 29 * Since I have no access to any of these cards or 30 * concentrators, I cannot put the correct concentrator 31 * firmware file names into the firmware_info structure 32 * as is now done for the BIOS and FEP images. 33 * 34 * I think, but am not certain, that the cards supporting 35 * concentrators will function without them. So support 36 * of these cards has been left in this driver. 37 * 38 * In order to fully support those cards, they would 39 * either have to be acquired for dissection or maybe 40 * Digi International could provide some assistance. 41 */ 42#undef DIGI_CONCENTRATORS_SUPPORTED 43 44#define pr_fmt(fmt) "dgap: " fmt 45 46#include <linux/kernel.h> 47#include <linux/module.h> 48#include <linux/pci.h> 49#include <linux/delay.h> /* For udelay */ 50#include <linux/slab.h> 51#include <linux/uaccess.h> 52#include <linux/sched.h> 53 54#include <linux/interrupt.h> /* For tasklet and interrupt structs/defines */ 55#include <linux/ctype.h> 56#include <linux/tty.h> 57#include <linux/tty_flip.h> 58#include <linux/serial_reg.h> 59#include <linux/io.h> /* For read[bwl]/write[bwl] */ 60 61#include <linux/string.h> 62#include <linux/device.h> 63#include <linux/kdev_t.h> 64#include <linux/firmware.h> 65 66#include "dgap.h" 67 68/* 69 * File operations permitted on Control/Management major. 70 */ 71static const struct file_operations dgap_board_fops = { 72 .owner = THIS_MODULE, 73}; 74 75static uint dgap_numboards; 76static struct board_t *dgap_board[MAXBOARDS]; 77static ulong dgap_poll_counter; 78static int dgap_driver_state = DRIVER_INITIALIZED; 79static int dgap_poll_tick = 20; /* Poll interval - 20 ms */ 80 81static struct class *dgap_class; 82 83static uint dgap_count = 500; 84 85/* 86 * Poller stuff 87 */ 88static DEFINE_SPINLOCK(dgap_poll_lock); /* Poll scheduling lock */ 89static ulong dgap_poll_time; /* Time of next poll */ 90static uint dgap_poll_stop; /* Used to tell poller to stop */ 91static struct timer_list dgap_poll_timer; 92 93/* 94 SUPPORTED PRODUCTS 95 96 Card Model Number of Ports Interface 97 ---------------------------------------------------------------- 98 Acceleport Xem 4 - 64 (EIA232 & EIA422) 99 Acceleport Xr 4 & 8 (EIA232) 100 Acceleport Xr 920 4 & 8 (EIA232) 101 Acceleport C/X 8 - 128 (EIA232) 102 Acceleport EPC/X 8 - 224 (EIA232) 103 Acceleport Xr/422 4 & 8 (EIA422) 104 Acceleport 2r/920 2 (EIA232) 105 Acceleport 4r/920 4 (EIA232) 106 Acceleport 8r/920 8 (EIA232) 107 108 IBM 8-Port Asynchronous PCI Adapter (EIA232) 109 IBM 128-Port Asynchronous PCI Adapter (EIA232 & EIA422) 110*/ 111 112static struct pci_device_id dgap_pci_tbl[] = { 113 { DIGI_VID, PCI_DEV_XEM_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, 114 { DIGI_VID, PCI_DEV_CX_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, 115 { DIGI_VID, PCI_DEV_CX_IBM_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 }, 116 { DIGI_VID, PCI_DEV_EPCJ_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3 }, 117 { DIGI_VID, PCI_DEV_920_2_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 }, 118 { DIGI_VID, PCI_DEV_920_4_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5 }, 119 { DIGI_VID, PCI_DEV_920_8_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6 }, 120 { DIGI_VID, PCI_DEV_XR_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 7 }, 121 { DIGI_VID, PCI_DEV_XRJ_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 }, 122 { DIGI_VID, PCI_DEV_XR_422_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 9 }, 123 { DIGI_VID, PCI_DEV_XR_IBM_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 }, 124 { DIGI_VID, PCI_DEV_XR_SAIP_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 }, 125 { DIGI_VID, PCI_DEV_XR_BULL_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 }, 126 { DIGI_VID, PCI_DEV_920_8_HP_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 }, 127 { DIGI_VID, PCI_DEV_XEM_HP_DID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 }, 128 {0,} /* 0 terminated list. */ 129}; 130MODULE_DEVICE_TABLE(pci, dgap_pci_tbl); 131 132/* 133 * A generic list of Product names, PCI Vendor ID, and PCI Device ID. 134 */ 135struct board_id { 136 uint config_type; 137 u8 *name; 138 uint maxports; 139 uint dpatype; 140}; 141 142static struct board_id dgap_ids[] = { 143 { PPCM, PCI_DEV_XEM_NAME, 64, (T_PCXM|T_PCLITE|T_PCIBUS) }, 144 { PCX, PCI_DEV_CX_NAME, 128, (T_CX|T_PCIBUS) }, 145 { PCX, PCI_DEV_CX_IBM_NAME, 128, (T_CX|T_PCIBUS) }, 146 { PEPC, PCI_DEV_EPCJ_NAME, 224, (T_EPC|T_PCIBUS) }, 147 { APORT2_920P, PCI_DEV_920_2_NAME, 2, (T_PCXR|T_PCLITE|T_PCIBUS) }, 148 { APORT4_920P, PCI_DEV_920_4_NAME, 4, (T_PCXR|T_PCLITE|T_PCIBUS) }, 149 { APORT8_920P, PCI_DEV_920_8_NAME, 8, (T_PCXR|T_PCLITE|T_PCIBUS) }, 150 { PAPORT8, PCI_DEV_XR_NAME, 8, (T_PCXR|T_PCLITE|T_PCIBUS) }, 151 { PAPORT8, PCI_DEV_XRJ_NAME, 8, (T_PCXR|T_PCLITE|T_PCIBUS) }, 152 { PAPORT8, PCI_DEV_XR_422_NAME, 8, (T_PCXR|T_PCLITE|T_PCIBUS) }, 153 { PAPORT8, PCI_DEV_XR_IBM_NAME, 8, (T_PCXR|T_PCLITE|T_PCIBUS) }, 154 { PAPORT8, PCI_DEV_XR_SAIP_NAME, 8, (T_PCXR|T_PCLITE|T_PCIBUS) }, 155 { PAPORT8, PCI_DEV_XR_BULL_NAME, 8, (T_PCXR|T_PCLITE|T_PCIBUS) }, 156 { APORT8_920P, PCI_DEV_920_8_HP_NAME, 8, (T_PCXR|T_PCLITE|T_PCIBUS) }, 157 { PPCM, PCI_DEV_XEM_HP_NAME, 64, (T_PCXM|T_PCLITE|T_PCIBUS) }, 158 {0,} /* 0 terminated list. */ 159}; 160 161struct firmware_info { 162 u8 *conf_name; /* dgap.conf */ 163 u8 *bios_name; /* BIOS filename */ 164 u8 *fep_name; /* FEP filename */ 165 u8 *con_name; /* Concentrator filename FIXME*/ 166 int num; /* sequence number */ 167}; 168 169/* 170 * Firmware - BIOS, FEP, and CONC filenames 171 */ 172static struct firmware_info fw_info[] = { 173 { "dgap/dgap.conf", "dgap/sxbios.bin", "dgap/sxfep.bin", NULL, 0 }, 174 { "dgap/dgap.conf", "dgap/cxpbios.bin", "dgap/cxpfep.bin", NULL, 1 }, 175 { "dgap/dgap.conf", "dgap/cxpbios.bin", "dgap/cxpfep.bin", NULL, 2 }, 176 { "dgap/dgap.conf", "dgap/pcibios.bin", "dgap/pcifep.bin", NULL, 3 }, 177 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 4 }, 178 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 5 }, 179 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 6 }, 180 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 7 }, 181 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 8 }, 182 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 9 }, 183 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 10 }, 184 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 11 }, 185 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 12 }, 186 { "dgap/dgap.conf", "dgap/xrbios.bin", "dgap/xrfep.bin", NULL, 13 }, 187 { "dgap/dgap.conf", "dgap/sxbios.bin", "dgap/sxfep.bin", NULL, 14 }, 188 {NULL,} 189}; 190 191/* 192 * Default transparent print information. 193 */ 194static struct digi_t dgap_digi_init = { 195 .digi_flags = DIGI_COOK, /* Flags */ 196 .digi_maxcps = 100, /* Max CPS */ 197 .digi_maxchar = 50, /* Max chars in print queue */ 198 .digi_bufsize = 100, /* Printer buffer size */ 199 .digi_onlen = 4, /* size of printer on string */ 200 .digi_offlen = 4, /* size of printer off string */ 201 .digi_onstr = "\033[5i", /* ANSI printer on string ] */ 202 .digi_offstr = "\033[4i", /* ANSI printer off string ] */ 203 .digi_term = "ansi" /* default terminal type */ 204}; 205 206/* 207 * Define a local default termios struct. All ports will be created 208 * with this termios initially. 209 * 210 * This defines a raw port at 9600 baud, 8 data bits, no parity, 211 * 1 stop bit. 212 */ 213 214static struct ktermios dgap_default_termios = { 215 .c_iflag = (DEFAULT_IFLAGS), /* iflags */ 216 .c_oflag = (DEFAULT_OFLAGS), /* oflags */ 217 .c_cflag = (DEFAULT_CFLAGS), /* cflags */ 218 .c_lflag = (DEFAULT_LFLAGS), /* lflags */ 219 .c_cc = INIT_C_CC, 220 .c_line = 0, 221}; 222 223/* 224 * Our needed internal static variables from dgap_parse.c 225 */ 226static struct cnode dgap_head; 227#define MAXCWORD 200 228static char dgap_cword[MAXCWORD]; 229 230struct toklist { 231 int token; 232 char *string; 233}; 234 235static struct toklist dgap_brdtype[] = { 236 { PCX, "Digi_AccelePort_C/X_PCI" }, 237 { PEPC, "Digi_AccelePort_EPC/X_PCI" }, 238 { PPCM, "Digi_AccelePort_Xem_PCI" }, 239 { APORT2_920P, "Digi_AccelePort_2r_920_PCI" }, 240 { APORT4_920P, "Digi_AccelePort_4r_920_PCI" }, 241 { APORT8_920P, "Digi_AccelePort_8r_920_PCI" }, 242 { PAPORT4, "Digi_AccelePort_4r_PCI(EIA-232/RS-422)" }, 243 { PAPORT8, "Digi_AccelePort_8r_PCI(EIA-232/RS-422)" }, 244 { 0, NULL } 245}; 246 247static struct toklist dgap_tlist[] = { 248 { BEGIN, "config_begin" }, 249 { END, "config_end" }, 250 { BOARD, "board" }, 251 { IO, "io" }, 252 { PCIINFO, "pciinfo" }, 253 { LINE, "line" }, 254 { CONC, "conc" }, 255 { CONC, "concentrator" }, 256 { CX, "cx" }, 257 { CX, "ccon" }, 258 { EPC, "epccon" }, 259 { EPC, "epc" }, 260 { MOD, "module" }, 261 { ID, "id" }, 262 { STARTO, "start" }, 263 { SPEED, "speed" }, 264 { CABLE, "cable" }, 265 { CONNECT, "connect" }, 266 { METHOD, "method" }, 267 { STATUS, "status" }, 268 { CUSTOM, "Custom" }, 269 { BASIC, "Basic" }, 270 { MEM, "mem" }, 271 { MEM, "memory" }, 272 { PORTS, "ports" }, 273 { MODEM, "modem" }, 274 { NPORTS, "nports" }, 275 { TTYN, "ttyname" }, 276 { CU, "cuname" }, 277 { PRINT, "prname" }, 278 { CMAJOR, "major" }, 279 { ALTPIN, "altpin" }, 280 { USEINTR, "useintr" }, 281 { TTSIZ, "ttysize" }, 282 { CHSIZ, "chsize" }, 283 { BSSIZ, "boardsize" }, 284 { UNTSIZ, "schedsize" }, 285 { F2SIZ, "f2200size" }, 286 { VPSIZ, "vpixsize" }, 287 { 0, NULL } 288}; 289 290 291/* 292 * dgap_sindex: much like index(), but it looks for a match of any character in 293 * the group, and returns that position. If the first character is a ^, then 294 * this will match the first occurrence not in that group. 295 */ 296static char *dgap_sindex(char *string, char *group) 297{ 298 char *ptr; 299 300 if (!string || !group) 301 return NULL; 302 303 if (*group == '^') { 304 group++; 305 for (; *string; string++) { 306 for (ptr = group; *ptr; ptr++) { 307 if (*ptr == *string) 308 break; 309 } 310 if (*ptr == '\0') 311 return string; 312 } 313 } else { 314 for (; *string; string++) { 315 for (ptr = group; *ptr; ptr++) { 316 if (*ptr == *string) 317 return string; 318 } 319 } 320 } 321 322 return NULL; 323} 324 325/* 326 * get a word from the input stream, also keep track of current line number. 327 * words are separated by whitespace. 328 */ 329static char *dgap_getword(char **in) 330{ 331 char *ret_ptr = *in; 332 333 char *ptr = dgap_sindex(*in, " \t\n"); 334 335 /* If no word found, return null */ 336 if (!ptr) 337 return NULL; 338 339 /* Mark new location for our buffer */ 340 *ptr = '\0'; 341 *in = ptr + 1; 342 343 /* Eat any extra spaces/tabs/newlines that might be present */ 344 while (*in && **in && ((**in == ' ') || 345 (**in == '\t') || 346 (**in == '\n'))) { 347 **in = '\0'; 348 *in = *in + 1; 349 } 350 351 return ret_ptr; 352} 353 354 355/* 356 * Get a token from the input file; return 0 if end of file is reached 357 */ 358static int dgap_gettok(char **in) 359{ 360 char *w; 361 struct toklist *t; 362 363 if (strstr(dgap_cword, "board")) { 364 w = dgap_getword(in); 365 snprintf(dgap_cword, MAXCWORD, "%s", w); 366 for (t = dgap_brdtype; t->token != 0; t++) { 367 if (!strcmp(w, t->string)) 368 return t->token; 369 } 370 } else { 371 while ((w = dgap_getword(in))) { 372 snprintf(dgap_cword, MAXCWORD, "%s", w); 373 for (t = dgap_tlist; t->token != 0; t++) { 374 if (!strcmp(w, t->string)) 375 return t->token; 376 } 377 } 378 } 379 380 return 0; 381} 382 383/* 384 * dgap_checknode: see if all the necessary info has been supplied for a node 385 * before creating the next node. 386 */ 387static int dgap_checknode(struct cnode *p) 388{ 389 switch (p->type) { 390 case LNODE: 391 if (p->u.line.v_speed == 0) { 392 pr_err("line speed not specified"); 393 return 1; 394 } 395 return 0; 396 397 case CNODE: 398 if (p->u.conc.v_speed == 0) { 399 pr_err("concentrator line speed not specified"); 400 return 1; 401 } 402 if (p->u.conc.v_nport == 0) { 403 pr_err("number of ports on concentrator not specified"); 404 return 1; 405 } 406 if (p->u.conc.v_id == 0) { 407 pr_err("concentrator id letter not specified"); 408 return 1; 409 } 410 return 0; 411 412 case MNODE: 413 if (p->u.module.v_nport == 0) { 414 pr_err("number of ports on EBI module not specified"); 415 return 1; 416 } 417 if (p->u.module.v_id == 0) { 418 pr_err("EBI module id letter not specified"); 419 return 1; 420 } 421 return 0; 422 } 423 return 0; 424} 425 426/* 427 * Given a board pointer, returns whether we should use interrupts or not. 428 */ 429static uint dgap_config_get_useintr(struct board_t *bd) 430{ 431 struct cnode *p; 432 433 if (!bd) 434 return 0; 435 436 for (p = bd->bd_config; p; p = p->next) { 437 if (p->type == INTRNODE) { 438 /* 439 * check for pcxr types. 440 */ 441 return p->u.useintr; 442 } 443 } 444 445 /* If not found, then don't turn on interrupts. */ 446 return 0; 447} 448 449/* 450 * Given a board pointer, returns whether we turn on altpin or not. 451 */ 452static uint dgap_config_get_altpin(struct board_t *bd) 453{ 454 struct cnode *p; 455 456 if (!bd) 457 return 0; 458 459 for (p = bd->bd_config; p; p = p->next) { 460 if (p->type == ANODE) { 461 /* 462 * check for pcxr types. 463 */ 464 return p->u.altpin; 465 } 466 } 467 468 /* If not found, then don't turn on interrupts. */ 469 return 0; 470} 471 472/* 473 * Given a specific type of board, if found, detached link and 474 * returns the first occurrence in the list. 475 */ 476static struct cnode *dgap_find_config(int type, int bus, int slot) 477{ 478 struct cnode *p, *prev, *prev2, *found; 479 480 p = &dgap_head; 481 482 while (p->next) { 483 prev = p; 484 p = p->next; 485 486 if (p->type != BNODE) 487 continue; 488 489 if (p->u.board.type != type) 490 continue; 491 492 if (p->u.board.v_pcibus && 493 p->u.board.pcibus != bus) 494 continue; 495 496 if (p->u.board.v_pcislot && 497 p->u.board.pcislot != slot) 498 continue; 499 500 found = p; 501 /* 502 * Keep walking thru the list till we 503 * find the next board. 504 */ 505 while (p->next) { 506 prev2 = p; 507 p = p->next; 508 509 if (p->type != BNODE) 510 continue; 511 512 /* 513 * Mark the end of our 1 board 514 * chain of configs. 515 */ 516 prev2->next = NULL; 517 518 /* 519 * Link the "next" board to the 520 * previous board, effectively 521 * "unlinking" our board from 522 * the main config. 523 */ 524 prev->next = p; 525 526 return found; 527 } 528 /* 529 * It must be the last board in the list. 530 */ 531 prev->next = NULL; 532 return found; 533 } 534 return NULL; 535} 536 537/* 538 * Given a board pointer, walks the config link, counting up 539 * all ports user specified should be on the board. 540 * (This does NOT mean they are all actually present right now tho) 541 */ 542static uint dgap_config_get_num_prts(struct board_t *bd) 543{ 544 int count = 0; 545 struct cnode *p; 546 547 if (!bd) 548 return 0; 549 550 for (p = bd->bd_config; p; p = p->next) { 551 552 switch (p->type) { 553 case BNODE: 554 /* 555 * check for pcxr types. 556 */ 557 if (p->u.board.type > EPCFE) 558 count += p->u.board.nport; 559 break; 560 case CNODE: 561 count += p->u.conc.nport; 562 break; 563 case MNODE: 564 count += p->u.module.nport; 565 break; 566 } 567 } 568 return count; 569} 570 571static char *dgap_create_config_string(struct board_t *bd, char *string) 572{ 573 char *ptr = string; 574 struct cnode *p; 575 struct cnode *q; 576 int speed; 577 578 if (!bd) { 579 *ptr = 0xff; 580 return string; 581 } 582 583 for (p = bd->bd_config; p; p = p->next) { 584 585 switch (p->type) { 586 case LNODE: 587 *ptr = '\0'; 588 ptr++; 589 *ptr = p->u.line.speed; 590 ptr++; 591 break; 592 case CNODE: 593 /* 594 * Because the EPC/con concentrators can have EM modules 595 * hanging off of them, we have to walk ahead in the 596 * list and keep adding the number of ports on each EM 597 * to the config. UGH! 598 */ 599 speed = p->u.conc.speed; 600 q = p->next; 601 if (q && (q->type == MNODE)) { 602 *ptr = (p->u.conc.nport + 0x80); 603 ptr++; 604 p = q; 605 while (q->next && (q->next->type) == MNODE) { 606 *ptr = (q->u.module.nport + 0x80); 607 ptr++; 608 p = q; 609 q = q->next; 610 } 611 *ptr = q->u.module.nport; 612 ptr++; 613 } else { 614 *ptr = p->u.conc.nport; 615 ptr++; 616 } 617 618 *ptr = speed; 619 ptr++; 620 break; 621 } 622 } 623 624 *ptr = 0xff; 625 return string; 626} 627 628/* 629 * Parse a configuration file read into memory as a string. 630 */ 631static int dgap_parsefile(char **in) 632{ 633 struct cnode *p, *brd, *line, *conc; 634 int rc; 635 char *s; 636 int linecnt = 0; 637 638 p = &dgap_head; 639 brd = line = conc = NULL; 640 641 /* perhaps we are adding to an existing list? */ 642 while (p->next) 643 p = p->next; 644 645 /* file must start with a BEGIN */ 646 while ((rc = dgap_gettok(in)) != BEGIN) { 647 if (rc == 0) { 648 pr_err("unexpected EOF"); 649 return -1; 650 } 651 } 652 653 for (; ;) { 654 int board_type = 0; 655 int conc_type = 0; 656 int module_type = 0; 657 658 rc = dgap_gettok(in); 659 if (rc == 0) { 660 pr_err("unexpected EOF"); 661 return -1; 662 } 663 664 switch (rc) { 665 case BEGIN: /* should only be 1 begin */ 666 pr_err("unexpected config_begin\n"); 667 return -1; 668 669 case END: 670 return 0; 671 672 case BOARD: /* board info */ 673 if (dgap_checknode(p)) 674 return -1; 675 676 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 677 if (!p->next) 678 return -1; 679 680 p = p->next; 681 682 p->type = BNODE; 683 p->u.board.status = kstrdup("No", GFP_KERNEL); 684 line = conc = NULL; 685 brd = p; 686 linecnt = -1; 687 688 board_type = dgap_gettok(in); 689 if (board_type == 0) { 690 pr_err("board !!type not specified"); 691 return -1; 692 } 693 694 p->u.board.type = board_type; 695 696 break; 697 698 case IO: /* i/o port */ 699 if (p->type != BNODE) { 700 pr_err("IO port only valid for boards"); 701 return -1; 702 } 703 s = dgap_getword(in); 704 if (!s) { 705 pr_err("unexpected end of file"); 706 return -1; 707 } 708 p->u.board.portstr = kstrdup(s, GFP_KERNEL); 709 if (kstrtol(s, 0, &p->u.board.port)) { 710 pr_err("bad number for IO port"); 711 return -1; 712 } 713 p->u.board.v_port = 1; 714 break; 715 716 case MEM: /* memory address */ 717 if (p->type != BNODE) { 718 pr_err("memory address only valid for boards"); 719 return -1; 720 } 721 s = dgap_getword(in); 722 if (!s) { 723 pr_err("unexpected end of file"); 724 return -1; 725 } 726 p->u.board.addrstr = kstrdup(s, GFP_KERNEL); 727 if (kstrtoul(s, 0, &p->u.board.addr)) { 728 pr_err("bad number for memory address"); 729 return -1; 730 } 731 p->u.board.v_addr = 1; 732 break; 733 734 case PCIINFO: /* pci information */ 735 if (p->type != BNODE) { 736 pr_err("memory address only valid for boards"); 737 return -1; 738 } 739 s = dgap_getword(in); 740 if (!s) { 741 pr_err("unexpected end of file"); 742 return -1; 743 } 744 p->u.board.pcibusstr = kstrdup(s, GFP_KERNEL); 745 if (kstrtoul(s, 0, &p->u.board.pcibus)) { 746 pr_err("bad number for pci bus"); 747 return -1; 748 } 749 p->u.board.v_pcibus = 1; 750 s = dgap_getword(in); 751 if (!s) { 752 pr_err("unexpected end of file"); 753 return -1; 754 } 755 p->u.board.pcislotstr = kstrdup(s, GFP_KERNEL); 756 if (kstrtoul(s, 0, &p->u.board.pcislot)) { 757 pr_err("bad number for pci slot"); 758 return -1; 759 } 760 p->u.board.v_pcislot = 1; 761 break; 762 763 case METHOD: 764 if (p->type != BNODE) { 765 pr_err("install method only valid for boards"); 766 return -1; 767 } 768 s = dgap_getword(in); 769 if (!s) { 770 pr_err("unexpected end of file"); 771 return -1; 772 } 773 p->u.board.method = kstrdup(s, GFP_KERNEL); 774 p->u.board.v_method = 1; 775 break; 776 777 case STATUS: 778 if (p->type != BNODE) { 779 pr_err("config status only valid for boards"); 780 return -1; 781 } 782 s = dgap_getword(in); 783 if (!s) { 784 pr_err("unexpected end of file"); 785 return -1; 786 } 787 p->u.board.status = kstrdup(s, GFP_KERNEL); 788 break; 789 790 case NPORTS: /* number of ports */ 791 if (p->type == BNODE) { 792 s = dgap_getword(in); 793 if (!s) { 794 pr_err("unexpected end of file"); 795 return -1; 796 } 797 if (kstrtol(s, 0, &p->u.board.nport)) { 798 pr_err("bad number for number of ports"); 799 return -1; 800 } 801 p->u.board.v_nport = 1; 802 } else if (p->type == CNODE) { 803 s = dgap_getword(in); 804 if (!s) { 805 pr_err("unexpected end of file"); 806 return -1; 807 } 808 if (kstrtol(s, 0, &p->u.conc.nport)) { 809 pr_err("bad number for number of ports"); 810 return -1; 811 } 812 p->u.conc.v_nport = 1; 813 } else if (p->type == MNODE) { 814 s = dgap_getword(in); 815 if (!s) { 816 pr_err("unexpected end of file"); 817 return -1; 818 } 819 if (kstrtol(s, 0, &p->u.module.nport)) { 820 pr_err("bad number for number of ports"); 821 return -1; 822 } 823 p->u.module.v_nport = 1; 824 } else { 825 pr_err("nports only valid for concentrators or modules"); 826 return -1; 827 } 828 break; 829 830 case ID: /* letter ID used in tty name */ 831 s = dgap_getword(in); 832 if (!s) { 833 pr_err("unexpected end of file"); 834 return -1; 835 } 836 837 p->u.board.status = kstrdup(s, GFP_KERNEL); 838 839 if (p->type == CNODE) { 840 p->u.conc.id = kstrdup(s, GFP_KERNEL); 841 p->u.conc.v_id = 1; 842 } else if (p->type == MNODE) { 843 p->u.module.id = kstrdup(s, GFP_KERNEL); 844 p->u.module.v_id = 1; 845 } else { 846 pr_err("id only valid for concentrators or modules"); 847 return -1; 848 } 849 break; 850 851 case STARTO: /* start offset of ID */ 852 if (p->type == BNODE) { 853 s = dgap_getword(in); 854 if (!s) { 855 pr_err("unexpected end of file"); 856 return -1; 857 } 858 if (kstrtol(s, 0, &p->u.board.start)) { 859 pr_err("bad number for start of tty count"); 860 return -1; 861 } 862 p->u.board.v_start = 1; 863 } else if (p->type == CNODE) { 864 s = dgap_getword(in); 865 if (!s) { 866 pr_err("unexpected end of file"); 867 return -1; 868 } 869 if (kstrtol(s, 0, &p->u.conc.start)) { 870 pr_err("bad number for start of tty count"); 871 return -1; 872 } 873 p->u.conc.v_start = 1; 874 } else if (p->type == MNODE) { 875 s = dgap_getword(in); 876 if (!s) { 877 pr_err("unexpected end of file"); 878 return -1; 879 } 880 if (kstrtol(s, 0, &p->u.module.start)) { 881 pr_err("bad number for start of tty count"); 882 return -1; 883 } 884 p->u.module.v_start = 1; 885 } else { 886 pr_err("start only valid for concentrators or modules"); 887 return -1; 888 } 889 break; 890 891 case TTYN: /* tty name prefix */ 892 if (dgap_checknode(p)) 893 return -1; 894 895 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 896 if (!p->next) 897 return -1; 898 899 p = p->next; 900 p->type = TNODE; 901 902 s = dgap_getword(in); 903 if (!s) { 904 pr_err("unexpeced end of file"); 905 return -1; 906 } 907 p->u.ttyname = kstrdup(s, GFP_KERNEL); 908 if (!p->u.ttyname) 909 return -1; 910 911 break; 912 913 case CU: /* cu name prefix */ 914 if (dgap_checknode(p)) 915 return -1; 916 917 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 918 if (!p->next) 919 return -1; 920 921 p = p->next; 922 p->type = CUNODE; 923 924 s = dgap_getword(in); 925 if (!s) { 926 pr_err("unexpeced end of file"); 927 return -1; 928 } 929 p->u.cuname = kstrdup(s, GFP_KERNEL); 930 if (!p->u.cuname) 931 return -1; 932 933 break; 934 935 case LINE: /* line information */ 936 if (dgap_checknode(p)) 937 return -1; 938 if (!brd) { 939 pr_err("must specify board before line info"); 940 return -1; 941 } 942 switch (brd->u.board.type) { 943 case PPCM: 944 pr_err("line not valid for PC/em"); 945 return -1; 946 } 947 948 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 949 if (!p->next) 950 return -1; 951 952 p = p->next; 953 p->type = LNODE; 954 conc = NULL; 955 line = p; 956 linecnt++; 957 break; 958 959 case CONC: /* concentrator information */ 960 if (dgap_checknode(p)) 961 return -1; 962 if (!line) { 963 pr_err("must specify line info before concentrator"); 964 return -1; 965 } 966 967 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 968 if (!p->next) 969 return -1; 970 971 p = p->next; 972 p->type = CNODE; 973 conc = p; 974 975 if (linecnt) 976 brd->u.board.conc2++; 977 else 978 brd->u.board.conc1++; 979 980 conc_type = dgap_gettok(in); 981 if (conc_type == 0 || (conc_type != CX && 982 conc_type != EPC)) { 983 pr_err("failed to set a type of concentratros"); 984 return -1; 985 } 986 987 p->u.conc.type = conc_type; 988 989 break; 990 991 case MOD: /* EBI module */ 992 if (dgap_checknode(p)) 993 return -1; 994 if (!brd) { 995 pr_err("must specify board info before EBI modules"); 996 return -1; 997 } 998 switch (brd->u.board.type) { 999 case PPCM: 1000 linecnt = 0; 1001 break; 1002 default: 1003 if (!conc) { 1004 pr_err("must specify concentrator info before EBI module"); 1005 return -1; 1006 } 1007 } 1008 1009 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1010 if (!p->next) 1011 return -1; 1012 1013 p = p->next; 1014 p->type = MNODE; 1015 1016 if (linecnt) 1017 brd->u.board.module2++; 1018 else 1019 brd->u.board.module1++; 1020 1021 module_type = dgap_gettok(in); 1022 if (module_type == 0 || (module_type != PORTS && 1023 module_type != MODEM)) { 1024 pr_err("failed to set a type of module"); 1025 return -1; 1026 } 1027 1028 p->u.module.type = module_type; 1029 1030 break; 1031 1032 case CABLE: 1033 if (p->type == LNODE) { 1034 s = dgap_getword(in); 1035 if (!s) { 1036 pr_err("unexpected end of file"); 1037 return -1; 1038 } 1039 p->u.line.cable = kstrdup(s, GFP_KERNEL); 1040 p->u.line.v_cable = 1; 1041 } 1042 break; 1043 1044 case SPEED: /* sync line speed indication */ 1045 if (p->type == LNODE) { 1046 s = dgap_getword(in); 1047 if (!s) { 1048 pr_err("unexpected end of file"); 1049 return -1; 1050 } 1051 if (kstrtol(s, 0, &p->u.line.speed)) { 1052 pr_err("bad number for line speed"); 1053 return -1; 1054 } 1055 p->u.line.v_speed = 1; 1056 } else if (p->type == CNODE) { 1057 s = dgap_getword(in); 1058 if (!s) { 1059 pr_err("unexpected end of file"); 1060 return -1; 1061 } 1062 if (kstrtol(s, 0, &p->u.conc.speed)) { 1063 pr_err("bad number for line speed"); 1064 return -1; 1065 } 1066 p->u.conc.v_speed = 1; 1067 } else { 1068 pr_err("speed valid only for lines or concentrators."); 1069 return -1; 1070 } 1071 break; 1072 1073 case CONNECT: 1074 if (p->type == CNODE) { 1075 s = dgap_getword(in); 1076 if (!s) { 1077 pr_err("unexpected end of file"); 1078 return -1; 1079 } 1080 p->u.conc.connect = kstrdup(s, GFP_KERNEL); 1081 p->u.conc.v_connect = 1; 1082 } 1083 break; 1084 case PRINT: /* transparent print name prefix */ 1085 if (dgap_checknode(p)) 1086 return -1; 1087 1088 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1089 if (!p->next) 1090 return -1; 1091 1092 p = p->next; 1093 p->type = PNODE; 1094 1095 s = dgap_getword(in); 1096 if (!s) { 1097 pr_err("unexpeced end of file"); 1098 return -1; 1099 } 1100 p->u.printname = kstrdup(s, GFP_KERNEL); 1101 if (!p->u.printname) 1102 return -1; 1103 1104 break; 1105 1106 case CMAJOR: /* major number */ 1107 if (dgap_checknode(p)) 1108 return -1; 1109 1110 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1111 if (!p->next) 1112 return -1; 1113 1114 p = p->next; 1115 p->type = JNODE; 1116 1117 s = dgap_getword(in); 1118 if (!s) { 1119 pr_err("unexpected end of file"); 1120 return -1; 1121 } 1122 if (kstrtol(s, 0, &p->u.majornumber)) { 1123 pr_err("bad number for major number"); 1124 return -1; 1125 } 1126 break; 1127 1128 case ALTPIN: /* altpin setting */ 1129 if (dgap_checknode(p)) 1130 return -1; 1131 1132 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1133 if (!p->next) 1134 return -1; 1135 1136 p = p->next; 1137 p->type = ANODE; 1138 1139 s = dgap_getword(in); 1140 if (!s) { 1141 pr_err("unexpected end of file"); 1142 return -1; 1143 } 1144 if (kstrtol(s, 0, &p->u.altpin)) { 1145 pr_err("bad number for altpin"); 1146 return -1; 1147 } 1148 break; 1149 1150 case USEINTR: /* enable interrupt setting */ 1151 if (dgap_checknode(p)) 1152 return -1; 1153 1154 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1155 if (!p->next) 1156 return -1; 1157 1158 p = p->next; 1159 p->type = INTRNODE; 1160 s = dgap_getword(in); 1161 if (!s) { 1162 pr_err("unexpected end of file"); 1163 return -1; 1164 } 1165 if (kstrtol(s, 0, &p->u.useintr)) { 1166 pr_err("bad number for useintr"); 1167 return -1; 1168 } 1169 break; 1170 1171 case TTSIZ: /* size of tty structure */ 1172 if (dgap_checknode(p)) 1173 return -1; 1174 1175 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1176 if (!p->next) 1177 return -1; 1178 1179 p = p->next; 1180 p->type = TSNODE; 1181 1182 s = dgap_getword(in); 1183 if (!s) { 1184 pr_err("unexpected end of file"); 1185 return -1; 1186 } 1187 if (kstrtol(s, 0, &p->u.ttysize)) { 1188 pr_err("bad number for ttysize"); 1189 return -1; 1190 } 1191 break; 1192 1193 case CHSIZ: /* channel structure size */ 1194 if (dgap_checknode(p)) 1195 return -1; 1196 1197 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1198 if (!p->next) 1199 return -1; 1200 1201 p = p->next; 1202 p->type = CSNODE; 1203 1204 s = dgap_getword(in); 1205 if (!s) { 1206 pr_err("unexpected end of file"); 1207 return -1; 1208 } 1209 if (kstrtol(s, 0, &p->u.chsize)) { 1210 pr_err("bad number for chsize"); 1211 return -1; 1212 } 1213 break; 1214 1215 case BSSIZ: /* board structure size */ 1216 if (dgap_checknode(p)) 1217 return -1; 1218 1219 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1220 if (!p->next) 1221 return -1; 1222 1223 p = p->next; 1224 p->type = BSNODE; 1225 1226 s = dgap_getword(in); 1227 if (!s) { 1228 pr_err("unexpected end of file"); 1229 return -1; 1230 } 1231 if (kstrtol(s, 0, &p->u.bssize)) { 1232 pr_err("bad number for bssize"); 1233 return -1; 1234 } 1235 break; 1236 1237 case UNTSIZ: /* sched structure size */ 1238 if (dgap_checknode(p)) 1239 return -1; 1240 1241 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1242 if (!p->next) 1243 return -1; 1244 1245 p = p->next; 1246 p->type = USNODE; 1247 1248 s = dgap_getword(in); 1249 if (!s) { 1250 pr_err("unexpected end of file"); 1251 return -1; 1252 } 1253 if (kstrtol(s, 0, &p->u.unsize)) { 1254 pr_err("bad number for schedsize"); 1255 return -1; 1256 } 1257 break; 1258 1259 case F2SIZ: /* f2200 structure size */ 1260 if (dgap_checknode(p)) 1261 return -1; 1262 1263 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1264 if (!p->next) 1265 return -1; 1266 1267 p = p->next; 1268 p->type = FSNODE; 1269 1270 s = dgap_getword(in); 1271 if (!s) { 1272 pr_err("unexpected end of file"); 1273 return -1; 1274 } 1275 if (kstrtol(s, 0, &p->u.f2size)) { 1276 pr_err("bad number for f2200size"); 1277 return -1; 1278 } 1279 break; 1280 1281 case VPSIZ: /* vpix structure size */ 1282 if (dgap_checknode(p)) 1283 return -1; 1284 1285 p->next = kzalloc(sizeof(struct cnode), GFP_KERNEL); 1286 if (!p->next) 1287 return -1; 1288 1289 p = p->next; 1290 p->type = VSNODE; 1291 1292 s = dgap_getword(in); 1293 if (!s) { 1294 pr_err("unexpected end of file"); 1295 return -1; 1296 } 1297 if (kstrtol(s, 0, &p->u.vpixsize)) { 1298 pr_err("bad number for vpixsize"); 1299 return -1; 1300 } 1301 break; 1302 } 1303 } 1304} 1305 1306static void dgap_cleanup_nodes(void) 1307{ 1308 struct cnode *p; 1309 1310 p = &dgap_head; 1311 1312 while (p) { 1313 struct cnode *tmp = p->next; 1314 1315 if (p->type == NULLNODE) { 1316 p = tmp; 1317 continue; 1318 } 1319 1320 switch (p->type) { 1321 case BNODE: 1322 kfree(p->u.board.portstr); 1323 kfree(p->u.board.addrstr); 1324 kfree(p->u.board.pcibusstr); 1325 kfree(p->u.board.pcislotstr); 1326 kfree(p->u.board.method); 1327 break; 1328 case CNODE: 1329 kfree(p->u.conc.id); 1330 kfree(p->u.conc.connect); 1331 break; 1332 case MNODE: 1333 kfree(p->u.module.id); 1334 break; 1335 case TNODE: 1336 kfree(p->u.ttyname); 1337 break; 1338 case CUNODE: 1339 kfree(p->u.cuname); 1340 break; 1341 case LNODE: 1342 kfree(p->u.line.cable); 1343 break; 1344 case PNODE: 1345 kfree(p->u.printname); 1346 break; 1347 } 1348 1349 kfree(p->u.board.status); 1350 kfree(p); 1351 p = tmp; 1352 } 1353} 1354 1355/* 1356 * Retrives the current custom baud rate from FEP memory, 1357 * and returns it back to the user. 1358 * Returns 0 on error. 1359 */ 1360static uint dgap_get_custom_baud(struct channel_t *ch) 1361{ 1362 u8 __iomem *vaddr; 1363 ulong offset; 1364 1365 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 1366 return 0; 1367 1368 if (!ch->ch_bd || ch->ch_bd->magic != DGAP_BOARD_MAGIC) 1369 return 0; 1370 1371 if (!(ch->ch_bd->bd_flags & BD_FEP5PLUS)) 1372 return 0; 1373 1374 vaddr = ch->ch_bd->re_map_membase; 1375 1376 if (!vaddr) 1377 return 0; 1378 1379 /* 1380 * Go get from fep mem, what the fep 1381 * believes the custom baud rate is. 1382 */ 1383 offset = (ioread16(vaddr + ECS_SEG) << 4) + (ch->ch_portnum * 0x28) 1384 + LINE_SPEED; 1385 1386 return readw(vaddr + offset); 1387} 1388 1389/* 1390 * Remap PCI memory. 1391 */ 1392static int dgap_remap(struct board_t *brd) 1393{ 1394 if (!brd || brd->magic != DGAP_BOARD_MAGIC) 1395 return -EIO; 1396 1397 if (!request_mem_region(brd->membase, 0x200000, "dgap")) 1398 return -ENOMEM; 1399 1400 if (!request_mem_region(brd->membase + PCI_IO_OFFSET, 0x200000, 1401 "dgap")) 1402 goto err_req_mem; 1403 1404 brd->re_map_membase = ioremap(brd->membase, 0x200000); 1405 if (!brd->re_map_membase) 1406 goto err_remap_mem; 1407 1408 brd->re_map_port = ioremap((brd->membase + PCI_IO_OFFSET), 0x200000); 1409 if (!brd->re_map_port) 1410 goto err_remap_port; 1411 1412 return 0; 1413 1414err_remap_port: 1415 iounmap(brd->re_map_membase); 1416err_remap_mem: 1417 release_mem_region(brd->membase + PCI_IO_OFFSET, 0x200000); 1418err_req_mem: 1419 release_mem_region(brd->membase, 0x200000); 1420 1421 return -ENOMEM; 1422} 1423 1424static void dgap_unmap(struct board_t *brd) 1425{ 1426 iounmap(brd->re_map_port); 1427 iounmap(brd->re_map_membase); 1428 release_mem_region(brd->membase + PCI_IO_OFFSET, 0x200000); 1429 release_mem_region(brd->membase, 0x200000); 1430} 1431 1432/* 1433 * dgap_parity_scan() 1434 * 1435 * Convert the FEP5 way of reporting parity errors and breaks into 1436 * the Linux line discipline way. 1437 */ 1438static void dgap_parity_scan(struct channel_t *ch, unsigned char *cbuf, 1439 unsigned char *fbuf, int *len) 1440{ 1441 int l = *len; 1442 int count = 0; 1443 unsigned char *in, *cout, *fout; 1444 unsigned char c; 1445 1446 in = cbuf; 1447 cout = cbuf; 1448 fout = fbuf; 1449 1450 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 1451 return; 1452 1453 while (l--) { 1454 c = *in++; 1455 switch (ch->pscan_state) { 1456 default: 1457 /* reset to sanity and fall through */ 1458 ch->pscan_state = 0; 1459 1460 case 0: 1461 /* No FF seen yet */ 1462 if (c == (unsigned char) '\377') 1463 /* delete this character from stream */ 1464 ch->pscan_state = 1; 1465 else { 1466 *cout++ = c; 1467 *fout++ = TTY_NORMAL; 1468 count += 1; 1469 } 1470 break; 1471 1472 case 1: 1473 /* first FF seen */ 1474 if (c == (unsigned char) '\377') { 1475 /* doubled ff, transform to single ff */ 1476 *cout++ = c; 1477 *fout++ = TTY_NORMAL; 1478 count += 1; 1479 ch->pscan_state = 0; 1480 } else { 1481 /* save value examination in next state */ 1482 ch->pscan_savechar = c; 1483 ch->pscan_state = 2; 1484 } 1485 break; 1486 1487 case 2: 1488 /* third character of ff sequence */ 1489 1490 *cout++ = c; 1491 1492 if (ch->pscan_savechar == 0x0) { 1493 1494 if (c == 0x0) { 1495 ch->ch_err_break++; 1496 *fout++ = TTY_BREAK; 1497 } else { 1498 ch->ch_err_parity++; 1499 *fout++ = TTY_PARITY; 1500 } 1501 } 1502 1503 count += 1; 1504 ch->pscan_state = 0; 1505 } 1506 } 1507 *len = count; 1508} 1509 1510/*======================================================================= 1511 * 1512 * dgap_input - Process received data. 1513 * 1514 * ch - Pointer to channel structure. 1515 * 1516 *=======================================================================*/ 1517 1518static void dgap_input(struct channel_t *ch) 1519{ 1520 struct board_t *bd; 1521 struct bs_t __iomem *bs; 1522 struct tty_struct *tp; 1523 struct tty_ldisc *ld; 1524 uint rmask; 1525 uint head; 1526 uint tail; 1527 int data_len; 1528 ulong lock_flags; 1529 ulong lock_flags2; 1530 int flip_len; 1531 int len; 1532 int n; 1533 u8 *buf; 1534 u8 tmpchar; 1535 int s; 1536 1537 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 1538 return; 1539 1540 tp = ch->ch_tun.un_tty; 1541 1542 bs = ch->ch_bs; 1543 if (!bs) 1544 return; 1545 1546 bd = ch->ch_bd; 1547 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 1548 return; 1549 1550 spin_lock_irqsave(&bd->bd_lock, lock_flags); 1551 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 1552 1553 /* 1554 * Figure the number of characters in the buffer. 1555 * Exit immediately if none. 1556 */ 1557 1558 rmask = ch->ch_rsize - 1; 1559 1560 head = readw(&(bs->rx_head)); 1561 head &= rmask; 1562 tail = readw(&(bs->rx_tail)); 1563 tail &= rmask; 1564 1565 data_len = (head - tail) & rmask; 1566 1567 if (data_len == 0) { 1568 writeb(1, &(bs->idata)); 1569 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 1570 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 1571 return; 1572 } 1573 1574 /* 1575 * If the device is not open, or CREAD is off, flush 1576 * input data and return immediately. 1577 */ 1578 if ((bd->state != BOARD_READY) || !tp || 1579 (tp->magic != TTY_MAGIC) || 1580 !(ch->ch_tun.un_flags & UN_ISOPEN) || 1581 !(tp->termios.c_cflag & CREAD) || 1582 (ch->ch_tun.un_flags & UN_CLOSING)) { 1583 1584 writew(head, &(bs->rx_tail)); 1585 writeb(1, &(bs->idata)); 1586 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 1587 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 1588 return; 1589 } 1590 1591 /* 1592 * If we are throttled, simply don't read any data. 1593 */ 1594 if (ch->ch_flags & CH_RXBLOCK) { 1595 writeb(1, &(bs->idata)); 1596 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 1597 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 1598 return; 1599 } 1600 1601 /* 1602 * Ignore oruns. 1603 */ 1604 tmpchar = readb(&(bs->orun)); 1605 if (tmpchar) { 1606 ch->ch_err_overrun++; 1607 writeb(0, &(bs->orun)); 1608 } 1609 1610 /* Decide how much data we can send into the tty layer */ 1611 flip_len = TTY_FLIPBUF_SIZE; 1612 1613 /* Chop down the length, if needed */ 1614 len = min(data_len, flip_len); 1615 len = min(len, (N_TTY_BUF_SIZE - 1)); 1616 1617 ld = tty_ldisc_ref(tp); 1618 1619#ifdef TTY_DONT_FLIP 1620 /* 1621 * If the DONT_FLIP flag is on, don't flush our buffer, and act 1622 * like the ld doesn't have any space to put the data right now. 1623 */ 1624 if (test_bit(TTY_DONT_FLIP, &tp->flags)) 1625 len = 0; 1626#endif 1627 1628 /* 1629 * If we were unable to get a reference to the ld, 1630 * don't flush our buffer, and act like the ld doesn't 1631 * have any space to put the data right now. 1632 */ 1633 if (!ld) { 1634 len = 0; 1635 } else { 1636 /* 1637 * If ld doesn't have a pointer to a receive_buf function, 1638 * flush the data, then act like the ld doesn't have any 1639 * space to put the data right now. 1640 */ 1641 if (!ld->ops->receive_buf) { 1642 writew(head, &(bs->rx_tail)); 1643 len = 0; 1644 } 1645 } 1646 1647 if (len <= 0) { 1648 writeb(1, &(bs->idata)); 1649 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 1650 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 1651 if (ld) 1652 tty_ldisc_deref(ld); 1653 return; 1654 } 1655 1656 buf = ch->ch_bd->flipbuf; 1657 n = len; 1658 1659 /* 1660 * n now contains the most amount of data we can copy, 1661 * bounded either by our buffer size or the amount 1662 * of data the card actually has pending... 1663 */ 1664 while (n) { 1665 1666 s = ((head >= tail) ? head : ch->ch_rsize) - tail; 1667 s = min(s, n); 1668 1669 if (s <= 0) 1670 break; 1671 1672 memcpy_fromio(buf, ch->ch_raddr + tail, s); 1673 1674 tail += s; 1675 buf += s; 1676 1677 n -= s; 1678 /* Flip queue if needed */ 1679 tail &= rmask; 1680 } 1681 1682 writew(tail, &(bs->rx_tail)); 1683 writeb(1, &(bs->idata)); 1684 ch->ch_rxcount += len; 1685 1686 /* 1687 * If we are completely raw, we don't need to go through a lot 1688 * of the tty layers that exist. 1689 * In this case, we take the shortest and fastest route we 1690 * can to relay the data to the user. 1691 * 1692 * On the other hand, if we are not raw, we need to go through 1693 * the tty layer, which has its API more well defined. 1694 */ 1695 if (I_PARMRK(tp) || I_BRKINT(tp) || I_INPCK(tp)) { 1696 dgap_parity_scan(ch, ch->ch_bd->flipbuf, 1697 ch->ch_bd->flipflagbuf, &len); 1698 1699 len = tty_buffer_request_room(tp->port, len); 1700 tty_insert_flip_string_flags(tp->port, ch->ch_bd->flipbuf, 1701 ch->ch_bd->flipflagbuf, len); 1702 } else { 1703 len = tty_buffer_request_room(tp->port, len); 1704 tty_insert_flip_string(tp->port, ch->ch_bd->flipbuf, len); 1705 } 1706 1707 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 1708 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 1709 1710 /* Tell the tty layer its okay to "eat" the data now */ 1711 tty_flip_buffer_push(tp->port); 1712 1713 if (ld) 1714 tty_ldisc_deref(ld); 1715 1716} 1717 1718static void dgap_write_wakeup(struct board_t *bd, struct channel_t *ch, 1719 struct un_t *un, u32 mask, 1720 unsigned long *irq_flags1, 1721 unsigned long *irq_flags2) 1722{ 1723 if (!(un->un_flags & mask)) 1724 return; 1725 1726 un->un_flags &= ~mask; 1727 1728 if (!(un->un_flags & UN_ISOPEN)) 1729 return; 1730 1731 if ((un->un_tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && 1732 un->un_tty->ldisc->ops->write_wakeup) { 1733 spin_unlock_irqrestore(&ch->ch_lock, *irq_flags2); 1734 spin_unlock_irqrestore(&bd->bd_lock, *irq_flags1); 1735 1736 (un->un_tty->ldisc->ops->write_wakeup)(un->un_tty); 1737 1738 spin_lock_irqsave(&bd->bd_lock, *irq_flags1); 1739 spin_lock_irqsave(&ch->ch_lock, *irq_flags2); 1740 } 1741 wake_up_interruptible(&un->un_tty->write_wait); 1742 wake_up_interruptible(&un->un_flags_wait); 1743} 1744 1745/************************************************************************ 1746 * Determines when CARRIER changes state and takes appropriate 1747 * action. 1748 ************************************************************************/ 1749static void dgap_carrier(struct channel_t *ch) 1750{ 1751 struct board_t *bd; 1752 1753 int virt_carrier = 0; 1754 int phys_carrier = 0; 1755 1756 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 1757 return; 1758 1759 bd = ch->ch_bd; 1760 1761 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 1762 return; 1763 1764 /* Make sure altpin is always set correctly */ 1765 if (ch->ch_digi.digi_flags & DIGI_ALTPIN) { 1766 ch->ch_dsr = DM_CD; 1767 ch->ch_cd = DM_DSR; 1768 } else { 1769 ch->ch_dsr = DM_DSR; 1770 ch->ch_cd = DM_CD; 1771 } 1772 1773 if (ch->ch_mistat & D_CD(ch)) 1774 phys_carrier = 1; 1775 1776 if (ch->ch_digi.digi_flags & DIGI_FORCEDCD) 1777 virt_carrier = 1; 1778 1779 if (ch->ch_c_cflag & CLOCAL) 1780 virt_carrier = 1; 1781 1782 /* 1783 * Test for a VIRTUAL carrier transition to HIGH. 1784 */ 1785 if (((ch->ch_flags & CH_FCAR) == 0) && (virt_carrier == 1)) { 1786 1787 /* 1788 * When carrier rises, wake any threads waiting 1789 * for carrier in the open routine. 1790 */ 1791 1792 if (waitqueue_active(&(ch->ch_flags_wait))) 1793 wake_up_interruptible(&ch->ch_flags_wait); 1794 } 1795 1796 /* 1797 * Test for a PHYSICAL carrier transition to HIGH. 1798 */ 1799 if (((ch->ch_flags & CH_CD) == 0) && (phys_carrier == 1)) { 1800 1801 /* 1802 * When carrier rises, wake any threads waiting 1803 * for carrier in the open routine. 1804 */ 1805 1806 if (waitqueue_active(&(ch->ch_flags_wait))) 1807 wake_up_interruptible(&ch->ch_flags_wait); 1808 } 1809 1810 /* 1811 * Test for a PHYSICAL transition to low, so long as we aren't 1812 * currently ignoring physical transitions (which is what "virtual 1813 * carrier" indicates). 1814 * 1815 * The transition of the virtual carrier to low really doesn't 1816 * matter... it really only means "ignore carrier state", not 1817 * "make pretend that carrier is there". 1818 */ 1819 if ((virt_carrier == 0) && 1820 ((ch->ch_flags & CH_CD) != 0) && 1821 (phys_carrier == 0)) { 1822 1823 /* 1824 * When carrier drops: 1825 * 1826 * Drop carrier on all open units. 1827 * 1828 * Flush queues, waking up any task waiting in the 1829 * line discipline. 1830 * 1831 * Send a hangup to the control terminal. 1832 * 1833 * Enable all select calls. 1834 */ 1835 if (waitqueue_active(&(ch->ch_flags_wait))) 1836 wake_up_interruptible(&ch->ch_flags_wait); 1837 1838 if (ch->ch_tun.un_open_count > 0) 1839 tty_hangup(ch->ch_tun.un_tty); 1840 1841 if (ch->ch_pun.un_open_count > 0) 1842 tty_hangup(ch->ch_pun.un_tty); 1843 } 1844 1845 /* 1846 * Make sure that our cached values reflect the current reality. 1847 */ 1848 if (virt_carrier == 1) 1849 ch->ch_flags |= CH_FCAR; 1850 else 1851 ch->ch_flags &= ~CH_FCAR; 1852 1853 if (phys_carrier == 1) 1854 ch->ch_flags |= CH_CD; 1855 else 1856 ch->ch_flags &= ~CH_CD; 1857} 1858 1859/*======================================================================= 1860 * 1861 * dgap_event - FEP to host event processing routine. 1862 * 1863 * bd - Board of current event. 1864 * 1865 *=======================================================================*/ 1866static int dgap_event(struct board_t *bd) 1867{ 1868 struct channel_t *ch; 1869 ulong lock_flags; 1870 ulong lock_flags2; 1871 struct bs_t __iomem *bs; 1872 u8 __iomem *event; 1873 u8 __iomem *vaddr; 1874 struct ev_t __iomem *eaddr; 1875 uint head; 1876 uint tail; 1877 int port; 1878 int reason; 1879 int modem; 1880 int b1; 1881 1882 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 1883 return -EIO; 1884 1885 spin_lock_irqsave(&bd->bd_lock, lock_flags); 1886 1887 vaddr = bd->re_map_membase; 1888 1889 if (!vaddr) { 1890 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 1891 return -EIO; 1892 } 1893 1894 eaddr = (struct ev_t __iomem *) (vaddr + EVBUF); 1895 1896 /* Get our head and tail */ 1897 head = readw(&(eaddr->ev_head)); 1898 tail = readw(&(eaddr->ev_tail)); 1899 1900 /* 1901 * Forget it if pointers out of range. 1902 */ 1903 1904 if (head >= EVMAX - EVSTART || tail >= EVMAX - EVSTART || 1905 (head | tail) & 03) { 1906 /* Let go of board lock */ 1907 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 1908 return -EIO; 1909 } 1910 1911 /* 1912 * Loop to process all the events in the buffer. 1913 */ 1914 while (tail != head) { 1915 1916 /* 1917 * Get interrupt information. 1918 */ 1919 1920 event = bd->re_map_membase + tail + EVSTART; 1921 1922 port = ioread8(event); 1923 reason = ioread8(event + 1); 1924 modem = ioread8(event + 2); 1925 b1 = ioread8(event + 3); 1926 1927 /* 1928 * Make sure the interrupt is valid. 1929 */ 1930 if (port >= bd->nasync) 1931 goto next; 1932 1933 if (!(reason & (IFMODEM | IFBREAK | IFTLW | IFTEM | IFDATA))) 1934 goto next; 1935 1936 ch = bd->channels[port]; 1937 1938 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 1939 goto next; 1940 1941 /* 1942 * If we have made it here, the event was valid. 1943 * Lock down the channel. 1944 */ 1945 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 1946 1947 bs = ch->ch_bs; 1948 1949 if (!bs) { 1950 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 1951 goto next; 1952 } 1953 1954 /* 1955 * Process received data. 1956 */ 1957 if (reason & IFDATA) { 1958 1959 /* 1960 * ALL LOCKS *MUST* BE DROPPED BEFORE CALLING INPUT! 1961 * input could send some data to ld, which in turn 1962 * could do a callback to one of our other functions. 1963 */ 1964 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 1965 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 1966 1967 dgap_input(ch); 1968 1969 spin_lock_irqsave(&bd->bd_lock, lock_flags); 1970 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 1971 1972 if (ch->ch_flags & CH_RACTIVE) 1973 ch->ch_flags |= CH_RENABLE; 1974 else 1975 writeb(1, &(bs->idata)); 1976 1977 if (ch->ch_flags & CH_RWAIT) { 1978 ch->ch_flags &= ~CH_RWAIT; 1979 1980 wake_up_interruptible 1981 (&ch->ch_tun.un_flags_wait); 1982 } 1983 } 1984 1985 /* 1986 * Process Modem change signals. 1987 */ 1988 if (reason & IFMODEM) { 1989 ch->ch_mistat = modem; 1990 dgap_carrier(ch); 1991 } 1992 1993 /* 1994 * Process break. 1995 */ 1996 if (reason & IFBREAK) { 1997 1998 if (ch->ch_tun.un_tty) { 1999 /* A break has been indicated */ 2000 ch->ch_err_break++; 2001 tty_buffer_request_room 2002 (ch->ch_tun.un_tty->port, 1); 2003 tty_insert_flip_char(ch->ch_tun.un_tty->port, 2004 0, TTY_BREAK); 2005 tty_flip_buffer_push(ch->ch_tun.un_tty->port); 2006 } 2007 } 2008 2009 /* 2010 * Process Transmit low. 2011 */ 2012 if (reason & IFTLW) { 2013 dgap_write_wakeup(bd, ch, &ch->ch_tun, UN_LOW, 2014 &lock_flags, &lock_flags2); 2015 dgap_write_wakeup(bd, ch, &ch->ch_pun, UN_LOW, 2016 &lock_flags, &lock_flags2); 2017 if (ch->ch_flags & CH_WLOW) { 2018 ch->ch_flags &= ~CH_WLOW; 2019 wake_up_interruptible(&ch->ch_flags_wait); 2020 } 2021 } 2022 2023 /* 2024 * Process Transmit empty. 2025 */ 2026 if (reason & IFTEM) { 2027 dgap_write_wakeup(bd, ch, &ch->ch_tun, UN_EMPTY, 2028 &lock_flags, &lock_flags2); 2029 dgap_write_wakeup(bd, ch, &ch->ch_pun, UN_EMPTY, 2030 &lock_flags, &lock_flags2); 2031 if (ch->ch_flags & CH_WEMPTY) { 2032 ch->ch_flags &= ~CH_WEMPTY; 2033 wake_up_interruptible(&ch->ch_flags_wait); 2034 } 2035 } 2036 2037 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 2038 2039next: 2040 tail = (tail + 4) & (EVMAX - EVSTART - 4); 2041 } 2042 2043 writew(tail, &(eaddr->ev_tail)); 2044 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 2045 2046 return 0; 2047} 2048 2049/* 2050 * Our board poller function. 2051 */ 2052static void dgap_poll_tasklet(unsigned long data) 2053{ 2054 struct board_t *bd = (struct board_t *) data; 2055 ulong lock_flags; 2056 char __iomem *vaddr; 2057 u16 head, tail; 2058 2059 if (!bd || (bd->magic != DGAP_BOARD_MAGIC)) 2060 return; 2061 2062 if (bd->inhibit_poller) 2063 return; 2064 2065 spin_lock_irqsave(&bd->bd_lock, lock_flags); 2066 2067 vaddr = bd->re_map_membase; 2068 2069 /* 2070 * If board is ready, parse deeper to see if there is anything to do. 2071 */ 2072 if (bd->state == BOARD_READY) { 2073 2074 struct ev_t __iomem *eaddr; 2075 2076 if (!bd->re_map_membase) { 2077 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 2078 return; 2079 } 2080 if (!bd->re_map_port) { 2081 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 2082 return; 2083 } 2084 2085 if (!bd->nasync) 2086 goto out; 2087 2088 eaddr = (struct ev_t __iomem *) (vaddr + EVBUF); 2089 2090 /* Get our head and tail */ 2091 head = readw(&(eaddr->ev_head)); 2092 tail = readw(&(eaddr->ev_tail)); 2093 2094 /* 2095 * If there is an event pending. Go service it. 2096 */ 2097 if (head != tail) { 2098 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 2099 dgap_event(bd); 2100 spin_lock_irqsave(&bd->bd_lock, lock_flags); 2101 } 2102 2103out: 2104 /* 2105 * If board is doing interrupts, ACK the interrupt. 2106 */ 2107 if (bd && bd->intr_running) 2108 readb(bd->re_map_port + 2); 2109 2110 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 2111 return; 2112 } 2113 2114 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 2115} 2116 2117/* 2118 * dgap_found_board() 2119 * 2120 * A board has been found, init it. 2121 */ 2122static struct board_t *dgap_found_board(struct pci_dev *pdev, int id, 2123 int boardnum) 2124{ 2125 struct board_t *brd; 2126 unsigned int pci_irq; 2127 int i; 2128 int ret; 2129 2130 /* get the board structure and prep it */ 2131 brd = kzalloc(sizeof(struct board_t), GFP_KERNEL); 2132 if (!brd) 2133 return ERR_PTR(-ENOMEM); 2134 2135 /* store the info for the board we've found */ 2136 brd->magic = DGAP_BOARD_MAGIC; 2137 brd->boardnum = boardnum; 2138 brd->vendor = dgap_pci_tbl[id].vendor; 2139 brd->device = dgap_pci_tbl[id].device; 2140 brd->pdev = pdev; 2141 brd->pci_bus = pdev->bus->number; 2142 brd->pci_slot = PCI_SLOT(pdev->devfn); 2143 brd->name = dgap_ids[id].name; 2144 brd->maxports = dgap_ids[id].maxports; 2145 brd->type = dgap_ids[id].config_type; 2146 brd->dpatype = dgap_ids[id].dpatype; 2147 brd->dpastatus = BD_NOFEP; 2148 init_waitqueue_head(&brd->state_wait); 2149 2150 spin_lock_init(&brd->bd_lock); 2151 2152 brd->inhibit_poller = FALSE; 2153 brd->wait_for_bios = 0; 2154 brd->wait_for_fep = 0; 2155 2156 for (i = 0; i < MAXPORTS; i++) 2157 brd->channels[i] = NULL; 2158 2159 /* store which card & revision we have */ 2160 pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &brd->subvendor); 2161 pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &brd->subdevice); 2162 pci_read_config_byte(pdev, PCI_REVISION_ID, &brd->rev); 2163 2164 pci_irq = pdev->irq; 2165 brd->irq = pci_irq; 2166 2167 /* get the PCI Base Address Registers */ 2168 2169 /* Xr Jupiter and EPC use BAR 2 */ 2170 if (brd->device == PCI_DEV_XRJ_DID || brd->device == PCI_DEV_EPCJ_DID) { 2171 brd->membase = pci_resource_start(pdev, 2); 2172 brd->membase_end = pci_resource_end(pdev, 2); 2173 } 2174 /* Everyone else uses BAR 0 */ 2175 else { 2176 brd->membase = pci_resource_start(pdev, 0); 2177 brd->membase_end = pci_resource_end(pdev, 0); 2178 } 2179 2180 if (!brd->membase) { 2181 ret = -ENODEV; 2182 goto free_brd; 2183 } 2184 2185 if (brd->membase & 1) 2186 brd->membase &= ~3; 2187 else 2188 brd->membase &= ~15; 2189 2190 /* 2191 * On the PCI boards, there is no IO space allocated 2192 * The I/O registers will be in the first 3 bytes of the 2193 * upper 2MB of the 4MB memory space. The board memory 2194 * will be mapped into the low 2MB of the 4MB memory space 2195 */ 2196 brd->port = brd->membase + PCI_IO_OFFSET; 2197 brd->port_end = brd->port + PCI_IO_SIZE_DGAP; 2198 2199 /* 2200 * Special initialization for non-PLX boards 2201 */ 2202 if (brd->device != PCI_DEV_XRJ_DID && brd->device != PCI_DEV_EPCJ_DID) { 2203 unsigned short cmd; 2204 2205 pci_write_config_byte(pdev, 0x40, 0); 2206 pci_write_config_byte(pdev, 0x46, 0); 2207 2208 /* Limit burst length to 2 doubleword transactions */ 2209 pci_write_config_byte(pdev, 0x42, 1); 2210 2211 /* 2212 * Enable IO and mem if not already done. 2213 * This was needed for support on Itanium. 2214 */ 2215 pci_read_config_word(pdev, PCI_COMMAND, &cmd); 2216 cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY); 2217 pci_write_config_word(pdev, PCI_COMMAND, cmd); 2218 } 2219 2220 /* init our poll helper tasklet */ 2221 tasklet_init(&brd->helper_tasklet, dgap_poll_tasklet, 2222 (unsigned long) brd); 2223 2224 ret = dgap_remap(brd); 2225 if (ret) 2226 goto free_brd; 2227 2228 pr_info("dgap: board %d: %s (rev %d), irq %ld\n", 2229 boardnum, brd->name, brd->rev, brd->irq); 2230 2231 return brd; 2232 2233free_brd: 2234 kfree(brd); 2235 2236 return ERR_PTR(ret); 2237} 2238 2239/* 2240 * dgap_intr() 2241 * 2242 * Driver interrupt handler. 2243 */ 2244static irqreturn_t dgap_intr(int irq, void *voidbrd) 2245{ 2246 struct board_t *brd = voidbrd; 2247 2248 if (!brd) 2249 return IRQ_NONE; 2250 2251 /* 2252 * Check to make sure its for us. 2253 */ 2254 if (brd->magic != DGAP_BOARD_MAGIC) 2255 return IRQ_NONE; 2256 2257 brd->intr_count++; 2258 2259 /* 2260 * Schedule tasklet to run at a better time. 2261 */ 2262 tasklet_schedule(&brd->helper_tasklet); 2263 return IRQ_HANDLED; 2264} 2265 2266/***************************************************************************** 2267* 2268* Function: 2269* 2270* dgap_poll_handler 2271* 2272* Author: 2273* 2274* Scott H Kilau 2275* 2276* Parameters: 2277* 2278* dummy -- ignored 2279* 2280* Return Values: 2281* 2282* none 2283* 2284* Description: 2285* 2286* As each timer expires, it determines (a) whether the "transmit" 2287* waiter needs to be woken up, and (b) whether the poller needs to 2288* be rescheduled. 2289* 2290******************************************************************************/ 2291 2292static void dgap_poll_handler(ulong dummy) 2293{ 2294 unsigned int i; 2295 struct board_t *brd; 2296 unsigned long lock_flags; 2297 ulong new_time; 2298 2299 dgap_poll_counter++; 2300 2301 /* 2302 * Do not start the board state machine until 2303 * driver tells us its up and running, and has 2304 * everything it needs. 2305 */ 2306 if (dgap_driver_state != DRIVER_READY) 2307 goto schedule_poller; 2308 2309 /* 2310 * If we have just 1 board, or the system is not SMP, 2311 * then use the typical old style poller. 2312 * Otherwise, use our new tasklet based poller, which should 2313 * speed things up for multiple boards. 2314 */ 2315 if ((dgap_numboards == 1) || (num_online_cpus() <= 1)) { 2316 for (i = 0; i < dgap_numboards; i++) { 2317 2318 brd = dgap_board[i]; 2319 2320 if (brd->state == BOARD_FAILED) 2321 continue; 2322 if (!brd->intr_running) 2323 /* Call the real board poller directly */ 2324 dgap_poll_tasklet((unsigned long) brd); 2325 } 2326 } else { 2327 /* 2328 * Go thru each board, kicking off a 2329 * tasklet for each if needed 2330 */ 2331 for (i = 0; i < dgap_numboards; i++) { 2332 brd = dgap_board[i]; 2333 2334 /* 2335 * Attempt to grab the board lock. 2336 * 2337 * If we can't get it, no big deal, the next poll 2338 * will get it. Basically, I just really don't want 2339 * to spin in here, because I want to kick off my 2340 * tasklets as fast as I can, and then get out the 2341 * poller. 2342 */ 2343 if (!spin_trylock(&brd->bd_lock)) 2344 continue; 2345 2346 /* 2347 * If board is in a failed state, don't bother 2348 * scheduling a tasklet 2349 */ 2350 if (brd->state == BOARD_FAILED) { 2351 spin_unlock(&brd->bd_lock); 2352 continue; 2353 } 2354 2355 /* Schedule a poll helper task */ 2356 if (!brd->intr_running) 2357 tasklet_schedule(&brd->helper_tasklet); 2358 2359 /* 2360 * Can't do DGAP_UNLOCK here, as we don't have 2361 * lock_flags because we did a trylock above. 2362 */ 2363 spin_unlock(&brd->bd_lock); 2364 } 2365 } 2366 2367schedule_poller: 2368 2369 /* 2370 * Schedule ourself back at the nominal wakeup interval. 2371 */ 2372 spin_lock_irqsave(&dgap_poll_lock, lock_flags); 2373 dgap_poll_time += dgap_jiffies_from_ms(dgap_poll_tick); 2374 2375 new_time = dgap_poll_time - jiffies; 2376 2377 if ((ulong) new_time >= 2 * dgap_poll_tick) { 2378 dgap_poll_time = 2379 jiffies + dgap_jiffies_from_ms(dgap_poll_tick); 2380 } 2381 2382 dgap_poll_timer.function = dgap_poll_handler; 2383 dgap_poll_timer.data = 0; 2384 dgap_poll_timer.expires = dgap_poll_time; 2385 spin_unlock_irqrestore(&dgap_poll_lock, lock_flags); 2386 2387 if (!dgap_poll_stop) 2388 add_timer(&dgap_poll_timer); 2389} 2390 2391/*======================================================================= 2392 * 2393 * dgap_cmdb - Sends a 2 byte command to the FEP. 2394 * 2395 * ch - Pointer to channel structure. 2396 * cmd - Command to be sent. 2397 * byte1 - Integer containing first byte to be sent. 2398 * byte2 - Integer containing second byte to be sent. 2399 * ncmds - Wait until ncmds or fewer cmds are left 2400 * in the cmd buffer before returning. 2401 * 2402 *=======================================================================*/ 2403static void dgap_cmdb(struct channel_t *ch, u8 cmd, u8 byte1, 2404 u8 byte2, uint ncmds) 2405{ 2406 char __iomem *vaddr; 2407 struct __iomem cm_t *cm_addr; 2408 uint count; 2409 uint n; 2410 u16 head; 2411 u16 tail; 2412 2413 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 2414 return; 2415 2416 /* 2417 * Check if board is still alive. 2418 */ 2419 if (ch->ch_bd->state == BOARD_FAILED) 2420 return; 2421 2422 /* 2423 * Make sure the pointers are in range before 2424 * writing to the FEP memory. 2425 */ 2426 vaddr = ch->ch_bd->re_map_membase; 2427 2428 if (!vaddr) 2429 return; 2430 2431 cm_addr = (struct cm_t __iomem *) (vaddr + CMDBUF); 2432 head = readw(&(cm_addr->cm_head)); 2433 2434 /* 2435 * Forget it if pointers out of range. 2436 */ 2437 if (head >= (CMDMAX - CMDSTART) || (head & 03)) { 2438 ch->ch_bd->state = BOARD_FAILED; 2439 return; 2440 } 2441 2442 /* 2443 * Put the data in the circular command buffer. 2444 */ 2445 writeb(cmd, (vaddr + head + CMDSTART + 0)); 2446 writeb((u8) ch->ch_portnum, (vaddr + head + CMDSTART + 1)); 2447 writeb(byte1, (vaddr + head + CMDSTART + 2)); 2448 writeb(byte2, (vaddr + head + CMDSTART + 3)); 2449 2450 head = (head + 4) & (CMDMAX - CMDSTART - 4); 2451 2452 writew(head, &(cm_addr->cm_head)); 2453 2454 /* 2455 * Wait if necessary before updating the head 2456 * pointer to limit the number of outstanding 2457 * commands to the FEP. If the time spent waiting 2458 * is outlandish, declare the FEP dead. 2459 */ 2460 for (count = dgap_count ;;) { 2461 2462 head = readw(&(cm_addr->cm_head)); 2463 tail = readw(&(cm_addr->cm_tail)); 2464 2465 n = (head - tail) & (CMDMAX - CMDSTART - 4); 2466 2467 if (n <= ncmds * sizeof(struct cm_t)) 2468 break; 2469 2470 if (--count == 0) { 2471 ch->ch_bd->state = BOARD_FAILED; 2472 return; 2473 } 2474 udelay(10); 2475 } 2476} 2477 2478/*======================================================================= 2479 * 2480 * dgap_cmdw - Sends a 1 word command to the FEP. 2481 * 2482 * ch - Pointer to channel structure. 2483 * cmd - Command to be sent. 2484 * word - Integer containing word to be sent. 2485 * ncmds - Wait until ncmds or fewer cmds are left 2486 * in the cmd buffer before returning. 2487 * 2488 *=======================================================================*/ 2489static void dgap_cmdw(struct channel_t *ch, u8 cmd, u16 word, uint ncmds) 2490{ 2491 char __iomem *vaddr; 2492 struct __iomem cm_t *cm_addr; 2493 uint count; 2494 uint n; 2495 u16 head; 2496 u16 tail; 2497 2498 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 2499 return; 2500 2501 /* 2502 * Check if board is still alive. 2503 */ 2504 if (ch->ch_bd->state == BOARD_FAILED) 2505 return; 2506 2507 /* 2508 * Make sure the pointers are in range before 2509 * writing to the FEP memory. 2510 */ 2511 vaddr = ch->ch_bd->re_map_membase; 2512 if (!vaddr) 2513 return; 2514 2515 cm_addr = (struct cm_t __iomem *) (vaddr + CMDBUF); 2516 head = readw(&(cm_addr->cm_head)); 2517 2518 /* 2519 * Forget it if pointers out of range. 2520 */ 2521 if (head >= (CMDMAX - CMDSTART) || (head & 03)) { 2522 ch->ch_bd->state = BOARD_FAILED; 2523 return; 2524 } 2525 2526 /* 2527 * Put the data in the circular command buffer. 2528 */ 2529 writeb(cmd, (vaddr + head + CMDSTART + 0)); 2530 writeb((u8) ch->ch_portnum, (vaddr + head + CMDSTART + 1)); 2531 writew((u16) word, (vaddr + head + CMDSTART + 2)); 2532 2533 head = (head + 4) & (CMDMAX - CMDSTART - 4); 2534 2535 writew(head, &(cm_addr->cm_head)); 2536 2537 /* 2538 * Wait if necessary before updating the head 2539 * pointer to limit the number of outstanding 2540 * commands to the FEP. If the time spent waiting 2541 * is outlandish, declare the FEP dead. 2542 */ 2543 for (count = dgap_count ;;) { 2544 2545 head = readw(&(cm_addr->cm_head)); 2546 tail = readw(&(cm_addr->cm_tail)); 2547 2548 n = (head - tail) & (CMDMAX - CMDSTART - 4); 2549 2550 if (n <= ncmds * sizeof(struct cm_t)) 2551 break; 2552 2553 if (--count == 0) { 2554 ch->ch_bd->state = BOARD_FAILED; 2555 return; 2556 } 2557 udelay(10); 2558 } 2559} 2560 2561/*======================================================================= 2562 * 2563 * dgap_cmdw_ext - Sends a extended word command to the FEP. 2564 * 2565 * ch - Pointer to channel structure. 2566 * cmd - Command to be sent. 2567 * word - Integer containing word to be sent. 2568 * ncmds - Wait until ncmds or fewer cmds are left 2569 * in the cmd buffer before returning. 2570 * 2571 *=======================================================================*/ 2572static void dgap_cmdw_ext(struct channel_t *ch, u16 cmd, u16 word, uint ncmds) 2573{ 2574 char __iomem *vaddr; 2575 struct __iomem cm_t *cm_addr; 2576 uint count; 2577 uint n; 2578 u16 head; 2579 u16 tail; 2580 2581 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 2582 return; 2583 2584 /* 2585 * Check if board is still alive. 2586 */ 2587 if (ch->ch_bd->state == BOARD_FAILED) 2588 return; 2589 2590 /* 2591 * Make sure the pointers are in range before 2592 * writing to the FEP memory. 2593 */ 2594 vaddr = ch->ch_bd->re_map_membase; 2595 if (!vaddr) 2596 return; 2597 2598 cm_addr = (struct cm_t __iomem *) (vaddr + CMDBUF); 2599 head = readw(&(cm_addr->cm_head)); 2600 2601 /* 2602 * Forget it if pointers out of range. 2603 */ 2604 if (head >= (CMDMAX - CMDSTART) || (head & 03)) { 2605 ch->ch_bd->state = BOARD_FAILED; 2606 return; 2607 } 2608 2609 /* 2610 * Put the data in the circular command buffer. 2611 */ 2612 2613 /* Write an FF to tell the FEP that we want an extended command */ 2614 writeb((u8) 0xff, (vaddr + head + CMDSTART + 0)); 2615 2616 writeb((u8) ch->ch_portnum, (vaddr + head + CMDSTART + 1)); 2617 writew((u16) cmd, (vaddr + head + CMDSTART + 2)); 2618 2619 /* 2620 * If the second part of the command won't fit, 2621 * put it at the beginning of the circular buffer. 2622 */ 2623 if (((head + 4) >= ((CMDMAX - CMDSTART)) || (head & 03))) 2624 writew((u16) word, (vaddr + CMDSTART)); 2625 else 2626 writew((u16) word, (vaddr + head + CMDSTART + 4)); 2627 2628 head = (head + 8) & (CMDMAX - CMDSTART - 4); 2629 2630 writew(head, &(cm_addr->cm_head)); 2631 2632 /* 2633 * Wait if necessary before updating the head 2634 * pointer to limit the number of outstanding 2635 * commands to the FEP. If the time spent waiting 2636 * is outlandish, declare the FEP dead. 2637 */ 2638 for (count = dgap_count ;;) { 2639 2640 head = readw(&(cm_addr->cm_head)); 2641 tail = readw(&(cm_addr->cm_tail)); 2642 2643 n = (head - tail) & (CMDMAX - CMDSTART - 4); 2644 2645 if (n <= ncmds * sizeof(struct cm_t)) 2646 break; 2647 2648 if (--count == 0) { 2649 ch->ch_bd->state = BOARD_FAILED; 2650 return; 2651 } 2652 udelay(10); 2653 } 2654} 2655 2656/*======================================================================= 2657 * 2658 * dgap_wmove - Write data to FEP buffer. 2659 * 2660 * ch - Pointer to channel structure. 2661 * buf - Poiter to characters to be moved. 2662 * cnt - Number of characters to move. 2663 * 2664 *=======================================================================*/ 2665static void dgap_wmove(struct channel_t *ch, char *buf, uint cnt) 2666{ 2667 int n; 2668 char __iomem *taddr; 2669 struct bs_t __iomem *bs; 2670 u16 head; 2671 2672 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 2673 return; 2674 2675 /* 2676 * Check parameters. 2677 */ 2678 bs = ch->ch_bs; 2679 head = readw(&(bs->tx_head)); 2680 2681 /* 2682 * If pointers are out of range, just return. 2683 */ 2684 if ((cnt > ch->ch_tsize) || 2685 (unsigned)(head - ch->ch_tstart) >= ch->ch_tsize) 2686 return; 2687 2688 /* 2689 * If the write wraps over the top of the circular buffer, 2690 * move the portion up to the wrap point, and reset the 2691 * pointers to the bottom. 2692 */ 2693 n = ch->ch_tstart + ch->ch_tsize - head; 2694 2695 if (cnt >= n) { 2696 cnt -= n; 2697 taddr = ch->ch_taddr + head; 2698 memcpy_toio(taddr, buf, n); 2699 head = ch->ch_tstart; 2700 buf += n; 2701 } 2702 2703 /* 2704 * Move rest of data. 2705 */ 2706 taddr = ch->ch_taddr + head; 2707 n = cnt; 2708 memcpy_toio(taddr, buf, n); 2709 head += cnt; 2710 2711 writew(head, &(bs->tx_head)); 2712} 2713 2714/* 2715 * Calls the firmware to reset this channel. 2716 */ 2717static void dgap_firmware_reset_port(struct channel_t *ch) 2718{ 2719 dgap_cmdb(ch, CHRESET, 0, 0, 0); 2720 2721 /* 2722 * Now that the channel is reset, we need to make sure 2723 * all the current settings get reapplied to the port 2724 * in the firmware. 2725 * 2726 * So we will set the driver's cache of firmware 2727 * settings all to 0, and then call param. 2728 */ 2729 ch->ch_fepiflag = 0; 2730 ch->ch_fepcflag = 0; 2731 ch->ch_fepoflag = 0; 2732 ch->ch_fepstartc = 0; 2733 ch->ch_fepstopc = 0; 2734 ch->ch_fepastartc = 0; 2735 ch->ch_fepastopc = 0; 2736 ch->ch_mostat = 0; 2737 ch->ch_hflow = 0; 2738} 2739 2740/*======================================================================= 2741 * 2742 * dgap_param - Set Digi parameters. 2743 * 2744 * struct tty_struct * - TTY for port. 2745 * 2746 *=======================================================================*/ 2747static int dgap_param(struct channel_t *ch, struct board_t *bd, u32 un_type) 2748{ 2749 u16 head; 2750 u16 cflag; 2751 u16 iflag; 2752 u8 mval; 2753 u8 hflow; 2754 2755 /* 2756 * If baud rate is zero, flush queues, and set mval to drop DTR. 2757 */ 2758 if ((ch->ch_c_cflag & (CBAUD)) == 0) { 2759 2760 /* flush rx */ 2761 head = readw(&(ch->ch_bs->rx_head)); 2762 writew(head, &(ch->ch_bs->rx_tail)); 2763 2764 /* flush tx */ 2765 head = readw(&(ch->ch_bs->tx_head)); 2766 writew(head, &(ch->ch_bs->tx_tail)); 2767 2768 ch->ch_flags |= (CH_BAUD0); 2769 2770 /* Drop RTS and DTR */ 2771 ch->ch_mval &= ~(D_RTS(ch)|D_DTR(ch)); 2772 mval = D_DTR(ch) | D_RTS(ch); 2773 ch->ch_baud_info = 0; 2774 2775 } else if (ch->ch_custom_speed && (bd->bd_flags & BD_FEP5PLUS)) { 2776 /* 2777 * Tell the fep to do the command 2778 */ 2779 2780 dgap_cmdw_ext(ch, 0xff01, ch->ch_custom_speed, 0); 2781 2782 /* 2783 * Now go get from fep mem, what the fep 2784 * believes the custom baud rate is. 2785 */ 2786 ch->ch_custom_speed = dgap_get_custom_baud(ch); 2787 ch->ch_baud_info = ch->ch_custom_speed; 2788 2789 /* Handle transition from B0 */ 2790 if (ch->ch_flags & CH_BAUD0) { 2791 ch->ch_flags &= ~(CH_BAUD0); 2792 ch->ch_mval |= (D_RTS(ch)|D_DTR(ch)); 2793 } 2794 mval = D_DTR(ch) | D_RTS(ch); 2795 2796 } else { 2797 /* 2798 * Set baud rate, character size, and parity. 2799 */ 2800 2801 2802 int iindex = 0; 2803 int jindex = 0; 2804 int baud = 0; 2805 2806 ulong bauds[4][16] = { 2807 { /* slowbaud */ 2808 0, 50, 75, 110, 2809 134, 150, 200, 300, 2810 600, 1200, 1800, 2400, 2811 4800, 9600, 19200, 38400 }, 2812 { /* slowbaud & CBAUDEX */ 2813 0, 57600, 115200, 230400, 2814 460800, 150, 200, 921600, 2815 600, 1200, 1800, 2400, 2816 4800, 9600, 19200, 38400 }, 2817 { /* fastbaud */ 2818 0, 57600, 76800, 115200, 2819 14400, 57600, 230400, 76800, 2820 115200, 230400, 28800, 460800, 2821 921600, 9600, 19200, 38400 }, 2822 { /* fastbaud & CBAUDEX */ 2823 0, 57600, 115200, 230400, 2824 460800, 150, 200, 921600, 2825 600, 1200, 1800, 2400, 2826 4800, 9600, 19200, 38400 } 2827 }; 2828 2829 /* 2830 * Only use the TXPrint baud rate if the 2831 * terminal unit is NOT open 2832 */ 2833 if (!(ch->ch_tun.un_flags & UN_ISOPEN) && 2834 un_type == DGAP_PRINT) 2835 baud = C_BAUD(ch->ch_pun.un_tty) & 0xff; 2836 else 2837 baud = C_BAUD(ch->ch_tun.un_tty) & 0xff; 2838 2839 if (ch->ch_c_cflag & CBAUDEX) 2840 iindex = 1; 2841 2842 if (ch->ch_digi.digi_flags & DIGI_FAST) 2843 iindex += 2; 2844 2845 jindex = baud; 2846 2847 if ((iindex >= 0) && (iindex < 4) && 2848 (jindex >= 0) && (jindex < 16)) 2849 baud = bauds[iindex][jindex]; 2850 else 2851 baud = 0; 2852 2853 if (baud == 0) 2854 baud = 9600; 2855 2856 ch->ch_baud_info = baud; 2857 2858 /* 2859 * CBAUD has bit position 0x1000 set these days to 2860 * indicate Linux baud rate remap. 2861 * We use a different bit assignment for high speed. 2862 * Clear this bit out while grabbing the parts of 2863 * "cflag" we want. 2864 */ 2865 cflag = ch->ch_c_cflag & ((CBAUD ^ CBAUDEX) | PARODD | PARENB | 2866 CSTOPB | CSIZE); 2867 2868 /* 2869 * HUPCL bit is used by FEP to indicate fast baud 2870 * table is to be used. 2871 */ 2872 if ((ch->ch_digi.digi_flags & DIGI_FAST) || 2873 (ch->ch_c_cflag & CBAUDEX)) 2874 cflag |= HUPCL; 2875 2876 if ((ch->ch_c_cflag & CBAUDEX) && 2877 !(ch->ch_digi.digi_flags & DIGI_FAST)) { 2878 /* 2879 * The below code is trying to guarantee that only 2880 * baud rates 115200, 230400, 460800, 921600 are 2881 * remapped. We use exclusive or because the various 2882 * baud rates share common bit positions and therefore 2883 * can't be tested for easily. 2884 */ 2885 tcflag_t tcflag = (ch->ch_c_cflag & CBAUD) | CBAUDEX; 2886 int baudpart = 0; 2887 2888 /* 2889 * Map high speed requests to index 2890 * into FEP's baud table 2891 */ 2892 switch (tcflag) { 2893 case B57600: 2894 baudpart = 1; 2895 break; 2896#ifdef B76800 2897 case B76800: 2898 baudpart = 2; 2899 break; 2900#endif 2901 case B115200: 2902 baudpart = 3; 2903 break; 2904 case B230400: 2905 baudpart = 9; 2906 break; 2907 case B460800: 2908 baudpart = 11; 2909 break; 2910#ifdef B921600 2911 case B921600: 2912 baudpart = 12; 2913 break; 2914#endif 2915 default: 2916 baudpart = 0; 2917 } 2918 2919 if (baudpart) 2920 cflag = (cflag & ~(CBAUD | CBAUDEX)) | baudpart; 2921 } 2922 2923 cflag &= 0xffff; 2924 2925 if (cflag != ch->ch_fepcflag) { 2926 ch->ch_fepcflag = (u16) (cflag & 0xffff); 2927 2928 /* 2929 * Okay to have channel and board 2930 * locks held calling this 2931 */ 2932 dgap_cmdw(ch, SCFLAG, (u16) cflag, 0); 2933 } 2934 2935 /* Handle transition from B0 */ 2936 if (ch->ch_flags & CH_BAUD0) { 2937 ch->ch_flags &= ~(CH_BAUD0); 2938 ch->ch_mval |= (D_RTS(ch)|D_DTR(ch)); 2939 } 2940 mval = D_DTR(ch) | D_RTS(ch); 2941 } 2942 2943 /* 2944 * Get input flags. 2945 */ 2946 iflag = ch->ch_c_iflag & (IGNBRK | BRKINT | IGNPAR | PARMRK | 2947 INPCK | ISTRIP | IXON | IXANY | IXOFF); 2948 2949 if ((ch->ch_startc == _POSIX_VDISABLE) || 2950 (ch->ch_stopc == _POSIX_VDISABLE)) { 2951 iflag &= ~(IXON | IXOFF); 2952 ch->ch_c_iflag &= ~(IXON | IXOFF); 2953 } 2954 2955 /* 2956 * Only the IBM Xr card can switch between 2957 * 232 and 422 modes on the fly 2958 */ 2959 if (bd->device == PCI_DEV_XR_IBM_DID) { 2960 if (ch->ch_digi.digi_flags & DIGI_422) 2961 dgap_cmdb(ch, SCOMMODE, MODE_422, 0, 0); 2962 else 2963 dgap_cmdb(ch, SCOMMODE, MODE_232, 0, 0); 2964 } 2965 2966 if (ch->ch_digi.digi_flags & DIGI_ALTPIN) 2967 iflag |= IALTPIN; 2968 2969 if (iflag != ch->ch_fepiflag) { 2970 ch->ch_fepiflag = iflag; 2971 2972 /* Okay to have channel and board locks held calling this */ 2973 dgap_cmdw(ch, SIFLAG, (u16) ch->ch_fepiflag, 0); 2974 } 2975 2976 /* 2977 * Select hardware handshaking. 2978 */ 2979 hflow = 0; 2980 2981 if (ch->ch_c_cflag & CRTSCTS) 2982 hflow |= (D_RTS(ch) | D_CTS(ch)); 2983 if (ch->ch_digi.digi_flags & RTSPACE) 2984 hflow |= D_RTS(ch); 2985 if (ch->ch_digi.digi_flags & DTRPACE) 2986 hflow |= D_DTR(ch); 2987 if (ch->ch_digi.digi_flags & CTSPACE) 2988 hflow |= D_CTS(ch); 2989 if (ch->ch_digi.digi_flags & DSRPACE) 2990 hflow |= D_DSR(ch); 2991 if (ch->ch_digi.digi_flags & DCDPACE) 2992 hflow |= D_CD(ch); 2993 2994 if (hflow != ch->ch_hflow) { 2995 ch->ch_hflow = hflow; 2996 2997 /* Okay to have channel and board locks held calling this */ 2998 dgap_cmdb(ch, SHFLOW, (u8) hflow, 0xff, 0); 2999 } 3000 3001 /* 3002 * Set RTS and/or DTR Toggle if needed, 3003 * but only if product is FEP5+ based. 3004 */ 3005 if (bd->bd_flags & BD_FEP5PLUS) { 3006 u16 hflow2 = 0; 3007 3008 if (ch->ch_digi.digi_flags & DIGI_RTS_TOGGLE) 3009 hflow2 |= (D_RTS(ch)); 3010 if (ch->ch_digi.digi_flags & DIGI_DTR_TOGGLE) 3011 hflow2 |= (D_DTR(ch)); 3012 3013 dgap_cmdw_ext(ch, 0xff03, hflow2, 0); 3014 } 3015 3016 /* 3017 * Set modem control lines. 3018 */ 3019 3020 mval ^= ch->ch_mforce & (mval ^ ch->ch_mval); 3021 3022 if (ch->ch_mostat ^ mval) { 3023 ch->ch_mostat = mval; 3024 3025 /* Okay to have channel and board locks held calling this */ 3026 dgap_cmdb(ch, SMODEM, (u8) mval, D_RTS(ch)|D_DTR(ch), 0); 3027 } 3028 3029 /* 3030 * Read modem signals, and then call carrier function. 3031 */ 3032 ch->ch_mistat = readb(&(ch->ch_bs->m_stat)); 3033 dgap_carrier(ch); 3034 3035 /* 3036 * Set the start and stop characters. 3037 */ 3038 if (ch->ch_startc != ch->ch_fepstartc || 3039 ch->ch_stopc != ch->ch_fepstopc) { 3040 ch->ch_fepstartc = ch->ch_startc; 3041 ch->ch_fepstopc = ch->ch_stopc; 3042 3043 /* Okay to have channel and board locks held calling this */ 3044 dgap_cmdb(ch, SFLOWC, ch->ch_fepstartc, ch->ch_fepstopc, 0); 3045 } 3046 3047 /* 3048 * Set the Auxiliary start and stop characters. 3049 */ 3050 if (ch->ch_astartc != ch->ch_fepastartc || 3051 ch->ch_astopc != ch->ch_fepastopc) { 3052 ch->ch_fepastartc = ch->ch_astartc; 3053 ch->ch_fepastopc = ch->ch_astopc; 3054 3055 /* Okay to have channel and board locks held calling this */ 3056 dgap_cmdb(ch, SAFLOWC, ch->ch_fepastartc, ch->ch_fepastopc, 0); 3057 } 3058 3059 return 0; 3060} 3061 3062/* 3063 * dgap_block_til_ready() 3064 * 3065 * Wait for DCD, if needed. 3066 */ 3067static int dgap_block_til_ready(struct tty_struct *tty, struct file *file, 3068 struct channel_t *ch) 3069{ 3070 int retval = 0; 3071 struct un_t *un; 3072 ulong lock_flags; 3073 uint old_flags; 3074 int sleep_on_un_flags; 3075 3076 if (!tty || tty->magic != TTY_MAGIC || !file || !ch || 3077 ch->magic != DGAP_CHANNEL_MAGIC) 3078 return -EIO; 3079 3080 un = tty->driver_data; 3081 if (!un || un->magic != DGAP_UNIT_MAGIC) 3082 return -EIO; 3083 3084 spin_lock_irqsave(&ch->ch_lock, lock_flags); 3085 3086 ch->ch_wopen++; 3087 3088 /* Loop forever */ 3089 while (1) { 3090 3091 sleep_on_un_flags = 0; 3092 3093 /* 3094 * If board has failed somehow during our sleep, 3095 * bail with error. 3096 */ 3097 if (ch->ch_bd->state == BOARD_FAILED) { 3098 retval = -EIO; 3099 break; 3100 } 3101 3102 /* If tty was hung up, break out of loop and set error. */ 3103 if (tty_hung_up_p(file)) { 3104 retval = -EAGAIN; 3105 break; 3106 } 3107 3108 /* 3109 * If either unit is in the middle of the fragile part of close, 3110 * we just cannot touch the channel safely. 3111 * Go back to sleep, knowing that when the channel can be 3112 * touched safely, the close routine will signal the 3113 * ch_wait_flags to wake us back up. 3114 */ 3115 if (!((ch->ch_tun.un_flags | ch->ch_pun.un_flags) & 3116 UN_CLOSING)) { 3117 3118 /* 3119 * Our conditions to leave cleanly and happily: 3120 * 1) NONBLOCKING on the tty is set. 3121 * 2) CLOCAL is set. 3122 * 3) DCD (fake or real) is active. 3123 */ 3124 3125 if (file->f_flags & O_NONBLOCK) 3126 break; 3127 3128 if (tty->flags & (1 << TTY_IO_ERROR)) 3129 break; 3130 3131 if (ch->ch_flags & CH_CD) 3132 break; 3133 3134 if (ch->ch_flags & CH_FCAR) 3135 break; 3136 } else { 3137 sleep_on_un_flags = 1; 3138 } 3139 3140 /* 3141 * If there is a signal pending, the user probably 3142 * interrupted (ctrl-c) us. 3143 * Leave loop with error set. 3144 */ 3145 if (signal_pending(current)) { 3146 retval = -ERESTARTSYS; 3147 break; 3148 } 3149 3150 /* 3151 * Store the flags before we let go of channel lock 3152 */ 3153 if (sleep_on_un_flags) 3154 old_flags = ch->ch_tun.un_flags | ch->ch_pun.un_flags; 3155 else 3156 old_flags = ch->ch_flags; 3157 3158 /* 3159 * Let go of channel lock before calling schedule. 3160 * Our poller will get any FEP events and wake us up when DCD 3161 * eventually goes active. 3162 */ 3163 3164 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 3165 3166 /* 3167 * Wait for something in the flags to change 3168 * from the current value. 3169 */ 3170 if (sleep_on_un_flags) { 3171 retval = wait_event_interruptible(un->un_flags_wait, 3172 (old_flags != (ch->ch_tun.un_flags | 3173 ch->ch_pun.un_flags))); 3174 } else { 3175 retval = wait_event_interruptible(ch->ch_flags_wait, 3176 (old_flags != ch->ch_flags)); 3177 } 3178 3179 /* 3180 * We got woken up for some reason. 3181 * Before looping around, grab our channel lock. 3182 */ 3183 spin_lock_irqsave(&ch->ch_lock, lock_flags); 3184 } 3185 3186 ch->ch_wopen--; 3187 3188 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 3189 3190 return retval; 3191} 3192 3193/* 3194 * dgap_tty_flush_buffer() 3195 * 3196 * Flush Tx buffer (make in == out) 3197 */ 3198static void dgap_tty_flush_buffer(struct tty_struct *tty) 3199{ 3200 struct board_t *bd; 3201 struct channel_t *ch; 3202 struct un_t *un; 3203 ulong lock_flags; 3204 ulong lock_flags2; 3205 u16 head; 3206 3207 if (!tty || tty->magic != TTY_MAGIC) 3208 return; 3209 3210 un = tty->driver_data; 3211 if (!un || un->magic != DGAP_UNIT_MAGIC) 3212 return; 3213 3214 ch = un->un_ch; 3215 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3216 return; 3217 3218 bd = ch->ch_bd; 3219 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 3220 return; 3221 3222 spin_lock_irqsave(&bd->bd_lock, lock_flags); 3223 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 3224 3225 ch->ch_flags &= ~CH_STOP; 3226 head = readw(&(ch->ch_bs->tx_head)); 3227 dgap_cmdw(ch, FLUSHTX, (u16) head, 0); 3228 dgap_cmdw(ch, RESUMETX, 0, 0); 3229 if (ch->ch_tun.un_flags & (UN_LOW|UN_EMPTY)) { 3230 ch->ch_tun.un_flags &= ~(UN_LOW|UN_EMPTY); 3231 wake_up_interruptible(&ch->ch_tun.un_flags_wait); 3232 } 3233 if (ch->ch_pun.un_flags & (UN_LOW|UN_EMPTY)) { 3234 ch->ch_pun.un_flags &= ~(UN_LOW|UN_EMPTY); 3235 wake_up_interruptible(&ch->ch_pun.un_flags_wait); 3236 } 3237 3238 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 3239 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 3240 if (waitqueue_active(&tty->write_wait)) 3241 wake_up_interruptible(&tty->write_wait); 3242 tty_wakeup(tty); 3243} 3244 3245/* 3246 * dgap_tty_hangup() 3247 * 3248 * Hangup the port. Like a close, but don't wait for output to drain. 3249 */ 3250static void dgap_tty_hangup(struct tty_struct *tty) 3251{ 3252 struct board_t *bd; 3253 struct channel_t *ch; 3254 struct un_t *un; 3255 3256 if (!tty || tty->magic != TTY_MAGIC) 3257 return; 3258 3259 un = tty->driver_data; 3260 if (!un || un->magic != DGAP_UNIT_MAGIC) 3261 return; 3262 3263 ch = un->un_ch; 3264 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3265 return; 3266 3267 bd = ch->ch_bd; 3268 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 3269 return; 3270 3271 /* flush the transmit queues */ 3272 dgap_tty_flush_buffer(tty); 3273} 3274 3275/* 3276 * dgap_tty_chars_in_buffer() 3277 * 3278 * Return number of characters that have not been transmitted yet. 3279 * 3280 * This routine is used by the line discipline to determine if there 3281 * is data waiting to be transmitted/drained/flushed or not. 3282 */ 3283static int dgap_tty_chars_in_buffer(struct tty_struct *tty) 3284{ 3285 struct board_t *bd; 3286 struct channel_t *ch; 3287 struct un_t *un; 3288 struct bs_t __iomem *bs; 3289 u8 tbusy; 3290 uint chars; 3291 u16 thead, ttail, tmask, chead, ctail; 3292 ulong lock_flags = 0; 3293 ulong lock_flags2 = 0; 3294 3295 if (!tty) 3296 return 0; 3297 3298 un = tty->driver_data; 3299 if (!un || un->magic != DGAP_UNIT_MAGIC) 3300 return 0; 3301 3302 ch = un->un_ch; 3303 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3304 return 0; 3305 3306 bd = ch->ch_bd; 3307 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 3308 return 0; 3309 3310 bs = ch->ch_bs; 3311 if (!bs) 3312 return 0; 3313 3314 spin_lock_irqsave(&bd->bd_lock, lock_flags); 3315 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 3316 3317 tmask = (ch->ch_tsize - 1); 3318 3319 /* Get Transmit queue pointers */ 3320 thead = readw(&(bs->tx_head)) & tmask; 3321 ttail = readw(&(bs->tx_tail)) & tmask; 3322 3323 /* Get tbusy flag */ 3324 tbusy = readb(&(bs->tbusy)); 3325 3326 /* Get Command queue pointers */ 3327 chead = readw(&(ch->ch_cm->cm_head)); 3328 ctail = readw(&(ch->ch_cm->cm_tail)); 3329 3330 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 3331 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 3332 3333 /* 3334 * The only way we know for sure if there is no pending 3335 * data left to be transferred, is if: 3336 * 1) Transmit head and tail are equal (empty). 3337 * 2) Command queue head and tail are equal (empty). 3338 * 3) The "TBUSY" flag is 0. (Transmitter not busy). 3339 */ 3340 3341 if ((ttail == thead) && (tbusy == 0) && (chead == ctail)) { 3342 chars = 0; 3343 } else { 3344 if (thead >= ttail) 3345 chars = thead - ttail; 3346 else 3347 chars = thead - ttail + ch->ch_tsize; 3348 /* 3349 * Fudge factor here. 3350 * If chars is zero, we know that the command queue had 3351 * something in it or tbusy was set. Because we cannot 3352 * be sure if there is still some data to be transmitted, 3353 * lets lie, and tell ld we have 1 byte left. 3354 */ 3355 if (chars == 0) { 3356 /* 3357 * If TBUSY is still set, and our tx buffers are empty, 3358 * force the firmware to send me another wakeup after 3359 * TBUSY has been cleared. 3360 */ 3361 if (tbusy != 0) { 3362 spin_lock_irqsave(&ch->ch_lock, lock_flags); 3363 un->un_flags |= UN_EMPTY; 3364 writeb(1, &(bs->iempty)); 3365 spin_unlock_irqrestore(&ch->ch_lock, 3366 lock_flags); 3367 } 3368 chars = 1; 3369 } 3370 } 3371 3372 return chars; 3373} 3374 3375static int dgap_wait_for_drain(struct tty_struct *tty) 3376{ 3377 struct channel_t *ch; 3378 struct un_t *un; 3379 struct bs_t __iomem *bs; 3380 int ret = 0; 3381 uint count = 1; 3382 ulong lock_flags = 0; 3383 3384 if (!tty || tty->magic != TTY_MAGIC) 3385 return -EIO; 3386 3387 un = tty->driver_data; 3388 if (!un || un->magic != DGAP_UNIT_MAGIC) 3389 return -EIO; 3390 3391 ch = un->un_ch; 3392 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3393 return -EIO; 3394 3395 bs = ch->ch_bs; 3396 if (!bs) 3397 return -EIO; 3398 3399 /* Loop until data is drained */ 3400 while (count != 0) { 3401 3402 count = dgap_tty_chars_in_buffer(tty); 3403 3404 if (count == 0) 3405 break; 3406 3407 /* Set flag waiting for drain */ 3408 spin_lock_irqsave(&ch->ch_lock, lock_flags); 3409 un->un_flags |= UN_EMPTY; 3410 writeb(1, &(bs->iempty)); 3411 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 3412 3413 /* Go to sleep till we get woken up */ 3414 ret = wait_event_interruptible(un->un_flags_wait, 3415 ((un->un_flags & UN_EMPTY) == 0)); 3416 /* If ret is non-zero, user ctrl-c'ed us */ 3417 if (ret) 3418 break; 3419 } 3420 3421 spin_lock_irqsave(&ch->ch_lock, lock_flags); 3422 un->un_flags &= ~(UN_EMPTY); 3423 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 3424 3425 return ret; 3426} 3427 3428/* 3429 * dgap_maxcps_room 3430 * 3431 * Reduces bytes_available to the max number of characters 3432 * that can be sent currently given the maxcps value, and 3433 * returns the new bytes_available. This only affects printer 3434 * output. 3435 */ 3436static int dgap_maxcps_room(struct channel_t *ch, struct un_t *un, 3437 int bytes_available) 3438{ 3439 /* 3440 * If its not the Transparent print device, return 3441 * the full data amount. 3442 */ 3443 if (un->un_type != DGAP_PRINT) 3444 return bytes_available; 3445 3446 if (ch->ch_digi.digi_maxcps > 0 && ch->ch_digi.digi_bufsize > 0) { 3447 int cps_limit = 0; 3448 unsigned long current_time = jiffies; 3449 unsigned long buffer_time = current_time + 3450 (HZ * ch->ch_digi.digi_bufsize) / 3451 ch->ch_digi.digi_maxcps; 3452 3453 if (ch->ch_cpstime < current_time) { 3454 /* buffer is empty */ 3455 ch->ch_cpstime = current_time; /* reset ch_cpstime */ 3456 cps_limit = ch->ch_digi.digi_bufsize; 3457 } else if (ch->ch_cpstime < buffer_time) { 3458 /* still room in the buffer */ 3459 cps_limit = ((buffer_time - ch->ch_cpstime) * 3460 ch->ch_digi.digi_maxcps) / HZ; 3461 } else { 3462 /* no room in the buffer */ 3463 cps_limit = 0; 3464 } 3465 3466 bytes_available = min(cps_limit, bytes_available); 3467 } 3468 3469 return bytes_available; 3470} 3471 3472static inline void dgap_set_firmware_event(struct un_t *un, unsigned int event) 3473{ 3474 struct channel_t *ch; 3475 struct bs_t __iomem *bs; 3476 3477 if (!un || un->magic != DGAP_UNIT_MAGIC) 3478 return; 3479 ch = un->un_ch; 3480 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3481 return; 3482 bs = ch->ch_bs; 3483 if (!bs) 3484 return; 3485 3486 if ((event & UN_LOW) != 0) { 3487 if ((un->un_flags & UN_LOW) == 0) { 3488 un->un_flags |= UN_LOW; 3489 writeb(1, &(bs->ilow)); 3490 } 3491 } 3492 if ((event & UN_LOW) != 0) { 3493 if ((un->un_flags & UN_EMPTY) == 0) { 3494 un->un_flags |= UN_EMPTY; 3495 writeb(1, &(bs->iempty)); 3496 } 3497 } 3498} 3499 3500/* 3501 * dgap_tty_write_room() 3502 * 3503 * Return space available in Tx buffer 3504 */ 3505static int dgap_tty_write_room(struct tty_struct *tty) 3506{ 3507 struct channel_t *ch; 3508 struct un_t *un; 3509 struct bs_t __iomem *bs; 3510 u16 head, tail, tmask; 3511 int ret; 3512 ulong lock_flags = 0; 3513 3514 if (!tty) 3515 return 0; 3516 3517 un = tty->driver_data; 3518 if (!un || un->magic != DGAP_UNIT_MAGIC) 3519 return 0; 3520 3521 ch = un->un_ch; 3522 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3523 return 0; 3524 3525 bs = ch->ch_bs; 3526 if (!bs) 3527 return 0; 3528 3529 spin_lock_irqsave(&ch->ch_lock, lock_flags); 3530 3531 tmask = ch->ch_tsize - 1; 3532 head = readw(&(bs->tx_head)) & tmask; 3533 tail = readw(&(bs->tx_tail)) & tmask; 3534 3535 ret = tail - head - 1; 3536 if (ret < 0) 3537 ret += ch->ch_tsize; 3538 3539 /* Limit printer to maxcps */ 3540 ret = dgap_maxcps_room(ch, un, ret); 3541 3542 /* 3543 * If we are printer device, leave space for 3544 * possibly both the on and off strings. 3545 */ 3546 if (un->un_type == DGAP_PRINT) { 3547 if (!(ch->ch_flags & CH_PRON)) 3548 ret -= ch->ch_digi.digi_onlen; 3549 ret -= ch->ch_digi.digi_offlen; 3550 } else { 3551 if (ch->ch_flags & CH_PRON) 3552 ret -= ch->ch_digi.digi_offlen; 3553 } 3554 3555 if (ret < 0) 3556 ret = 0; 3557 3558 /* 3559 * Schedule FEP to wake us up if needed. 3560 * 3561 * TODO: This might be overkill... 3562 * Do we really need to schedule callbacks from the FEP 3563 * in every case? Can we get smarter based on ret? 3564 */ 3565 dgap_set_firmware_event(un, UN_LOW | UN_EMPTY); 3566 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 3567 3568 return ret; 3569} 3570 3571/* 3572 * dgap_tty_write() 3573 * 3574 * Take data from the user or kernel and send it out to the FEP. 3575 * In here exists all the Transparent Print magic as well. 3576 */ 3577static int dgap_tty_write(struct tty_struct *tty, const unsigned char *buf, 3578 int count) 3579{ 3580 struct channel_t *ch; 3581 struct un_t *un; 3582 struct bs_t __iomem *bs; 3583 char __iomem *vaddr; 3584 u16 head, tail, tmask, remain; 3585 int bufcount, n; 3586 ulong lock_flags; 3587 3588 if (!tty) 3589 return 0; 3590 3591 un = tty->driver_data; 3592 if (!un || un->magic != DGAP_UNIT_MAGIC) 3593 return 0; 3594 3595 ch = un->un_ch; 3596 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3597 return 0; 3598 3599 bs = ch->ch_bs; 3600 if (!bs) 3601 return 0; 3602 3603 if (!count) 3604 return 0; 3605 3606 spin_lock_irqsave(&ch->ch_lock, lock_flags); 3607 3608 /* Get our space available for the channel from the board */ 3609 tmask = ch->ch_tsize - 1; 3610 head = readw(&(bs->tx_head)) & tmask; 3611 tail = readw(&(bs->tx_tail)) & tmask; 3612 3613 bufcount = tail - head - 1; 3614 if (bufcount < 0) 3615 bufcount += ch->ch_tsize; 3616 3617 /* 3618 * Limit printer output to maxcps overall, with bursts allowed 3619 * up to bufsize characters. 3620 */ 3621 bufcount = dgap_maxcps_room(ch, un, bufcount); 3622 3623 /* 3624 * Take minimum of what the user wants to send, and the 3625 * space available in the FEP buffer. 3626 */ 3627 count = min(count, bufcount); 3628 3629 /* 3630 * Bail if no space left. 3631 */ 3632 if (count <= 0) { 3633 dgap_set_firmware_event(un, UN_LOW | UN_EMPTY); 3634 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 3635 return 0; 3636 } 3637 3638 /* 3639 * Output the printer ON string, if we are in terminal mode, but 3640 * need to be in printer mode. 3641 */ 3642 if ((un->un_type == DGAP_PRINT) && !(ch->ch_flags & CH_PRON)) { 3643 dgap_wmove(ch, ch->ch_digi.digi_onstr, 3644 (int) ch->ch_digi.digi_onlen); 3645 head = readw(&(bs->tx_head)) & tmask; 3646 ch->ch_flags |= CH_PRON; 3647 } 3648 3649 /* 3650 * On the other hand, output the printer OFF string, if we are 3651 * currently in printer mode, but need to output to the terminal. 3652 */ 3653 if ((un->un_type != DGAP_PRINT) && (ch->ch_flags & CH_PRON)) { 3654 dgap_wmove(ch, ch->ch_digi.digi_offstr, 3655 (int) ch->ch_digi.digi_offlen); 3656 head = readw(&(bs->tx_head)) & tmask; 3657 ch->ch_flags &= ~CH_PRON; 3658 } 3659 3660 n = count; 3661 3662 /* 3663 * If the write wraps over the top of the circular buffer, 3664 * move the portion up to the wrap point, and reset the 3665 * pointers to the bottom. 3666 */ 3667 remain = ch->ch_tstart + ch->ch_tsize - head; 3668 3669 if (n >= remain) { 3670 n -= remain; 3671 vaddr = ch->ch_taddr + head; 3672 3673 memcpy_toio(vaddr, (u8 *) buf, remain); 3674 3675 head = ch->ch_tstart; 3676 buf += remain; 3677 } 3678 3679 if (n > 0) { 3680 3681 /* 3682 * Move rest of data. 3683 */ 3684 vaddr = ch->ch_taddr + head; 3685 remain = n; 3686 3687 memcpy_toio(vaddr, (u8 *) buf, remain); 3688 head += remain; 3689 3690 } 3691 3692 if (count) { 3693 ch->ch_txcount += count; 3694 head &= tmask; 3695 writew(head, &(bs->tx_head)); 3696 } 3697 3698 dgap_set_firmware_event(un, UN_LOW | UN_EMPTY); 3699 3700 /* 3701 * If this is the print device, and the 3702 * printer is still on, we need to turn it 3703 * off before going idle. If the buffer is 3704 * non-empty, wait until it goes empty. 3705 * Otherwise turn it off right now. 3706 */ 3707 if ((un->un_type == DGAP_PRINT) && (ch->ch_flags & CH_PRON)) { 3708 tail = readw(&(bs->tx_tail)) & tmask; 3709 3710 if (tail != head) { 3711 un->un_flags |= UN_EMPTY; 3712 writeb(1, &(bs->iempty)); 3713 } else { 3714 dgap_wmove(ch, ch->ch_digi.digi_offstr, 3715 (int) ch->ch_digi.digi_offlen); 3716 head = readw(&(bs->tx_head)) & tmask; 3717 ch->ch_flags &= ~CH_PRON; 3718 } 3719 } 3720 3721 /* Update printer buffer empty time. */ 3722 if ((un->un_type == DGAP_PRINT) && (ch->ch_digi.digi_maxcps > 0) 3723 && (ch->ch_digi.digi_bufsize > 0)) { 3724 ch->ch_cpstime += (HZ * count) / ch->ch_digi.digi_maxcps; 3725 } 3726 3727 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 3728 3729 return count; 3730} 3731 3732/* 3733 * dgap_tty_put_char() 3734 * 3735 * Put a character into ch->ch_buf 3736 * 3737 * - used by the line discipline for OPOST processing 3738 */ 3739static int dgap_tty_put_char(struct tty_struct *tty, unsigned char c) 3740{ 3741 /* 3742 * Simply call tty_write. 3743 */ 3744 dgap_tty_write(tty, &c, 1); 3745 return 1; 3746} 3747 3748/* 3749 * Return modem signals to ld. 3750 */ 3751static int dgap_tty_tiocmget(struct tty_struct *tty) 3752{ 3753 struct channel_t *ch; 3754 struct un_t *un; 3755 int result; 3756 u8 mstat; 3757 ulong lock_flags; 3758 3759 if (!tty || tty->magic != TTY_MAGIC) 3760 return -EIO; 3761 3762 un = tty->driver_data; 3763 if (!un || un->magic != DGAP_UNIT_MAGIC) 3764 return -EIO; 3765 3766 ch = un->un_ch; 3767 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3768 return -EIO; 3769 3770 spin_lock_irqsave(&ch->ch_lock, lock_flags); 3771 3772 mstat = readb(&(ch->ch_bs->m_stat)); 3773 /* Append any outbound signals that might be pending... */ 3774 mstat |= ch->ch_mostat; 3775 3776 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 3777 3778 result = 0; 3779 3780 if (mstat & D_DTR(ch)) 3781 result |= TIOCM_DTR; 3782 if (mstat & D_RTS(ch)) 3783 result |= TIOCM_RTS; 3784 if (mstat & D_CTS(ch)) 3785 result |= TIOCM_CTS; 3786 if (mstat & D_DSR(ch)) 3787 result |= TIOCM_DSR; 3788 if (mstat & D_RI(ch)) 3789 result |= TIOCM_RI; 3790 if (mstat & D_CD(ch)) 3791 result |= TIOCM_CD; 3792 3793 return result; 3794} 3795 3796/* 3797 * dgap_tty_tiocmset() 3798 * 3799 * Set modem signals, called by ld. 3800 */ 3801static int dgap_tty_tiocmset(struct tty_struct *tty, 3802 unsigned int set, unsigned int clear) 3803{ 3804 struct board_t *bd; 3805 struct channel_t *ch; 3806 struct un_t *un; 3807 ulong lock_flags; 3808 ulong lock_flags2; 3809 3810 if (!tty || tty->magic != TTY_MAGIC) 3811 return -EIO; 3812 3813 un = tty->driver_data; 3814 if (!un || un->magic != DGAP_UNIT_MAGIC) 3815 return -EIO; 3816 3817 ch = un->un_ch; 3818 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3819 return -EIO; 3820 3821 bd = ch->ch_bd; 3822 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 3823 return -EIO; 3824 3825 spin_lock_irqsave(&bd->bd_lock, lock_flags); 3826 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 3827 3828 if (set & TIOCM_RTS) { 3829 ch->ch_mforce |= D_RTS(ch); 3830 ch->ch_mval |= D_RTS(ch); 3831 } 3832 3833 if (set & TIOCM_DTR) { 3834 ch->ch_mforce |= D_DTR(ch); 3835 ch->ch_mval |= D_DTR(ch); 3836 } 3837 3838 if (clear & TIOCM_RTS) { 3839 ch->ch_mforce |= D_RTS(ch); 3840 ch->ch_mval &= ~(D_RTS(ch)); 3841 } 3842 3843 if (clear & TIOCM_DTR) { 3844 ch->ch_mforce |= D_DTR(ch); 3845 ch->ch_mval &= ~(D_DTR(ch)); 3846 } 3847 3848 dgap_param(ch, bd, un->un_type); 3849 3850 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 3851 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 3852 3853 return 0; 3854} 3855 3856/* 3857 * dgap_tty_send_break() 3858 * 3859 * Send a Break, called by ld. 3860 */ 3861static int dgap_tty_send_break(struct tty_struct *tty, int msec) 3862{ 3863 struct board_t *bd; 3864 struct channel_t *ch; 3865 struct un_t *un; 3866 ulong lock_flags; 3867 ulong lock_flags2; 3868 3869 if (!tty || tty->magic != TTY_MAGIC) 3870 return -EIO; 3871 3872 un = tty->driver_data; 3873 if (!un || un->magic != DGAP_UNIT_MAGIC) 3874 return -EIO; 3875 3876 ch = un->un_ch; 3877 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3878 return -EIO; 3879 3880 bd = ch->ch_bd; 3881 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 3882 return -EIO; 3883 3884 switch (msec) { 3885 case -1: 3886 msec = 0xFFFF; 3887 break; 3888 case 0: 3889 msec = 1; 3890 break; 3891 default: 3892 msec /= 10; 3893 break; 3894 } 3895 3896 spin_lock_irqsave(&bd->bd_lock, lock_flags); 3897 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 3898#if 0 3899 dgap_cmdw(ch, SBREAK, (u16) SBREAK_TIME, 0); 3900#endif 3901 dgap_cmdw(ch, SBREAK, (u16) msec, 0); 3902 3903 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 3904 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 3905 3906 return 0; 3907} 3908 3909/* 3910 * dgap_tty_wait_until_sent() 3911 * 3912 * wait until data has been transmitted, called by ld. 3913 */ 3914static void dgap_tty_wait_until_sent(struct tty_struct *tty, int timeout) 3915{ 3916 dgap_wait_for_drain(tty); 3917} 3918 3919/* 3920 * dgap_send_xchar() 3921 * 3922 * send a high priority character, called by ld. 3923 */ 3924static void dgap_tty_send_xchar(struct tty_struct *tty, char c) 3925{ 3926 struct board_t *bd; 3927 struct channel_t *ch; 3928 struct un_t *un; 3929 ulong lock_flags; 3930 ulong lock_flags2; 3931 3932 if (!tty || tty->magic != TTY_MAGIC) 3933 return; 3934 3935 un = tty->driver_data; 3936 if (!un || un->magic != DGAP_UNIT_MAGIC) 3937 return; 3938 3939 ch = un->un_ch; 3940 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 3941 return; 3942 3943 bd = ch->ch_bd; 3944 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 3945 return; 3946 3947 spin_lock_irqsave(&bd->bd_lock, lock_flags); 3948 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 3949 3950 /* 3951 * This is technically what we should do. 3952 * However, the NIST tests specifically want 3953 * to see each XON or XOFF character that it 3954 * sends, so lets just send each character 3955 * by hand... 3956 */ 3957#if 0 3958 if (c == STOP_CHAR(tty)) 3959 dgap_cmdw(ch, RPAUSE, 0, 0); 3960 else if (c == START_CHAR(tty)) 3961 dgap_cmdw(ch, RRESUME, 0, 0); 3962 else 3963 dgap_wmove(ch, &c, 1); 3964#else 3965 dgap_wmove(ch, &c, 1); 3966#endif 3967 3968 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 3969 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 3970} 3971 3972/* 3973 * Return modem signals to ld. 3974 */ 3975static int dgap_get_modem_info(struct channel_t *ch, unsigned int __user *value) 3976{ 3977 int result; 3978 u8 mstat; 3979 ulong lock_flags; 3980 3981 spin_lock_irqsave(&ch->ch_lock, lock_flags); 3982 3983 mstat = readb(&(ch->ch_bs->m_stat)); 3984 /* Append any outbound signals that might be pending... */ 3985 mstat |= ch->ch_mostat; 3986 3987 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 3988 3989 result = 0; 3990 3991 if (mstat & D_DTR(ch)) 3992 result |= TIOCM_DTR; 3993 if (mstat & D_RTS(ch)) 3994 result |= TIOCM_RTS; 3995 if (mstat & D_CTS(ch)) 3996 result |= TIOCM_CTS; 3997 if (mstat & D_DSR(ch)) 3998 result |= TIOCM_DSR; 3999 if (mstat & D_RI(ch)) 4000 result |= TIOCM_RI; 4001 if (mstat & D_CD(ch)) 4002 result |= TIOCM_CD; 4003 4004 return put_user(result, value); 4005} 4006 4007/* 4008 * dgap_set_modem_info() 4009 * 4010 * Set modem signals, called by ld. 4011 */ 4012static int dgap_set_modem_info(struct channel_t *ch, struct board_t *bd, 4013 struct un_t *un, unsigned int command, 4014 unsigned int __user *value) 4015{ 4016 int ret; 4017 unsigned int arg; 4018 ulong lock_flags; 4019 ulong lock_flags2; 4020 4021 ret = get_user(arg, value); 4022 if (ret) 4023 return ret; 4024 4025 switch (command) { 4026 case TIOCMBIS: 4027 if (arg & TIOCM_RTS) { 4028 ch->ch_mforce |= D_RTS(ch); 4029 ch->ch_mval |= D_RTS(ch); 4030 } 4031 4032 if (arg & TIOCM_DTR) { 4033 ch->ch_mforce |= D_DTR(ch); 4034 ch->ch_mval |= D_DTR(ch); 4035 } 4036 4037 break; 4038 4039 case TIOCMBIC: 4040 if (arg & TIOCM_RTS) { 4041 ch->ch_mforce |= D_RTS(ch); 4042 ch->ch_mval &= ~(D_RTS(ch)); 4043 } 4044 4045 if (arg & TIOCM_DTR) { 4046 ch->ch_mforce |= D_DTR(ch); 4047 ch->ch_mval &= ~(D_DTR(ch)); 4048 } 4049 4050 break; 4051 4052 case TIOCMSET: 4053 ch->ch_mforce = D_DTR(ch)|D_RTS(ch); 4054 4055 if (arg & TIOCM_RTS) 4056 ch->ch_mval |= D_RTS(ch); 4057 else 4058 ch->ch_mval &= ~(D_RTS(ch)); 4059 4060 if (arg & TIOCM_DTR) 4061 ch->ch_mval |= (D_DTR(ch)); 4062 else 4063 ch->ch_mval &= ~(D_DTR(ch)); 4064 4065 break; 4066 4067 default: 4068 return -EINVAL; 4069 } 4070 4071 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4072 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4073 4074 dgap_param(ch, bd, un->un_type); 4075 4076 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4077 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4078 4079 return 0; 4080} 4081 4082/* 4083 * dgap_tty_digigeta() 4084 * 4085 * Ioctl to get the information for ditty. 4086 * 4087 * 4088 * 4089 */ 4090static int dgap_tty_digigeta(struct channel_t *ch, 4091 struct digi_t __user *retinfo) 4092{ 4093 struct digi_t tmp; 4094 ulong lock_flags; 4095 4096 if (!retinfo) 4097 return -EFAULT; 4098 4099 memset(&tmp, 0, sizeof(tmp)); 4100 4101 spin_lock_irqsave(&ch->ch_lock, lock_flags); 4102 memcpy(&tmp, &ch->ch_digi, sizeof(tmp)); 4103 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 4104 4105 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) 4106 return -EFAULT; 4107 4108 return 0; 4109} 4110 4111/* 4112 * dgap_tty_digiseta() 4113 * 4114 * Ioctl to set the information for ditty. 4115 * 4116 * 4117 * 4118 */ 4119static int dgap_tty_digiseta(struct channel_t *ch, struct board_t *bd, 4120 struct un_t *un, struct digi_t __user *new_info) 4121{ 4122 struct digi_t new_digi; 4123 ulong lock_flags = 0; 4124 unsigned long lock_flags2; 4125 4126 if (copy_from_user(&new_digi, new_info, sizeof(struct digi_t))) 4127 return -EFAULT; 4128 4129 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4130 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4131 4132 memcpy(&ch->ch_digi, &new_digi, sizeof(struct digi_t)); 4133 4134 if (ch->ch_digi.digi_maxcps < 1) 4135 ch->ch_digi.digi_maxcps = 1; 4136 4137 if (ch->ch_digi.digi_maxcps > 10000) 4138 ch->ch_digi.digi_maxcps = 10000; 4139 4140 if (ch->ch_digi.digi_bufsize < 10) 4141 ch->ch_digi.digi_bufsize = 10; 4142 4143 if (ch->ch_digi.digi_maxchar < 1) 4144 ch->ch_digi.digi_maxchar = 1; 4145 4146 if (ch->ch_digi.digi_maxchar > ch->ch_digi.digi_bufsize) 4147 ch->ch_digi.digi_maxchar = ch->ch_digi.digi_bufsize; 4148 4149 if (ch->ch_digi.digi_onlen > DIGI_PLEN) 4150 ch->ch_digi.digi_onlen = DIGI_PLEN; 4151 4152 if (ch->ch_digi.digi_offlen > DIGI_PLEN) 4153 ch->ch_digi.digi_offlen = DIGI_PLEN; 4154 4155 dgap_param(ch, bd, un->un_type); 4156 4157 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4158 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4159 4160 return 0; 4161} 4162 4163/* 4164 * dgap_tty_digigetedelay() 4165 * 4166 * Ioctl to get the current edelay setting. 4167 * 4168 * 4169 * 4170 */ 4171static int dgap_tty_digigetedelay(struct tty_struct *tty, int __user *retinfo) 4172{ 4173 struct channel_t *ch; 4174 struct un_t *un; 4175 int tmp; 4176 ulong lock_flags; 4177 4178 if (!retinfo) 4179 return -EFAULT; 4180 4181 if (!tty || tty->magic != TTY_MAGIC) 4182 return -EFAULT; 4183 4184 un = tty->driver_data; 4185 if (!un || un->magic != DGAP_UNIT_MAGIC) 4186 return -EFAULT; 4187 4188 ch = un->un_ch; 4189 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 4190 return -EFAULT; 4191 4192 memset(&tmp, 0, sizeof(tmp)); 4193 4194 spin_lock_irqsave(&ch->ch_lock, lock_flags); 4195 tmp = readw(&(ch->ch_bs->edelay)); 4196 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 4197 4198 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) 4199 return -EFAULT; 4200 4201 return 0; 4202} 4203 4204/* 4205 * dgap_tty_digisetedelay() 4206 * 4207 * Ioctl to set the EDELAY setting 4208 * 4209 */ 4210static int dgap_tty_digisetedelay(struct channel_t *ch, struct board_t *bd, 4211 struct un_t *un, int __user *new_info) 4212{ 4213 int new_digi; 4214 ulong lock_flags; 4215 ulong lock_flags2; 4216 4217 if (copy_from_user(&new_digi, new_info, sizeof(int))) 4218 return -EFAULT; 4219 4220 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4221 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4222 4223 writew((u16) new_digi, &(ch->ch_bs->edelay)); 4224 4225 dgap_param(ch, bd, un->un_type); 4226 4227 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4228 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4229 4230 return 0; 4231} 4232 4233/* 4234 * dgap_tty_digigetcustombaud() 4235 * 4236 * Ioctl to get the current custom baud rate setting. 4237 */ 4238static int dgap_tty_digigetcustombaud(struct channel_t *ch, struct un_t *un, 4239 int __user *retinfo) 4240{ 4241 int tmp; 4242 ulong lock_flags; 4243 4244 if (!retinfo) 4245 return -EFAULT; 4246 4247 memset(&tmp, 0, sizeof(tmp)); 4248 4249 spin_lock_irqsave(&ch->ch_lock, lock_flags); 4250 tmp = dgap_get_custom_baud(ch); 4251 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 4252 4253 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) 4254 return -EFAULT; 4255 4256 return 0; 4257} 4258 4259/* 4260 * dgap_tty_digisetcustombaud() 4261 * 4262 * Ioctl to set the custom baud rate setting 4263 */ 4264static int dgap_tty_digisetcustombaud(struct channel_t *ch, struct board_t *bd, 4265 struct un_t *un, int __user *new_info) 4266{ 4267 uint new_rate; 4268 ulong lock_flags; 4269 ulong lock_flags2; 4270 4271 if (copy_from_user(&new_rate, new_info, sizeof(unsigned int))) 4272 return -EFAULT; 4273 4274 if (bd->bd_flags & BD_FEP5PLUS) { 4275 4276 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4277 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4278 4279 ch->ch_custom_speed = new_rate; 4280 4281 dgap_param(ch, bd, un->un_type); 4282 4283 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4284 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4285 } 4286 4287 return 0; 4288} 4289 4290/* 4291 * dgap_set_termios() 4292 */ 4293static void dgap_tty_set_termios(struct tty_struct *tty, 4294 struct ktermios *old_termios) 4295{ 4296 struct board_t *bd; 4297 struct channel_t *ch; 4298 struct un_t *un; 4299 unsigned long lock_flags; 4300 unsigned long lock_flags2; 4301 4302 if (!tty || tty->magic != TTY_MAGIC) 4303 return; 4304 4305 un = tty->driver_data; 4306 if (!un || un->magic != DGAP_UNIT_MAGIC) 4307 return; 4308 4309 ch = un->un_ch; 4310 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 4311 return; 4312 4313 bd = ch->ch_bd; 4314 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 4315 return; 4316 4317 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4318 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4319 4320 ch->ch_c_cflag = tty->termios.c_cflag; 4321 ch->ch_c_iflag = tty->termios.c_iflag; 4322 ch->ch_c_oflag = tty->termios.c_oflag; 4323 ch->ch_c_lflag = tty->termios.c_lflag; 4324 ch->ch_startc = tty->termios.c_cc[VSTART]; 4325 ch->ch_stopc = tty->termios.c_cc[VSTOP]; 4326 4327 dgap_carrier(ch); 4328 dgap_param(ch, bd, un->un_type); 4329 4330 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4331 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4332} 4333 4334static void dgap_tty_throttle(struct tty_struct *tty) 4335{ 4336 struct board_t *bd; 4337 struct channel_t *ch; 4338 struct un_t *un; 4339 ulong lock_flags; 4340 ulong lock_flags2; 4341 4342 if (!tty || tty->magic != TTY_MAGIC) 4343 return; 4344 4345 un = tty->driver_data; 4346 if (!un || un->magic != DGAP_UNIT_MAGIC) 4347 return; 4348 4349 ch = un->un_ch; 4350 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 4351 return; 4352 4353 bd = ch->ch_bd; 4354 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 4355 return; 4356 4357 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4358 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4359 4360 ch->ch_flags |= (CH_RXBLOCK); 4361#if 1 4362 dgap_cmdw(ch, RPAUSE, 0, 0); 4363#endif 4364 4365 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4366 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4367 4368} 4369 4370static void dgap_tty_unthrottle(struct tty_struct *tty) 4371{ 4372 struct board_t *bd; 4373 struct channel_t *ch; 4374 struct un_t *un; 4375 ulong lock_flags; 4376 ulong lock_flags2; 4377 4378 if (!tty || tty->magic != TTY_MAGIC) 4379 return; 4380 4381 un = tty->driver_data; 4382 if (!un || un->magic != DGAP_UNIT_MAGIC) 4383 return; 4384 4385 ch = un->un_ch; 4386 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 4387 return; 4388 4389 bd = ch->ch_bd; 4390 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 4391 return; 4392 4393 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4394 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4395 4396 ch->ch_flags &= ~(CH_RXBLOCK); 4397 4398#if 1 4399 dgap_cmdw(ch, RRESUME, 0, 0); 4400#endif 4401 4402 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4403 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4404} 4405 4406static struct board_t *find_board_by_major(unsigned int major) 4407{ 4408 unsigned int i; 4409 4410 for (i = 0; i < MAXBOARDS; i++) { 4411 struct board_t *brd = dgap_board[i]; 4412 4413 if (!brd) 4414 return NULL; 4415 if (major == brd->serial_driver->major || 4416 major == brd->print_driver->major) 4417 return brd; 4418 } 4419 4420 return NULL; 4421} 4422 4423/************************************************************************ 4424 * 4425 * TTY Entry points and helper functions 4426 * 4427 ************************************************************************/ 4428 4429/* 4430 * dgap_tty_open() 4431 * 4432 */ 4433static int dgap_tty_open(struct tty_struct *tty, struct file *file) 4434{ 4435 struct board_t *brd; 4436 struct channel_t *ch; 4437 struct un_t *un; 4438 struct bs_t __iomem *bs; 4439 uint major; 4440 uint minor; 4441 int rc; 4442 ulong lock_flags; 4443 ulong lock_flags2; 4444 u16 head; 4445 4446 major = MAJOR(tty_devnum(tty)); 4447 minor = MINOR(tty_devnum(tty)); 4448 4449 brd = find_board_by_major(major); 4450 if (!brd) 4451 return -EIO; 4452 4453 /* 4454 * If board is not yet up to a state of READY, go to 4455 * sleep waiting for it to happen or they cancel the open. 4456 */ 4457 rc = wait_event_interruptible(brd->state_wait, 4458 (brd->state & BOARD_READY)); 4459 4460 if (rc) 4461 return rc; 4462 4463 spin_lock_irqsave(&brd->bd_lock, lock_flags); 4464 4465 /* The wait above should guarantee this cannot happen */ 4466 if (brd->state != BOARD_READY) { 4467 spin_unlock_irqrestore(&brd->bd_lock, lock_flags); 4468 return -EIO; 4469 } 4470 4471 /* If opened device is greater than our number of ports, bail. */ 4472 if (MINOR(tty_devnum(tty)) > brd->nasync) { 4473 spin_unlock_irqrestore(&brd->bd_lock, lock_flags); 4474 return -EIO; 4475 } 4476 4477 ch = brd->channels[minor]; 4478 if (!ch) { 4479 spin_unlock_irqrestore(&brd->bd_lock, lock_flags); 4480 return -EIO; 4481 } 4482 4483 /* Grab channel lock */ 4484 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4485 4486 /* Figure out our type */ 4487 if (major == brd->serial_driver->major) { 4488 un = &brd->channels[minor]->ch_tun; 4489 un->un_type = DGAP_SERIAL; 4490 } else if (major == brd->print_driver->major) { 4491 un = &brd->channels[minor]->ch_pun; 4492 un->un_type = DGAP_PRINT; 4493 } else { 4494 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4495 spin_unlock_irqrestore(&brd->bd_lock, lock_flags); 4496 return -EIO; 4497 } 4498 4499 /* Store our unit into driver_data, so we always have it available. */ 4500 tty->driver_data = un; 4501 4502 /* 4503 * Error if channel info pointer is NULL. 4504 */ 4505 bs = ch->ch_bs; 4506 if (!bs) { 4507 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4508 spin_unlock_irqrestore(&brd->bd_lock, lock_flags); 4509 return -EIO; 4510 } 4511 4512 /* 4513 * Initialize tty's 4514 */ 4515 if (!(un->un_flags & UN_ISOPEN)) { 4516 /* Store important variables. */ 4517 un->un_tty = tty; 4518 4519 /* Maybe do something here to the TTY struct as well? */ 4520 } 4521 4522 /* 4523 * Initialize if neither terminal or printer is open. 4524 */ 4525 if (!((ch->ch_tun.un_flags | ch->ch_pun.un_flags) & UN_ISOPEN)) { 4526 4527 ch->ch_mforce = 0; 4528 ch->ch_mval = 0; 4529 4530 /* 4531 * Flush input queue. 4532 */ 4533 head = readw(&(bs->rx_head)); 4534 writew(head, &(bs->rx_tail)); 4535 4536 ch->ch_flags = 0; 4537 ch->pscan_state = 0; 4538 ch->pscan_savechar = 0; 4539 4540 ch->ch_c_cflag = tty->termios.c_cflag; 4541 ch->ch_c_iflag = tty->termios.c_iflag; 4542 ch->ch_c_oflag = tty->termios.c_oflag; 4543 ch->ch_c_lflag = tty->termios.c_lflag; 4544 ch->ch_startc = tty->termios.c_cc[VSTART]; 4545 ch->ch_stopc = tty->termios.c_cc[VSTOP]; 4546 4547 /* TODO: flush our TTY struct here? */ 4548 } 4549 4550 dgap_carrier(ch); 4551 /* 4552 * Run param in case we changed anything 4553 */ 4554 dgap_param(ch, brd, un->un_type); 4555 4556 /* 4557 * follow protocol for opening port 4558 */ 4559 4560 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4561 spin_unlock_irqrestore(&brd->bd_lock, lock_flags); 4562 4563 rc = dgap_block_til_ready(tty, file, ch); 4564 4565 if (!un->un_tty) 4566 return -ENODEV; 4567 4568 /* No going back now, increment our unit and channel counters */ 4569 spin_lock_irqsave(&ch->ch_lock, lock_flags); 4570 ch->ch_open_count++; 4571 un->un_open_count++; 4572 un->un_flags |= (UN_ISOPEN); 4573 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 4574 4575 return rc; 4576} 4577 4578/* 4579 * dgap_tty_close() 4580 * 4581 */ 4582static void dgap_tty_close(struct tty_struct *tty, struct file *file) 4583{ 4584 struct ktermios *ts; 4585 struct board_t *bd; 4586 struct channel_t *ch; 4587 struct un_t *un; 4588 ulong lock_flags; 4589 4590 if (!tty || tty->magic != TTY_MAGIC) 4591 return; 4592 4593 un = tty->driver_data; 4594 if (!un || un->magic != DGAP_UNIT_MAGIC) 4595 return; 4596 4597 ch = un->un_ch; 4598 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 4599 return; 4600 4601 bd = ch->ch_bd; 4602 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 4603 return; 4604 4605 ts = &tty->termios; 4606 4607 spin_lock_irqsave(&ch->ch_lock, lock_flags); 4608 4609 /* 4610 * Determine if this is the last close or not - and if we agree about 4611 * which type of close it is with the Line Discipline 4612 */ 4613 if ((tty->count == 1) && (un->un_open_count != 1)) { 4614 /* 4615 * Uh, oh. tty->count is 1, which means that the tty 4616 * structure will be freed. un_open_count should always 4617 * be one in these conditions. If it's greater than 4618 * one, we've got real problems, since it means the 4619 * serial port won't be shutdown. 4620 */ 4621 un->un_open_count = 1; 4622 } 4623 4624 if (--un->un_open_count < 0) 4625 un->un_open_count = 0; 4626 4627 ch->ch_open_count--; 4628 4629 if (ch->ch_open_count && un->un_open_count) { 4630 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 4631 return; 4632 } 4633 4634 /* OK, its the last close on the unit */ 4635 4636 un->un_flags |= UN_CLOSING; 4637 4638 tty->closing = 1; 4639 4640 /* 4641 * Only officially close channel if count is 0 and 4642 * DIGI_PRINTER bit is not set. 4643 */ 4644 if ((ch->ch_open_count == 0) && 4645 !(ch->ch_digi.digi_flags & DIGI_PRINTER)) { 4646 4647 ch->ch_flags &= ~(CH_RXBLOCK); 4648 4649 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 4650 4651 /* wait for output to drain */ 4652 /* This will also return if we take an interrupt */ 4653 4654 dgap_wait_for_drain(tty); 4655 4656 dgap_tty_flush_buffer(tty); 4657 tty_ldisc_flush(tty); 4658 4659 spin_lock_irqsave(&ch->ch_lock, lock_flags); 4660 4661 tty->closing = 0; 4662 4663 /* 4664 * If we have HUPCL set, lower DTR and RTS 4665 */ 4666 if (ch->ch_c_cflag & HUPCL) { 4667 ch->ch_mostat &= ~(D_RTS(ch)|D_DTR(ch)); 4668 dgap_cmdb(ch, SMODEM, 0, D_DTR(ch)|D_RTS(ch), 0); 4669 4670 /* 4671 * Go to sleep to ensure RTS/DTR 4672 * have been dropped for modems to see it. 4673 */ 4674 spin_unlock_irqrestore(&ch->ch_lock, 4675 lock_flags); 4676 4677 /* .25 second delay for dropping RTS/DTR */ 4678 schedule_timeout_interruptible(msecs_to_jiffies(250)); 4679 4680 spin_lock_irqsave(&ch->ch_lock, lock_flags); 4681 } 4682 4683 ch->pscan_state = 0; 4684 ch->pscan_savechar = 0; 4685 ch->ch_baud_info = 0; 4686 4687 } 4688 4689 /* 4690 * turn off print device when closing print device. 4691 */ 4692 if ((un->un_type == DGAP_PRINT) && (ch->ch_flags & CH_PRON)) { 4693 dgap_wmove(ch, ch->ch_digi.digi_offstr, 4694 (int) ch->ch_digi.digi_offlen); 4695 ch->ch_flags &= ~CH_PRON; 4696 } 4697 4698 un->un_tty = NULL; 4699 un->un_flags &= ~(UN_ISOPEN | UN_CLOSING); 4700 tty->driver_data = NULL; 4701 4702 wake_up_interruptible(&ch->ch_flags_wait); 4703 wake_up_interruptible(&un->un_flags_wait); 4704 4705 spin_unlock_irqrestore(&ch->ch_lock, lock_flags); 4706} 4707 4708static void dgap_tty_start(struct tty_struct *tty) 4709{ 4710 struct board_t *bd; 4711 struct channel_t *ch; 4712 struct un_t *un; 4713 ulong lock_flags; 4714 ulong lock_flags2; 4715 4716 if (!tty || tty->magic != TTY_MAGIC) 4717 return; 4718 4719 un = tty->driver_data; 4720 if (!un || un->magic != DGAP_UNIT_MAGIC) 4721 return; 4722 4723 ch = un->un_ch; 4724 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 4725 return; 4726 4727 bd = ch->ch_bd; 4728 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 4729 return; 4730 4731 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4732 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4733 4734 dgap_cmdw(ch, RESUMETX, 0, 0); 4735 4736 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4737 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4738} 4739 4740static void dgap_tty_stop(struct tty_struct *tty) 4741{ 4742 struct board_t *bd; 4743 struct channel_t *ch; 4744 struct un_t *un; 4745 ulong lock_flags; 4746 ulong lock_flags2; 4747 4748 if (!tty || tty->magic != TTY_MAGIC) 4749 return; 4750 4751 un = tty->driver_data; 4752 if (!un || un->magic != DGAP_UNIT_MAGIC) 4753 return; 4754 4755 ch = un->un_ch; 4756 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 4757 return; 4758 4759 bd = ch->ch_bd; 4760 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 4761 return; 4762 4763 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4764 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4765 4766 dgap_cmdw(ch, PAUSETX, 0, 0); 4767 4768 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4769 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4770} 4771 4772/* 4773 * dgap_tty_flush_chars() 4774 * 4775 * Flush the cook buffer 4776 * 4777 * Note to self, and any other poor souls who venture here: 4778 * 4779 * flush in this case DOES NOT mean dispose of the data. 4780 * instead, it means "stop buffering and send it if you 4781 * haven't already." Just guess how I figured that out... SRW 2-Jun-98 4782 * 4783 * It is also always called in interrupt context - JAR 8-Sept-99 4784 */ 4785static void dgap_tty_flush_chars(struct tty_struct *tty) 4786{ 4787 struct board_t *bd; 4788 struct channel_t *ch; 4789 struct un_t *un; 4790 ulong lock_flags; 4791 ulong lock_flags2; 4792 4793 if (!tty || tty->magic != TTY_MAGIC) 4794 return; 4795 4796 un = tty->driver_data; 4797 if (!un || un->magic != DGAP_UNIT_MAGIC) 4798 return; 4799 4800 ch = un->un_ch; 4801 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 4802 return; 4803 4804 bd = ch->ch_bd; 4805 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 4806 return; 4807 4808 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4809 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4810 4811 /* TODO: Do something here */ 4812 4813 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4814 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4815} 4816 4817/***************************************************************************** 4818 * 4819 * The IOCTL function and all of its helpers 4820 * 4821 *****************************************************************************/ 4822 4823/* 4824 * dgap_tty_ioctl() 4825 * 4826 * The usual assortment of ioctl's 4827 */ 4828static int dgap_tty_ioctl(struct tty_struct *tty, unsigned int cmd, 4829 unsigned long arg) 4830{ 4831 struct board_t *bd; 4832 struct channel_t *ch; 4833 struct un_t *un; 4834 int rc; 4835 u16 head; 4836 ulong lock_flags = 0; 4837 ulong lock_flags2 = 0; 4838 void __user *uarg = (void __user *) arg; 4839 4840 if (!tty || tty->magic != TTY_MAGIC) 4841 return -ENODEV; 4842 4843 un = tty->driver_data; 4844 if (!un || un->magic != DGAP_UNIT_MAGIC) 4845 return -ENODEV; 4846 4847 ch = un->un_ch; 4848 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 4849 return -ENODEV; 4850 4851 bd = ch->ch_bd; 4852 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 4853 return -ENODEV; 4854 4855 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4856 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4857 4858 if (un->un_open_count <= 0) { 4859 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4860 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4861 return -EIO; 4862 } 4863 4864 switch (cmd) { 4865 4866 /* Here are all the standard ioctl's that we MUST implement */ 4867 4868 case TCSBRK: 4869 /* 4870 * TCSBRK is SVID version: non-zero arg --> no break 4871 * this behaviour is exploited by tcdrain(). 4872 * 4873 * According to POSIX.1 spec (7.2.2.1.2) breaks should be 4874 * between 0.25 and 0.5 seconds so we'll ask for something 4875 * in the middle: 0.375 seconds. 4876 */ 4877 rc = tty_check_change(tty); 4878 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4879 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4880 if (rc) 4881 return rc; 4882 4883 rc = dgap_wait_for_drain(tty); 4884 4885 if (rc) 4886 return -EINTR; 4887 4888 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4889 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4890 4891 if (((cmd == TCSBRK) && (!arg)) || (cmd == TCSBRKP)) 4892 dgap_cmdw(ch, SBREAK, (u16) SBREAK_TIME, 0); 4893 4894 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4895 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4896 4897 return 0; 4898 4899 case TCSBRKP: 4900 /* support for POSIX tcsendbreak() 4901 4902 * According to POSIX.1 spec (7.2.2.1.2) breaks should be 4903 * between 0.25 and 0.5 seconds so we'll ask for something 4904 * in the middle: 0.375 seconds. 4905 */ 4906 rc = tty_check_change(tty); 4907 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4908 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4909 if (rc) 4910 return rc; 4911 4912 rc = dgap_wait_for_drain(tty); 4913 if (rc) 4914 return -EINTR; 4915 4916 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4917 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4918 4919 dgap_cmdw(ch, SBREAK, (u16) SBREAK_TIME, 0); 4920 4921 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4922 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4923 4924 return 0; 4925 4926 case TIOCSBRK: 4927 /* 4928 * FEP5 doesn't support turning on a break unconditionally. 4929 * The FEP5 device will stop sending a break automatically 4930 * after the specified time value that was sent when turning on 4931 * the break. 4932 */ 4933 rc = tty_check_change(tty); 4934 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4935 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4936 if (rc) 4937 return rc; 4938 4939 rc = dgap_wait_for_drain(tty); 4940 if (rc) 4941 return -EINTR; 4942 4943 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4944 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4945 4946 dgap_cmdw(ch, SBREAK, (u16) SBREAK_TIME, 0); 4947 4948 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4949 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4950 4951 return 0; 4952 4953 case TIOCCBRK: 4954 /* 4955 * FEP5 doesn't support turning off a break unconditionally. 4956 * The FEP5 device will stop sending a break automatically 4957 * after the specified time value that was sent when turning on 4958 * the break. 4959 */ 4960 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4961 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4962 return 0; 4963 4964 case TIOCGSOFTCAR: 4965 4966 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4967 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4968 4969 rc = put_user(C_CLOCAL(tty) ? 1 : 0, 4970 (unsigned long __user *) arg); 4971 return rc; 4972 4973 case TIOCSSOFTCAR: 4974 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4975 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4976 4977 rc = get_user(arg, (unsigned long __user *) arg); 4978 if (rc) 4979 return rc; 4980 4981 spin_lock_irqsave(&bd->bd_lock, lock_flags); 4982 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 4983 tty->termios.c_cflag = ((tty->termios.c_cflag & ~CLOCAL) | 4984 (arg ? CLOCAL : 0)); 4985 dgap_param(ch, bd, un->un_type); 4986 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4987 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4988 4989 return 0; 4990 4991 case TIOCMGET: 4992 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 4993 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 4994 return dgap_get_modem_info(ch, uarg); 4995 4996 case TIOCMBIS: 4997 case TIOCMBIC: 4998 case TIOCMSET: 4999 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5000 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5001 return dgap_set_modem_info(ch, bd, un, cmd, uarg); 5002 5003 /* 5004 * Here are any additional ioctl's that we want to implement 5005 */ 5006 5007 case TCFLSH: 5008 /* 5009 * The linux tty driver doesn't have a flush 5010 * input routine for the driver, assuming all backed 5011 * up data is in the line disc. buffers. However, 5012 * we all know that's not the case. Here, we 5013 * act on the ioctl, but then lie and say we didn't 5014 * so the line discipline will process the flush 5015 * also. 5016 */ 5017 rc = tty_check_change(tty); 5018 if (rc) { 5019 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5020 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5021 return rc; 5022 } 5023 5024 if ((arg == TCIFLUSH) || (arg == TCIOFLUSH)) { 5025 if (!(un->un_type == DGAP_PRINT)) { 5026 head = readw(&(ch->ch_bs->rx_head)); 5027 writew(head, &(ch->ch_bs->rx_tail)); 5028 writeb(0, &(ch->ch_bs->orun)); 5029 } 5030 } 5031 5032 if ((arg != TCOFLUSH) && (arg != TCIOFLUSH)) { 5033 /* pretend we didn't recognize this IOCTL */ 5034 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5035 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5036 5037 return -ENOIOCTLCMD; 5038 } 5039 5040 ch->ch_flags &= ~CH_STOP; 5041 head = readw(&(ch->ch_bs->tx_head)); 5042 dgap_cmdw(ch, FLUSHTX, (u16) head, 0); 5043 dgap_cmdw(ch, RESUMETX, 0, 0); 5044 if (ch->ch_tun.un_flags & (UN_LOW|UN_EMPTY)) { 5045 ch->ch_tun.un_flags &= ~(UN_LOW|UN_EMPTY); 5046 wake_up_interruptible(&ch->ch_tun.un_flags_wait); 5047 } 5048 if (ch->ch_pun.un_flags & (UN_LOW|UN_EMPTY)) { 5049 ch->ch_pun.un_flags &= ~(UN_LOW|UN_EMPTY); 5050 wake_up_interruptible(&ch->ch_pun.un_flags_wait); 5051 } 5052 if (waitqueue_active(&tty->write_wait)) 5053 wake_up_interruptible(&tty->write_wait); 5054 5055 /* Can't hold any locks when calling tty_wakeup! */ 5056 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5057 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5058 tty_wakeup(tty); 5059 5060 /* pretend we didn't recognize this IOCTL */ 5061 return -ENOIOCTLCMD; 5062 5063 case TCSETSF: 5064 case TCSETSW: 5065 /* 5066 * The linux tty driver doesn't have a flush 5067 * input routine for the driver, assuming all backed 5068 * up data is in the line disc. buffers. However, 5069 * we all know that's not the case. Here, we 5070 * act on the ioctl, but then lie and say we didn't 5071 * so the line discipline will process the flush 5072 * also. 5073 */ 5074 if (cmd == TCSETSF) { 5075 /* flush rx */ 5076 ch->ch_flags &= ~CH_STOP; 5077 head = readw(&(ch->ch_bs->rx_head)); 5078 writew(head, &(ch->ch_bs->rx_tail)); 5079 } 5080 5081 /* now wait for all the output to drain */ 5082 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5083 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5084 rc = dgap_wait_for_drain(tty); 5085 if (rc) 5086 return -EINTR; 5087 5088 /* pretend we didn't recognize this */ 5089 return -ENOIOCTLCMD; 5090 5091 case TCSETAW: 5092 5093 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5094 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5095 rc = dgap_wait_for_drain(tty); 5096 if (rc) 5097 return -EINTR; 5098 5099 /* pretend we didn't recognize this */ 5100 return -ENOIOCTLCMD; 5101 5102 case TCXONC: 5103 /* 5104 * The Linux Line Discipline (LD) would do this for us if we 5105 * let it, but we have the special firmware options to do this 5106 * the "right way" regardless of hardware or software flow 5107 * control so we'll do it outselves instead of letting the LD 5108 * do it. 5109 */ 5110 rc = tty_check_change(tty); 5111 if (rc) { 5112 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5113 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5114 return rc; 5115 } 5116 5117 switch (arg) { 5118 5119 case TCOON: 5120 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5121 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5122 dgap_tty_start(tty); 5123 return 0; 5124 case TCOOFF: 5125 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5126 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5127 dgap_tty_stop(tty); 5128 return 0; 5129 case TCION: 5130 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5131 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5132 /* Make the ld do it */ 5133 return -ENOIOCTLCMD; 5134 case TCIOFF: 5135 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5136 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5137 /* Make the ld do it */ 5138 return -ENOIOCTLCMD; 5139 default: 5140 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5141 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5142 return -EINVAL; 5143 } 5144 5145 case DIGI_GETA: 5146 /* get information for ditty */ 5147 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5148 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5149 return dgap_tty_digigeta(ch, uarg); 5150 5151 case DIGI_SETAW: 5152 case DIGI_SETAF: 5153 5154 /* set information for ditty */ 5155 if (cmd == (DIGI_SETAW)) { 5156 5157 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5158 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5159 rc = dgap_wait_for_drain(tty); 5160 if (rc) 5161 return -EINTR; 5162 spin_lock_irqsave(&bd->bd_lock, lock_flags); 5163 spin_lock_irqsave(&ch->ch_lock, lock_flags2); 5164 } else 5165 tty_ldisc_flush(tty); 5166 /* fall thru */ 5167 5168 case DIGI_SETA: 5169 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5170 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5171 return dgap_tty_digiseta(ch, bd, un, uarg); 5172 5173 case DIGI_GEDELAY: 5174 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5175 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5176 return dgap_tty_digigetedelay(tty, uarg); 5177 5178 case DIGI_SEDELAY: 5179 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5180 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5181 return dgap_tty_digisetedelay(ch, bd, un, uarg); 5182 5183 case DIGI_GETCUSTOMBAUD: 5184 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5185 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5186 return dgap_tty_digigetcustombaud(ch, un, uarg); 5187 5188 case DIGI_SETCUSTOMBAUD: 5189 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5190 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5191 return dgap_tty_digisetcustombaud(ch, bd, un, uarg); 5192 5193 case DIGI_RESET_PORT: 5194 dgap_firmware_reset_port(ch); 5195 dgap_param(ch, bd, un->un_type); 5196 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5197 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5198 return 0; 5199 5200 default: 5201 spin_unlock_irqrestore(&ch->ch_lock, lock_flags2); 5202 spin_unlock_irqrestore(&bd->bd_lock, lock_flags); 5203 5204 return -ENOIOCTLCMD; 5205 } 5206} 5207 5208static const struct tty_operations dgap_tty_ops = { 5209 .open = dgap_tty_open, 5210 .close = dgap_tty_close, 5211 .write = dgap_tty_write, 5212 .write_room = dgap_tty_write_room, 5213 .flush_buffer = dgap_tty_flush_buffer, 5214 .chars_in_buffer = dgap_tty_chars_in_buffer, 5215 .flush_chars = dgap_tty_flush_chars, 5216 .ioctl = dgap_tty_ioctl, 5217 .set_termios = dgap_tty_set_termios, 5218 .stop = dgap_tty_stop, 5219 .start = dgap_tty_start, 5220 .throttle = dgap_tty_throttle, 5221 .unthrottle = dgap_tty_unthrottle, 5222 .hangup = dgap_tty_hangup, 5223 .put_char = dgap_tty_put_char, 5224 .tiocmget = dgap_tty_tiocmget, 5225 .tiocmset = dgap_tty_tiocmset, 5226 .break_ctl = dgap_tty_send_break, 5227 .wait_until_sent = dgap_tty_wait_until_sent, 5228 .send_xchar = dgap_tty_send_xchar 5229}; 5230 5231/************************************************************************ 5232 * 5233 * TTY Initialization/Cleanup Functions 5234 * 5235 ************************************************************************/ 5236 5237/* 5238 * dgap_tty_register() 5239 * 5240 * Init the tty subsystem for this board. 5241 */ 5242static int dgap_tty_register(struct board_t *brd) 5243{ 5244 int rc; 5245 5246 brd->serial_driver = tty_alloc_driver(MAXPORTS, 5247 TTY_DRIVER_REAL_RAW | 5248 TTY_DRIVER_DYNAMIC_DEV | 5249 TTY_DRIVER_HARDWARE_BREAK); 5250 if (IS_ERR(brd->serial_driver)) 5251 return PTR_ERR(brd->serial_driver); 5252 5253 snprintf(brd->serial_name, MAXTTYNAMELEN, "tty_dgap_%d_", 5254 brd->boardnum); 5255 brd->serial_driver->name = brd->serial_name; 5256 brd->serial_driver->name_base = 0; 5257 brd->serial_driver->major = 0; 5258 brd->serial_driver->minor_start = 0; 5259 brd->serial_driver->type = TTY_DRIVER_TYPE_SERIAL; 5260 brd->serial_driver->subtype = SERIAL_TYPE_NORMAL; 5261 brd->serial_driver->init_termios = dgap_default_termios; 5262 brd->serial_driver->driver_name = DRVSTR; 5263 5264 /* 5265 * Entry points for driver. Called by the kernel from 5266 * tty_io.c and n_tty.c. 5267 */ 5268 tty_set_operations(brd->serial_driver, &dgap_tty_ops); 5269 5270 /* 5271 * If we're doing transparent print, we have to do all of the above 5272 * again, separately so we don't get the LD confused about what major 5273 * we are when we get into the dgap_tty_open() routine. 5274 */ 5275 brd->print_driver = tty_alloc_driver(MAXPORTS, 5276 TTY_DRIVER_REAL_RAW | 5277 TTY_DRIVER_DYNAMIC_DEV | 5278 TTY_DRIVER_HARDWARE_BREAK); 5279 if (IS_ERR(brd->print_driver)) { 5280 rc = PTR_ERR(brd->print_driver); 5281 goto free_serial_drv; 5282 } 5283 5284 snprintf(brd->print_name, MAXTTYNAMELEN, "pr_dgap_%d_", 5285 brd->boardnum); 5286 brd->print_driver->name = brd->print_name; 5287 brd->print_driver->name_base = 0; 5288 brd->print_driver->major = 0; 5289 brd->print_driver->minor_start = 0; 5290 brd->print_driver->type = TTY_DRIVER_TYPE_SERIAL; 5291 brd->print_driver->subtype = SERIAL_TYPE_NORMAL; 5292 brd->print_driver->init_termios = dgap_default_termios; 5293 brd->print_driver->driver_name = DRVSTR; 5294 5295 /* 5296 * Entry points for driver. Called by the kernel from 5297 * tty_io.c and n_tty.c. 5298 */ 5299 tty_set_operations(brd->print_driver, &dgap_tty_ops); 5300 5301 /* Register tty devices */ 5302 rc = tty_register_driver(brd->serial_driver); 5303 if (rc < 0) 5304 goto free_print_drv; 5305 5306 /* Register Transparent Print devices */ 5307 rc = tty_register_driver(brd->print_driver); 5308 if (rc < 0) 5309 goto unregister_serial_drv; 5310 5311 return 0; 5312 5313unregister_serial_drv: 5314 tty_unregister_driver(brd->serial_driver); 5315free_print_drv: 5316 put_tty_driver(brd->print_driver); 5317free_serial_drv: 5318 put_tty_driver(brd->serial_driver); 5319 5320 return rc; 5321} 5322 5323static void dgap_tty_unregister(struct board_t *brd) 5324{ 5325 tty_unregister_driver(brd->print_driver); 5326 tty_unregister_driver(brd->serial_driver); 5327 put_tty_driver(brd->print_driver); 5328 put_tty_driver(brd->serial_driver); 5329} 5330 5331static int dgap_alloc_flipbuf(struct board_t *brd) 5332{ 5333 /* 5334 * allocate flip buffer for board. 5335 */ 5336 brd->flipbuf = kmalloc(MYFLIPLEN, GFP_KERNEL); 5337 if (!brd->flipbuf) 5338 return -ENOMEM; 5339 5340 brd->flipflagbuf = kmalloc(MYFLIPLEN, GFP_KERNEL); 5341 if (!brd->flipflagbuf) { 5342 kfree(brd->flipbuf); 5343 return -ENOMEM; 5344 } 5345 5346 return 0; 5347} 5348 5349static void dgap_free_flipbuf(struct board_t *brd) 5350{ 5351 kfree(brd->flipbuf); 5352 kfree(brd->flipflagbuf); 5353} 5354 5355static struct board_t *dgap_verify_board(struct device *p) 5356{ 5357 struct board_t *bd; 5358 5359 if (!p) 5360 return NULL; 5361 5362 bd = dev_get_drvdata(p); 5363 if (!bd || bd->magic != DGAP_BOARD_MAGIC || bd->state != BOARD_READY) 5364 return NULL; 5365 5366 return bd; 5367} 5368 5369static ssize_t dgap_ports_state_show(struct device *p, 5370 struct device_attribute *attr, 5371 char *buf) 5372{ 5373 struct board_t *bd; 5374 int count = 0; 5375 unsigned int i; 5376 5377 bd = dgap_verify_board(p); 5378 if (!bd) 5379 return 0; 5380 5381 for (i = 0; i < bd->nasync; i++) { 5382 count += snprintf(buf + count, PAGE_SIZE - count, 5383 "%d %s\n", bd->channels[i]->ch_portnum, 5384 bd->channels[i]->ch_open_count ? "Open" : "Closed"); 5385 } 5386 return count; 5387} 5388static DEVICE_ATTR(ports_state, S_IRUSR, dgap_ports_state_show, NULL); 5389 5390static ssize_t dgap_ports_baud_show(struct device *p, 5391 struct device_attribute *attr, 5392 char *buf) 5393{ 5394 struct board_t *bd; 5395 int count = 0; 5396 unsigned int i; 5397 5398 bd = dgap_verify_board(p); 5399 if (!bd) 5400 return 0; 5401 5402 for (i = 0; i < bd->nasync; i++) { 5403 count += snprintf(buf + count, PAGE_SIZE - count, "%d %d\n", 5404 bd->channels[i]->ch_portnum, 5405 bd->channels[i]->ch_baud_info); 5406 } 5407 return count; 5408} 5409static DEVICE_ATTR(ports_baud, S_IRUSR, dgap_ports_baud_show, NULL); 5410 5411static ssize_t dgap_ports_msignals_show(struct device *p, 5412 struct device_attribute *attr, 5413 char *buf) 5414{ 5415 struct board_t *bd; 5416 int count = 0; 5417 unsigned int i; 5418 5419 bd = dgap_verify_board(p); 5420 if (!bd) 5421 return 0; 5422 5423 for (i = 0; i < bd->nasync; i++) { 5424 if (bd->channels[i]->ch_open_count) 5425 count += snprintf(buf + count, PAGE_SIZE - count, 5426 "%d %s %s %s %s %s %s\n", 5427 bd->channels[i]->ch_portnum, 5428 (bd->channels[i]->ch_mostat & 5429 UART_MCR_RTS) ? "RTS" : "", 5430 (bd->channels[i]->ch_mistat & 5431 UART_MSR_CTS) ? "CTS" : "", 5432 (bd->channels[i]->ch_mostat & 5433 UART_MCR_DTR) ? "DTR" : "", 5434 (bd->channels[i]->ch_mistat & 5435 UART_MSR_DSR) ? "DSR" : "", 5436 (bd->channels[i]->ch_mistat & 5437 UART_MSR_DCD) ? "DCD" : "", 5438 (bd->channels[i]->ch_mistat & 5439 UART_MSR_RI) ? "RI" : ""); 5440 else 5441 count += snprintf(buf + count, PAGE_SIZE - count, 5442 "%d\n", bd->channels[i]->ch_portnum); 5443 } 5444 return count; 5445} 5446static DEVICE_ATTR(ports_msignals, S_IRUSR, dgap_ports_msignals_show, NULL); 5447 5448static ssize_t dgap_ports_iflag_show(struct device *p, 5449 struct device_attribute *attr, 5450 char *buf) 5451{ 5452 struct board_t *bd; 5453 int count = 0; 5454 unsigned int i; 5455 5456 bd = dgap_verify_board(p); 5457 if (!bd) 5458 return 0; 5459 5460 for (i = 0; i < bd->nasync; i++) 5461 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n", 5462 bd->channels[i]->ch_portnum, 5463 bd->channels[i]->ch_c_iflag); 5464 return count; 5465} 5466static DEVICE_ATTR(ports_iflag, S_IRUSR, dgap_ports_iflag_show, NULL); 5467 5468static ssize_t dgap_ports_cflag_show(struct device *p, 5469 struct device_attribute *attr, 5470 char *buf) 5471{ 5472 struct board_t *bd; 5473 int count = 0; 5474 unsigned int i; 5475 5476 bd = dgap_verify_board(p); 5477 if (!bd) 5478 return 0; 5479 5480 for (i = 0; i < bd->nasync; i++) 5481 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n", 5482 bd->channels[i]->ch_portnum, 5483 bd->channels[i]->ch_c_cflag); 5484 return count; 5485} 5486static DEVICE_ATTR(ports_cflag, S_IRUSR, dgap_ports_cflag_show, NULL); 5487 5488static ssize_t dgap_ports_oflag_show(struct device *p, 5489 struct device_attribute *attr, 5490 char *buf) 5491{ 5492 struct board_t *bd; 5493 int count = 0; 5494 unsigned int i; 5495 5496 bd = dgap_verify_board(p); 5497 if (!bd) 5498 return 0; 5499 5500 for (i = 0; i < bd->nasync; i++) 5501 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n", 5502 bd->channels[i]->ch_portnum, 5503 bd->channels[i]->ch_c_oflag); 5504 return count; 5505} 5506static DEVICE_ATTR(ports_oflag, S_IRUSR, dgap_ports_oflag_show, NULL); 5507 5508static ssize_t dgap_ports_lflag_show(struct device *p, 5509 struct device_attribute *attr, 5510 char *buf) 5511{ 5512 struct board_t *bd; 5513 int count = 0; 5514 unsigned int i; 5515 5516 bd = dgap_verify_board(p); 5517 if (!bd) 5518 return 0; 5519 5520 for (i = 0; i < bd->nasync; i++) 5521 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n", 5522 bd->channels[i]->ch_portnum, 5523 bd->channels[i]->ch_c_lflag); 5524 return count; 5525} 5526static DEVICE_ATTR(ports_lflag, S_IRUSR, dgap_ports_lflag_show, NULL); 5527 5528static ssize_t dgap_ports_digi_flag_show(struct device *p, 5529 struct device_attribute *attr, 5530 char *buf) 5531{ 5532 struct board_t *bd; 5533 int count = 0; 5534 unsigned int i; 5535 5536 bd = dgap_verify_board(p); 5537 if (!bd) 5538 return 0; 5539 5540 for (i = 0; i < bd->nasync; i++) 5541 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n", 5542 bd->channels[i]->ch_portnum, 5543 bd->channels[i]->ch_digi.digi_flags); 5544 return count; 5545} 5546static DEVICE_ATTR(ports_digi_flag, S_IRUSR, dgap_ports_digi_flag_show, NULL); 5547 5548static ssize_t dgap_ports_rxcount_show(struct device *p, 5549 struct device_attribute *attr, 5550 char *buf) 5551{ 5552 struct board_t *bd; 5553 int count = 0; 5554 unsigned int i; 5555 5556 bd = dgap_verify_board(p); 5557 if (!bd) 5558 return 0; 5559 5560 for (i = 0; i < bd->nasync; i++) 5561 count += snprintf(buf + count, PAGE_SIZE - count, "%d %ld\n", 5562 bd->channels[i]->ch_portnum, 5563 bd->channels[i]->ch_rxcount); 5564 return count; 5565} 5566static DEVICE_ATTR(ports_rxcount, S_IRUSR, dgap_ports_rxcount_show, NULL); 5567 5568static ssize_t dgap_ports_txcount_show(struct device *p, 5569 struct device_attribute *attr, 5570 char *buf) 5571{ 5572 struct board_t *bd; 5573 int count = 0; 5574 unsigned int i; 5575 5576 bd = dgap_verify_board(p); 5577 if (!bd) 5578 return 0; 5579 5580 for (i = 0; i < bd->nasync; i++) 5581 count += snprintf(buf + count, PAGE_SIZE - count, "%d %ld\n", 5582 bd->channels[i]->ch_portnum, 5583 bd->channels[i]->ch_txcount); 5584 return count; 5585} 5586static DEVICE_ATTR(ports_txcount, S_IRUSR, dgap_ports_txcount_show, NULL); 5587 5588static ssize_t dgap_tty_state_show(struct device *d, 5589 struct device_attribute *attr, 5590 char *buf) 5591{ 5592 struct board_t *bd; 5593 struct channel_t *ch; 5594 struct un_t *un; 5595 5596 if (!d) 5597 return 0; 5598 un = dev_get_drvdata(d); 5599 if (!un || un->magic != DGAP_UNIT_MAGIC) 5600 return 0; 5601 ch = un->un_ch; 5602 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5603 return 0; 5604 bd = ch->ch_bd; 5605 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5606 return 0; 5607 if (bd->state != BOARD_READY) 5608 return 0; 5609 5610 return snprintf(buf, PAGE_SIZE, "%s", un->un_open_count ? 5611 "Open" : "Closed"); 5612} 5613static DEVICE_ATTR(state, S_IRUSR, dgap_tty_state_show, NULL); 5614 5615static ssize_t dgap_tty_baud_show(struct device *d, 5616 struct device_attribute *attr, 5617 char *buf) 5618{ 5619 struct board_t *bd; 5620 struct channel_t *ch; 5621 struct un_t *un; 5622 5623 if (!d) 5624 return 0; 5625 un = dev_get_drvdata(d); 5626 if (!un || un->magic != DGAP_UNIT_MAGIC) 5627 return 0; 5628 ch = un->un_ch; 5629 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5630 return 0; 5631 bd = ch->ch_bd; 5632 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5633 return 0; 5634 if (bd->state != BOARD_READY) 5635 return 0; 5636 5637 return snprintf(buf, PAGE_SIZE, "%d\n", ch->ch_baud_info); 5638} 5639static DEVICE_ATTR(baud, S_IRUSR, dgap_tty_baud_show, NULL); 5640 5641static ssize_t dgap_tty_msignals_show(struct device *d, 5642 struct device_attribute *attr, 5643 char *buf) 5644{ 5645 struct board_t *bd; 5646 struct channel_t *ch; 5647 struct un_t *un; 5648 5649 if (!d) 5650 return 0; 5651 un = dev_get_drvdata(d); 5652 if (!un || un->magic != DGAP_UNIT_MAGIC) 5653 return 0; 5654 ch = un->un_ch; 5655 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5656 return 0; 5657 bd = ch->ch_bd; 5658 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5659 return 0; 5660 if (bd->state != BOARD_READY) 5661 return 0; 5662 5663 if (ch->ch_open_count) { 5664 return snprintf(buf, PAGE_SIZE, "%s %s %s %s %s %s\n", 5665 (ch->ch_mostat & UART_MCR_RTS) ? "RTS" : "", 5666 (ch->ch_mistat & UART_MSR_CTS) ? "CTS" : "", 5667 (ch->ch_mostat & UART_MCR_DTR) ? "DTR" : "", 5668 (ch->ch_mistat & UART_MSR_DSR) ? "DSR" : "", 5669 (ch->ch_mistat & UART_MSR_DCD) ? "DCD" : "", 5670 (ch->ch_mistat & UART_MSR_RI) ? "RI" : ""); 5671 } 5672 return 0; 5673} 5674static DEVICE_ATTR(msignals, S_IRUSR, dgap_tty_msignals_show, NULL); 5675 5676static ssize_t dgap_tty_iflag_show(struct device *d, 5677 struct device_attribute *attr, 5678 char *buf) 5679{ 5680 struct board_t *bd; 5681 struct channel_t *ch; 5682 struct un_t *un; 5683 5684 if (!d) 5685 return 0; 5686 un = dev_get_drvdata(d); 5687 if (!un || un->magic != DGAP_UNIT_MAGIC) 5688 return 0; 5689 ch = un->un_ch; 5690 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5691 return 0; 5692 bd = ch->ch_bd; 5693 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5694 return 0; 5695 if (bd->state != BOARD_READY) 5696 return 0; 5697 5698 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_iflag); 5699} 5700static DEVICE_ATTR(iflag, S_IRUSR, dgap_tty_iflag_show, NULL); 5701 5702static ssize_t dgap_tty_cflag_show(struct device *d, 5703 struct device_attribute *attr, 5704 char *buf) 5705{ 5706 struct board_t *bd; 5707 struct channel_t *ch; 5708 struct un_t *un; 5709 5710 if (!d) 5711 return 0; 5712 un = dev_get_drvdata(d); 5713 if (!un || un->magic != DGAP_UNIT_MAGIC) 5714 return 0; 5715 ch = un->un_ch; 5716 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5717 return 0; 5718 bd = ch->ch_bd; 5719 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5720 return 0; 5721 if (bd->state != BOARD_READY) 5722 return 0; 5723 5724 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_cflag); 5725} 5726static DEVICE_ATTR(cflag, S_IRUSR, dgap_tty_cflag_show, NULL); 5727 5728static ssize_t dgap_tty_oflag_show(struct device *d, 5729 struct device_attribute *attr, 5730 char *buf) 5731{ 5732 struct board_t *bd; 5733 struct channel_t *ch; 5734 struct un_t *un; 5735 5736 if (!d) 5737 return 0; 5738 un = dev_get_drvdata(d); 5739 if (!un || un->magic != DGAP_UNIT_MAGIC) 5740 return 0; 5741 ch = un->un_ch; 5742 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5743 return 0; 5744 bd = ch->ch_bd; 5745 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5746 return 0; 5747 if (bd->state != BOARD_READY) 5748 return 0; 5749 5750 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_oflag); 5751} 5752static DEVICE_ATTR(oflag, S_IRUSR, dgap_tty_oflag_show, NULL); 5753 5754static ssize_t dgap_tty_lflag_show(struct device *d, 5755 struct device_attribute *attr, 5756 char *buf) 5757{ 5758 struct board_t *bd; 5759 struct channel_t *ch; 5760 struct un_t *un; 5761 5762 if (!d) 5763 return 0; 5764 un = dev_get_drvdata(d); 5765 if (!un || un->magic != DGAP_UNIT_MAGIC) 5766 return 0; 5767 ch = un->un_ch; 5768 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5769 return 0; 5770 bd = ch->ch_bd; 5771 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5772 return 0; 5773 if (bd->state != BOARD_READY) 5774 return 0; 5775 5776 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_lflag); 5777} 5778static DEVICE_ATTR(lflag, S_IRUSR, dgap_tty_lflag_show, NULL); 5779 5780static ssize_t dgap_tty_digi_flag_show(struct device *d, 5781 struct device_attribute *attr, 5782 char *buf) 5783{ 5784 struct board_t *bd; 5785 struct channel_t *ch; 5786 struct un_t *un; 5787 5788 if (!d) 5789 return 0; 5790 un = dev_get_drvdata(d); 5791 if (!un || un->magic != DGAP_UNIT_MAGIC) 5792 return 0; 5793 ch = un->un_ch; 5794 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5795 return 0; 5796 bd = ch->ch_bd; 5797 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5798 return 0; 5799 if (bd->state != BOARD_READY) 5800 return 0; 5801 5802 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_digi.digi_flags); 5803} 5804static DEVICE_ATTR(digi_flag, S_IRUSR, dgap_tty_digi_flag_show, NULL); 5805 5806static ssize_t dgap_tty_rxcount_show(struct device *d, 5807 struct device_attribute *attr, 5808 char *buf) 5809{ 5810 struct board_t *bd; 5811 struct channel_t *ch; 5812 struct un_t *un; 5813 5814 if (!d) 5815 return 0; 5816 un = dev_get_drvdata(d); 5817 if (!un || un->magic != DGAP_UNIT_MAGIC) 5818 return 0; 5819 ch = un->un_ch; 5820 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5821 return 0; 5822 bd = ch->ch_bd; 5823 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5824 return 0; 5825 if (bd->state != BOARD_READY) 5826 return 0; 5827 5828 return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_rxcount); 5829} 5830static DEVICE_ATTR(rxcount, S_IRUSR, dgap_tty_rxcount_show, NULL); 5831 5832static ssize_t dgap_tty_txcount_show(struct device *d, 5833 struct device_attribute *attr, 5834 char *buf) 5835{ 5836 struct board_t *bd; 5837 struct channel_t *ch; 5838 struct un_t *un; 5839 5840 if (!d) 5841 return 0; 5842 un = dev_get_drvdata(d); 5843 if (!un || un->magic != DGAP_UNIT_MAGIC) 5844 return 0; 5845 ch = un->un_ch; 5846 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5847 return 0; 5848 bd = ch->ch_bd; 5849 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5850 return 0; 5851 if (bd->state != BOARD_READY) 5852 return 0; 5853 5854 return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_txcount); 5855} 5856static DEVICE_ATTR(txcount, S_IRUSR, dgap_tty_txcount_show, NULL); 5857 5858static ssize_t dgap_tty_name_show(struct device *d, 5859 struct device_attribute *attr, 5860 char *buf) 5861{ 5862 struct board_t *bd; 5863 struct channel_t *ch; 5864 struct un_t *un; 5865 int cn; 5866 int bn; 5867 struct cnode *cptr; 5868 int found = FALSE; 5869 int ncount = 0; 5870 int starto = 0; 5871 int i; 5872 5873 if (!d) 5874 return 0; 5875 un = dev_get_drvdata(d); 5876 if (!un || un->magic != DGAP_UNIT_MAGIC) 5877 return 0; 5878 ch = un->un_ch; 5879 if (!ch || ch->magic != DGAP_CHANNEL_MAGIC) 5880 return 0; 5881 bd = ch->ch_bd; 5882 if (!bd || bd->magic != DGAP_BOARD_MAGIC) 5883 return 0; 5884 if (bd->state != BOARD_READY) 5885 return 0; 5886 5887 bn = bd->boardnum; 5888 cn = ch->ch_portnum; 5889 5890 for (cptr = bd->bd_config; cptr; cptr = cptr->next) { 5891 5892 if ((cptr->type == BNODE) && 5893 ((cptr->u.board.type == APORT2_920P) || 5894 (cptr->u.board.type == APORT4_920P) || 5895 (cptr->u.board.type == APORT8_920P) || 5896 (cptr->u.board.type == PAPORT4) || 5897 (cptr->u.board.type == PAPORT8))) { 5898 5899 found = TRUE; 5900 if (cptr->u.board.v_start) 5901 starto = cptr->u.board.start; 5902 else 5903 starto = 1; 5904 } 5905 5906 if (cptr->type == TNODE && found == TRUE) { 5907 char *ptr1; 5908 5909 if (strstr(cptr->u.ttyname, "tty")) { 5910 ptr1 = cptr->u.ttyname; 5911 ptr1 += 3; 5912 } else 5913 ptr1 = cptr->u.ttyname; 5914 5915 for (i = 0; i < dgap_config_get_num_prts(bd); i++) { 5916 if (cn != i) 5917 continue; 5918 5919 return snprintf(buf, PAGE_SIZE, "%s%s%02d\n", 5920 (un->un_type == DGAP_PRINT) ? 5921 "pr" : "tty", 5922 ptr1, i + starto); 5923 } 5924 } 5925 5926 if (cptr->type == CNODE) { 5927 5928 for (i = 0; i < cptr->u.conc.nport; i++) { 5929 if (cn != (i + ncount)) 5930 continue; 5931 5932 return snprintf(buf, PAGE_SIZE, "%s%s%02ld\n", 5933 (un->un_type == DGAP_PRINT) ? 5934 "pr" : "tty", 5935 cptr->u.conc.id, 5936 i + (cptr->u.conc.v_start ? 5937 cptr->u.conc.start : 1)); 5938 } 5939 5940 ncount += cptr->u.conc.nport; 5941 } 5942 5943 if (cptr->type == MNODE) { 5944 5945 for (i = 0; i < cptr->u.module.nport; i++) { 5946 if (cn != (i + ncount)) 5947 continue; 5948 5949 return snprintf(buf, PAGE_SIZE, "%s%s%02ld\n", 5950 (un->un_type == DGAP_PRINT) ? 5951 "pr" : "tty", 5952 cptr->u.module.id, 5953 i + (cptr->u.module.v_start ? 5954 cptr->u.module.start : 1)); 5955 } 5956 5957 ncount += cptr->u.module.nport; 5958 } 5959 } 5960 5961 return snprintf(buf, PAGE_SIZE, "%s_dgap_%d_%d\n", 5962 (un->un_type == DGAP_PRINT) ? "pr" : "tty", bn, cn); 5963} 5964static DEVICE_ATTR(custom_name, S_IRUSR, dgap_tty_name_show, NULL); 5965 5966static struct attribute *dgap_sysfs_tty_entries[] = { 5967 &dev_attr_state.attr, 5968 &dev_attr_baud.attr, 5969 &dev_attr_msignals.attr, 5970 &dev_attr_iflag.attr, 5971 &dev_attr_cflag.attr, 5972 &dev_attr_oflag.attr, 5973 &dev_attr_lflag.attr, 5974 &dev_attr_digi_flag.attr, 5975 &dev_attr_rxcount.attr, 5976 &dev_attr_txcount.attr, 5977 &dev_attr_custom_name.attr, 5978 NULL 5979}; 5980 5981 5982/* this function creates the sys files that will export each signal status 5983 * to sysfs each value will be put in a separate filename 5984 */ 5985static void dgap_create_ports_sysfiles(struct board_t *bd) 5986{ 5987 dev_set_drvdata(&bd->pdev->dev, bd); 5988 device_create_file(&(bd->pdev->dev), &dev_attr_ports_state); 5989 device_create_file(&(bd->pdev->dev), &dev_attr_ports_baud); 5990 device_create_file(&(bd->pdev->dev), &dev_attr_ports_msignals); 5991 device_create_file(&(bd->pdev->dev), &dev_attr_ports_iflag); 5992 device_create_file(&(bd->pdev->dev), &dev_attr_ports_cflag); 5993 device_create_file(&(bd->pdev->dev), &dev_attr_ports_oflag); 5994 device_create_file(&(bd->pdev->dev), &dev_attr_ports_lflag); 5995 device_create_file(&(bd->pdev->dev), &dev_attr_ports_digi_flag); 5996 device_create_file(&(bd->pdev->dev), &dev_attr_ports_rxcount); 5997 device_create_file(&(bd->pdev->dev), &dev_attr_ports_txcount); 5998} 5999 6000/* removes all the sys files created for that port */ 6001static void dgap_remove_ports_sysfiles(struct board_t *bd) 6002{ 6003 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_state); 6004 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_baud); 6005 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_msignals); 6006 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_iflag); 6007 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_cflag); 6008 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_oflag); 6009 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_lflag); 6010 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_digi_flag); 6011 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_rxcount); 6012 device_remove_file(&(bd->pdev->dev), &dev_attr_ports_txcount); 6013} 6014 6015/* 6016 * Copies the BIOS code from the user to the board, 6017 * and starts the BIOS running. 6018 */ 6019static void dgap_do_bios_load(struct board_t *brd, const u8 *ubios, int len) 6020{ 6021 u8 __iomem *addr; 6022 uint offset; 6023 unsigned int i; 6024 6025 if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase) 6026 return; 6027 6028 addr = brd->re_map_membase; 6029 6030 /* 6031 * clear POST area 6032 */ 6033 for (i = 0; i < 16; i++) 6034 writeb(0, addr + POSTAREA + i); 6035 6036 /* 6037 * Download bios 6038 */ 6039 offset = 0x1000; 6040 memcpy_toio(addr + offset, ubios, len); 6041 6042 writel(0x0bf00401, addr); 6043 writel(0, (addr + 4)); 6044 6045 /* Clear the reset, and change states. */ 6046 writeb(FEPCLR, brd->re_map_port); 6047} 6048 6049/* 6050 * Checks to see if the BIOS completed running on the card. 6051 */ 6052static int dgap_test_bios(struct board_t *brd) 6053{ 6054 u8 __iomem *addr; 6055 u16 word; 6056 u16 err1; 6057 u16 err2; 6058 6059 if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase) 6060 return -EINVAL; 6061 6062 addr = brd->re_map_membase; 6063 word = readw(addr + POSTAREA); 6064 6065 /* 6066 * It can take 5-6 seconds for a board to 6067 * pass the bios self test and post results. 6068 * Give it 10 seconds. 6069 */ 6070 brd->wait_for_bios = 0; 6071 while (brd->wait_for_bios < 1000) { 6072 /* Check to see if BIOS thinks board is good. (GD). */ 6073 if (word == *(u16 *) "GD") 6074 return 0; 6075 msleep_interruptible(10); 6076 brd->wait_for_bios++; 6077 word = readw(addr + POSTAREA); 6078 } 6079 6080 /* Gave up on board after too long of time taken */ 6081 err1 = readw(addr + SEQUENCE); 6082 err2 = readw(addr + ERROR); 6083 dev_warn(&brd->pdev->dev, "%s failed diagnostics. Error #(%x,%x).\n", 6084 brd->name, err1, err2); 6085 brd->state = BOARD_FAILED; 6086 brd->dpastatus = BD_NOBIOS; 6087 6088 return -EIO; 6089} 6090 6091/* 6092 * Copies the FEP code from the user to the board, 6093 * and starts the FEP running. 6094 */ 6095static void dgap_do_fep_load(struct board_t *brd, const u8 *ufep, int len) 6096{ 6097 u8 __iomem *addr; 6098 uint offset; 6099 6100 if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase) 6101 return; 6102 6103 addr = brd->re_map_membase; 6104 6105 /* 6106 * Download FEP 6107 */ 6108 offset = 0x1000; 6109 memcpy_toio(addr + offset, ufep, len); 6110 6111 /* 6112 * If board is a concentrator product, we need to give 6113 * it its config string describing how the concentrators look. 6114 */ 6115 if ((brd->type == PCX) || (brd->type == PEPC)) { 6116 u8 string[100]; 6117 u8 __iomem *config; 6118 u8 *xconfig; 6119 unsigned int i = 0; 6120 6121 xconfig = dgap_create_config_string(brd, string); 6122 6123 /* Write string to board memory */ 6124 config = addr + CONFIG; 6125 for (; i < CONFIGSIZE; i++, config++, xconfig++) { 6126 writeb(*xconfig, config); 6127 if ((*xconfig & 0xff) == 0xff) 6128 break; 6129 } 6130 } 6131 6132 writel(0xbfc01004, (addr + 0xc34)); 6133 writel(0x3, (addr + 0xc30)); 6134 6135} 6136 6137/* 6138 * Waits for the FEP to report thats its ready for us to use. 6139 */ 6140static int dgap_test_fep(struct board_t *brd) 6141{ 6142 u8 __iomem *addr; 6143 u16 word; 6144 u16 err1; 6145 u16 err2; 6146 6147 if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase) 6148 return -EINVAL; 6149 6150 addr = brd->re_map_membase; 6151 word = readw(addr + FEPSTAT); 6152 6153 /* 6154 * It can take 2-3 seconds for the FEP to 6155 * be up and running. Give it 5 secs. 6156 */ 6157 brd->wait_for_fep = 0; 6158 while (brd->wait_for_fep < 500) { 6159 /* Check to see if FEP is up and running now. */ 6160 if (word == *(u16 *) "OS") { 6161 /* 6162 * Check to see if the board can support FEP5+ commands. 6163 */ 6164 word = readw(addr + FEP5_PLUS); 6165 if (word == *(u16 *) "5A") 6166 brd->bd_flags |= BD_FEP5PLUS; 6167 6168 return 0; 6169 } 6170 msleep_interruptible(10); 6171 brd->wait_for_fep++; 6172 word = readw(addr + FEPSTAT); 6173 } 6174 6175 /* Gave up on board after too long of time taken */ 6176 err1 = readw(addr + SEQUENCE); 6177 err2 = readw(addr + ERROR); 6178 dev_warn(&brd->pdev->dev, 6179 "FEPOS for %s not functioning. Error #(%x,%x).\n", 6180 brd->name, err1, err2); 6181 brd->state = BOARD_FAILED; 6182 brd->dpastatus = BD_NOFEP; 6183 6184 return -EIO; 6185} 6186 6187/* 6188 * Physically forces the FEP5 card to reset itself. 6189 */ 6190static void dgap_do_reset_board(struct board_t *brd) 6191{ 6192 u8 check; 6193 u32 check1; 6194 u32 check2; 6195 unsigned int i; 6196 6197 if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || 6198 !brd->re_map_membase || !brd->re_map_port) 6199 return; 6200 6201 /* FEPRST does not vary among supported boards */ 6202 writeb(FEPRST, brd->re_map_port); 6203 6204 for (i = 0; i <= 1000; i++) { 6205 check = readb(brd->re_map_port) & 0xe; 6206 if (check == FEPRST) 6207 break; 6208 udelay(10); 6209 6210 } 6211 if (i > 1000) { 6212 dev_warn(&brd->pdev->dev, 6213 "dgap: Board not resetting... Failing board.\n"); 6214 brd->state = BOARD_FAILED; 6215 brd->dpastatus = BD_NOFEP; 6216 return; 6217 } 6218 6219 /* 6220 * Make sure there really is memory out there. 6221 */ 6222 writel(0xa55a3cc3, (brd->re_map_membase + LOWMEM)); 6223 writel(0x5aa5c33c, (brd->re_map_membase + HIGHMEM)); 6224 check1 = readl(brd->re_map_membase + LOWMEM); 6225 check2 = readl(brd->re_map_membase + HIGHMEM); 6226 6227 if ((check1 != 0xa55a3cc3) || (check2 != 0x5aa5c33c)) { 6228 dev_warn(&brd->pdev->dev, 6229 "No memory at %p for board.\n", 6230 brd->re_map_membase); 6231 brd->state = BOARD_FAILED; 6232 brd->dpastatus = BD_NOFEP; 6233 return; 6234 } 6235} 6236 6237#ifdef DIGI_CONCENTRATORS_SUPPORTED 6238/* 6239 * Sends a concentrator image into the FEP5 board. 6240 */ 6241static void dgap_do_conc_load(struct board_t *brd, u8 *uaddr, int len) 6242{ 6243 char __iomem *vaddr; 6244 u16 offset; 6245 struct downld_t *to_dp; 6246 6247 if (!brd || (brd->magic != DGAP_BOARD_MAGIC) || !brd->re_map_membase) 6248 return; 6249 6250 vaddr = brd->re_map_membase; 6251 6252 offset = readw((u16 *) (vaddr + DOWNREQ)); 6253 to_dp = (struct downld_t *) (vaddr + (int) offset); 6254 memcpy_toio(to_dp, uaddr, len); 6255 6256 /* Tell card we have data for it */ 6257 writew(0, vaddr + (DOWNREQ)); 6258 6259 brd->conc_dl_status = NO_PENDING_CONCENTRATOR_REQUESTS; 6260} 6261#endif 6262 6263#define EXPANSION_ROM_SIZE (64 * 1024) 6264#define FEP5_ROM_MAGIC (0xFEFFFFFF) 6265 6266static void dgap_get_vpd(struct board_t *brd) 6267{ 6268 u32 magic; 6269 u32 base_offset; 6270 u16 rom_offset; 6271 u16 vpd_offset; 6272 u16 image_length; 6273 u16 i; 6274 u8 byte1; 6275 u8 byte2; 6276 6277 /* 6278 * Poke the magic number at the PCI Rom Address location. 6279 * If VPD is supported, the value read from that address 6280 * will be non-zero. 6281 */ 6282 magic = FEP5_ROM_MAGIC; 6283 pci_write_config_dword(brd->pdev, PCI_ROM_ADDRESS, magic); 6284 pci_read_config_dword(brd->pdev, PCI_ROM_ADDRESS, &magic); 6285 6286 /* VPD not supported, bail */ 6287 if (!magic) 6288 return; 6289 6290 /* 6291 * To get to the OTPROM memory, we have to send the boards base 6292 * address or'ed with 1 into the PCI Rom Address location. 6293 */ 6294 magic = brd->membase | 0x01; 6295 pci_write_config_dword(brd->pdev, PCI_ROM_ADDRESS, magic); 6296 pci_read_config_dword(brd->pdev, PCI_ROM_ADDRESS, &magic); 6297 6298 byte1 = readb(brd->re_map_membase); 6299 byte2 = readb(brd->re_map_membase + 1); 6300 6301 /* 6302 * If the board correctly swapped to the OTPROM memory, 6303 * the first 2 bytes (header) should be 0x55, 0xAA 6304 */ 6305 if (byte1 == 0x55 && byte2 == 0xAA) { 6306 6307 base_offset = 0; 6308 6309 /* 6310 * We have to run through all the OTPROM memory looking 6311 * for the VPD offset. 6312 */ 6313 while (base_offset <= EXPANSION_ROM_SIZE) { 6314 6315 /* 6316 * Lots of magic numbers here. 6317 * 6318 * The VPD offset is located inside the ROM Data 6319 * Structure. 6320 * 6321 * We also have to remember the length of each 6322 * ROM Data Structure, so we can "hop" to the next 6323 * entry if the VPD isn't in the current 6324 * ROM Data Structure. 6325 */ 6326 rom_offset = readw(brd->re_map_membase + 6327 base_offset + 0x18); 6328 image_length = readw(brd->re_map_membase + 6329 rom_offset + 0x10) * 512; 6330 vpd_offset = readw(brd->re_map_membase + 6331 rom_offset + 0x08); 6332 6333 /* Found the VPD entry */ 6334 if (vpd_offset) 6335 break; 6336 6337 /* We didn't find a VPD entry, go to next ROM entry. */ 6338 base_offset += image_length; 6339 6340 byte1 = readb(brd->re_map_membase + base_offset); 6341 byte2 = readb(brd->re_map_membase + base_offset + 1); 6342 6343 /* 6344 * If the new ROM offset doesn't have 0x55, 0xAA 6345 * as its header, we have run out of ROM. 6346 */ 6347 if (byte1 != 0x55 || byte2 != 0xAA) 6348 break; 6349 } 6350 6351 /* 6352 * If we have a VPD offset, then mark the board 6353 * as having a valid VPD, and copy VPDSIZE (512) bytes of 6354 * that VPD to the buffer we have in our board structure. 6355 */ 6356 if (vpd_offset) { 6357 brd->bd_flags |= BD_HAS_VPD; 6358 for (i = 0; i < VPDSIZE; i++) { 6359 brd->vpd[i] = readb(brd->re_map_membase + 6360 vpd_offset + i); 6361 } 6362 } 6363 } 6364 6365 /* 6366 * We MUST poke the magic number at the PCI Rom Address location again. 6367 * This makes the card report the regular board memory back to us, 6368 * rather than the OTPROM memory. 6369 */ 6370 magic = FEP5_ROM_MAGIC; 6371 pci_write_config_dword(brd->pdev, PCI_ROM_ADDRESS, magic); 6372} 6373 6374 6375static ssize_t dgap_driver_version_show(struct device_driver *ddp, char *buf) 6376{ 6377 return snprintf(buf, PAGE_SIZE, "%s\n", DG_PART); 6378} 6379static DRIVER_ATTR(version, S_IRUSR, dgap_driver_version_show, NULL); 6380 6381 6382static ssize_t dgap_driver_boards_show(struct device_driver *ddp, char *buf) 6383{ 6384 return snprintf(buf, PAGE_SIZE, "%d\n", dgap_numboards); 6385} 6386static DRIVER_ATTR(boards, S_IRUSR, dgap_driver_boards_show, NULL); 6387 6388 6389static ssize_t dgap_driver_maxboards_show(struct device_driver *ddp, char *buf) 6390{ 6391 return snprintf(buf, PAGE_SIZE, "%d\n", MAXBOARDS); 6392} 6393static DRIVER_ATTR(maxboards, S_IRUSR, dgap_driver_maxboards_show, NULL); 6394 6395 6396static ssize_t dgap_driver_pollcounter_show(struct device_driver *ddp, 6397 char *buf) 6398{ 6399 return snprintf(buf, PAGE_SIZE, "%ld\n", dgap_poll_counter); 6400} 6401static DRIVER_ATTR(pollcounter, S_IRUSR, dgap_driver_pollcounter_show, NULL); 6402 6403static ssize_t dgap_driver_pollrate_show(struct device_driver *ddp, char *buf) 6404{ 6405 return snprintf(buf, PAGE_SIZE, "%dms\n", dgap_poll_tick); 6406} 6407 6408static ssize_t dgap_driver_pollrate_store(struct device_driver *ddp, 6409 const char *buf, size_t count) 6410{ 6411 if (sscanf(buf, "%d\n", &dgap_poll_tick) != 1) 6412 return -EINVAL; 6413 return count; 6414} 6415static DRIVER_ATTR(pollrate, (S_IRUSR | S_IWUSR), dgap_driver_pollrate_show, 6416 dgap_driver_pollrate_store); 6417 6418 6419static int dgap_create_driver_sysfiles(struct pci_driver *dgap_driver) 6420{ 6421 int rc = 0; 6422 struct device_driver *driverfs = &dgap_driver->driver; 6423 6424 rc |= driver_create_file(driverfs, &driver_attr_version); 6425 rc |= driver_create_file(driverfs, &driver_attr_boards); 6426 rc |= driver_create_file(driverfs, &driver_attr_maxboards); 6427 rc |= driver_create_file(driverfs, &driver_attr_pollrate); 6428 rc |= driver_create_file(driverfs, &driver_attr_pollcounter); 6429 6430 return rc; 6431} 6432 6433static void dgap_remove_driver_sysfiles(struct pci_driver *dgap_driver) 6434{ 6435 struct device_driver *driverfs = &dgap_driver->driver; 6436 6437 driver_remove_file(driverfs, &driver_attr_version); 6438 driver_remove_file(driverfs, &driver_attr_boards); 6439 driver_remove_file(driverfs, &driver_attr_maxboards); 6440 driver_remove_file(driverfs, &driver_attr_pollrate); 6441 driver_remove_file(driverfs, &driver_attr_pollcounter); 6442} 6443 6444static struct attribute_group dgap_tty_attribute_group = { 6445 .name = NULL, 6446 .attrs = dgap_sysfs_tty_entries, 6447}; 6448 6449static void dgap_create_tty_sysfs(struct un_t *un, struct device *c) 6450{ 6451 int ret; 6452 6453 ret = sysfs_create_group(&c->kobj, &dgap_tty_attribute_group); 6454 if (ret) 6455 return; 6456 6457 dev_set_drvdata(c, un); 6458 6459} 6460 6461static void dgap_remove_tty_sysfs(struct device *c) 6462{ 6463 sysfs_remove_group(&c->kobj, &dgap_tty_attribute_group); 6464} 6465 6466/* 6467 * Create pr and tty device entries 6468 */ 6469static int dgap_tty_register_ports(struct board_t *brd) 6470{ 6471 struct channel_t *ch; 6472 int i; 6473 int ret; 6474 6475 brd->serial_ports = kcalloc(brd->nasync, sizeof(*brd->serial_ports), 6476 GFP_KERNEL); 6477 if (!brd->serial_ports) 6478 return -ENOMEM; 6479 6480 brd->printer_ports = kcalloc(brd->nasync, sizeof(*brd->printer_ports), 6481 GFP_KERNEL); 6482 if (!brd->printer_ports) { 6483 ret = -ENOMEM; 6484 goto free_serial_ports; 6485 } 6486 6487 for (i = 0; i < brd->nasync; i++) { 6488 tty_port_init(&brd->serial_ports[i]); 6489 tty_port_init(&brd->printer_ports[i]); 6490 } 6491 6492 ch = brd->channels[0]; 6493 for (i = 0; i < brd->nasync; i++, ch = brd->channels[i]) { 6494 6495 struct device *classp; 6496 6497 classp = tty_port_register_device(&brd->serial_ports[i], 6498 brd->serial_driver, 6499 i, NULL); 6500 6501 if (IS_ERR(classp)) { 6502 ret = PTR_ERR(classp); 6503 goto unregister_ttys; 6504 } 6505 6506 dgap_create_tty_sysfs(&ch->ch_tun, classp); 6507 ch->ch_tun.un_sysfs = classp; 6508 6509 classp = tty_port_register_device(&brd->printer_ports[i], 6510 brd->print_driver, 6511 i, NULL); 6512 6513 if (IS_ERR(classp)) { 6514 ret = PTR_ERR(classp); 6515 goto unregister_ttys; 6516 } 6517 6518 dgap_create_tty_sysfs(&ch->ch_pun, classp); 6519 ch->ch_pun.un_sysfs = classp; 6520 } 6521 dgap_create_ports_sysfiles(brd); 6522 6523 return 0; 6524 6525unregister_ttys: 6526 while (i >= 0) { 6527 ch = brd->channels[i]; 6528 if (ch->ch_tun.un_sysfs) { 6529 dgap_remove_tty_sysfs(ch->ch_tun.un_sysfs); 6530 tty_unregister_device(brd->serial_driver, i); 6531 } 6532 6533 if (ch->ch_pun.un_sysfs) { 6534 dgap_remove_tty_sysfs(ch->ch_pun.un_sysfs); 6535 tty_unregister_device(brd->print_driver, i); 6536 } 6537 i--; 6538 } 6539 6540 for (i = 0; i < brd->nasync; i++) { 6541 tty_port_destroy(&brd->serial_ports[i]); 6542 tty_port_destroy(&brd->printer_ports[i]); 6543 } 6544 6545 kfree(brd->printer_ports); 6546 brd->printer_ports = NULL; 6547 6548free_serial_ports: 6549 kfree(brd->serial_ports); 6550 brd->serial_ports = NULL; 6551 6552 return ret; 6553} 6554 6555/* 6556 * dgap_cleanup_tty() 6557 * 6558 * Uninitialize the TTY portion of this driver. Free all memory and 6559 * resources. 6560 */ 6561static void dgap_cleanup_tty(struct board_t *brd) 6562{ 6563 struct device *dev; 6564 unsigned int i; 6565 6566 for (i = 0; i < brd->nasync; i++) { 6567 tty_port_destroy(&brd->serial_ports[i]); 6568 dev = brd->channels[i]->ch_tun.un_sysfs; 6569 dgap_remove_tty_sysfs(dev); 6570 tty_unregister_device(brd->serial_driver, i); 6571 } 6572 tty_unregister_driver(brd->serial_driver); 6573 put_tty_driver(brd->serial_driver); 6574 kfree(brd->serial_ports); 6575 6576 for (i = 0; i < brd->nasync; i++) { 6577 tty_port_destroy(&brd->printer_ports[i]); 6578 dev = brd->channels[i]->ch_pun.un_sysfs; 6579 dgap_remove_tty_sysfs(dev); 6580 tty_unregister_device(brd->print_driver, i); 6581 } 6582 tty_unregister_driver(brd->print_driver); 6583 put_tty_driver(brd->print_driver); 6584 kfree(brd->printer_ports); 6585} 6586 6587static int dgap_request_irq(struct board_t *brd) 6588{ 6589 int rc; 6590 6591 if (!brd || brd->magic != DGAP_BOARD_MAGIC) 6592 return -ENODEV; 6593 6594 /* 6595 * Set up our interrupt handler if we are set to do interrupts. 6596 */ 6597 if (dgap_config_get_useintr(brd) && brd->irq) { 6598 6599 rc = request_irq(brd->irq, dgap_intr, IRQF_SHARED, "DGAP", brd); 6600 6601 if (!rc) 6602 brd->intr_used = 1; 6603 } 6604 return 0; 6605} 6606 6607static void dgap_free_irq(struct board_t *brd) 6608{ 6609 if (brd->intr_used && brd->irq) 6610 free_irq(brd->irq, brd); 6611} 6612 6613static int dgap_firmware_load(struct pci_dev *pdev, int card_type, 6614 struct board_t *brd) 6615{ 6616 const struct firmware *fw; 6617 char *tmp_ptr; 6618 int ret; 6619 char *dgap_config_buf; 6620 6621 dgap_get_vpd(brd); 6622 dgap_do_reset_board(brd); 6623 6624 if (fw_info[card_type].conf_name) { 6625 ret = request_firmware(&fw, fw_info[card_type].conf_name, 6626 &pdev->dev); 6627 if (ret) { 6628 dev_err(&pdev->dev, "config file %s not found\n", 6629 fw_info[card_type].conf_name); 6630 return ret; 6631 } 6632 6633 dgap_config_buf = kzalloc(fw->size + 1, GFP_KERNEL); 6634 if (!dgap_config_buf) { 6635 release_firmware(fw); 6636 return -ENOMEM; 6637 } 6638 6639 memcpy(dgap_config_buf, fw->data, fw->size); 6640 release_firmware(fw); 6641 6642 /* 6643 * preserve dgap_config_buf 6644 * as dgap_parsefile would 6645 * otherwise alter it. 6646 */ 6647 tmp_ptr = dgap_config_buf; 6648 6649 if (dgap_parsefile(&tmp_ptr) != 0) { 6650 kfree(dgap_config_buf); 6651 return -EINVAL; 6652 } 6653 kfree(dgap_config_buf); 6654 } 6655 6656 /* 6657 * Match this board to a config the user created for us. 6658 */ 6659 brd->bd_config = 6660 dgap_find_config(brd->type, brd->pci_bus, brd->pci_slot); 6661 6662 /* 6663 * Because the 4 port Xr products share the same PCI ID 6664 * as the 8 port Xr products, if we receive a NULL config 6665 * back, and this is a PAPORT8 board, retry with a 6666 * PAPORT4 attempt as well. 6667 */ 6668 if (brd->type == PAPORT8 && !brd->bd_config) 6669 brd->bd_config = 6670 dgap_find_config(PAPORT4, brd->pci_bus, brd->pci_slot); 6671 6672 if (!brd->bd_config) { 6673 dev_err(&pdev->dev, "No valid configuration found\n"); 6674 return -EINVAL; 6675 } 6676 6677 if (fw_info[card_type].bios_name) { 6678 ret = request_firmware(&fw, fw_info[card_type].bios_name, 6679 &pdev->dev); 6680 if (ret) { 6681 dev_err(&pdev->dev, "bios file %s not found\n", 6682 fw_info[card_type].bios_name); 6683 return ret; 6684 } 6685 dgap_do_bios_load(brd, fw->data, fw->size); 6686 release_firmware(fw); 6687 6688 /* Wait for BIOS to test board... */ 6689 ret = dgap_test_bios(brd); 6690 if (ret) 6691 return ret; 6692 } 6693 6694 if (fw_info[card_type].fep_name) { 6695 ret = request_firmware(&fw, fw_info[card_type].fep_name, 6696 &pdev->dev); 6697 if (ret) { 6698 dev_err(&pdev->dev, "dgap: fep file %s not found\n", 6699 fw_info[card_type].fep_name); 6700 return ret; 6701 } 6702 dgap_do_fep_load(brd, fw->data, fw->size); 6703 release_firmware(fw); 6704 6705 /* Wait for FEP to load on board... */ 6706 ret = dgap_test_fep(brd); 6707 if (ret) 6708 return ret; 6709 } 6710 6711#ifdef DIGI_CONCENTRATORS_SUPPORTED 6712 /* 6713 * If this is a CX or EPCX, we need to see if the firmware 6714 * is requesting a concentrator image from us. 6715 */ 6716 if ((bd->type == PCX) || (bd->type == PEPC)) { 6717 chk_addr = (u16 *) (vaddr + DOWNREQ); 6718 /* Nonzero if FEP is requesting concentrator image. */ 6719 check = readw(chk_addr); 6720 vaddr = brd->re_map_membase; 6721 } 6722 6723 if (fw_info[card_type].con_name && check && vaddr) { 6724 ret = request_firmware(&fw, fw_info[card_type].con_name, 6725 &pdev->dev); 6726 if (ret) { 6727 dev_err(&pdev->dev, "conc file %s not found\n", 6728 fw_info[card_type].con_name); 6729 return ret; 6730 } 6731 /* Put concentrator firmware loading code here */ 6732 offset = readw((u16 *) (vaddr + DOWNREQ)); 6733 memcpy_toio(offset, fw->data, fw->size); 6734 6735 dgap_do_conc_load(brd, (char *)fw->data, fw->size) 6736 release_firmware(fw); 6737 } 6738#endif 6739 6740 return 0; 6741} 6742 6743/* 6744 * dgap_tty_init() 6745 * 6746 * Init the tty subsystem. Called once per board after board has been 6747 * downloaded and init'ed. 6748 */ 6749static int dgap_tty_init(struct board_t *brd) 6750{ 6751 int i; 6752 int tlw; 6753 uint true_count; 6754 u8 __iomem *vaddr; 6755 u8 modem; 6756 struct channel_t *ch; 6757 struct bs_t __iomem *bs; 6758 struct cm_t __iomem *cm; 6759 int ret; 6760 6761 /* 6762 * Initialize board structure elements. 6763 */ 6764 6765 vaddr = brd->re_map_membase; 6766 true_count = readw((vaddr + NCHAN)); 6767 6768 brd->nasync = dgap_config_get_num_prts(brd); 6769 6770 if (!brd->nasync) 6771 brd->nasync = brd->maxports; 6772 6773 if (brd->nasync > brd->maxports) 6774 brd->nasync = brd->maxports; 6775 6776 if (true_count != brd->nasync) { 6777 dev_warn(&brd->pdev->dev, 6778 "%s configured for %d ports, has %d ports.\n", 6779 brd->name, brd->nasync, true_count); 6780 6781 if ((brd->type == PPCM) && 6782 (true_count == 64 || true_count == 0)) { 6783 dev_warn(&brd->pdev->dev, 6784 "Please make SURE the EBI cable running from the card\n"); 6785 dev_warn(&brd->pdev->dev, 6786 "to each EM module is plugged into EBI IN!\n"); 6787 } 6788 6789 brd->nasync = true_count; 6790 6791 /* If no ports, don't bother going any further */ 6792 if (!brd->nasync) { 6793 brd->state = BOARD_FAILED; 6794 brd->dpastatus = BD_NOFEP; 6795 return -EIO; 6796 } 6797 } 6798 6799 /* 6800 * Allocate channel memory that might not have been allocated 6801 * when the driver was first loaded. 6802 */ 6803 for (i = 0; i < brd->nasync; i++) { 6804 brd->channels[i] = 6805 kzalloc(sizeof(struct channel_t), GFP_KERNEL); 6806 if (!brd->channels[i]) { 6807 ret = -ENOMEM; 6808 goto free_chan; 6809 } 6810 } 6811 6812 ch = brd->channels[0]; 6813 vaddr = brd->re_map_membase; 6814 6815 bs = (struct bs_t __iomem *) ((ulong) vaddr + CHANBUF); 6816 cm = (struct cm_t __iomem *) ((ulong) vaddr + CMDBUF); 6817 6818 brd->bd_bs = bs; 6819 6820 /* Set up channel variables */ 6821 for (i = 0; i < brd->nasync; i++, ch = brd->channels[i], bs++) { 6822 6823 spin_lock_init(&ch->ch_lock); 6824 6825 /* Store all our magic numbers */ 6826 ch->magic = DGAP_CHANNEL_MAGIC; 6827 ch->ch_tun.magic = DGAP_UNIT_MAGIC; 6828 ch->ch_tun.un_type = DGAP_SERIAL; 6829 ch->ch_tun.un_ch = ch; 6830 ch->ch_tun.un_dev = i; 6831 6832 ch->ch_pun.magic = DGAP_UNIT_MAGIC; 6833 ch->ch_pun.un_type = DGAP_PRINT; 6834 ch->ch_pun.un_ch = ch; 6835 ch->ch_pun.un_dev = i; 6836 6837 ch->ch_vaddr = vaddr; 6838 ch->ch_bs = bs; 6839 ch->ch_cm = cm; 6840 ch->ch_bd = brd; 6841 ch->ch_portnum = i; 6842 ch->ch_digi = dgap_digi_init; 6843 6844 /* 6845 * Set up digi dsr and dcd bits based on altpin flag. 6846 */ 6847 if (dgap_config_get_altpin(brd)) { 6848 ch->ch_dsr = DM_CD; 6849 ch->ch_cd = DM_DSR; 6850 ch->ch_digi.digi_flags |= DIGI_ALTPIN; 6851 } else { 6852 ch->ch_cd = DM_CD; 6853 ch->ch_dsr = DM_DSR; 6854 } 6855 6856 ch->ch_taddr = vaddr + (ioread16(&(ch->ch_bs->tx_seg)) << 4); 6857 ch->ch_raddr = vaddr + (ioread16(&(ch->ch_bs->rx_seg)) << 4); 6858 ch->ch_tx_win = 0; 6859 ch->ch_rx_win = 0; 6860 ch->ch_tsize = readw(&(ch->ch_bs->tx_max)) + 1; 6861 ch->ch_rsize = readw(&(ch->ch_bs->rx_max)) + 1; 6862 ch->ch_tstart = 0; 6863 ch->ch_rstart = 0; 6864 6865 /* 6866 * Set queue water marks, interrupt mask, 6867 * and general tty parameters. 6868 */ 6869 tlw = ch->ch_tsize >= 2000 ? ((ch->ch_tsize * 5) / 8) : 6870 ch->ch_tsize / 2; 6871 ch->ch_tlw = tlw; 6872 6873 dgap_cmdw(ch, STLOW, tlw, 0); 6874 6875 dgap_cmdw(ch, SRLOW, ch->ch_rsize / 2, 0); 6876 6877 dgap_cmdw(ch, SRHIGH, 7 * ch->ch_rsize / 8, 0); 6878 6879 ch->ch_mistat = readb(&(ch->ch_bs->m_stat)); 6880 6881 init_waitqueue_head(&ch->ch_flags_wait); 6882 init_waitqueue_head(&ch->ch_tun.un_flags_wait); 6883 init_waitqueue_head(&ch->ch_pun.un_flags_wait); 6884 6885 /* Turn on all modem interrupts for now */ 6886 modem = (DM_CD | DM_DSR | DM_CTS | DM_RI); 6887 writeb(modem, &(ch->ch_bs->m_int)); 6888 6889 /* 6890 * Set edelay to 0 if interrupts are turned on, 6891 * otherwise set edelay to the usual 100. 6892 */ 6893 if (brd->intr_used) 6894 writew(0, &(ch->ch_bs->edelay)); 6895 else 6896 writew(100, &(ch->ch_bs->edelay)); 6897 6898 writeb(1, &(ch->ch_bs->idata)); 6899 } 6900 6901 return 0; 6902 6903free_chan: 6904 while (--i >= 0) { 6905 kfree(brd->channels[i]); 6906 brd->channels[i] = NULL; 6907 } 6908 return ret; 6909} 6910 6911/* 6912 * dgap_tty_free() 6913 * 6914 * Free the channles which are allocated in dgap_tty_init(). 6915 */ 6916static void dgap_tty_free(struct board_t *brd) 6917{ 6918 int i; 6919 6920 for (i = 0; i < brd->nasync; i++) 6921 kfree(brd->channels[i]); 6922} 6923 6924static int dgap_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 6925{ 6926 int rc; 6927 struct board_t *brd; 6928 6929 if (dgap_numboards >= MAXBOARDS) 6930 return -EPERM; 6931 6932 rc = pci_enable_device(pdev); 6933 if (rc) 6934 return -EIO; 6935 6936 brd = dgap_found_board(pdev, ent->driver_data, dgap_numboards); 6937 if (IS_ERR(brd)) 6938 return PTR_ERR(brd); 6939 6940 rc = dgap_firmware_load(pdev, ent->driver_data, brd); 6941 if (rc) 6942 goto cleanup_brd; 6943 6944 rc = dgap_alloc_flipbuf(brd); 6945 if (rc) 6946 goto cleanup_brd; 6947 6948 rc = dgap_tty_register(brd); 6949 if (rc) 6950 goto free_flipbuf; 6951 6952 rc = dgap_request_irq(brd); 6953 if (rc) 6954 goto unregister_tty; 6955 6956 /* 6957 * Do tty device initialization. 6958 */ 6959 rc = dgap_tty_init(brd); 6960 if (rc < 0) 6961 goto free_irq; 6962 6963 rc = dgap_tty_register_ports(brd); 6964 if (rc) 6965 goto tty_free; 6966 6967 brd->state = BOARD_READY; 6968 brd->dpastatus = BD_RUNNING; 6969 6970 dgap_board[dgap_numboards++] = brd; 6971 6972 return 0; 6973 6974tty_free: 6975 dgap_tty_free(brd); 6976free_irq: 6977 dgap_free_irq(brd); 6978unregister_tty: 6979 dgap_tty_unregister(brd); 6980free_flipbuf: 6981 dgap_free_flipbuf(brd); 6982cleanup_brd: 6983 dgap_cleanup_nodes(); 6984 dgap_unmap(brd); 6985 kfree(brd); 6986 6987 return rc; 6988} 6989 6990static void dgap_remove_one(struct pci_dev *dev) 6991{ 6992 /* Do Nothing */ 6993} 6994 6995static struct pci_driver dgap_driver = { 6996 .name = "dgap", 6997 .probe = dgap_init_one, 6998 .id_table = dgap_pci_tbl, 6999 .remove = dgap_remove_one, 7000}; 7001 7002/* 7003 * Start of driver. 7004 */ 7005static int dgap_start(void) 7006{ 7007 int rc; 7008 unsigned long flags; 7009 struct device *device; 7010 7011 dgap_numboards = 0; 7012 7013 pr_info("For the tools package please visit http://www.digi.com\n"); 7014 7015 /* 7016 * Register our base character device into the kernel. 7017 */ 7018 7019 /* 7020 * Register management/dpa devices 7021 */ 7022 rc = register_chrdev(DIGI_DGAP_MAJOR, "dgap", &dgap_board_fops); 7023 if (rc < 0) 7024 return rc; 7025 7026 dgap_class = class_create(THIS_MODULE, "dgap_mgmt"); 7027 if (IS_ERR(dgap_class)) { 7028 rc = PTR_ERR(dgap_class); 7029 goto failed_class; 7030 } 7031 7032 device = device_create(dgap_class, NULL, 7033 MKDEV(DIGI_DGAP_MAJOR, 0), 7034 NULL, "dgap_mgmt"); 7035 if (IS_ERR(device)) { 7036 rc = PTR_ERR(device); 7037 goto failed_device; 7038 } 7039 7040 /* Start the poller */ 7041 spin_lock_irqsave(&dgap_poll_lock, flags); 7042 setup_timer(&dgap_poll_timer, dgap_poll_handler, 0); 7043 dgap_poll_timer.data = 0; 7044 dgap_poll_time = jiffies + dgap_jiffies_from_ms(dgap_poll_tick); 7045 dgap_poll_timer.expires = dgap_poll_time; 7046 spin_unlock_irqrestore(&dgap_poll_lock, flags); 7047 7048 add_timer(&dgap_poll_timer); 7049 7050 return rc; 7051 7052failed_device: 7053 class_destroy(dgap_class); 7054failed_class: 7055 unregister_chrdev(DIGI_DGAP_MAJOR, "dgap"); 7056 return rc; 7057} 7058 7059static void dgap_stop(void) 7060{ 7061 unsigned long lock_flags; 7062 7063 spin_lock_irqsave(&dgap_poll_lock, lock_flags); 7064 dgap_poll_stop = 1; 7065 spin_unlock_irqrestore(&dgap_poll_lock, lock_flags); 7066 7067 del_timer_sync(&dgap_poll_timer); 7068 7069 device_destroy(dgap_class, MKDEV(DIGI_DGAP_MAJOR, 0)); 7070 class_destroy(dgap_class); 7071 unregister_chrdev(DIGI_DGAP_MAJOR, "dgap"); 7072} 7073 7074/* 7075 * dgap_cleanup_board() 7076 * 7077 * Free all the memory associated with a board 7078 */ 7079static void dgap_cleanup_board(struct board_t *brd) 7080{ 7081 unsigned int i; 7082 7083 if (!brd || brd->magic != DGAP_BOARD_MAGIC) 7084 return; 7085 7086 dgap_free_irq(brd); 7087 7088 tasklet_kill(&brd->helper_tasklet); 7089 7090 dgap_unmap(brd); 7091 7092 /* Free all allocated channels structs */ 7093 for (i = 0; i < MAXPORTS ; i++) 7094 kfree(brd->channels[i]); 7095 7096 kfree(brd->flipbuf); 7097 kfree(brd->flipflagbuf); 7098 7099 dgap_board[brd->boardnum] = NULL; 7100 7101 kfree(brd); 7102} 7103 7104 7105/************************************************************************ 7106 * 7107 * Driver load/unload functions 7108 * 7109 ************************************************************************/ 7110 7111/* 7112 * init_module() 7113 * 7114 * Module load. This is where it all starts. 7115 */ 7116static int dgap_init_module(void) 7117{ 7118 int rc; 7119 7120 pr_info("%s, Digi International Part Number %s\n", DG_NAME, DG_PART); 7121 7122 rc = dgap_start(); 7123 if (rc) 7124 return rc; 7125 7126 rc = pci_register_driver(&dgap_driver); 7127 if (rc) 7128 goto err_stop; 7129 7130 rc = dgap_create_driver_sysfiles(&dgap_driver); 7131 if (rc) 7132 goto err_unregister; 7133 7134 dgap_driver_state = DRIVER_READY; 7135 7136 return 0; 7137 7138err_unregister: 7139 pci_unregister_driver(&dgap_driver); 7140err_stop: 7141 dgap_stop(); 7142 7143 return rc; 7144} 7145 7146/* 7147 * dgap_cleanup_module() 7148 * 7149 * Module unload. This is where it all ends. 7150 */ 7151static void dgap_cleanup_module(void) 7152{ 7153 unsigned int i; 7154 ulong lock_flags; 7155 7156 spin_lock_irqsave(&dgap_poll_lock, lock_flags); 7157 dgap_poll_stop = 1; 7158 spin_unlock_irqrestore(&dgap_poll_lock, lock_flags); 7159 7160 /* Turn off poller right away. */ 7161 del_timer_sync(&dgap_poll_timer); 7162 7163 dgap_remove_driver_sysfiles(&dgap_driver); 7164 7165 device_destroy(dgap_class, MKDEV(DIGI_DGAP_MAJOR, 0)); 7166 class_destroy(dgap_class); 7167 unregister_chrdev(DIGI_DGAP_MAJOR, "dgap"); 7168 7169 for (i = 0; i < dgap_numboards; ++i) { 7170 dgap_remove_ports_sysfiles(dgap_board[i]); 7171 dgap_cleanup_tty(dgap_board[i]); 7172 dgap_cleanup_board(dgap_board[i]); 7173 } 7174 7175 dgap_cleanup_nodes(); 7176 7177 if (dgap_numboards) 7178 pci_unregister_driver(&dgap_driver); 7179} 7180 7181module_init(dgap_init_module); 7182module_exit(dgap_cleanup_module); 7183 7184MODULE_LICENSE("GPL"); 7185MODULE_AUTHOR("Digi International, http://www.digi.com"); 7186MODULE_DESCRIPTION("Driver for the Digi International EPCA PCI based product line"); 7187MODULE_SUPPORTED_DEVICE("dgap"); 7188