root/drivers/tty/nozomi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. get_dc_by_tty
  2. get_port_by_tty
  3. read_mem32
  4. write_mem32
  5. nozomi_setup_memory
  6. dump_table
  7. dump_table
  8. nozomi_read_config_table
  9. enable_transmit_ul
  10. disable_transmit_ul
  11. enable_transmit_dl
  12. disable_transmit_dl
  13. send_data
  14. receive_data
  15. interrupt2str
  16. receive_flow_control
  17. port2ctrl
  18. send_flow_control
  19. handle_data_dl
  20. handle_data_ul
  21. interrupt_handler
  22. nozomi_get_card_type
  23. nozomi_setup_private_data
  24. card_type_show
  25. open_ttys_show
  26. make_sysfs_files
  27. remove_sysfs_files
  28. nozomi_card_init
  29. tty_exit
  30. nozomi_card_exit
  31. set_rts
  32. set_dtr
  33. ntty_install
  34. ntty_cleanup
  35. ntty_activate
  36. ntty_open
  37. ntty_shutdown
  38. ntty_close
  39. ntty_hangup
  40. ntty_write
  41. ntty_write_room
  42. ntty_tiocmget
  43. ntty_tiocmset
  44. ntty_cflags_changed
  45. ntty_tiocgicount
  46. ntty_ioctl
  47. ntty_unthrottle
  48. ntty_throttle
  49. ntty_chars_in_buffer
  50. nozomi_init
  51. nozomi_exit

   1 // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
   2 /*
   3  * nozomi.c  -- HSDPA driver Broadband Wireless Data Card - Globe Trotter
   4  *
   5  * Written by: Ulf Jakobsson,
   6  *             Jan Ã…kerfeldt,
   7  *             Stefan Thomasson,
   8  *
   9  * Maintained by: Paul Hardwick (p.hardwick@option.com)
  10  *
  11  * Patches:
  12  *          Locking code changes for Vodafone by Sphere Systems Ltd,
  13  *                              Andrew Bird (ajb@spheresystems.co.uk )
  14  *                              & Phil Sanderson
  15  *
  16  * Source has been ported from an implementation made by Filip Aben @ Option
  17  *
  18  * --------------------------------------------------------------------------
  19  *
  20  * Copyright (c) 2005,2006 Option Wireless Sweden AB
  21  * Copyright (c) 2006 Sphere Systems Ltd
  22  * Copyright (c) 2006 Option Wireless n/v
  23  * All rights Reserved.
  24  *
  25  * --------------------------------------------------------------------------
  26  */
  27 
  28 /* Enable this to have a lot of debug printouts */
  29 #define DEBUG
  30 
  31 #include <linux/kernel.h>
  32 #include <linux/module.h>
  33 #include <linux/pci.h>
  34 #include <linux/ioport.h>
  35 #include <linux/tty.h>
  36 #include <linux/tty_driver.h>
  37 #include <linux/tty_flip.h>
  38 #include <linux/sched.h>
  39 #include <linux/serial.h>
  40 #include <linux/interrupt.h>
  41 #include <linux/kmod.h>
  42 #include <linux/init.h>
  43 #include <linux/kfifo.h>
  44 #include <linux/uaccess.h>
  45 #include <linux/slab.h>
  46 #include <asm/byteorder.h>
  47 
  48 #include <linux/delay.h>
  49 
  50 
  51 #define VERSION_STRING DRIVER_DESC " 2.1d"
  52 
  53 /* Default debug printout level */
  54 #define NOZOMI_DEBUG_LEVEL 0x00
  55 static int debug = NOZOMI_DEBUG_LEVEL;
  56 module_param(debug, int, S_IRUGO | S_IWUSR);
  57 
  58 /*    Macros definitions */
  59 #define DBG_(lvl, fmt, args...)                         \
  60 do {                                                    \
  61         if (lvl & debug)                                \
  62                 pr_debug("[%d] %s(): " fmt "\n",        \
  63                          __LINE__, __func__,  ##args);  \
  64 } while (0)
  65 
  66 #define DBG1(args...) DBG_(0x01, ##args)
  67 #define DBG2(args...) DBG_(0x02, ##args)
  68 #define DBG3(args...) DBG_(0x04, ##args)
  69 #define DBG4(args...) DBG_(0x08, ##args)
  70 
  71 /* TODO: rewrite to optimize macros... */
  72 
  73 #define TMP_BUF_MAX 256
  74 
  75 #define DUMP(buf__, len__)                                              \
  76         do {                                                            \
  77                 char tbuf[TMP_BUF_MAX] = {0};                           \
  78                 if (len__ > 1) {                                        \
  79                         u32 data_len = min_t(u32, len__, TMP_BUF_MAX);  \
  80                         strscpy(tbuf, buf__, data_len);                 \
  81                         if (tbuf[data_len - 2] == '\r')                 \
  82                                 tbuf[data_len - 2] = 'r';               \
  83                         DBG1("SENDING: '%s' (%d+n)", tbuf, len__);      \
  84                 } else {                                                \
  85                         DBG1("SENDING: '%s' (%d)", tbuf, len__);        \
  86                 }                                                       \
  87         } while (0)
  88 
  89 /*    Defines */
  90 #define NOZOMI_NAME             "nozomi"
  91 #define NOZOMI_NAME_TTY         "nozomi_tty"
  92 #define DRIVER_DESC             "Nozomi driver"
  93 
  94 #define NTTY_TTY_MAXMINORS      256
  95 #define NTTY_FIFO_BUFFER_SIZE   8192
  96 
  97 /* Must be power of 2 */
  98 #define FIFO_BUFFER_SIZE_UL     8192
  99 
 100 /* Size of tmp send buffer to card */
 101 #define SEND_BUF_MAX            1024
 102 #define RECEIVE_BUF_MAX         4
 103 
 104 
 105 #define R_IIR                   0x0000  /* Interrupt Identity Register */
 106 #define R_FCR                   0x0000  /* Flow Control Register */
 107 #define R_IER                   0x0004  /* Interrupt Enable Register */
 108 
 109 #define NOZOMI_CONFIG_MAGIC     0xEFEFFEFE
 110 #define TOGGLE_VALID            0x0000
 111 
 112 /* Definition of interrupt tokens */
 113 #define MDM_DL1                 0x0001
 114 #define MDM_UL1                 0x0002
 115 #define MDM_DL2                 0x0004
 116 #define MDM_UL2                 0x0008
 117 #define DIAG_DL1                0x0010
 118 #define DIAG_DL2                0x0020
 119 #define DIAG_UL                 0x0040
 120 #define APP1_DL                 0x0080
 121 #define APP1_UL                 0x0100
 122 #define APP2_DL                 0x0200
 123 #define APP2_UL                 0x0400
 124 #define CTRL_DL                 0x0800
 125 #define CTRL_UL                 0x1000
 126 #define RESET                   0x8000
 127 
 128 #define MDM_DL                  (MDM_DL1  | MDM_DL2)
 129 #define MDM_UL                  (MDM_UL1  | MDM_UL2)
 130 #define DIAG_DL                 (DIAG_DL1 | DIAG_DL2)
 131 
 132 /* modem signal definition */
 133 #define CTRL_DSR                0x0001
 134 #define CTRL_DCD                0x0002
 135 #define CTRL_RI                 0x0004
 136 #define CTRL_CTS                0x0008
 137 
 138 #define CTRL_DTR                0x0001
 139 #define CTRL_RTS                0x0002
 140 
 141 #define MAX_PORT                4
 142 #define NOZOMI_MAX_PORTS        5
 143 #define NOZOMI_MAX_CARDS        (NTTY_TTY_MAXMINORS / MAX_PORT)
 144 
 145 /*    Type definitions */
 146 
 147 /*
 148  * There are two types of nozomi cards,
 149  * one with 2048 memory and with 8192 memory
 150  */
 151 enum card_type {
 152         F32_2 = 2048,   /* 512 bytes downlink + uplink * 2 -> 2048 */
 153         F32_8 = 8192,   /* 3072 bytes downl. + 1024 bytes uplink * 2 -> 8192 */
 154 };
 155 
 156 /* Initialization states a card can be in */
 157 enum card_state {
 158         NOZOMI_STATE_UNKNOWN    = 0,
 159         NOZOMI_STATE_ENABLED    = 1,    /* pci device enabled */
 160         NOZOMI_STATE_ALLOCATED  = 2,    /* config setup done */
 161         NOZOMI_STATE_READY      = 3,    /* flowcontrols received */
 162 };
 163 
 164 /* Two different toggle channels exist */
 165 enum channel_type {
 166         CH_A = 0,
 167         CH_B = 1,
 168 };
 169 
 170 /* Port definition for the card regarding flow control */
 171 enum ctrl_port_type {
 172         CTRL_CMD        = 0,
 173         CTRL_MDM        = 1,
 174         CTRL_DIAG       = 2,
 175         CTRL_APP1       = 3,
 176         CTRL_APP2       = 4,
 177         CTRL_ERROR      = -1,
 178 };
 179 
 180 /* Ports that the nozomi has */
 181 enum port_type {
 182         PORT_MDM        = 0,
 183         PORT_DIAG       = 1,
 184         PORT_APP1       = 2,
 185         PORT_APP2       = 3,
 186         PORT_CTRL       = 4,
 187         PORT_ERROR      = -1,
 188 };
 189 
 190 #ifdef __BIG_ENDIAN
 191 /* Big endian */
 192 
 193 struct toggles {
 194         unsigned int enabled:5; /*
 195                                  * Toggle fields are valid if enabled is 0,
 196                                  * else A-channels must always be used.
 197                                  */
 198         unsigned int diag_dl:1;
 199         unsigned int mdm_dl:1;
 200         unsigned int mdm_ul:1;
 201 } __attribute__ ((packed));
 202 
 203 /* Configuration table to read at startup of card */
 204 /* Is for now only needed during initialization phase */
 205 struct config_table {
 206         u32 signature;
 207         u16 product_information;
 208         u16 version;
 209         u8 pad3[3];
 210         struct toggles toggle;
 211         u8 pad1[4];
 212         u16 dl_mdm_len1;        /*
 213                                  * If this is 64, it can hold
 214                                  * 60 bytes + 4 that is length field
 215                                  */
 216         u16 dl_start;
 217 
 218         u16 dl_diag_len1;
 219         u16 dl_mdm_len2;        /*
 220                                  * If this is 64, it can hold
 221                                  * 60 bytes + 4 that is length field
 222                                  */
 223         u16 dl_app1_len;
 224 
 225         u16 dl_diag_len2;
 226         u16 dl_ctrl_len;
 227         u16 dl_app2_len;
 228         u8 pad2[16];
 229         u16 ul_mdm_len1;
 230         u16 ul_start;
 231         u16 ul_diag_len;
 232         u16 ul_mdm_len2;
 233         u16 ul_app1_len;
 234         u16 ul_app2_len;
 235         u16 ul_ctrl_len;
 236 } __attribute__ ((packed));
 237 
 238 /* This stores all control downlink flags */
 239 struct ctrl_dl {
 240         u8 port;
 241         unsigned int reserved:4;
 242         unsigned int CTS:1;
 243         unsigned int RI:1;
 244         unsigned int DCD:1;
 245         unsigned int DSR:1;
 246 } __attribute__ ((packed));
 247 
 248 /* This stores all control uplink flags */
 249 struct ctrl_ul {
 250         u8 port;
 251         unsigned int reserved:6;
 252         unsigned int RTS:1;
 253         unsigned int DTR:1;
 254 } __attribute__ ((packed));
 255 
 256 #else
 257 /* Little endian */
 258 
 259 /* This represents the toggle information */
 260 struct toggles {
 261         unsigned int mdm_ul:1;
 262         unsigned int mdm_dl:1;
 263         unsigned int diag_dl:1;
 264         unsigned int enabled:5; /*
 265                                  * Toggle fields are valid if enabled is 0,
 266                                  * else A-channels must always be used.
 267                                  */
 268 } __attribute__ ((packed));
 269 
 270 /* Configuration table to read at startup of card */
 271 struct config_table {
 272         u32 signature;
 273         u16 version;
 274         u16 product_information;
 275         struct toggles toggle;
 276         u8 pad1[7];
 277         u16 dl_start;
 278         u16 dl_mdm_len1;        /*
 279                                  * If this is 64, it can hold
 280                                  * 60 bytes + 4 that is length field
 281                                  */
 282         u16 dl_mdm_len2;
 283         u16 dl_diag_len1;
 284         u16 dl_diag_len2;
 285         u16 dl_app1_len;
 286         u16 dl_app2_len;
 287         u16 dl_ctrl_len;
 288         u8 pad2[16];
 289         u16 ul_start;
 290         u16 ul_mdm_len2;
 291         u16 ul_mdm_len1;
 292         u16 ul_diag_len;
 293         u16 ul_app1_len;
 294         u16 ul_app2_len;
 295         u16 ul_ctrl_len;
 296 } __attribute__ ((packed));
 297 
 298 /* This stores all control downlink flags */
 299 struct ctrl_dl {
 300         unsigned int DSR:1;
 301         unsigned int DCD:1;
 302         unsigned int RI:1;
 303         unsigned int CTS:1;
 304         unsigned int reserverd:4;
 305         u8 port;
 306 } __attribute__ ((packed));
 307 
 308 /* This stores all control uplink flags */
 309 struct ctrl_ul {
 310         unsigned int DTR:1;
 311         unsigned int RTS:1;
 312         unsigned int reserved:6;
 313         u8 port;
 314 } __attribute__ ((packed));
 315 #endif
 316 
 317 /* This holds all information that is needed regarding a port */
 318 struct port {
 319         struct tty_port port;
 320         u8 update_flow_control;
 321         struct ctrl_ul ctrl_ul;
 322         struct ctrl_dl ctrl_dl;
 323         struct kfifo fifo_ul;
 324         void __iomem *dl_addr[2];
 325         u32 dl_size[2];
 326         u8 toggle_dl;
 327         void __iomem *ul_addr[2];
 328         u32 ul_size[2];
 329         u8 toggle_ul;
 330         u16 token_dl;
 331 
 332         wait_queue_head_t tty_wait;
 333         struct async_icount tty_icount;
 334 
 335         struct nozomi *dc;
 336 };
 337 
 338 /* Private data one for each card in the system */
 339 struct nozomi {
 340         void __iomem *base_addr;
 341         unsigned long flip;
 342 
 343         /* Pointers to registers */
 344         void __iomem *reg_iir;
 345         void __iomem *reg_fcr;
 346         void __iomem *reg_ier;
 347 
 348         u16 last_ier;
 349         enum card_type card_type;
 350         struct config_table config_table;       /* Configuration table */
 351         struct pci_dev *pdev;
 352         struct port port[NOZOMI_MAX_PORTS];
 353         u8 *send_buf;
 354 
 355         spinlock_t spin_mutex;  /* secures access to registers and tty */
 356 
 357         unsigned int index_start;
 358         enum card_state state;
 359         u32 open_ttys;
 360 };
 361 
 362 /* This is a data packet that is read or written to/from card */
 363 struct buffer {
 364         u32 size;               /* size is the length of the data buffer */
 365         u8 *data;
 366 } __attribute__ ((packed));
 367 
 368 /* Global variables */
 369 static const struct pci_device_id nozomi_pci_tbl[] = {
 370         {PCI_DEVICE(0x1931, 0x000c)},   /* Nozomi HSDPA */
 371         {},
 372 };
 373 
 374 MODULE_DEVICE_TABLE(pci, nozomi_pci_tbl);
 375 
 376 static struct nozomi *ndevs[NOZOMI_MAX_CARDS];
 377 static struct tty_driver *ntty_driver;
 378 
 379 static const struct tty_port_operations noz_tty_port_ops;
 380 
 381 /*
 382  * find card by tty_index
 383  */
 384 static inline struct nozomi *get_dc_by_tty(const struct tty_struct *tty)
 385 {
 386         return tty ? ndevs[tty->index / MAX_PORT] : NULL;
 387 }
 388 
 389 static inline struct port *get_port_by_tty(const struct tty_struct *tty)
 390 {
 391         struct nozomi *ndev = get_dc_by_tty(tty);
 392         return ndev ? &ndev->port[tty->index % MAX_PORT] : NULL;
 393 }
 394 
 395 /*
 396  * TODO:
 397  * -Optimize
 398  * -Rewrite cleaner
 399  */
 400 
 401 static void read_mem32(u32 *buf, const void __iomem *mem_addr_start,
 402                         u32 size_bytes)
 403 {
 404         u32 i = 0;
 405         const u32 __iomem *ptr = mem_addr_start;
 406         u16 *buf16;
 407 
 408         if (unlikely(!ptr || !buf))
 409                 goto out;
 410 
 411         /* shortcut for extremely often used cases */
 412         switch (size_bytes) {
 413         case 2: /* 2 bytes */
 414                 buf16 = (u16 *) buf;
 415                 *buf16 = __le16_to_cpu(readw(ptr));
 416                 goto out;
 417                 break;
 418         case 4: /* 4 bytes */
 419                 *(buf) = __le32_to_cpu(readl(ptr));
 420                 goto out;
 421                 break;
 422         }
 423 
 424         while (i < size_bytes) {
 425                 if (size_bytes - i == 2) {
 426                         /* Handle 2 bytes in the end */
 427                         buf16 = (u16 *) buf;
 428                         *(buf16) = __le16_to_cpu(readw(ptr));
 429                         i += 2;
 430                 } else {
 431                         /* Read 4 bytes */
 432                         *(buf) = __le32_to_cpu(readl(ptr));
 433                         i += 4;
 434                 }
 435                 buf++;
 436                 ptr++;
 437         }
 438 out:
 439         return;
 440 }
 441 
 442 /*
 443  * TODO:
 444  * -Optimize
 445  * -Rewrite cleaner
 446  */
 447 static u32 write_mem32(void __iomem *mem_addr_start, const u32 *buf,
 448                         u32 size_bytes)
 449 {
 450         u32 i = 0;
 451         u32 __iomem *ptr = mem_addr_start;
 452         const u16 *buf16;
 453 
 454         if (unlikely(!ptr || !buf))
 455                 return 0;
 456 
 457         /* shortcut for extremely often used cases */
 458         switch (size_bytes) {
 459         case 2: /* 2 bytes */
 460                 buf16 = (const u16 *)buf;
 461                 writew(__cpu_to_le16(*buf16), ptr);
 462                 return 2;
 463                 break;
 464         case 1: /*
 465                  * also needs to write 4 bytes in this case
 466                  * so falling through..
 467                  */
 468         case 4: /* 4 bytes */
 469                 writel(__cpu_to_le32(*buf), ptr);
 470                 return 4;
 471                 break;
 472         }
 473 
 474         while (i < size_bytes) {
 475                 if (size_bytes - i == 2) {
 476                         /* 2 bytes */
 477                         buf16 = (const u16 *)buf;
 478                         writew(__cpu_to_le16(*buf16), ptr);
 479                         i += 2;
 480                 } else {
 481                         /* 4 bytes */
 482                         writel(__cpu_to_le32(*buf), ptr);
 483                         i += 4;
 484                 }
 485                 buf++;
 486                 ptr++;
 487         }
 488         return i;
 489 }
 490 
 491 /* Setup pointers to different channels and also setup buffer sizes. */
 492 static void nozomi_setup_memory(struct nozomi *dc)
 493 {
 494         void __iomem *offset = dc->base_addr + dc->config_table.dl_start;
 495         /* The length reported is including the length field of 4 bytes,
 496          * hence subtract with 4.
 497          */
 498         const u16 buff_offset = 4;
 499 
 500         /* Modem port dl configuration */
 501         dc->port[PORT_MDM].dl_addr[CH_A] = offset;
 502         dc->port[PORT_MDM].dl_addr[CH_B] =
 503                                 (offset += dc->config_table.dl_mdm_len1);
 504         dc->port[PORT_MDM].dl_size[CH_A] =
 505                                 dc->config_table.dl_mdm_len1 - buff_offset;
 506         dc->port[PORT_MDM].dl_size[CH_B] =
 507                                 dc->config_table.dl_mdm_len2 - buff_offset;
 508 
 509         /* Diag port dl configuration */
 510         dc->port[PORT_DIAG].dl_addr[CH_A] =
 511                                 (offset += dc->config_table.dl_mdm_len2);
 512         dc->port[PORT_DIAG].dl_size[CH_A] =
 513                                 dc->config_table.dl_diag_len1 - buff_offset;
 514         dc->port[PORT_DIAG].dl_addr[CH_B] =
 515                                 (offset += dc->config_table.dl_diag_len1);
 516         dc->port[PORT_DIAG].dl_size[CH_B] =
 517                                 dc->config_table.dl_diag_len2 - buff_offset;
 518 
 519         /* App1 port dl configuration */
 520         dc->port[PORT_APP1].dl_addr[CH_A] =
 521                                 (offset += dc->config_table.dl_diag_len2);
 522         dc->port[PORT_APP1].dl_size[CH_A] =
 523                                 dc->config_table.dl_app1_len - buff_offset;
 524 
 525         /* App2 port dl configuration */
 526         dc->port[PORT_APP2].dl_addr[CH_A] =
 527                                 (offset += dc->config_table.dl_app1_len);
 528         dc->port[PORT_APP2].dl_size[CH_A] =
 529                                 dc->config_table.dl_app2_len - buff_offset;
 530 
 531         /* Ctrl dl configuration */
 532         dc->port[PORT_CTRL].dl_addr[CH_A] =
 533                                 (offset += dc->config_table.dl_app2_len);
 534         dc->port[PORT_CTRL].dl_size[CH_A] =
 535                                 dc->config_table.dl_ctrl_len - buff_offset;
 536 
 537         offset = dc->base_addr + dc->config_table.ul_start;
 538 
 539         /* Modem Port ul configuration */
 540         dc->port[PORT_MDM].ul_addr[CH_A] = offset;
 541         dc->port[PORT_MDM].ul_size[CH_A] =
 542                                 dc->config_table.ul_mdm_len1 - buff_offset;
 543         dc->port[PORT_MDM].ul_addr[CH_B] =
 544                                 (offset += dc->config_table.ul_mdm_len1);
 545         dc->port[PORT_MDM].ul_size[CH_B] =
 546                                 dc->config_table.ul_mdm_len2 - buff_offset;
 547 
 548         /* Diag port ul configuration */
 549         dc->port[PORT_DIAG].ul_addr[CH_A] =
 550                                 (offset += dc->config_table.ul_mdm_len2);
 551         dc->port[PORT_DIAG].ul_size[CH_A] =
 552                                 dc->config_table.ul_diag_len - buff_offset;
 553 
 554         /* App1 port ul configuration */
 555         dc->port[PORT_APP1].ul_addr[CH_A] =
 556                                 (offset += dc->config_table.ul_diag_len);
 557         dc->port[PORT_APP1].ul_size[CH_A] =
 558                                 dc->config_table.ul_app1_len - buff_offset;
 559 
 560         /* App2 port ul configuration */
 561         dc->port[PORT_APP2].ul_addr[CH_A] =
 562                                 (offset += dc->config_table.ul_app1_len);
 563         dc->port[PORT_APP2].ul_size[CH_A] =
 564                                 dc->config_table.ul_app2_len - buff_offset;
 565 
 566         /* Ctrl ul configuration */
 567         dc->port[PORT_CTRL].ul_addr[CH_A] =
 568                                 (offset += dc->config_table.ul_app2_len);
 569         dc->port[PORT_CTRL].ul_size[CH_A] =
 570                                 dc->config_table.ul_ctrl_len - buff_offset;
 571 }
 572 
 573 /* Dump config table under initalization phase */
 574 #ifdef DEBUG
 575 static void dump_table(const struct nozomi *dc)
 576 {
 577         DBG3("signature: 0x%08X", dc->config_table.signature);
 578         DBG3("version: 0x%04X", dc->config_table.version);
 579         DBG3("product_information: 0x%04X", \
 580                                 dc->config_table.product_information);
 581         DBG3("toggle enabled: %d", dc->config_table.toggle.enabled);
 582         DBG3("toggle up_mdm: %d", dc->config_table.toggle.mdm_ul);
 583         DBG3("toggle dl_mdm: %d", dc->config_table.toggle.mdm_dl);
 584         DBG3("toggle dl_dbg: %d", dc->config_table.toggle.diag_dl);
 585 
 586         DBG3("dl_start: 0x%04X", dc->config_table.dl_start);
 587         DBG3("dl_mdm_len0: 0x%04X, %d", dc->config_table.dl_mdm_len1,
 588            dc->config_table.dl_mdm_len1);
 589         DBG3("dl_mdm_len1: 0x%04X, %d", dc->config_table.dl_mdm_len2,
 590            dc->config_table.dl_mdm_len2);
 591         DBG3("dl_diag_len0: 0x%04X, %d", dc->config_table.dl_diag_len1,
 592            dc->config_table.dl_diag_len1);
 593         DBG3("dl_diag_len1: 0x%04X, %d", dc->config_table.dl_diag_len2,
 594            dc->config_table.dl_diag_len2);
 595         DBG3("dl_app1_len: 0x%04X, %d", dc->config_table.dl_app1_len,
 596            dc->config_table.dl_app1_len);
 597         DBG3("dl_app2_len: 0x%04X, %d", dc->config_table.dl_app2_len,
 598            dc->config_table.dl_app2_len);
 599         DBG3("dl_ctrl_len: 0x%04X, %d", dc->config_table.dl_ctrl_len,
 600            dc->config_table.dl_ctrl_len);
 601         DBG3("ul_start: 0x%04X, %d", dc->config_table.ul_start,
 602            dc->config_table.ul_start);
 603         DBG3("ul_mdm_len[0]: 0x%04X, %d", dc->config_table.ul_mdm_len1,
 604            dc->config_table.ul_mdm_len1);
 605         DBG3("ul_mdm_len[1]: 0x%04X, %d", dc->config_table.ul_mdm_len2,
 606            dc->config_table.ul_mdm_len2);
 607         DBG3("ul_diag_len: 0x%04X, %d", dc->config_table.ul_diag_len,
 608            dc->config_table.ul_diag_len);
 609         DBG3("ul_app1_len: 0x%04X, %d", dc->config_table.ul_app1_len,
 610            dc->config_table.ul_app1_len);
 611         DBG3("ul_app2_len: 0x%04X, %d", dc->config_table.ul_app2_len,
 612            dc->config_table.ul_app2_len);
 613         DBG3("ul_ctrl_len: 0x%04X, %d", dc->config_table.ul_ctrl_len,
 614            dc->config_table.ul_ctrl_len);
 615 }
 616 #else
 617 static inline void dump_table(const struct nozomi *dc) { }
 618 #endif
 619 
 620 /*
 621  * Read configuration table from card under intalization phase
 622  * Returns 1 if ok, else 0
 623  */
 624 static int nozomi_read_config_table(struct nozomi *dc)
 625 {
 626         read_mem32((u32 *) &dc->config_table, dc->base_addr + 0,
 627                                                 sizeof(struct config_table));
 628 
 629         if (dc->config_table.signature != NOZOMI_CONFIG_MAGIC) {
 630                 dev_err(&dc->pdev->dev, "ConfigTable Bad! 0x%08X != 0x%08X\n",
 631                         dc->config_table.signature, NOZOMI_CONFIG_MAGIC);
 632                 return 0;
 633         }
 634 
 635         if ((dc->config_table.version == 0)
 636             || (dc->config_table.toggle.enabled == TOGGLE_VALID)) {
 637                 int i;
 638                 DBG1("Second phase, configuring card");
 639 
 640                 nozomi_setup_memory(dc);
 641 
 642                 dc->port[PORT_MDM].toggle_ul = dc->config_table.toggle.mdm_ul;
 643                 dc->port[PORT_MDM].toggle_dl = dc->config_table.toggle.mdm_dl;
 644                 dc->port[PORT_DIAG].toggle_dl = dc->config_table.toggle.diag_dl;
 645                 DBG1("toggle ports: MDM UL:%d MDM DL:%d, DIAG DL:%d",
 646                    dc->port[PORT_MDM].toggle_ul,
 647                    dc->port[PORT_MDM].toggle_dl, dc->port[PORT_DIAG].toggle_dl);
 648 
 649                 dump_table(dc);
 650 
 651                 for (i = PORT_MDM; i < MAX_PORT; i++) {
 652                         memset(&dc->port[i].ctrl_dl, 0, sizeof(struct ctrl_dl));
 653                         memset(&dc->port[i].ctrl_ul, 0, sizeof(struct ctrl_ul));
 654                 }
 655 
 656                 /* Enable control channel */
 657                 dc->last_ier = dc->last_ier | CTRL_DL;
 658                 writew(dc->last_ier, dc->reg_ier);
 659 
 660                 dc->state = NOZOMI_STATE_ALLOCATED;
 661                 dev_info(&dc->pdev->dev, "Initialization OK!\n");
 662                 return 1;
 663         }
 664 
 665         if ((dc->config_table.version > 0)
 666             && (dc->config_table.toggle.enabled != TOGGLE_VALID)) {
 667                 u32 offset = 0;
 668                 DBG1("First phase: pushing upload buffers, clearing download");
 669 
 670                 dev_info(&dc->pdev->dev, "Version of card: %d\n",
 671                          dc->config_table.version);
 672 
 673                 /* Here we should disable all I/O over F32. */
 674                 nozomi_setup_memory(dc);
 675 
 676                 /*
 677                  * We should send ALL channel pair tokens back along
 678                  * with reset token
 679                  */
 680 
 681                 /* push upload modem buffers */
 682                 write_mem32(dc->port[PORT_MDM].ul_addr[CH_A],
 683                         (u32 *) &offset, 4);
 684                 write_mem32(dc->port[PORT_MDM].ul_addr[CH_B],
 685                         (u32 *) &offset, 4);
 686 
 687                 writew(MDM_UL | DIAG_DL | MDM_DL, dc->reg_fcr);
 688 
 689                 DBG1("First phase done");
 690         }
 691 
 692         return 1;
 693 }
 694 
 695 /* Enable uplink interrupts  */
 696 static void enable_transmit_ul(enum port_type port, struct nozomi *dc)
 697 {
 698         static const u16 mask[] = {MDM_UL, DIAG_UL, APP1_UL, APP2_UL, CTRL_UL};
 699 
 700         if (port < NOZOMI_MAX_PORTS) {
 701                 dc->last_ier |= mask[port];
 702                 writew(dc->last_ier, dc->reg_ier);
 703         } else {
 704                 dev_err(&dc->pdev->dev, "Called with wrong port?\n");
 705         }
 706 }
 707 
 708 /* Disable uplink interrupts  */
 709 static void disable_transmit_ul(enum port_type port, struct nozomi *dc)
 710 {
 711         static const u16 mask[] =
 712                 {~MDM_UL, ~DIAG_UL, ~APP1_UL, ~APP2_UL, ~CTRL_UL};
 713 
 714         if (port < NOZOMI_MAX_PORTS) {
 715                 dc->last_ier &= mask[port];
 716                 writew(dc->last_ier, dc->reg_ier);
 717         } else {
 718                 dev_err(&dc->pdev->dev, "Called with wrong port?\n");
 719         }
 720 }
 721 
 722 /* Enable downlink interrupts */
 723 static void enable_transmit_dl(enum port_type port, struct nozomi *dc)
 724 {
 725         static const u16 mask[] = {MDM_DL, DIAG_DL, APP1_DL, APP2_DL, CTRL_DL};
 726 
 727         if (port < NOZOMI_MAX_PORTS) {
 728                 dc->last_ier |= mask[port];
 729                 writew(dc->last_ier, dc->reg_ier);
 730         } else {
 731                 dev_err(&dc->pdev->dev, "Called with wrong port?\n");
 732         }
 733 }
 734 
 735 /* Disable downlink interrupts */
 736 static void disable_transmit_dl(enum port_type port, struct nozomi *dc)
 737 {
 738         static const u16 mask[] =
 739                 {~MDM_DL, ~DIAG_DL, ~APP1_DL, ~APP2_DL, ~CTRL_DL};
 740 
 741         if (port < NOZOMI_MAX_PORTS) {
 742                 dc->last_ier &= mask[port];
 743                 writew(dc->last_ier, dc->reg_ier);
 744         } else {
 745                 dev_err(&dc->pdev->dev, "Called with wrong port?\n");
 746         }
 747 }
 748 
 749 /*
 750  * Return 1 - send buffer to card and ack.
 751  * Return 0 - don't ack, don't send buffer to card.
 752  */
 753 static int send_data(enum port_type index, struct nozomi *dc)
 754 {
 755         u32 size = 0;
 756         struct port *port = &dc->port[index];
 757         const u8 toggle = port->toggle_ul;
 758         void __iomem *addr = port->ul_addr[toggle];
 759         const u32 ul_size = port->ul_size[toggle];
 760 
 761         /* Get data from tty and place in buf for now */
 762         size = kfifo_out(&port->fifo_ul, dc->send_buf,
 763                            ul_size < SEND_BUF_MAX ? ul_size : SEND_BUF_MAX);
 764 
 765         if (size == 0) {
 766                 DBG4("No more data to send, disable link:");
 767                 return 0;
 768         }
 769 
 770         /* DUMP(buf, size); */
 771 
 772         /* Write length + data */
 773         write_mem32(addr, (u32 *) &size, 4);
 774         write_mem32(addr + 4, (u32 *) dc->send_buf, size);
 775 
 776         tty_port_tty_wakeup(&port->port);
 777 
 778         return 1;
 779 }
 780 
 781 /* If all data has been read, return 1, else 0 */
 782 static int receive_data(enum port_type index, struct nozomi *dc)
 783 {
 784         u8 buf[RECEIVE_BUF_MAX] = { 0 };
 785         int size;
 786         u32 offset = 4;
 787         struct port *port = &dc->port[index];
 788         void __iomem *addr = port->dl_addr[port->toggle_dl];
 789         struct tty_struct *tty = tty_port_tty_get(&port->port);
 790         int i, ret;
 791 
 792         size = __le32_to_cpu(readl(addr));
 793         /*  DBG1( "%d bytes port: %d", size, index); */
 794 
 795         if (tty && tty_throttled(tty)) {
 796                 DBG1("No room in tty, don't read data, don't ack interrupt, "
 797                         "disable interrupt");
 798 
 799                 /* disable interrupt in downlink... */
 800                 disable_transmit_dl(index, dc);
 801                 ret = 0;
 802                 goto put;
 803         }
 804 
 805         if (unlikely(size == 0)) {
 806                 dev_err(&dc->pdev->dev, "size == 0?\n");
 807                 ret = 1;
 808                 goto put;
 809         }
 810 
 811         while (size > 0) {
 812                 read_mem32((u32 *) buf, addr + offset, RECEIVE_BUF_MAX);
 813 
 814                 if (size == 1) {
 815                         tty_insert_flip_char(&port->port, buf[0], TTY_NORMAL);
 816                         size = 0;
 817                 } else if (size < RECEIVE_BUF_MAX) {
 818                         size -= tty_insert_flip_string(&port->port,
 819                                         (char *)buf, size);
 820                 } else {
 821                         i = tty_insert_flip_string(&port->port,
 822                                         (char *)buf, RECEIVE_BUF_MAX);
 823                         size -= i;
 824                         offset += i;
 825                 }
 826         }
 827 
 828         set_bit(index, &dc->flip);
 829         ret = 1;
 830 put:
 831         tty_kref_put(tty);
 832         return ret;
 833 }
 834 
 835 /* Debug for interrupts */
 836 #ifdef DEBUG
 837 static char *interrupt2str(u16 interrupt)
 838 {
 839         static char buf[TMP_BUF_MAX];
 840         char *p = buf;
 841 
 842         interrupt & MDM_DL1 ? p += snprintf(p, TMP_BUF_MAX, "MDM_DL1 ") : NULL;
 843         interrupt & MDM_DL2 ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 844                                         "MDM_DL2 ") : NULL;
 845 
 846         interrupt & MDM_UL1 ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 847                                         "MDM_UL1 ") : NULL;
 848         interrupt & MDM_UL2 ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 849                                         "MDM_UL2 ") : NULL;
 850 
 851         interrupt & DIAG_DL1 ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 852                                         "DIAG_DL1 ") : NULL;
 853         interrupt & DIAG_DL2 ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 854                                         "DIAG_DL2 ") : NULL;
 855 
 856         interrupt & DIAG_UL ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 857                                         "DIAG_UL ") : NULL;
 858 
 859         interrupt & APP1_DL ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 860                                         "APP1_DL ") : NULL;
 861         interrupt & APP2_DL ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 862                                         "APP2_DL ") : NULL;
 863 
 864         interrupt & APP1_UL ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 865                                         "APP1_UL ") : NULL;
 866         interrupt & APP2_UL ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 867                                         "APP2_UL ") : NULL;
 868 
 869         interrupt & CTRL_DL ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 870                                         "CTRL_DL ") : NULL;
 871         interrupt & CTRL_UL ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 872                                         "CTRL_UL ") : NULL;
 873 
 874         interrupt & RESET ? p += snprintf(p, TMP_BUF_MAX - (p - buf),
 875                                         "RESET ") : NULL;
 876 
 877         return buf;
 878 }
 879 #endif
 880 
 881 /*
 882  * Receive flow control
 883  * Return 1 - If ok, else 0
 884  */
 885 static int receive_flow_control(struct nozomi *dc)
 886 {
 887         enum port_type port = PORT_MDM;
 888         struct ctrl_dl ctrl_dl;
 889         struct ctrl_dl old_ctrl;
 890         u16 enable_ier = 0;
 891 
 892         read_mem32((u32 *) &ctrl_dl, dc->port[PORT_CTRL].dl_addr[CH_A], 2);
 893 
 894         switch (ctrl_dl.port) {
 895         case CTRL_CMD:
 896                 DBG1("The Base Band sends this value as a response to a "
 897                         "request for IMSI detach sent over the control "
 898                         "channel uplink (see section 7.6.1).");
 899                 break;
 900         case CTRL_MDM:
 901                 port = PORT_MDM;
 902                 enable_ier = MDM_DL;
 903                 break;
 904         case CTRL_DIAG:
 905                 port = PORT_DIAG;
 906                 enable_ier = DIAG_DL;
 907                 break;
 908         case CTRL_APP1:
 909                 port = PORT_APP1;
 910                 enable_ier = APP1_DL;
 911                 break;
 912         case CTRL_APP2:
 913                 port = PORT_APP2;
 914                 enable_ier = APP2_DL;
 915                 if (dc->state == NOZOMI_STATE_ALLOCATED) {
 916                         /*
 917                          * After card initialization the flow control
 918                          * received for APP2 is always the last
 919                          */
 920                         dc->state = NOZOMI_STATE_READY;
 921                         dev_info(&dc->pdev->dev, "Device READY!\n");
 922                 }
 923                 break;
 924         default:
 925                 dev_err(&dc->pdev->dev,
 926                         "ERROR: flow control received for non-existing port\n");
 927                 return 0;
 928         }
 929 
 930         DBG1("0x%04X->0x%04X", *((u16 *)&dc->port[port].ctrl_dl),
 931            *((u16 *)&ctrl_dl));
 932 
 933         old_ctrl = dc->port[port].ctrl_dl;
 934         dc->port[port].ctrl_dl = ctrl_dl;
 935 
 936         if (old_ctrl.CTS == 1 && ctrl_dl.CTS == 0) {
 937                 DBG1("Disable interrupt (0x%04X) on port: %d",
 938                         enable_ier, port);
 939                 disable_transmit_ul(port, dc);
 940 
 941         } else if (old_ctrl.CTS == 0 && ctrl_dl.CTS == 1) {
 942 
 943                 if (kfifo_len(&dc->port[port].fifo_ul)) {
 944                         DBG1("Enable interrupt (0x%04X) on port: %d",
 945                                 enable_ier, port);
 946                         DBG1("Data in buffer [%d], enable transmit! ",
 947                                 kfifo_len(&dc->port[port].fifo_ul));
 948                         enable_transmit_ul(port, dc);
 949                 } else {
 950                         DBG1("No data in buffer...");
 951                 }
 952         }
 953 
 954         if (*(u16 *)&old_ctrl == *(u16 *)&ctrl_dl) {
 955                 DBG1(" No change in mctrl");
 956                 return 1;
 957         }
 958         /* Update statistics */
 959         if (old_ctrl.CTS != ctrl_dl.CTS)
 960                 dc->port[port].tty_icount.cts++;
 961         if (old_ctrl.DSR != ctrl_dl.DSR)
 962                 dc->port[port].tty_icount.dsr++;
 963         if (old_ctrl.RI != ctrl_dl.RI)
 964                 dc->port[port].tty_icount.rng++;
 965         if (old_ctrl.DCD != ctrl_dl.DCD)
 966                 dc->port[port].tty_icount.dcd++;
 967 
 968         wake_up_interruptible(&dc->port[port].tty_wait);
 969 
 970         DBG1("port: %d DCD(%d), CTS(%d), RI(%d), DSR(%d)",
 971            port,
 972            dc->port[port].tty_icount.dcd, dc->port[port].tty_icount.cts,
 973            dc->port[port].tty_icount.rng, dc->port[port].tty_icount.dsr);
 974 
 975         return 1;
 976 }
 977 
 978 static enum ctrl_port_type port2ctrl(enum port_type port,
 979                                         const struct nozomi *dc)
 980 {
 981         switch (port) {
 982         case PORT_MDM:
 983                 return CTRL_MDM;
 984         case PORT_DIAG:
 985                 return CTRL_DIAG;
 986         case PORT_APP1:
 987                 return CTRL_APP1;
 988         case PORT_APP2:
 989                 return CTRL_APP2;
 990         default:
 991                 dev_err(&dc->pdev->dev,
 992                         "ERROR: send flow control " \
 993                         "received for non-existing port\n");
 994         }
 995         return CTRL_ERROR;
 996 }
 997 
 998 /*
 999  * Send flow control, can only update one channel at a time
1000  * Return 0 - If we have updated all flow control
1001  * Return 1 - If we need to update more flow control, ack current enable more
1002  */
1003 static int send_flow_control(struct nozomi *dc)
1004 {
1005         u32 i, more_flow_control_to_be_updated = 0;
1006         u16 *ctrl;
1007 
1008         for (i = PORT_MDM; i < MAX_PORT; i++) {
1009                 if (dc->port[i].update_flow_control) {
1010                         if (more_flow_control_to_be_updated) {
1011                                 /* We have more flow control to be updated */
1012                                 return 1;
1013                         }
1014                         dc->port[i].ctrl_ul.port = port2ctrl(i, dc);
1015                         ctrl = (u16 *)&dc->port[i].ctrl_ul;
1016                         write_mem32(dc->port[PORT_CTRL].ul_addr[0], \
1017                                 (u32 *) ctrl, 2);
1018                         dc->port[i].update_flow_control = 0;
1019                         more_flow_control_to_be_updated = 1;
1020                 }
1021         }
1022         return 0;
1023 }
1024 
1025 /*
1026  * Handle downlink data, ports that are handled are modem and diagnostics
1027  * Return 1 - ok
1028  * Return 0 - toggle fields are out of sync
1029  */
1030 static int handle_data_dl(struct nozomi *dc, enum port_type port, u8 *toggle,
1031                         u16 read_iir, u16 mask1, u16 mask2)
1032 {
1033         if (*toggle == 0 && read_iir & mask1) {
1034                 if (receive_data(port, dc)) {
1035                         writew(mask1, dc->reg_fcr);
1036                         *toggle = !(*toggle);
1037                 }
1038 
1039                 if (read_iir & mask2) {
1040                         if (receive_data(port, dc)) {
1041                                 writew(mask2, dc->reg_fcr);
1042                                 *toggle = !(*toggle);
1043                         }
1044                 }
1045         } else if (*toggle == 1 && read_iir & mask2) {
1046                 if (receive_data(port, dc)) {
1047                         writew(mask2, dc->reg_fcr);
1048                         *toggle = !(*toggle);
1049                 }
1050 
1051                 if (read_iir & mask1) {
1052                         if (receive_data(port, dc)) {
1053                                 writew(mask1, dc->reg_fcr);
1054                                 *toggle = !(*toggle);
1055                         }
1056                 }
1057         } else {
1058                 dev_err(&dc->pdev->dev, "port out of sync!, toggle:%d\n",
1059                         *toggle);
1060                 return 0;
1061         }
1062         return 1;
1063 }
1064 
1065 /*
1066  * Handle uplink data, this is currently for the modem port
1067  * Return 1 - ok
1068  * Return 0 - toggle field are out of sync
1069  */
1070 static int handle_data_ul(struct nozomi *dc, enum port_type port, u16 read_iir)
1071 {
1072         u8 *toggle = &(dc->port[port].toggle_ul);
1073 
1074         if (*toggle == 0 && read_iir & MDM_UL1) {
1075                 dc->last_ier &= ~MDM_UL;
1076                 writew(dc->last_ier, dc->reg_ier);
1077                 if (send_data(port, dc)) {
1078                         writew(MDM_UL1, dc->reg_fcr);
1079                         dc->last_ier = dc->last_ier | MDM_UL;
1080                         writew(dc->last_ier, dc->reg_ier);
1081                         *toggle = !*toggle;
1082                 }
1083 
1084                 if (read_iir & MDM_UL2) {
1085                         dc->last_ier &= ~MDM_UL;
1086                         writew(dc->last_ier, dc->reg_ier);
1087                         if (send_data(port, dc)) {
1088                                 writew(MDM_UL2, dc->reg_fcr);
1089                                 dc->last_ier = dc->last_ier | MDM_UL;
1090                                 writew(dc->last_ier, dc->reg_ier);
1091                                 *toggle = !*toggle;
1092                         }
1093                 }
1094 
1095         } else if (*toggle == 1 && read_iir & MDM_UL2) {
1096                 dc->last_ier &= ~MDM_UL;
1097                 writew(dc->last_ier, dc->reg_ier);
1098                 if (send_data(port, dc)) {
1099                         writew(MDM_UL2, dc->reg_fcr);
1100                         dc->last_ier = dc->last_ier | MDM_UL;
1101                         writew(dc->last_ier, dc->reg_ier);
1102                         *toggle = !*toggle;
1103                 }
1104 
1105                 if (read_iir & MDM_UL1) {
1106                         dc->last_ier &= ~MDM_UL;
1107                         writew(dc->last_ier, dc->reg_ier);
1108                         if (send_data(port, dc)) {
1109                                 writew(MDM_UL1, dc->reg_fcr);
1110                                 dc->last_ier = dc->last_ier | MDM_UL;
1111                                 writew(dc->last_ier, dc->reg_ier);
1112                                 *toggle = !*toggle;
1113                         }
1114                 }
1115         } else {
1116                 writew(read_iir & MDM_UL, dc->reg_fcr);
1117                 dev_err(&dc->pdev->dev, "port out of sync!\n");
1118                 return 0;
1119         }
1120         return 1;
1121 }
1122 
1123 static irqreturn_t interrupt_handler(int irq, void *dev_id)
1124 {
1125         struct nozomi *dc = dev_id;
1126         unsigned int a;
1127         u16 read_iir;
1128 
1129         if (!dc)
1130                 return IRQ_NONE;
1131 
1132         spin_lock(&dc->spin_mutex);
1133         read_iir = readw(dc->reg_iir);
1134 
1135         /* Card removed */
1136         if (read_iir == (u16)-1)
1137                 goto none;
1138         /*
1139          * Just handle interrupt enabled in IER
1140          * (by masking with dc->last_ier)
1141          */
1142         read_iir &= dc->last_ier;
1143 
1144         if (read_iir == 0)
1145                 goto none;
1146 
1147 
1148         DBG4("%s irq:0x%04X, prev:0x%04X", interrupt2str(read_iir), read_iir,
1149                 dc->last_ier);
1150 
1151         if (read_iir & RESET) {
1152                 if (unlikely(!nozomi_read_config_table(dc))) {
1153                         dc->last_ier = 0x0;
1154                         writew(dc->last_ier, dc->reg_ier);
1155                         dev_err(&dc->pdev->dev, "Could not read status from "
1156                                 "card, we should disable interface\n");
1157                 } else {
1158                         writew(RESET, dc->reg_fcr);
1159                 }
1160                 /* No more useful info if this was the reset interrupt. */
1161                 goto exit_handler;
1162         }
1163         if (read_iir & CTRL_UL) {
1164                 DBG1("CTRL_UL");
1165                 dc->last_ier &= ~CTRL_UL;
1166                 writew(dc->last_ier, dc->reg_ier);
1167                 if (send_flow_control(dc)) {
1168                         writew(CTRL_UL, dc->reg_fcr);
1169                         dc->last_ier = dc->last_ier | CTRL_UL;
1170                         writew(dc->last_ier, dc->reg_ier);
1171                 }
1172         }
1173         if (read_iir & CTRL_DL) {
1174                 receive_flow_control(dc);
1175                 writew(CTRL_DL, dc->reg_fcr);
1176         }
1177         if (read_iir & MDM_DL) {
1178                 if (!handle_data_dl(dc, PORT_MDM,
1179                                 &(dc->port[PORT_MDM].toggle_dl), read_iir,
1180                                 MDM_DL1, MDM_DL2)) {
1181                         dev_err(&dc->pdev->dev, "MDM_DL out of sync!\n");
1182                         goto exit_handler;
1183                 }
1184         }
1185         if (read_iir & MDM_UL) {
1186                 if (!handle_data_ul(dc, PORT_MDM, read_iir)) {
1187                         dev_err(&dc->pdev->dev, "MDM_UL out of sync!\n");
1188                         goto exit_handler;
1189                 }
1190         }
1191         if (read_iir & DIAG_DL) {
1192                 if (!handle_data_dl(dc, PORT_DIAG,
1193                                 &(dc->port[PORT_DIAG].toggle_dl), read_iir,
1194                                 DIAG_DL1, DIAG_DL2)) {
1195                         dev_err(&dc->pdev->dev, "DIAG_DL out of sync!\n");
1196                         goto exit_handler;
1197                 }
1198         }
1199         if (read_iir & DIAG_UL) {
1200                 dc->last_ier &= ~DIAG_UL;
1201                 writew(dc->last_ier, dc->reg_ier);
1202                 if (send_data(PORT_DIAG, dc)) {
1203                         writew(DIAG_UL, dc->reg_fcr);
1204                         dc->last_ier = dc->last_ier | DIAG_UL;
1205                         writew(dc->last_ier, dc->reg_ier);
1206                 }
1207         }
1208         if (read_iir & APP1_DL) {
1209                 if (receive_data(PORT_APP1, dc))
1210                         writew(APP1_DL, dc->reg_fcr);
1211         }
1212         if (read_iir & APP1_UL) {
1213                 dc->last_ier &= ~APP1_UL;
1214                 writew(dc->last_ier, dc->reg_ier);
1215                 if (send_data(PORT_APP1, dc)) {
1216                         writew(APP1_UL, dc->reg_fcr);
1217                         dc->last_ier = dc->last_ier | APP1_UL;
1218                         writew(dc->last_ier, dc->reg_ier);
1219                 }
1220         }
1221         if (read_iir & APP2_DL) {
1222                 if (receive_data(PORT_APP2, dc))
1223                         writew(APP2_DL, dc->reg_fcr);
1224         }
1225         if (read_iir & APP2_UL) {
1226                 dc->last_ier &= ~APP2_UL;
1227                 writew(dc->last_ier, dc->reg_ier);
1228                 if (send_data(PORT_APP2, dc)) {
1229                         writew(APP2_UL, dc->reg_fcr);
1230                         dc->last_ier = dc->last_ier | APP2_UL;
1231                         writew(dc->last_ier, dc->reg_ier);
1232                 }
1233         }
1234 
1235 exit_handler:
1236         spin_unlock(&dc->spin_mutex);
1237 
1238         for (a = 0; a < NOZOMI_MAX_PORTS; a++)
1239                 if (test_and_clear_bit(a, &dc->flip))
1240                         tty_flip_buffer_push(&dc->port[a].port);
1241 
1242         return IRQ_HANDLED;
1243 none:
1244         spin_unlock(&dc->spin_mutex);
1245         return IRQ_NONE;
1246 }
1247 
1248 static void nozomi_get_card_type(struct nozomi *dc)
1249 {
1250         int i;
1251         u32 size = 0;
1252 
1253         for (i = 0; i < 6; i++)
1254                 size += pci_resource_len(dc->pdev, i);
1255 
1256         /* Assume card type F32_8 if no match */
1257         dc->card_type = size == 2048 ? F32_2 : F32_8;
1258 
1259         dev_info(&dc->pdev->dev, "Card type is: %d\n", dc->card_type);
1260 }
1261 
1262 static void nozomi_setup_private_data(struct nozomi *dc)
1263 {
1264         void __iomem *offset = dc->base_addr + dc->card_type / 2;
1265         unsigned int i;
1266 
1267         dc->reg_fcr = (void __iomem *)(offset + R_FCR);
1268         dc->reg_iir = (void __iomem *)(offset + R_IIR);
1269         dc->reg_ier = (void __iomem *)(offset + R_IER);
1270         dc->last_ier = 0;
1271         dc->flip = 0;
1272 
1273         dc->port[PORT_MDM].token_dl = MDM_DL;
1274         dc->port[PORT_DIAG].token_dl = DIAG_DL;
1275         dc->port[PORT_APP1].token_dl = APP1_DL;
1276         dc->port[PORT_APP2].token_dl = APP2_DL;
1277 
1278         for (i = 0; i < MAX_PORT; i++)
1279                 init_waitqueue_head(&dc->port[i].tty_wait);
1280 }
1281 
1282 static ssize_t card_type_show(struct device *dev, struct device_attribute *attr,
1283                           char *buf)
1284 {
1285         const struct nozomi *dc = dev_get_drvdata(dev);
1286 
1287         return sprintf(buf, "%d\n", dc->card_type);
1288 }
1289 static DEVICE_ATTR_RO(card_type);
1290 
1291 static ssize_t open_ttys_show(struct device *dev, struct device_attribute *attr,
1292                           char *buf)
1293 {
1294         const struct nozomi *dc = dev_get_drvdata(dev);
1295 
1296         return sprintf(buf, "%u\n", dc->open_ttys);
1297 }
1298 static DEVICE_ATTR_RO(open_ttys);
1299 
1300 static void make_sysfs_files(struct nozomi *dc)
1301 {
1302         if (device_create_file(&dc->pdev->dev, &dev_attr_card_type))
1303                 dev_err(&dc->pdev->dev,
1304                         "Could not create sysfs file for card_type\n");
1305         if (device_create_file(&dc->pdev->dev, &dev_attr_open_ttys))
1306                 dev_err(&dc->pdev->dev,
1307                         "Could not create sysfs file for open_ttys\n");
1308 }
1309 
1310 static void remove_sysfs_files(struct nozomi *dc)
1311 {
1312         device_remove_file(&dc->pdev->dev, &dev_attr_card_type);
1313         device_remove_file(&dc->pdev->dev, &dev_attr_open_ttys);
1314 }
1315 
1316 /* Allocate memory for one device */
1317 static int nozomi_card_init(struct pci_dev *pdev,
1318                                       const struct pci_device_id *ent)
1319 {
1320         int ret;
1321         struct nozomi *dc = NULL;
1322         int ndev_idx;
1323         int i;
1324 
1325         dev_dbg(&pdev->dev, "Init, new card found\n");
1326 
1327         for (ndev_idx = 0; ndev_idx < ARRAY_SIZE(ndevs); ndev_idx++)
1328                 if (!ndevs[ndev_idx])
1329                         break;
1330 
1331         if (ndev_idx >= ARRAY_SIZE(ndevs)) {
1332                 dev_err(&pdev->dev, "no free tty range for this card left\n");
1333                 ret = -EIO;
1334                 goto err;
1335         }
1336 
1337         dc = kzalloc(sizeof(struct nozomi), GFP_KERNEL);
1338         if (unlikely(!dc)) {
1339                 dev_err(&pdev->dev, "Could not allocate memory\n");
1340                 ret = -ENOMEM;
1341                 goto err_free;
1342         }
1343 
1344         dc->pdev = pdev;
1345 
1346         ret = pci_enable_device(dc->pdev);
1347         if (ret) {
1348                 dev_err(&pdev->dev, "Failed to enable PCI Device\n");
1349                 goto err_free;
1350         }
1351 
1352         ret = pci_request_regions(dc->pdev, NOZOMI_NAME);
1353         if (ret) {
1354                 dev_err(&pdev->dev, "I/O address 0x%04x already in use\n",
1355                         (int) /* nozomi_private.io_addr */ 0);
1356                 goto err_disable_device;
1357         }
1358 
1359         /* Find out what card type it is */
1360         nozomi_get_card_type(dc);
1361 
1362         dc->base_addr = pci_iomap(dc->pdev, 0, dc->card_type);
1363         if (!dc->base_addr) {
1364                 dev_err(&pdev->dev, "Unable to map card MMIO\n");
1365                 ret = -ENODEV;
1366                 goto err_rel_regs;
1367         }
1368 
1369         dc->send_buf = kmalloc(SEND_BUF_MAX, GFP_KERNEL);
1370         if (!dc->send_buf) {
1371                 dev_err(&pdev->dev, "Could not allocate send buffer?\n");
1372                 ret = -ENOMEM;
1373                 goto err_free_sbuf;
1374         }
1375 
1376         for (i = PORT_MDM; i < MAX_PORT; i++) {
1377                 if (kfifo_alloc(&dc->port[i].fifo_ul, FIFO_BUFFER_SIZE_UL,
1378                                         GFP_KERNEL)) {
1379                         dev_err(&pdev->dev,
1380                                         "Could not allocate kfifo buffer\n");
1381                         ret = -ENOMEM;
1382                         goto err_free_kfifo;
1383                 }
1384         }
1385 
1386         spin_lock_init(&dc->spin_mutex);
1387 
1388         nozomi_setup_private_data(dc);
1389 
1390         /* Disable all interrupts */
1391         dc->last_ier = 0;
1392         writew(dc->last_ier, dc->reg_ier);
1393 
1394         ret = request_irq(pdev->irq, &interrupt_handler, IRQF_SHARED,
1395                         NOZOMI_NAME, dc);
1396         if (unlikely(ret)) {
1397                 dev_err(&pdev->dev, "can't request irq %d\n", pdev->irq);
1398                 goto err_free_kfifo;
1399         }
1400 
1401         DBG1("base_addr: %p", dc->base_addr);
1402 
1403         make_sysfs_files(dc);
1404 
1405         dc->index_start = ndev_idx * MAX_PORT;
1406         ndevs[ndev_idx] = dc;
1407 
1408         pci_set_drvdata(pdev, dc);
1409 
1410         /* Enable RESET interrupt */
1411         dc->last_ier = RESET;
1412         iowrite16(dc->last_ier, dc->reg_ier);
1413 
1414         dc->state = NOZOMI_STATE_ENABLED;
1415 
1416         for (i = 0; i < MAX_PORT; i++) {
1417                 struct device *tty_dev;
1418                 struct port *port = &dc->port[i];
1419                 port->dc = dc;
1420                 tty_port_init(&port->port);
1421                 port->port.ops = &noz_tty_port_ops;
1422                 tty_dev = tty_port_register_device(&port->port, ntty_driver,
1423                                 dc->index_start + i, &pdev->dev);
1424 
1425                 if (IS_ERR(tty_dev)) {
1426                         ret = PTR_ERR(tty_dev);
1427                         dev_err(&pdev->dev, "Could not allocate tty?\n");
1428                         tty_port_destroy(&port->port);
1429                         goto err_free_tty;
1430                 }
1431         }
1432 
1433         return 0;
1434 
1435 err_free_tty:
1436         for (i = 0; i < MAX_PORT; ++i) {
1437                 tty_unregister_device(ntty_driver, dc->index_start + i);
1438                 tty_port_destroy(&dc->port[i].port);
1439         }
1440 err_free_kfifo:
1441         for (i = 0; i < MAX_PORT; i++)
1442                 kfifo_free(&dc->port[i].fifo_ul);
1443 err_free_sbuf:
1444         kfree(dc->send_buf);
1445         iounmap(dc->base_addr);
1446 err_rel_regs:
1447         pci_release_regions(pdev);
1448 err_disable_device:
1449         pci_disable_device(pdev);
1450 err_free:
1451         kfree(dc);
1452 err:
1453         return ret;
1454 }
1455 
1456 static void tty_exit(struct nozomi *dc)
1457 {
1458         unsigned int i;
1459 
1460         DBG1(" ");
1461 
1462         for (i = 0; i < MAX_PORT; ++i)
1463                 tty_port_tty_hangup(&dc->port[i].port, false);
1464 
1465         /* Racy below - surely should wait for scheduled work to be done or
1466            complete off a hangup method ? */
1467         while (dc->open_ttys)
1468                 msleep(1);
1469         for (i = 0; i < MAX_PORT; ++i) {
1470                 tty_unregister_device(ntty_driver, dc->index_start + i);
1471                 tty_port_destroy(&dc->port[i].port);
1472         }
1473 }
1474 
1475 /* Deallocate memory for one device */
1476 static void nozomi_card_exit(struct pci_dev *pdev)
1477 {
1478         int i;
1479         struct ctrl_ul ctrl;
1480         struct nozomi *dc = pci_get_drvdata(pdev);
1481 
1482         /* Disable all interrupts */
1483         dc->last_ier = 0;
1484         writew(dc->last_ier, dc->reg_ier);
1485 
1486         tty_exit(dc);
1487 
1488         /* Send 0x0001, command card to resend the reset token.  */
1489         /* This is to get the reset when the module is reloaded. */
1490         ctrl.port = 0x00;
1491         ctrl.reserved = 0;
1492         ctrl.RTS = 0;
1493         ctrl.DTR = 1;
1494         DBG1("sending flow control 0x%04X", *((u16 *)&ctrl));
1495 
1496         /* Setup dc->reg addresses to we can use defines here */
1497         write_mem32(dc->port[PORT_CTRL].ul_addr[0], (u32 *)&ctrl, 2);
1498         writew(CTRL_UL, dc->reg_fcr);   /* push the token to the card. */
1499 
1500         remove_sysfs_files(dc);
1501 
1502         free_irq(pdev->irq, dc);
1503 
1504         for (i = 0; i < MAX_PORT; i++)
1505                 kfifo_free(&dc->port[i].fifo_ul);
1506 
1507         kfree(dc->send_buf);
1508 
1509         iounmap(dc->base_addr);
1510 
1511         pci_release_regions(pdev);
1512 
1513         pci_disable_device(pdev);
1514 
1515         ndevs[dc->index_start / MAX_PORT] = NULL;
1516 
1517         kfree(dc);
1518 }
1519 
1520 static void set_rts(const struct tty_struct *tty, int rts)
1521 {
1522         struct port *port = get_port_by_tty(tty);
1523 
1524         port->ctrl_ul.RTS = rts;
1525         port->update_flow_control = 1;
1526         enable_transmit_ul(PORT_CTRL, get_dc_by_tty(tty));
1527 }
1528 
1529 static void set_dtr(const struct tty_struct *tty, int dtr)
1530 {
1531         struct port *port = get_port_by_tty(tty);
1532 
1533         DBG1("SETTING DTR index: %d, dtr: %d", tty->index, dtr);
1534 
1535         port->ctrl_ul.DTR = dtr;
1536         port->update_flow_control = 1;
1537         enable_transmit_ul(PORT_CTRL, get_dc_by_tty(tty));
1538 }
1539 
1540 /*
1541  * ----------------------------------------------------------------------------
1542  * TTY code
1543  * ----------------------------------------------------------------------------
1544  */
1545 
1546 static int ntty_install(struct tty_driver *driver, struct tty_struct *tty)
1547 {
1548         struct port *port = get_port_by_tty(tty);
1549         struct nozomi *dc = get_dc_by_tty(tty);
1550         int ret;
1551         if (!port || !dc || dc->state != NOZOMI_STATE_READY)
1552                 return -ENODEV;
1553         ret = tty_standard_install(driver, tty);
1554         if (ret == 0)
1555                 tty->driver_data = port;
1556         return ret;
1557 }
1558 
1559 static void ntty_cleanup(struct tty_struct *tty)
1560 {
1561         tty->driver_data = NULL;
1562 }
1563 
1564 static int ntty_activate(struct tty_port *tport, struct tty_struct *tty)
1565 {
1566         struct port *port = container_of(tport, struct port, port);
1567         struct nozomi *dc = port->dc;
1568         unsigned long flags;
1569 
1570         DBG1("open: %d", port->token_dl);
1571         spin_lock_irqsave(&dc->spin_mutex, flags);
1572         dc->last_ier = dc->last_ier | port->token_dl;
1573         writew(dc->last_ier, dc->reg_ier);
1574         dc->open_ttys++;
1575         spin_unlock_irqrestore(&dc->spin_mutex, flags);
1576         printk("noz: activated %d: %p\n", tty->index, tport);
1577         return 0;
1578 }
1579 
1580 static int ntty_open(struct tty_struct *tty, struct file *filp)
1581 {
1582         struct port *port = tty->driver_data;
1583         return tty_port_open(&port->port, tty, filp);
1584 }
1585 
1586 static void ntty_shutdown(struct tty_port *tport)
1587 {
1588         struct port *port = container_of(tport, struct port, port);
1589         struct nozomi *dc = port->dc;
1590         unsigned long flags;
1591 
1592         DBG1("close: %d", port->token_dl);
1593         spin_lock_irqsave(&dc->spin_mutex, flags);
1594         dc->last_ier &= ~(port->token_dl);
1595         writew(dc->last_ier, dc->reg_ier);
1596         dc->open_ttys--;
1597         spin_unlock_irqrestore(&dc->spin_mutex, flags);
1598         printk("noz: shutdown %p\n", tport);
1599 }
1600 
1601 static void ntty_close(struct tty_struct *tty, struct file *filp)
1602 {
1603         struct port *port = tty->driver_data;
1604         if (port)
1605                 tty_port_close(&port->port, tty, filp);
1606 }
1607 
1608 static void ntty_hangup(struct tty_struct *tty)
1609 {
1610         struct port *port = tty->driver_data;
1611         tty_port_hangup(&port->port);
1612 }
1613 
1614 /*
1615  * called when the userspace process writes to the tty (/dev/noz*).
1616  * Data is inserted into a fifo, which is then read and transferred to the modem.
1617  */
1618 static int ntty_write(struct tty_struct *tty, const unsigned char *buffer,
1619                       int count)
1620 {
1621         int rval = -EINVAL;
1622         struct nozomi *dc = get_dc_by_tty(tty);
1623         struct port *port = tty->driver_data;
1624         unsigned long flags;
1625 
1626         /* DBG1( "WRITEx: %d, index = %d", count, index); */
1627 
1628         if (!dc || !port)
1629                 return -ENODEV;
1630 
1631         rval = kfifo_in(&port->fifo_ul, (unsigned char *)buffer, count);
1632 
1633         spin_lock_irqsave(&dc->spin_mutex, flags);
1634         /* CTS is only valid on the modem channel */
1635         if (port == &(dc->port[PORT_MDM])) {
1636                 if (port->ctrl_dl.CTS) {
1637                         DBG4("Enable interrupt");
1638                         enable_transmit_ul(tty->index % MAX_PORT, dc);
1639                 } else {
1640                         dev_err(&dc->pdev->dev,
1641                                 "CTS not active on modem port?\n");
1642                 }
1643         } else {
1644                 enable_transmit_ul(tty->index % MAX_PORT, dc);
1645         }
1646         spin_unlock_irqrestore(&dc->spin_mutex, flags);
1647 
1648         return rval;
1649 }
1650 
1651 /*
1652  * Calculate how much is left in device
1653  * This method is called by the upper tty layer.
1654  *   #according to sources N_TTY.c it expects a value >= 0 and
1655  *    does not check for negative values.
1656  *
1657  * If the port is unplugged report lots of room and let the bits
1658  * dribble away so we don't block anything.
1659  */
1660 static int ntty_write_room(struct tty_struct *tty)
1661 {
1662         struct port *port = tty->driver_data;
1663         int room = 4096;
1664         const struct nozomi *dc = get_dc_by_tty(tty);
1665 
1666         if (dc)
1667                 room = kfifo_avail(&port->fifo_ul);
1668 
1669         return room;
1670 }
1671 
1672 /* Gets io control parameters */
1673 static int ntty_tiocmget(struct tty_struct *tty)
1674 {
1675         const struct port *port = tty->driver_data;
1676         const struct ctrl_dl *ctrl_dl = &port->ctrl_dl;
1677         const struct ctrl_ul *ctrl_ul = &port->ctrl_ul;
1678 
1679         /* Note: these could change under us but it is not clear this
1680            matters if so */
1681         return (ctrl_ul->RTS ? TIOCM_RTS : 0)
1682                 | (ctrl_ul->DTR ? TIOCM_DTR : 0)
1683                 | (ctrl_dl->DCD ? TIOCM_CAR : 0)
1684                 | (ctrl_dl->RI  ? TIOCM_RNG : 0)
1685                 | (ctrl_dl->DSR ? TIOCM_DSR : 0)
1686                 | (ctrl_dl->CTS ? TIOCM_CTS : 0);
1687 }
1688 
1689 /* Sets io controls parameters */
1690 static int ntty_tiocmset(struct tty_struct *tty,
1691                                         unsigned int set, unsigned int clear)
1692 {
1693         struct nozomi *dc = get_dc_by_tty(tty);
1694         unsigned long flags;
1695 
1696         spin_lock_irqsave(&dc->spin_mutex, flags);
1697         if (set & TIOCM_RTS)
1698                 set_rts(tty, 1);
1699         else if (clear & TIOCM_RTS)
1700                 set_rts(tty, 0);
1701 
1702         if (set & TIOCM_DTR)
1703                 set_dtr(tty, 1);
1704         else if (clear & TIOCM_DTR)
1705                 set_dtr(tty, 0);
1706         spin_unlock_irqrestore(&dc->spin_mutex, flags);
1707 
1708         return 0;
1709 }
1710 
1711 static int ntty_cflags_changed(struct port *port, unsigned long flags,
1712                 struct async_icount *cprev)
1713 {
1714         const struct async_icount cnow = port->tty_icount;
1715         int ret;
1716 
1717         ret = ((flags & TIOCM_RNG) && (cnow.rng != cprev->rng))
1718                 || ((flags & TIOCM_DSR) && (cnow.dsr != cprev->dsr))
1719                 || ((flags & TIOCM_CD)  && (cnow.dcd != cprev->dcd))
1720                 || ((flags & TIOCM_CTS) && (cnow.cts != cprev->cts));
1721 
1722         *cprev = cnow;
1723 
1724         return ret;
1725 }
1726 
1727 static int ntty_tiocgicount(struct tty_struct *tty,
1728                                 struct serial_icounter_struct *icount)
1729 {
1730         struct port *port = tty->driver_data;
1731         const struct async_icount cnow = port->tty_icount;
1732 
1733         icount->cts = cnow.cts;
1734         icount->dsr = cnow.dsr;
1735         icount->rng = cnow.rng;
1736         icount->dcd = cnow.dcd;
1737         icount->rx = cnow.rx;
1738         icount->tx = cnow.tx;
1739         icount->frame = cnow.frame;
1740         icount->overrun = cnow.overrun;
1741         icount->parity = cnow.parity;
1742         icount->brk = cnow.brk;
1743         icount->buf_overrun = cnow.buf_overrun;
1744         return 0;
1745 }
1746 
1747 static int ntty_ioctl(struct tty_struct *tty,
1748                       unsigned int cmd, unsigned long arg)
1749 {
1750         struct port *port = tty->driver_data;
1751         int rval = -ENOIOCTLCMD;
1752 
1753         DBG1("******** IOCTL, cmd: %d", cmd);
1754 
1755         switch (cmd) {
1756         case TIOCMIWAIT: {
1757                 struct async_icount cprev = port->tty_icount;
1758 
1759                 rval = wait_event_interruptible(port->tty_wait,
1760                                 ntty_cflags_changed(port, arg, &cprev));
1761                 break;
1762         }
1763         default:
1764                 DBG1("ERR: 0x%08X, %d", cmd, cmd);
1765                 break;
1766         }
1767 
1768         return rval;
1769 }
1770 
1771 /*
1772  * Called by the upper tty layer when tty buffers are ready
1773  * to receive data again after a call to throttle.
1774  */
1775 static void ntty_unthrottle(struct tty_struct *tty)
1776 {
1777         struct nozomi *dc = get_dc_by_tty(tty);
1778         unsigned long flags;
1779 
1780         DBG1("UNTHROTTLE");
1781         spin_lock_irqsave(&dc->spin_mutex, flags);
1782         enable_transmit_dl(tty->index % MAX_PORT, dc);
1783         set_rts(tty, 1);
1784 
1785         spin_unlock_irqrestore(&dc->spin_mutex, flags);
1786 }
1787 
1788 /*
1789  * Called by the upper tty layer when the tty buffers are almost full.
1790  * The driver should stop send more data.
1791  */
1792 static void ntty_throttle(struct tty_struct *tty)
1793 {
1794         struct nozomi *dc = get_dc_by_tty(tty);
1795         unsigned long flags;
1796 
1797         DBG1("THROTTLE");
1798         spin_lock_irqsave(&dc->spin_mutex, flags);
1799         set_rts(tty, 0);
1800         spin_unlock_irqrestore(&dc->spin_mutex, flags);
1801 }
1802 
1803 /* Returns number of chars in buffer, called by tty layer */
1804 static s32 ntty_chars_in_buffer(struct tty_struct *tty)
1805 {
1806         struct port *port = tty->driver_data;
1807         struct nozomi *dc = get_dc_by_tty(tty);
1808         s32 rval = 0;
1809 
1810         if (unlikely(!dc || !port)) {
1811                 goto exit_in_buffer;
1812         }
1813 
1814         rval = kfifo_len(&port->fifo_ul);
1815 
1816 exit_in_buffer:
1817         return rval;
1818 }
1819 
1820 static const struct tty_port_operations noz_tty_port_ops = {
1821         .activate = ntty_activate,
1822         .shutdown = ntty_shutdown,
1823 };
1824 
1825 static const struct tty_operations tty_ops = {
1826         .ioctl = ntty_ioctl,
1827         .open = ntty_open,
1828         .close = ntty_close,
1829         .hangup = ntty_hangup,
1830         .write = ntty_write,
1831         .write_room = ntty_write_room,
1832         .unthrottle = ntty_unthrottle,
1833         .throttle = ntty_throttle,
1834         .chars_in_buffer = ntty_chars_in_buffer,
1835         .tiocmget = ntty_tiocmget,
1836         .tiocmset = ntty_tiocmset,
1837         .get_icount = ntty_tiocgicount,
1838         .install = ntty_install,
1839         .cleanup = ntty_cleanup,
1840 };
1841 
1842 /* Module initialization */
1843 static struct pci_driver nozomi_driver = {
1844         .name = NOZOMI_NAME,
1845         .id_table = nozomi_pci_tbl,
1846         .probe = nozomi_card_init,
1847         .remove = nozomi_card_exit,
1848 };
1849 
1850 static __init int nozomi_init(void)
1851 {
1852         int ret;
1853 
1854         printk(KERN_INFO "Initializing %s\n", VERSION_STRING);
1855 
1856         ntty_driver = alloc_tty_driver(NTTY_TTY_MAXMINORS);
1857         if (!ntty_driver)
1858                 return -ENOMEM;
1859 
1860         ntty_driver->driver_name = NOZOMI_NAME_TTY;
1861         ntty_driver->name = "noz";
1862         ntty_driver->major = 0;
1863         ntty_driver->type = TTY_DRIVER_TYPE_SERIAL;
1864         ntty_driver->subtype = SERIAL_TYPE_NORMAL;
1865         ntty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
1866         ntty_driver->init_termios = tty_std_termios;
1867         ntty_driver->init_termios.c_cflag = B115200 | CS8 | CREAD | \
1868                                                 HUPCL | CLOCAL;
1869         ntty_driver->init_termios.c_ispeed = 115200;
1870         ntty_driver->init_termios.c_ospeed = 115200;
1871         tty_set_operations(ntty_driver, &tty_ops);
1872 
1873         ret = tty_register_driver(ntty_driver);
1874         if (ret) {
1875                 printk(KERN_ERR "Nozomi: failed to register ntty driver\n");
1876                 goto free_tty;
1877         }
1878 
1879         ret = pci_register_driver(&nozomi_driver);
1880         if (ret) {
1881                 printk(KERN_ERR "Nozomi: can't register pci driver\n");
1882                 goto unr_tty;
1883         }
1884 
1885         return 0;
1886 unr_tty:
1887         tty_unregister_driver(ntty_driver);
1888 free_tty:
1889         put_tty_driver(ntty_driver);
1890         return ret;
1891 }
1892 
1893 static __exit void nozomi_exit(void)
1894 {
1895         printk(KERN_INFO "Unloading %s\n", DRIVER_DESC);
1896         pci_unregister_driver(&nozomi_driver);
1897         tty_unregister_driver(ntty_driver);
1898         put_tty_driver(ntty_driver);
1899 }
1900 
1901 module_init(nozomi_init);
1902 module_exit(nozomi_exit);
1903 
1904 MODULE_LICENSE("Dual BSD/GPL");
1905 MODULE_DESCRIPTION(DRIVER_DESC);

/* [<][>][^][v][top][bottom][index][help] */