Merge branch 'tty-updates' from Alan
* tty-updates: (75 commits) serial_8250: support for Sealevel Systems Model 7803 COMM+8 hso maintainers update patch hso modem detect fix patch against Alan Cox'es tty tree tty: Fix an ircomm warning and note another bug drivers/char/cyclades.c: cy_pci_probe: fix error path Serial: UART driver changes for Cavium OCTEON. Serial: Allow port type to be specified when calling serial8250_register_port. 8250: Serial driver changes to support future Cavium OCTEON serial patches. 8250: Don't clobber spinlocks. fix for tty-serial-move-port tty: We want the port object to be persistent __FUNCTION__ is gcc-specific, use __func__ serial: RS485 ioctl structure uses __u32 include linux/types.h tty: Drop the lock_kernel in the private ioctl hook synclink_cs: Convert to tty_port tty: use port methods for the rocket driver tty: kref the rocket driver tty: make rocketport use standard port->flags tty: Redo the rocket driver locking tty: Make epca use the port helpers ...
This commit is contained in:
@@ -31,7 +31,7 @@ struct pciserial_board {
|
||||
struct serial_private;
|
||||
|
||||
struct serial_private *
|
||||
pciserial_init_ports(struct pci_dev *dev, struct pciserial_board *board);
|
||||
pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board);
|
||||
void pciserial_remove_ports(struct serial_private *priv);
|
||||
void pciserial_suspend_ports(struct serial_private *priv);
|
||||
void pciserial_resume_ports(struct serial_private *priv);
|
||||
|
||||
@@ -21,7 +21,6 @@ struct real_driver {
|
||||
void (*enable_tx_interrupts) (void *);
|
||||
void (*disable_rx_interrupts) (void *);
|
||||
void (*enable_rx_interrupts) (void *);
|
||||
int (*get_CD) (void *);
|
||||
void (*shutdown_port) (void*);
|
||||
int (*set_real_termios) (void*);
|
||||
int (*chars_in_buffer) (void*);
|
||||
|
||||
@@ -59,9 +59,7 @@ struct stliport {
|
||||
unsigned int devnr;
|
||||
int baud_base;
|
||||
int custom_divisor;
|
||||
int close_delay;
|
||||
int closing_wait;
|
||||
int openwaitcnt;
|
||||
int rc;
|
||||
int argsize;
|
||||
void *argp;
|
||||
|
||||
@@ -1766,6 +1766,7 @@
|
||||
#define PCI_DEVICE_ID_SIIG_8S_20x_650 0x2081
|
||||
#define PCI_DEVICE_ID_SIIG_8S_20x_850 0x2082
|
||||
#define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL 0x2050
|
||||
#define PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL 0x2530
|
||||
|
||||
#define PCI_VENDOR_ID_RADISYS 0x1331
|
||||
|
||||
@@ -1795,6 +1796,7 @@
|
||||
#define PCI_DEVICE_ID_SEALEVEL_UCOMM232 0x7202
|
||||
#define PCI_DEVICE_ID_SEALEVEL_COMM4 0x7401
|
||||
#define PCI_DEVICE_ID_SEALEVEL_COMM8 0x7801
|
||||
#define PCI_DEVICE_ID_SEALEVEL_7803 0x7803
|
||||
#define PCI_DEVICE_ID_SEALEVEL_UCOMM8 0x7804
|
||||
|
||||
#define PCI_VENDOR_ID_HYPERCOPE 0x1365
|
||||
|
||||
@@ -10,8 +10,9 @@
|
||||
#ifndef _LINUX_SERIAL_H
|
||||
#define _LINUX_SERIAL_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <asm/page.h>
|
||||
|
||||
/*
|
||||
|
||||
@@ -28,6 +28,9 @@ struct plat_serial8250_port {
|
||||
unsigned char iotype; /* UPIO_* */
|
||||
unsigned char hub6;
|
||||
upf_t flags; /* UPF_* flags */
|
||||
unsigned int type; /* If UPF_FIXED_TYPE */
|
||||
unsigned int (*serial_in)(struct uart_port *, int);
|
||||
void (*serial_out)(struct uart_port *, int, int);
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -40,7 +40,8 @@
|
||||
#define PORT_NS16550A 14
|
||||
#define PORT_XSCALE 15
|
||||
#define PORT_RM9000 16 /* PMC-Sierra RM9xxx internal UART */
|
||||
#define PORT_MAX_8250 16 /* max port ID */
|
||||
#define PORT_OCTEON 17 /* Cavium OCTEON internal UART */
|
||||
#define PORT_MAX_8250 17 /* max port ID */
|
||||
|
||||
/*
|
||||
* ARM specific type numbers. These are not currently guaranteed
|
||||
@@ -248,6 +249,8 @@ struct uart_port {
|
||||
spinlock_t lock; /* port lock */
|
||||
unsigned long iobase; /* in/out[bwl] */
|
||||
unsigned char __iomem *membase; /* read/write[bwl] */
|
||||
unsigned int (*serial_in)(struct uart_port *, int);
|
||||
void (*serial_out)(struct uart_port *, int, int);
|
||||
unsigned int irq; /* irq number */
|
||||
unsigned int uartclk; /* base uart clock */
|
||||
unsigned int fifosize; /* tx fifo size */
|
||||
@@ -293,6 +296,8 @@ struct uart_port {
|
||||
#define UPF_MAGIC_MULTIPLIER ((__force upf_t) (1 << 16))
|
||||
#define UPF_CONS_FLOW ((__force upf_t) (1 << 23))
|
||||
#define UPF_SHARE_IRQ ((__force upf_t) (1 << 24))
|
||||
/* The exact UART type is known and should not be probed. */
|
||||
#define UPF_FIXED_TYPE ((__force upf_t) (1 << 27))
|
||||
#define UPF_BOOT_AUTOCONF ((__force upf_t) (1 << 28))
|
||||
#define UPF_FIXED_PORT ((__force upf_t) (1 << 29))
|
||||
#define UPF_DEAD ((__force upf_t) (1 << 30))
|
||||
@@ -315,36 +320,14 @@ struct uart_port {
|
||||
void *private_data; /* generic platform data pointer */
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the state information which is persistent across opens.
|
||||
* The low level driver must not to touch any elements contained
|
||||
* within.
|
||||
*/
|
||||
struct uart_state {
|
||||
unsigned int close_delay; /* msec */
|
||||
unsigned int closing_wait; /* msec */
|
||||
|
||||
#define USF_CLOSING_WAIT_INF (0)
|
||||
#define USF_CLOSING_WAIT_NONE (~0U)
|
||||
|
||||
int count;
|
||||
int pm_state;
|
||||
struct uart_info *info;
|
||||
struct uart_port *port;
|
||||
|
||||
struct mutex mutex;
|
||||
};
|
||||
|
||||
#define UART_XMIT_SIZE PAGE_SIZE
|
||||
|
||||
typedef unsigned int __bitwise__ uif_t;
|
||||
|
||||
/*
|
||||
* This is the state information which is only valid when the port
|
||||
* is open; it may be freed by the core driver once the device has
|
||||
* is open; it may be cleared the core driver once the device has
|
||||
* been closed. Either the low level driver or the core can modify
|
||||
* stuff here.
|
||||
*/
|
||||
typedef unsigned int __bitwise__ uif_t;
|
||||
|
||||
struct uart_info {
|
||||
struct tty_port port;
|
||||
struct circ_buf xmit;
|
||||
@@ -366,6 +349,29 @@ struct uart_info {
|
||||
wait_queue_head_t delta_msr_wait;
|
||||
};
|
||||
|
||||
/*
|
||||
* This is the state information which is persistent across opens.
|
||||
* The low level driver must not to touch any elements contained
|
||||
* within.
|
||||
*/
|
||||
struct uart_state {
|
||||
unsigned int close_delay; /* msec */
|
||||
unsigned int closing_wait; /* msec */
|
||||
|
||||
#define USF_CLOSING_WAIT_INF (0)
|
||||
#define USF_CLOSING_WAIT_NONE (~0U)
|
||||
|
||||
int count;
|
||||
int pm_state;
|
||||
struct uart_info info;
|
||||
struct uart_port *port;
|
||||
|
||||
struct mutex mutex;
|
||||
};
|
||||
|
||||
#define UART_XMIT_SIZE PAGE_SIZE
|
||||
|
||||
|
||||
/* number of characters left in xmit buffer before we ask for more */
|
||||
#define WAKEUP_CHARS 256
|
||||
|
||||
@@ -439,8 +445,13 @@ int uart_resume_port(struct uart_driver *reg, struct uart_port *port);
|
||||
#define uart_circ_chars_free(circ) \
|
||||
(CIRC_SPACE((circ)->head, (circ)->tail, UART_XMIT_SIZE))
|
||||
|
||||
#define uart_tx_stopped(portp) \
|
||||
((portp)->info->port.tty->stopped || (portp)->info->port.tty->hw_stopped)
|
||||
static inline int uart_tx_stopped(struct uart_port *port)
|
||||
{
|
||||
struct tty_struct *tty = port->info->port.tty;
|
||||
if(tty->stopped || tty->hw_stopped)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The following are helper functions for the low level drivers.
|
||||
@@ -451,7 +462,7 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
|
||||
#ifdef SUPPORT_SYSRQ
|
||||
if (port->sysrq) {
|
||||
if (ch && time_before(jiffies, port->sysrq)) {
|
||||
handle_sysrq(ch, port->info ? port->info->port.tty : NULL);
|
||||
handle_sysrq(ch, port->info->port.tty);
|
||||
port->sysrq = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -180,8 +180,17 @@ struct signal_struct;
|
||||
* until a hangup so don't use the wrong path.
|
||||
*/
|
||||
|
||||
struct tty_port;
|
||||
|
||||
struct tty_port_operations {
|
||||
/* Return 1 if the carrier is raised */
|
||||
int (*carrier_raised)(struct tty_port *port);
|
||||
void (*raise_dtr_rts)(struct tty_port *port);
|
||||
};
|
||||
|
||||
struct tty_port {
|
||||
struct tty_struct *tty; /* Back pointer */
|
||||
const struct tty_port_operations *ops; /* Port operations */
|
||||
spinlock_t lock; /* Lock protecting tty field */
|
||||
int blocked_open; /* Waiting to open */
|
||||
int count; /* Usage count */
|
||||
@@ -253,6 +262,7 @@ struct tty_struct {
|
||||
unsigned int column;
|
||||
unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
|
||||
unsigned char closing:1;
|
||||
unsigned char echo_overrun:1;
|
||||
unsigned short minimum_to_wake;
|
||||
unsigned long overrun_time;
|
||||
int num_overrun;
|
||||
@@ -262,11 +272,16 @@ struct tty_struct {
|
||||
int read_tail;
|
||||
int read_cnt;
|
||||
unsigned long read_flags[N_TTY_BUF_SIZE/(8*sizeof(unsigned long))];
|
||||
unsigned char *echo_buf;
|
||||
unsigned int echo_pos;
|
||||
unsigned int echo_cnt;
|
||||
int canon_data;
|
||||
unsigned long canon_head;
|
||||
unsigned int canon_column;
|
||||
struct mutex atomic_read_lock;
|
||||
struct mutex atomic_write_lock;
|
||||
struct mutex output_lock;
|
||||
struct mutex echo_lock;
|
||||
unsigned char *write_buf;
|
||||
int write_cnt;
|
||||
spinlock_t read_lock;
|
||||
@@ -295,6 +310,7 @@ struct tty_struct {
|
||||
#define TTY_PUSH 6 /* n_tty private */
|
||||
#define TTY_CLOSING 7 /* ->close() in progress */
|
||||
#define TTY_LDISC 9 /* Line discipline attached */
|
||||
#define TTY_LDISC_CHANGING 10 /* Line discipline changing */
|
||||
#define TTY_HW_COOK_OUT 14 /* Hardware can do output cooking */
|
||||
#define TTY_HW_COOK_IN 15 /* Hardware can do input cooking */
|
||||
#define TTY_PTY_LOCK 16 /* pty private */
|
||||
@@ -354,8 +370,7 @@ extern int tty_write_room(struct tty_struct *tty);
|
||||
extern void tty_driver_flush_buffer(struct tty_struct *tty);
|
||||
extern void tty_throttle(struct tty_struct *tty);
|
||||
extern void tty_unthrottle(struct tty_struct *tty);
|
||||
extern int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty,
|
||||
struct winsize *ws);
|
||||
extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws);
|
||||
extern void tty_shutdown(struct tty_struct *tty);
|
||||
extern void tty_free_termios(struct tty_struct *tty);
|
||||
extern int is_current_pgrp_orphaned(void);
|
||||
@@ -421,6 +436,14 @@ extern int tty_port_alloc_xmit_buf(struct tty_port *port);
|
||||
extern void tty_port_free_xmit_buf(struct tty_port *port);
|
||||
extern struct tty_struct *tty_port_tty_get(struct tty_port *port);
|
||||
extern void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty);
|
||||
extern int tty_port_carrier_raised(struct tty_port *port);
|
||||
extern void tty_port_raise_dtr_rts(struct tty_port *port);
|
||||
extern void tty_port_hangup(struct tty_port *port);
|
||||
extern int tty_port_block_til_ready(struct tty_port *port,
|
||||
struct tty_struct *tty, struct file *filp);
|
||||
extern int tty_port_close_start(struct tty_port *port,
|
||||
struct tty_struct *tty, struct file *filp);
|
||||
extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty);
|
||||
|
||||
extern int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc);
|
||||
extern int tty_unregister_ldisc(int disc);
|
||||
|
||||
@@ -196,8 +196,7 @@
|
||||
* Optional: If not provided then the write method is called under
|
||||
* the atomic write lock to keep it serialized with the ldisc.
|
||||
*
|
||||
* int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty,
|
||||
* unsigned int rows, unsigned int cols);
|
||||
* int (*resize)(struct tty_struct *tty, struct winsize *ws)
|
||||
*
|
||||
* Called when a termios request is issued which changes the
|
||||
* requested terminal geometry.
|
||||
@@ -258,8 +257,7 @@ struct tty_operations {
|
||||
int (*tiocmget)(struct tty_struct *tty, struct file *file);
|
||||
int (*tiocmset)(struct tty_struct *tty, struct file *file,
|
||||
unsigned int set, unsigned int clear);
|
||||
int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty,
|
||||
struct winsize *ws);
|
||||
int (*resize)(struct tty_struct *tty, struct winsize *ws);
|
||||
int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew);
|
||||
#ifdef CONFIG_CONSOLE_POLL
|
||||
int (*poll_init)(struct tty_driver *driver, int line, char *options);
|
||||
|
||||
Reference in New Issue
Block a user