Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.15-rc4 5275 lines 140 kB view raw
1/*****************************************************************************/ 2 3/* 4 * istallion.c -- stallion intelligent multiport serial driver. 5 * 6 * Copyright (C) 1996-1999 Stallion Technologies 7 * Copyright (C) 1994-1996 Greg Ungerer. 8 * 9 * This code is loosely based on the Linux serial driver, written by 10 * Linus Torvalds, Theodore T'so and others. 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License as published by 14 * the Free Software Foundation; either version 2 of the License, or 15 * (at your option) any later version. 16 * 17 * This program is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 * GNU General Public License for more details. 21 * 22 * You should have received a copy of the GNU General Public License 23 * along with this program; if not, write to the Free Software 24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 25 */ 26 27/*****************************************************************************/ 28 29#include <linux/config.h> 30#include <linux/module.h> 31#include <linux/slab.h> 32#include <linux/interrupt.h> 33#include <linux/tty.h> 34#include <linux/tty_flip.h> 35#include <linux/serial.h> 36#include <linux/cdk.h> 37#include <linux/comstats.h> 38#include <linux/istallion.h> 39#include <linux/ioport.h> 40#include <linux/delay.h> 41#include <linux/init.h> 42#include <linux/devfs_fs_kernel.h> 43#include <linux/device.h> 44#include <linux/wait.h> 45 46#include <asm/io.h> 47#include <asm/uaccess.h> 48 49#ifdef CONFIG_PCI 50#include <linux/pci.h> 51#endif 52 53/*****************************************************************************/ 54 55/* 56 * Define different board types. Not all of the following board types 57 * are supported by this driver. But I will use the standard "assigned" 58 * board numbers. Currently supported boards are abbreviated as: 59 * ECP = EasyConnection 8/64, ONB = ONboard, BBY = Brumby and 60 * STAL = Stallion. 61 */ 62#define BRD_UNKNOWN 0 63#define BRD_STALLION 1 64#define BRD_BRUMBY4 2 65#define BRD_ONBOARD2 3 66#define BRD_ONBOARD 4 67#define BRD_BRUMBY8 5 68#define BRD_BRUMBY16 6 69#define BRD_ONBOARDE 7 70#define BRD_ONBOARD32 9 71#define BRD_ONBOARD2_32 10 72#define BRD_ONBOARDRS 11 73#define BRD_EASYIO 20 74#define BRD_ECH 21 75#define BRD_ECHMC 22 76#define BRD_ECP 23 77#define BRD_ECPE 24 78#define BRD_ECPMC 25 79#define BRD_ECHPCI 26 80#define BRD_ECH64PCI 27 81#define BRD_EASYIOPCI 28 82#define BRD_ECPPCI 29 83 84#define BRD_BRUMBY BRD_BRUMBY4 85 86/* 87 * Define a configuration structure to hold the board configuration. 88 * Need to set this up in the code (for now) with the boards that are 89 * to be configured into the system. This is what needs to be modified 90 * when adding/removing/modifying boards. Each line entry in the 91 * stli_brdconf[] array is a board. Each line contains io/irq/memory 92 * ranges for that board (as well as what type of board it is). 93 * Some examples: 94 * { BRD_ECP, 0x2a0, 0, 0xcc000, 0, 0 }, 95 * This line will configure an EasyConnection 8/64 at io address 2a0, 96 * and shared memory address of cc000. Multiple EasyConnection 8/64 97 * boards can share the same shared memory address space. No interrupt 98 * is required for this board type. 99 * Another example: 100 * { BRD_ECPE, 0x5000, 0, 0x80000000, 0, 0 }, 101 * This line will configure an EasyConnection 8/64 EISA in slot 5 and 102 * shared memory address of 0x80000000 (2 GByte). Multiple 103 * EasyConnection 8/64 EISA boards can share the same shared memory 104 * address space. No interrupt is required for this board type. 105 * Another example: 106 * { BRD_ONBOARD, 0x240, 0, 0xd0000, 0, 0 }, 107 * This line will configure an ONboard (ISA type) at io address 240, 108 * and shared memory address of d0000. Multiple ONboards can share 109 * the same shared memory address space. No interrupt required. 110 * Another example: 111 * { BRD_BRUMBY4, 0x360, 0, 0xc8000, 0, 0 }, 112 * This line will configure a Brumby board (any number of ports!) at 113 * io address 360 and shared memory address of c8000. All Brumby boards 114 * configured into a system must have their own separate io and memory 115 * addresses. No interrupt is required. 116 * Another example: 117 * { BRD_STALLION, 0x330, 0, 0xd0000, 0, 0 }, 118 * This line will configure an original Stallion board at io address 330 119 * and shared memory address d0000 (this would only be valid for a "V4.0" 120 * or Rev.O Stallion board). All Stallion boards configured into the 121 * system must have their own separate io and memory addresses. No 122 * interrupt is required. 123 */ 124 125typedef struct { 126 int brdtype; 127 int ioaddr1; 128 int ioaddr2; 129 unsigned long memaddr; 130 int irq; 131 int irqtype; 132} stlconf_t; 133 134static stlconf_t stli_brdconf[] = { 135 /*{ BRD_ECP, 0x2a0, 0, 0xcc000, 0, 0 },*/ 136}; 137 138static int stli_nrbrds = sizeof(stli_brdconf) / sizeof(stlconf_t); 139 140/* 141 * There is some experimental EISA board detection code in this driver. 142 * By default it is disabled, but for those that want to try it out, 143 * then set the define below to be 1. 144 */ 145#define STLI_EISAPROBE 0 146 147/*****************************************************************************/ 148 149/* 150 * Define some important driver characteristics. Device major numbers 151 * allocated as per Linux Device Registry. 152 */ 153#ifndef STL_SIOMEMMAJOR 154#define STL_SIOMEMMAJOR 28 155#endif 156#ifndef STL_SERIALMAJOR 157#define STL_SERIALMAJOR 24 158#endif 159#ifndef STL_CALLOUTMAJOR 160#define STL_CALLOUTMAJOR 25 161#endif 162 163/*****************************************************************************/ 164 165/* 166 * Define our local driver identity first. Set up stuff to deal with 167 * all the local structures required by a serial tty driver. 168 */ 169static char *stli_drvtitle = "Stallion Intelligent Multiport Serial Driver"; 170static char *stli_drvname = "istallion"; 171static char *stli_drvversion = "5.6.0"; 172static char *stli_serialname = "ttyE"; 173 174static struct tty_driver *stli_serial; 175 176/* 177 * We will need to allocate a temporary write buffer for chars that 178 * come direct from user space. The problem is that a copy from user 179 * space might cause a page fault (typically on a system that is 180 * swapping!). All ports will share one buffer - since if the system 181 * is already swapping a shared buffer won't make things any worse. 182 */ 183static char *stli_tmpwritebuf; 184static DECLARE_MUTEX(stli_tmpwritesem); 185 186#define STLI_TXBUFSIZE 4096 187 188/* 189 * Use a fast local buffer for cooked characters. Typically a whole 190 * bunch of cooked characters come in for a port, 1 at a time. So we 191 * save those up into a local buffer, then write out the whole lot 192 * with a large memcpy. Just use 1 buffer for all ports, since its 193 * use it is only need for short periods of time by each port. 194 */ 195static char *stli_txcookbuf; 196static int stli_txcooksize; 197static int stli_txcookrealsize; 198static struct tty_struct *stli_txcooktty; 199 200/* 201 * Define a local default termios struct. All ports will be created 202 * with this termios initially. Basically all it defines is a raw port 203 * at 9600 baud, 8 data bits, no parity, 1 stop bit. 204 */ 205static struct termios stli_deftermios = { 206 .c_cflag = (B9600 | CS8 | CREAD | HUPCL | CLOCAL), 207 .c_cc = INIT_C_CC, 208}; 209 210/* 211 * Define global stats structures. Not used often, and can be 212 * re-used for each stats call. 213 */ 214static comstats_t stli_comstats; 215static combrd_t stli_brdstats; 216static asystats_t stli_cdkstats; 217static stlibrd_t stli_dummybrd; 218static stliport_t stli_dummyport; 219 220/*****************************************************************************/ 221 222static stlibrd_t *stli_brds[STL_MAXBRDS]; 223 224static int stli_shared; 225 226/* 227 * Per board state flags. Used with the state field of the board struct. 228 * Not really much here... All we need to do is keep track of whether 229 * the board has been detected, and whether it is actually running a slave 230 * or not. 231 */ 232#define BST_FOUND 0x1 233#define BST_STARTED 0x2 234 235/* 236 * Define the set of port state flags. These are marked for internal 237 * state purposes only, usually to do with the state of communications 238 * with the slave. Most of them need to be updated atomically, so always 239 * use the bit setting operations (unless protected by cli/sti). 240 */ 241#define ST_INITIALIZING 1 242#define ST_OPENING 2 243#define ST_CLOSING 3 244#define ST_CMDING 4 245#define ST_TXBUSY 5 246#define ST_RXING 6 247#define ST_DOFLUSHRX 7 248#define ST_DOFLUSHTX 8 249#define ST_DOSIGS 9 250#define ST_RXSTOP 10 251#define ST_GETSIGS 11 252 253/* 254 * Define an array of board names as printable strings. Handy for 255 * referencing boards when printing trace and stuff. 256 */ 257static char *stli_brdnames[] = { 258 "Unknown", 259 "Stallion", 260 "Brumby", 261 "ONboard-MC", 262 "ONboard", 263 "Brumby", 264 "Brumby", 265 "ONboard-EI", 266 (char *) NULL, 267 "ONboard", 268 "ONboard-MC", 269 "ONboard-MC", 270 (char *) NULL, 271 (char *) NULL, 272 (char *) NULL, 273 (char *) NULL, 274 (char *) NULL, 275 (char *) NULL, 276 (char *) NULL, 277 (char *) NULL, 278 "EasyIO", 279 "EC8/32-AT", 280 "EC8/32-MC", 281 "EC8/64-AT", 282 "EC8/64-EI", 283 "EC8/64-MC", 284 "EC8/32-PCI", 285 "EC8/64-PCI", 286 "EasyIO-PCI", 287 "EC/RA-PCI", 288}; 289 290/*****************************************************************************/ 291 292#ifdef MODULE 293/* 294 * Define some string labels for arguments passed from the module 295 * load line. These allow for easy board definitions, and easy 296 * modification of the io, memory and irq resoucres. 297 */ 298 299static char *board0[8]; 300static char *board1[8]; 301static char *board2[8]; 302static char *board3[8]; 303 304static char **stli_brdsp[] = { 305 (char **) &board0, 306 (char **) &board1, 307 (char **) &board2, 308 (char **) &board3 309}; 310 311/* 312 * Define a set of common board names, and types. This is used to 313 * parse any module arguments. 314 */ 315 316typedef struct stlibrdtype { 317 char *name; 318 int type; 319} stlibrdtype_t; 320 321static stlibrdtype_t stli_brdstr[] = { 322 { "stallion", BRD_STALLION }, 323 { "1", BRD_STALLION }, 324 { "brumby", BRD_BRUMBY }, 325 { "brumby4", BRD_BRUMBY }, 326 { "brumby/4", BRD_BRUMBY }, 327 { "brumby-4", BRD_BRUMBY }, 328 { "brumby8", BRD_BRUMBY }, 329 { "brumby/8", BRD_BRUMBY }, 330 { "brumby-8", BRD_BRUMBY }, 331 { "brumby16", BRD_BRUMBY }, 332 { "brumby/16", BRD_BRUMBY }, 333 { "brumby-16", BRD_BRUMBY }, 334 { "2", BRD_BRUMBY }, 335 { "onboard2", BRD_ONBOARD2 }, 336 { "onboard-2", BRD_ONBOARD2 }, 337 { "onboard/2", BRD_ONBOARD2 }, 338 { "onboard-mc", BRD_ONBOARD2 }, 339 { "onboard/mc", BRD_ONBOARD2 }, 340 { "onboard-mca", BRD_ONBOARD2 }, 341 { "onboard/mca", BRD_ONBOARD2 }, 342 { "3", BRD_ONBOARD2 }, 343 { "onboard", BRD_ONBOARD }, 344 { "onboardat", BRD_ONBOARD }, 345 { "4", BRD_ONBOARD }, 346 { "onboarde", BRD_ONBOARDE }, 347 { "onboard-e", BRD_ONBOARDE }, 348 { "onboard/e", BRD_ONBOARDE }, 349 { "onboard-ei", BRD_ONBOARDE }, 350 { "onboard/ei", BRD_ONBOARDE }, 351 { "7", BRD_ONBOARDE }, 352 { "ecp", BRD_ECP }, 353 { "ecpat", BRD_ECP }, 354 { "ec8/64", BRD_ECP }, 355 { "ec8/64-at", BRD_ECP }, 356 { "ec8/64-isa", BRD_ECP }, 357 { "23", BRD_ECP }, 358 { "ecpe", BRD_ECPE }, 359 { "ecpei", BRD_ECPE }, 360 { "ec8/64-e", BRD_ECPE }, 361 { "ec8/64-ei", BRD_ECPE }, 362 { "24", BRD_ECPE }, 363 { "ecpmc", BRD_ECPMC }, 364 { "ec8/64-mc", BRD_ECPMC }, 365 { "ec8/64-mca", BRD_ECPMC }, 366 { "25", BRD_ECPMC }, 367 { "ecppci", BRD_ECPPCI }, 368 { "ec/ra", BRD_ECPPCI }, 369 { "ec/ra-pc", BRD_ECPPCI }, 370 { "ec/ra-pci", BRD_ECPPCI }, 371 { "29", BRD_ECPPCI }, 372}; 373 374/* 375 * Define the module agruments. 376 */ 377MODULE_AUTHOR("Greg Ungerer"); 378MODULE_DESCRIPTION("Stallion Intelligent Multiport Serial Driver"); 379MODULE_LICENSE("GPL"); 380 381 382MODULE_PARM(board0, "1-3s"); 383MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,memaddr]"); 384MODULE_PARM(board1, "1-3s"); 385MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,memaddr]"); 386MODULE_PARM(board2, "1-3s"); 387MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,memaddr]"); 388MODULE_PARM(board3, "1-3s"); 389MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,memaddr]"); 390 391#endif 392 393/* 394 * Set up a default memory address table for EISA board probing. 395 * The default addresses are all bellow 1Mbyte, which has to be the 396 * case anyway. They should be safe, since we only read values from 397 * them, and interrupts are disabled while we do it. If the higher 398 * memory support is compiled in then we also try probing around 399 * the 1Gb, 2Gb and 3Gb areas as well... 400 */ 401static unsigned long stli_eisamemprobeaddrs[] = { 402 0xc0000, 0xd0000, 0xe0000, 0xf0000, 403 0x80000000, 0x80010000, 0x80020000, 0x80030000, 404 0x40000000, 0x40010000, 0x40020000, 0x40030000, 405 0xc0000000, 0xc0010000, 0xc0020000, 0xc0030000, 406 0xff000000, 0xff010000, 0xff020000, 0xff030000, 407}; 408 409static int stli_eisamempsize = sizeof(stli_eisamemprobeaddrs) / sizeof(unsigned long); 410 411/* 412 * Define the Stallion PCI vendor and device IDs. 413 */ 414#ifdef CONFIG_PCI 415#ifndef PCI_VENDOR_ID_STALLION 416#define PCI_VENDOR_ID_STALLION 0x124d 417#endif 418#ifndef PCI_DEVICE_ID_ECRA 419#define PCI_DEVICE_ID_ECRA 0x0004 420#endif 421 422static struct pci_device_id istallion_pci_tbl[] = { 423 { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECRA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, 424 { 0 } 425}; 426MODULE_DEVICE_TABLE(pci, istallion_pci_tbl); 427 428#endif /* CONFIG_PCI */ 429 430/*****************************************************************************/ 431 432/* 433 * Hardware configuration info for ECP boards. These defines apply 434 * to the directly accessible io ports of the ECP. There is a set of 435 * defines for each ECP board type, ISA, EISA, MCA and PCI. 436 */ 437#define ECP_IOSIZE 4 438 439#define ECP_MEMSIZE (128 * 1024) 440#define ECP_PCIMEMSIZE (256 * 1024) 441 442#define ECP_ATPAGESIZE (4 * 1024) 443#define ECP_MCPAGESIZE (4 * 1024) 444#define ECP_EIPAGESIZE (64 * 1024) 445#define ECP_PCIPAGESIZE (64 * 1024) 446 447#define STL_EISAID 0x8c4e 448 449/* 450 * Important defines for the ISA class of ECP board. 451 */ 452#define ECP_ATIREG 0 453#define ECP_ATCONFR 1 454#define ECP_ATMEMAR 2 455#define ECP_ATMEMPR 3 456#define ECP_ATSTOP 0x1 457#define ECP_ATINTENAB 0x10 458#define ECP_ATENABLE 0x20 459#define ECP_ATDISABLE 0x00 460#define ECP_ATADDRMASK 0x3f000 461#define ECP_ATADDRSHFT 12 462 463/* 464 * Important defines for the EISA class of ECP board. 465 */ 466#define ECP_EIIREG 0 467#define ECP_EIMEMARL 1 468#define ECP_EICONFR 2 469#define ECP_EIMEMARH 3 470#define ECP_EIENABLE 0x1 471#define ECP_EIDISABLE 0x0 472#define ECP_EISTOP 0x4 473#define ECP_EIEDGE 0x00 474#define ECP_EILEVEL 0x80 475#define ECP_EIADDRMASKL 0x00ff0000 476#define ECP_EIADDRSHFTL 16 477#define ECP_EIADDRMASKH 0xff000000 478#define ECP_EIADDRSHFTH 24 479#define ECP_EIBRDENAB 0xc84 480 481#define ECP_EISAID 0x4 482 483/* 484 * Important defines for the Micro-channel class of ECP board. 485 * (It has a lot in common with the ISA boards.) 486 */ 487#define ECP_MCIREG 0 488#define ECP_MCCONFR 1 489#define ECP_MCSTOP 0x20 490#define ECP_MCENABLE 0x80 491#define ECP_MCDISABLE 0x00 492 493/* 494 * Important defines for the PCI class of ECP board. 495 * (It has a lot in common with the other ECP boards.) 496 */ 497#define ECP_PCIIREG 0 498#define ECP_PCICONFR 1 499#define ECP_PCISTOP 0x01 500 501/* 502 * Hardware configuration info for ONboard and Brumby boards. These 503 * defines apply to the directly accessible io ports of these boards. 504 */ 505#define ONB_IOSIZE 16 506#define ONB_MEMSIZE (64 * 1024) 507#define ONB_ATPAGESIZE (64 * 1024) 508#define ONB_MCPAGESIZE (64 * 1024) 509#define ONB_EIMEMSIZE (128 * 1024) 510#define ONB_EIPAGESIZE (64 * 1024) 511 512/* 513 * Important defines for the ISA class of ONboard board. 514 */ 515#define ONB_ATIREG 0 516#define ONB_ATMEMAR 1 517#define ONB_ATCONFR 2 518#define ONB_ATSTOP 0x4 519#define ONB_ATENABLE 0x01 520#define ONB_ATDISABLE 0x00 521#define ONB_ATADDRMASK 0xff0000 522#define ONB_ATADDRSHFT 16 523 524#define ONB_MEMENABLO 0 525#define ONB_MEMENABHI 0x02 526 527/* 528 * Important defines for the EISA class of ONboard board. 529 */ 530#define ONB_EIIREG 0 531#define ONB_EIMEMARL 1 532#define ONB_EICONFR 2 533#define ONB_EIMEMARH 3 534#define ONB_EIENABLE 0x1 535#define ONB_EIDISABLE 0x0 536#define ONB_EISTOP 0x4 537#define ONB_EIEDGE 0x00 538#define ONB_EILEVEL 0x80 539#define ONB_EIADDRMASKL 0x00ff0000 540#define ONB_EIADDRSHFTL 16 541#define ONB_EIADDRMASKH 0xff000000 542#define ONB_EIADDRSHFTH 24 543#define ONB_EIBRDENAB 0xc84 544 545#define ONB_EISAID 0x1 546 547/* 548 * Important defines for the Brumby boards. They are pretty simple, 549 * there is not much that is programmably configurable. 550 */ 551#define BBY_IOSIZE 16 552#define BBY_MEMSIZE (64 * 1024) 553#define BBY_PAGESIZE (16 * 1024) 554 555#define BBY_ATIREG 0 556#define BBY_ATCONFR 1 557#define BBY_ATSTOP 0x4 558 559/* 560 * Important defines for the Stallion boards. They are pretty simple, 561 * there is not much that is programmably configurable. 562 */ 563#define STAL_IOSIZE 16 564#define STAL_MEMSIZE (64 * 1024) 565#define STAL_PAGESIZE (64 * 1024) 566 567/* 568 * Define the set of status register values for EasyConnection panels. 569 * The signature will return with the status value for each panel. From 570 * this we can determine what is attached to the board - before we have 571 * actually down loaded any code to it. 572 */ 573#define ECH_PNLSTATUS 2 574#define ECH_PNL16PORT 0x20 575#define ECH_PNLIDMASK 0x07 576#define ECH_PNLXPID 0x40 577#define ECH_PNLINTRPEND 0x80 578 579/* 580 * Define some macros to do things to the board. Even those these boards 581 * are somewhat related there is often significantly different ways of 582 * doing some operation on it (like enable, paging, reset, etc). So each 583 * board class has a set of functions which do the commonly required 584 * operations. The macros below basically just call these functions, 585 * generally checking for a NULL function - which means that the board 586 * needs nothing done to it to achieve this operation! 587 */ 588#define EBRDINIT(brdp) \ 589 if (brdp->init != NULL) \ 590 (* brdp->init)(brdp) 591 592#define EBRDENABLE(brdp) \ 593 if (brdp->enable != NULL) \ 594 (* brdp->enable)(brdp); 595 596#define EBRDDISABLE(brdp) \ 597 if (brdp->disable != NULL) \ 598 (* brdp->disable)(brdp); 599 600#define EBRDINTR(brdp) \ 601 if (brdp->intr != NULL) \ 602 (* brdp->intr)(brdp); 603 604#define EBRDRESET(brdp) \ 605 if (brdp->reset != NULL) \ 606 (* brdp->reset)(brdp); 607 608#define EBRDGETMEMPTR(brdp,offset) \ 609 (* brdp->getmemptr)(brdp, offset, __LINE__) 610 611/* 612 * Define the maximal baud rate, and the default baud base for ports. 613 */ 614#define STL_MAXBAUD 460800 615#define STL_BAUDBASE 115200 616#define STL_CLOSEDELAY (5 * HZ / 10) 617 618/*****************************************************************************/ 619 620/* 621 * Define macros to extract a brd or port number from a minor number. 622 */ 623#define MINOR2BRD(min) (((min) & 0xc0) >> 6) 624#define MINOR2PORT(min) ((min) & 0x3f) 625 626/* 627 * Define a baud rate table that converts termios baud rate selector 628 * into the actual baud rate value. All baud rate calculations are based 629 * on the actual baud rate required. 630 */ 631static unsigned int stli_baudrates[] = { 632 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 633 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 634}; 635 636/*****************************************************************************/ 637 638/* 639 * Define some handy local macros... 640 */ 641#undef MIN 642#define MIN(a,b) (((a) <= (b)) ? (a) : (b)) 643 644#undef TOLOWER 645#define TOLOWER(x) ((((x) >= 'A') && ((x) <= 'Z')) ? ((x) + 0x20) : (x)) 646 647/*****************************************************************************/ 648 649/* 650 * Prototype all functions in this driver! 651 */ 652 653#ifdef MODULE 654static void stli_argbrds(void); 655static int stli_parsebrd(stlconf_t *confp, char **argp); 656 657static unsigned long stli_atol(char *str); 658#endif 659 660int stli_init(void); 661static int stli_open(struct tty_struct *tty, struct file *filp); 662static void stli_close(struct tty_struct *tty, struct file *filp); 663static int stli_write(struct tty_struct *tty, const unsigned char *buf, int count); 664static void stli_putchar(struct tty_struct *tty, unsigned char ch); 665static void stli_flushchars(struct tty_struct *tty); 666static int stli_writeroom(struct tty_struct *tty); 667static int stli_charsinbuffer(struct tty_struct *tty); 668static int stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg); 669static void stli_settermios(struct tty_struct *tty, struct termios *old); 670static void stli_throttle(struct tty_struct *tty); 671static void stli_unthrottle(struct tty_struct *tty); 672static void stli_stop(struct tty_struct *tty); 673static void stli_start(struct tty_struct *tty); 674static void stli_flushbuffer(struct tty_struct *tty); 675static void stli_breakctl(struct tty_struct *tty, int state); 676static void stli_waituntilsent(struct tty_struct *tty, int timeout); 677static void stli_sendxchar(struct tty_struct *tty, char ch); 678static void stli_hangup(struct tty_struct *tty); 679static int stli_portinfo(stlibrd_t *brdp, stliport_t *portp, int portnr, char *pos); 680 681static int stli_brdinit(stlibrd_t *brdp); 682static int stli_startbrd(stlibrd_t *brdp); 683static ssize_t stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp); 684static ssize_t stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp); 685static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg); 686static void stli_brdpoll(stlibrd_t *brdp, volatile cdkhdr_t *hdrp); 687static void stli_poll(unsigned long arg); 688static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp); 689static int stli_initopen(stlibrd_t *brdp, stliport_t *portp); 690static int stli_rawopen(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, int wait); 691static int stli_rawclose(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, int wait); 692static int stli_waitcarrier(stlibrd_t *brdp, stliport_t *portp, struct file *filp); 693static void stli_dohangup(void *arg); 694static int stli_setport(stliport_t *portp); 695static int stli_cmdwait(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback); 696static void stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback); 697static void stli_dodelaycmd(stliport_t *portp, volatile cdkctrl_t *cp); 698static void stli_mkasyport(stliport_t *portp, asyport_t *pp, struct termios *tiosp); 699static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts); 700static long stli_mktiocm(unsigned long sigvalue); 701static void stli_read(stlibrd_t *brdp, stliport_t *portp); 702static int stli_getserial(stliport_t *portp, struct serial_struct __user *sp); 703static int stli_setserial(stliport_t *portp, struct serial_struct __user *sp); 704static int stli_getbrdstats(combrd_t __user *bp); 705static int stli_getportstats(stliport_t *portp, comstats_t __user *cp); 706static int stli_portcmdstats(stliport_t *portp); 707static int stli_clrportstats(stliport_t *portp, comstats_t __user *cp); 708static int stli_getportstruct(stliport_t __user *arg); 709static int stli_getbrdstruct(stlibrd_t __user *arg); 710static void *stli_memalloc(int len); 711static stlibrd_t *stli_allocbrd(void); 712 713static void stli_ecpinit(stlibrd_t *brdp); 714static void stli_ecpenable(stlibrd_t *brdp); 715static void stli_ecpdisable(stlibrd_t *brdp); 716static char *stli_ecpgetmemptr(stlibrd_t *brdp, unsigned long offset, int line); 717static void stli_ecpreset(stlibrd_t *brdp); 718static void stli_ecpintr(stlibrd_t *brdp); 719static void stli_ecpeiinit(stlibrd_t *brdp); 720static void stli_ecpeienable(stlibrd_t *brdp); 721static void stli_ecpeidisable(stlibrd_t *brdp); 722static char *stli_ecpeigetmemptr(stlibrd_t *brdp, unsigned long offset, int line); 723static void stli_ecpeireset(stlibrd_t *brdp); 724static void stli_ecpmcenable(stlibrd_t *brdp); 725static void stli_ecpmcdisable(stlibrd_t *brdp); 726static char *stli_ecpmcgetmemptr(stlibrd_t *brdp, unsigned long offset, int line); 727static void stli_ecpmcreset(stlibrd_t *brdp); 728static void stli_ecppciinit(stlibrd_t *brdp); 729static char *stli_ecppcigetmemptr(stlibrd_t *brdp, unsigned long offset, int line); 730static void stli_ecppcireset(stlibrd_t *brdp); 731 732static void stli_onbinit(stlibrd_t *brdp); 733static void stli_onbenable(stlibrd_t *brdp); 734static void stli_onbdisable(stlibrd_t *brdp); 735static char *stli_onbgetmemptr(stlibrd_t *brdp, unsigned long offset, int line); 736static void stli_onbreset(stlibrd_t *brdp); 737static void stli_onbeinit(stlibrd_t *brdp); 738static void stli_onbeenable(stlibrd_t *brdp); 739static void stli_onbedisable(stlibrd_t *brdp); 740static char *stli_onbegetmemptr(stlibrd_t *brdp, unsigned long offset, int line); 741static void stli_onbereset(stlibrd_t *brdp); 742static void stli_bbyinit(stlibrd_t *brdp); 743static char *stli_bbygetmemptr(stlibrd_t *brdp, unsigned long offset, int line); 744static void stli_bbyreset(stlibrd_t *brdp); 745static void stli_stalinit(stlibrd_t *brdp); 746static char *stli_stalgetmemptr(stlibrd_t *brdp, unsigned long offset, int line); 747static void stli_stalreset(stlibrd_t *brdp); 748 749static stliport_t *stli_getport(int brdnr, int panelnr, int portnr); 750 751static int stli_initecp(stlibrd_t *brdp); 752static int stli_initonb(stlibrd_t *brdp); 753static int stli_eisamemprobe(stlibrd_t *brdp); 754static int stli_initports(stlibrd_t *brdp); 755 756#ifdef CONFIG_PCI 757static int stli_initpcibrd(int brdtype, struct pci_dev *devp); 758#endif 759 760/*****************************************************************************/ 761 762/* 763 * Define the driver info for a user level shared memory device. This 764 * device will work sort of like the /dev/kmem device - except that it 765 * will give access to the shared memory on the Stallion intelligent 766 * board. This is also a very useful debugging tool. 767 */ 768static struct file_operations stli_fsiomem = { 769 .owner = THIS_MODULE, 770 .read = stli_memread, 771 .write = stli_memwrite, 772 .ioctl = stli_memioctl, 773}; 774 775/*****************************************************************************/ 776 777/* 778 * Define a timer_list entry for our poll routine. The slave board 779 * is polled every so often to see if anything needs doing. This is 780 * much cheaper on host cpu than using interrupts. It turns out to 781 * not increase character latency by much either... 782 */ 783static DEFINE_TIMER(stli_timerlist, stli_poll, 0, 0); 784 785static int stli_timeron; 786 787/* 788 * Define the calculation for the timeout routine. 789 */ 790#define STLI_TIMEOUT (jiffies + 1) 791 792/*****************************************************************************/ 793 794static struct class *istallion_class; 795 796#ifdef MODULE 797 798/* 799 * Loadable module initialization stuff. 800 */ 801 802static int __init istallion_module_init(void) 803{ 804 unsigned long flags; 805 806#ifdef DEBUG 807 printk("init_module()\n"); 808#endif 809 810 save_flags(flags); 811 cli(); 812 stli_init(); 813 restore_flags(flags); 814 815 return(0); 816} 817 818/*****************************************************************************/ 819 820static void __exit istallion_module_exit(void) 821{ 822 stlibrd_t *brdp; 823 stliport_t *portp; 824 unsigned long flags; 825 int i, j; 826 827#ifdef DEBUG 828 printk("cleanup_module()\n"); 829#endif 830 831 printk(KERN_INFO "Unloading %s: version %s\n", stli_drvtitle, 832 stli_drvversion); 833 834 save_flags(flags); 835 cli(); 836 837/* 838 * Free up all allocated resources used by the ports. This includes 839 * memory and interrupts. 840 */ 841 if (stli_timeron) { 842 stli_timeron = 0; 843 del_timer(&stli_timerlist); 844 } 845 846 i = tty_unregister_driver(stli_serial); 847 if (i) { 848 printk("STALLION: failed to un-register tty driver, " 849 "errno=%d\n", -i); 850 restore_flags(flags); 851 return; 852 } 853 put_tty_driver(stli_serial); 854 for (i = 0; i < 4; i++) { 855 devfs_remove("staliomem/%d", i); 856 class_device_destroy(istallion_class, MKDEV(STL_SIOMEMMAJOR, i)); 857 } 858 devfs_remove("staliomem"); 859 class_destroy(istallion_class); 860 if ((i = unregister_chrdev(STL_SIOMEMMAJOR, "staliomem"))) 861 printk("STALLION: failed to un-register serial memory device, " 862 "errno=%d\n", -i); 863 864 kfree(stli_tmpwritebuf); 865 kfree(stli_txcookbuf); 866 867 for (i = 0; (i < stli_nrbrds); i++) { 868 if ((brdp = stli_brds[i]) == (stlibrd_t *) NULL) 869 continue; 870 for (j = 0; (j < STL_MAXPORTS); j++) { 871 portp = brdp->ports[j]; 872 if (portp != (stliport_t *) NULL) { 873 if (portp->tty != (struct tty_struct *) NULL) 874 tty_hangup(portp->tty); 875 kfree(portp); 876 } 877 } 878 879 iounmap(brdp->membase); 880 if (brdp->iosize > 0) 881 release_region(brdp->iobase, brdp->iosize); 882 kfree(brdp); 883 stli_brds[i] = (stlibrd_t *) NULL; 884 } 885 886 restore_flags(flags); 887} 888 889module_init(istallion_module_init); 890module_exit(istallion_module_exit); 891 892/*****************************************************************************/ 893 894/* 895 * Check for any arguments passed in on the module load command line. 896 */ 897 898static void stli_argbrds(void) 899{ 900 stlconf_t conf; 901 stlibrd_t *brdp; 902 int nrargs, i; 903 904#ifdef DEBUG 905 printk("stli_argbrds()\n"); 906#endif 907 908 nrargs = sizeof(stli_brdsp) / sizeof(char **); 909 910 for (i = stli_nrbrds; (i < nrargs); i++) { 911 memset(&conf, 0, sizeof(conf)); 912 if (stli_parsebrd(&conf, stli_brdsp[i]) == 0) 913 continue; 914 if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL) 915 continue; 916 stli_nrbrds = i + 1; 917 brdp->brdnr = i; 918 brdp->brdtype = conf.brdtype; 919 brdp->iobase = conf.ioaddr1; 920 brdp->memaddr = conf.memaddr; 921 stli_brdinit(brdp); 922 } 923} 924 925/*****************************************************************************/ 926 927/* 928 * Convert an ascii string number into an unsigned long. 929 */ 930 931static unsigned long stli_atol(char *str) 932{ 933 unsigned long val; 934 int base, c; 935 char *sp; 936 937 val = 0; 938 sp = str; 939 if ((*sp == '0') && (*(sp+1) == 'x')) { 940 base = 16; 941 sp += 2; 942 } else if (*sp == '0') { 943 base = 8; 944 sp++; 945 } else { 946 base = 10; 947 } 948 949 for (; (*sp != 0); sp++) { 950 c = (*sp > '9') ? (TOLOWER(*sp) - 'a' + 10) : (*sp - '0'); 951 if ((c < 0) || (c >= base)) { 952 printk("STALLION: invalid argument %s\n", str); 953 val = 0; 954 break; 955 } 956 val = (val * base) + c; 957 } 958 return(val); 959} 960 961/*****************************************************************************/ 962 963/* 964 * Parse the supplied argument string, into the board conf struct. 965 */ 966 967static int stli_parsebrd(stlconf_t *confp, char **argp) 968{ 969 char *sp; 970 int nrbrdnames, i; 971 972#ifdef DEBUG 973 printk("stli_parsebrd(confp=%x,argp=%x)\n", (int) confp, (int) argp); 974#endif 975 976 if ((argp[0] == (char *) NULL) || (*argp[0] == 0)) 977 return(0); 978 979 for (sp = argp[0], i = 0; ((*sp != 0) && (i < 25)); sp++, i++) 980 *sp = TOLOWER(*sp); 981 982 nrbrdnames = sizeof(stli_brdstr) / sizeof(stlibrdtype_t); 983 for (i = 0; (i < nrbrdnames); i++) { 984 if (strcmp(stli_brdstr[i].name, argp[0]) == 0) 985 break; 986 } 987 if (i >= nrbrdnames) { 988 printk("STALLION: unknown board name, %s?\n", argp[0]); 989 return(0); 990 } 991 992 confp->brdtype = stli_brdstr[i].type; 993 if ((argp[1] != (char *) NULL) && (*argp[1] != 0)) 994 confp->ioaddr1 = stli_atol(argp[1]); 995 if ((argp[2] != (char *) NULL) && (*argp[2] != 0)) 996 confp->memaddr = stli_atol(argp[2]); 997 return(1); 998} 999 1000#endif 1001 1002/*****************************************************************************/ 1003 1004/* 1005 * Local driver kernel malloc routine. 1006 */ 1007 1008static void *stli_memalloc(int len) 1009{ 1010 return((void *) kmalloc(len, GFP_KERNEL)); 1011} 1012 1013/*****************************************************************************/ 1014 1015static int stli_open(struct tty_struct *tty, struct file *filp) 1016{ 1017 stlibrd_t *brdp; 1018 stliport_t *portp; 1019 unsigned int minordev; 1020 int brdnr, portnr, rc; 1021 1022#ifdef DEBUG 1023 printk("stli_open(tty=%x,filp=%x): device=%s\n", (int) tty, 1024 (int) filp, tty->name); 1025#endif 1026 1027 minordev = tty->index; 1028 brdnr = MINOR2BRD(minordev); 1029 if (brdnr >= stli_nrbrds) 1030 return(-ENODEV); 1031 brdp = stli_brds[brdnr]; 1032 if (brdp == (stlibrd_t *) NULL) 1033 return(-ENODEV); 1034 if ((brdp->state & BST_STARTED) == 0) 1035 return(-ENODEV); 1036 portnr = MINOR2PORT(minordev); 1037 if ((portnr < 0) || (portnr > brdp->nrports)) 1038 return(-ENODEV); 1039 1040 portp = brdp->ports[portnr]; 1041 if (portp == (stliport_t *) NULL) 1042 return(-ENODEV); 1043 if (portp->devnr < 1) 1044 return(-ENODEV); 1045 1046 1047/* 1048 * Check if this port is in the middle of closing. If so then wait 1049 * until it is closed then return error status based on flag settings. 1050 * The sleep here does not need interrupt protection since the wakeup 1051 * for it is done with the same context. 1052 */ 1053 if (portp->flags & ASYNC_CLOSING) { 1054 interruptible_sleep_on(&portp->close_wait); 1055 if (portp->flags & ASYNC_HUP_NOTIFY) 1056 return(-EAGAIN); 1057 return(-ERESTARTSYS); 1058 } 1059 1060/* 1061 * On the first open of the device setup the port hardware, and 1062 * initialize the per port data structure. Since initializing the port 1063 * requires several commands to the board we will need to wait for any 1064 * other open that is already initializing the port. 1065 */ 1066 portp->tty = tty; 1067 tty->driver_data = portp; 1068 portp->refcount++; 1069 1070 wait_event_interruptible(portp->raw_wait, 1071 !test_bit(ST_INITIALIZING, &portp->state)); 1072 if (signal_pending(current)) 1073 return(-ERESTARTSYS); 1074 1075 if ((portp->flags & ASYNC_INITIALIZED) == 0) { 1076 set_bit(ST_INITIALIZING, &portp->state); 1077 if ((rc = stli_initopen(brdp, portp)) >= 0) { 1078 portp->flags |= ASYNC_INITIALIZED; 1079 clear_bit(TTY_IO_ERROR, &tty->flags); 1080 } 1081 clear_bit(ST_INITIALIZING, &portp->state); 1082 wake_up_interruptible(&portp->raw_wait); 1083 if (rc < 0) 1084 return(rc); 1085 } 1086 1087/* 1088 * Check if this port is in the middle of closing. If so then wait 1089 * until it is closed then return error status, based on flag settings. 1090 * The sleep here does not need interrupt protection since the wakeup 1091 * for it is done with the same context. 1092 */ 1093 if (portp->flags & ASYNC_CLOSING) { 1094 interruptible_sleep_on(&portp->close_wait); 1095 if (portp->flags & ASYNC_HUP_NOTIFY) 1096 return(-EAGAIN); 1097 return(-ERESTARTSYS); 1098 } 1099 1100/* 1101 * Based on type of open being done check if it can overlap with any 1102 * previous opens still in effect. If we are a normal serial device 1103 * then also we might have to wait for carrier. 1104 */ 1105 if (!(filp->f_flags & O_NONBLOCK)) { 1106 if ((rc = stli_waitcarrier(brdp, portp, filp)) != 0) 1107 return(rc); 1108 } 1109 portp->flags |= ASYNC_NORMAL_ACTIVE; 1110 return(0); 1111} 1112 1113/*****************************************************************************/ 1114 1115static void stli_close(struct tty_struct *tty, struct file *filp) 1116{ 1117 stlibrd_t *brdp; 1118 stliport_t *portp; 1119 unsigned long flags; 1120 1121#ifdef DEBUG 1122 printk("stli_close(tty=%x,filp=%x)\n", (int) tty, (int) filp); 1123#endif 1124 1125 portp = tty->driver_data; 1126 if (portp == (stliport_t *) NULL) 1127 return; 1128 1129 save_flags(flags); 1130 cli(); 1131 if (tty_hung_up_p(filp)) { 1132 restore_flags(flags); 1133 return; 1134 } 1135 if ((tty->count == 1) && (portp->refcount != 1)) 1136 portp->refcount = 1; 1137 if (portp->refcount-- > 1) { 1138 restore_flags(flags); 1139 return; 1140 } 1141 1142 portp->flags |= ASYNC_CLOSING; 1143 1144/* 1145 * May want to wait for data to drain before closing. The BUSY flag 1146 * keeps track of whether we are still transmitting or not. It is 1147 * updated by messages from the slave - indicating when all chars 1148 * really have drained. 1149 */ 1150 if (tty == stli_txcooktty) 1151 stli_flushchars(tty); 1152 tty->closing = 1; 1153 if (portp->closing_wait != ASYNC_CLOSING_WAIT_NONE) 1154 tty_wait_until_sent(tty, portp->closing_wait); 1155 1156 portp->flags &= ~ASYNC_INITIALIZED; 1157 brdp = stli_brds[portp->brdnr]; 1158 stli_rawclose(brdp, portp, 0, 0); 1159 if (tty->termios->c_cflag & HUPCL) { 1160 stli_mkasysigs(&portp->asig, 0, 0); 1161 if (test_bit(ST_CMDING, &portp->state)) 1162 set_bit(ST_DOSIGS, &portp->state); 1163 else 1164 stli_sendcmd(brdp, portp, A_SETSIGNALS, &portp->asig, 1165 sizeof(asysigs_t), 0); 1166 } 1167 clear_bit(ST_TXBUSY, &portp->state); 1168 clear_bit(ST_RXSTOP, &portp->state); 1169 set_bit(TTY_IO_ERROR, &tty->flags); 1170 if (tty->ldisc.flush_buffer) 1171 (tty->ldisc.flush_buffer)(tty); 1172 set_bit(ST_DOFLUSHRX, &portp->state); 1173 stli_flushbuffer(tty); 1174 1175 tty->closing = 0; 1176 portp->tty = (struct tty_struct *) NULL; 1177 1178 if (portp->openwaitcnt) { 1179 if (portp->close_delay) 1180 msleep_interruptible(jiffies_to_msecs(portp->close_delay)); 1181 wake_up_interruptible(&portp->open_wait); 1182 } 1183 1184 portp->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); 1185 wake_up_interruptible(&portp->close_wait); 1186 restore_flags(flags); 1187} 1188 1189/*****************************************************************************/ 1190 1191/* 1192 * Carry out first open operations on a port. This involves a number of 1193 * commands to be sent to the slave. We need to open the port, set the 1194 * notification events, set the initial port settings, get and set the 1195 * initial signal values. We sleep and wait in between each one. But 1196 * this still all happens pretty quickly. 1197 */ 1198 1199static int stli_initopen(stlibrd_t *brdp, stliport_t *portp) 1200{ 1201 struct tty_struct *tty; 1202 asynotify_t nt; 1203 asyport_t aport; 1204 int rc; 1205 1206#ifdef DEBUG 1207 printk("stli_initopen(brdp=%x,portp=%x)\n", (int) brdp, (int) portp); 1208#endif 1209 1210 if ((rc = stli_rawopen(brdp, portp, 0, 1)) < 0) 1211 return(rc); 1212 1213 memset(&nt, 0, sizeof(asynotify_t)); 1214 nt.data = (DT_TXLOW | DT_TXEMPTY | DT_RXBUSY | DT_RXBREAK); 1215 nt.signal = SG_DCD; 1216 if ((rc = stli_cmdwait(brdp, portp, A_SETNOTIFY, &nt, 1217 sizeof(asynotify_t), 0)) < 0) 1218 return(rc); 1219 1220 tty = portp->tty; 1221 if (tty == (struct tty_struct *) NULL) 1222 return(-ENODEV); 1223 stli_mkasyport(portp, &aport, tty->termios); 1224 if ((rc = stli_cmdwait(brdp, portp, A_SETPORT, &aport, 1225 sizeof(asyport_t), 0)) < 0) 1226 return(rc); 1227 1228 set_bit(ST_GETSIGS, &portp->state); 1229 if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS, &portp->asig, 1230 sizeof(asysigs_t), 1)) < 0) 1231 return(rc); 1232 if (test_and_clear_bit(ST_GETSIGS, &portp->state)) 1233 portp->sigs = stli_mktiocm(portp->asig.sigvalue); 1234 stli_mkasysigs(&portp->asig, 1, 1); 1235 if ((rc = stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig, 1236 sizeof(asysigs_t), 0)) < 0) 1237 return(rc); 1238 1239 return(0); 1240} 1241 1242/*****************************************************************************/ 1243 1244/* 1245 * Send an open message to the slave. This will sleep waiting for the 1246 * acknowledgement, so must have user context. We need to co-ordinate 1247 * with close events here, since we don't want open and close events 1248 * to overlap. 1249 */ 1250 1251static int stli_rawopen(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, int wait) 1252{ 1253 volatile cdkhdr_t *hdrp; 1254 volatile cdkctrl_t *cp; 1255 volatile unsigned char *bits; 1256 unsigned long flags; 1257 int rc; 1258 1259#ifdef DEBUG 1260 printk("stli_rawopen(brdp=%x,portp=%x,arg=%x,wait=%d)\n", 1261 (int) brdp, (int) portp, (int) arg, wait); 1262#endif 1263 1264/* 1265 * Send a message to the slave to open this port. 1266 */ 1267 save_flags(flags); 1268 cli(); 1269 1270/* 1271 * Slave is already closing this port. This can happen if a hangup 1272 * occurs on this port. So we must wait until it is complete. The 1273 * order of opens and closes may not be preserved across shared 1274 * memory, so we must wait until it is complete. 1275 */ 1276 wait_event_interruptible(portp->raw_wait, 1277 !test_bit(ST_CLOSING, &portp->state)); 1278 if (signal_pending(current)) { 1279 restore_flags(flags); 1280 return -ERESTARTSYS; 1281 } 1282 1283/* 1284 * Everything is ready now, so write the open message into shared 1285 * memory. Once the message is in set the service bits to say that 1286 * this port wants service. 1287 */ 1288 EBRDENABLE(brdp); 1289 cp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl; 1290 cp->openarg = arg; 1291 cp->open = 1; 1292 hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); 1293 bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + 1294 portp->portidx; 1295 *bits |= portp->portbit; 1296 EBRDDISABLE(brdp); 1297 1298 if (wait == 0) { 1299 restore_flags(flags); 1300 return(0); 1301 } 1302 1303/* 1304 * Slave is in action, so now we must wait for the open acknowledgment 1305 * to come back. 1306 */ 1307 rc = 0; 1308 set_bit(ST_OPENING, &portp->state); 1309 wait_event_interruptible(portp->raw_wait, 1310 !test_bit(ST_OPENING, &portp->state)); 1311 if (signal_pending(current)) 1312 rc = -ERESTARTSYS; 1313 restore_flags(flags); 1314 1315 if ((rc == 0) && (portp->rc != 0)) 1316 rc = -EIO; 1317 return(rc); 1318} 1319 1320/*****************************************************************************/ 1321 1322/* 1323 * Send a close message to the slave. Normally this will sleep waiting 1324 * for the acknowledgement, but if wait parameter is 0 it will not. If 1325 * wait is true then must have user context (to sleep). 1326 */ 1327 1328static int stli_rawclose(stlibrd_t *brdp, stliport_t *portp, unsigned long arg, int wait) 1329{ 1330 volatile cdkhdr_t *hdrp; 1331 volatile cdkctrl_t *cp; 1332 volatile unsigned char *bits; 1333 unsigned long flags; 1334 int rc; 1335 1336#ifdef DEBUG 1337 printk("stli_rawclose(brdp=%x,portp=%x,arg=%x,wait=%d)\n", 1338 (int) brdp, (int) portp, (int) arg, wait); 1339#endif 1340 1341 save_flags(flags); 1342 cli(); 1343 1344/* 1345 * Slave is already closing this port. This can happen if a hangup 1346 * occurs on this port. 1347 */ 1348 if (wait) { 1349 wait_event_interruptible(portp->raw_wait, 1350 !test_bit(ST_CLOSING, &portp->state)); 1351 if (signal_pending(current)) { 1352 restore_flags(flags); 1353 return -ERESTARTSYS; 1354 } 1355 } 1356 1357/* 1358 * Write the close command into shared memory. 1359 */ 1360 EBRDENABLE(brdp); 1361 cp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl; 1362 cp->closearg = arg; 1363 cp->close = 1; 1364 hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); 1365 bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + 1366 portp->portidx; 1367 *bits |= portp->portbit; 1368 EBRDDISABLE(brdp); 1369 1370 set_bit(ST_CLOSING, &portp->state); 1371 if (wait == 0) { 1372 restore_flags(flags); 1373 return(0); 1374 } 1375 1376/* 1377 * Slave is in action, so now we must wait for the open acknowledgment 1378 * to come back. 1379 */ 1380 rc = 0; 1381 wait_event_interruptible(portp->raw_wait, 1382 !test_bit(ST_CLOSING, &portp->state)); 1383 if (signal_pending(current)) 1384 rc = -ERESTARTSYS; 1385 restore_flags(flags); 1386 1387 if ((rc == 0) && (portp->rc != 0)) 1388 rc = -EIO; 1389 return(rc); 1390} 1391 1392/*****************************************************************************/ 1393 1394/* 1395 * Send a command to the slave and wait for the response. This must 1396 * have user context (it sleeps). This routine is generic in that it 1397 * can send any type of command. Its purpose is to wait for that command 1398 * to complete (as opposed to initiating the command then returning). 1399 */ 1400 1401static int stli_cmdwait(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback) 1402{ 1403 unsigned long flags; 1404 1405#ifdef DEBUG 1406 printk("stli_cmdwait(brdp=%x,portp=%x,cmd=%x,arg=%x,size=%d," 1407 "copyback=%d)\n", (int) brdp, (int) portp, (int) cmd, 1408 (int) arg, size, copyback); 1409#endif 1410 1411 save_flags(flags); 1412 cli(); 1413 wait_event_interruptible(portp->raw_wait, 1414 !test_bit(ST_CMDING, &portp->state)); 1415 if (signal_pending(current)) { 1416 restore_flags(flags); 1417 return -ERESTARTSYS; 1418 } 1419 1420 stli_sendcmd(brdp, portp, cmd, arg, size, copyback); 1421 1422 wait_event_interruptible(portp->raw_wait, 1423 !test_bit(ST_CMDING, &portp->state)); 1424 if (signal_pending(current)) { 1425 restore_flags(flags); 1426 return -ERESTARTSYS; 1427 } 1428 restore_flags(flags); 1429 1430 if (portp->rc != 0) 1431 return(-EIO); 1432 return(0); 1433} 1434 1435/*****************************************************************************/ 1436 1437/* 1438 * Send the termios settings for this port to the slave. This sleeps 1439 * waiting for the command to complete - so must have user context. 1440 */ 1441 1442static int stli_setport(stliport_t *portp) 1443{ 1444 stlibrd_t *brdp; 1445 asyport_t aport; 1446 1447#ifdef DEBUG 1448 printk("stli_setport(portp=%x)\n", (int) portp); 1449#endif 1450 1451 if (portp == (stliport_t *) NULL) 1452 return(-ENODEV); 1453 if (portp->tty == (struct tty_struct *) NULL) 1454 return(-ENODEV); 1455 if ((portp->brdnr < 0) && (portp->brdnr >= stli_nrbrds)) 1456 return(-ENODEV); 1457 brdp = stli_brds[portp->brdnr]; 1458 if (brdp == (stlibrd_t *) NULL) 1459 return(-ENODEV); 1460 1461 stli_mkasyport(portp, &aport, portp->tty->termios); 1462 return(stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0)); 1463} 1464 1465/*****************************************************************************/ 1466 1467/* 1468 * Possibly need to wait for carrier (DCD signal) to come high. Say 1469 * maybe because if we are clocal then we don't need to wait... 1470 */ 1471 1472static int stli_waitcarrier(stlibrd_t *brdp, stliport_t *portp, struct file *filp) 1473{ 1474 unsigned long flags; 1475 int rc, doclocal; 1476 1477#ifdef DEBUG 1478 printk("stli_waitcarrier(brdp=%x,portp=%x,filp=%x)\n", 1479 (int) brdp, (int) portp, (int) filp); 1480#endif 1481 1482 rc = 0; 1483 doclocal = 0; 1484 1485 if (portp->tty->termios->c_cflag & CLOCAL) 1486 doclocal++; 1487 1488 save_flags(flags); 1489 cli(); 1490 portp->openwaitcnt++; 1491 if (! tty_hung_up_p(filp)) 1492 portp->refcount--; 1493 1494 for (;;) { 1495 stli_mkasysigs(&portp->asig, 1, 1); 1496 if ((rc = stli_cmdwait(brdp, portp, A_SETSIGNALS, 1497 &portp->asig, sizeof(asysigs_t), 0)) < 0) 1498 break; 1499 if (tty_hung_up_p(filp) || 1500 ((portp->flags & ASYNC_INITIALIZED) == 0)) { 1501 if (portp->flags & ASYNC_HUP_NOTIFY) 1502 rc = -EBUSY; 1503 else 1504 rc = -ERESTARTSYS; 1505 break; 1506 } 1507 if (((portp->flags & ASYNC_CLOSING) == 0) && 1508 (doclocal || (portp->sigs & TIOCM_CD))) { 1509 break; 1510 } 1511 if (signal_pending(current)) { 1512 rc = -ERESTARTSYS; 1513 break; 1514 } 1515 interruptible_sleep_on(&portp->open_wait); 1516 } 1517 1518 if (! tty_hung_up_p(filp)) 1519 portp->refcount++; 1520 portp->openwaitcnt--; 1521 restore_flags(flags); 1522 1523 return(rc); 1524} 1525 1526/*****************************************************************************/ 1527 1528/* 1529 * Write routine. Take the data and put it in the shared memory ring 1530 * queue. If port is not already sending chars then need to mark the 1531 * service bits for this port. 1532 */ 1533 1534static int stli_write(struct tty_struct *tty, const unsigned char *buf, int count) 1535{ 1536 volatile cdkasy_t *ap; 1537 volatile cdkhdr_t *hdrp; 1538 volatile unsigned char *bits; 1539 unsigned char *shbuf, *chbuf; 1540 stliport_t *portp; 1541 stlibrd_t *brdp; 1542 unsigned int len, stlen, head, tail, size; 1543 unsigned long flags; 1544 1545#ifdef DEBUG 1546 printk("stli_write(tty=%x,buf=%x,count=%d)\n", 1547 (int) tty, (int) buf, count); 1548#endif 1549 1550 if ((tty == (struct tty_struct *) NULL) || 1551 (stli_tmpwritebuf == (char *) NULL)) 1552 return(0); 1553 if (tty == stli_txcooktty) 1554 stli_flushchars(tty); 1555 portp = tty->driver_data; 1556 if (portp == (stliport_t *) NULL) 1557 return(0); 1558 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 1559 return(0); 1560 brdp = stli_brds[portp->brdnr]; 1561 if (brdp == (stlibrd_t *) NULL) 1562 return(0); 1563 chbuf = (unsigned char *) buf; 1564 1565/* 1566 * All data is now local, shove as much as possible into shared memory. 1567 */ 1568 save_flags(flags); 1569 cli(); 1570 EBRDENABLE(brdp); 1571 ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); 1572 head = (unsigned int) ap->txq.head; 1573 tail = (unsigned int) ap->txq.tail; 1574 if (tail != ((unsigned int) ap->txq.tail)) 1575 tail = (unsigned int) ap->txq.tail; 1576 size = portp->txsize; 1577 if (head >= tail) { 1578 len = size - (head - tail) - 1; 1579 stlen = size - head; 1580 } else { 1581 len = tail - head - 1; 1582 stlen = len; 1583 } 1584 1585 len = MIN(len, count); 1586 count = 0; 1587 shbuf = (char *) EBRDGETMEMPTR(brdp, portp->txoffset); 1588 1589 while (len > 0) { 1590 stlen = MIN(len, stlen); 1591 memcpy((shbuf + head), chbuf, stlen); 1592 chbuf += stlen; 1593 len -= stlen; 1594 count += stlen; 1595 head += stlen; 1596 if (head >= size) { 1597 head = 0; 1598 stlen = tail; 1599 } 1600 } 1601 1602 ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); 1603 ap->txq.head = head; 1604 if (test_bit(ST_TXBUSY, &portp->state)) { 1605 if (ap->changed.data & DT_TXEMPTY) 1606 ap->changed.data &= ~DT_TXEMPTY; 1607 } 1608 hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); 1609 bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + 1610 portp->portidx; 1611 *bits |= portp->portbit; 1612 set_bit(ST_TXBUSY, &portp->state); 1613 EBRDDISABLE(brdp); 1614 1615 restore_flags(flags); 1616 1617 return(count); 1618} 1619 1620/*****************************************************************************/ 1621 1622/* 1623 * Output a single character. We put it into a temporary local buffer 1624 * (for speed) then write out that buffer when the flushchars routine 1625 * is called. There is a safety catch here so that if some other port 1626 * writes chars before the current buffer has been, then we write them 1627 * first them do the new ports. 1628 */ 1629 1630static void stli_putchar(struct tty_struct *tty, unsigned char ch) 1631{ 1632#ifdef DEBUG 1633 printk("stli_putchar(tty=%x,ch=%x)\n", (int) tty, (int) ch); 1634#endif 1635 1636 if (tty == (struct tty_struct *) NULL) 1637 return; 1638 if (tty != stli_txcooktty) { 1639 if (stli_txcooktty != (struct tty_struct *) NULL) 1640 stli_flushchars(stli_txcooktty); 1641 stli_txcooktty = tty; 1642 } 1643 1644 stli_txcookbuf[stli_txcooksize++] = ch; 1645} 1646 1647/*****************************************************************************/ 1648 1649/* 1650 * Transfer characters from the local TX cooking buffer to the board. 1651 * We sort of ignore the tty that gets passed in here. We rely on the 1652 * info stored with the TX cook buffer to tell us which port to flush 1653 * the data on. In any case we clean out the TX cook buffer, for re-use 1654 * by someone else. 1655 */ 1656 1657static void stli_flushchars(struct tty_struct *tty) 1658{ 1659 volatile cdkhdr_t *hdrp; 1660 volatile unsigned char *bits; 1661 volatile cdkasy_t *ap; 1662 struct tty_struct *cooktty; 1663 stliport_t *portp; 1664 stlibrd_t *brdp; 1665 unsigned int len, stlen, head, tail, size, count, cooksize; 1666 unsigned char *buf, *shbuf; 1667 unsigned long flags; 1668 1669#ifdef DEBUG 1670 printk("stli_flushchars(tty=%x)\n", (int) tty); 1671#endif 1672 1673 cooksize = stli_txcooksize; 1674 cooktty = stli_txcooktty; 1675 stli_txcooksize = 0; 1676 stli_txcookrealsize = 0; 1677 stli_txcooktty = (struct tty_struct *) NULL; 1678 1679 if (tty == (struct tty_struct *) NULL) 1680 return; 1681 if (cooktty == (struct tty_struct *) NULL) 1682 return; 1683 if (tty != cooktty) 1684 tty = cooktty; 1685 if (cooksize == 0) 1686 return; 1687 1688 portp = tty->driver_data; 1689 if (portp == (stliport_t *) NULL) 1690 return; 1691 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 1692 return; 1693 brdp = stli_brds[portp->brdnr]; 1694 if (brdp == (stlibrd_t *) NULL) 1695 return; 1696 1697 save_flags(flags); 1698 cli(); 1699 EBRDENABLE(brdp); 1700 1701 ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); 1702 head = (unsigned int) ap->txq.head; 1703 tail = (unsigned int) ap->txq.tail; 1704 if (tail != ((unsigned int) ap->txq.tail)) 1705 tail = (unsigned int) ap->txq.tail; 1706 size = portp->txsize; 1707 if (head >= tail) { 1708 len = size - (head - tail) - 1; 1709 stlen = size - head; 1710 } else { 1711 len = tail - head - 1; 1712 stlen = len; 1713 } 1714 1715 len = MIN(len, cooksize); 1716 count = 0; 1717 shbuf = (char *) EBRDGETMEMPTR(brdp, portp->txoffset); 1718 buf = stli_txcookbuf; 1719 1720 while (len > 0) { 1721 stlen = MIN(len, stlen); 1722 memcpy((shbuf + head), buf, stlen); 1723 buf += stlen; 1724 len -= stlen; 1725 count += stlen; 1726 head += stlen; 1727 if (head >= size) { 1728 head = 0; 1729 stlen = tail; 1730 } 1731 } 1732 1733 ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); 1734 ap->txq.head = head; 1735 1736 if (test_bit(ST_TXBUSY, &portp->state)) { 1737 if (ap->changed.data & DT_TXEMPTY) 1738 ap->changed.data &= ~DT_TXEMPTY; 1739 } 1740 hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); 1741 bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + 1742 portp->portidx; 1743 *bits |= portp->portbit; 1744 set_bit(ST_TXBUSY, &portp->state); 1745 1746 EBRDDISABLE(brdp); 1747 restore_flags(flags); 1748} 1749 1750/*****************************************************************************/ 1751 1752static int stli_writeroom(struct tty_struct *tty) 1753{ 1754 volatile cdkasyrq_t *rp; 1755 stliport_t *portp; 1756 stlibrd_t *brdp; 1757 unsigned int head, tail, len; 1758 unsigned long flags; 1759 1760#ifdef DEBUG 1761 printk("stli_writeroom(tty=%x)\n", (int) tty); 1762#endif 1763 1764 if (tty == (struct tty_struct *) NULL) 1765 return(0); 1766 if (tty == stli_txcooktty) { 1767 if (stli_txcookrealsize != 0) { 1768 len = stli_txcookrealsize - stli_txcooksize; 1769 return(len); 1770 } 1771 } 1772 1773 portp = tty->driver_data; 1774 if (portp == (stliport_t *) NULL) 1775 return(0); 1776 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 1777 return(0); 1778 brdp = stli_brds[portp->brdnr]; 1779 if (brdp == (stlibrd_t *) NULL) 1780 return(0); 1781 1782 save_flags(flags); 1783 cli(); 1784 EBRDENABLE(brdp); 1785 rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->txq; 1786 head = (unsigned int) rp->head; 1787 tail = (unsigned int) rp->tail; 1788 if (tail != ((unsigned int) rp->tail)) 1789 tail = (unsigned int) rp->tail; 1790 len = (head >= tail) ? (portp->txsize - (head - tail)) : (tail - head); 1791 len--; 1792 EBRDDISABLE(brdp); 1793 restore_flags(flags); 1794 1795 if (tty == stli_txcooktty) { 1796 stli_txcookrealsize = len; 1797 len -= stli_txcooksize; 1798 } 1799 return(len); 1800} 1801 1802/*****************************************************************************/ 1803 1804/* 1805 * Return the number of characters in the transmit buffer. Normally we 1806 * will return the number of chars in the shared memory ring queue. 1807 * We need to kludge around the case where the shared memory buffer is 1808 * empty but not all characters have drained yet, for this case just 1809 * return that there is 1 character in the buffer! 1810 */ 1811 1812static int stli_charsinbuffer(struct tty_struct *tty) 1813{ 1814 volatile cdkasyrq_t *rp; 1815 stliport_t *portp; 1816 stlibrd_t *brdp; 1817 unsigned int head, tail, len; 1818 unsigned long flags; 1819 1820#ifdef DEBUG 1821 printk("stli_charsinbuffer(tty=%x)\n", (int) tty); 1822#endif 1823 1824 if (tty == (struct tty_struct *) NULL) 1825 return(0); 1826 if (tty == stli_txcooktty) 1827 stli_flushchars(tty); 1828 portp = tty->driver_data; 1829 if (portp == (stliport_t *) NULL) 1830 return(0); 1831 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 1832 return(0); 1833 brdp = stli_brds[portp->brdnr]; 1834 if (brdp == (stlibrd_t *) NULL) 1835 return(0); 1836 1837 save_flags(flags); 1838 cli(); 1839 EBRDENABLE(brdp); 1840 rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->txq; 1841 head = (unsigned int) rp->head; 1842 tail = (unsigned int) rp->tail; 1843 if (tail != ((unsigned int) rp->tail)) 1844 tail = (unsigned int) rp->tail; 1845 len = (head >= tail) ? (head - tail) : (portp->txsize - (tail - head)); 1846 if ((len == 0) && test_bit(ST_TXBUSY, &portp->state)) 1847 len = 1; 1848 EBRDDISABLE(brdp); 1849 restore_flags(flags); 1850 1851 return(len); 1852} 1853 1854/*****************************************************************************/ 1855 1856/* 1857 * Generate the serial struct info. 1858 */ 1859 1860static int stli_getserial(stliport_t *portp, struct serial_struct __user *sp) 1861{ 1862 struct serial_struct sio; 1863 stlibrd_t *brdp; 1864 1865#ifdef DEBUG 1866 printk("stli_getserial(portp=%x,sp=%x)\n", (int) portp, (int) sp); 1867#endif 1868 1869 memset(&sio, 0, sizeof(struct serial_struct)); 1870 sio.type = PORT_UNKNOWN; 1871 sio.line = portp->portnr; 1872 sio.irq = 0; 1873 sio.flags = portp->flags; 1874 sio.baud_base = portp->baud_base; 1875 sio.close_delay = portp->close_delay; 1876 sio.closing_wait = portp->closing_wait; 1877 sio.custom_divisor = portp->custom_divisor; 1878 sio.xmit_fifo_size = 0; 1879 sio.hub6 = 0; 1880 1881 brdp = stli_brds[portp->brdnr]; 1882 if (brdp != (stlibrd_t *) NULL) 1883 sio.port = brdp->iobase; 1884 1885 return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ? 1886 -EFAULT : 0; 1887} 1888 1889/*****************************************************************************/ 1890 1891/* 1892 * Set port according to the serial struct info. 1893 * At this point we do not do any auto-configure stuff, so we will 1894 * just quietly ignore any requests to change irq, etc. 1895 */ 1896 1897static int stli_setserial(stliport_t *portp, struct serial_struct __user *sp) 1898{ 1899 struct serial_struct sio; 1900 int rc; 1901 1902#ifdef DEBUG 1903 printk("stli_setserial(portp=%p,sp=%p)\n", portp, sp); 1904#endif 1905 1906 if (copy_from_user(&sio, sp, sizeof(struct serial_struct))) 1907 return -EFAULT; 1908 if (!capable(CAP_SYS_ADMIN)) { 1909 if ((sio.baud_base != portp->baud_base) || 1910 (sio.close_delay != portp->close_delay) || 1911 ((sio.flags & ~ASYNC_USR_MASK) != 1912 (portp->flags & ~ASYNC_USR_MASK))) 1913 return(-EPERM); 1914 } 1915 1916 portp->flags = (portp->flags & ~ASYNC_USR_MASK) | 1917 (sio.flags & ASYNC_USR_MASK); 1918 portp->baud_base = sio.baud_base; 1919 portp->close_delay = sio.close_delay; 1920 portp->closing_wait = sio.closing_wait; 1921 portp->custom_divisor = sio.custom_divisor; 1922 1923 if ((rc = stli_setport(portp)) < 0) 1924 return(rc); 1925 return(0); 1926} 1927 1928/*****************************************************************************/ 1929 1930static int stli_tiocmget(struct tty_struct *tty, struct file *file) 1931{ 1932 stliport_t *portp = tty->driver_data; 1933 stlibrd_t *brdp; 1934 int rc; 1935 1936 if (portp == (stliport_t *) NULL) 1937 return(-ENODEV); 1938 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 1939 return(0); 1940 brdp = stli_brds[portp->brdnr]; 1941 if (brdp == (stlibrd_t *) NULL) 1942 return(0); 1943 if (tty->flags & (1 << TTY_IO_ERROR)) 1944 return(-EIO); 1945 1946 if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS, 1947 &portp->asig, sizeof(asysigs_t), 1)) < 0) 1948 return(rc); 1949 1950 return stli_mktiocm(portp->asig.sigvalue); 1951} 1952 1953static int stli_tiocmset(struct tty_struct *tty, struct file *file, 1954 unsigned int set, unsigned int clear) 1955{ 1956 stliport_t *portp = tty->driver_data; 1957 stlibrd_t *brdp; 1958 int rts = -1, dtr = -1; 1959 1960 if (portp == (stliport_t *) NULL) 1961 return(-ENODEV); 1962 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 1963 return(0); 1964 brdp = stli_brds[portp->brdnr]; 1965 if (brdp == (stlibrd_t *) NULL) 1966 return(0); 1967 if (tty->flags & (1 << TTY_IO_ERROR)) 1968 return(-EIO); 1969 1970 if (set & TIOCM_RTS) 1971 rts = 1; 1972 if (set & TIOCM_DTR) 1973 dtr = 1; 1974 if (clear & TIOCM_RTS) 1975 rts = 0; 1976 if (clear & TIOCM_DTR) 1977 dtr = 0; 1978 1979 stli_mkasysigs(&portp->asig, dtr, rts); 1980 1981 return stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig, 1982 sizeof(asysigs_t), 0); 1983} 1984 1985static int stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg) 1986{ 1987 stliport_t *portp; 1988 stlibrd_t *brdp; 1989 unsigned int ival; 1990 int rc; 1991 void __user *argp = (void __user *)arg; 1992 1993#ifdef DEBUG 1994 printk("stli_ioctl(tty=%x,file=%x,cmd=%x,arg=%x)\n", 1995 (int) tty, (int) file, cmd, (int) arg); 1996#endif 1997 1998 if (tty == (struct tty_struct *) NULL) 1999 return(-ENODEV); 2000 portp = tty->driver_data; 2001 if (portp == (stliport_t *) NULL) 2002 return(-ENODEV); 2003 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 2004 return(0); 2005 brdp = stli_brds[portp->brdnr]; 2006 if (brdp == (stlibrd_t *) NULL) 2007 return(0); 2008 2009 if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) && 2010 (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS)) { 2011 if (tty->flags & (1 << TTY_IO_ERROR)) 2012 return(-EIO); 2013 } 2014 2015 rc = 0; 2016 2017 switch (cmd) { 2018 case TIOCGSOFTCAR: 2019 rc = put_user(((tty->termios->c_cflag & CLOCAL) ? 1 : 0), 2020 (unsigned __user *) arg); 2021 break; 2022 case TIOCSSOFTCAR: 2023 if ((rc = get_user(ival, (unsigned __user *) arg)) == 0) 2024 tty->termios->c_cflag = 2025 (tty->termios->c_cflag & ~CLOCAL) | 2026 (ival ? CLOCAL : 0); 2027 break; 2028 case TIOCGSERIAL: 2029 rc = stli_getserial(portp, argp); 2030 break; 2031 case TIOCSSERIAL: 2032 rc = stli_setserial(portp, argp); 2033 break; 2034 case STL_GETPFLAG: 2035 rc = put_user(portp->pflag, (unsigned __user *)argp); 2036 break; 2037 case STL_SETPFLAG: 2038 if ((rc = get_user(portp->pflag, (unsigned __user *)argp)) == 0) 2039 stli_setport(portp); 2040 break; 2041 case COM_GETPORTSTATS: 2042 rc = stli_getportstats(portp, argp); 2043 break; 2044 case COM_CLRPORTSTATS: 2045 rc = stli_clrportstats(portp, argp); 2046 break; 2047 case TIOCSERCONFIG: 2048 case TIOCSERGWILD: 2049 case TIOCSERSWILD: 2050 case TIOCSERGETLSR: 2051 case TIOCSERGSTRUCT: 2052 case TIOCSERGETMULTI: 2053 case TIOCSERSETMULTI: 2054 default: 2055 rc = -ENOIOCTLCMD; 2056 break; 2057 } 2058 2059 return(rc); 2060} 2061 2062/*****************************************************************************/ 2063 2064/* 2065 * This routine assumes that we have user context and can sleep. 2066 * Looks like it is true for the current ttys implementation..!! 2067 */ 2068 2069static void stli_settermios(struct tty_struct *tty, struct termios *old) 2070{ 2071 stliport_t *portp; 2072 stlibrd_t *brdp; 2073 struct termios *tiosp; 2074 asyport_t aport; 2075 2076#ifdef DEBUG 2077 printk("stli_settermios(tty=%x,old=%x)\n", (int) tty, (int) old); 2078#endif 2079 2080 if (tty == (struct tty_struct *) NULL) 2081 return; 2082 portp = tty->driver_data; 2083 if (portp == (stliport_t *) NULL) 2084 return; 2085 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 2086 return; 2087 brdp = stli_brds[portp->brdnr]; 2088 if (brdp == (stlibrd_t *) NULL) 2089 return; 2090 2091 tiosp = tty->termios; 2092 if ((tiosp->c_cflag == old->c_cflag) && 2093 (tiosp->c_iflag == old->c_iflag)) 2094 return; 2095 2096 stli_mkasyport(portp, &aport, tiosp); 2097 stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0); 2098 stli_mkasysigs(&portp->asig, ((tiosp->c_cflag & CBAUD) ? 1 : 0), -1); 2099 stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig, 2100 sizeof(asysigs_t), 0); 2101 if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0)) 2102 tty->hw_stopped = 0; 2103 if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL)) 2104 wake_up_interruptible(&portp->open_wait); 2105} 2106 2107/*****************************************************************************/ 2108 2109/* 2110 * Attempt to flow control who ever is sending us data. We won't really 2111 * do any flow control action here. We can't directly, and even if we 2112 * wanted to we would have to send a command to the slave. The slave 2113 * knows how to flow control, and will do so when its buffers reach its 2114 * internal high water marks. So what we will do is set a local state 2115 * bit that will stop us sending any RX data up from the poll routine 2116 * (which is the place where RX data from the slave is handled). 2117 */ 2118 2119static void stli_throttle(struct tty_struct *tty) 2120{ 2121 stliport_t *portp; 2122 2123#ifdef DEBUG 2124 printk("stli_throttle(tty=%x)\n", (int) tty); 2125#endif 2126 2127 if (tty == (struct tty_struct *) NULL) 2128 return; 2129 portp = tty->driver_data; 2130 if (portp == (stliport_t *) NULL) 2131 return; 2132 2133 set_bit(ST_RXSTOP, &portp->state); 2134} 2135 2136/*****************************************************************************/ 2137 2138/* 2139 * Unflow control the device sending us data... That means that all 2140 * we have to do is clear the RXSTOP state bit. The next poll call 2141 * will then be able to pass the RX data back up. 2142 */ 2143 2144static void stli_unthrottle(struct tty_struct *tty) 2145{ 2146 stliport_t *portp; 2147 2148#ifdef DEBUG 2149 printk("stli_unthrottle(tty=%x)\n", (int) tty); 2150#endif 2151 2152 if (tty == (struct tty_struct *) NULL) 2153 return; 2154 portp = tty->driver_data; 2155 if (portp == (stliport_t *) NULL) 2156 return; 2157 2158 clear_bit(ST_RXSTOP, &portp->state); 2159} 2160 2161/*****************************************************************************/ 2162 2163/* 2164 * Stop the transmitter. Basically to do this we will just turn TX 2165 * interrupts off. 2166 */ 2167 2168static void stli_stop(struct tty_struct *tty) 2169{ 2170 stlibrd_t *brdp; 2171 stliport_t *portp; 2172 asyctrl_t actrl; 2173 2174#ifdef DEBUG 2175 printk("stli_stop(tty=%x)\n", (int) tty); 2176#endif 2177 2178 if (tty == (struct tty_struct *) NULL) 2179 return; 2180 portp = tty->driver_data; 2181 if (portp == (stliport_t *) NULL) 2182 return; 2183 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 2184 return; 2185 brdp = stli_brds[portp->brdnr]; 2186 if (brdp == (stlibrd_t *) NULL) 2187 return; 2188 2189 memset(&actrl, 0, sizeof(asyctrl_t)); 2190 actrl.txctrl = CT_STOPFLOW; 2191#if 0 2192 stli_cmdwait(brdp, portp, A_PORTCTRL, &actrl, sizeof(asyctrl_t), 0); 2193#endif 2194} 2195 2196/*****************************************************************************/ 2197 2198/* 2199 * Start the transmitter again. Just turn TX interrupts back on. 2200 */ 2201 2202static void stli_start(struct tty_struct *tty) 2203{ 2204 stliport_t *portp; 2205 stlibrd_t *brdp; 2206 asyctrl_t actrl; 2207 2208#ifdef DEBUG 2209 printk("stli_start(tty=%x)\n", (int) tty); 2210#endif 2211 2212 if (tty == (struct tty_struct *) NULL) 2213 return; 2214 portp = tty->driver_data; 2215 if (portp == (stliport_t *) NULL) 2216 return; 2217 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 2218 return; 2219 brdp = stli_brds[portp->brdnr]; 2220 if (brdp == (stlibrd_t *) NULL) 2221 return; 2222 2223 memset(&actrl, 0, sizeof(asyctrl_t)); 2224 actrl.txctrl = CT_STARTFLOW; 2225#if 0 2226 stli_cmdwait(brdp, portp, A_PORTCTRL, &actrl, sizeof(asyctrl_t), 0); 2227#endif 2228} 2229 2230/*****************************************************************************/ 2231 2232/* 2233 * Scheduler called hang up routine. This is called from the scheduler, 2234 * not direct from the driver "poll" routine. We can't call it there 2235 * since the real local hangup code will enable/disable the board and 2236 * other things that we can't do while handling the poll. Much easier 2237 * to deal with it some time later (don't really care when, hangups 2238 * aren't that time critical). 2239 */ 2240 2241static void stli_dohangup(void *arg) 2242{ 2243 stliport_t *portp; 2244 2245#ifdef DEBUG 2246 printk(KERN_DEBUG "stli_dohangup(portp=%x)\n", (int) arg); 2247#endif 2248 2249 /* 2250 * FIXME: There's a module removal race here: tty_hangup 2251 * calls schedule_work which will call into this 2252 * driver later. 2253 */ 2254 portp = (stliport_t *) arg; 2255 if (portp != (stliport_t *) NULL) { 2256 if (portp->tty != (struct tty_struct *) NULL) { 2257 tty_hangup(portp->tty); 2258 } 2259 } 2260} 2261 2262/*****************************************************************************/ 2263 2264/* 2265 * Hangup this port. This is pretty much like closing the port, only 2266 * a little more brutal. No waiting for data to drain. Shutdown the 2267 * port and maybe drop signals. This is rather tricky really. We want 2268 * to close the port as well. 2269 */ 2270 2271static void stli_hangup(struct tty_struct *tty) 2272{ 2273 stliport_t *portp; 2274 stlibrd_t *brdp; 2275 unsigned long flags; 2276 2277#ifdef DEBUG 2278 printk(KERN_DEBUG "stli_hangup(tty=%x)\n", (int) tty); 2279#endif 2280 2281 if (tty == (struct tty_struct *) NULL) 2282 return; 2283 portp = tty->driver_data; 2284 if (portp == (stliport_t *) NULL) 2285 return; 2286 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 2287 return; 2288 brdp = stli_brds[portp->brdnr]; 2289 if (brdp == (stlibrd_t *) NULL) 2290 return; 2291 2292 portp->flags &= ~ASYNC_INITIALIZED; 2293 2294 save_flags(flags); 2295 cli(); 2296 if (! test_bit(ST_CLOSING, &portp->state)) 2297 stli_rawclose(brdp, portp, 0, 0); 2298 if (tty->termios->c_cflag & HUPCL) { 2299 stli_mkasysigs(&portp->asig, 0, 0); 2300 if (test_bit(ST_CMDING, &portp->state)) { 2301 set_bit(ST_DOSIGS, &portp->state); 2302 set_bit(ST_DOFLUSHTX, &portp->state); 2303 set_bit(ST_DOFLUSHRX, &portp->state); 2304 } else { 2305 stli_sendcmd(brdp, portp, A_SETSIGNALSF, 2306 &portp->asig, sizeof(asysigs_t), 0); 2307 } 2308 } 2309 restore_flags(flags); 2310 2311 clear_bit(ST_TXBUSY, &portp->state); 2312 clear_bit(ST_RXSTOP, &portp->state); 2313 set_bit(TTY_IO_ERROR, &tty->flags); 2314 portp->tty = (struct tty_struct *) NULL; 2315 portp->flags &= ~ASYNC_NORMAL_ACTIVE; 2316 portp->refcount = 0; 2317 wake_up_interruptible(&portp->open_wait); 2318} 2319 2320/*****************************************************************************/ 2321 2322/* 2323 * Flush characters from the lower buffer. We may not have user context 2324 * so we cannot sleep waiting for it to complete. Also we need to check 2325 * if there is chars for this port in the TX cook buffer, and flush them 2326 * as well. 2327 */ 2328 2329static void stli_flushbuffer(struct tty_struct *tty) 2330{ 2331 stliport_t *portp; 2332 stlibrd_t *brdp; 2333 unsigned long ftype, flags; 2334 2335#ifdef DEBUG 2336 printk(KERN_DEBUG "stli_flushbuffer(tty=%x)\n", (int) tty); 2337#endif 2338 2339 if (tty == (struct tty_struct *) NULL) 2340 return; 2341 portp = tty->driver_data; 2342 if (portp == (stliport_t *) NULL) 2343 return; 2344 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 2345 return; 2346 brdp = stli_brds[portp->brdnr]; 2347 if (brdp == (stlibrd_t *) NULL) 2348 return; 2349 2350 save_flags(flags); 2351 cli(); 2352 if (tty == stli_txcooktty) { 2353 stli_txcooktty = (struct tty_struct *) NULL; 2354 stli_txcooksize = 0; 2355 stli_txcookrealsize = 0; 2356 } 2357 if (test_bit(ST_CMDING, &portp->state)) { 2358 set_bit(ST_DOFLUSHTX, &portp->state); 2359 } else { 2360 ftype = FLUSHTX; 2361 if (test_bit(ST_DOFLUSHRX, &portp->state)) { 2362 ftype |= FLUSHRX; 2363 clear_bit(ST_DOFLUSHRX, &portp->state); 2364 } 2365 stli_sendcmd(brdp, portp, A_FLUSH, &ftype, 2366 sizeof(unsigned long), 0); 2367 } 2368 restore_flags(flags); 2369 2370 wake_up_interruptible(&tty->write_wait); 2371 if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && 2372 tty->ldisc.write_wakeup) 2373 (tty->ldisc.write_wakeup)(tty); 2374} 2375 2376/*****************************************************************************/ 2377 2378static void stli_breakctl(struct tty_struct *tty, int state) 2379{ 2380 stlibrd_t *brdp; 2381 stliport_t *portp; 2382 long arg; 2383 /* long savestate, savetime; */ 2384 2385#ifdef DEBUG 2386 printk(KERN_DEBUG "stli_breakctl(tty=%x,state=%d)\n", (int) tty, state); 2387#endif 2388 2389 if (tty == (struct tty_struct *) NULL) 2390 return; 2391 portp = tty->driver_data; 2392 if (portp == (stliport_t *) NULL) 2393 return; 2394 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 2395 return; 2396 brdp = stli_brds[portp->brdnr]; 2397 if (brdp == (stlibrd_t *) NULL) 2398 return; 2399 2400/* 2401 * Due to a bug in the tty send_break() code we need to preserve 2402 * the current process state and timeout... 2403 savetime = current->timeout; 2404 savestate = current->state; 2405 */ 2406 2407 arg = (state == -1) ? BREAKON : BREAKOFF; 2408 stli_cmdwait(brdp, portp, A_BREAK, &arg, sizeof(long), 0); 2409 2410/* 2411 * 2412 current->timeout = savetime; 2413 current->state = savestate; 2414 */ 2415} 2416 2417/*****************************************************************************/ 2418 2419static void stli_waituntilsent(struct tty_struct *tty, int timeout) 2420{ 2421 stliport_t *portp; 2422 unsigned long tend; 2423 2424#ifdef DEBUG 2425 printk(KERN_DEBUG "stli_waituntilsent(tty=%x,timeout=%x)\n", (int) tty, timeout); 2426#endif 2427 2428 if (tty == (struct tty_struct *) NULL) 2429 return; 2430 portp = tty->driver_data; 2431 if (portp == (stliport_t *) NULL) 2432 return; 2433 2434 if (timeout == 0) 2435 timeout = HZ; 2436 tend = jiffies + timeout; 2437 2438 while (test_bit(ST_TXBUSY, &portp->state)) { 2439 if (signal_pending(current)) 2440 break; 2441 msleep_interruptible(20); 2442 if (time_after_eq(jiffies, tend)) 2443 break; 2444 } 2445} 2446 2447/*****************************************************************************/ 2448 2449static void stli_sendxchar(struct tty_struct *tty, char ch) 2450{ 2451 stlibrd_t *brdp; 2452 stliport_t *portp; 2453 asyctrl_t actrl; 2454 2455#ifdef DEBUG 2456 printk(KERN_DEBUG "stli_sendxchar(tty=%x,ch=%x)\n", (int) tty, ch); 2457#endif 2458 2459 if (tty == (struct tty_struct *) NULL) 2460 return; 2461 portp = tty->driver_data; 2462 if (portp == (stliport_t *) NULL) 2463 return; 2464 if ((portp->brdnr < 0) || (portp->brdnr >= stli_nrbrds)) 2465 return; 2466 brdp = stli_brds[portp->brdnr]; 2467 if (brdp == (stlibrd_t *) NULL) 2468 return; 2469 2470 memset(&actrl, 0, sizeof(asyctrl_t)); 2471 if (ch == STOP_CHAR(tty)) { 2472 actrl.rxctrl = CT_STOPFLOW; 2473 } else if (ch == START_CHAR(tty)) { 2474 actrl.rxctrl = CT_STARTFLOW; 2475 } else { 2476 actrl.txctrl = CT_SENDCHR; 2477 actrl.tximdch = ch; 2478 } 2479 2480 stli_cmdwait(brdp, portp, A_PORTCTRL, &actrl, sizeof(asyctrl_t), 0); 2481} 2482 2483/*****************************************************************************/ 2484 2485#define MAXLINE 80 2486 2487/* 2488 * Format info for a specified port. The line is deliberately limited 2489 * to 80 characters. (If it is too long it will be truncated, if too 2490 * short then padded with spaces). 2491 */ 2492 2493static int stli_portinfo(stlibrd_t *brdp, stliport_t *portp, int portnr, char *pos) 2494{ 2495 char *sp, *uart; 2496 int rc, cnt; 2497 2498 rc = stli_portcmdstats(portp); 2499 2500 uart = "UNKNOWN"; 2501 if (brdp->state & BST_STARTED) { 2502 switch (stli_comstats.hwid) { 2503 case 0: uart = "2681"; break; 2504 case 1: uart = "SC26198"; break; 2505 default: uart = "CD1400"; break; 2506 } 2507 } 2508 2509 sp = pos; 2510 sp += sprintf(sp, "%d: uart:%s ", portnr, uart); 2511 2512 if ((brdp->state & BST_STARTED) && (rc >= 0)) { 2513 sp += sprintf(sp, "tx:%d rx:%d", (int) stli_comstats.txtotal, 2514 (int) stli_comstats.rxtotal); 2515 2516 if (stli_comstats.rxframing) 2517 sp += sprintf(sp, " fe:%d", 2518 (int) stli_comstats.rxframing); 2519 if (stli_comstats.rxparity) 2520 sp += sprintf(sp, " pe:%d", 2521 (int) stli_comstats.rxparity); 2522 if (stli_comstats.rxbreaks) 2523 sp += sprintf(sp, " brk:%d", 2524 (int) stli_comstats.rxbreaks); 2525 if (stli_comstats.rxoverrun) 2526 sp += sprintf(sp, " oe:%d", 2527 (int) stli_comstats.rxoverrun); 2528 2529 cnt = sprintf(sp, "%s%s%s%s%s ", 2530 (stli_comstats.signals & TIOCM_RTS) ? "|RTS" : "", 2531 (stli_comstats.signals & TIOCM_CTS) ? "|CTS" : "", 2532 (stli_comstats.signals & TIOCM_DTR) ? "|DTR" : "", 2533 (stli_comstats.signals & TIOCM_CD) ? "|DCD" : "", 2534 (stli_comstats.signals & TIOCM_DSR) ? "|DSR" : ""); 2535 *sp = ' '; 2536 sp += cnt; 2537 } 2538 2539 for (cnt = (sp - pos); (cnt < (MAXLINE - 1)); cnt++) 2540 *sp++ = ' '; 2541 if (cnt >= MAXLINE) 2542 pos[(MAXLINE - 2)] = '+'; 2543 pos[(MAXLINE - 1)] = '\n'; 2544 2545 return(MAXLINE); 2546} 2547 2548/*****************************************************************************/ 2549 2550/* 2551 * Port info, read from the /proc file system. 2552 */ 2553 2554static int stli_readproc(char *page, char **start, off_t off, int count, int *eof, void *data) 2555{ 2556 stlibrd_t *brdp; 2557 stliport_t *portp; 2558 int brdnr, portnr, totalport; 2559 int curoff, maxoff; 2560 char *pos; 2561 2562#ifdef DEBUG 2563 printk(KERN_DEBUG "stli_readproc(page=%x,start=%x,off=%x,count=%d,eof=%x," 2564 "data=%x\n", (int) page, (int) start, (int) off, count, 2565 (int) eof, (int) data); 2566#endif 2567 2568 pos = page; 2569 totalport = 0; 2570 curoff = 0; 2571 2572 if (off == 0) { 2573 pos += sprintf(pos, "%s: version %s", stli_drvtitle, 2574 stli_drvversion); 2575 while (pos < (page + MAXLINE - 1)) 2576 *pos++ = ' '; 2577 *pos++ = '\n'; 2578 } 2579 curoff = MAXLINE; 2580 2581/* 2582 * We scan through for each board, panel and port. The offset is 2583 * calculated on the fly, and irrelevant ports are skipped. 2584 */ 2585 for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) { 2586 brdp = stli_brds[brdnr]; 2587 if (brdp == (stlibrd_t *) NULL) 2588 continue; 2589 if (brdp->state == 0) 2590 continue; 2591 2592 maxoff = curoff + (brdp->nrports * MAXLINE); 2593 if (off >= maxoff) { 2594 curoff = maxoff; 2595 continue; 2596 } 2597 2598 totalport = brdnr * STL_MAXPORTS; 2599 for (portnr = 0; (portnr < brdp->nrports); portnr++, 2600 totalport++) { 2601 portp = brdp->ports[portnr]; 2602 if (portp == (stliport_t *) NULL) 2603 continue; 2604 if (off >= (curoff += MAXLINE)) 2605 continue; 2606 if ((pos - page + MAXLINE) > count) 2607 goto stli_readdone; 2608 pos += stli_portinfo(brdp, portp, totalport, pos); 2609 } 2610 } 2611 2612 *eof = 1; 2613 2614stli_readdone: 2615 *start = page; 2616 return(pos - page); 2617} 2618 2619/*****************************************************************************/ 2620 2621/* 2622 * Generic send command routine. This will send a message to the slave, 2623 * of the specified type with the specified argument. Must be very 2624 * careful of data that will be copied out from shared memory - 2625 * containing command results. The command completion is all done from 2626 * a poll routine that does not have user context. Therefore you cannot 2627 * copy back directly into user space, or to the kernel stack of a 2628 * process. This routine does not sleep, so can be called from anywhere. 2629 */ 2630 2631static void stli_sendcmd(stlibrd_t *brdp, stliport_t *portp, unsigned long cmd, void *arg, int size, int copyback) 2632{ 2633 volatile cdkhdr_t *hdrp; 2634 volatile cdkctrl_t *cp; 2635 volatile unsigned char *bits; 2636 unsigned long flags; 2637 2638#ifdef DEBUG 2639 printk(KERN_DEBUG "stli_sendcmd(brdp=%x,portp=%x,cmd=%x,arg=%x,size=%d," 2640 "copyback=%d)\n", (int) brdp, (int) portp, (int) cmd, 2641 (int) arg, size, copyback); 2642#endif 2643 2644 save_flags(flags); 2645 cli(); 2646 2647 if (test_bit(ST_CMDING, &portp->state)) { 2648 printk(KERN_ERR "STALLION: command already busy, cmd=%x!\n", 2649 (int) cmd); 2650 restore_flags(flags); 2651 return; 2652 } 2653 2654 EBRDENABLE(brdp); 2655 cp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl; 2656 if (size > 0) { 2657 memcpy((void *) &(cp->args[0]), arg, size); 2658 if (copyback) { 2659 portp->argp = arg; 2660 portp->argsize = size; 2661 } 2662 } 2663 cp->status = 0; 2664 cp->cmd = cmd; 2665 hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); 2666 bits = ((volatile unsigned char *) hdrp) + brdp->slaveoffset + 2667 portp->portidx; 2668 *bits |= portp->portbit; 2669 set_bit(ST_CMDING, &portp->state); 2670 EBRDDISABLE(brdp); 2671 restore_flags(flags); 2672} 2673 2674/*****************************************************************************/ 2675 2676/* 2677 * Read data from shared memory. This assumes that the shared memory 2678 * is enabled and that interrupts are off. Basically we just empty out 2679 * the shared memory buffer into the tty buffer. Must be careful to 2680 * handle the case where we fill up the tty buffer, but still have 2681 * more chars to unload. 2682 */ 2683 2684static void stli_read(stlibrd_t *brdp, stliport_t *portp) 2685{ 2686 volatile cdkasyrq_t *rp; 2687 volatile char *shbuf; 2688 struct tty_struct *tty; 2689 unsigned int head, tail, size; 2690 unsigned int len, stlen; 2691 2692#ifdef DEBUG 2693 printk(KERN_DEBUG "stli_read(brdp=%x,portp=%d)\n", 2694 (int) brdp, (int) portp); 2695#endif 2696 2697 if (test_bit(ST_RXSTOP, &portp->state)) 2698 return; 2699 tty = portp->tty; 2700 if (tty == (struct tty_struct *) NULL) 2701 return; 2702 2703 rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->rxq; 2704 head = (unsigned int) rp->head; 2705 if (head != ((unsigned int) rp->head)) 2706 head = (unsigned int) rp->head; 2707 tail = (unsigned int) rp->tail; 2708 size = portp->rxsize; 2709 if (head >= tail) { 2710 len = head - tail; 2711 stlen = len; 2712 } else { 2713 len = size - (tail - head); 2714 stlen = size - tail; 2715 } 2716 2717 len = MIN(len, (TTY_FLIPBUF_SIZE - tty->flip.count)); 2718 shbuf = (volatile char *) EBRDGETMEMPTR(brdp, portp->rxoffset); 2719 2720 while (len > 0) { 2721 stlen = MIN(len, stlen); 2722 memcpy(tty->flip.char_buf_ptr, (char *) (shbuf + tail), stlen); 2723 memset(tty->flip.flag_buf_ptr, 0, stlen); 2724 tty->flip.char_buf_ptr += stlen; 2725 tty->flip.flag_buf_ptr += stlen; 2726 tty->flip.count += stlen; 2727 2728 len -= stlen; 2729 tail += stlen; 2730 if (tail >= size) { 2731 tail = 0; 2732 stlen = head; 2733 } 2734 } 2735 rp = &((volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr))->rxq; 2736 rp->tail = tail; 2737 2738 if (head != tail) 2739 set_bit(ST_RXING, &portp->state); 2740 2741 tty_schedule_flip(tty); 2742} 2743 2744/*****************************************************************************/ 2745 2746/* 2747 * Set up and carry out any delayed commands. There is only a small set 2748 * of slave commands that can be done "off-level". So it is not too 2749 * difficult to deal with them here. 2750 */ 2751 2752static void stli_dodelaycmd(stliport_t *portp, volatile cdkctrl_t *cp) 2753{ 2754 int cmd; 2755 2756 if (test_bit(ST_DOSIGS, &portp->state)) { 2757 if (test_bit(ST_DOFLUSHTX, &portp->state) && 2758 test_bit(ST_DOFLUSHRX, &portp->state)) 2759 cmd = A_SETSIGNALSF; 2760 else if (test_bit(ST_DOFLUSHTX, &portp->state)) 2761 cmd = A_SETSIGNALSFTX; 2762 else if (test_bit(ST_DOFLUSHRX, &portp->state)) 2763 cmd = A_SETSIGNALSFRX; 2764 else 2765 cmd = A_SETSIGNALS; 2766 clear_bit(ST_DOFLUSHTX, &portp->state); 2767 clear_bit(ST_DOFLUSHRX, &portp->state); 2768 clear_bit(ST_DOSIGS, &portp->state); 2769 memcpy((void *) &(cp->args[0]), (void *) &portp->asig, 2770 sizeof(asysigs_t)); 2771 cp->status = 0; 2772 cp->cmd = cmd; 2773 set_bit(ST_CMDING, &portp->state); 2774 } else if (test_bit(ST_DOFLUSHTX, &portp->state) || 2775 test_bit(ST_DOFLUSHRX, &portp->state)) { 2776 cmd = ((test_bit(ST_DOFLUSHTX, &portp->state)) ? FLUSHTX : 0); 2777 cmd |= ((test_bit(ST_DOFLUSHRX, &portp->state)) ? FLUSHRX : 0); 2778 clear_bit(ST_DOFLUSHTX, &portp->state); 2779 clear_bit(ST_DOFLUSHRX, &portp->state); 2780 memcpy((void *) &(cp->args[0]), (void *) &cmd, sizeof(int)); 2781 cp->status = 0; 2782 cp->cmd = A_FLUSH; 2783 set_bit(ST_CMDING, &portp->state); 2784 } 2785} 2786 2787/*****************************************************************************/ 2788 2789/* 2790 * Host command service checking. This handles commands or messages 2791 * coming from the slave to the host. Must have board shared memory 2792 * enabled and interrupts off when called. Notice that by servicing the 2793 * read data last we don't need to change the shared memory pointer 2794 * during processing (which is a slow IO operation). 2795 * Return value indicates if this port is still awaiting actions from 2796 * the slave (like open, command, or even TX data being sent). If 0 2797 * then port is still busy, otherwise no longer busy. 2798 */ 2799 2800static int stli_hostcmd(stlibrd_t *brdp, stliport_t *portp) 2801{ 2802 volatile cdkasy_t *ap; 2803 volatile cdkctrl_t *cp; 2804 struct tty_struct *tty; 2805 asynotify_t nt; 2806 unsigned long oldsigs; 2807 int rc, donerx; 2808 2809#ifdef DEBUG 2810 printk(KERN_DEBUG "stli_hostcmd(brdp=%x,channr=%d)\n", 2811 (int) brdp, channr); 2812#endif 2813 2814 ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); 2815 cp = &ap->ctrl; 2816 2817/* 2818 * Check if we are waiting for an open completion message. 2819 */ 2820 if (test_bit(ST_OPENING, &portp->state)) { 2821 rc = (int) cp->openarg; 2822 if ((cp->open == 0) && (rc != 0)) { 2823 if (rc > 0) 2824 rc--; 2825 cp->openarg = 0; 2826 portp->rc = rc; 2827 clear_bit(ST_OPENING, &portp->state); 2828 wake_up_interruptible(&portp->raw_wait); 2829 } 2830 } 2831 2832/* 2833 * Check if we are waiting for a close completion message. 2834 */ 2835 if (test_bit(ST_CLOSING, &portp->state)) { 2836 rc = (int) cp->closearg; 2837 if ((cp->close == 0) && (rc != 0)) { 2838 if (rc > 0) 2839 rc--; 2840 cp->closearg = 0; 2841 portp->rc = rc; 2842 clear_bit(ST_CLOSING, &portp->state); 2843 wake_up_interruptible(&portp->raw_wait); 2844 } 2845 } 2846 2847/* 2848 * Check if we are waiting for a command completion message. We may 2849 * need to copy out the command results associated with this command. 2850 */ 2851 if (test_bit(ST_CMDING, &portp->state)) { 2852 rc = cp->status; 2853 if ((cp->cmd == 0) && (rc != 0)) { 2854 if (rc > 0) 2855 rc--; 2856 if (portp->argp != (void *) NULL) { 2857 memcpy(portp->argp, (void *) &(cp->args[0]), 2858 portp->argsize); 2859 portp->argp = (void *) NULL; 2860 } 2861 cp->status = 0; 2862 portp->rc = rc; 2863 clear_bit(ST_CMDING, &portp->state); 2864 stli_dodelaycmd(portp, cp); 2865 wake_up_interruptible(&portp->raw_wait); 2866 } 2867 } 2868 2869/* 2870 * Check for any notification messages ready. This includes lots of 2871 * different types of events - RX chars ready, RX break received, 2872 * TX data low or empty in the slave, modem signals changed state. 2873 */ 2874 donerx = 0; 2875 2876 if (ap->notify) { 2877 nt = ap->changed; 2878 ap->notify = 0; 2879 tty = portp->tty; 2880 2881 if (nt.signal & SG_DCD) { 2882 oldsigs = portp->sigs; 2883 portp->sigs = stli_mktiocm(nt.sigvalue); 2884 clear_bit(ST_GETSIGS, &portp->state); 2885 if ((portp->sigs & TIOCM_CD) && 2886 ((oldsigs & TIOCM_CD) == 0)) 2887 wake_up_interruptible(&portp->open_wait); 2888 if ((oldsigs & TIOCM_CD) && 2889 ((portp->sigs & TIOCM_CD) == 0)) { 2890 if (portp->flags & ASYNC_CHECK_CD) { 2891 if (tty) 2892 schedule_work(&portp->tqhangup); 2893 } 2894 } 2895 } 2896 2897 if (nt.data & DT_TXEMPTY) 2898 clear_bit(ST_TXBUSY, &portp->state); 2899 if (nt.data & (DT_TXEMPTY | DT_TXLOW)) { 2900 if (tty != (struct tty_struct *) NULL) { 2901 if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && 2902 tty->ldisc.write_wakeup) { 2903 (tty->ldisc.write_wakeup)(tty); 2904 EBRDENABLE(brdp); 2905 } 2906 wake_up_interruptible(&tty->write_wait); 2907 } 2908 } 2909 2910 if ((nt.data & DT_RXBREAK) && (portp->rxmarkmsk & BRKINT)) { 2911 if (tty != (struct tty_struct *) NULL) { 2912 if (tty->flip.count < TTY_FLIPBUF_SIZE) { 2913 tty->flip.count++; 2914 *tty->flip.flag_buf_ptr++ = TTY_BREAK; 2915 *tty->flip.char_buf_ptr++ = 0; 2916 if (portp->flags & ASYNC_SAK) { 2917 do_SAK(tty); 2918 EBRDENABLE(brdp); 2919 } 2920 tty_schedule_flip(tty); 2921 } 2922 } 2923 } 2924 2925 if (nt.data & DT_RXBUSY) { 2926 donerx++; 2927 stli_read(brdp, portp); 2928 } 2929 } 2930 2931/* 2932 * It might seem odd that we are checking for more RX chars here. 2933 * But, we need to handle the case where the tty buffer was previously 2934 * filled, but we had more characters to pass up. The slave will not 2935 * send any more RX notify messages until the RX buffer has been emptied. 2936 * But it will leave the service bits on (since the buffer is not empty). 2937 * So from here we can try to process more RX chars. 2938 */ 2939 if ((!donerx) && test_bit(ST_RXING, &portp->state)) { 2940 clear_bit(ST_RXING, &portp->state); 2941 stli_read(brdp, portp); 2942 } 2943 2944 return((test_bit(ST_OPENING, &portp->state) || 2945 test_bit(ST_CLOSING, &portp->state) || 2946 test_bit(ST_CMDING, &portp->state) || 2947 test_bit(ST_TXBUSY, &portp->state) || 2948 test_bit(ST_RXING, &portp->state)) ? 0 : 1); 2949} 2950 2951/*****************************************************************************/ 2952 2953/* 2954 * Service all ports on a particular board. Assumes that the boards 2955 * shared memory is enabled, and that the page pointer is pointed 2956 * at the cdk header structure. 2957 */ 2958 2959static void stli_brdpoll(stlibrd_t *brdp, volatile cdkhdr_t *hdrp) 2960{ 2961 stliport_t *portp; 2962 unsigned char hostbits[(STL_MAXCHANS / 8) + 1]; 2963 unsigned char slavebits[(STL_MAXCHANS / 8) + 1]; 2964 unsigned char *slavep; 2965 int bitpos, bitat, bitsize; 2966 int channr, nrdevs, slavebitchange; 2967 2968 bitsize = brdp->bitsize; 2969 nrdevs = brdp->nrdevs; 2970 2971/* 2972 * Check if slave wants any service. Basically we try to do as 2973 * little work as possible here. There are 2 levels of service 2974 * bits. So if there is nothing to do we bail early. We check 2975 * 8 service bits at a time in the inner loop, so we can bypass 2976 * the lot if none of them want service. 2977 */ 2978 memcpy(&hostbits[0], (((unsigned char *) hdrp) + brdp->hostoffset), 2979 bitsize); 2980 2981 memset(&slavebits[0], 0, bitsize); 2982 slavebitchange = 0; 2983 2984 for (bitpos = 0; (bitpos < bitsize); bitpos++) { 2985 if (hostbits[bitpos] == 0) 2986 continue; 2987 channr = bitpos * 8; 2988 for (bitat = 0x1; (channr < nrdevs); channr++, bitat <<= 1) { 2989 if (hostbits[bitpos] & bitat) { 2990 portp = brdp->ports[(channr - 1)]; 2991 if (stli_hostcmd(brdp, portp)) { 2992 slavebitchange++; 2993 slavebits[bitpos] |= bitat; 2994 } 2995 } 2996 } 2997 } 2998 2999/* 3000 * If any of the ports are no longer busy then update them in the 3001 * slave request bits. We need to do this after, since a host port 3002 * service may initiate more slave requests. 3003 */ 3004 if (slavebitchange) { 3005 hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); 3006 slavep = ((unsigned char *) hdrp) + brdp->slaveoffset; 3007 for (bitpos = 0; (bitpos < bitsize); bitpos++) { 3008 if (slavebits[bitpos]) 3009 slavep[bitpos] &= ~slavebits[bitpos]; 3010 } 3011 } 3012} 3013 3014/*****************************************************************************/ 3015 3016/* 3017 * Driver poll routine. This routine polls the boards in use and passes 3018 * messages back up to host when necessary. This is actually very 3019 * CPU efficient, since we will always have the kernel poll clock, it 3020 * adds only a few cycles when idle (since board service can be 3021 * determined very easily), but when loaded generates no interrupts 3022 * (with their expensive associated context change). 3023 */ 3024 3025static void stli_poll(unsigned long arg) 3026{ 3027 volatile cdkhdr_t *hdrp; 3028 stlibrd_t *brdp; 3029 int brdnr; 3030 3031 stli_timerlist.expires = STLI_TIMEOUT; 3032 add_timer(&stli_timerlist); 3033 3034/* 3035 * Check each board and do any servicing required. 3036 */ 3037 for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) { 3038 brdp = stli_brds[brdnr]; 3039 if (brdp == (stlibrd_t *) NULL) 3040 continue; 3041 if ((brdp->state & BST_STARTED) == 0) 3042 continue; 3043 3044 EBRDENABLE(brdp); 3045 hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); 3046 if (hdrp->hostreq) 3047 stli_brdpoll(brdp, hdrp); 3048 EBRDDISABLE(brdp); 3049 } 3050} 3051 3052/*****************************************************************************/ 3053 3054/* 3055 * Translate the termios settings into the port setting structure of 3056 * the slave. 3057 */ 3058 3059static void stli_mkasyport(stliport_t *portp, asyport_t *pp, struct termios *tiosp) 3060{ 3061#ifdef DEBUG 3062 printk(KERN_DEBUG "stli_mkasyport(portp=%x,pp=%x,tiosp=%d)\n", 3063 (int) portp, (int) pp, (int) tiosp); 3064#endif 3065 3066 memset(pp, 0, sizeof(asyport_t)); 3067 3068/* 3069 * Start of by setting the baud, char size, parity and stop bit info. 3070 */ 3071 pp->baudout = tiosp->c_cflag & CBAUD; 3072 if (pp->baudout & CBAUDEX) { 3073 pp->baudout &= ~CBAUDEX; 3074 if ((pp->baudout < 1) || (pp->baudout > 4)) 3075 tiosp->c_cflag &= ~CBAUDEX; 3076 else 3077 pp->baudout += 15; 3078 } 3079 pp->baudout = stli_baudrates[pp->baudout]; 3080 if ((tiosp->c_cflag & CBAUD) == B38400) { 3081 if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) 3082 pp->baudout = 57600; 3083 else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) 3084 pp->baudout = 115200; 3085 else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) 3086 pp->baudout = 230400; 3087 else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) 3088 pp->baudout = 460800; 3089 else if ((portp->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) 3090 pp->baudout = (portp->baud_base / portp->custom_divisor); 3091 } 3092 if (pp->baudout > STL_MAXBAUD) 3093 pp->baudout = STL_MAXBAUD; 3094 pp->baudin = pp->baudout; 3095 3096 switch (tiosp->c_cflag & CSIZE) { 3097 case CS5: 3098 pp->csize = 5; 3099 break; 3100 case CS6: 3101 pp->csize = 6; 3102 break; 3103 case CS7: 3104 pp->csize = 7; 3105 break; 3106 default: 3107 pp->csize = 8; 3108 break; 3109 } 3110 3111 if (tiosp->c_cflag & CSTOPB) 3112 pp->stopbs = PT_STOP2; 3113 else 3114 pp->stopbs = PT_STOP1; 3115 3116 if (tiosp->c_cflag & PARENB) { 3117 if (tiosp->c_cflag & PARODD) 3118 pp->parity = PT_ODDPARITY; 3119 else 3120 pp->parity = PT_EVENPARITY; 3121 } else { 3122 pp->parity = PT_NOPARITY; 3123 } 3124 3125/* 3126 * Set up any flow control options enabled. 3127 */ 3128 if (tiosp->c_iflag & IXON) { 3129 pp->flow |= F_IXON; 3130 if (tiosp->c_iflag & IXANY) 3131 pp->flow |= F_IXANY; 3132 } 3133 if (tiosp->c_cflag & CRTSCTS) 3134 pp->flow |= (F_RTSFLOW | F_CTSFLOW); 3135 3136 pp->startin = tiosp->c_cc[VSTART]; 3137 pp->stopin = tiosp->c_cc[VSTOP]; 3138 pp->startout = tiosp->c_cc[VSTART]; 3139 pp->stopout = tiosp->c_cc[VSTOP]; 3140 3141/* 3142 * Set up the RX char marking mask with those RX error types we must 3143 * catch. We can get the slave to help us out a little here, it will 3144 * ignore parity errors and breaks for us, and mark parity errors in 3145 * the data stream. 3146 */ 3147 if (tiosp->c_iflag & IGNPAR) 3148 pp->iflag |= FI_IGNRXERRS; 3149 if (tiosp->c_iflag & IGNBRK) 3150 pp->iflag |= FI_IGNBREAK; 3151 3152 portp->rxmarkmsk = 0; 3153 if (tiosp->c_iflag & (INPCK | PARMRK)) 3154 pp->iflag |= FI_1MARKRXERRS; 3155 if (tiosp->c_iflag & BRKINT) 3156 portp->rxmarkmsk |= BRKINT; 3157 3158/* 3159 * Set up clocal processing as required. 3160 */ 3161 if (tiosp->c_cflag & CLOCAL) 3162 portp->flags &= ~ASYNC_CHECK_CD; 3163 else 3164 portp->flags |= ASYNC_CHECK_CD; 3165 3166/* 3167 * Transfer any persistent flags into the asyport structure. 3168 */ 3169 pp->pflag = (portp->pflag & 0xffff); 3170 pp->vmin = (portp->pflag & P_RXIMIN) ? 1 : 0; 3171 pp->vtime = (portp->pflag & P_RXITIME) ? 1 : 0; 3172 pp->cc[1] = (portp->pflag & P_RXTHOLD) ? 1 : 0; 3173} 3174 3175/*****************************************************************************/ 3176 3177/* 3178 * Construct a slave signals structure for setting the DTR and RTS 3179 * signals as specified. 3180 */ 3181 3182static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts) 3183{ 3184#ifdef DEBUG 3185 printk(KERN_DEBUG "stli_mkasysigs(sp=%x,dtr=%d,rts=%d)\n", 3186 (int) sp, dtr, rts); 3187#endif 3188 3189 memset(sp, 0, sizeof(asysigs_t)); 3190 if (dtr >= 0) { 3191 sp->signal |= SG_DTR; 3192 sp->sigvalue |= ((dtr > 0) ? SG_DTR : 0); 3193 } 3194 if (rts >= 0) { 3195 sp->signal |= SG_RTS; 3196 sp->sigvalue |= ((rts > 0) ? SG_RTS : 0); 3197 } 3198} 3199 3200/*****************************************************************************/ 3201 3202/* 3203 * Convert the signals returned from the slave into a local TIOCM type 3204 * signals value. We keep them locally in TIOCM format. 3205 */ 3206 3207static long stli_mktiocm(unsigned long sigvalue) 3208{ 3209 long tiocm; 3210 3211#ifdef DEBUG 3212 printk(KERN_DEBUG "stli_mktiocm(sigvalue=%x)\n", (int) sigvalue); 3213#endif 3214 3215 tiocm = 0; 3216 tiocm |= ((sigvalue & SG_DCD) ? TIOCM_CD : 0); 3217 tiocm |= ((sigvalue & SG_CTS) ? TIOCM_CTS : 0); 3218 tiocm |= ((sigvalue & SG_RI) ? TIOCM_RI : 0); 3219 tiocm |= ((sigvalue & SG_DSR) ? TIOCM_DSR : 0); 3220 tiocm |= ((sigvalue & SG_DTR) ? TIOCM_DTR : 0); 3221 tiocm |= ((sigvalue & SG_RTS) ? TIOCM_RTS : 0); 3222 return(tiocm); 3223} 3224 3225/*****************************************************************************/ 3226 3227/* 3228 * All panels and ports actually attached have been worked out. All 3229 * we need to do here is set up the appropriate per port data structures. 3230 */ 3231 3232static int stli_initports(stlibrd_t *brdp) 3233{ 3234 stliport_t *portp; 3235 int i, panelnr, panelport; 3236 3237#ifdef DEBUG 3238 printk(KERN_DEBUG "stli_initports(brdp=%x)\n", (int) brdp); 3239#endif 3240 3241 for (i = 0, panelnr = 0, panelport = 0; (i < brdp->nrports); i++) { 3242 portp = (stliport_t *) stli_memalloc(sizeof(stliport_t)); 3243 if (portp == (stliport_t *) NULL) { 3244 printk("STALLION: failed to allocate port structure\n"); 3245 continue; 3246 } 3247 3248 memset(portp, 0, sizeof(stliport_t)); 3249 portp->magic = STLI_PORTMAGIC; 3250 portp->portnr = i; 3251 portp->brdnr = brdp->brdnr; 3252 portp->panelnr = panelnr; 3253 portp->baud_base = STL_BAUDBASE; 3254 portp->close_delay = STL_CLOSEDELAY; 3255 portp->closing_wait = 30 * HZ; 3256 INIT_WORK(&portp->tqhangup, stli_dohangup, portp); 3257 init_waitqueue_head(&portp->open_wait); 3258 init_waitqueue_head(&portp->close_wait); 3259 init_waitqueue_head(&portp->raw_wait); 3260 panelport++; 3261 if (panelport >= brdp->panels[panelnr]) { 3262 panelport = 0; 3263 panelnr++; 3264 } 3265 brdp->ports[i] = portp; 3266 } 3267 3268 return(0); 3269} 3270 3271/*****************************************************************************/ 3272 3273/* 3274 * All the following routines are board specific hardware operations. 3275 */ 3276 3277static void stli_ecpinit(stlibrd_t *brdp) 3278{ 3279 unsigned long memconf; 3280 3281#ifdef DEBUG 3282 printk(KERN_DEBUG "stli_ecpinit(brdp=%d)\n", (int) brdp); 3283#endif 3284 3285 outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR)); 3286 udelay(10); 3287 outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR)); 3288 udelay(100); 3289 3290 memconf = (brdp->memaddr & ECP_ATADDRMASK) >> ECP_ATADDRSHFT; 3291 outb(memconf, (brdp->iobase + ECP_ATMEMAR)); 3292} 3293 3294/*****************************************************************************/ 3295 3296static void stli_ecpenable(stlibrd_t *brdp) 3297{ 3298#ifdef DEBUG 3299 printk(KERN_DEBUG "stli_ecpenable(brdp=%x)\n", (int) brdp); 3300#endif 3301 outb(ECP_ATENABLE, (brdp->iobase + ECP_ATCONFR)); 3302} 3303 3304/*****************************************************************************/ 3305 3306static void stli_ecpdisable(stlibrd_t *brdp) 3307{ 3308#ifdef DEBUG 3309 printk(KERN_DEBUG "stli_ecpdisable(brdp=%x)\n", (int) brdp); 3310#endif 3311 outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR)); 3312} 3313 3314/*****************************************************************************/ 3315 3316static char *stli_ecpgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) 3317{ 3318 void *ptr; 3319 unsigned char val; 3320 3321#ifdef DEBUG 3322 printk(KERN_DEBUG "stli_ecpgetmemptr(brdp=%x,offset=%x)\n", (int) brdp, 3323 (int) offset); 3324#endif 3325 3326 if (offset > brdp->memsize) { 3327 printk(KERN_ERR "STALLION: shared memory pointer=%x out of " 3328 "range at line=%d(%d), brd=%d\n", 3329 (int) offset, line, __LINE__, brdp->brdnr); 3330 ptr = NULL; 3331 val = 0; 3332 } else { 3333 ptr = brdp->membase + (offset % ECP_ATPAGESIZE); 3334 val = (unsigned char) (offset / ECP_ATPAGESIZE); 3335 } 3336 outb(val, (brdp->iobase + ECP_ATMEMPR)); 3337 return(ptr); 3338} 3339 3340/*****************************************************************************/ 3341 3342static void stli_ecpreset(stlibrd_t *brdp) 3343{ 3344#ifdef DEBUG 3345 printk(KERN_DEBUG "stli_ecpreset(brdp=%x)\n", (int) brdp); 3346#endif 3347 3348 outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR)); 3349 udelay(10); 3350 outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR)); 3351 udelay(500); 3352} 3353 3354/*****************************************************************************/ 3355 3356static void stli_ecpintr(stlibrd_t *brdp) 3357{ 3358#ifdef DEBUG 3359 printk(KERN_DEBUG "stli_ecpintr(brdp=%x)\n", (int) brdp); 3360#endif 3361 outb(0x1, brdp->iobase); 3362} 3363 3364/*****************************************************************************/ 3365 3366/* 3367 * The following set of functions act on ECP EISA boards. 3368 */ 3369 3370static void stli_ecpeiinit(stlibrd_t *brdp) 3371{ 3372 unsigned long memconf; 3373 3374#ifdef DEBUG 3375 printk(KERN_DEBUG "stli_ecpeiinit(brdp=%x)\n", (int) brdp); 3376#endif 3377 3378 outb(0x1, (brdp->iobase + ECP_EIBRDENAB)); 3379 outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR)); 3380 udelay(10); 3381 outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR)); 3382 udelay(500); 3383 3384 memconf = (brdp->memaddr & ECP_EIADDRMASKL) >> ECP_EIADDRSHFTL; 3385 outb(memconf, (brdp->iobase + ECP_EIMEMARL)); 3386 memconf = (brdp->memaddr & ECP_EIADDRMASKH) >> ECP_EIADDRSHFTH; 3387 outb(memconf, (brdp->iobase + ECP_EIMEMARH)); 3388} 3389 3390/*****************************************************************************/ 3391 3392static void stli_ecpeienable(stlibrd_t *brdp) 3393{ 3394 outb(ECP_EIENABLE, (brdp->iobase + ECP_EICONFR)); 3395} 3396 3397/*****************************************************************************/ 3398 3399static void stli_ecpeidisable(stlibrd_t *brdp) 3400{ 3401 outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR)); 3402} 3403 3404/*****************************************************************************/ 3405 3406static char *stli_ecpeigetmemptr(stlibrd_t *brdp, unsigned long offset, int line) 3407{ 3408 void *ptr; 3409 unsigned char val; 3410 3411#ifdef DEBUG 3412 printk(KERN_DEBUG "stli_ecpeigetmemptr(brdp=%x,offset=%x,line=%d)\n", 3413 (int) brdp, (int) offset, line); 3414#endif 3415 3416 if (offset > brdp->memsize) { 3417 printk(KERN_ERR "STALLION: shared memory pointer=%x out of " 3418 "range at line=%d(%d), brd=%d\n", 3419 (int) offset, line, __LINE__, brdp->brdnr); 3420 ptr = NULL; 3421 val = 0; 3422 } else { 3423 ptr = brdp->membase + (offset % ECP_EIPAGESIZE); 3424 if (offset < ECP_EIPAGESIZE) 3425 val = ECP_EIENABLE; 3426 else 3427 val = ECP_EIENABLE | 0x40; 3428 } 3429 outb(val, (brdp->iobase + ECP_EICONFR)); 3430 return(ptr); 3431} 3432 3433/*****************************************************************************/ 3434 3435static void stli_ecpeireset(stlibrd_t *brdp) 3436{ 3437 outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR)); 3438 udelay(10); 3439 outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR)); 3440 udelay(500); 3441} 3442 3443/*****************************************************************************/ 3444 3445/* 3446 * The following set of functions act on ECP MCA boards. 3447 */ 3448 3449static void stli_ecpmcenable(stlibrd_t *brdp) 3450{ 3451 outb(ECP_MCENABLE, (brdp->iobase + ECP_MCCONFR)); 3452} 3453 3454/*****************************************************************************/ 3455 3456static void stli_ecpmcdisable(stlibrd_t *brdp) 3457{ 3458 outb(ECP_MCDISABLE, (brdp->iobase + ECP_MCCONFR)); 3459} 3460 3461/*****************************************************************************/ 3462 3463static char *stli_ecpmcgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) 3464{ 3465 void *ptr; 3466 unsigned char val; 3467 3468 if (offset > brdp->memsize) { 3469 printk(KERN_ERR "STALLION: shared memory pointer=%x out of " 3470 "range at line=%d(%d), brd=%d\n", 3471 (int) offset, line, __LINE__, brdp->brdnr); 3472 ptr = NULL; 3473 val = 0; 3474 } else { 3475 ptr = brdp->membase + (offset % ECP_MCPAGESIZE); 3476 val = ((unsigned char) (offset / ECP_MCPAGESIZE)) | ECP_MCENABLE; 3477 } 3478 outb(val, (brdp->iobase + ECP_MCCONFR)); 3479 return(ptr); 3480} 3481 3482/*****************************************************************************/ 3483 3484static void stli_ecpmcreset(stlibrd_t *brdp) 3485{ 3486 outb(ECP_MCSTOP, (brdp->iobase + ECP_MCCONFR)); 3487 udelay(10); 3488 outb(ECP_MCDISABLE, (brdp->iobase + ECP_MCCONFR)); 3489 udelay(500); 3490} 3491 3492/*****************************************************************************/ 3493 3494/* 3495 * The following set of functions act on ECP PCI boards. 3496 */ 3497 3498static void stli_ecppciinit(stlibrd_t *brdp) 3499{ 3500#ifdef DEBUG 3501 printk(KERN_DEBUG "stli_ecppciinit(brdp=%x)\n", (int) brdp); 3502#endif 3503 3504 outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR)); 3505 udelay(10); 3506 outb(0, (brdp->iobase + ECP_PCICONFR)); 3507 udelay(500); 3508} 3509 3510/*****************************************************************************/ 3511 3512static char *stli_ecppcigetmemptr(stlibrd_t *brdp, unsigned long offset, int line) 3513{ 3514 void *ptr; 3515 unsigned char val; 3516 3517#ifdef DEBUG 3518 printk(KERN_DEBUG "stli_ecppcigetmemptr(brdp=%x,offset=%x,line=%d)\n", 3519 (int) brdp, (int) offset, line); 3520#endif 3521 3522 if (offset > brdp->memsize) { 3523 printk(KERN_ERR "STALLION: shared memory pointer=%x out of " 3524 "range at line=%d(%d), board=%d\n", 3525 (int) offset, line, __LINE__, brdp->brdnr); 3526 ptr = NULL; 3527 val = 0; 3528 } else { 3529 ptr = brdp->membase + (offset % ECP_PCIPAGESIZE); 3530 val = (offset / ECP_PCIPAGESIZE) << 1; 3531 } 3532 outb(val, (brdp->iobase + ECP_PCICONFR)); 3533 return(ptr); 3534} 3535 3536/*****************************************************************************/ 3537 3538static void stli_ecppcireset(stlibrd_t *brdp) 3539{ 3540 outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR)); 3541 udelay(10); 3542 outb(0, (brdp->iobase + ECP_PCICONFR)); 3543 udelay(500); 3544} 3545 3546/*****************************************************************************/ 3547 3548/* 3549 * The following routines act on ONboards. 3550 */ 3551 3552static void stli_onbinit(stlibrd_t *brdp) 3553{ 3554 unsigned long memconf; 3555 3556#ifdef DEBUG 3557 printk(KERN_DEBUG "stli_onbinit(brdp=%d)\n", (int) brdp); 3558#endif 3559 3560 outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR)); 3561 udelay(10); 3562 outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR)); 3563 mdelay(1000); 3564 3565 memconf = (brdp->memaddr & ONB_ATADDRMASK) >> ONB_ATADDRSHFT; 3566 outb(memconf, (brdp->iobase + ONB_ATMEMAR)); 3567 outb(0x1, brdp->iobase); 3568 mdelay(1); 3569} 3570 3571/*****************************************************************************/ 3572 3573static void stli_onbenable(stlibrd_t *brdp) 3574{ 3575#ifdef DEBUG 3576 printk(KERN_DEBUG "stli_onbenable(brdp=%x)\n", (int) brdp); 3577#endif 3578 outb((brdp->enabval | ONB_ATENABLE), (brdp->iobase + ONB_ATCONFR)); 3579} 3580 3581/*****************************************************************************/ 3582 3583static void stli_onbdisable(stlibrd_t *brdp) 3584{ 3585#ifdef DEBUG 3586 printk(KERN_DEBUG "stli_onbdisable(brdp=%x)\n", (int) brdp); 3587#endif 3588 outb((brdp->enabval | ONB_ATDISABLE), (brdp->iobase + ONB_ATCONFR)); 3589} 3590 3591/*****************************************************************************/ 3592 3593static char *stli_onbgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) 3594{ 3595 void *ptr; 3596 3597#ifdef DEBUG 3598 printk(KERN_DEBUG "stli_onbgetmemptr(brdp=%x,offset=%x)\n", (int) brdp, 3599 (int) offset); 3600#endif 3601 3602 if (offset > brdp->memsize) { 3603 printk(KERN_ERR "STALLION: shared memory pointer=%x out of " 3604 "range at line=%d(%d), brd=%d\n", 3605 (int) offset, line, __LINE__, brdp->brdnr); 3606 ptr = NULL; 3607 } else { 3608 ptr = brdp->membase + (offset % ONB_ATPAGESIZE); 3609 } 3610 return(ptr); 3611} 3612 3613/*****************************************************************************/ 3614 3615static void stli_onbreset(stlibrd_t *brdp) 3616{ 3617 3618#ifdef DEBUG 3619 printk(KERN_DEBUG "stli_onbreset(brdp=%x)\n", (int) brdp); 3620#endif 3621 3622 outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR)); 3623 udelay(10); 3624 outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR)); 3625 mdelay(1000); 3626} 3627 3628/*****************************************************************************/ 3629 3630/* 3631 * The following routines act on ONboard EISA. 3632 */ 3633 3634static void stli_onbeinit(stlibrd_t *brdp) 3635{ 3636 unsigned long memconf; 3637 3638#ifdef DEBUG 3639 printk(KERN_DEBUG "stli_onbeinit(brdp=%d)\n", (int) brdp); 3640#endif 3641 3642 outb(0x1, (brdp->iobase + ONB_EIBRDENAB)); 3643 outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR)); 3644 udelay(10); 3645 outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR)); 3646 mdelay(1000); 3647 3648 memconf = (brdp->memaddr & ONB_EIADDRMASKL) >> ONB_EIADDRSHFTL; 3649 outb(memconf, (brdp->iobase + ONB_EIMEMARL)); 3650 memconf = (brdp->memaddr & ONB_EIADDRMASKH) >> ONB_EIADDRSHFTH; 3651 outb(memconf, (brdp->iobase + ONB_EIMEMARH)); 3652 outb(0x1, brdp->iobase); 3653 mdelay(1); 3654} 3655 3656/*****************************************************************************/ 3657 3658static void stli_onbeenable(stlibrd_t *brdp) 3659{ 3660#ifdef DEBUG 3661 printk(KERN_DEBUG "stli_onbeenable(brdp=%x)\n", (int) brdp); 3662#endif 3663 outb(ONB_EIENABLE, (brdp->iobase + ONB_EICONFR)); 3664} 3665 3666/*****************************************************************************/ 3667 3668static void stli_onbedisable(stlibrd_t *brdp) 3669{ 3670#ifdef DEBUG 3671 printk(KERN_DEBUG "stli_onbedisable(brdp=%x)\n", (int) brdp); 3672#endif 3673 outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR)); 3674} 3675 3676/*****************************************************************************/ 3677 3678static char *stli_onbegetmemptr(stlibrd_t *brdp, unsigned long offset, int line) 3679{ 3680 void *ptr; 3681 unsigned char val; 3682 3683#ifdef DEBUG 3684 printk(KERN_DEBUG "stli_onbegetmemptr(brdp=%x,offset=%x,line=%d)\n", 3685 (int) brdp, (int) offset, line); 3686#endif 3687 3688 if (offset > brdp->memsize) { 3689 printk(KERN_ERR "STALLION: shared memory pointer=%x out of " 3690 "range at line=%d(%d), brd=%d\n", 3691 (int) offset, line, __LINE__, brdp->brdnr); 3692 ptr = NULL; 3693 val = 0; 3694 } else { 3695 ptr = brdp->membase + (offset % ONB_EIPAGESIZE); 3696 if (offset < ONB_EIPAGESIZE) 3697 val = ONB_EIENABLE; 3698 else 3699 val = ONB_EIENABLE | 0x40; 3700 } 3701 outb(val, (brdp->iobase + ONB_EICONFR)); 3702 return(ptr); 3703} 3704 3705/*****************************************************************************/ 3706 3707static void stli_onbereset(stlibrd_t *brdp) 3708{ 3709 3710#ifdef DEBUG 3711 printk(KERN_ERR "stli_onbereset(brdp=%x)\n", (int) brdp); 3712#endif 3713 3714 outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR)); 3715 udelay(10); 3716 outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR)); 3717 mdelay(1000); 3718} 3719 3720/*****************************************************************************/ 3721 3722/* 3723 * The following routines act on Brumby boards. 3724 */ 3725 3726static void stli_bbyinit(stlibrd_t *brdp) 3727{ 3728 3729#ifdef DEBUG 3730 printk(KERN_ERR "stli_bbyinit(brdp=%d)\n", (int) brdp); 3731#endif 3732 3733 outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR)); 3734 udelay(10); 3735 outb(0, (brdp->iobase + BBY_ATCONFR)); 3736 mdelay(1000); 3737 outb(0x1, brdp->iobase); 3738 mdelay(1); 3739} 3740 3741/*****************************************************************************/ 3742 3743static char *stli_bbygetmemptr(stlibrd_t *brdp, unsigned long offset, int line) 3744{ 3745 void *ptr; 3746 unsigned char val; 3747 3748#ifdef DEBUG 3749 printk(KERN_ERR "stli_bbygetmemptr(brdp=%x,offset=%x)\n", (int) brdp, 3750 (int) offset); 3751#endif 3752 3753 if (offset > brdp->memsize) { 3754 printk(KERN_ERR "STALLION: shared memory pointer=%x out of " 3755 "range at line=%d(%d), brd=%d\n", 3756 (int) offset, line, __LINE__, brdp->brdnr); 3757 ptr = NULL; 3758 val = 0; 3759 } else { 3760 ptr = brdp->membase + (offset % BBY_PAGESIZE); 3761 val = (unsigned char) (offset / BBY_PAGESIZE); 3762 } 3763 outb(val, (brdp->iobase + BBY_ATCONFR)); 3764 return(ptr); 3765} 3766 3767/*****************************************************************************/ 3768 3769static void stli_bbyreset(stlibrd_t *brdp) 3770{ 3771 3772#ifdef DEBUG 3773 printk(KERN_DEBUG "stli_bbyreset(brdp=%x)\n", (int) brdp); 3774#endif 3775 3776 outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR)); 3777 udelay(10); 3778 outb(0, (brdp->iobase + BBY_ATCONFR)); 3779 mdelay(1000); 3780} 3781 3782/*****************************************************************************/ 3783 3784/* 3785 * The following routines act on original old Stallion boards. 3786 */ 3787 3788static void stli_stalinit(stlibrd_t *brdp) 3789{ 3790 3791#ifdef DEBUG 3792 printk(KERN_DEBUG "stli_stalinit(brdp=%d)\n", (int) brdp); 3793#endif 3794 3795 outb(0x1, brdp->iobase); 3796 mdelay(1000); 3797} 3798 3799/*****************************************************************************/ 3800 3801static char *stli_stalgetmemptr(stlibrd_t *brdp, unsigned long offset, int line) 3802{ 3803 void *ptr; 3804 3805#ifdef DEBUG 3806 printk(KERN_DEBUG "stli_stalgetmemptr(brdp=%x,offset=%x)\n", (int) brdp, 3807 (int) offset); 3808#endif 3809 3810 if (offset > brdp->memsize) { 3811 printk(KERN_ERR "STALLION: shared memory pointer=%x out of " 3812 "range at line=%d(%d), brd=%d\n", 3813 (int) offset, line, __LINE__, brdp->brdnr); 3814 ptr = NULL; 3815 } else { 3816 ptr = brdp->membase + (offset % STAL_PAGESIZE); 3817 } 3818 return(ptr); 3819} 3820 3821/*****************************************************************************/ 3822 3823static void stli_stalreset(stlibrd_t *brdp) 3824{ 3825 volatile unsigned long *vecp; 3826 3827#ifdef DEBUG 3828 printk(KERN_DEBUG "stli_stalreset(brdp=%x)\n", (int) brdp); 3829#endif 3830 3831 vecp = (volatile unsigned long *) (brdp->membase + 0x30); 3832 *vecp = 0xffff0000; 3833 outb(0, brdp->iobase); 3834 mdelay(1000); 3835} 3836 3837/*****************************************************************************/ 3838 3839/* 3840 * Try to find an ECP board and initialize it. This handles only ECP 3841 * board types. 3842 */ 3843 3844static int stli_initecp(stlibrd_t *brdp) 3845{ 3846 cdkecpsig_t sig; 3847 cdkecpsig_t *sigsp; 3848 unsigned int status, nxtid; 3849 char *name; 3850 int panelnr, nrports; 3851 3852#ifdef DEBUG 3853 printk(KERN_DEBUG "stli_initecp(brdp=%x)\n", (int) brdp); 3854#endif 3855 3856 if (!request_region(brdp->iobase, brdp->iosize, "istallion")) 3857 return -EIO; 3858 3859 if ((brdp->iobase == 0) || (brdp->memaddr == 0)) 3860 { 3861 release_region(brdp->iobase, brdp->iosize); 3862 return(-ENODEV); 3863 } 3864 3865 brdp->iosize = ECP_IOSIZE; 3866 3867/* 3868 * Based on the specific board type setup the common vars to access 3869 * and enable shared memory. Set all board specific information now 3870 * as well. 3871 */ 3872 switch (brdp->brdtype) { 3873 case BRD_ECP: 3874 brdp->membase = (void *) brdp->memaddr; 3875 brdp->memsize = ECP_MEMSIZE; 3876 brdp->pagesize = ECP_ATPAGESIZE; 3877 brdp->init = stli_ecpinit; 3878 brdp->enable = stli_ecpenable; 3879 brdp->reenable = stli_ecpenable; 3880 brdp->disable = stli_ecpdisable; 3881 brdp->getmemptr = stli_ecpgetmemptr; 3882 brdp->intr = stli_ecpintr; 3883 brdp->reset = stli_ecpreset; 3884 name = "serial(EC8/64)"; 3885 break; 3886 3887 case BRD_ECPE: 3888 brdp->membase = (void *) brdp->memaddr; 3889 brdp->memsize = ECP_MEMSIZE; 3890 brdp->pagesize = ECP_EIPAGESIZE; 3891 brdp->init = stli_ecpeiinit; 3892 brdp->enable = stli_ecpeienable; 3893 brdp->reenable = stli_ecpeienable; 3894 brdp->disable = stli_ecpeidisable; 3895 brdp->getmemptr = stli_ecpeigetmemptr; 3896 brdp->intr = stli_ecpintr; 3897 brdp->reset = stli_ecpeireset; 3898 name = "serial(EC8/64-EI)"; 3899 break; 3900 3901 case BRD_ECPMC: 3902 brdp->membase = (void *) brdp->memaddr; 3903 brdp->memsize = ECP_MEMSIZE; 3904 brdp->pagesize = ECP_MCPAGESIZE; 3905 brdp->init = NULL; 3906 brdp->enable = stli_ecpmcenable; 3907 brdp->reenable = stli_ecpmcenable; 3908 brdp->disable = stli_ecpmcdisable; 3909 brdp->getmemptr = stli_ecpmcgetmemptr; 3910 brdp->intr = stli_ecpintr; 3911 brdp->reset = stli_ecpmcreset; 3912 name = "serial(EC8/64-MCA)"; 3913 break; 3914 3915 case BRD_ECPPCI: 3916 brdp->membase = (void *) brdp->memaddr; 3917 brdp->memsize = ECP_PCIMEMSIZE; 3918 brdp->pagesize = ECP_PCIPAGESIZE; 3919 brdp->init = stli_ecppciinit; 3920 brdp->enable = NULL; 3921 brdp->reenable = NULL; 3922 brdp->disable = NULL; 3923 brdp->getmemptr = stli_ecppcigetmemptr; 3924 brdp->intr = stli_ecpintr; 3925 brdp->reset = stli_ecppcireset; 3926 name = "serial(EC/RA-PCI)"; 3927 break; 3928 3929 default: 3930 release_region(brdp->iobase, brdp->iosize); 3931 return(-EINVAL); 3932 } 3933 3934/* 3935 * The per-board operations structure is all set up, so now let's go 3936 * and get the board operational. Firstly initialize board configuration 3937 * registers. Set the memory mapping info so we can get at the boards 3938 * shared memory. 3939 */ 3940 EBRDINIT(brdp); 3941 3942 brdp->membase = ioremap(brdp->memaddr, brdp->memsize); 3943 if (brdp->membase == (void *) NULL) 3944 { 3945 release_region(brdp->iobase, brdp->iosize); 3946 return(-ENOMEM); 3947 } 3948 3949/* 3950 * Now that all specific code is set up, enable the shared memory and 3951 * look for the a signature area that will tell us exactly what board 3952 * this is, and what it is connected to it. 3953 */ 3954 EBRDENABLE(brdp); 3955 sigsp = (cdkecpsig_t *) EBRDGETMEMPTR(brdp, CDK_SIGADDR); 3956 memcpy(&sig, sigsp, sizeof(cdkecpsig_t)); 3957 EBRDDISABLE(brdp); 3958 3959#if 0 3960 printk("%s(%d): sig-> magic=%x rom=%x panel=%x,%x,%x,%x,%x,%x,%x,%x\n", 3961 __FILE__, __LINE__, (int) sig.magic, sig.romver, sig.panelid[0], 3962 (int) sig.panelid[1], (int) sig.panelid[2], 3963 (int) sig.panelid[3], (int) sig.panelid[4], 3964 (int) sig.panelid[5], (int) sig.panelid[6], 3965 (int) sig.panelid[7]); 3966#endif 3967 3968 if (sig.magic != ECP_MAGIC) 3969 { 3970 release_region(brdp->iobase, brdp->iosize); 3971 return(-ENODEV); 3972 } 3973 3974/* 3975 * Scan through the signature looking at the panels connected to the 3976 * board. Calculate the total number of ports as we go. 3977 */ 3978 for (panelnr = 0, nxtid = 0; (panelnr < STL_MAXPANELS); panelnr++) { 3979 status = sig.panelid[nxtid]; 3980 if ((status & ECH_PNLIDMASK) != nxtid) 3981 break; 3982 3983 brdp->panelids[panelnr] = status; 3984 nrports = (status & ECH_PNL16PORT) ? 16 : 8; 3985 if ((nrports == 16) && ((status & ECH_PNLXPID) == 0)) 3986 nxtid++; 3987 brdp->panels[panelnr] = nrports; 3988 brdp->nrports += nrports; 3989 nxtid++; 3990 brdp->nrpanels++; 3991 } 3992 3993 3994 brdp->state |= BST_FOUND; 3995 return(0); 3996} 3997 3998/*****************************************************************************/ 3999 4000/* 4001 * Try to find an ONboard, Brumby or Stallion board and initialize it. 4002 * This handles only these board types. 4003 */ 4004 4005static int stli_initonb(stlibrd_t *brdp) 4006{ 4007 cdkonbsig_t sig; 4008 cdkonbsig_t *sigsp; 4009 char *name; 4010 int i; 4011 4012#ifdef DEBUG 4013 printk(KERN_DEBUG "stli_initonb(brdp=%x)\n", (int) brdp); 4014#endif 4015 4016/* 4017 * Do a basic sanity check on the IO and memory addresses. 4018 */ 4019 if ((brdp->iobase == 0) || (brdp->memaddr == 0)) 4020 return(-ENODEV); 4021 4022 brdp->iosize = ONB_IOSIZE; 4023 4024 if (!request_region(brdp->iobase, brdp->iosize, "istallion")) 4025 return -EIO; 4026 4027/* 4028 * Based on the specific board type setup the common vars to access 4029 * and enable shared memory. Set all board specific information now 4030 * as well. 4031 */ 4032 switch (brdp->brdtype) { 4033 case BRD_ONBOARD: 4034 case BRD_ONBOARD32: 4035 case BRD_ONBOARD2: 4036 case BRD_ONBOARD2_32: 4037 case BRD_ONBOARDRS: 4038 brdp->membase = (void *) brdp->memaddr; 4039 brdp->memsize = ONB_MEMSIZE; 4040 brdp->pagesize = ONB_ATPAGESIZE; 4041 brdp->init = stli_onbinit; 4042 brdp->enable = stli_onbenable; 4043 brdp->reenable = stli_onbenable; 4044 brdp->disable = stli_onbdisable; 4045 brdp->getmemptr = stli_onbgetmemptr; 4046 brdp->intr = stli_ecpintr; 4047 brdp->reset = stli_onbreset; 4048 if (brdp->memaddr > 0x100000) 4049 brdp->enabval = ONB_MEMENABHI; 4050 else 4051 brdp->enabval = ONB_MEMENABLO; 4052 name = "serial(ONBoard)"; 4053 break; 4054 4055 case BRD_ONBOARDE: 4056 brdp->membase = (void *) brdp->memaddr; 4057 brdp->memsize = ONB_EIMEMSIZE; 4058 brdp->pagesize = ONB_EIPAGESIZE; 4059 brdp->init = stli_onbeinit; 4060 brdp->enable = stli_onbeenable; 4061 brdp->reenable = stli_onbeenable; 4062 brdp->disable = stli_onbedisable; 4063 brdp->getmemptr = stli_onbegetmemptr; 4064 brdp->intr = stli_ecpintr; 4065 brdp->reset = stli_onbereset; 4066 name = "serial(ONBoard/E)"; 4067 break; 4068 4069 case BRD_BRUMBY4: 4070 case BRD_BRUMBY8: 4071 case BRD_BRUMBY16: 4072 brdp->membase = (void *) brdp->memaddr; 4073 brdp->memsize = BBY_MEMSIZE; 4074 brdp->pagesize = BBY_PAGESIZE; 4075 brdp->init = stli_bbyinit; 4076 brdp->enable = NULL; 4077 brdp->reenable = NULL; 4078 brdp->disable = NULL; 4079 brdp->getmemptr = stli_bbygetmemptr; 4080 brdp->intr = stli_ecpintr; 4081 brdp->reset = stli_bbyreset; 4082 name = "serial(Brumby)"; 4083 break; 4084 4085 case BRD_STALLION: 4086 brdp->membase = (void *) brdp->memaddr; 4087 brdp->memsize = STAL_MEMSIZE; 4088 brdp->pagesize = STAL_PAGESIZE; 4089 brdp->init = stli_stalinit; 4090 brdp->enable = NULL; 4091 brdp->reenable = NULL; 4092 brdp->disable = NULL; 4093 brdp->getmemptr = stli_stalgetmemptr; 4094 brdp->intr = stli_ecpintr; 4095 brdp->reset = stli_stalreset; 4096 name = "serial(Stallion)"; 4097 break; 4098 4099 default: 4100 release_region(brdp->iobase, brdp->iosize); 4101 return(-EINVAL); 4102 } 4103 4104/* 4105 * The per-board operations structure is all set up, so now let's go 4106 * and get the board operational. Firstly initialize board configuration 4107 * registers. Set the memory mapping info so we can get at the boards 4108 * shared memory. 4109 */ 4110 EBRDINIT(brdp); 4111 4112 brdp->membase = ioremap(brdp->memaddr, brdp->memsize); 4113 if (brdp->membase == (void *) NULL) 4114 { 4115 release_region(brdp->iobase, brdp->iosize); 4116 return(-ENOMEM); 4117 } 4118 4119/* 4120 * Now that all specific code is set up, enable the shared memory and 4121 * look for the a signature area that will tell us exactly what board 4122 * this is, and how many ports. 4123 */ 4124 EBRDENABLE(brdp); 4125 sigsp = (cdkonbsig_t *) EBRDGETMEMPTR(brdp, CDK_SIGADDR); 4126 memcpy(&sig, sigsp, sizeof(cdkonbsig_t)); 4127 EBRDDISABLE(brdp); 4128 4129#if 0 4130 printk("%s(%d): sig-> magic=%x:%x:%x:%x romver=%x amask=%x:%x:%x\n", 4131 __FILE__, __LINE__, sig.magic0, sig.magic1, sig.magic2, 4132 sig.magic3, sig.romver, sig.amask0, sig.amask1, sig.amask2); 4133#endif 4134 4135 if ((sig.magic0 != ONB_MAGIC0) || (sig.magic1 != ONB_MAGIC1) || 4136 (sig.magic2 != ONB_MAGIC2) || (sig.magic3 != ONB_MAGIC3)) 4137 { 4138 release_region(brdp->iobase, brdp->iosize); 4139 return(-ENODEV); 4140 } 4141 4142/* 4143 * Scan through the signature alive mask and calculate how many ports 4144 * there are on this board. 4145 */ 4146 brdp->nrpanels = 1; 4147 if (sig.amask1) { 4148 brdp->nrports = 32; 4149 } else { 4150 for (i = 0; (i < 16); i++) { 4151 if (((sig.amask0 << i) & 0x8000) == 0) 4152 break; 4153 } 4154 brdp->nrports = i; 4155 } 4156 brdp->panels[0] = brdp->nrports; 4157 4158 4159 brdp->state |= BST_FOUND; 4160 return(0); 4161} 4162 4163/*****************************************************************************/ 4164 4165/* 4166 * Start up a running board. This routine is only called after the 4167 * code has been down loaded to the board and is operational. It will 4168 * read in the memory map, and get the show on the road... 4169 */ 4170 4171static int stli_startbrd(stlibrd_t *brdp) 4172{ 4173 volatile cdkhdr_t *hdrp; 4174 volatile cdkmem_t *memp; 4175 volatile cdkasy_t *ap; 4176 unsigned long flags; 4177 stliport_t *portp; 4178 int portnr, nrdevs, i, rc; 4179 4180#ifdef DEBUG 4181 printk(KERN_DEBUG "stli_startbrd(brdp=%x)\n", (int) brdp); 4182#endif 4183 4184 rc = 0; 4185 4186 save_flags(flags); 4187 cli(); 4188 EBRDENABLE(brdp); 4189 hdrp = (volatile cdkhdr_t *) EBRDGETMEMPTR(brdp, CDK_CDKADDR); 4190 nrdevs = hdrp->nrdevs; 4191 4192#if 0 4193 printk("%s(%d): CDK version %d.%d.%d --> " 4194 "nrdevs=%d memp=%x hostp=%x slavep=%x\n", 4195 __FILE__, __LINE__, hdrp->ver_release, hdrp->ver_modification, 4196 hdrp->ver_fix, nrdevs, (int) hdrp->memp, (int) hdrp->hostp, 4197 (int) hdrp->slavep); 4198#endif 4199 4200 if (nrdevs < (brdp->nrports + 1)) { 4201 printk(KERN_ERR "STALLION: slave failed to allocate memory for " 4202 "all devices, devices=%d\n", nrdevs); 4203 brdp->nrports = nrdevs - 1; 4204 } 4205 brdp->nrdevs = nrdevs; 4206 brdp->hostoffset = hdrp->hostp - CDK_CDKADDR; 4207 brdp->slaveoffset = hdrp->slavep - CDK_CDKADDR; 4208 brdp->bitsize = (nrdevs + 7) / 8; 4209 memp = (volatile cdkmem_t *) hdrp->memp; 4210 if (((unsigned long) memp) > brdp->memsize) { 4211 printk(KERN_ERR "STALLION: corrupted shared memory region?\n"); 4212 rc = -EIO; 4213 goto stli_donestartup; 4214 } 4215 memp = (volatile cdkmem_t *) EBRDGETMEMPTR(brdp, (unsigned long) memp); 4216 if (memp->dtype != TYP_ASYNCTRL) { 4217 printk(KERN_ERR "STALLION: no slave control device found\n"); 4218 goto stli_donestartup; 4219 } 4220 memp++; 4221 4222/* 4223 * Cycle through memory allocation of each port. We are guaranteed to 4224 * have all ports inside the first page of slave window, so no need to 4225 * change pages while reading memory map. 4226 */ 4227 for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++, memp++) { 4228 if (memp->dtype != TYP_ASYNC) 4229 break; 4230 portp = brdp->ports[portnr]; 4231 if (portp == (stliport_t *) NULL) 4232 break; 4233 portp->devnr = i; 4234 portp->addr = memp->offset; 4235 portp->reqbit = (unsigned char) (0x1 << (i * 8 / nrdevs)); 4236 portp->portidx = (unsigned char) (i / 8); 4237 portp->portbit = (unsigned char) (0x1 << (i % 8)); 4238 } 4239 4240 hdrp->slavereq = 0xff; 4241 4242/* 4243 * For each port setup a local copy of the RX and TX buffer offsets 4244 * and sizes. We do this separate from the above, because we need to 4245 * move the shared memory page... 4246 */ 4247 for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++) { 4248 portp = brdp->ports[portnr]; 4249 if (portp == (stliport_t *) NULL) 4250 break; 4251 if (portp->addr == 0) 4252 break; 4253 ap = (volatile cdkasy_t *) EBRDGETMEMPTR(brdp, portp->addr); 4254 if (ap != (volatile cdkasy_t *) NULL) { 4255 portp->rxsize = ap->rxq.size; 4256 portp->txsize = ap->txq.size; 4257 portp->rxoffset = ap->rxq.offset; 4258 portp->txoffset = ap->txq.offset; 4259 } 4260 } 4261 4262stli_donestartup: 4263 EBRDDISABLE(brdp); 4264 restore_flags(flags); 4265 4266 if (rc == 0) 4267 brdp->state |= BST_STARTED; 4268 4269 if (! stli_timeron) { 4270 stli_timeron++; 4271 stli_timerlist.expires = STLI_TIMEOUT; 4272 add_timer(&stli_timerlist); 4273 } 4274 4275 return(rc); 4276} 4277 4278/*****************************************************************************/ 4279 4280/* 4281 * Probe and initialize the specified board. 4282 */ 4283 4284static int __init stli_brdinit(stlibrd_t *brdp) 4285{ 4286#ifdef DEBUG 4287 printk(KERN_DEBUG "stli_brdinit(brdp=%x)\n", (int) brdp); 4288#endif 4289 4290 stli_brds[brdp->brdnr] = brdp; 4291 4292 switch (brdp->brdtype) { 4293 case BRD_ECP: 4294 case BRD_ECPE: 4295 case BRD_ECPMC: 4296 case BRD_ECPPCI: 4297 stli_initecp(brdp); 4298 break; 4299 case BRD_ONBOARD: 4300 case BRD_ONBOARDE: 4301 case BRD_ONBOARD2: 4302 case BRD_ONBOARD32: 4303 case BRD_ONBOARD2_32: 4304 case BRD_ONBOARDRS: 4305 case BRD_BRUMBY4: 4306 case BRD_BRUMBY8: 4307 case BRD_BRUMBY16: 4308 case BRD_STALLION: 4309 stli_initonb(brdp); 4310 break; 4311 case BRD_EASYIO: 4312 case BRD_ECH: 4313 case BRD_ECHMC: 4314 case BRD_ECHPCI: 4315 printk(KERN_ERR "STALLION: %s board type not supported in " 4316 "this driver\n", stli_brdnames[brdp->brdtype]); 4317 return(ENODEV); 4318 default: 4319 printk(KERN_ERR "STALLION: board=%d is unknown board " 4320 "type=%d\n", brdp->brdnr, brdp->brdtype); 4321 return(ENODEV); 4322 } 4323 4324 if ((brdp->state & BST_FOUND) == 0) { 4325 printk(KERN_ERR "STALLION: %s board not found, board=%d " 4326 "io=%x mem=%x\n", 4327 stli_brdnames[brdp->brdtype], brdp->brdnr, 4328 brdp->iobase, (int) brdp->memaddr); 4329 return(ENODEV); 4330 } 4331 4332 stli_initports(brdp); 4333 printk(KERN_INFO "STALLION: %s found, board=%d io=%x mem=%x " 4334 "nrpanels=%d nrports=%d\n", stli_brdnames[brdp->brdtype], 4335 brdp->brdnr, brdp->iobase, (int) brdp->memaddr, 4336 brdp->nrpanels, brdp->nrports); 4337 return(0); 4338} 4339 4340/*****************************************************************************/ 4341 4342/* 4343 * Probe around trying to find where the EISA boards shared memory 4344 * might be. This is a bit if hack, but it is the best we can do. 4345 */ 4346 4347static int stli_eisamemprobe(stlibrd_t *brdp) 4348{ 4349 cdkecpsig_t ecpsig, *ecpsigp; 4350 cdkonbsig_t onbsig, *onbsigp; 4351 int i, foundit; 4352 4353#ifdef DEBUG 4354 printk(KERN_DEBUG "stli_eisamemprobe(brdp=%x)\n", (int) brdp); 4355#endif 4356 4357/* 4358 * First up we reset the board, to get it into a known state. There 4359 * is only 2 board types here we need to worry about. Don;t use the 4360 * standard board init routine here, it programs up the shared 4361 * memory address, and we don't know it yet... 4362 */ 4363 if (brdp->brdtype == BRD_ECPE) { 4364 outb(0x1, (brdp->iobase + ECP_EIBRDENAB)); 4365 outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR)); 4366 udelay(10); 4367 outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR)); 4368 udelay(500); 4369 stli_ecpeienable(brdp); 4370 } else if (brdp->brdtype == BRD_ONBOARDE) { 4371 outb(0x1, (brdp->iobase + ONB_EIBRDENAB)); 4372 outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR)); 4373 udelay(10); 4374 outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR)); 4375 mdelay(100); 4376 outb(0x1, brdp->iobase); 4377 mdelay(1); 4378 stli_onbeenable(brdp); 4379 } else { 4380 return(-ENODEV); 4381 } 4382 4383 foundit = 0; 4384 brdp->memsize = ECP_MEMSIZE; 4385 4386/* 4387 * Board shared memory is enabled, so now we have a poke around and 4388 * see if we can find it. 4389 */ 4390 for (i = 0; (i < stli_eisamempsize); i++) { 4391 brdp->memaddr = stli_eisamemprobeaddrs[i]; 4392 brdp->membase = (void *) brdp->memaddr; 4393 brdp->membase = ioremap(brdp->memaddr, brdp->memsize); 4394 if (brdp->membase == (void *) NULL) 4395 continue; 4396 4397 if (brdp->brdtype == BRD_ECPE) { 4398 ecpsigp = (cdkecpsig_t *) stli_ecpeigetmemptr(brdp, 4399 CDK_SIGADDR, __LINE__); 4400 memcpy(&ecpsig, ecpsigp, sizeof(cdkecpsig_t)); 4401 if (ecpsig.magic == ECP_MAGIC) 4402 foundit = 1; 4403 } else { 4404 onbsigp = (cdkonbsig_t *) stli_onbegetmemptr(brdp, 4405 CDK_SIGADDR, __LINE__); 4406 memcpy(&onbsig, onbsigp, sizeof(cdkonbsig_t)); 4407 if ((onbsig.magic0 == ONB_MAGIC0) && 4408 (onbsig.magic1 == ONB_MAGIC1) && 4409 (onbsig.magic2 == ONB_MAGIC2) && 4410 (onbsig.magic3 == ONB_MAGIC3)) 4411 foundit = 1; 4412 } 4413 4414 iounmap(brdp->membase); 4415 if (foundit) 4416 break; 4417 } 4418 4419/* 4420 * Regardless of whether we found the shared memory or not we must 4421 * disable the region. After that return success or failure. 4422 */ 4423 if (brdp->brdtype == BRD_ECPE) 4424 stli_ecpeidisable(brdp); 4425 else 4426 stli_onbedisable(brdp); 4427 4428 if (! foundit) { 4429 brdp->memaddr = 0; 4430 brdp->membase = NULL; 4431 printk(KERN_ERR "STALLION: failed to probe shared memory " 4432 "region for %s in EISA slot=%d\n", 4433 stli_brdnames[brdp->brdtype], (brdp->iobase >> 12)); 4434 return(-ENODEV); 4435 } 4436 return(0); 4437} 4438 4439static int stli_getbrdnr(void) 4440{ 4441 int i; 4442 4443 for (i = 0; i < STL_MAXBRDS; i++) { 4444 if (!stli_brds[i]) { 4445 if (i >= stli_nrbrds) 4446 stli_nrbrds = i + 1; 4447 return i; 4448 } 4449 } 4450 return -1; 4451} 4452 4453/*****************************************************************************/ 4454 4455/* 4456 * Probe around and try to find any EISA boards in system. The biggest 4457 * problem here is finding out what memory address is associated with 4458 * an EISA board after it is found. The registers of the ECPE and 4459 * ONboardE are not readable - so we can't read them from there. We 4460 * don't have access to the EISA CMOS (or EISA BIOS) so we don't 4461 * actually have any way to find out the real value. The best we can 4462 * do is go probing around in the usual places hoping we can find it. 4463 */ 4464 4465static int stli_findeisabrds(void) 4466{ 4467 stlibrd_t *brdp; 4468 unsigned int iobase, eid; 4469 int i; 4470 4471#ifdef DEBUG 4472 printk(KERN_DEBUG "stli_findeisabrds()\n"); 4473#endif 4474 4475/* 4476 * Firstly check if this is an EISA system. Do this by probing for 4477 * the system board EISA ID. If this is not an EISA system then 4478 * don't bother going any further! 4479 */ 4480 outb(0xff, 0xc80); 4481 if (inb(0xc80) == 0xff) 4482 return(0); 4483 4484/* 4485 * Looks like an EISA system, so go searching for EISA boards. 4486 */ 4487 for (iobase = 0x1000; (iobase <= 0xc000); iobase += 0x1000) { 4488 outb(0xff, (iobase + 0xc80)); 4489 eid = inb(iobase + 0xc80); 4490 eid |= inb(iobase + 0xc81) << 8; 4491 if (eid != STL_EISAID) 4492 continue; 4493 4494/* 4495 * We have found a board. Need to check if this board was 4496 * statically configured already (just in case!). 4497 */ 4498 for (i = 0; (i < STL_MAXBRDS); i++) { 4499 brdp = stli_brds[i]; 4500 if (brdp == (stlibrd_t *) NULL) 4501 continue; 4502 if (brdp->iobase == iobase) 4503 break; 4504 } 4505 if (i < STL_MAXBRDS) 4506 continue; 4507 4508/* 4509 * We have found a Stallion board and it is not configured already. 4510 * Allocate a board structure and initialize it. 4511 */ 4512 if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL) 4513 return(-ENOMEM); 4514 if ((brdp->brdnr = stli_getbrdnr()) < 0) 4515 return(-ENOMEM); 4516 eid = inb(iobase + 0xc82); 4517 if (eid == ECP_EISAID) 4518 brdp->brdtype = BRD_ECPE; 4519 else if (eid == ONB_EISAID) 4520 brdp->brdtype = BRD_ONBOARDE; 4521 else 4522 brdp->brdtype = BRD_UNKNOWN; 4523 brdp->iobase = iobase; 4524 outb(0x1, (iobase + 0xc84)); 4525 if (stli_eisamemprobe(brdp)) 4526 outb(0, (iobase + 0xc84)); 4527 stli_brdinit(brdp); 4528 } 4529 4530 return(0); 4531} 4532 4533/*****************************************************************************/ 4534 4535/* 4536 * Find the next available board number that is free. 4537 */ 4538 4539/*****************************************************************************/ 4540 4541#ifdef CONFIG_PCI 4542 4543/* 4544 * We have a Stallion board. Allocate a board structure and 4545 * initialize it. Read its IO and MEMORY resources from PCI 4546 * configuration space. 4547 */ 4548 4549static int stli_initpcibrd(int brdtype, struct pci_dev *devp) 4550{ 4551 stlibrd_t *brdp; 4552 4553#ifdef DEBUG 4554 printk(KERN_DEBUG "stli_initpcibrd(brdtype=%d,busnr=%x,devnr=%x)\n", 4555 brdtype, dev->bus->number, dev->devfn); 4556#endif 4557 4558 if (pci_enable_device(devp)) 4559 return(-EIO); 4560 if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL) 4561 return(-ENOMEM); 4562 if ((brdp->brdnr = stli_getbrdnr()) < 0) { 4563 printk(KERN_INFO "STALLION: too many boards found, " 4564 "maximum supported %d\n", STL_MAXBRDS); 4565 return(0); 4566 } 4567 brdp->brdtype = brdtype; 4568 4569#ifdef DEBUG 4570 printk(KERN_DEBUG "%s(%d): BAR[]=%lx,%lx,%lx,%lx\n", __FILE__, __LINE__, 4571 pci_resource_start(devp, 0), 4572 pci_resource_start(devp, 1), 4573 pci_resource_start(devp, 2), 4574 pci_resource_start(devp, 3)); 4575#endif 4576 4577/* 4578 * We have all resources from the board, so lets setup the actual 4579 * board structure now. 4580 */ 4581 brdp->iobase = pci_resource_start(devp, 3); 4582 brdp->memaddr = pci_resource_start(devp, 2); 4583 stli_brdinit(brdp); 4584 4585 return(0); 4586} 4587 4588/*****************************************************************************/ 4589 4590/* 4591 * Find all Stallion PCI boards that might be installed. Initialize each 4592 * one as it is found. 4593 */ 4594 4595static int stli_findpcibrds(void) 4596{ 4597 struct pci_dev *dev = NULL; 4598 int rc; 4599 4600#ifdef DEBUG 4601 printk("stli_findpcibrds()\n"); 4602#endif 4603 4604 while ((dev = pci_find_device(PCI_VENDOR_ID_STALLION, 4605 PCI_DEVICE_ID_ECRA, dev))) { 4606 if ((rc = stli_initpcibrd(BRD_ECPPCI, dev))) 4607 return(rc); 4608 } 4609 4610 return(0); 4611} 4612 4613#endif 4614 4615/*****************************************************************************/ 4616 4617/* 4618 * Allocate a new board structure. Fill out the basic info in it. 4619 */ 4620 4621static stlibrd_t *stli_allocbrd(void) 4622{ 4623 stlibrd_t *brdp; 4624 4625 brdp = (stlibrd_t *) stli_memalloc(sizeof(stlibrd_t)); 4626 if (brdp == (stlibrd_t *) NULL) { 4627 printk(KERN_ERR "STALLION: failed to allocate memory " 4628 "(size=%d)\n", sizeof(stlibrd_t)); 4629 return((stlibrd_t *) NULL); 4630 } 4631 4632 memset(brdp, 0, sizeof(stlibrd_t)); 4633 brdp->magic = STLI_BOARDMAGIC; 4634 return(brdp); 4635} 4636 4637/*****************************************************************************/ 4638 4639/* 4640 * Scan through all the boards in the configuration and see what we 4641 * can find. 4642 */ 4643 4644static int stli_initbrds(void) 4645{ 4646 stlibrd_t *brdp, *nxtbrdp; 4647 stlconf_t *confp; 4648 int i, j; 4649 4650#ifdef DEBUG 4651 printk(KERN_DEBUG "stli_initbrds()\n"); 4652#endif 4653 4654 if (stli_nrbrds > STL_MAXBRDS) { 4655 printk(KERN_INFO "STALLION: too many boards in configuration " 4656 "table, truncating to %d\n", STL_MAXBRDS); 4657 stli_nrbrds = STL_MAXBRDS; 4658 } 4659 4660/* 4661 * Firstly scan the list of static boards configured. Allocate 4662 * resources and initialize the boards as found. If this is a 4663 * module then let the module args override static configuration. 4664 */ 4665 for (i = 0; (i < stli_nrbrds); i++) { 4666 confp = &stli_brdconf[i]; 4667#ifdef MODULE 4668 stli_parsebrd(confp, stli_brdsp[i]); 4669#endif 4670 if ((brdp = stli_allocbrd()) == (stlibrd_t *) NULL) 4671 return(-ENOMEM); 4672 brdp->brdnr = i; 4673 brdp->brdtype = confp->brdtype; 4674 brdp->iobase = confp->ioaddr1; 4675 brdp->memaddr = confp->memaddr; 4676 stli_brdinit(brdp); 4677 } 4678 4679/* 4680 * Static configuration table done, so now use dynamic methods to 4681 * see if any more boards should be configured. 4682 */ 4683#ifdef MODULE 4684 stli_argbrds(); 4685#endif 4686 if (STLI_EISAPROBE) 4687 stli_findeisabrds(); 4688#ifdef CONFIG_PCI 4689 stli_findpcibrds(); 4690#endif 4691 4692/* 4693 * All found boards are initialized. Now for a little optimization, if 4694 * no boards are sharing the "shared memory" regions then we can just 4695 * leave them all enabled. This is in fact the usual case. 4696 */ 4697 stli_shared = 0; 4698 if (stli_nrbrds > 1) { 4699 for (i = 0; (i < stli_nrbrds); i++) { 4700 brdp = stli_brds[i]; 4701 if (brdp == (stlibrd_t *) NULL) 4702 continue; 4703 for (j = i + 1; (j < stli_nrbrds); j++) { 4704 nxtbrdp = stli_brds[j]; 4705 if (nxtbrdp == (stlibrd_t *) NULL) 4706 continue; 4707 if ((brdp->membase >= nxtbrdp->membase) && 4708 (brdp->membase <= (nxtbrdp->membase + 4709 nxtbrdp->memsize - 1))) { 4710 stli_shared++; 4711 break; 4712 } 4713 } 4714 } 4715 } 4716 4717 if (stli_shared == 0) { 4718 for (i = 0; (i < stli_nrbrds); i++) { 4719 brdp = stli_brds[i]; 4720 if (brdp == (stlibrd_t *) NULL) 4721 continue; 4722 if (brdp->state & BST_FOUND) { 4723 EBRDENABLE(brdp); 4724 brdp->enable = NULL; 4725 brdp->disable = NULL; 4726 } 4727 } 4728 } 4729 4730 return(0); 4731} 4732 4733/*****************************************************************************/ 4734 4735/* 4736 * Code to handle an "staliomem" read operation. This device is the 4737 * contents of the board shared memory. It is used for down loading 4738 * the slave image (and debugging :-) 4739 */ 4740 4741static ssize_t stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp) 4742{ 4743 unsigned long flags; 4744 void *memptr; 4745 stlibrd_t *brdp; 4746 int brdnr, size, n; 4747 4748#ifdef DEBUG 4749 printk(KERN_DEBUG "stli_memread(fp=%x,buf=%x,count=%x,offp=%x)\n", 4750 (int) fp, (int) buf, count, (int) offp); 4751#endif 4752 4753 brdnr = iminor(fp->f_dentry->d_inode); 4754 if (brdnr >= stli_nrbrds) 4755 return(-ENODEV); 4756 brdp = stli_brds[brdnr]; 4757 if (brdp == (stlibrd_t *) NULL) 4758 return(-ENODEV); 4759 if (brdp->state == 0) 4760 return(-ENODEV); 4761 if (fp->f_pos >= brdp->memsize) 4762 return(0); 4763 4764 size = MIN(count, (brdp->memsize - fp->f_pos)); 4765 4766 save_flags(flags); 4767 cli(); 4768 EBRDENABLE(brdp); 4769 while (size > 0) { 4770 memptr = (void *) EBRDGETMEMPTR(brdp, fp->f_pos); 4771 n = MIN(size, (brdp->pagesize - (((unsigned long) fp->f_pos) % brdp->pagesize))); 4772 if (copy_to_user(buf, memptr, n)) { 4773 count = -EFAULT; 4774 goto out; 4775 } 4776 fp->f_pos += n; 4777 buf += n; 4778 size -= n; 4779 } 4780out: 4781 EBRDDISABLE(brdp); 4782 restore_flags(flags); 4783 4784 return(count); 4785} 4786 4787/*****************************************************************************/ 4788 4789/* 4790 * Code to handle an "staliomem" write operation. This device is the 4791 * contents of the board shared memory. It is used for down loading 4792 * the slave image (and debugging :-) 4793 */ 4794 4795static ssize_t stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp) 4796{ 4797 unsigned long flags; 4798 void *memptr; 4799 stlibrd_t *brdp; 4800 char __user *chbuf; 4801 int brdnr, size, n; 4802 4803#ifdef DEBUG 4804 printk(KERN_DEBUG "stli_memwrite(fp=%x,buf=%x,count=%x,offp=%x)\n", 4805 (int) fp, (int) buf, count, (int) offp); 4806#endif 4807 4808 brdnr = iminor(fp->f_dentry->d_inode); 4809 if (brdnr >= stli_nrbrds) 4810 return(-ENODEV); 4811 brdp = stli_brds[brdnr]; 4812 if (brdp == (stlibrd_t *) NULL) 4813 return(-ENODEV); 4814 if (brdp->state == 0) 4815 return(-ENODEV); 4816 if (fp->f_pos >= brdp->memsize) 4817 return(0); 4818 4819 chbuf = (char __user *) buf; 4820 size = MIN(count, (brdp->memsize - fp->f_pos)); 4821 4822 save_flags(flags); 4823 cli(); 4824 EBRDENABLE(brdp); 4825 while (size > 0) { 4826 memptr = (void *) EBRDGETMEMPTR(brdp, fp->f_pos); 4827 n = MIN(size, (brdp->pagesize - (((unsigned long) fp->f_pos) % brdp->pagesize))); 4828 if (copy_from_user(memptr, chbuf, n)) { 4829 count = -EFAULT; 4830 goto out; 4831 } 4832 fp->f_pos += n; 4833 chbuf += n; 4834 size -= n; 4835 } 4836out: 4837 EBRDDISABLE(brdp); 4838 restore_flags(flags); 4839 4840 return(count); 4841} 4842 4843/*****************************************************************************/ 4844 4845/* 4846 * Return the board stats structure to user app. 4847 */ 4848 4849static int stli_getbrdstats(combrd_t __user *bp) 4850{ 4851 stlibrd_t *brdp; 4852 int i; 4853 4854 if (copy_from_user(&stli_brdstats, bp, sizeof(combrd_t))) 4855 return -EFAULT; 4856 if (stli_brdstats.brd >= STL_MAXBRDS) 4857 return(-ENODEV); 4858 brdp = stli_brds[stli_brdstats.brd]; 4859 if (brdp == (stlibrd_t *) NULL) 4860 return(-ENODEV); 4861 4862 memset(&stli_brdstats, 0, sizeof(combrd_t)); 4863 stli_brdstats.brd = brdp->brdnr; 4864 stli_brdstats.type = brdp->brdtype; 4865 stli_brdstats.hwid = 0; 4866 stli_brdstats.state = brdp->state; 4867 stli_brdstats.ioaddr = brdp->iobase; 4868 stli_brdstats.memaddr = brdp->memaddr; 4869 stli_brdstats.nrpanels = brdp->nrpanels; 4870 stli_brdstats.nrports = brdp->nrports; 4871 for (i = 0; (i < brdp->nrpanels); i++) { 4872 stli_brdstats.panels[i].panel = i; 4873 stli_brdstats.panels[i].hwid = brdp->panelids[i]; 4874 stli_brdstats.panels[i].nrports = brdp->panels[i]; 4875 } 4876 4877 if (copy_to_user(bp, &stli_brdstats, sizeof(combrd_t))) 4878 return -EFAULT; 4879 return(0); 4880} 4881 4882/*****************************************************************************/ 4883 4884/* 4885 * Resolve the referenced port number into a port struct pointer. 4886 */ 4887 4888static stliport_t *stli_getport(int brdnr, int panelnr, int portnr) 4889{ 4890 stlibrd_t *brdp; 4891 int i; 4892 4893 if ((brdnr < 0) || (brdnr >= STL_MAXBRDS)) 4894 return((stliport_t *) NULL); 4895 brdp = stli_brds[brdnr]; 4896 if (brdp == (stlibrd_t *) NULL) 4897 return((stliport_t *) NULL); 4898 for (i = 0; (i < panelnr); i++) 4899 portnr += brdp->panels[i]; 4900 if ((portnr < 0) || (portnr >= brdp->nrports)) 4901 return((stliport_t *) NULL); 4902 return(brdp->ports[portnr]); 4903} 4904 4905/*****************************************************************************/ 4906 4907/* 4908 * Return the port stats structure to user app. A NULL port struct 4909 * pointer passed in means that we need to find out from the app 4910 * what port to get stats for (used through board control device). 4911 */ 4912 4913static int stli_portcmdstats(stliport_t *portp) 4914{ 4915 unsigned long flags; 4916 stlibrd_t *brdp; 4917 int rc; 4918 4919 memset(&stli_comstats, 0, sizeof(comstats_t)); 4920 4921 if (portp == (stliport_t *) NULL) 4922 return(-ENODEV); 4923 brdp = stli_brds[portp->brdnr]; 4924 if (brdp == (stlibrd_t *) NULL) 4925 return(-ENODEV); 4926 4927 if (brdp->state & BST_STARTED) { 4928 if ((rc = stli_cmdwait(brdp, portp, A_GETSTATS, 4929 &stli_cdkstats, sizeof(asystats_t), 1)) < 0) 4930 return(rc); 4931 } else { 4932 memset(&stli_cdkstats, 0, sizeof(asystats_t)); 4933 } 4934 4935 stli_comstats.brd = portp->brdnr; 4936 stli_comstats.panel = portp->panelnr; 4937 stli_comstats.port = portp->portnr; 4938 stli_comstats.state = portp->state; 4939 stli_comstats.flags = portp->flags; 4940 4941 save_flags(flags); 4942 cli(); 4943 if (portp->tty != (struct tty_struct *) NULL) { 4944 if (portp->tty->driver_data == portp) { 4945 stli_comstats.ttystate = portp->tty->flags; 4946 stli_comstats.rxbuffered = portp->tty->flip.count; 4947 if (portp->tty->termios != (struct termios *) NULL) { 4948 stli_comstats.cflags = portp->tty->termios->c_cflag; 4949 stli_comstats.iflags = portp->tty->termios->c_iflag; 4950 stli_comstats.oflags = portp->tty->termios->c_oflag; 4951 stli_comstats.lflags = portp->tty->termios->c_lflag; 4952 } 4953 } 4954 } 4955 restore_flags(flags); 4956 4957 stli_comstats.txtotal = stli_cdkstats.txchars; 4958 stli_comstats.rxtotal = stli_cdkstats.rxchars + stli_cdkstats.ringover; 4959 stli_comstats.txbuffered = stli_cdkstats.txringq; 4960 stli_comstats.rxbuffered += stli_cdkstats.rxringq; 4961 stli_comstats.rxoverrun = stli_cdkstats.overruns; 4962 stli_comstats.rxparity = stli_cdkstats.parity; 4963 stli_comstats.rxframing = stli_cdkstats.framing; 4964 stli_comstats.rxlost = stli_cdkstats.ringover; 4965 stli_comstats.rxbreaks = stli_cdkstats.rxbreaks; 4966 stli_comstats.txbreaks = stli_cdkstats.txbreaks; 4967 stli_comstats.txxon = stli_cdkstats.txstart; 4968 stli_comstats.txxoff = stli_cdkstats.txstop; 4969 stli_comstats.rxxon = stli_cdkstats.rxstart; 4970 stli_comstats.rxxoff = stli_cdkstats.rxstop; 4971 stli_comstats.rxrtsoff = stli_cdkstats.rtscnt / 2; 4972 stli_comstats.rxrtson = stli_cdkstats.rtscnt - stli_comstats.rxrtsoff; 4973 stli_comstats.modem = stli_cdkstats.dcdcnt; 4974 stli_comstats.hwid = stli_cdkstats.hwid; 4975 stli_comstats.signals = stli_mktiocm(stli_cdkstats.signals); 4976 4977 return(0); 4978} 4979 4980/*****************************************************************************/ 4981 4982/* 4983 * Return the port stats structure to user app. A NULL port struct 4984 * pointer passed in means that we need to find out from the app 4985 * what port to get stats for (used through board control device). 4986 */ 4987 4988static int stli_getportstats(stliport_t *portp, comstats_t __user *cp) 4989{ 4990 stlibrd_t *brdp; 4991 int rc; 4992 4993 if (!portp) { 4994 if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t))) 4995 return -EFAULT; 4996 portp = stli_getport(stli_comstats.brd, stli_comstats.panel, 4997 stli_comstats.port); 4998 if (!portp) 4999 return -ENODEV; 5000 } 5001 5002 brdp = stli_brds[portp->brdnr]; 5003 if (!brdp) 5004 return -ENODEV; 5005 5006 if ((rc = stli_portcmdstats(portp)) < 0) 5007 return rc; 5008 5009 return copy_to_user(cp, &stli_comstats, sizeof(comstats_t)) ? 5010 -EFAULT : 0; 5011} 5012 5013/*****************************************************************************/ 5014 5015/* 5016 * Clear the port stats structure. We also return it zeroed out... 5017 */ 5018 5019static int stli_clrportstats(stliport_t *portp, comstats_t __user *cp) 5020{ 5021 stlibrd_t *brdp; 5022 int rc; 5023 5024 if (!portp) { 5025 if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t))) 5026 return -EFAULT; 5027 portp = stli_getport(stli_comstats.brd, stli_comstats.panel, 5028 stli_comstats.port); 5029 if (!portp) 5030 return -ENODEV; 5031 } 5032 5033 brdp = stli_brds[portp->brdnr]; 5034 if (!brdp) 5035 return -ENODEV; 5036 5037 if (brdp->state & BST_STARTED) { 5038 if ((rc = stli_cmdwait(brdp, portp, A_CLEARSTATS, NULL, 0, 0)) < 0) 5039 return rc; 5040 } 5041 5042 memset(&stli_comstats, 0, sizeof(comstats_t)); 5043 stli_comstats.brd = portp->brdnr; 5044 stli_comstats.panel = portp->panelnr; 5045 stli_comstats.port = portp->portnr; 5046 5047 if (copy_to_user(cp, &stli_comstats, sizeof(comstats_t))) 5048 return -EFAULT; 5049 return 0; 5050} 5051 5052/*****************************************************************************/ 5053 5054/* 5055 * Return the entire driver ports structure to a user app. 5056 */ 5057 5058static int stli_getportstruct(stliport_t __user *arg) 5059{ 5060 stliport_t *portp; 5061 5062 if (copy_from_user(&stli_dummyport, arg, sizeof(stliport_t))) 5063 return -EFAULT; 5064 portp = stli_getport(stli_dummyport.brdnr, stli_dummyport.panelnr, 5065 stli_dummyport.portnr); 5066 if (!portp) 5067 return -ENODEV; 5068 if (copy_to_user(arg, portp, sizeof(stliport_t))) 5069 return -EFAULT; 5070 return 0; 5071} 5072 5073/*****************************************************************************/ 5074 5075/* 5076 * Return the entire driver board structure to a user app. 5077 */ 5078 5079static int stli_getbrdstruct(stlibrd_t __user *arg) 5080{ 5081 stlibrd_t *brdp; 5082 5083 if (copy_from_user(&stli_dummybrd, arg, sizeof(stlibrd_t))) 5084 return -EFAULT; 5085 if ((stli_dummybrd.brdnr < 0) || (stli_dummybrd.brdnr >= STL_MAXBRDS)) 5086 return -ENODEV; 5087 brdp = stli_brds[stli_dummybrd.brdnr]; 5088 if (!brdp) 5089 return -ENODEV; 5090 if (copy_to_user(arg, brdp, sizeof(stlibrd_t))) 5091 return -EFAULT; 5092 return 0; 5093} 5094 5095/*****************************************************************************/ 5096 5097/* 5098 * The "staliomem" device is also required to do some special operations on 5099 * the board. We need to be able to send an interrupt to the board, 5100 * reset it, and start/stop it. 5101 */ 5102 5103static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg) 5104{ 5105 stlibrd_t *brdp; 5106 int brdnr, rc, done; 5107 void __user *argp = (void __user *)arg; 5108 5109#ifdef DEBUG 5110 printk(KERN_DEBUG "stli_memioctl(ip=%x,fp=%x,cmd=%x,arg=%x)\n", 5111 (int) ip, (int) fp, cmd, (int) arg); 5112#endif 5113 5114/* 5115 * First up handle the board independent ioctls. 5116 */ 5117 done = 0; 5118 rc = 0; 5119 5120 switch (cmd) { 5121 case COM_GETPORTSTATS: 5122 rc = stli_getportstats(NULL, argp); 5123 done++; 5124 break; 5125 case COM_CLRPORTSTATS: 5126 rc = stli_clrportstats(NULL, argp); 5127 done++; 5128 break; 5129 case COM_GETBRDSTATS: 5130 rc = stli_getbrdstats(argp); 5131 done++; 5132 break; 5133 case COM_READPORT: 5134 rc = stli_getportstruct(argp); 5135 done++; 5136 break; 5137 case COM_READBOARD: 5138 rc = stli_getbrdstruct(argp); 5139 done++; 5140 break; 5141 } 5142 5143 if (done) 5144 return(rc); 5145 5146/* 5147 * Now handle the board specific ioctls. These all depend on the 5148 * minor number of the device they were called from. 5149 */ 5150 brdnr = iminor(ip); 5151 if (brdnr >= STL_MAXBRDS) 5152 return(-ENODEV); 5153 brdp = stli_brds[brdnr]; 5154 if (!brdp) 5155 return(-ENODEV); 5156 if (brdp->state == 0) 5157 return(-ENODEV); 5158 5159 switch (cmd) { 5160 case STL_BINTR: 5161 EBRDINTR(brdp); 5162 break; 5163 case STL_BSTART: 5164 rc = stli_startbrd(brdp); 5165 break; 5166 case STL_BSTOP: 5167 brdp->state &= ~BST_STARTED; 5168 break; 5169 case STL_BRESET: 5170 brdp->state &= ~BST_STARTED; 5171 EBRDRESET(brdp); 5172 if (stli_shared == 0) { 5173 if (brdp->reenable != NULL) 5174 (* brdp->reenable)(brdp); 5175 } 5176 break; 5177 default: 5178 rc = -ENOIOCTLCMD; 5179 break; 5180 } 5181 5182 return(rc); 5183} 5184 5185static struct tty_operations stli_ops = { 5186 .open = stli_open, 5187 .close = stli_close, 5188 .write = stli_write, 5189 .put_char = stli_putchar, 5190 .flush_chars = stli_flushchars, 5191 .write_room = stli_writeroom, 5192 .chars_in_buffer = stli_charsinbuffer, 5193 .ioctl = stli_ioctl, 5194 .set_termios = stli_settermios, 5195 .throttle = stli_throttle, 5196 .unthrottle = stli_unthrottle, 5197 .stop = stli_stop, 5198 .start = stli_start, 5199 .hangup = stli_hangup, 5200 .flush_buffer = stli_flushbuffer, 5201 .break_ctl = stli_breakctl, 5202 .wait_until_sent = stli_waituntilsent, 5203 .send_xchar = stli_sendxchar, 5204 .read_proc = stli_readproc, 5205 .tiocmget = stli_tiocmget, 5206 .tiocmset = stli_tiocmset, 5207}; 5208 5209/*****************************************************************************/ 5210 5211int __init stli_init(void) 5212{ 5213 int i; 5214 printk(KERN_INFO "%s: version %s\n", stli_drvtitle, stli_drvversion); 5215 5216 stli_initbrds(); 5217 5218 stli_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS); 5219 if (!stli_serial) 5220 return -ENOMEM; 5221 5222/* 5223 * Allocate a temporary write buffer. 5224 */ 5225 stli_tmpwritebuf = (char *) stli_memalloc(STLI_TXBUFSIZE); 5226 if (stli_tmpwritebuf == (char *) NULL) 5227 printk(KERN_ERR "STALLION: failed to allocate memory " 5228 "(size=%d)\n", STLI_TXBUFSIZE); 5229 stli_txcookbuf = stli_memalloc(STLI_TXBUFSIZE); 5230 if (stli_txcookbuf == (char *) NULL) 5231 printk(KERN_ERR "STALLION: failed to allocate memory " 5232 "(size=%d)\n", STLI_TXBUFSIZE); 5233 5234/* 5235 * Set up a character driver for the shared memory region. We need this 5236 * to down load the slave code image. Also it is a useful debugging tool. 5237 */ 5238 if (register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stli_fsiomem)) 5239 printk(KERN_ERR "STALLION: failed to register serial memory " 5240 "device\n"); 5241 5242 devfs_mk_dir("staliomem"); 5243 istallion_class = class_create(THIS_MODULE, "staliomem"); 5244 for (i = 0; i < 4; i++) { 5245 devfs_mk_cdev(MKDEV(STL_SIOMEMMAJOR, i), 5246 S_IFCHR | S_IRUSR | S_IWUSR, 5247 "staliomem/%d", i); 5248 class_device_create(istallion_class, NULL, 5249 MKDEV(STL_SIOMEMMAJOR, i), 5250 NULL, "staliomem%d", i); 5251 } 5252 5253/* 5254 * Set up the tty driver structure and register us as a driver. 5255 */ 5256 stli_serial->owner = THIS_MODULE; 5257 stli_serial->driver_name = stli_drvname; 5258 stli_serial->name = stli_serialname; 5259 stli_serial->major = STL_SERIALMAJOR; 5260 stli_serial->minor_start = 0; 5261 stli_serial->type = TTY_DRIVER_TYPE_SERIAL; 5262 stli_serial->subtype = SERIAL_TYPE_NORMAL; 5263 stli_serial->init_termios = stli_deftermios; 5264 stli_serial->flags = TTY_DRIVER_REAL_RAW; 5265 tty_set_operations(stli_serial, &stli_ops); 5266 5267 if (tty_register_driver(stli_serial)) { 5268 put_tty_driver(stli_serial); 5269 printk(KERN_ERR "STALLION: failed to register serial driver\n"); 5270 return -EBUSY; 5271 } 5272 return(0); 5273} 5274 5275/*****************************************************************************/