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