linux/drivers/tty/serial/crisv10.c
<<
>>
Prefs
   1/*
   2 * Serial port driver for the ETRAX 100LX chip
   3 *
   4 *    Copyright (C) 1998-2007  Axis Communications AB
   5 *
   6 *    Many, many authors. Based once upon a time on serial.c for 16x50.
   7 *
   8 */
   9
  10static char *serial_version = "$Revision: 1.25 $";
  11
  12#include <linux/types.h>
  13#include <linux/errno.h>
  14#include <linux/signal.h>
  15#include <linux/sched.h>
  16#include <linux/timer.h>
  17#include <linux/interrupt.h>
  18#include <linux/tty.h>
  19#include <linux/tty_flip.h>
  20#include <linux/major.h>
  21#include <linux/string.h>
  22#include <linux/fcntl.h>
  23#include <linux/mm.h>
  24#include <linux/slab.h>
  25#include <linux/init.h>
  26#include <linux/kernel.h>
  27#include <linux/mutex.h>
  28#include <linux/bitops.h>
  29#include <linux/seq_file.h>
  30#include <linux/delay.h>
  31#include <linux/module.h>
  32#include <linux/uaccess.h>
  33#include <linux/io.h>
  34
  35#include <asm/irq.h>
  36#include <asm/dma.h>
  37
  38#include <arch/svinto.h>
  39#include <arch/system.h>
  40
  41/* non-arch dependent serial structures are in linux/serial.h */
  42#include <linux/serial.h>
  43/* while we keep our own stuff (struct e100_serial) in a local .h file */
  44#include "crisv10.h"
  45#include <asm/fasttimer.h>
  46#include <arch/io_interface_mux.h>
  47
  48#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
  49#ifndef CONFIG_ETRAX_FAST_TIMER
  50#error "Enable FAST_TIMER to use SERIAL_FAST_TIMER"
  51#endif
  52#endif
  53
  54#if defined(CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS) && \
  55           (CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS == 0)
  56#error "RX_TIMEOUT_TICKS == 0 not allowed, use 1"
  57#endif
  58
  59#if defined(CONFIG_ETRAX_RS485_ON_PA) && defined(CONFIG_ETRAX_RS485_ON_PORT_G)
  60#error "Disable either CONFIG_ETRAX_RS485_ON_PA or CONFIG_ETRAX_RS485_ON_PORT_G"
  61#endif
  62
  63/*
  64 * All of the compatibilty code so we can compile serial.c against
  65 * older kernels is hidden in serial_compat.h
  66 */
  67#if defined(LOCAL_HEADERS)
  68#include "serial_compat.h"
  69#endif
  70
  71struct tty_driver *serial_driver;
  72
  73/* number of characters left in xmit buffer before we ask for more */
  74#define WAKEUP_CHARS 256
  75
  76//#define SERIAL_DEBUG_INTR
  77//#define SERIAL_DEBUG_OPEN
  78//#define SERIAL_DEBUG_FLOW
  79//#define SERIAL_DEBUG_DATA
  80//#define SERIAL_DEBUG_THROTTLE
  81//#define SERIAL_DEBUG_IO  /* Debug for Extra control and status pins */
  82//#define SERIAL_DEBUG_LINE 0 /* What serport we want to debug */
  83
  84/* Enable this to use serial interrupts to handle when you
  85   expect the first received event on the serial port to
  86   be an error, break or similar. Used to be able to flash IRMA
  87   from eLinux */
  88#define SERIAL_HANDLE_EARLY_ERRORS
  89
  90/* Currently 16 descriptors x 128 bytes = 2048 bytes */
  91#define SERIAL_DESCR_BUF_SIZE 256
  92
  93#define SERIAL_PRESCALE_BASE 3125000 /* 3.125MHz */
  94#define DEF_BAUD_BASE SERIAL_PRESCALE_BASE
  95
  96/* We don't want to load the system with massive fast timer interrupt
  97 * on high baudrates so limit it to 250 us (4kHz) */
  98#define MIN_FLUSH_TIME_USEC 250
  99
 100/* Add an x here to log a lot of timer stuff */
 101#define TIMERD(x)
 102/* Debug details of interrupt handling */
 103#define DINTR1(x)  /* irq on/off, errors */
 104#define DINTR2(x)    /* tx and rx */
 105/* Debug flip buffer stuff */
 106#define DFLIP(x)
 107/* Debug flow control and overview of data flow */
 108#define DFLOW(x)
 109#define DBAUD(x)
 110#define DLOG_INT_TRIG(x)
 111
 112//#define DEBUG_LOG_INCLUDED
 113#ifndef DEBUG_LOG_INCLUDED
 114#define DEBUG_LOG(line, string, value)
 115#else
 116struct debug_log_info
 117{
 118        unsigned long time;
 119        unsigned long timer_data;
 120//  int line;
 121        const char *string;
 122        int value;
 123};
 124#define DEBUG_LOG_SIZE 4096
 125
 126struct debug_log_info debug_log[DEBUG_LOG_SIZE];
 127int debug_log_pos = 0;
 128
 129#define DEBUG_LOG(_line, _string, _value) do { \
 130  if ((_line) == SERIAL_DEBUG_LINE) {\
 131    debug_log_func(_line, _string, _value); \
 132  }\
 133}while(0)
 134
 135void debug_log_func(int line, const char *string, int value)
 136{
 137        if (debug_log_pos < DEBUG_LOG_SIZE) {
 138                debug_log[debug_log_pos].time = jiffies;
 139                debug_log[debug_log_pos].timer_data = *R_TIMER_DATA;
 140//    debug_log[debug_log_pos].line = line;
 141                debug_log[debug_log_pos].string = string;
 142                debug_log[debug_log_pos].value = value;
 143                debug_log_pos++;
 144        }
 145        /*printk(string, value);*/
 146}
 147#endif
 148
 149#ifndef CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS
 150/* Default number of timer ticks before flushing rx fifo
 151 * When using "little data, low latency applications: use 0
 152 * When using "much data applications (PPP)" use ~5
 153 */
 154#define CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS 5
 155#endif
 156
 157unsigned long timer_data_to_ns(unsigned long timer_data);
 158
 159static void change_speed(struct e100_serial *info);
 160static void rs_throttle(struct tty_struct * tty);
 161static void rs_wait_until_sent(struct tty_struct *tty, int timeout);
 162static int rs_write(struct tty_struct *tty,
 163                const unsigned char *buf, int count);
 164#ifdef CONFIG_ETRAX_RS485
 165static int e100_write_rs485(struct tty_struct *tty,
 166                const unsigned char *buf, int count);
 167#endif
 168static int get_lsr_info(struct e100_serial *info, unsigned int *value);
 169
 170
 171#define DEF_BAUD 115200   /* 115.2 kbit/s */
 172#define DEF_RX 0x20  /* or SERIAL_CTRL_W >> 8 */
 173/* Default value of tx_ctrl register: has txd(bit 7)=1 (idle) as default */
 174#define DEF_TX 0x80  /* or SERIAL_CTRL_B */
 175
 176/* offsets from R_SERIALx_CTRL */
 177
 178#define REG_DATA 0
 179#define REG_DATA_STATUS32 0 /* this is the 32 bit register R_SERIALx_READ */
 180#define REG_TR_DATA 0
 181#define REG_STATUS 1
 182#define REG_TR_CTRL 1
 183#define REG_REC_CTRL 2
 184#define REG_BAUD 3
 185#define REG_XOFF 4  /* this is a 32 bit register */
 186
 187/* The bitfields are the same for all serial ports */
 188#define SER_RXD_MASK         IO_MASK(R_SERIAL0_STATUS, rxd)
 189#define SER_DATA_AVAIL_MASK  IO_MASK(R_SERIAL0_STATUS, data_avail)
 190#define SER_FRAMING_ERR_MASK IO_MASK(R_SERIAL0_STATUS, framing_err)
 191#define SER_PAR_ERR_MASK     IO_MASK(R_SERIAL0_STATUS, par_err)
 192#define SER_OVERRUN_MASK     IO_MASK(R_SERIAL0_STATUS, overrun)
 193
 194#define SER_ERROR_MASK (SER_OVERRUN_MASK | SER_PAR_ERR_MASK | SER_FRAMING_ERR_MASK)
 195
 196/* Values for info->errorcode */
 197#define ERRCODE_SET_BREAK    (TTY_BREAK)
 198#define ERRCODE_INSERT        0x100
 199#define ERRCODE_INSERT_BREAK (ERRCODE_INSERT | TTY_BREAK)
 200
 201#define FORCE_EOP(info)  *R_SET_EOP = 1U << info->iseteop;
 202
 203/*
 204 * General note regarding the use of IO_* macros in this file:
 205 *
 206 * We will use the bits defined for DMA channel 6 when using various
 207 * IO_* macros (e.g. IO_STATE, IO_MASK, IO_EXTRACT) and _assume_ they are
 208 * the same for all channels (which of course they are).
 209 *
 210 * We will also use the bits defined for serial port 0 when writing commands
 211 * to the different ports, as these bits too are the same for all ports.
 212 */
 213
 214
 215/* Mask for the irqs possibly enabled in R_IRQ_MASK1_RD etc. */
 216static const unsigned long e100_ser_int_mask = 0
 217#ifdef CONFIG_ETRAX_SERIAL_PORT0
 218| IO_MASK(R_IRQ_MASK1_RD, ser0_data) | IO_MASK(R_IRQ_MASK1_RD, ser0_ready)
 219#endif
 220#ifdef CONFIG_ETRAX_SERIAL_PORT1
 221| IO_MASK(R_IRQ_MASK1_RD, ser1_data) | IO_MASK(R_IRQ_MASK1_RD, ser1_ready)
 222#endif
 223#ifdef CONFIG_ETRAX_SERIAL_PORT2
 224| IO_MASK(R_IRQ_MASK1_RD, ser2_data) | IO_MASK(R_IRQ_MASK1_RD, ser2_ready)
 225#endif
 226#ifdef CONFIG_ETRAX_SERIAL_PORT3
 227| IO_MASK(R_IRQ_MASK1_RD, ser3_data) | IO_MASK(R_IRQ_MASK1_RD, ser3_ready)
 228#endif
 229;
 230unsigned long r_alt_ser_baudrate_shadow = 0;
 231
 232/* this is the data for the four serial ports in the etrax100 */
 233/*  DMA2(ser2), DMA4(ser3), DMA6(ser0) or DMA8(ser1) */
 234/* R_DMA_CHx_CLR_INTR, R_DMA_CHx_FIRST, R_DMA_CHx_CMD */
 235
 236static struct e100_serial rs_table[] = {
 237        { .baud        = DEF_BAUD,
 238          .ioport        = (unsigned char *)R_SERIAL0_CTRL,
 239          .irq         = 1U << 12, /* uses DMA 6 and 7 */
 240          .oclrintradr = R_DMA_CH6_CLR_INTR,
 241          .ofirstadr   = R_DMA_CH6_FIRST,
 242          .ocmdadr     = R_DMA_CH6_CMD,
 243          .ostatusadr  = R_DMA_CH6_STATUS,
 244          .iclrintradr = R_DMA_CH7_CLR_INTR,
 245          .ifirstadr   = R_DMA_CH7_FIRST,
 246          .icmdadr     = R_DMA_CH7_CMD,
 247          .idescradr   = R_DMA_CH7_DESCR,
 248          .rx_ctrl     = DEF_RX,
 249          .tx_ctrl     = DEF_TX,
 250          .iseteop     = 2,
 251          .dma_owner   = dma_ser0,
 252          .io_if       = if_serial_0,
 253#ifdef CONFIG_ETRAX_SERIAL_PORT0
 254          .enabled  = 1,
 255#ifdef CONFIG_ETRAX_SERIAL_PORT0_DMA6_OUT
 256          .dma_out_enabled = 1,
 257          .dma_out_nbr = SER0_TX_DMA_NBR,
 258          .dma_out_irq_nbr = SER0_DMA_TX_IRQ_NBR,
 259          .dma_out_irq_flags = 0,
 260          .dma_out_irq_description = "serial 0 dma tr",
 261#else
 262          .dma_out_enabled = 0,
 263          .dma_out_nbr = UINT_MAX,
 264          .dma_out_irq_nbr = 0,
 265          .dma_out_irq_flags = 0,
 266          .dma_out_irq_description = NULL,
 267#endif
 268#ifdef CONFIG_ETRAX_SERIAL_PORT0_DMA7_IN
 269          .dma_in_enabled = 1,
 270          .dma_in_nbr = SER0_RX_DMA_NBR,
 271          .dma_in_irq_nbr = SER0_DMA_RX_IRQ_NBR,
 272          .dma_in_irq_flags = 0,
 273          .dma_in_irq_description = "serial 0 dma rec",
 274#else
 275          .dma_in_enabled = 0,
 276          .dma_in_nbr = UINT_MAX,
 277          .dma_in_irq_nbr = 0,
 278          .dma_in_irq_flags = 0,
 279          .dma_in_irq_description = NULL,
 280#endif
 281#else
 282          .enabled  = 0,
 283          .io_if_description = NULL,
 284          .dma_out_enabled = 0,
 285          .dma_in_enabled = 0
 286#endif
 287
 288},  /* ttyS0 */
 289#ifndef CONFIG_SVINTO_SIM
 290        { .baud        = DEF_BAUD,
 291          .ioport        = (unsigned char *)R_SERIAL1_CTRL,
 292          .irq         = 1U << 16, /* uses DMA 8 and 9 */
 293          .oclrintradr = R_DMA_CH8_CLR_INTR,
 294          .ofirstadr   = R_DMA_CH8_FIRST,
 295          .ocmdadr     = R_DMA_CH8_CMD,
 296          .ostatusadr  = R_DMA_CH8_STATUS,
 297          .iclrintradr = R_DMA_CH9_CLR_INTR,
 298          .ifirstadr   = R_DMA_CH9_FIRST,
 299          .icmdadr     = R_DMA_CH9_CMD,
 300          .idescradr   = R_DMA_CH9_DESCR,
 301          .rx_ctrl     = DEF_RX,
 302          .tx_ctrl     = DEF_TX,
 303          .iseteop     = 3,
 304          .dma_owner   = dma_ser1,
 305          .io_if       = if_serial_1,
 306#ifdef CONFIG_ETRAX_SERIAL_PORT1
 307          .enabled  = 1,
 308          .io_if_description = "ser1",
 309#ifdef CONFIG_ETRAX_SERIAL_PORT1_DMA8_OUT
 310          .dma_out_enabled = 1,
 311          .dma_out_nbr = SER1_TX_DMA_NBR,
 312          .dma_out_irq_nbr = SER1_DMA_TX_IRQ_NBR,
 313          .dma_out_irq_flags = 0,
 314          .dma_out_irq_description = "serial 1 dma tr",
 315#else
 316          .dma_out_enabled = 0,
 317          .dma_out_nbr = UINT_MAX,
 318          .dma_out_irq_nbr = 0,
 319          .dma_out_irq_flags = 0,
 320          .dma_out_irq_description = NULL,
 321#endif
 322#ifdef CONFIG_ETRAX_SERIAL_PORT1_DMA9_IN
 323          .dma_in_enabled = 1,
 324          .dma_in_nbr = SER1_RX_DMA_NBR,
 325          .dma_in_irq_nbr = SER1_DMA_RX_IRQ_NBR,
 326          .dma_in_irq_flags = 0,
 327          .dma_in_irq_description = "serial 1 dma rec",
 328#else
 329          .dma_in_enabled = 0,
 330          .dma_in_enabled = 0,
 331          .dma_in_nbr = UINT_MAX,
 332          .dma_in_irq_nbr = 0,
 333          .dma_in_irq_flags = 0,
 334          .dma_in_irq_description = NULL,
 335#endif
 336#else
 337          .enabled  = 0,
 338          .io_if_description = NULL,
 339          .dma_in_irq_nbr = 0,
 340          .dma_out_enabled = 0,
 341          .dma_in_enabled = 0
 342#endif
 343},  /* ttyS1 */
 344
 345        { .baud        = DEF_BAUD,
 346          .ioport        = (unsigned char *)R_SERIAL2_CTRL,
 347          .irq         = 1U << 4,  /* uses DMA 2 and 3 */
 348          .oclrintradr = R_DMA_CH2_CLR_INTR,
 349          .ofirstadr   = R_DMA_CH2_FIRST,
 350          .ocmdadr     = R_DMA_CH2_CMD,
 351          .ostatusadr  = R_DMA_CH2_STATUS,
 352          .iclrintradr = R_DMA_CH3_CLR_INTR,
 353          .ifirstadr   = R_DMA_CH3_FIRST,
 354          .icmdadr     = R_DMA_CH3_CMD,
 355          .idescradr   = R_DMA_CH3_DESCR,
 356          .rx_ctrl     = DEF_RX,
 357          .tx_ctrl     = DEF_TX,
 358          .iseteop     = 0,
 359          .dma_owner   = dma_ser2,
 360          .io_if       = if_serial_2,
 361#ifdef CONFIG_ETRAX_SERIAL_PORT2
 362          .enabled  = 1,
 363          .io_if_description = "ser2",
 364#ifdef CONFIG_ETRAX_SERIAL_PORT2_DMA2_OUT
 365          .dma_out_enabled = 1,
 366          .dma_out_nbr = SER2_TX_DMA_NBR,
 367          .dma_out_irq_nbr = SER2_DMA_TX_IRQ_NBR,
 368          .dma_out_irq_flags = 0,
 369          .dma_out_irq_description = "serial 2 dma tr",
 370#else
 371          .dma_out_enabled = 0,
 372          .dma_out_nbr = UINT_MAX,
 373          .dma_out_irq_nbr = 0,
 374          .dma_out_irq_flags = 0,
 375          .dma_out_irq_description = NULL,
 376#endif
 377#ifdef CONFIG_ETRAX_SERIAL_PORT2_DMA3_IN
 378          .dma_in_enabled = 1,
 379          .dma_in_nbr = SER2_RX_DMA_NBR,
 380          .dma_in_irq_nbr = SER2_DMA_RX_IRQ_NBR,
 381          .dma_in_irq_flags = 0,
 382          .dma_in_irq_description = "serial 2 dma rec",
 383#else
 384          .dma_in_enabled = 0,
 385          .dma_in_nbr = UINT_MAX,
 386          .dma_in_irq_nbr = 0,
 387          .dma_in_irq_flags = 0,
 388          .dma_in_irq_description = NULL,
 389#endif
 390#else
 391          .enabled  = 0,
 392          .io_if_description = NULL,
 393          .dma_out_enabled = 0,
 394          .dma_in_enabled = 0
 395#endif
 396 },  /* ttyS2 */
 397
 398        { .baud        = DEF_BAUD,
 399          .ioport        = (unsigned char *)R_SERIAL3_CTRL,
 400          .irq         = 1U << 8,  /* uses DMA 4 and 5 */
 401          .oclrintradr = R_DMA_CH4_CLR_INTR,
 402          .ofirstadr   = R_DMA_CH4_FIRST,
 403          .ocmdadr     = R_DMA_CH4_CMD,
 404          .ostatusadr  = R_DMA_CH4_STATUS,
 405          .iclrintradr = R_DMA_CH5_CLR_INTR,
 406          .ifirstadr   = R_DMA_CH5_FIRST,
 407          .icmdadr     = R_DMA_CH5_CMD,
 408          .idescradr   = R_DMA_CH5_DESCR,
 409          .rx_ctrl     = DEF_RX,
 410          .tx_ctrl     = DEF_TX,
 411          .iseteop     = 1,
 412          .dma_owner   = dma_ser3,
 413          .io_if       = if_serial_3,
 414#ifdef CONFIG_ETRAX_SERIAL_PORT3
 415          .enabled  = 1,
 416          .io_if_description = "ser3",
 417#ifdef CONFIG_ETRAX_SERIAL_PORT3_DMA4_OUT
 418          .dma_out_enabled = 1,
 419          .dma_out_nbr = SER3_TX_DMA_NBR,
 420          .dma_out_irq_nbr = SER3_DMA_TX_IRQ_NBR,
 421          .dma_out_irq_flags = 0,
 422          .dma_out_irq_description = "serial 3 dma tr",
 423#else
 424          .dma_out_enabled = 0,
 425          .dma_out_nbr = UINT_MAX,
 426          .dma_out_irq_nbr = 0,
 427          .dma_out_irq_flags = 0,
 428          .dma_out_irq_description = NULL,
 429#endif
 430#ifdef CONFIG_ETRAX_SERIAL_PORT3_DMA5_IN
 431          .dma_in_enabled = 1,
 432          .dma_in_nbr = SER3_RX_DMA_NBR,
 433          .dma_in_irq_nbr = SER3_DMA_RX_IRQ_NBR,
 434          .dma_in_irq_flags = 0,
 435          .dma_in_irq_description = "serial 3 dma rec",
 436#else
 437          .dma_in_enabled = 0,
 438          .dma_in_nbr = UINT_MAX,
 439          .dma_in_irq_nbr = 0,
 440          .dma_in_irq_flags = 0,
 441          .dma_in_irq_description = NULL
 442#endif
 443#else
 444          .enabled  = 0,
 445          .io_if_description = NULL,
 446          .dma_out_enabled = 0,
 447          .dma_in_enabled = 0
 448#endif
 449 }   /* ttyS3 */
 450#endif
 451};
 452
 453
 454#define NR_PORTS (sizeof(rs_table)/sizeof(struct e100_serial))
 455
 456#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
 457static struct fast_timer fast_timers[NR_PORTS];
 458#endif
 459
 460#ifdef CONFIG_ETRAX_SERIAL_PROC_ENTRY
 461#define PROCSTAT(x) x
 462struct ser_statistics_type {
 463        int overrun_cnt;
 464        int early_errors_cnt;
 465        int ser_ints_ok_cnt;
 466        int errors_cnt;
 467        unsigned long int processing_flip;
 468        unsigned long processing_flip_still_room;
 469        unsigned long int timeout_flush_cnt;
 470        int rx_dma_ints;
 471        int tx_dma_ints;
 472        int rx_tot;
 473        int tx_tot;
 474};
 475
 476static struct ser_statistics_type ser_stat[NR_PORTS];
 477
 478#else
 479
 480#define PROCSTAT(x)
 481
 482#endif /* CONFIG_ETRAX_SERIAL_PROC_ENTRY */
 483
 484/* RS-485 */
 485#if defined(CONFIG_ETRAX_RS485)
 486#ifdef CONFIG_ETRAX_FAST_TIMER
 487static struct fast_timer fast_timers_rs485[NR_PORTS];
 488#endif
 489#if defined(CONFIG_ETRAX_RS485_ON_PA)
 490static int rs485_pa_bit = CONFIG_ETRAX_RS485_ON_PA_BIT;
 491#endif
 492#if defined(CONFIG_ETRAX_RS485_ON_PORT_G)
 493static int rs485_port_g_bit = CONFIG_ETRAX_RS485_ON_PORT_G_BIT;
 494#endif
 495#endif
 496
 497/* Info and macros needed for each ports extra control/status signals. */
 498#define E100_STRUCT_PORT(line, pinname) \
 499 ((CONFIG_ETRAX_SER##line##_##pinname##_ON_PA_BIT >= 0)? \
 500                (R_PORT_PA_DATA): ( \
 501 (CONFIG_ETRAX_SER##line##_##pinname##_ON_PB_BIT >= 0)? \
 502                (R_PORT_PB_DATA):&dummy_ser[line]))
 503
 504#define E100_STRUCT_SHADOW(line, pinname) \
 505 ((CONFIG_ETRAX_SER##line##_##pinname##_ON_PA_BIT >= 0)? \
 506                (&port_pa_data_shadow): ( \
 507 (CONFIG_ETRAX_SER##line##_##pinname##_ON_PB_BIT >= 0)? \
 508                (&port_pb_data_shadow):&dummy_ser[line]))
 509#define E100_STRUCT_MASK(line, pinname) \
 510 ((CONFIG_ETRAX_SER##line##_##pinname##_ON_PA_BIT >= 0)? \
 511                (1<<CONFIG_ETRAX_SER##line##_##pinname##_ON_PA_BIT): ( \
 512 (CONFIG_ETRAX_SER##line##_##pinname##_ON_PB_BIT >= 0)? \
 513                (1<<CONFIG_ETRAX_SER##line##_##pinname##_ON_PB_BIT):DUMMY_##pinname##_MASK))
 514
 515#define DUMMY_DTR_MASK 1
 516#define DUMMY_RI_MASK  2
 517#define DUMMY_DSR_MASK 4
 518#define DUMMY_CD_MASK  8
 519static unsigned char dummy_ser[NR_PORTS] = {0xFF, 0xFF, 0xFF,0xFF};
 520
 521/* If not all status pins are used or disabled, use mixed mode */
 522#ifdef CONFIG_ETRAX_SERIAL_PORT0
 523
 524#define SER0_PA_BITSUM (CONFIG_ETRAX_SER0_DTR_ON_PA_BIT+CONFIG_ETRAX_SER0_RI_ON_PA_BIT+CONFIG_ETRAX_SER0_DSR_ON_PA_BIT+CONFIG_ETRAX_SER0_CD_ON_PA_BIT)
 525
 526#if SER0_PA_BITSUM != -4
 527#  if CONFIG_ETRAX_SER0_DTR_ON_PA_BIT == -1
 528#    ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED
 529#      define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1
 530#    endif
 531#   endif
 532# if CONFIG_ETRAX_SER0_RI_ON_PA_BIT == -1
 533#   ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED
 534#     define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1
 535#   endif
 536#  endif
 537#  if CONFIG_ETRAX_SER0_DSR_ON_PA_BIT == -1
 538#    ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED
 539#      define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1
 540#    endif
 541#  endif
 542#  if CONFIG_ETRAX_SER0_CD_ON_PA_BIT == -1
 543#    ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED
 544#      define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1
 545#    endif
 546#  endif
 547#endif
 548
 549#define SER0_PB_BITSUM (CONFIG_ETRAX_SER0_DTR_ON_PB_BIT+CONFIG_ETRAX_SER0_RI_ON_PB_BIT+CONFIG_ETRAX_SER0_DSR_ON_PB_BIT+CONFIG_ETRAX_SER0_CD_ON_PB_BIT)
 550
 551#if SER0_PB_BITSUM != -4
 552#  if CONFIG_ETRAX_SER0_DTR_ON_PB_BIT == -1
 553#    ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED
 554#      define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1
 555#    endif
 556#   endif
 557# if CONFIG_ETRAX_SER0_RI_ON_PB_BIT == -1
 558#   ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED
 559#     define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1
 560#   endif
 561#  endif
 562#  if CONFIG_ETRAX_SER0_DSR_ON_PB_BIT == -1
 563#    ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED
 564#      define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1
 565#    endif
 566#  endif
 567#  if CONFIG_ETRAX_SER0_CD_ON_PB_BIT == -1
 568#    ifndef CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED
 569#      define CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED 1
 570#    endif
 571#  endif
 572#endif
 573
 574#endif /* PORT0 */
 575
 576
 577#ifdef CONFIG_ETRAX_SERIAL_PORT1
 578
 579#define SER1_PA_BITSUM (CONFIG_ETRAX_SER1_DTR_ON_PA_BIT+CONFIG_ETRAX_SER1_RI_ON_PA_BIT+CONFIG_ETRAX_SER1_DSR_ON_PA_BIT+CONFIG_ETRAX_SER1_CD_ON_PA_BIT)
 580
 581#if SER1_PA_BITSUM != -4
 582#  if CONFIG_ETRAX_SER1_DTR_ON_PA_BIT == -1
 583#    ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED
 584#      define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1
 585#    endif
 586#   endif
 587# if CONFIG_ETRAX_SER1_RI_ON_PA_BIT == -1
 588#   ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED
 589#     define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1
 590#   endif
 591#  endif
 592#  if CONFIG_ETRAX_SER1_DSR_ON_PA_BIT == -1
 593#    ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED
 594#      define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1
 595#    endif
 596#  endif
 597#  if CONFIG_ETRAX_SER1_CD_ON_PA_BIT == -1
 598#    ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED
 599#      define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1
 600#    endif
 601#  endif
 602#endif
 603
 604#define SER1_PB_BITSUM (CONFIG_ETRAX_SER1_DTR_ON_PB_BIT+CONFIG_ETRAX_SER1_RI_ON_PB_BIT+CONFIG_ETRAX_SER1_DSR_ON_PB_BIT+CONFIG_ETRAX_SER1_CD_ON_PB_BIT)
 605
 606#if SER1_PB_BITSUM != -4
 607#  if CONFIG_ETRAX_SER1_DTR_ON_PB_BIT == -1
 608#    ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED
 609#      define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1
 610#    endif
 611#   endif
 612# if CONFIG_ETRAX_SER1_RI_ON_PB_BIT == -1
 613#   ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED
 614#     define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1
 615#   endif
 616#  endif
 617#  if CONFIG_ETRAX_SER1_DSR_ON_PB_BIT == -1
 618#    ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED
 619#      define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1
 620#    endif
 621#  endif
 622#  if CONFIG_ETRAX_SER1_CD_ON_PB_BIT == -1
 623#    ifndef CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED
 624#      define CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED 1
 625#    endif
 626#  endif
 627#endif
 628
 629#endif /* PORT1 */
 630
 631#ifdef CONFIG_ETRAX_SERIAL_PORT2
 632
 633#define SER2_PA_BITSUM (CONFIG_ETRAX_SER2_DTR_ON_PA_BIT+CONFIG_ETRAX_SER2_RI_ON_PA_BIT+CONFIG_ETRAX_SER2_DSR_ON_PA_BIT+CONFIG_ETRAX_SER2_CD_ON_PA_BIT)
 634
 635#if SER2_PA_BITSUM != -4
 636#  if CONFIG_ETRAX_SER2_DTR_ON_PA_BIT == -1
 637#    ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED
 638#      define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1
 639#    endif
 640#   endif
 641# if CONFIG_ETRAX_SER2_RI_ON_PA_BIT == -1
 642#   ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED
 643#     define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1
 644#   endif
 645#  endif
 646#  if CONFIG_ETRAX_SER2_DSR_ON_PA_BIT == -1
 647#    ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED
 648#      define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1
 649#    endif
 650#  endif
 651#  if CONFIG_ETRAX_SER2_CD_ON_PA_BIT == -1
 652#    ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED
 653#      define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1
 654#    endif
 655#  endif
 656#endif
 657
 658#define SER2_PB_BITSUM (CONFIG_ETRAX_SER2_DTR_ON_PB_BIT+CONFIG_ETRAX_SER2_RI_ON_PB_BIT+CONFIG_ETRAX_SER2_DSR_ON_PB_BIT+CONFIG_ETRAX_SER2_CD_ON_PB_BIT)
 659
 660#if SER2_PB_BITSUM != -4
 661#  if CONFIG_ETRAX_SER2_DTR_ON_PB_BIT == -1
 662#    ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED
 663#      define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1
 664#    endif
 665#   endif
 666# if CONFIG_ETRAX_SER2_RI_ON_PB_BIT == -1
 667#   ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED
 668#     define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1
 669#   endif
 670#  endif
 671#  if CONFIG_ETRAX_SER2_DSR_ON_PB_BIT == -1
 672#    ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED
 673#      define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1
 674#    endif
 675#  endif
 676#  if CONFIG_ETRAX_SER2_CD_ON_PB_BIT == -1
 677#    ifndef CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED
 678#      define CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED 1
 679#    endif
 680#  endif
 681#endif
 682
 683#endif /* PORT2 */
 684
 685#ifdef CONFIG_ETRAX_SERIAL_PORT3
 686
 687#define SER3_PA_BITSUM (CONFIG_ETRAX_SER3_DTR_ON_PA_BIT+CONFIG_ETRAX_SER3_RI_ON_PA_BIT+CONFIG_ETRAX_SER3_DSR_ON_PA_BIT+CONFIG_ETRAX_SER3_CD_ON_PA_BIT)
 688
 689#if SER3_PA_BITSUM != -4
 690#  if CONFIG_ETRAX_SER3_DTR_ON_PA_BIT == -1
 691#    ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED
 692#      define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1
 693#    endif
 694#   endif
 695# if CONFIG_ETRAX_SER3_RI_ON_PA_BIT == -1
 696#   ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED
 697#     define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1
 698#   endif
 699#  endif
 700#  if CONFIG_ETRAX_SER3_DSR_ON_PA_BIT == -1
 701#    ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED
 702#      define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1
 703#    endif
 704#  endif
 705#  if CONFIG_ETRAX_SER3_CD_ON_PA_BIT == -1
 706#    ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED
 707#      define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1
 708#    endif
 709#  endif
 710#endif
 711
 712#define SER3_PB_BITSUM (CONFIG_ETRAX_SER3_DTR_ON_PB_BIT+CONFIG_ETRAX_SER3_RI_ON_PB_BIT+CONFIG_ETRAX_SER3_DSR_ON_PB_BIT+CONFIG_ETRAX_SER3_CD_ON_PB_BIT)
 713
 714#if SER3_PB_BITSUM != -4
 715#  if CONFIG_ETRAX_SER3_DTR_ON_PB_BIT == -1
 716#    ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED
 717#      define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1
 718#    endif
 719#   endif
 720# if CONFIG_ETRAX_SER3_RI_ON_PB_BIT == -1
 721#   ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED
 722#     define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1
 723#   endif
 724#  endif
 725#  if CONFIG_ETRAX_SER3_DSR_ON_PB_BIT == -1
 726#    ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED
 727#      define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1
 728#    endif
 729#  endif
 730#  if CONFIG_ETRAX_SER3_CD_ON_PB_BIT == -1
 731#    ifndef CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED
 732#      define CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED 1
 733#    endif
 734#  endif
 735#endif
 736
 737#endif /* PORT3 */
 738
 739
 740#if defined(CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_MIXED) || \
 741    defined(CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_MIXED) || \
 742    defined(CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_MIXED) || \
 743    defined(CONFIG_ETRAX_SER3_DTR_RI_DSR_CD_MIXED)
 744#define CONFIG_ETRAX_SERX_DTR_RI_DSR_CD_MIXED
 745#endif
 746
 747#ifdef CONFIG_ETRAX_SERX_DTR_RI_DSR_CD_MIXED
 748/* The pins can be mixed on PA and PB */
 749#define CONTROL_PINS_PORT_NOT_USED(line) \
 750  &dummy_ser[line], &dummy_ser[line], \
 751  &dummy_ser[line], &dummy_ser[line], \
 752  &dummy_ser[line], &dummy_ser[line], \
 753  &dummy_ser[line], &dummy_ser[line], \
 754  DUMMY_DTR_MASK, DUMMY_RI_MASK, DUMMY_DSR_MASK, DUMMY_CD_MASK
 755
 756
 757struct control_pins
 758{
 759        volatile unsigned char *dtr_port;
 760        unsigned char          *dtr_shadow;
 761        volatile unsigned char *ri_port;
 762        unsigned char          *ri_shadow;
 763        volatile unsigned char *dsr_port;
 764        unsigned char          *dsr_shadow;
 765        volatile unsigned char *cd_port;
 766        unsigned char          *cd_shadow;
 767
 768        unsigned char dtr_mask;
 769        unsigned char ri_mask;
 770        unsigned char dsr_mask;
 771        unsigned char cd_mask;
 772};
 773
 774static const struct control_pins e100_modem_pins[NR_PORTS] =
 775{
 776        /* Ser 0 */
 777        {
 778#ifdef CONFIG_ETRAX_SERIAL_PORT0
 779        E100_STRUCT_PORT(0,DTR), E100_STRUCT_SHADOW(0,DTR),
 780        E100_STRUCT_PORT(0,RI),  E100_STRUCT_SHADOW(0,RI),
 781        E100_STRUCT_PORT(0,DSR), E100_STRUCT_SHADOW(0,DSR),
 782        E100_STRUCT_PORT(0,CD),  E100_STRUCT_SHADOW(0,CD),
 783        E100_STRUCT_MASK(0,DTR),
 784        E100_STRUCT_MASK(0,RI),
 785        E100_STRUCT_MASK(0,DSR),
 786        E100_STRUCT_MASK(0,CD)
 787#else
 788        CONTROL_PINS_PORT_NOT_USED(0)
 789#endif
 790        },
 791
 792        /* Ser 1 */
 793        {
 794#ifdef CONFIG_ETRAX_SERIAL_PORT1
 795        E100_STRUCT_PORT(1,DTR), E100_STRUCT_SHADOW(1,DTR),
 796        E100_STRUCT_PORT(1,RI),  E100_STRUCT_SHADOW(1,RI),
 797        E100_STRUCT_PORT(1,DSR), E100_STRUCT_SHADOW(1,DSR),
 798        E100_STRUCT_PORT(1,CD),  E100_STRUCT_SHADOW(1,CD),
 799        E100_STRUCT_MASK(1,DTR),
 800        E100_STRUCT_MASK(1,RI),
 801        E100_STRUCT_MASK(1,DSR),
 802        E100_STRUCT_MASK(1,CD)
 803#else
 804        CONTROL_PINS_PORT_NOT_USED(1)
 805#endif
 806        },
 807
 808        /* Ser 2 */
 809        {
 810#ifdef CONFIG_ETRAX_SERIAL_PORT2
 811        E100_STRUCT_PORT(2,DTR), E100_STRUCT_SHADOW(2,DTR),
 812        E100_STRUCT_PORT(2,RI),  E100_STRUCT_SHADOW(2,RI),
 813        E100_STRUCT_PORT(2,DSR), E100_STRUCT_SHADOW(2,DSR),
 814        E100_STRUCT_PORT(2,CD),  E100_STRUCT_SHADOW(2,CD),
 815        E100_STRUCT_MASK(2,DTR),
 816        E100_STRUCT_MASK(2,RI),
 817        E100_STRUCT_MASK(2,DSR),
 818        E100_STRUCT_MASK(2,CD)
 819#else
 820        CONTROL_PINS_PORT_NOT_USED(2)
 821#endif
 822        },
 823
 824        /* Ser 3 */
 825        {
 826#ifdef CONFIG_ETRAX_SERIAL_PORT3
 827        E100_STRUCT_PORT(3,DTR), E100_STRUCT_SHADOW(3,DTR),
 828        E100_STRUCT_PORT(3,RI),  E100_STRUCT_SHADOW(3,RI),
 829        E100_STRUCT_PORT(3,DSR), E100_STRUCT_SHADOW(3,DSR),
 830        E100_STRUCT_PORT(3,CD),  E100_STRUCT_SHADOW(3,CD),
 831        E100_STRUCT_MASK(3,DTR),
 832        E100_STRUCT_MASK(3,RI),
 833        E100_STRUCT_MASK(3,DSR),
 834        E100_STRUCT_MASK(3,CD)
 835#else
 836        CONTROL_PINS_PORT_NOT_USED(3)
 837#endif
 838        }
 839};
 840#else  /* CONFIG_ETRAX_SERX_DTR_RI_DSR_CD_MIXED */
 841
 842/* All pins are on either PA or PB for each serial port */
 843#define CONTROL_PINS_PORT_NOT_USED(line) \
 844  &dummy_ser[line], &dummy_ser[line], \
 845  DUMMY_DTR_MASK, DUMMY_RI_MASK, DUMMY_DSR_MASK, DUMMY_CD_MASK
 846
 847
 848struct control_pins
 849{
 850        volatile unsigned char *port;
 851        unsigned char          *shadow;
 852
 853        unsigned char dtr_mask;
 854        unsigned char ri_mask;
 855        unsigned char dsr_mask;
 856        unsigned char cd_mask;
 857};
 858
 859#define dtr_port port
 860#define dtr_shadow shadow
 861#define ri_port port
 862#define ri_shadow shadow
 863#define dsr_port port
 864#define dsr_shadow shadow
 865#define cd_port port
 866#define cd_shadow shadow
 867
 868static const struct control_pins e100_modem_pins[NR_PORTS] =
 869{
 870        /* Ser 0 */
 871        {
 872#ifdef CONFIG_ETRAX_SERIAL_PORT0
 873        E100_STRUCT_PORT(0,DTR), E100_STRUCT_SHADOW(0,DTR),
 874        E100_STRUCT_MASK(0,DTR),
 875        E100_STRUCT_MASK(0,RI),
 876        E100_STRUCT_MASK(0,DSR),
 877        E100_STRUCT_MASK(0,CD)
 878#else
 879        CONTROL_PINS_PORT_NOT_USED(0)
 880#endif
 881        },
 882
 883        /* Ser 1 */
 884        {
 885#ifdef CONFIG_ETRAX_SERIAL_PORT1
 886        E100_STRUCT_PORT(1,DTR), E100_STRUCT_SHADOW(1,DTR),
 887        E100_STRUCT_MASK(1,DTR),
 888        E100_STRUCT_MASK(1,RI),
 889        E100_STRUCT_MASK(1,DSR),
 890        E100_STRUCT_MASK(1,CD)
 891#else
 892        CONTROL_PINS_PORT_NOT_USED(1)
 893#endif
 894        },
 895
 896        /* Ser 2 */
 897        {
 898#ifdef CONFIG_ETRAX_SERIAL_PORT2
 899        E100_STRUCT_PORT(2,DTR), E100_STRUCT_SHADOW(2,DTR),
 900        E100_STRUCT_MASK(2,DTR),
 901        E100_STRUCT_MASK(2,RI),
 902        E100_STRUCT_MASK(2,DSR),
 903        E100_STRUCT_MASK(2,CD)
 904#else
 905        CONTROL_PINS_PORT_NOT_USED(2)
 906#endif
 907        },
 908
 909        /* Ser 3 */
 910        {
 911#ifdef CONFIG_ETRAX_SERIAL_PORT3
 912        E100_STRUCT_PORT(3,DTR), E100_STRUCT_SHADOW(3,DTR),
 913        E100_STRUCT_MASK(3,DTR),
 914        E100_STRUCT_MASK(3,RI),
 915        E100_STRUCT_MASK(3,DSR),
 916        E100_STRUCT_MASK(3,CD)
 917#else
 918        CONTROL_PINS_PORT_NOT_USED(3)
 919#endif
 920        }
 921};
 922#endif /* !CONFIG_ETRAX_SERX_DTR_RI_DSR_CD_MIXED */
 923
 924#define E100_RTS_MASK 0x20
 925#define E100_CTS_MASK 0x40
 926
 927/* All serial port signals are active low:
 928 * active   = 0 -> 3.3V to RS-232 driver -> -12V on RS-232 level
 929 * inactive = 1 -> 0V   to RS-232 driver -> +12V on RS-232 level
 930 *
 931 * These macros returns the pin value: 0=0V, >=1 = 3.3V on ETRAX chip
 932 */
 933
 934/* Output */
 935#define E100_RTS_GET(info) ((info)->rx_ctrl & E100_RTS_MASK)
 936/* Input */
 937#define E100_CTS_GET(info) ((info)->ioport[REG_STATUS] & E100_CTS_MASK)
 938
 939/* These are typically PA or PB and 0 means 0V, 1 means 3.3V */
 940/* Is an output */
 941#define E100_DTR_GET(info) ((*e100_modem_pins[(info)->line].dtr_shadow) & e100_modem_pins[(info)->line].dtr_mask)
 942
 943/* Normally inputs */
 944#define E100_RI_GET(info) ((*e100_modem_pins[(info)->line].ri_port) & e100_modem_pins[(info)->line].ri_mask)
 945#define E100_CD_GET(info) ((*e100_modem_pins[(info)->line].cd_port) & e100_modem_pins[(info)->line].cd_mask)
 946
 947/* Input */
 948#define E100_DSR_GET(info) ((*e100_modem_pins[(info)->line].dsr_port) & e100_modem_pins[(info)->line].dsr_mask)
 949
 950/* Calculate the chartime depending on baudrate, numbor of bits etc. */
 951static void update_char_time(struct e100_serial * info)
 952{
 953        tcflag_t cflags = info->port.tty->termios.c_cflag;
 954        int bits;
 955
 956        /* calc. number of bits / data byte */
 957        /* databits + startbit and 1 stopbit */
 958        if ((cflags & CSIZE) == CS7)
 959                bits = 9;
 960        else
 961                bits = 10;
 962
 963        if (cflags & CSTOPB)     /* 2 stopbits ? */
 964                bits++;
 965
 966        if (cflags & PARENB)     /* parity bit ? */
 967                bits++;
 968
 969        /* calc timeout */
 970        info->char_time_usec = ((bits * 1000000) / info->baud) + 1;
 971        info->flush_time_usec = 4*info->char_time_usec;
 972        if (info->flush_time_usec < MIN_FLUSH_TIME_USEC)
 973                info->flush_time_usec = MIN_FLUSH_TIME_USEC;
 974
 975}
 976
 977/*
 978 * This function maps from the Bxxxx defines in asm/termbits.h into real
 979 * baud rates.
 980 */
 981
 982static int
 983cflag_to_baud(unsigned int cflag)
 984{
 985        static int baud_table[] = {
 986                0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400,
 987                4800, 9600, 19200, 38400 };
 988
 989        static int ext_baud_table[] = {
 990                0, 57600, 115200, 230400, 460800, 921600, 1843200, 6250000,
 991                0, 0, 0, 0, 0, 0, 0, 0 };
 992
 993        if (cflag & CBAUDEX)
 994                return ext_baud_table[(cflag & CBAUD) & ~CBAUDEX];
 995        else
 996                return baud_table[cflag & CBAUD];
 997}
 998
 999/* and this maps to an etrax100 hardware baud constant */
1000
1001static unsigned char
1002cflag_to_etrax_baud(unsigned int cflag)
1003{
1004        char retval;
1005
1006        static char baud_table[] = {
1007                -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, -1, 3, 4, 5, 6, 7 };
1008
1009        static char ext_baud_table[] = {
1010                -1, 8, 9, 10, 11, 12, 13, 14, -1, -1, -1, -1, -1, -1, -1, -1 };
1011
1012        if (cflag & CBAUDEX)
1013                retval = ext_baud_table[(cflag & CBAUD) & ~CBAUDEX];
1014        else
1015                retval = baud_table[cflag & CBAUD];
1016
1017        if (retval < 0) {
1018                printk(KERN_WARNING "serdriver tried setting invalid baud rate, flags %x.\n", cflag);
1019                retval = 5; /* choose default 9600 instead */
1020        }
1021
1022        return retval | (retval << 4); /* choose same for both TX and RX */
1023}
1024
1025
1026/* Various static support functions */
1027
1028/* Functions to set or clear DTR/RTS on the requested line */
1029/* It is complicated by the fact that RTS is a serial port register, while
1030 * DTR might not be implemented in the HW at all, and if it is, it can be on
1031 * any general port.
1032 */
1033
1034
1035static inline void
1036e100_dtr(struct e100_serial *info, int set)
1037{
1038#ifndef CONFIG_SVINTO_SIM
1039        unsigned char mask = e100_modem_pins[info->line].dtr_mask;
1040
1041#ifdef SERIAL_DEBUG_IO
1042        printk("ser%i dtr %i mask: 0x%02X\n", info->line, set, mask);
1043        printk("ser%i shadow before 0x%02X get: %i\n",
1044               info->line, *e100_modem_pins[info->line].dtr_shadow,
1045               E100_DTR_GET(info));
1046#endif
1047        /* DTR is active low */
1048        {
1049                unsigned long flags;
1050
1051                local_irq_save(flags);
1052                *e100_modem_pins[info->line].dtr_shadow &= ~mask;
1053                *e100_modem_pins[info->line].dtr_shadow |= (set ? 0 : mask);
1054                *e100_modem_pins[info->line].dtr_port = *e100_modem_pins[info->line].dtr_shadow;
1055                local_irq_restore(flags);
1056        }
1057
1058#ifdef SERIAL_DEBUG_IO
1059        printk("ser%i shadow after 0x%02X get: %i\n",
1060               info->line, *e100_modem_pins[info->line].dtr_shadow,
1061               E100_DTR_GET(info));
1062#endif
1063#endif
1064}
1065
1066/* set = 0 means 3.3V on the pin, bitvalue: 0=active, 1=inactive
1067 *                                          0=0V    , 1=3.3V
1068 */
1069static inline void
1070e100_rts(struct e100_serial *info, int set)
1071{
1072#ifndef CONFIG_SVINTO_SIM
1073        unsigned long flags;
1074        local_irq_save(flags);
1075        info->rx_ctrl &= ~E100_RTS_MASK;
1076        info->rx_ctrl |= (set ? 0 : E100_RTS_MASK);  /* RTS is active low */
1077        info->ioport[REG_REC_CTRL] = info->rx_ctrl;
1078        local_irq_restore(flags);
1079#ifdef SERIAL_DEBUG_IO
1080        printk("ser%i rts %i\n", info->line, set);
1081#endif
1082#endif
1083}
1084
1085
1086/* If this behaves as a modem, RI and CD is an output */
1087static inline void
1088e100_ri_out(struct e100_serial *info, int set)
1089{
1090#ifndef CONFIG_SVINTO_SIM
1091        /* RI is active low */
1092        {
1093                unsigned char mask = e100_modem_pins[info->line].ri_mask;
1094                unsigned long flags;
1095
1096                local_irq_save(flags);
1097                *e100_modem_pins[info->line].ri_shadow &= ~mask;
1098                *e100_modem_pins[info->line].ri_shadow |= (set ? 0 : mask);
1099                *e100_modem_pins[info->line].ri_port = *e100_modem_pins[info->line].ri_shadow;
1100                local_irq_restore(flags);
1101        }
1102#endif
1103}
1104static inline void
1105e100_cd_out(struct e100_serial *info, int set)
1106{
1107#ifndef CONFIG_SVINTO_SIM
1108        /* CD is active low */
1109        {
1110                unsigned char mask = e100_modem_pins[info->line].cd_mask;
1111                unsigned long flags;
1112
1113                local_irq_save(flags);
1114                *e100_modem_pins[info->line].cd_shadow &= ~mask;
1115                *e100_modem_pins[info->line].cd_shadow |= (set ? 0 : mask);
1116                *e100_modem_pins[info->line].cd_port = *e100_modem_pins[info->line].cd_shadow;
1117                local_irq_restore(flags);
1118        }
1119#endif
1120}
1121
1122static inline void
1123e100_disable_rx(struct e100_serial *info)
1124{
1125#ifndef CONFIG_SVINTO_SIM
1126        /* disable the receiver */
1127        info->ioport[REG_REC_CTRL] =
1128                (info->rx_ctrl &= ~IO_MASK(R_SERIAL0_REC_CTRL, rec_enable));
1129#endif
1130}
1131
1132static inline void
1133e100_enable_rx(struct e100_serial *info)
1134{
1135#ifndef CONFIG_SVINTO_SIM
1136        /* enable the receiver */
1137        info->ioport[REG_REC_CTRL] =
1138                (info->rx_ctrl |= IO_MASK(R_SERIAL0_REC_CTRL, rec_enable));
1139#endif
1140}
1141
1142/* the rx DMA uses both the dma_descr and the dma_eop interrupts */
1143
1144static inline void
1145e100_disable_rxdma_irq(struct e100_serial *info)
1146{
1147#ifdef SERIAL_DEBUG_INTR
1148        printk("rxdma_irq(%d): 0\n",info->line);
1149#endif
1150        DINTR1(DEBUG_LOG(info->line,"IRQ disable_rxdma_irq %i\n", info->line));
1151        *R_IRQ_MASK2_CLR = (info->irq << 2) | (info->irq << 3);
1152}
1153
1154static inline void
1155e100_enable_rxdma_irq(struct e100_serial *info)
1156{
1157#ifdef SERIAL_DEBUG_INTR
1158        printk("rxdma_irq(%d): 1\n",info->line);
1159#endif
1160        DINTR1(DEBUG_LOG(info->line,"IRQ enable_rxdma_irq %i\n", info->line));
1161        *R_IRQ_MASK2_SET = (info->irq << 2) | (info->irq << 3);
1162}
1163
1164/* the tx DMA uses only dma_descr interrupt */
1165
1166static void e100_disable_txdma_irq(struct e100_serial *info)
1167{
1168#ifdef SERIAL_DEBUG_INTR
1169        printk("txdma_irq(%d): 0\n",info->line);
1170#endif
1171        DINTR1(DEBUG_LOG(info->line,"IRQ disable_txdma_irq %i\n", info->line));
1172        *R_IRQ_MASK2_CLR = info->irq;
1173}
1174
1175static void e100_enable_txdma_irq(struct e100_serial *info)
1176{
1177#ifdef SERIAL_DEBUG_INTR
1178        printk("txdma_irq(%d): 1\n",info->line);
1179#endif
1180        DINTR1(DEBUG_LOG(info->line,"IRQ enable_txdma_irq %i\n", info->line));
1181        *R_IRQ_MASK2_SET = info->irq;
1182}
1183
1184static void e100_disable_txdma_channel(struct e100_serial *info)
1185{
1186        unsigned long flags;
1187
1188        /* Disable output DMA channel for the serial port in question
1189         * ( set to something other than serialX)
1190         */
1191        local_irq_save(flags);
1192        DFLOW(DEBUG_LOG(info->line, "disable_txdma_channel %i\n", info->line));
1193        if (info->line == 0) {
1194                if ((genconfig_shadow & IO_MASK(R_GEN_CONFIG, dma6)) ==
1195                    IO_STATE(R_GEN_CONFIG, dma6, serial0)) {
1196                        genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma6);
1197                        genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma6, unused);
1198                }
1199        } else if (info->line == 1) {
1200                if ((genconfig_shadow & IO_MASK(R_GEN_CONFIG, dma8)) ==
1201                    IO_STATE(R_GEN_CONFIG, dma8, serial1)) {
1202                        genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma8);
1203                        genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma8, usb);
1204                }
1205        } else if (info->line == 2) {
1206                if ((genconfig_shadow & IO_MASK(R_GEN_CONFIG, dma2)) ==
1207                    IO_STATE(R_GEN_CONFIG, dma2, serial2)) {
1208                        genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma2);
1209                        genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma2, par0);
1210                }
1211        } else if (info->line == 3) {
1212                if ((genconfig_shadow & IO_MASK(R_GEN_CONFIG, dma4)) ==
1213                    IO_STATE(R_GEN_CONFIG, dma4, serial3)) {
1214                        genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma4);
1215                        genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma4, par1);
1216                }
1217        }
1218        *R_GEN_CONFIG = genconfig_shadow;
1219        local_irq_restore(flags);
1220}
1221
1222
1223static void e100_enable_txdma_channel(struct e100_serial *info)
1224{
1225        unsigned long flags;
1226
1227        local_irq_save(flags);
1228        DFLOW(DEBUG_LOG(info->line, "enable_txdma_channel %i\n", info->line));
1229        /* Enable output DMA channel for the serial port in question */
1230        if (info->line == 0) {
1231                genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma6);
1232                genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma6, serial0);
1233        } else if (info->line == 1) {
1234                genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma8);
1235                genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma8, serial1);
1236        } else if (info->line == 2) {
1237                genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma2);
1238                genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma2, serial2);
1239        } else if (info->line == 3) {
1240                genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma4);
1241                genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma4, serial3);
1242        }
1243        *R_GEN_CONFIG = genconfig_shadow;
1244        local_irq_restore(flags);
1245}
1246
1247static void e100_disable_rxdma_channel(struct e100_serial *info)
1248{
1249        unsigned long flags;
1250
1251        /* Disable input DMA channel for the serial port in question
1252         * ( set to something other than serialX)
1253         */
1254        local_irq_save(flags);
1255        if (info->line == 0) {
1256                if ((genconfig_shadow & IO_MASK(R_GEN_CONFIG, dma7)) ==
1257                    IO_STATE(R_GEN_CONFIG, dma7, serial0)) {
1258                        genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma7);
1259                        genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma7, unused);
1260                }
1261        } else if (info->line == 1) {
1262                if ((genconfig_shadow & IO_MASK(R_GEN_CONFIG, dma9)) ==
1263                    IO_STATE(R_GEN_CONFIG, dma9, serial1)) {
1264                        genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma9);
1265                        genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma9, usb);
1266                }
1267        } else if (info->line == 2) {
1268                if ((genconfig_shadow & IO_MASK(R_GEN_CONFIG, dma3)) ==
1269                    IO_STATE(R_GEN_CONFIG, dma3, serial2)) {
1270                        genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma3);
1271                        genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma3, par0);
1272                }
1273        } else if (info->line == 3) {
1274                if ((genconfig_shadow & IO_MASK(R_GEN_CONFIG, dma5)) ==
1275                    IO_STATE(R_GEN_CONFIG, dma5, serial3)) {
1276                        genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma5);
1277                        genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma5, par1);
1278                }
1279        }
1280        *R_GEN_CONFIG = genconfig_shadow;
1281        local_irq_restore(flags);
1282}
1283
1284
1285static void e100_enable_rxdma_channel(struct e100_serial *info)
1286{
1287        unsigned long flags;
1288
1289        local_irq_save(flags);
1290        /* Enable input DMA channel for the serial port in question */
1291        if (info->line == 0) {
1292                genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma7);
1293                genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma7, serial0);
1294        } else if (info->line == 1) {
1295                genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma9);
1296                genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma9, serial1);
1297        } else if (info->line == 2) {
1298                genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma3);
1299                genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma3, serial2);
1300        } else if (info->line == 3) {
1301                genconfig_shadow &=  ~IO_MASK(R_GEN_CONFIG, dma5);
1302                genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma5, serial3);
1303        }
1304        *R_GEN_CONFIG = genconfig_shadow;
1305        local_irq_restore(flags);
1306}
1307
1308#ifdef SERIAL_HANDLE_EARLY_ERRORS
1309/* in order to detect and fix errors on the first byte
1310   we have to use the serial interrupts as well. */
1311
1312static inline void
1313e100_disable_serial_data_irq(struct e100_serial *info)
1314{
1315#ifdef SERIAL_DEBUG_INTR
1316        printk("ser_irq(%d): 0\n",info->line);
1317#endif
1318        DINTR1(DEBUG_LOG(info->line,"IRQ disable data_irq %i\n", info->line));
1319        *R_IRQ_MASK1_CLR = (1U << (8+2*info->line));
1320}
1321
1322static inline void
1323e100_enable_serial_data_irq(struct e100_serial *info)
1324{
1325#ifdef SERIAL_DEBUG_INTR
1326        printk("ser_irq(%d): 1\n",info->line);
1327        printk("**** %d = %d\n",
1328               (8+2*info->line),
1329               (1U << (8+2*info->line)));
1330#endif
1331        DINTR1(DEBUG_LOG(info->line,"IRQ enable data_irq %i\n", info->line));
1332        *R_IRQ_MASK1_SET = (1U << (8+2*info->line));
1333}
1334#endif
1335
1336static inline void
1337e100_disable_serial_tx_ready_irq(struct e100_serial *info)
1338{
1339#ifdef SERIAL_DEBUG_INTR
1340        printk("ser_tx_irq(%d): 0\n",info->line);
1341#endif
1342        DINTR1(DEBUG_LOG(info->line,"IRQ disable ready_irq %i\n", info->line));
1343        *R_IRQ_MASK1_CLR = (1U << (8+1+2*info->line));
1344}
1345
1346static inline void
1347e100_enable_serial_tx_ready_irq(struct e100_serial *info)
1348{
1349#ifdef SERIAL_DEBUG_INTR
1350        printk("ser_tx_irq(%d): 1\n",info->line);
1351        printk("**** %d = %d\n",
1352               (8+1+2*info->line),
1353               (1U << (8+1+2*info->line)));
1354#endif
1355        DINTR2(DEBUG_LOG(info->line,"IRQ enable ready_irq %i\n", info->line));
1356        *R_IRQ_MASK1_SET = (1U << (8+1+2*info->line));
1357}
1358
1359static inline void e100_enable_rx_irq(struct e100_serial *info)
1360{
1361        if (info->uses_dma_in)
1362                e100_enable_rxdma_irq(info);
1363        else
1364                e100_enable_serial_data_irq(info);
1365}
1366static inline void e100_disable_rx_irq(struct e100_serial *info)
1367{
1368        if (info->uses_dma_in)
1369                e100_disable_rxdma_irq(info);
1370        else
1371                e100_disable_serial_data_irq(info);
1372}
1373
1374#if defined(CONFIG_ETRAX_RS485)
1375/* Enable RS-485 mode on selected port. This is UGLY. */
1376static int
1377e100_enable_rs485(struct tty_struct *tty, struct serial_rs485 *r)
1378{
1379        struct e100_serial * info = (struct e100_serial *)tty->driver_data;
1380
1381#if defined(CONFIG_ETRAX_RS485_ON_PA)
1382        *R_PORT_PA_DATA = port_pa_data_shadow |= (1 << rs485_pa_bit);
1383#endif
1384#if defined(CONFIG_ETRAX_RS485_ON_PORT_G)
1385        REG_SHADOW_SET(R_PORT_G_DATA,  port_g_data_shadow,
1386                       rs485_port_g_bit, 1);
1387#endif
1388#if defined(CONFIG_ETRAX_RS485_LTC1387)
1389        REG_SHADOW_SET(R_PORT_G_DATA, port_g_data_shadow,
1390                       CONFIG_ETRAX_RS485_LTC1387_DXEN_PORT_G_BIT, 1);
1391        REG_SHADOW_SET(R_PORT_G_DATA, port_g_data_shadow,
1392                       CONFIG_ETRAX_RS485_LTC1387_RXEN_PORT_G_BIT, 1);
1393#endif
1394
1395        info->rs485 = *r;
1396
1397        /* Maximum delay before RTS equal to 1000 */
1398        if (info->rs485.delay_rts_before_send >= 1000)
1399                info->rs485.delay_rts_before_send = 1000;
1400
1401/*      printk("rts: on send = %i, after = %i, enabled = %i",
1402                    info->rs485.rts_on_send,
1403                    info->rs485.rts_after_sent,
1404                    info->rs485.enabled
1405        );
1406*/
1407        return 0;
1408}
1409
1410static int
1411e100_write_rs485(struct tty_struct *tty,
1412                 const unsigned char *buf, int count)
1413{
1414        struct e100_serial * info = (struct e100_serial *)tty->driver_data;
1415        int old_value = (info->rs485.flags) & SER_RS485_ENABLED;
1416
1417        /* rs485 is always implicitly enabled if we're using the ioctl()
1418         * but it doesn't have to be set in the serial_rs485
1419         * (to be backward compatible with old apps)
1420         * So we store, set and restore it.
1421         */
1422        info->rs485.flags |= SER_RS485_ENABLED;
1423        /* rs_write now deals with RS485 if enabled */
1424        count = rs_write(tty, buf, count);
1425        if (!old_value)
1426                info->rs485.flags &= ~(SER_RS485_ENABLED);
1427        return count;
1428}
1429
1430#ifdef CONFIG_ETRAX_FAST_TIMER
1431/* Timer function to toggle RTS when using FAST_TIMER */
1432static void rs485_toggle_rts_timer_function(unsigned long data)
1433{
1434        struct e100_serial *info = (struct e100_serial *)data;
1435
1436        fast_timers_rs485[info->line].function = NULL;
1437        e100_rts(info, (info->rs485.flags & SER_RS485_RTS_AFTER_SEND));
1438#if defined(CONFIG_ETRAX_RS485_DISABLE_RECEIVER)
1439        e100_enable_rx(info);
1440        e100_enable_rx_irq(info);
1441#endif
1442}
1443#endif
1444#endif /* CONFIG_ETRAX_RS485 */
1445
1446/*
1447 * ------------------------------------------------------------
1448 * rs_stop() and rs_start()
1449 *
1450 * This routines are called before setting or resetting tty->stopped.
1451 * They enable or disable transmitter using the XOFF registers, as necessary.
1452 * ------------------------------------------------------------
1453 */
1454
1455static void
1456rs_stop(struct tty_struct *tty)
1457{
1458        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
1459        if (info) {
1460                unsigned long flags;
1461                unsigned long xoff;
1462
1463                local_irq_save(flags);
1464                DFLOW(DEBUG_LOG(info->line, "XOFF rs_stop xmit %i\n",
1465                                CIRC_CNT(info->xmit.head,
1466                                         info->xmit.tail,SERIAL_XMIT_SIZE)));
1467
1468                xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char,
1469                                STOP_CHAR(info->port.tty));
1470                xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, stop);
1471                if (tty->termios.c_iflag & IXON ) {
1472                        xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
1473                }
1474
1475                *((unsigned long *)&info->ioport[REG_XOFF]) = xoff;
1476                local_irq_restore(flags);
1477        }
1478}
1479
1480static void
1481rs_start(struct tty_struct *tty)
1482{
1483        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
1484        if (info) {
1485                unsigned long flags;
1486                unsigned long xoff;
1487
1488                local_irq_save(flags);
1489                DFLOW(DEBUG_LOG(info->line, "XOFF rs_start xmit %i\n",
1490                                CIRC_CNT(info->xmit.head,
1491                                         info->xmit.tail,SERIAL_XMIT_SIZE)));
1492                xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(tty));
1493                xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
1494                if (tty->termios.c_iflag & IXON ) {
1495                        xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
1496                }
1497
1498                *((unsigned long *)&info->ioport[REG_XOFF]) = xoff;
1499                if (!info->uses_dma_out &&
1500                    info->xmit.head != info->xmit.tail && info->xmit.buf)
1501                        e100_enable_serial_tx_ready_irq(info);
1502
1503                local_irq_restore(flags);
1504        }
1505}
1506
1507/*
1508 * ----------------------------------------------------------------------
1509 *
1510 * Here starts the interrupt handling routines.  All of the following
1511 * subroutines are declared as inline and are folded into
1512 * rs_interrupt().  They were separated out for readability's sake.
1513 *
1514 * Note: rs_interrupt() is a "fast" interrupt, which means that it
1515 * runs with interrupts turned off.  People who may want to modify
1516 * rs_interrupt() should try to keep the interrupt handler as fast as
1517 * possible.  After you are done making modifications, it is not a bad
1518 * idea to do:
1519 *
1520 * gcc -S -DKERNEL -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer serial.c
1521 *
1522 * and look at the resulting assemble code in serial.s.
1523 *
1524 *                              - Ted Ts'o (tytso@mit.edu), 7-Mar-93
1525 * -----------------------------------------------------------------------
1526 */
1527
1528/*
1529 * This routine is used by the interrupt handler to schedule
1530 * processing in the software interrupt portion of the driver.
1531 */
1532static void rs_sched_event(struct e100_serial *info, int event)
1533{
1534        if (info->event & (1 << event))
1535                return;
1536        info->event |= 1 << event;
1537        schedule_work(&info->work);
1538}
1539
1540/* The output DMA channel is free - use it to send as many chars as possible
1541 * NOTES:
1542 *   We don't pay attention to info->x_char, which means if the TTY wants to
1543 *   use XON/XOFF it will set info->x_char but we won't send any X char!
1544 *
1545 *   To implement this, we'd just start a DMA send of 1 byte pointing at a
1546 *   buffer containing the X char, and skip updating xmit. We'd also have to
1547 *   check if the last sent char was the X char when we enter this function
1548 *   the next time, to avoid updating xmit with the sent X value.
1549 */
1550
1551static void
1552transmit_chars_dma(struct e100_serial *info)
1553{
1554        unsigned int c, sentl;
1555        struct etrax_dma_descr *descr;
1556
1557#ifdef CONFIG_SVINTO_SIM
1558        /* This will output too little if tail is not 0 always since
1559         * we don't reloop to send the other part. Anyway this SHOULD be a
1560         * no-op - transmit_chars_dma would never really be called during sim
1561         * since rs_write does not write into the xmit buffer then.
1562         */
1563        if (info->xmit.tail)
1564                printk("Error in serial.c:transmit_chars-dma(), tail!=0\n");
1565        if (info->xmit.head != info->xmit.tail) {
1566                SIMCOUT(info->xmit.buf + info->xmit.tail,
1567                        CIRC_CNT(info->xmit.head,
1568                                 info->xmit.tail,
1569                                 SERIAL_XMIT_SIZE));
1570                info->xmit.head = info->xmit.tail;  /* move back head */
1571                info->tr_running = 0;
1572        }
1573        return;
1574#endif
1575        /* acknowledge both dma_descr and dma_eop irq in R_DMA_CHx_CLR_INTR */
1576        *info->oclrintradr =
1577                IO_STATE(R_DMA_CH6_CLR_INTR, clr_descr, do) |
1578                IO_STATE(R_DMA_CH6_CLR_INTR, clr_eop, do);
1579
1580#ifdef SERIAL_DEBUG_INTR
1581        if (info->line == SERIAL_DEBUG_LINE)
1582                printk("tc\n");
1583#endif
1584        if (!info->tr_running) {
1585                /* weirdo... we shouldn't get here! */
1586                printk(KERN_WARNING "Achtung: transmit_chars_dma with !tr_running\n");
1587                return;
1588        }
1589
1590        descr = &info->tr_descr;
1591
1592        /* first get the amount of bytes sent during the last DMA transfer,
1593           and update xmit accordingly */
1594
1595        /* if the stop bit was not set, all data has been sent */
1596        if (!(descr->status & d_stop)) {
1597                sentl = descr->sw_len;
1598        } else
1599                /* otherwise we find the amount of data sent here */
1600                sentl = descr->hw_len;
1601
1602        DFLOW(DEBUG_LOG(info->line, "TX %i done\n", sentl));
1603
1604        /* update stats */
1605        info->icount.tx += sentl;
1606
1607        /* update xmit buffer */
1608        info->xmit.tail = (info->xmit.tail + sentl) & (SERIAL_XMIT_SIZE - 1);
1609
1610        /* if there is only a few chars left in the buf, wake up the blocked
1611           write if any */
1612        if (CIRC_CNT(info->xmit.head,
1613                     info->xmit.tail,
1614                     SERIAL_XMIT_SIZE) < WAKEUP_CHARS)
1615                rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
1616
1617        /* find out the largest amount of consecutive bytes we want to send now */
1618
1619        c = CIRC_CNT_TO_END(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
1620
1621        /* Don't send all in one DMA transfer - divide it so we wake up
1622         * application before all is sent
1623         */
1624
1625        if (c >= 4*WAKEUP_CHARS)
1626                c = c/2;
1627
1628        if (c <= 0) {
1629                /* our job here is done, don't schedule any new DMA transfer */
1630                info->tr_running = 0;
1631
1632#if defined(CONFIG_ETRAX_RS485) && defined(CONFIG_ETRAX_FAST_TIMER)
1633                if (info->rs485.flags & SER_RS485_ENABLED) {
1634                        /* Set a short timer to toggle RTS */
1635                        start_one_shot_timer(&fast_timers_rs485[info->line],
1636                                             rs485_toggle_rts_timer_function,
1637                                             (unsigned long)info,
1638                                             info->char_time_usec*2,
1639                                             "RS-485");
1640                }
1641#endif /* RS485 */
1642                return;
1643        }
1644
1645        /* ok we can schedule a dma send of c chars starting at info->xmit.tail */
1646        /* set up the descriptor correctly for output */
1647        DFLOW(DEBUG_LOG(info->line, "TX %i\n", c));
1648        descr->ctrl = d_int | d_eol | d_wait; /* Wait needed for tty_wait_until_sent() */
1649        descr->sw_len = c;
1650        descr->buf = virt_to_phys(info->xmit.buf + info->xmit.tail);
1651        descr->status = 0;
1652
1653        *info->ofirstadr = virt_to_phys(descr); /* write to R_DMAx_FIRST */
1654        *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, start);
1655
1656        /* DMA is now running (hopefully) */
1657} /* transmit_chars_dma */
1658
1659static void
1660start_transmit(struct e100_serial *info)
1661{
1662#if 0
1663        if (info->line == SERIAL_DEBUG_LINE)
1664                printk("x\n");
1665#endif
1666
1667        info->tr_descr.sw_len = 0;
1668        info->tr_descr.hw_len = 0;
1669        info->tr_descr.status = 0;
1670        info->tr_running = 1;
1671        if (info->uses_dma_out)
1672                transmit_chars_dma(info);
1673        else
1674                e100_enable_serial_tx_ready_irq(info);
1675} /* start_transmit */
1676
1677#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
1678static int serial_fast_timer_started = 0;
1679static int serial_fast_timer_expired = 0;
1680static void flush_timeout_function(unsigned long data);
1681#define START_FLUSH_FAST_TIMER_TIME(info, string, usec) {\
1682  unsigned long timer_flags; \
1683  local_irq_save(timer_flags); \
1684  if (fast_timers[info->line].function == NULL) { \
1685    serial_fast_timer_started++; \
1686    TIMERD(DEBUG_LOG(info->line, "start_timer %i ", info->line)); \
1687    TIMERD(DEBUG_LOG(info->line, "num started: %i\n", serial_fast_timer_started)); \
1688    start_one_shot_timer(&fast_timers[info->line], \
1689                         flush_timeout_function, \
1690                         (unsigned long)info, \
1691                         (usec), \
1692                         string); \
1693  } \
1694  else { \
1695    TIMERD(DEBUG_LOG(info->line, "timer %i already running\n", info->line)); \
1696  } \
1697  local_irq_restore(timer_flags); \
1698}
1699#define START_FLUSH_FAST_TIMER(info, string) START_FLUSH_FAST_TIMER_TIME(info, string, info->flush_time_usec)
1700
1701#else
1702#define START_FLUSH_FAST_TIMER_TIME(info, string, usec)
1703#define START_FLUSH_FAST_TIMER(info, string)
1704#endif
1705
1706static struct etrax_recv_buffer *
1707alloc_recv_buffer(unsigned int size)
1708{
1709        struct etrax_recv_buffer *buffer;
1710
1711        if (!(buffer = kmalloc(sizeof *buffer + size, GFP_ATOMIC)))
1712                return NULL;
1713
1714        buffer->next = NULL;
1715        buffer->length = 0;
1716        buffer->error = TTY_NORMAL;
1717
1718        return buffer;
1719}
1720
1721static void
1722append_recv_buffer(struct e100_serial *info, struct etrax_recv_buffer *buffer)
1723{
1724        unsigned long flags;
1725
1726        local_irq_save(flags);
1727
1728        if (!info->first_recv_buffer)
1729                info->first_recv_buffer = buffer;
1730        else
1731                info->last_recv_buffer->next = buffer;
1732
1733        info->last_recv_buffer = buffer;
1734
1735        info->recv_cnt += buffer->length;
1736        if (info->recv_cnt > info->max_recv_cnt)
1737                info->max_recv_cnt = info->recv_cnt;
1738
1739        local_irq_restore(flags);
1740}
1741
1742static int
1743add_char_and_flag(struct e100_serial *info, unsigned char data, unsigned char flag)
1744{
1745        struct etrax_recv_buffer *buffer;
1746        if (info->uses_dma_in) {
1747                if (!(buffer = alloc_recv_buffer(4)))
1748                        return 0;
1749
1750                buffer->length = 1;
1751                buffer->error = flag;
1752                buffer->buffer[0] = data;
1753
1754                append_recv_buffer(info, buffer);
1755
1756                info->icount.rx++;
1757        } else {
1758                tty_insert_flip_char(&info->port, data, flag);
1759                info->icount.rx++;
1760        }
1761
1762        return 1;
1763}
1764
1765static unsigned int handle_descr_data(struct e100_serial *info,
1766                                      struct etrax_dma_descr *descr,
1767                                      unsigned int recvl)
1768{
1769        struct etrax_recv_buffer *buffer = phys_to_virt(descr->buf) - sizeof *buffer;
1770
1771        if (info->recv_cnt + recvl > 65536) {
1772                printk(KERN_WARNING
1773                       "%s: Too much pending incoming serial data! Dropping %u bytes.\n", __func__, recvl);
1774                return 0;
1775        }
1776
1777        buffer->length = recvl;
1778
1779        if (info->errorcode == ERRCODE_SET_BREAK)
1780                buffer->error = TTY_BREAK;
1781        info->errorcode = 0;
1782
1783        append_recv_buffer(info, buffer);
1784
1785        if (!(buffer = alloc_recv_buffer(SERIAL_DESCR_BUF_SIZE)))
1786                panic("%s: Failed to allocate memory for receive buffer!\n", __func__);
1787
1788        descr->buf = virt_to_phys(buffer->buffer);
1789
1790        return recvl;
1791}
1792
1793static unsigned int handle_all_descr_data(struct e100_serial *info)
1794{
1795        struct etrax_dma_descr *descr;
1796        unsigned int recvl;
1797        unsigned int ret = 0;
1798
1799        while (1)
1800        {
1801                descr = &info->rec_descr[info->cur_rec_descr];
1802
1803                if (descr == phys_to_virt(*info->idescradr))
1804                        break;
1805
1806                if (++info->cur_rec_descr == SERIAL_RECV_DESCRIPTORS)
1807                        info->cur_rec_descr = 0;
1808
1809                /* find out how many bytes were read */
1810
1811                /* if the eop bit was not set, all data has been received */
1812                if (!(descr->status & d_eop)) {
1813                        recvl = descr->sw_len;
1814                } else {
1815                        /* otherwise we find the amount of data received here */
1816                        recvl = descr->hw_len;
1817                }
1818
1819                /* Reset the status information */
1820                descr->status = 0;
1821
1822                DFLOW(  DEBUG_LOG(info->line, "RX %lu\n", recvl);
1823                        if (info->port.tty->stopped) {
1824                                unsigned char *buf = phys_to_virt(descr->buf);
1825                                DEBUG_LOG(info->line, "rx 0x%02X\n", buf[0]);
1826                                DEBUG_LOG(info->line, "rx 0x%02X\n", buf[1]);
1827                                DEBUG_LOG(info->line, "rx 0x%02X\n", buf[2]);
1828                        }
1829                        );
1830
1831                /* update stats */
1832                info->icount.rx += recvl;
1833
1834                ret += handle_descr_data(info, descr, recvl);
1835        }
1836
1837        return ret;
1838}
1839
1840static void receive_chars_dma(struct e100_serial *info)
1841{
1842        struct tty_struct *tty;
1843        unsigned char rstat;
1844
1845#ifdef CONFIG_SVINTO_SIM
1846        /* No receive in the simulator.  Will probably be when the rest of
1847         * the serial interface works, and this piece will just be removed.
1848         */
1849        return;
1850#endif
1851
1852        /* Acknowledge both dma_descr and dma_eop irq in R_DMA_CHx_CLR_INTR */
1853        *info->iclrintradr =
1854                IO_STATE(R_DMA_CH6_CLR_INTR, clr_descr, do) |
1855                IO_STATE(R_DMA_CH6_CLR_INTR, clr_eop, do);
1856
1857        tty = info->port.tty;
1858        if (!tty) /* Something wrong... */
1859                return;
1860
1861#ifdef SERIAL_HANDLE_EARLY_ERRORS
1862        if (info->uses_dma_in)
1863                e100_enable_serial_data_irq(info);
1864#endif
1865
1866        if (info->errorcode == ERRCODE_INSERT_BREAK)
1867                add_char_and_flag(info, '\0', TTY_BREAK);
1868
1869        handle_all_descr_data(info);
1870
1871        /* Read the status register to detect errors */
1872        rstat = info->ioport[REG_STATUS];
1873        if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) {
1874                DFLOW(DEBUG_LOG(info->line, "XOFF detect stat %x\n", rstat));
1875        }
1876
1877        if (rstat & SER_ERROR_MASK) {
1878                /* If we got an error, we must reset it by reading the
1879                 * data_in field
1880                 */
1881                unsigned char data = info->ioport[REG_DATA];
1882
1883                PROCSTAT(ser_stat[info->line].errors_cnt++);
1884                DEBUG_LOG(info->line, "#dERR: s d 0x%04X\n",
1885                          ((rstat & SER_ERROR_MASK) << 8) | data);
1886
1887                if (rstat & SER_PAR_ERR_MASK)
1888                        add_char_and_flag(info, data, TTY_PARITY);
1889                else if (rstat & SER_OVERRUN_MASK)
1890                        add_char_and_flag(info, data, TTY_OVERRUN);
1891                else if (rstat & SER_FRAMING_ERR_MASK)
1892                        add_char_and_flag(info, data, TTY_FRAME);
1893        }
1894
1895        START_FLUSH_FAST_TIMER(info, "receive_chars");
1896
1897        /* Restart the receiving DMA */
1898        *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, restart);
1899}
1900
1901static int start_recv_dma(struct e100_serial *info)
1902{
1903        struct etrax_dma_descr *descr = info->rec_descr;
1904        struct etrax_recv_buffer *buffer;
1905        int i;
1906
1907        /* Set up the receiving descriptors */
1908        for (i = 0; i < SERIAL_RECV_DESCRIPTORS; i++) {
1909                if (!(buffer = alloc_recv_buffer(SERIAL_DESCR_BUF_SIZE)))
1910                        panic("%s: Failed to allocate memory for receive buffer!\n", __func__);
1911
1912                descr[i].ctrl = d_int;
1913                descr[i].buf = virt_to_phys(buffer->buffer);
1914                descr[i].sw_len = SERIAL_DESCR_BUF_SIZE;
1915                descr[i].hw_len = 0;
1916                descr[i].status = 0;
1917                descr[i].next = virt_to_phys(&descr[i+1]);
1918        }
1919
1920        /* Link the last descriptor to the first */
1921        descr[i-1].next = virt_to_phys(&descr[0]);
1922
1923        /* Start with the first descriptor in the list */
1924        info->cur_rec_descr = 0;
1925
1926        /* Start the DMA */
1927        *info->ifirstadr = virt_to_phys(&descr[info->cur_rec_descr]);
1928        *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, start);
1929
1930        /* Input DMA should be running now */
1931        return 1;
1932}
1933
1934static void
1935start_receive(struct e100_serial *info)
1936{
1937#ifdef CONFIG_SVINTO_SIM
1938        /* No receive in the simulator.  Will probably be when the rest of
1939         * the serial interface works, and this piece will just be removed.
1940         */
1941        return;
1942#endif
1943        if (info->uses_dma_in) {
1944                /* reset the input dma channel to be sure it works */
1945
1946                *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
1947                while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) ==
1948                       IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
1949
1950                start_recv_dma(info);
1951        }
1952}
1953
1954
1955/* the bits in the MASK2 register are laid out like this:
1956   DMAI_EOP DMAI_DESCR DMAO_EOP DMAO_DESCR
1957   where I is the input channel and O is the output channel for the port.
1958   info->irq is the bit number for the DMAO_DESCR so to check the others we
1959   shift info->irq to the left.
1960*/
1961
1962/* dma output channel interrupt handler
1963   this interrupt is called from DMA2(ser2), DMA4(ser3), DMA6(ser0) or
1964   DMA8(ser1) when they have finished a descriptor with the intr flag set.
1965*/
1966
1967static irqreturn_t
1968tr_interrupt(int irq, void *dev_id)
1969{
1970        struct e100_serial *info;
1971        unsigned long ireg;
1972        int i;
1973        int handled = 0;
1974
1975#ifdef CONFIG_SVINTO_SIM
1976        /* No receive in the simulator.  Will probably be when the rest of
1977         * the serial interface works, and this piece will just be removed.
1978         */
1979        {
1980                const char *s = "What? tr_interrupt in simulator??\n";
1981                SIMCOUT(s,strlen(s));
1982        }
1983        return IRQ_HANDLED;
1984#endif
1985
1986        /* find out the line that caused this irq and get it from rs_table */
1987
1988        ireg = *R_IRQ_MASK2_RD;  /* get the active irq bits for the dma channels */
1989
1990        for (i = 0; i < NR_PORTS; i++) {
1991                info = rs_table + i;
1992                if (!info->enabled || !info->uses_dma_out)
1993                        continue;
1994                /* check for dma_descr (don't need to check for dma_eop in output dma for serial */
1995                if (ireg & info->irq) {
1996                        handled = 1;
1997                        /* we can send a new dma bunch. make it so. */
1998                        DINTR2(DEBUG_LOG(info->line, "tr_interrupt %i\n", i));
1999                        /* Read jiffies_usec first,
2000                         * we want this time to be as late as possible
2001                         */
2002                        PROCSTAT(ser_stat[info->line].tx_dma_ints++);
2003                        info->last_tx_active_usec = GET_JIFFIES_USEC();
2004                        info->last_tx_active = jiffies;
2005                        transmit_chars_dma(info);
2006                }
2007
2008                /* FIXME: here we should really check for a change in the
2009                   status lines and if so call status_handle(info) */
2010        }
2011        return IRQ_RETVAL(handled);
2012} /* tr_interrupt */
2013
2014/* dma input channel interrupt handler */
2015
2016static irqreturn_t
2017rec_interrupt(int irq, void *dev_id)
2018{
2019        struct e100_serial *info;
2020        unsigned long ireg;
2021        int i;
2022        int handled = 0;
2023
2024#ifdef CONFIG_SVINTO_SIM
2025        /* No receive in the simulator.  Will probably be when the rest of
2026         * the serial interface works, and this piece will just be removed.
2027         */
2028        {
2029                const char *s = "What? rec_interrupt in simulator??\n";
2030                SIMCOUT(s,strlen(s));
2031        }
2032        return IRQ_HANDLED;
2033#endif
2034
2035        /* find out the line that caused this irq and get it from rs_table */
2036
2037        ireg = *R_IRQ_MASK2_RD;  /* get the active irq bits for the dma channels */
2038
2039        for (i = 0; i < NR_PORTS; i++) {
2040                info = rs_table + i;
2041                if (!info->enabled || !info->uses_dma_in)
2042                        continue;
2043                /* check for both dma_eop and dma_descr for the input dma channel */
2044                if (ireg & ((info->irq << 2) | (info->irq << 3))) {
2045                        handled = 1;
2046                        /* we have received something */
2047                        receive_chars_dma(info);
2048                }
2049
2050                /* FIXME: here we should really check for a change in the
2051                   status lines and if so call status_handle(info) */
2052        }
2053        return IRQ_RETVAL(handled);
2054} /* rec_interrupt */
2055
2056static int force_eop_if_needed(struct e100_serial *info)
2057{
2058        /* We check data_avail bit to determine if data has
2059         * arrived since last time
2060         */
2061        unsigned char rstat = info->ioport[REG_STATUS];
2062
2063        /* error or datavail? */
2064        if (rstat & SER_ERROR_MASK) {
2065                /* Some error has occurred. If there has been valid data, an
2066                 * EOP interrupt will be made automatically. If no data, the
2067                 * normal ser_interrupt should be enabled and handle it.
2068                 * So do nothing!
2069                 */
2070                DEBUG_LOG(info->line, "timeout err: rstat 0x%03X\n",
2071                          rstat | (info->line << 8));
2072                return 0;
2073        }
2074
2075        if (rstat & SER_DATA_AVAIL_MASK) {
2076                /* Ok data, no error, count it */
2077                TIMERD(DEBUG_LOG(info->line, "timeout: rstat 0x%03X\n",
2078                          rstat | (info->line << 8)));
2079                /* Read data to clear status flags */
2080                (void)info->ioport[REG_DATA];
2081
2082                info->forced_eop = 0;
2083                START_FLUSH_FAST_TIMER(info, "magic");
2084                return 0;
2085        }
2086
2087        /* hit the timeout, force an EOP for the input
2088         * dma channel if we haven't already
2089         */
2090        if (!info->forced_eop) {
2091                info->forced_eop = 1;
2092                PROCSTAT(ser_stat[info->line].timeout_flush_cnt++);
2093                TIMERD(DEBUG_LOG(info->line, "timeout EOP %i\n", info->line));
2094                FORCE_EOP(info);
2095        }
2096
2097        return 1;
2098}
2099
2100static void flush_to_flip_buffer(struct e100_serial *info)
2101{
2102        struct etrax_recv_buffer *buffer;
2103        unsigned long flags;
2104
2105        local_irq_save(flags);
2106
2107        while ((buffer = info->first_recv_buffer) != NULL) {
2108                unsigned int count = buffer->length;
2109
2110                tty_insert_flip_string(&info->port, buffer->buffer, count);
2111                info->recv_cnt -= count;
2112
2113                if (count == buffer->length) {
2114                        info->first_recv_buffer = buffer->next;
2115                        kfree(buffer);
2116                } else {
2117                        buffer->length -= count;
2118                        memmove(buffer->buffer, buffer->buffer + count, buffer->length);
2119                        buffer->error = TTY_NORMAL;
2120                }
2121        }
2122
2123        if (!info->first_recv_buffer)
2124                info->last_recv_buffer = NULL;
2125
2126        local_irq_restore(flags);
2127
2128        /* This includes a check for low-latency */
2129        tty_flip_buffer_push(&info->port);
2130}
2131
2132static void check_flush_timeout(struct e100_serial *info)
2133{
2134        /* Flip what we've got (if we can) */
2135        flush_to_flip_buffer(info);
2136
2137        /* We might need to flip later, but not to fast
2138         * since the system is busy processing input... */
2139        if (info->first_recv_buffer)
2140                START_FLUSH_FAST_TIMER_TIME(info, "flip", 2000);
2141
2142        /* Force eop last, since data might have come while we're processing
2143         * and if we started the slow timer above, we won't start a fast
2144         * below.
2145         */
2146        force_eop_if_needed(info);
2147}
2148
2149#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
2150static void flush_timeout_function(unsigned long data)
2151{
2152        struct e100_serial *info = (struct e100_serial *)data;
2153
2154        fast_timers[info->line].function = NULL;
2155        serial_fast_timer_expired++;
2156        TIMERD(DEBUG_LOG(info->line, "flush_timout %i ", info->line));
2157        TIMERD(DEBUG_LOG(info->line, "num expired: %i\n", serial_fast_timer_expired));
2158        check_flush_timeout(info);
2159}
2160
2161#else
2162
2163/* dma fifo/buffer timeout handler
2164   forces an end-of-packet for the dma input channel if no chars
2165   have been received for CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS/100 s.
2166*/
2167
2168static struct timer_list flush_timer;
2169
2170static void
2171timed_flush_handler(unsigned long ptr)
2172{
2173        struct e100_serial *info;
2174        int i;
2175
2176#ifdef CONFIG_SVINTO_SIM
2177        return;
2178#endif
2179
2180        for (i = 0; i < NR_PORTS; i++) {
2181                info = rs_table + i;
2182                if (info->uses_dma_in)
2183                        check_flush_timeout(info);
2184        }
2185
2186        /* restart flush timer */
2187        mod_timer(&flush_timer, jiffies + CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS);
2188}
2189#endif
2190
2191#ifdef SERIAL_HANDLE_EARLY_ERRORS
2192
2193/* If there is an error (ie break) when the DMA is running and
2194 * there are no bytes in the fifo the DMA is stopped and we get no
2195 * eop interrupt. Thus we have to monitor the first bytes on a DMA
2196 * transfer, and if it is without error we can turn the serial
2197 * interrupts off.
2198 */
2199
2200/*
2201BREAK handling on ETRAX 100:
2202ETRAX will generate interrupt although there is no stop bit between the
2203characters.
2204
2205Depending on how long the break sequence is, the end of the breaksequence
2206will look differently:
2207| indicates start/end of a character.
2208
2209B= Break character (0x00) with framing error.
2210E= Error byte with parity error received after B characters.
2211F= "Faked" valid byte received immediately after B characters.
2212V= Valid byte
2213
22141.
2215    B          BL         ___________________________ V
2216.._|__________|__________|                           |valid data |
2217
2218Multiple frame errors with data == 0x00 (B),
2219the timing matches up "perfectly" so no extra ending char is detected.
2220The RXD pin is 1 in the last interrupt, in that case
2221we set info->errorcode = ERRCODE_INSERT_BREAK, but we can't really
2222know if another byte will come and this really is case 2. below
2223(e.g F=0xFF or 0xFE)
2224If RXD pin is 0 we can expect another character (see 2. below).
2225
2226
22272.
2228
2229    B          B          E or F__________________..__ V
2230.._|__________|__________|______    |                 |valid data
2231                          "valid" or
2232                          parity error
2233
2234Multiple frame errors with data == 0x00 (B),
2235but the part of the break trigs is interpreted as a start bit (and possibly
2236some 0 bits followed by a number of 1 bits and a stop bit).
2237Depending on parity settings etc. this last character can be either
2238a fake "valid" char (F) or have a parity error (E).
2239
2240If the character is valid it will be put in the buffer,
2241we set info->errorcode = ERRCODE_SET_BREAK so the receive interrupt
2242will set the flags so the tty will handle it,
2243if it's an error byte it will not be put in the buffer
2244and we set info->errorcode = ERRCODE_INSERT_BREAK.
2245
2246To distinguish a V byte in 1. from an F byte in 2. we keep a timestamp
2247of the last faulty char (B) and compares it with the current time:
2248If the time elapsed time is less then 2*char_time_usec we will assume
2249it's a faked F char and not a Valid char and set
2250info->errorcode = ERRCODE_SET_BREAK.
2251
2252Flaws in the above solution:
2253~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2254We use the timer to distinguish a F character from a V character,
2255if a V character is to close after the break we might make the wrong decision.
2256
2257TODO: The break will be delayed until an F or V character is received.
2258
2259*/
2260
2261static void handle_ser_rx_interrupt_no_dma(struct e100_serial *info)
2262{
2263        unsigned long data_read;
2264
2265        /* Read data and status at the same time */
2266        data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]);
2267more_data:
2268        if (data_read & IO_MASK(R_SERIAL0_READ, xoff_detect) ) {
2269                DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0));
2270        }
2271        DINTR2(DEBUG_LOG(info->line, "ser_rx   %c\n", IO_EXTRACT(R_SERIAL0_READ, data_in, data_read)));
2272
2273        if (data_read & ( IO_MASK(R_SERIAL0_READ, framing_err) |
2274                          IO_MASK(R_SERIAL0_READ, par_err) |
2275                          IO_MASK(R_SERIAL0_READ, overrun) )) {
2276                /* An error */
2277                info->last_rx_active_usec = GET_JIFFIES_USEC();
2278                info->last_rx_active = jiffies;
2279                DINTR1(DEBUG_LOG(info->line, "ser_rx err stat_data %04X\n", data_read));
2280                DLOG_INT_TRIG(
2281                if (!log_int_trig1_pos) {
2282                        log_int_trig1_pos = log_int_pos;
2283                        log_int(rdpc(), 0, 0);
2284                }
2285                );
2286
2287
2288                if ( ((data_read & IO_MASK(R_SERIAL0_READ, data_in)) == 0) &&
2289                     (data_read & IO_MASK(R_SERIAL0_READ, framing_err)) ) {
2290                        /* Most likely a break, but we get interrupts over and
2291                         * over again.
2292                         */
2293
2294                        if (!info->break_detected_cnt) {
2295                                DEBUG_LOG(info->line, "#BRK start\n", 0);
2296                        }
2297                        if (data_read & IO_MASK(R_SERIAL0_READ, rxd)) {
2298                                /* The RX pin is high now, so the break
2299                                 * must be over, but....
2300                                 * we can't really know if we will get another
2301                                 * last byte ending the break or not.
2302                                 * And we don't know if the byte (if any) will
2303                                 * have an error or look valid.
2304                                 */
2305                                DEBUG_LOG(info->line, "# BL BRK\n", 0);
2306                                info->errorcode = ERRCODE_INSERT_BREAK;
2307                        }
2308                        info->break_detected_cnt++;
2309                } else {
2310                        /* The error does not look like a break, but could be
2311                         * the end of one
2312                         */
2313                        if (info->break_detected_cnt) {
2314                                DEBUG_LOG(info->line, "EBRK %i\n", info->break_detected_cnt);
2315                                info->errorcode = ERRCODE_INSERT_BREAK;
2316                        } else {
2317                                unsigned char data = IO_EXTRACT(R_SERIAL0_READ,
2318                                        data_in, data_read);
2319                                char flag = TTY_NORMAL;
2320                                if (info->errorcode == ERRCODE_INSERT_BREAK) {
2321                                        tty_insert_flip_char(&info->port, 0, flag);
2322                                        info->icount.rx++;
2323                                }
2324
2325                                if (data_read & IO_MASK(R_SERIAL0_READ, par_err)) {
2326                                        info->icount.parity++;
2327                                        flag = TTY_PARITY;
2328                                } else if (data_read & IO_MASK(R_SERIAL0_READ, overrun)) {
2329                                        info->icount.overrun++;
2330                                        flag = TTY_OVERRUN;
2331                                } else if (data_read & IO_MASK(R_SERIAL0_READ, framing_err)) {
2332                                        info->icount.frame++;
2333                                        flag = TTY_FRAME;
2334                                }
2335                                tty_insert_flip_char(&info->port, data, flag);
2336                                info->errorcode = 0;
2337                        }
2338                        info->break_detected_cnt = 0;
2339                }
2340        } else if (data_read & IO_MASK(R_SERIAL0_READ, data_avail)) {
2341                /* No error */
2342                DLOG_INT_TRIG(
2343                if (!log_int_trig1_pos) {
2344                        if (log_int_pos >= log_int_size) {
2345                                log_int_pos = 0;
2346                        }
2347                        log_int_trig0_pos = log_int_pos;
2348                        log_int(rdpc(), 0, 0);
2349                }
2350                );
2351                tty_insert_flip_char(&info->port,
2352                        IO_EXTRACT(R_SERIAL0_READ, data_in, data_read),
2353                        TTY_NORMAL);
2354        } else {
2355                DEBUG_LOG(info->line, "ser_rx int but no data_avail  %08lX\n", data_read);
2356        }
2357
2358
2359        info->icount.rx++;
2360        data_read = *((unsigned long *)&info->ioport[REG_DATA_STATUS32]);
2361        if (data_read & IO_MASK(R_SERIAL0_READ, data_avail)) {
2362                DEBUG_LOG(info->line, "ser_rx   %c in loop\n", IO_EXTRACT(R_SERIAL0_READ, data_in, data_read));
2363                goto more_data;
2364        }
2365
2366        tty_flip_buffer_push(&info->port);
2367}
2368
2369static void handle_ser_rx_interrupt(struct e100_serial *info)
2370{
2371        unsigned char rstat;
2372
2373#ifdef SERIAL_DEBUG_INTR
2374        printk("Interrupt from serport %d\n", i);
2375#endif
2376/*      DEBUG_LOG(info->line, "ser_interrupt stat %03X\n", rstat | (i << 8)); */
2377        if (!info->uses_dma_in) {
2378                handle_ser_rx_interrupt_no_dma(info);
2379                return;
2380        }
2381        /* DMA is used */
2382        rstat = info->ioport[REG_STATUS];
2383        if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect) ) {
2384                DFLOW(DEBUG_LOG(info->line, "XOFF detect\n", 0));
2385        }
2386
2387        if (rstat & SER_ERROR_MASK) {
2388                unsigned char data;
2389
2390                info->last_rx_active_usec = GET_JIFFIES_USEC();
2391                info->last_rx_active = jiffies;
2392                /* If we got an error, we must reset it by reading the
2393                 * data_in field
2394                 */
2395                data = info->ioport[REG_DATA];
2396                DINTR1(DEBUG_LOG(info->line, "ser_rx!  %c\n", data));
2397                DINTR1(DEBUG_LOG(info->line, "ser_rx err stat %02X\n", rstat));
2398                if (!data && (rstat & SER_FRAMING_ERR_MASK)) {
2399                        /* Most likely a break, but we get interrupts over and
2400                         * over again.
2401                         */
2402
2403                        if (!info->break_detected_cnt) {
2404                                DEBUG_LOG(info->line, "#BRK start\n", 0);
2405                        }
2406                        if (rstat & SER_RXD_MASK) {
2407                                /* The RX pin is high now, so the break
2408                                 * must be over, but....
2409                                 * we can't really know if we will get another
2410                                 * last byte ending the break or not.
2411                                 * And we don't know if the byte (if any) will
2412                                 * have an error or look valid.
2413                                 */
2414                                DEBUG_LOG(info->line, "# BL BRK\n", 0);
2415                                info->errorcode = ERRCODE_INSERT_BREAK;
2416                        }
2417                        info->break_detected_cnt++;
2418                } else {
2419                        /* The error does not look like a break, but could be
2420                         * the end of one
2421                         */
2422                        if (info->break_detected_cnt) {
2423                                DEBUG_LOG(info->line, "EBRK %i\n", info->break_detected_cnt);
2424                                info->errorcode = ERRCODE_INSERT_BREAK;
2425                        } else {
2426                                if (info->errorcode == ERRCODE_INSERT_BREAK) {
2427                                        info->icount.brk++;
2428                                        add_char_and_flag(info, '\0', TTY_BREAK);
2429                                }
2430
2431                                if (rstat & SER_PAR_ERR_MASK) {
2432                                        info->icount.parity++;
2433                                        add_char_and_flag(info, data, TTY_PARITY);
2434                                } else if (rstat & SER_OVERRUN_MASK) {
2435                                        info->icount.overrun++;
2436                                        add_char_and_flag(info, data, TTY_OVERRUN);
2437                                } else if (rstat & SER_FRAMING_ERR_MASK) {
2438                                        info->icount.frame++;
2439                                        add_char_and_flag(info, data, TTY_FRAME);
2440                                }
2441
2442                                info->errorcode = 0;
2443                        }
2444                        info->break_detected_cnt = 0;
2445                        DEBUG_LOG(info->line, "#iERR s d %04X\n",
2446                                  ((rstat & SER_ERROR_MASK) << 8) | data);
2447                }
2448                PROCSTAT(ser_stat[info->line].early_errors_cnt++);
2449        } else { /* It was a valid byte, now let the DMA do the rest */
2450                unsigned long curr_time_u = GET_JIFFIES_USEC();
2451                unsigned long curr_time = jiffies;
2452
2453                if (info->break_detected_cnt) {
2454                        /* Detect if this character is a new valid char or the
2455                         * last char in a break sequence: If LSBits are 0 and
2456                         * MSBits are high AND the time is close to the
2457                         * previous interrupt we should discard it.
2458                         */
2459                        long elapsed_usec =
2460                          (curr_time - info->last_rx_active) * (1000000/HZ) +
2461                          curr_time_u - info->last_rx_active_usec;
2462                        if (elapsed_usec < 2*info->char_time_usec) {
2463                                DEBUG_LOG(info->line, "FBRK %i\n", info->line);
2464                                /* Report as BREAK (error) and let
2465                                 * receive_chars_dma() handle it
2466                                 */
2467                                info->errorcode = ERRCODE_SET_BREAK;
2468                        } else {
2469                                DEBUG_LOG(info->line, "Not end of BRK (V)%i\n", info->line);
2470                        }
2471                        DEBUG_LOG(info->line, "num brk %i\n", info->break_detected_cnt);
2472                }
2473
2474#ifdef SERIAL_DEBUG_INTR
2475                printk("** OK, disabling ser_interrupts\n");
2476#endif
2477                e100_disable_serial_data_irq(info);
2478                DINTR2(DEBUG_LOG(info->line, "ser_rx OK %d\n", info->line));
2479                info->break_detected_cnt = 0;
2480
2481                PROCSTAT(ser_stat[info->line].ser_ints_ok_cnt++);
2482        }
2483        /* Restarting the DMA never hurts */
2484        *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, restart);
2485        START_FLUSH_FAST_TIMER(info, "ser_int");
2486} /* handle_ser_rx_interrupt */
2487
2488static void handle_ser_tx_interrupt(struct e100_serial *info)
2489{
2490        unsigned long flags;
2491
2492        if (info->x_char) {
2493                unsigned char rstat;
2494                DFLOW(DEBUG_LOG(info->line, "tx_int: xchar 0x%02X\n", info->x_char));
2495                local_irq_save(flags);
2496                rstat = info->ioport[REG_STATUS];
2497                DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat));
2498
2499                info->ioport[REG_TR_DATA] = info->x_char;
2500                info->icount.tx++;
2501                info->x_char = 0;
2502                /* We must enable since it is disabled in ser_interrupt */
2503                e100_enable_serial_tx_ready_irq(info);
2504                local_irq_restore(flags);
2505                return;
2506        }
2507        if (info->uses_dma_out) {
2508                unsigned char rstat;
2509                int i;
2510                /* We only use normal tx interrupt when sending x_char */
2511                DFLOW(DEBUG_LOG(info->line, "tx_int: xchar sent\n", 0));
2512                local_irq_save(flags);
2513                rstat = info->ioport[REG_STATUS];
2514                DFLOW(DEBUG_LOG(info->line, "stat %x\n", rstat));
2515                e100_disable_serial_tx_ready_irq(info);
2516                if (info->port.tty->stopped)
2517                        rs_stop(info->port.tty);
2518                /* Enable the DMA channel and tell it to continue */
2519                e100_enable_txdma_channel(info);
2520                /* Wait 12 cycles before doing the DMA command */
2521                for(i = 6;  i > 0; i--)
2522                        nop();
2523
2524                *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, continue);
2525                local_irq_restore(flags);
2526                return;
2527        }
2528        /* Normal char-by-char interrupt */
2529        if (info->xmit.head == info->xmit.tail
2530            || info->port.tty->stopped) {
2531                DFLOW(DEBUG_LOG(info->line, "tx_int: stopped %i\n",
2532                                info->port.tty->stopped));
2533                e100_disable_serial_tx_ready_irq(info);
2534                info->tr_running = 0;
2535                return;
2536        }
2537        DINTR2(DEBUG_LOG(info->line, "tx_int %c\n", info->xmit.buf[info->xmit.tail]));
2538        /* Send a byte, rs485 timing is critical so turn of ints */
2539        local_irq_save(flags);
2540        info->ioport[REG_TR_DATA] = info->xmit.buf[info->xmit.tail];
2541        info->xmit.tail = (info->xmit.tail + 1) & (SERIAL_XMIT_SIZE-1);
2542        info->icount.tx++;
2543        if (info->xmit.head == info->xmit.tail) {
2544#if defined(CONFIG_ETRAX_RS485) && defined(CONFIG_ETRAX_FAST_TIMER)
2545                if (info->rs485.flags & SER_RS485_ENABLED) {
2546                        /* Set a short timer to toggle RTS */
2547                        start_one_shot_timer(&fast_timers_rs485[info->line],
2548                                             rs485_toggle_rts_timer_function,
2549                                             (unsigned long)info,
2550                                             info->char_time_usec*2,
2551                                             "RS-485");
2552                }
2553#endif /* RS485 */
2554                info->last_tx_active_usec = GET_JIFFIES_USEC();
2555                info->last_tx_active = jiffies;
2556                e100_disable_serial_tx_ready_irq(info);
2557                info->tr_running = 0;
2558                DFLOW(DEBUG_LOG(info->line, "tx_int: stop2\n", 0));
2559        } else {
2560                /* We must enable since it is disabled in ser_interrupt */
2561                e100_enable_serial_tx_ready_irq(info);
2562        }
2563        local_irq_restore(flags);
2564
2565        if (CIRC_CNT(info->xmit.head,
2566                     info->xmit.tail,
2567                     SERIAL_XMIT_SIZE) < WAKEUP_CHARS)
2568                rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
2569
2570} /* handle_ser_tx_interrupt */
2571
2572/* result of time measurements:
2573 * RX duration 54-60 us when doing something, otherwise 6-9 us
2574 * ser_int duration: just sending: 8-15 us normally, up to 73 us
2575 */
2576static irqreturn_t
2577ser_interrupt(int irq, void *dev_id)
2578{
2579        static volatile int tx_started = 0;
2580        struct e100_serial *info;
2581        int i;
2582        unsigned long flags;
2583        unsigned long irq_mask1_rd;
2584        unsigned long data_mask = (1 << (8+2*0)); /* ser0 data_avail */
2585        int handled = 0;
2586        static volatile unsigned long reentered_ready_mask = 0;
2587
2588        local_irq_save(flags);
2589        irq_mask1_rd = *R_IRQ_MASK1_RD;
2590        /* First handle all rx interrupts with ints disabled */
2591        info = rs_table;
2592        irq_mask1_rd &= e100_ser_int_mask;
2593        for (i = 0; i < NR_PORTS; i++) {
2594                /* Which line caused the data irq? */
2595                if (irq_mask1_rd & data_mask) {
2596                        handled = 1;
2597                        handle_ser_rx_interrupt(info);
2598                }
2599                info += 1;
2600                data_mask <<= 2;
2601        }
2602        /* Handle tx interrupts with interrupts enabled so we
2603         * can take care of new data interrupts while transmitting
2604         * We protect the tx part with the tx_started flag.
2605         * We disable the tr_ready interrupts we are about to handle and
2606         * unblock the serial interrupt so new serial interrupts may come.
2607         *
2608         * If we get a new interrupt:
2609         *  - it migth be due to synchronous serial ports.
2610         *  - serial irq will be blocked by general irq handler.
2611         *  - async data will be handled above (sync will be ignored).
2612         *  - tx_started flag will prevent us from trying to send again and
2613         *    we will exit fast - no need to unblock serial irq.
2614         *  - Next (sync) serial interrupt handler will be runned with
2615         *    disabled interrupt due to restore_flags() at end of function,
2616         *    so sync handler will not be preempted or reentered.
2617         */
2618        if (!tx_started) {
2619                unsigned long ready_mask;
2620                unsigned long
2621                tx_started = 1;
2622                /* Only the tr_ready interrupts left */
2623                irq_mask1_rd &= (IO_MASK(R_IRQ_MASK1_RD, ser0_ready) |
2624                                 IO_MASK(R_IRQ_MASK1_RD, ser1_ready) |
2625                                 IO_MASK(R_IRQ_MASK1_RD, ser2_ready) |
2626                                 IO_MASK(R_IRQ_MASK1_RD, ser3_ready));
2627                while (irq_mask1_rd) {
2628                        /* Disable those we are about to handle */
2629                        *R_IRQ_MASK1_CLR = irq_mask1_rd;
2630                        /* Unblock the serial interrupt */
2631                        *R_VECT_MASK_SET = IO_STATE(R_VECT_MASK_SET, serial, set);
2632
2633                        local_irq_enable();
2634                        ready_mask = (1 << (8+1+2*0)); /* ser0 tr_ready */
2635                        info = rs_table;
2636                        for (i = 0; i < NR_PORTS; i++) {
2637                                /* Which line caused the ready irq? */
2638                                if (irq_mask1_rd & ready_mask) {
2639                                        handled = 1;
2640                                        handle_ser_tx_interrupt(info);
2641                                }
2642                                info += 1;
2643                                ready_mask <<= 2;
2644                        }
2645                        /* handle_ser_tx_interrupt enables tr_ready interrupts */
2646                        local_irq_disable();
2647                        /* Handle reentered TX interrupt */
2648                        irq_mask1_rd = reentered_ready_mask;
2649                }
2650                local_irq_disable();
2651                tx_started = 0;
2652        } else {
2653                unsigned long ready_mask;
2654                ready_mask = irq_mask1_rd & (IO_MASK(R_IRQ_MASK1_RD, ser0_ready) |
2655                                             IO_MASK(R_IRQ_MASK1_RD, ser1_ready) |
2656                                             IO_MASK(R_IRQ_MASK1_RD, ser2_ready) |
2657                                             IO_MASK(R_IRQ_MASK1_RD, ser3_ready));
2658                if (ready_mask) {
2659                        reentered_ready_mask |= ready_mask;
2660                        /* Disable those we are about to handle */
2661                        *R_IRQ_MASK1_CLR = ready_mask;
2662                        DFLOW(DEBUG_LOG(SERIAL_DEBUG_LINE, "ser_int reentered with TX %X\n", ready_mask));
2663                }
2664        }
2665
2666        local_irq_restore(flags);
2667        return IRQ_RETVAL(handled);
2668} /* ser_interrupt */
2669#endif
2670
2671/*
2672 * -------------------------------------------------------------------
2673 * Here ends the serial interrupt routines.
2674 * -------------------------------------------------------------------
2675 */
2676
2677/*
2678 * This routine is used to handle the "bottom half" processing for the
2679 * serial driver, known also the "software interrupt" processing.
2680 * This processing is done at the kernel interrupt level, after the
2681 * rs_interrupt() has returned, BUT WITH INTERRUPTS TURNED ON.  This
2682 * is where time-consuming activities which can not be done in the
2683 * interrupt driver proper are done; the interrupt driver schedules
2684 * them using rs_sched_event(), and they get done here.
2685 */
2686static void
2687do_softint(struct work_struct *work)
2688{
2689        struct e100_serial      *info;
2690        struct tty_struct       *tty;
2691
2692        info = container_of(work, struct e100_serial, work);
2693
2694        tty = info->port.tty;
2695        if (!tty)
2696                return;
2697
2698        if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event))
2699                tty_wakeup(tty);
2700}
2701
2702static int
2703startup(struct e100_serial * info)
2704{
2705        unsigned long flags;
2706        unsigned long xmit_page;
2707        int i;
2708
2709        xmit_page = get_zeroed_page(GFP_KERNEL);
2710        if (!xmit_page)
2711                return -ENOMEM;
2712
2713        local_irq_save(flags);
2714
2715        /* if it was already initialized, skip this */
2716
2717        if (info->port.flags & ASYNC_INITIALIZED) {
2718                local_irq_restore(flags);
2719                free_page(xmit_page);
2720                return 0;
2721        }
2722
2723        if (info->xmit.buf)
2724                free_page(xmit_page);
2725        else
2726                info->xmit.buf = (unsigned char *) xmit_page;
2727
2728#ifdef SERIAL_DEBUG_OPEN
2729        printk("starting up ttyS%d (xmit_buf 0x%p)...\n", info->line, info->xmit.buf);
2730#endif
2731
2732#ifdef CONFIG_SVINTO_SIM
2733        /* Bits and pieces collected from below.  Better to have them
2734           in one ifdef:ed clause than to mix in a lot of ifdefs,
2735           right? */
2736        if (info->port.tty)
2737                clear_bit(TTY_IO_ERROR, &info->port.tty->flags);
2738
2739        info->xmit.head = info->xmit.tail = 0;
2740        info->first_recv_buffer = info->last_recv_buffer = NULL;
2741        info->recv_cnt = info->max_recv_cnt = 0;
2742
2743        for (i = 0; i < SERIAL_RECV_DESCRIPTORS; i++)
2744                info->rec_descr[i].buf = NULL;
2745
2746        /* No real action in the simulator, but may set info important
2747           to ioctl. */
2748        change_speed(info);
2749#else
2750
2751        /*
2752         * Clear the FIFO buffers and disable them
2753         * (they will be reenabled in change_speed())
2754         */
2755
2756        /*
2757         * Reset the DMA channels and make sure their interrupts are cleared
2758         */
2759
2760        if (info->dma_in_enabled) {
2761                info->uses_dma_in = 1;
2762                e100_enable_rxdma_channel(info);
2763
2764                *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
2765
2766                /* Wait until reset cycle is complete */
2767                while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->icmdadr) ==
2768                       IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
2769
2770                /* Make sure the irqs are cleared */
2771                *info->iclrintradr =
2772                        IO_STATE(R_DMA_CH6_CLR_INTR, clr_descr, do) |
2773                        IO_STATE(R_DMA_CH6_CLR_INTR, clr_eop, do);
2774        } else {
2775                e100_disable_rxdma_channel(info);
2776        }
2777
2778        if (info->dma_out_enabled) {
2779                info->uses_dma_out = 1;
2780                e100_enable_txdma_channel(info);
2781                *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
2782
2783                while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->ocmdadr) ==
2784                       IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, reset));
2785
2786                /* Make sure the irqs are cleared */
2787                *info->oclrintradr =
2788                        IO_STATE(R_DMA_CH6_CLR_INTR, clr_descr, do) |
2789                        IO_STATE(R_DMA_CH6_CLR_INTR, clr_eop, do);
2790        } else {
2791                e100_disable_txdma_channel(info);
2792        }
2793
2794        if (info->port.tty)
2795                clear_bit(TTY_IO_ERROR, &info->port.tty->flags);
2796
2797        info->xmit.head = info->xmit.tail = 0;
2798        info->first_recv_buffer = info->last_recv_buffer = NULL;
2799        info->recv_cnt = info->max_recv_cnt = 0;
2800
2801        for (i = 0; i < SERIAL_RECV_DESCRIPTORS; i++)
2802                info->rec_descr[i].buf = 0;
2803
2804        /*
2805         * and set the speed and other flags of the serial port
2806         * this will start the rx/tx as well
2807         */
2808#ifdef SERIAL_HANDLE_EARLY_ERRORS
2809        e100_enable_serial_data_irq(info);
2810#endif
2811        change_speed(info);
2812
2813        /* dummy read to reset any serial errors */
2814
2815        (void)info->ioport[REG_DATA];
2816
2817        /* enable the interrupts */
2818        if (info->uses_dma_out)
2819                e100_enable_txdma_irq(info);
2820
2821        e100_enable_rx_irq(info);
2822
2823        info->tr_running = 0; /* to be sure we don't lock up the transmitter */
2824
2825        /* setup the dma input descriptor and start dma */
2826
2827        start_receive(info);
2828
2829        /* for safety, make sure the descriptors last result is 0 bytes written */
2830
2831        info->tr_descr.sw_len = 0;
2832        info->tr_descr.hw_len = 0;
2833        info->tr_descr.status = 0;
2834
2835        /* enable RTS/DTR last */
2836
2837        e100_rts(info, 1);
2838        e100_dtr(info, 1);
2839
2840#endif /* CONFIG_SVINTO_SIM */
2841
2842        info->port.flags |= ASYNC_INITIALIZED;
2843
2844        local_irq_restore(flags);
2845        return 0;
2846}
2847
2848/*
2849 * This routine will shutdown a serial port; interrupts are disabled, and
2850 * DTR is dropped if the hangup on close termio flag is on.
2851 */
2852static void
2853shutdown(struct e100_serial * info)
2854{
2855        unsigned long flags;
2856        struct etrax_dma_descr *descr = info->rec_descr;
2857        struct etrax_recv_buffer *buffer;
2858        int i;
2859
2860#ifndef CONFIG_SVINTO_SIM
2861        /* shut down the transmitter and receiver */
2862        DFLOW(DEBUG_LOG(info->line, "shutdown %i\n", info->line));
2863        e100_disable_rx(info);
2864        info->ioport[REG_TR_CTRL] = (info->tx_ctrl &= ~0x40);
2865
2866        /* disable interrupts, reset dma channels */
2867        if (info->uses_dma_in) {
2868                e100_disable_rxdma_irq(info);
2869                *info->icmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
2870                info->uses_dma_in = 0;
2871        } else {
2872                e100_disable_serial_data_irq(info);
2873        }
2874
2875        if (info->uses_dma_out) {
2876                e100_disable_txdma_irq(info);
2877                info->tr_running = 0;
2878                *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, reset);
2879                info->uses_dma_out = 0;
2880        } else {
2881                e100_disable_serial_tx_ready_irq(info);
2882                info->tr_running = 0;
2883        }
2884
2885#endif /* CONFIG_SVINTO_SIM */
2886
2887        if (!(info->port.flags & ASYNC_INITIALIZED))
2888                return;
2889
2890#ifdef SERIAL_DEBUG_OPEN
2891        printk("Shutting down serial port %d (irq %d)....\n", info->line,
2892               info->irq);
2893#endif
2894
2895        local_irq_save(flags);
2896
2897        if (info->xmit.buf) {
2898                free_page((unsigned long)info->xmit.buf);
2899                info->xmit.buf = NULL;
2900        }
2901
2902        for (i = 0; i < SERIAL_RECV_DESCRIPTORS; i++)
2903                if (descr[i].buf) {
2904                        buffer = phys_to_virt(descr[i].buf) - sizeof *buffer;
2905                        kfree(buffer);
2906                        descr[i].buf = 0;
2907                }
2908
2909        if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) {
2910                /* hang up DTR and RTS if HUPCL is enabled */
2911                e100_dtr(info, 0);
2912                e100_rts(info, 0); /* could check CRTSCTS before doing this */
2913        }
2914
2915        if (info->port.tty)
2916                set_bit(TTY_IO_ERROR, &info->port.tty->flags);
2917
2918        info->port.flags &= ~ASYNC_INITIALIZED;
2919        local_irq_restore(flags);
2920}
2921
2922
2923/* change baud rate and other assorted parameters */
2924
2925static void
2926change_speed(struct e100_serial *info)
2927{
2928        unsigned int cflag;
2929        unsigned long xoff;
2930        unsigned long flags;
2931        /* first some safety checks */
2932
2933        if (!info->port.tty)
2934                return;
2935        if (!info->ioport)
2936                return;
2937
2938        cflag = info->port.tty->termios.c_cflag;
2939
2940        /* possibly, the tx/rx should be disabled first to do this safely */
2941
2942        /* change baud-rate and write it to the hardware */
2943        if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST) {
2944                /* Special baudrate */
2945                u32 mask = 0xFF << (info->line*8); /* Each port has 8 bits */
2946                unsigned long alt_source =
2947                                IO_STATE(R_ALT_SER_BAUDRATE, ser0_rec, normal) |
2948                                IO_STATE(R_ALT_SER_BAUDRATE, ser0_tr, normal);
2949                /* R_ALT_SER_BAUDRATE selects the source */
2950                DBAUD(printk("Custom baudrate: baud_base/divisor %lu/%i\n",
2951                       (unsigned long)info->baud_base, info->custom_divisor));
2952                if (info->baud_base == SERIAL_PRESCALE_BASE) {
2953                        /* 0, 2-65535 (0=65536) */
2954                        u16 divisor = info->custom_divisor;
2955                        /* R_SERIAL_PRESCALE (upper 16 bits of R_CLOCK_PRESCALE) */
2956                        /* baudrate is 3.125MHz/custom_divisor */
2957                        alt_source =
2958                                IO_STATE(R_ALT_SER_BAUDRATE, ser0_rec, prescale) |
2959                                IO_STATE(R_ALT_SER_BAUDRATE, ser0_tr, prescale);
2960                        alt_source = 0x11;
2961                        DBAUD(printk("Writing SERIAL_PRESCALE: divisor %i\n", divisor));
2962                        *R_SERIAL_PRESCALE = divisor;
2963                        info->baud = SERIAL_PRESCALE_BASE/divisor;
2964                }
2965#ifdef CONFIG_ETRAX_EXTERN_PB6CLK_ENABLED
2966                else if ((info->baud_base==CONFIG_ETRAX_EXTERN_PB6CLK_FREQ/8 &&
2967                          info->custom_divisor == 1) ||
2968                         (info->baud_base==CONFIG_ETRAX_EXTERN_PB6CLK_FREQ &&
2969                          info->custom_divisor == 8)) {
2970                                /* ext_clk selected */
2971                                alt_source =
2972                                        IO_STATE(R_ALT_SER_BAUDRATE, ser0_rec, extern) |
2973                                        IO_STATE(R_ALT_SER_BAUDRATE, ser0_tr, extern);
2974                                DBAUD(printk("using external baudrate: %lu\n", CONFIG_ETRAX_EXTERN_PB6CLK_FREQ/8));
2975                                info->baud = CONFIG_ETRAX_EXTERN_PB6CLK_FREQ/8;
2976                        }
2977#endif
2978                else
2979                {
2980                        /* Bad baudbase, we don't support using timer0
2981                         * for baudrate.
2982                         */
2983                        printk(KERN_WARNING "Bad baud_base/custom_divisor: %lu/%i\n",
2984                               (unsigned long)info->baud_base, info->custom_divisor);
2985                }
2986                r_alt_ser_baudrate_shadow &= ~mask;
2987                r_alt_ser_baudrate_shadow |= (alt_source << (info->line*8));
2988                *R_ALT_SER_BAUDRATE = r_alt_ser_baudrate_shadow;
2989        } else {
2990                /* Normal baudrate */
2991                /* Make sure we use normal baudrate */
2992                u32 mask = 0xFF << (info->line*8); /* Each port has 8 bits */
2993                unsigned long alt_source =
2994                        IO_STATE(R_ALT_SER_BAUDRATE, ser0_rec, normal) |
2995                        IO_STATE(R_ALT_SER_BAUDRATE, ser0_tr, normal);
2996                r_alt_ser_baudrate_shadow &= ~mask;
2997                r_alt_ser_baudrate_shadow |= (alt_source << (info->line*8));
2998#ifndef CONFIG_SVINTO_SIM
2999                *R_ALT_SER_BAUDRATE = r_alt_ser_baudrate_shadow;
3000#endif /* CONFIG_SVINTO_SIM */
3001
3002                info->baud = cflag_to_baud(cflag);
3003#ifndef CONFIG_SVINTO_SIM
3004                info->ioport[REG_BAUD] = cflag_to_etrax_baud(cflag);
3005#endif /* CONFIG_SVINTO_SIM */
3006        }
3007
3008#ifndef CONFIG_SVINTO_SIM
3009        /* start with default settings and then fill in changes */
3010        local_irq_save(flags);
3011        /* 8 bit, no/even parity */
3012        info->rx_ctrl &= ~(IO_MASK(R_SERIAL0_REC_CTRL, rec_bitnr) |
3013                           IO_MASK(R_SERIAL0_REC_CTRL, rec_par_en) |
3014                           IO_MASK(R_SERIAL0_REC_CTRL, rec_par));
3015
3016        /* 8 bit, no/even parity, 1 stop bit, no cts */
3017        info->tx_ctrl &= ~(IO_MASK(R_SERIAL0_TR_CTRL, tr_bitnr) |
3018                           IO_MASK(R_SERIAL0_TR_CTRL, tr_par_en) |
3019                           IO_MASK(R_SERIAL0_TR_CTRL, tr_par) |
3020                           IO_MASK(R_SERIAL0_TR_CTRL, stop_bits) |
3021                           IO_MASK(R_SERIAL0_TR_CTRL, auto_cts));
3022
3023        if ((cflag & CSIZE) == CS7) {
3024                /* set 7 bit mode */
3025                info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_bitnr, tr_7bit);
3026                info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_bitnr, rec_7bit);
3027        }
3028
3029        if (cflag & CSTOPB) {
3030                /* set 2 stop bit mode */
3031                info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, stop_bits, two_bits);
3032        }
3033
3034        if (cflag & PARENB) {
3035                /* enable parity */
3036                info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_par_en, enable);
3037                info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_par_en, enable);
3038        }
3039
3040        if (cflag & CMSPAR) {
3041                /* enable stick parity, PARODD mean Mark which matches ETRAX */
3042                info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_stick_par, stick);
3043                info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_stick_par, stick);
3044        }
3045        if (cflag & PARODD) {
3046                /* set odd parity (or Mark if CMSPAR) */
3047                info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_par, odd);
3048                info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_par, odd);
3049        }
3050
3051        if (cflag & CRTSCTS) {
3052                /* enable automatic CTS handling */
3053                DFLOW(DEBUG_LOG(info->line, "FLOW auto_cts enabled\n", 0));
3054                info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, auto_cts, active);
3055        }
3056
3057        /* make sure the tx and rx are enabled */
3058
3059        info->tx_ctrl |= IO_STATE(R_SERIAL0_TR_CTRL, tr_enable, enable);
3060        info->rx_ctrl |= IO_STATE(R_SERIAL0_REC_CTRL, rec_enable, enable);
3061
3062        /* actually write the control regs to the hardware */
3063
3064        info->ioport[REG_TR_CTRL] = info->tx_ctrl;
3065        info->ioport[REG_REC_CTRL] = info->rx_ctrl;
3066        xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty));
3067        xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
3068        if (info->port.tty->termios.c_iflag & IXON ) {
3069                DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n",
3070                                STOP_CHAR(info->port.tty)));
3071                xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
3072        }
3073
3074        *((unsigned long *)&info->ioport[REG_XOFF]) = xoff;
3075        local_irq_restore(flags);
3076#endif /* !CONFIG_SVINTO_SIM */
3077
3078        update_char_time(info);
3079
3080} /* change_speed */
3081
3082/* start transmitting chars NOW */
3083
3084static void
3085rs_flush_chars(struct tty_struct *tty)
3086{
3087        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3088        unsigned long flags;
3089
3090        if (info->tr_running ||
3091            info->xmit.head == info->xmit.tail ||
3092            tty->stopped ||
3093            !info->xmit.buf)
3094                return;
3095
3096#ifdef SERIAL_DEBUG_FLOW
3097        printk("rs_flush_chars\n");
3098#endif
3099
3100        /* this protection might not exactly be necessary here */
3101
3102        local_irq_save(flags);
3103        start_transmit(info);
3104        local_irq_restore(flags);
3105}
3106
3107static int rs_raw_write(struct tty_struct *tty,
3108                        const unsigned char *buf, int count)
3109{
3110        int     c, ret = 0;
3111        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3112        unsigned long flags;
3113
3114        /* first some sanity checks */
3115
3116        if (!info->xmit.buf)
3117                return 0;
3118
3119#ifdef SERIAL_DEBUG_DATA
3120        if (info->line == SERIAL_DEBUG_LINE)
3121                printk("rs_raw_write (%d), status %d\n",
3122                       count, info->ioport[REG_STATUS]);
3123#endif
3124
3125#ifdef CONFIG_SVINTO_SIM
3126        /* Really simple.  The output is here and now. */
3127        SIMCOUT(buf, count);
3128        return count;
3129#endif
3130        local_save_flags(flags);
3131        DFLOW(DEBUG_LOG(info->line, "write count %i ", count));
3132        DFLOW(DEBUG_LOG(info->line, "ldisc %i\n", tty->ldisc.chars_in_buffer(tty)));
3133
3134
3135        /* The local_irq_disable/restore_flags pairs below are needed
3136         * because the DMA interrupt handler moves the info->xmit values.
3137         * the memcpy needs to be in the critical region unfortunately,
3138         * because we need to read xmit values, memcpy, write xmit values
3139         * in one atomic operation... this could perhaps be avoided by
3140         * more clever design.
3141         */
3142        local_irq_disable();
3143                while (count) {
3144                        c = CIRC_SPACE_TO_END(info->xmit.head,
3145                                              info->xmit.tail,
3146                                              SERIAL_XMIT_SIZE);
3147
3148                        if (count < c)
3149                                c = count;
3150                        if (c <= 0)
3151                                break;
3152
3153                        memcpy(info->xmit.buf + info->xmit.head, buf, c);
3154                        info->xmit.head = (info->xmit.head + c) &
3155                                (SERIAL_XMIT_SIZE-1);
3156                        buf += c;
3157                        count -= c;
3158                        ret += c;
3159                }
3160        local_irq_restore(flags);
3161
3162        /* enable transmitter if not running, unless the tty is stopped
3163         * this does not need IRQ protection since if tr_running == 0
3164         * the IRQ's are not running anyway for this port.
3165         */
3166        DFLOW(DEBUG_LOG(info->line, "write ret %i\n", ret));
3167
3168        if (info->xmit.head != info->xmit.tail &&
3169            !tty->stopped &&
3170            !info->tr_running) {
3171                start_transmit(info);
3172        }
3173
3174        return ret;
3175} /* raw_raw_write() */
3176
3177static int
3178rs_write(struct tty_struct *tty,
3179         const unsigned char *buf, int count)
3180{
3181#if defined(CONFIG_ETRAX_RS485)
3182        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3183
3184        if (info->rs485.flags & SER_RS485_ENABLED)
3185        {
3186                /* If we are in RS-485 mode, we need to toggle RTS and disable
3187                 * the receiver before initiating a DMA transfer
3188                 */
3189#ifdef CONFIG_ETRAX_FAST_TIMER
3190                /* Abort any started timer */
3191                fast_timers_rs485[info->line].function = NULL;
3192                del_fast_timer(&fast_timers_rs485[info->line]);
3193#endif
3194                e100_rts(info, (info->rs485.flags & SER_RS485_RTS_ON_SEND));
3195#if defined(CONFIG_ETRAX_RS485_DISABLE_RECEIVER)
3196                e100_disable_rx(info);
3197                e100_enable_rx_irq(info);
3198#endif
3199                if (info->rs485.delay_rts_before_send > 0)
3200                        msleep(info->rs485.delay_rts_before_send);
3201        }
3202#endif /* CONFIG_ETRAX_RS485 */
3203
3204        count = rs_raw_write(tty, buf, count);
3205
3206#if defined(CONFIG_ETRAX_RS485)
3207        if (info->rs485.flags & SER_RS485_ENABLED)
3208        {
3209                unsigned int val;
3210                /* If we are in RS-485 mode the following has to be done:
3211                 * wait until DMA is ready
3212                 * wait on transmit shift register
3213                 * toggle RTS
3214                 * enable the receiver
3215                 */
3216
3217                /* Sleep until all sent */
3218                tty_wait_until_sent(tty, 0);
3219#ifdef CONFIG_ETRAX_FAST_TIMER
3220                /* Now sleep a little more so that shift register is empty */
3221                schedule_usleep(info->char_time_usec * 2);
3222#endif
3223                /* wait on transmit shift register */
3224                do{
3225                        get_lsr_info(info, &val);
3226                }while (!(val & TIOCSER_TEMT));
3227
3228                e100_rts(info, (info->rs485.flags & SER_RS485_RTS_AFTER_SEND));
3229
3230#if defined(CONFIG_ETRAX_RS485_DISABLE_RECEIVER)
3231                e100_enable_rx(info);
3232                e100_enable_rxdma_irq(info);
3233#endif
3234        }
3235#endif /* CONFIG_ETRAX_RS485 */
3236
3237        return count;
3238} /* rs_write */
3239
3240
3241/* how much space is available in the xmit buffer? */
3242
3243static int
3244rs_write_room(struct tty_struct *tty)
3245{
3246        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3247
3248        return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
3249}
3250
3251/* How many chars are in the xmit buffer?
3252 * This does not include any chars in the transmitter FIFO.
3253 * Use wait_until_sent for waiting for FIFO drain.
3254 */
3255
3256static int
3257rs_chars_in_buffer(struct tty_struct *tty)
3258{
3259        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3260
3261        return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
3262}
3263
3264/* discard everything in the xmit buffer */
3265
3266static void
3267rs_flush_buffer(struct tty_struct *tty)
3268{
3269        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3270        unsigned long flags;
3271
3272        local_irq_save(flags);
3273        info->xmit.head = info->xmit.tail = 0;
3274        local_irq_restore(flags);
3275
3276        tty_wakeup(tty);
3277}
3278
3279/*
3280 * This function is used to send a high-priority XON/XOFF character to
3281 * the device
3282 *
3283 * Since we use DMA we don't check for info->x_char in transmit_chars_dma(),
3284 * but we do it in handle_ser_tx_interrupt().
3285 * We disable DMA channel and enable tx ready interrupt and write the
3286 * character when possible.
3287 */
3288static void rs_send_xchar(struct tty_struct *tty, char ch)
3289{
3290        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3291        unsigned long flags;
3292        local_irq_save(flags);
3293        if (info->uses_dma_out) {
3294                /* Put the DMA on hold and disable the channel */
3295                *info->ocmdadr = IO_STATE(R_DMA_CH6_CMD, cmd, hold);
3296                while (IO_EXTRACT(R_DMA_CH6_CMD, cmd, *info->ocmdadr) !=
3297                       IO_STATE_VALUE(R_DMA_CH6_CMD, cmd, hold));
3298                e100_disable_txdma_channel(info);
3299        }
3300
3301        /* Must make sure transmitter is not stopped before we can transmit */
3302        if (tty->stopped)
3303                rs_start(tty);
3304
3305        /* Enable manual transmit interrupt and send from there */
3306        DFLOW(DEBUG_LOG(info->line, "rs_send_xchar 0x%02X\n", ch));
3307        info->x_char = ch;
3308        e100_enable_serial_tx_ready_irq(info);
3309        local_irq_restore(flags);
3310}
3311
3312/*
3313 * ------------------------------------------------------------
3314 * rs_throttle()
3315 *
3316 * This routine is called by the upper-layer tty layer to signal that
3317 * incoming characters should be throttled.
3318 * ------------------------------------------------------------
3319 */
3320static void
3321rs_throttle(struct tty_struct * tty)
3322{
3323        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3324#ifdef SERIAL_DEBUG_THROTTLE
3325        char    buf[64];
3326
3327        printk("throttle %s: %lu....\n", tty_name(tty, buf),
3328               (unsigned long)tty->ldisc.chars_in_buffer(tty));
3329#endif
3330        DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty)));
3331
3332        /* Do RTS before XOFF since XOFF might take some time */
3333        if (tty->termios.c_cflag & CRTSCTS) {
3334                /* Turn off RTS line */
3335                e100_rts(info, 0);
3336        }
3337        if (I_IXOFF(tty))
3338                rs_send_xchar(tty, STOP_CHAR(tty));
3339
3340}
3341
3342static void
3343rs_unthrottle(struct tty_struct * tty)
3344{
3345        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3346#ifdef SERIAL_DEBUG_THROTTLE
3347        char    buf[64];
3348
3349        printk("unthrottle %s: %lu....\n", tty_name(tty, buf),
3350               (unsigned long)tty->ldisc.chars_in_buffer(tty));
3351#endif
3352        DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty)));
3353        DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count));
3354        /* Do RTS before XOFF since XOFF might take some time */
3355        if (tty->termios.c_cflag & CRTSCTS) {
3356                /* Assert RTS line  */
3357                e100_rts(info, 1);
3358        }
3359
3360        if (I_IXOFF(tty)) {
3361                if (info->x_char)
3362                        info->x_char = 0;
3363                else
3364                        rs_send_xchar(tty, START_CHAR(tty));
3365        }
3366
3367}
3368
3369/*
3370 * ------------------------------------------------------------
3371 * rs_ioctl() and friends
3372 * ------------------------------------------------------------
3373 */
3374
3375static int
3376get_serial_info(struct e100_serial * info,
3377                struct serial_struct * retinfo)
3378{
3379        struct serial_struct tmp;
3380
3381        /* this is all probably wrong, there are a lot of fields
3382         * here that we don't have in e100_serial and maybe we
3383         * should set them to something else than 0.
3384         */
3385
3386        if (!retinfo)
3387                return -EFAULT;
3388        memset(&tmp, 0, sizeof(tmp));
3389        tmp.type = info->type;
3390        tmp.line = info->line;
3391        tmp.port = (int)info->ioport;
3392        tmp.irq = info->irq;
3393        tmp.flags = info->port.flags;
3394        tmp.baud_base = info->baud_base;
3395        tmp.close_delay = info->port.close_delay;
3396        tmp.closing_wait = info->port.closing_wait;
3397        tmp.custom_divisor = info->custom_divisor;
3398        if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
3399                return -EFAULT;
3400        return 0;
3401}
3402
3403static int
3404set_serial_info(struct e100_serial *info,
3405                struct serial_struct *new_info)
3406{
3407        struct serial_struct new_serial;
3408        struct e100_serial old_info;
3409        int retval = 0;
3410
3411        if (copy_from_user(&new_serial, new_info, sizeof(new_serial)))
3412                return -EFAULT;
3413
3414        old_info = *info;
3415
3416        if (!capable(CAP_SYS_ADMIN)) {
3417                if ((new_serial.type != info->type) ||
3418                    (new_serial.close_delay != info->port.close_delay) ||
3419                    ((new_serial.flags & ~ASYNC_USR_MASK) !=
3420                     (info->port.flags & ~ASYNC_USR_MASK)))
3421                        return -EPERM;
3422                info->port.flags = ((info->port.flags & ~ASYNC_USR_MASK) |
3423                               (new_serial.flags & ASYNC_USR_MASK));
3424                goto check_and_exit;
3425        }
3426
3427        if (info->port.count > 1)
3428                return -EBUSY;
3429
3430        /*
3431         * OK, past this point, all the error checking has been done.
3432         * At this point, we start making changes.....
3433         */
3434
3435        info->baud_base = new_serial.baud_base;
3436        info->port.flags = ((info->port.flags & ~ASYNC_FLAGS) |
3437                       (new_serial.flags & ASYNC_FLAGS));
3438        info->custom_divisor = new_serial.custom_divisor;
3439        info->type = new_serial.type;
3440        info->port.close_delay = new_serial.close_delay;
3441        info->port.closing_wait = new_serial.closing_wait;
3442        info->port.low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
3443
3444 check_and_exit:
3445        if (info->port.flags & ASYNC_INITIALIZED) {
3446                change_speed(info);
3447        } else
3448                retval = startup(info);
3449        return retval;
3450}
3451
3452/*
3453 * get_lsr_info - get line status register info
3454 *
3455 * Purpose: Let user call ioctl() to get info when the UART physically
3456 *          is emptied.  On bus types like RS485, the transmitter must
3457 *          release the bus after transmitting. This must be done when
3458 *          the transmit shift register is empty, not be done when the
3459 *          transmit holding register is empty.  This functionality
3460 *          allows an RS485 driver to be written in user space.
3461 */
3462static int
3463get_lsr_info(struct e100_serial * info, unsigned int *value)
3464{
3465        unsigned int result = TIOCSER_TEMT;
3466#ifndef CONFIG_SVINTO_SIM
3467        unsigned long curr_time = jiffies;
3468        unsigned long curr_time_usec = GET_JIFFIES_USEC();
3469        unsigned long elapsed_usec =
3470                (curr_time - info->last_tx_active) * 1000000/HZ +
3471                curr_time_usec - info->last_tx_active_usec;
3472
3473        if (info->xmit.head != info->xmit.tail ||
3474            elapsed_usec < 2*info->char_time_usec) {
3475                result = 0;
3476        }
3477#endif
3478
3479        if (copy_to_user(value, &result, sizeof(int)))
3480                return -EFAULT;
3481        return 0;
3482}
3483
3484#ifdef SERIAL_DEBUG_IO
3485struct state_str
3486{
3487        int state;
3488        const char *str;
3489};
3490
3491const struct state_str control_state_str[] = {
3492        {TIOCM_DTR, "DTR" },
3493        {TIOCM_RTS, "RTS"},
3494        {TIOCM_ST, "ST?" },
3495        {TIOCM_SR, "SR?" },
3496        {TIOCM_CTS, "CTS" },
3497        {TIOCM_CD, "CD" },
3498        {TIOCM_RI, "RI" },
3499        {TIOCM_DSR, "DSR" },
3500        {0, NULL }
3501};
3502
3503char *get_control_state_str(int MLines, char *s)
3504{
3505        int i = 0;
3506
3507        s[0]='\0';
3508        while (control_state_str[i].str != NULL) {
3509                if (MLines & control_state_str[i].state) {
3510                        if (s[0] != '\0') {
3511                                strcat(s, ", ");
3512                        }
3513                        strcat(s, control_state_str[i].str);
3514                }
3515                i++;
3516        }
3517        return s;
3518}
3519#endif
3520
3521static int
3522rs_break(struct tty_struct *tty, int break_state)
3523{
3524        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3525        unsigned long flags;
3526
3527        if (!info->ioport)
3528                return -EIO;
3529
3530        local_irq_save(flags);
3531        if (break_state == -1) {
3532                /* Go to manual mode and set the txd pin to 0 */
3533                /* Clear bit 7 (txd) and 6 (tr_enable) */
3534                info->tx_ctrl &= 0x3F;
3535        } else {
3536                /* Set bit 7 (txd) and 6 (tr_enable) */
3537                info->tx_ctrl |= (0x80 | 0x40);
3538        }
3539        info->ioport[REG_TR_CTRL] = info->tx_ctrl;
3540        local_irq_restore(flags);
3541        return 0;
3542}
3543
3544static int
3545rs_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear)
3546{
3547        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3548        unsigned long flags;
3549
3550        local_irq_save(flags);
3551
3552        if (clear & TIOCM_RTS)
3553                e100_rts(info, 0);
3554        if (clear & TIOCM_DTR)
3555                e100_dtr(info, 0);
3556        /* Handle FEMALE behaviour */
3557        if (clear & TIOCM_RI)
3558                e100_ri_out(info, 0);
3559        if (clear & TIOCM_CD)
3560                e100_cd_out(info, 0);
3561
3562        if (set & TIOCM_RTS)
3563                e100_rts(info, 1);
3564        if (set & TIOCM_DTR)
3565                e100_dtr(info, 1);
3566        /* Handle FEMALE behaviour */
3567        if (set & TIOCM_RI)
3568                e100_ri_out(info, 1);
3569        if (set & TIOCM_CD)
3570                e100_cd_out(info, 1);
3571
3572        local_irq_restore(flags);
3573        return 0;
3574}
3575
3576static int
3577rs_tiocmget(struct tty_struct *tty)
3578{
3579        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3580        unsigned int result;
3581        unsigned long flags;
3582
3583        local_irq_save(flags);
3584
3585        result =
3586                (!E100_RTS_GET(info) ? TIOCM_RTS : 0)
3587                | (!E100_DTR_GET(info) ? TIOCM_DTR : 0)
3588                | (!E100_RI_GET(info) ? TIOCM_RNG : 0)
3589                | (!E100_DSR_GET(info) ? TIOCM_DSR : 0)
3590                | (!E100_CD_GET(info) ? TIOCM_CAR : 0)
3591                | (!E100_CTS_GET(info) ? TIOCM_CTS : 0);
3592
3593        local_irq_restore(flags);
3594
3595#ifdef SERIAL_DEBUG_IO
3596        printk(KERN_DEBUG "ser%i: modem state: %i 0x%08X\n",
3597                info->line, result, result);
3598        {
3599                char s[100];
3600
3601                get_control_state_str(result, s);
3602                printk(KERN_DEBUG "state: %s\n", s);
3603        }
3604#endif
3605        return result;
3606
3607}
3608
3609
3610static int
3611rs_ioctl(struct tty_struct *tty,
3612         unsigned int cmd, unsigned long arg)
3613{
3614        struct e100_serial * info = (struct e100_serial *)tty->driver_data;
3615
3616        if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
3617            (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGWILD)  &&
3618            (cmd != TIOCSERSWILD) && (cmd != TIOCSERGSTRUCT)) {
3619                if (tty->flags & (1 << TTY_IO_ERROR))
3620                        return -EIO;
3621        }
3622
3623        switch (cmd) {
3624        case TIOCGSERIAL:
3625                return get_serial_info(info,
3626                                       (struct serial_struct *) arg);
3627        case TIOCSSERIAL:
3628                return set_serial_info(info,
3629                                       (struct serial_struct *) arg);
3630        case TIOCSERGETLSR: /* Get line status register */
3631                return get_lsr_info(info, (unsigned int *) arg);
3632
3633        case TIOCSERGSTRUCT:
3634                if (copy_to_user((struct e100_serial *) arg,
3635                                 info, sizeof(struct e100_serial)))
3636                        return -EFAULT;
3637                return 0;
3638
3639#if defined(CONFIG_ETRAX_RS485)
3640        case TIOCSERSETRS485:
3641        {
3642                /* In this ioctl we still use the old structure
3643                 * rs485_control for backward compatibility
3644                 * (if we use serial_rs485, then old user-level code
3645                 * wouldn't work anymore...).
3646                 * The use of this ioctl is deprecated: use TIOCSRS485
3647                 * instead.*/
3648                struct rs485_control rs485ctrl;
3649                struct serial_rs485 rs485data;
3650                printk(KERN_DEBUG "The use of this ioctl is deprecated. Use TIOCSRS485 instead\n");
3651                if (copy_from_user(&rs485ctrl, (struct rs485_control *)arg,
3652                                sizeof(rs485ctrl)))
3653                        return -EFAULT;
3654
3655                rs485data.delay_rts_before_send = rs485ctrl.delay_rts_before_send;
3656                rs485data.flags = 0;
3657
3658                if (rs485ctrl.enabled)
3659                        rs485data.flags |= SER_RS485_ENABLED;
3660                else
3661                        rs485data.flags &= ~(SER_RS485_ENABLED);
3662
3663                if (rs485ctrl.rts_on_send)
3664                        rs485data.flags |= SER_RS485_RTS_ON_SEND;
3665                else
3666                        rs485data.flags &= ~(SER_RS485_RTS_ON_SEND);
3667
3668                if (rs485ctrl.rts_after_sent)
3669                        rs485data.flags |= SER_RS485_RTS_AFTER_SEND;
3670                else
3671                        rs485data.flags &= ~(SER_RS485_RTS_AFTER_SEND);
3672
3673                return e100_enable_rs485(tty, &rs485data);
3674        }
3675
3676        case TIOCSRS485:
3677        {
3678                /* This is the new version of TIOCSRS485, with new
3679                 * data structure serial_rs485 */
3680                struct serial_rs485 rs485data;
3681                if (copy_from_user(&rs485data, (struct rs485_control *)arg,
3682                                sizeof(rs485data)))
3683                        return -EFAULT;
3684
3685                return e100_enable_rs485(tty, &rs485data);
3686        }
3687
3688        case TIOCGRS485:
3689        {
3690                struct serial_rs485 *rs485data =
3691                        &(((struct e100_serial *)tty->driver_data)->rs485);
3692                /* This is the ioctl to get RS485 data from user-space */
3693                if (copy_to_user((struct serial_rs485 *) arg,
3694                                        rs485data,
3695                                        sizeof(struct serial_rs485)))
3696                        return -EFAULT;
3697                break;
3698        }
3699
3700        case TIOCSERWRRS485:
3701        {
3702                struct rs485_write rs485wr;
3703                if (copy_from_user(&rs485wr, (struct rs485_write *)arg,
3704                                sizeof(rs485wr)))
3705                        return -EFAULT;
3706
3707                return e100_write_rs485(tty, rs485wr.outc, rs485wr.outc_size);
3708        }
3709#endif
3710
3711        default:
3712                return -ENOIOCTLCMD;
3713        }
3714        return 0;
3715}
3716
3717static void
3718rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
3719{
3720        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3721
3722        change_speed(info);
3723
3724        /* Handle turning off CRTSCTS */
3725        if ((old_termios->c_cflag & CRTSCTS) &&
3726            !(tty->termios.c_cflag & CRTSCTS))
3727                rs_start(tty);
3728
3729}
3730
3731/*
3732 * ------------------------------------------------------------
3733 * rs_close()
3734 *
3735 * This routine is called when the serial port gets closed.  First, we
3736 * wait for the last remaining data to be sent.  Then, we unlink its
3737 * S structure from the interrupt chain if necessary, and we free
3738 * that IRQ if nothing is left in the chain.
3739 * ------------------------------------------------------------
3740 */
3741static void
3742rs_close(struct tty_struct *tty, struct file * filp)
3743{
3744        struct e100_serial * info = (struct e100_serial *)tty->driver_data;
3745        unsigned long flags;
3746
3747        if (!info)
3748                return;
3749
3750        /* interrupts are disabled for this entire function */
3751
3752        local_irq_save(flags);
3753
3754        if (tty_hung_up_p(filp)) {
3755                local_irq_restore(flags);
3756                return;
3757        }
3758
3759#ifdef SERIAL_DEBUG_OPEN
3760        printk("[%d] rs_close ttyS%d, count = %d\n", current->pid,
3761               info->line, info->count);
3762#endif
3763        if ((tty->count == 1) && (info->port.count != 1)) {
3764                /*
3765                 * Uh, oh.  tty->count is 1, which means that the tty
3766                 * structure will be freed.  Info->count should always
3767                 * be one in these conditions.  If it's greater than
3768                 * one, we've got real problems, since it means the
3769                 * serial port won't be shutdown.
3770                 */
3771                printk(KERN_ERR
3772                       "rs_close: bad serial port count; tty->count is 1, "
3773                       "info->count is %d\n", info->port.count);
3774                info->port.count = 1;
3775        }
3776        if (--info->port.count < 0) {
3777                printk(KERN_ERR "rs_close: bad serial port count for ttyS%d: %d\n",
3778                       info->line, info->port.count);
3779                info->port.count = 0;
3780        }
3781        if (info->port.count) {
3782                local_irq_restore(flags);
3783                return;
3784        }
3785        info->port.flags |= ASYNC_CLOSING;
3786        /*
3787         * Save the termios structure, since this port may have
3788         * separate termios for callout and dialin.
3789         */
3790        if (info->port.flags & ASYNC_NORMAL_ACTIVE)
3791                info->normal_termios = tty->termios;
3792        /*
3793         * Now we wait for the transmit buffer to clear; and we notify
3794         * the line discipline to only process XON/XOFF characters.
3795         */
3796        tty->closing = 1;
3797        if (info->port.closing_wait != ASYNC_CLOSING_WAIT_NONE)
3798                tty_wait_until_sent(tty, info->port.closing_wait);
3799        /*
3800         * At this point we stop accepting input.  To do this, we
3801         * disable the serial receiver and the DMA receive interrupt.
3802         */
3803#ifdef SERIAL_HANDLE_EARLY_ERRORS
3804        e100_disable_serial_data_irq(info);
3805#endif
3806
3807#ifndef CONFIG_SVINTO_SIM
3808        e100_disable_rx(info);
3809        e100_disable_rx_irq(info);
3810
3811        if (info->port.flags & ASYNC_INITIALIZED) {
3812                /*
3813                 * Before we drop DTR, make sure the UART transmitter
3814                 * has completely drained; this is especially
3815                 * important as we have a transmit FIFO!
3816                 */
3817                rs_wait_until_sent(tty, HZ);
3818        }
3819#endif
3820
3821        shutdown(info);
3822        rs_flush_buffer(tty);
3823        tty_ldisc_flush(tty);
3824        tty->closing = 0;
3825        info->event = 0;
3826        info->port.tty = NULL;
3827        if (info->port.blocked_open) {
3828                if (info->port.close_delay)
3829                        schedule_timeout_interruptible(info->port.close_delay);
3830                wake_up_interruptible(&info->port.open_wait);
3831        }
3832        info->port.flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
3833        wake_up_interruptible(&info->port.close_wait);
3834        local_irq_restore(flags);
3835
3836        /* port closed */
3837
3838#if defined(CONFIG_ETRAX_RS485)
3839        if (info->rs485.flags & SER_RS485_ENABLED) {
3840                info->rs485.flags &= ~(SER_RS485_ENABLED);
3841#if defined(CONFIG_ETRAX_RS485_ON_PA)
3842                *R_PORT_PA_DATA = port_pa_data_shadow &= ~(1 << rs485_pa_bit);
3843#endif
3844#if defined(CONFIG_ETRAX_RS485_ON_PORT_G)
3845                REG_SHADOW_SET(R_PORT_G_DATA, port_g_data_shadow,
3846                               rs485_port_g_bit, 0);
3847#endif
3848#if defined(CONFIG_ETRAX_RS485_LTC1387)
3849                REG_SHADOW_SET(R_PORT_G_DATA, port_g_data_shadow,
3850                               CONFIG_ETRAX_RS485_LTC1387_DXEN_PORT_G_BIT, 0);
3851                REG_SHADOW_SET(R_PORT_G_DATA, port_g_data_shadow,
3852                               CONFIG_ETRAX_RS485_LTC1387_RXEN_PORT_G_BIT, 0);
3853#endif
3854        }
3855#endif
3856
3857        /*
3858         * Release any allocated DMA irq's.
3859         */
3860        if (info->dma_in_enabled) {
3861                free_irq(info->dma_in_irq_nbr, info);
3862                cris_free_dma(info->dma_in_nbr, info->dma_in_irq_description);
3863                info->uses_dma_in = 0;
3864#ifdef SERIAL_DEBUG_OPEN
3865                printk(KERN_DEBUG "DMA irq '%s' freed\n",
3866                        info->dma_in_irq_description);
3867#endif
3868        }
3869        if (info->dma_out_enabled) {
3870                free_irq(info->dma_out_irq_nbr, info);
3871                cris_free_dma(info->dma_out_nbr, info->dma_out_irq_description);
3872                info->uses_dma_out = 0;
3873#ifdef SERIAL_DEBUG_OPEN
3874                printk(KERN_DEBUG "DMA irq '%s' freed\n",
3875                        info->dma_out_irq_description);
3876#endif
3877        }
3878}
3879
3880/*
3881 * rs_wait_until_sent() --- wait until the transmitter is empty
3882 */
3883static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
3884{
3885        unsigned long orig_jiffies;
3886        struct e100_serial *info = (struct e100_serial *)tty->driver_data;
3887        unsigned long curr_time = jiffies;
3888        unsigned long curr_time_usec = GET_JIFFIES_USEC();
3889        long elapsed_usec =
3890                (curr_time - info->last_tx_active) * (1000000/HZ) +
3891                curr_time_usec - info->last_tx_active_usec;
3892
3893        /*
3894         * Check R_DMA_CHx_STATUS bit 0-6=number of available bytes in FIFO
3895         * R_DMA_CHx_HWSW bit 31-16=nbr of bytes left in DMA buffer (0=64k)
3896         */
3897        orig_jiffies = jiffies;
3898        while (info->xmit.head != info->xmit.tail || /* More in send queue */
3899               (*info->ostatusadr & 0x007f) ||  /* more in FIFO */
3900               (elapsed_usec < 2*info->char_time_usec)) {
3901                schedule_timeout_interruptible(1);
3902                if (signal_pending(current))
3903                        break;
3904                if (timeout && time_after(jiffies, orig_jiffies + timeout))
3905                        break;
3906                curr_time = jiffies;
3907                curr_time_usec = GET_JIFFIES_USEC();
3908                elapsed_usec =
3909                        (curr_time - info->last_tx_active) * (1000000/HZ) +
3910                        curr_time_usec - info->last_tx_active_usec;
3911        }
3912        set_current_state(TASK_RUNNING);
3913}
3914
3915/*
3916 * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
3917 */
3918void
3919rs_hangup(struct tty_struct *tty)
3920{
3921        struct e100_serial * info = (struct e100_serial *)tty->driver_data;
3922
3923        rs_flush_buffer(tty);
3924        shutdown(info);
3925        info->event = 0;
3926        info->port.count = 0;
3927        info->port.flags &= ~ASYNC_NORMAL_ACTIVE;
3928        info->port.tty = NULL;
3929        wake_up_interruptible(&info->port.open_wait);
3930}
3931
3932/*
3933 * ------------------------------------------------------------
3934 * rs_open() and friends
3935 * ------------------------------------------------------------
3936 */
3937static int
3938block_til_ready(struct tty_struct *tty, struct file * filp,
3939                struct e100_serial *info)
3940{
3941        DECLARE_WAITQUEUE(wait, current);
3942        unsigned long   flags;
3943        int             retval;
3944        int             do_clocal = 0, extra_count = 0;
3945
3946        /*
3947         * If the device is in the middle of being closed, then block
3948         * until it's done, and then try again.
3949         */
3950        if (tty_hung_up_p(filp) ||
3951            (info->port.flags & ASYNC_CLOSING)) {
3952                wait_event_interruptible_tty(tty, info->port.close_wait,
3953                        !(info->port.flags & ASYNC_CLOSING));
3954#ifdef SERIAL_DO_RESTART
3955                if (info->port.flags & ASYNC_HUP_NOTIFY)
3956                        return -EAGAIN;
3957                else
3958                        return -ERESTARTSYS;
3959#else
3960                return -EAGAIN;
3961#endif
3962        }
3963
3964        /*
3965         * If non-blocking mode is set, or the port is not enabled,
3966         * then make the check up front and then exit.
3967         */
3968        if ((filp->f_flags & O_NONBLOCK) ||
3969            (tty->flags & (1 << TTY_IO_ERROR))) {
3970                info->port.flags |= ASYNC_NORMAL_ACTIVE;
3971                return 0;
3972        }
3973
3974        if (tty->termios.c_cflag & CLOCAL) {
3975                        do_clocal = 1;
3976        }
3977
3978        /*
3979         * Block waiting for the carrier detect and the line to become
3980         * free (i.e., not in use by the callout).  While we are in
3981         * this loop, info->port.count is dropped by one, so that
3982         * rs_close() knows when to free things.  We restore it upon
3983         * exit, either normal or abnormal.
3984         */
3985        retval = 0;
3986        add_wait_queue(&info->port.open_wait, &wait);
3987#ifdef SERIAL_DEBUG_OPEN
3988        printk("block_til_ready before block: ttyS%d, count = %d\n",
3989               info->line, info->port.count);
3990#endif
3991        local_irq_save(flags);
3992        if (!tty_hung_up_p(filp)) {
3993                extra_count++;
3994                info->port.count--;
3995        }
3996        local_irq_restore(flags);
3997        info->port.blocked_open++;
3998        while (1) {
3999                local_irq_save(flags);
4000                /* assert RTS and DTR */
4001                e100_rts(info, 1);
4002                e100_dtr(info, 1);
4003                local_irq_restore(flags);
4004                set_current_state(TASK_INTERRUPTIBLE);
4005                if (tty_hung_up_p(filp) ||
4006                    !(info->port.flags & ASYNC_INITIALIZED)) {
4007#ifdef SERIAL_DO_RESTART
4008                        if (info->port.flags & ASYNC_HUP_NOTIFY)
4009                                retval = -EAGAIN;
4010                        else
4011                                retval = -ERESTARTSYS;
4012#else
4013                        retval = -EAGAIN;
4014#endif
4015                        break;
4016                }
4017                if (!(info->port.flags & ASYNC_CLOSING) && do_clocal)
4018                        /* && (do_clocal || DCD_IS_ASSERTED) */
4019                        break;
4020                if (signal_pending(current)) {
4021                        retval = -ERESTARTSYS;
4022                        break;
4023                }
4024#ifdef SERIAL_DEBUG_OPEN
4025                printk("block_til_ready blocking: ttyS%d, count = %d\n",
4026                       info->line, info->port.count);
4027#endif
4028                tty_unlock(tty);
4029                schedule();
4030                tty_lock(tty);
4031        }
4032        set_current_state(TASK_RUNNING);
4033        remove_wait_queue(&info->port.open_wait, &wait);
4034        if (extra_count)
4035                info->port.count++;
4036        info->port.blocked_open--;
4037#ifdef SERIAL_DEBUG_OPEN
4038        printk("block_til_ready after blocking: ttyS%d, count = %d\n",
4039               info->line, info->port.count);
4040#endif
4041        if (retval)
4042                return retval;
4043        info->port.flags |= ASYNC_NORMAL_ACTIVE;
4044        return 0;
4045}
4046
4047static void
4048deinit_port(struct e100_serial *info)
4049{
4050        if (info->dma_out_enabled) {
4051                cris_free_dma(info->dma_out_nbr, info->dma_out_irq_description);
4052                free_irq(info->dma_out_irq_nbr, info);
4053        }
4054        if (info->dma_in_enabled) {
4055                cris_free_dma(info->dma_in_nbr, info->dma_in_irq_description);
4056                free_irq(info->dma_in_irq_nbr, info);
4057        }
4058}
4059
4060/*
4061 * This routine is called whenever a serial port is opened.
4062 * It performs the serial-specific initialization for the tty structure.
4063 */
4064static int
4065rs_open(struct tty_struct *tty, struct file * filp)
4066{
4067        struct e100_serial      *info;
4068        int                     retval;
4069        int                     allocated_resources = 0;
4070
4071        info = rs_table + tty->index;
4072        if (!info->enabled)
4073                return -ENODEV;
4074
4075#ifdef SERIAL_DEBUG_OPEN
4076        printk("[%d] rs_open %s, count = %d\n", current->pid, tty->name,
4077               info->port.count);
4078#endif
4079
4080        info->port.count++;
4081        tty->driver_data = info;
4082        info->port.tty = tty;
4083
4084        info->port.low_latency = !!(info->port.flags & ASYNC_LOW_LATENCY);
4085
4086        /*
4087         * If the port is in the middle of closing, bail out now
4088         */
4089        if (tty_hung_up_p(filp) ||
4090            (info->port.flags & ASYNC_CLOSING)) {
4091                wait_event_interruptible_tty(tty, info->port.close_wait,
4092                        !(info->port.flags & ASYNC_CLOSING));
4093#ifdef SERIAL_DO_RESTART
4094                return ((info->port.flags & ASYNC_HUP_NOTIFY) ?
4095                        -EAGAIN : -ERESTARTSYS);
4096#else
4097                return -EAGAIN;
4098#endif
4099        }
4100
4101        /*
4102         * If DMA is enabled try to allocate the irq's.
4103         */
4104        if (info->port.count == 1) {
4105                allocated_resources = 1;
4106                if (info->dma_in_enabled) {
4107                        if (request_irq(info->dma_in_irq_nbr,
4108                                        rec_interrupt,
4109                                        info->dma_in_irq_flags,
4110                                        info->dma_in_irq_description,
4111                                        info)) {
4112                                printk(KERN_WARNING "DMA irq '%s' busy; "
4113                                        "falling back to non-DMA mode\n",
4114                                        info->dma_in_irq_description);
4115                                /* Make sure we never try to use DMA in */
4116                                /* for the port again. */
4117                                info->dma_in_enabled = 0;
4118                        } else if (cris_request_dma(info->dma_in_nbr,
4119                                        info->dma_in_irq_description,
4120                                        DMA_VERBOSE_ON_ERROR,
4121                                        info->dma_owner)) {
4122                                free_irq(info->dma_in_irq_nbr, info);
4123                                printk(KERN_WARNING "DMA '%s' busy; "
4124                                        "falling back to non-DMA mode\n",
4125                                        info->dma_in_irq_description);
4126                                /* Make sure we never try to use DMA in */
4127                                /* for the port again. */
4128                                info->dma_in_enabled = 0;
4129                        }
4130#ifdef SERIAL_DEBUG_OPEN
4131                        else
4132                                printk(KERN_DEBUG "DMA irq '%s' allocated\n",
4133                                        info->dma_in_irq_description);
4134#endif
4135                }
4136                if (info->dma_out_enabled) {
4137                        if (request_irq(info->dma_out_irq_nbr,
4138                                               tr_interrupt,
4139                                               info->dma_out_irq_flags,
4140                                               info->dma_out_irq_description,
4141                                               info)) {
4142                                printk(KERN_WARNING "DMA irq '%s' busy; "
4143                                        "falling back to non-DMA mode\n",
4144                                        info->dma_out_irq_description);
4145                                /* Make sure we never try to use DMA out */
4146                                /* for the port again. */
4147                                info->dma_out_enabled = 0;
4148                        } else if (cris_request_dma(info->dma_out_nbr,
4149                                             info->dma_out_irq_description,
4150                                             DMA_VERBOSE_ON_ERROR,
4151                                             info->dma_owner)) {
4152                                free_irq(info->dma_out_irq_nbr, info);
4153                                printk(KERN_WARNING "DMA '%s' busy; "
4154                                        "falling back to non-DMA mode\n",
4155                                        info->dma_out_irq_description);
4156                                /* Make sure we never try to use DMA out */
4157                                /* for the port again. */
4158                                info->dma_out_enabled = 0;
4159                        }
4160#ifdef SERIAL_DEBUG_OPEN
4161                        else
4162                                printk(KERN_DEBUG "DMA irq '%s' allocated\n",
4163                                        info->dma_out_irq_description);
4164#endif
4165                }
4166        }
4167
4168        /*
4169         * Start up the serial port
4170         */
4171
4172        retval = startup(info);
4173        if (retval) {
4174                if (allocated_resources)
4175                        deinit_port(info);
4176
4177                /* FIXME Decrease count info->port.count here too? */
4178                return retval;
4179        }
4180
4181
4182        retval = block_til_ready(tty, filp, info);
4183        if (retval) {
4184#ifdef SERIAL_DEBUG_OPEN
4185                printk("rs_open returning after block_til_ready with %d\n",
4186                       retval);
4187#endif
4188                if (allocated_resources)
4189                        deinit_port(info);
4190
4191                return retval;
4192        }
4193
4194        if ((info->port.count == 1) && (info->port.flags & ASYNC_SPLIT_TERMIOS)) {
4195                tty->termios = info->normal_termios;
4196                change_speed(info);
4197        }
4198
4199#ifdef SERIAL_DEBUG_OPEN
4200        printk("rs_open ttyS%d successful...\n", info->line);
4201#endif
4202        DLOG_INT_TRIG( log_int_pos = 0);
4203
4204        DFLIP(  if (info->line == SERIAL_DEBUG_LINE) {
4205                        info->icount.rx = 0;
4206                } );
4207
4208        return 0;
4209}
4210
4211#ifdef CONFIG_PROC_FS
4212/*
4213 * /proc fs routines....
4214 */
4215
4216static void seq_line_info(struct seq_file *m, struct e100_serial *info)
4217{
4218        unsigned long tmp;
4219
4220        seq_printf(m, "%d: uart:E100 port:%lX irq:%d",
4221                   info->line, (unsigned long)info->ioport, info->irq);
4222
4223        if (!info->ioport || (info->type == PORT_UNKNOWN)) {
4224                seq_printf(m, "\n");
4225                return;
4226        }
4227
4228        seq_printf(m, " baud:%d", info->baud);
4229        seq_printf(m, " tx:%lu rx:%lu",
4230                       (unsigned long)info->icount.tx,
4231                       (unsigned long)info->icount.rx);
4232        tmp = CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
4233        if (tmp)
4234                seq_printf(m, " tx_pend:%lu/%lu",
4235                           (unsigned long)tmp,
4236                           (unsigned long)SERIAL_XMIT_SIZE);
4237
4238        seq_printf(m, " rx_pend:%lu/%lu",
4239                   (unsigned long)info->recv_cnt,
4240                   (unsigned long)info->max_recv_cnt);
4241
4242#if 1
4243        if (info->port.tty) {
4244                if (info->port.tty->stopped)
4245                        seq_printf(m, " stopped:%i",
4246                                   (int)info->port.tty->stopped);
4247        }
4248
4249        {
4250                unsigned char rstat = info->ioport[REG_STATUS];
4251                if (rstat & IO_MASK(R_SERIAL0_STATUS, xoff_detect))
4252                        seq_printf(m, " xoff_detect:1");
4253        }
4254
4255#endif
4256
4257        if (info->icount.frame)
4258                seq_printf(m, " fe:%lu", (unsigned long)info->icount.frame);
4259
4260        if (info->icount.parity)
4261                seq_printf(m, " pe:%lu", (unsigned long)info->icount.parity);
4262
4263        if (info->icount.brk)
4264                seq_printf(m, " brk:%lu", (unsigned long)info->icount.brk);
4265
4266        if (info->icount.overrun)
4267                seq_printf(m, " oe:%lu", (unsigned long)info->icount.overrun);
4268
4269        /*
4270         * Last thing is the RS-232 status lines
4271         */
4272        if (!E100_RTS_GET(info))
4273                seq_puts(m, "|RTS");
4274        if (!E100_CTS_GET(info))
4275                seq_puts(m, "|CTS");
4276        if (!E100_DTR_GET(info))
4277                seq_puts(m, "|DTR");
4278        if (!E100_DSR_GET(info))
4279                seq_puts(m, "|DSR");
4280        if (!E100_CD_GET(info))
4281                seq_puts(m, "|CD");
4282        if (!E100_RI_GET(info))
4283                seq_puts(m, "|RI");
4284        seq_puts(m, "\n");
4285}
4286
4287
4288static int crisv10_proc_show(struct seq_file *m, void *v)
4289{
4290        int i;
4291
4292        seq_printf(m, "serinfo:1.0 driver:%s\n", serial_version);
4293
4294        for (i = 0; i < NR_PORTS; i++) {
4295                if (!rs_table[i].enabled)
4296                        continue;
4297                seq_line_info(m, &rs_table[i]);
4298        }
4299#ifdef DEBUG_LOG_INCLUDED
4300        for (i = 0; i < debug_log_pos; i++) {
4301                seq_printf(m, "%-4i %lu.%lu ",
4302                         i, debug_log[i].time,
4303                         timer_data_to_ns(debug_log[i].timer_data));
4304                seq_printf(m, debug_log[i].string, debug_log[i].value);
4305        }
4306        seq_printf(m, "debug_log %i/%i\n", i, DEBUG_LOG_SIZE);
4307        debug_log_pos = 0;
4308#endif
4309        return 0;
4310}
4311
4312static int crisv10_proc_open(struct inode *inode, struct file *file)
4313{
4314        return single_open(file, crisv10_proc_show, NULL);
4315}
4316
4317static const struct file_operations crisv10_proc_fops = {
4318        .owner          = THIS_MODULE,
4319        .open           = crisv10_proc_open,
4320        .read           = seq_read,
4321        .llseek         = seq_lseek,
4322        .release        = single_release,
4323};
4324#endif
4325
4326
4327/* Finally, routines used to initialize the serial driver. */
4328
4329static void show_serial_version(void)
4330{
4331        printk(KERN_INFO
4332               "ETRAX 100LX serial-driver %s, "
4333               "(c) 2000-2004 Axis Communications AB\r\n",
4334               &serial_version[11]); /* "$Revision: x.yy" */
4335}
4336
4337/* rs_init inits the driver at boot (using the module_init chain) */
4338
4339static const struct tty_operations rs_ops = {
4340        .open = rs_open,
4341        .close = rs_close,
4342        .write = rs_write,
4343        .flush_chars = rs_flush_chars,
4344        .write_room = rs_write_room,
4345        .chars_in_buffer = rs_chars_in_buffer,
4346        .flush_buffer = rs_flush_buffer,
4347        .ioctl = rs_ioctl,
4348        .throttle = rs_throttle,
4349        .unthrottle = rs_unthrottle,
4350        .set_termios = rs_set_termios,
4351        .stop = rs_stop,
4352        .start = rs_start,
4353        .hangup = rs_hangup,
4354        .break_ctl = rs_break,
4355        .send_xchar = rs_send_xchar,
4356        .wait_until_sent = rs_wait_until_sent,
4357        .tiocmget = rs_tiocmget,
4358        .tiocmset = rs_tiocmset,
4359#ifdef CONFIG_PROC_FS
4360        .proc_fops = &crisv10_proc_fops,
4361#endif
4362};
4363
4364static int __init rs_init(void)
4365{
4366        int i;
4367        struct e100_serial *info;
4368        struct tty_driver *driver = alloc_tty_driver(NR_PORTS);
4369
4370        if (!driver)
4371                return -ENOMEM;
4372
4373        show_serial_version();
4374
4375        /* Setup the timed flush handler system */
4376
4377#if !defined(CONFIG_ETRAX_SERIAL_FAST_TIMER)
4378        setup_timer(&flush_timer, timed_flush_handler, 0);
4379        mod_timer(&flush_timer, jiffies + 5);
4380#endif
4381
4382#if defined(CONFIG_ETRAX_RS485)
4383#if defined(CONFIG_ETRAX_RS485_ON_PA)
4384        if (cris_io_interface_allocate_pins(if_serial_0, 'a', rs485_pa_bit,
4385                        rs485_pa_bit)) {
4386                printk(KERN_ERR "ETRAX100LX serial: Could not allocate "
4387                        "RS485 pin\n");
4388                put_tty_driver(driver);
4389                return -EBUSY;
4390        }
4391#endif
4392#if defined(CONFIG_ETRAX_RS485_ON_PORT_G)
4393        if (cris_io_interface_allocate_pins(if_serial_0, 'g', rs485_pa_bit,
4394                        rs485_port_g_bit)) {
4395                printk(KERN_ERR "ETRAX100LX serial: Could not allocate "
4396                        "RS485 pin\n");
4397                put_tty_driver(driver);
4398                return -EBUSY;
4399        }
4400#endif
4401#endif
4402
4403        /* Initialize the tty_driver structure */
4404
4405        driver->driver_name = "serial";
4406        driver->name = "ttyS";
4407        driver->major = TTY_MAJOR;
4408        driver->minor_start = 64;
4409        driver->type = TTY_DRIVER_TYPE_SERIAL;
4410        driver->subtype = SERIAL_TYPE_NORMAL;
4411        driver->init_termios = tty_std_termios;
4412        driver->init_termios.c_cflag =
4413                B115200 | CS8 | CREAD | HUPCL | CLOCAL; /* is normally B9600 default... */
4414        driver->init_termios.c_ispeed = 115200;
4415        driver->init_termios.c_ospeed = 115200;
4416        driver->flags = TTY_DRIVER_REAL_RAW;
4417
4418        tty_set_operations(driver, &rs_ops);
4419        serial_driver = driver;
4420
4421        /* do some initializing for the separate ports */
4422        for (i = 0, info = rs_table; i < NR_PORTS; i++,info++) {
4423                if (info->enabled) {
4424                        if (cris_request_io_interface(info->io_if,
4425                                        info->io_if_description)) {
4426                                printk(KERN_ERR "ETRAX100LX async serial: "
4427                                        "Could not allocate IO pins for "
4428                                        "%s, port %d\n",
4429                                        info->io_if_description, i);
4430                                info->enabled = 0;
4431                        }
4432                }
4433                tty_port_init(&info->port);
4434                info->uses_dma_in = 0;
4435                info->uses_dma_out = 0;
4436                info->line = i;
4437                info->port.tty = NULL;
4438                info->type = PORT_ETRAX;
4439                info->tr_running = 0;
4440                info->forced_eop = 0;
4441                info->baud_base = DEF_BAUD_BASE;
4442                info->custom_divisor = 0;
4443                info->x_char = 0;
4444                info->event = 0;
4445                info->normal_termios = driver->init_termios;
4446                info->xmit.buf = NULL;
4447                info->xmit.tail = info->xmit.head = 0;
4448                info->first_recv_buffer = info->last_recv_buffer = NULL;
4449                info->recv_cnt = info->max_recv_cnt = 0;
4450                info->last_tx_active_usec = 0;
4451                info->last_tx_active = 0;
4452
4453#if defined(CONFIG_ETRAX_RS485)
4454                /* Set sane defaults */
4455                info->rs485.flags &= ~(SER_RS485_RTS_ON_SEND);
4456                info->rs485.flags |= SER_RS485_RTS_AFTER_SEND;
4457                info->rs485.delay_rts_before_send = 0;
4458                info->rs485.flags &= ~(SER_RS485_ENABLED);
4459#endif
4460                INIT_WORK(&info->work, do_softint);
4461
4462                if (info->enabled) {
4463                        printk(KERN_INFO "%s%d at %p is a builtin UART with DMA\n",
4464                               serial_driver->name, info->line, info->ioport);
4465                }
4466                tty_port_link_device(&info->port, driver, i);
4467        }
4468
4469        if (tty_register_driver(driver))
4470                panic("Couldn't register serial driver\n");
4471
4472#ifdef CONFIG_ETRAX_FAST_TIMER
4473#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
4474        memset(fast_timers, 0, sizeof(fast_timers));
4475#endif
4476#ifdef CONFIG_ETRAX_RS485
4477        memset(fast_timers_rs485, 0, sizeof(fast_timers_rs485));
4478#endif
4479        fast_timer_init();
4480#endif
4481
4482#ifndef CONFIG_SVINTO_SIM
4483#ifndef CONFIG_ETRAX_KGDB
4484        /* Not needed in simulator.  May only complicate stuff. */
4485        /* hook the irq's for DMA channel 6 and 7, serial output and input, and some more... */
4486
4487        if (request_irq(SERIAL_IRQ_NBR, ser_interrupt,
4488                        IRQF_SHARED, "serial ", driver))
4489                panic("%s: Failed to request irq8", __func__);
4490
4491#endif
4492#endif /* CONFIG_SVINTO_SIM */
4493
4494        return 0;
4495}
4496
4497/* this makes sure that rs_init is called during kernel boot */
4498
4499module_init(rs_init);
4500