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