|
@@ -151,18 +151,15 @@ struct _input_signal_events {
|
|
typedef struct _synclinkmp_info {
|
|
typedef struct _synclinkmp_info {
|
|
void *if_ptr; /* General purpose pointer (used by SPPP) */
|
|
void *if_ptr; /* General purpose pointer (used by SPPP) */
|
|
int magic;
|
|
int magic;
|
|
- int flags;
|
|
|
|
- int count; /* count of opens */
|
|
|
|
|
|
+ struct tty_port port;
|
|
int line;
|
|
int line;
|
|
unsigned short close_delay;
|
|
unsigned short close_delay;
|
|
unsigned short closing_wait; /* time to wait before closing */
|
|
unsigned short closing_wait; /* time to wait before closing */
|
|
|
|
|
|
struct mgsl_icount icount;
|
|
struct mgsl_icount icount;
|
|
|
|
|
|
- struct tty_struct *tty;
|
|
|
|
int timeout;
|
|
int timeout;
|
|
int x_char; /* xon/xoff character */
|
|
int x_char; /* xon/xoff character */
|
|
- int blocked_open; /* # of blocked opens */
|
|
|
|
u16 read_status_mask1; /* break detection (SR1 indications) */
|
|
u16 read_status_mask1; /* break detection (SR1 indications) */
|
|
u16 read_status_mask2; /* parity/framing/overun (SR2 indications) */
|
|
u16 read_status_mask2; /* parity/framing/overun (SR2 indications) */
|
|
unsigned char ignore_status_mask1; /* break detection (SR1 indications) */
|
|
unsigned char ignore_status_mask1; /* break detection (SR1 indications) */
|
|
@@ -172,9 +169,6 @@ typedef struct _synclinkmp_info {
|
|
int tx_get;
|
|
int tx_get;
|
|
int tx_count;
|
|
int tx_count;
|
|
|
|
|
|
- wait_queue_head_t open_wait;
|
|
|
|
- wait_queue_head_t close_wait;
|
|
|
|
-
|
|
|
|
wait_queue_head_t status_event_wait_q;
|
|
wait_queue_head_t status_event_wait_q;
|
|
wait_queue_head_t event_wait_q;
|
|
wait_queue_head_t event_wait_q;
|
|
struct timer_list tx_timer; /* HDLC transmit timeout timer */
|
|
struct timer_list tx_timer; /* HDLC transmit timeout timer */
|
|
@@ -462,13 +456,13 @@ static int synclinkmp_device_count = 0;
|
|
* .text section address and breakpoint on module load.
|
|
* .text section address and breakpoint on module load.
|
|
* This is useful for use with gdb and add-symbol-file command.
|
|
* This is useful for use with gdb and add-symbol-file command.
|
|
*/
|
|
*/
|
|
-static int break_on_load=0;
|
|
|
|
|
|
+static int break_on_load = 0;
|
|
|
|
|
|
/*
|
|
/*
|
|
* Driver major number, defaults to zero to get auto
|
|
* Driver major number, defaults to zero to get auto
|
|
* assigned major number. May be forced as module parameter.
|
|
* assigned major number. May be forced as module parameter.
|
|
*/
|
|
*/
|
|
-static int ttymajor=0;
|
|
|
|
|
|
+static int ttymajor = 0;
|
|
|
|
|
|
/*
|
|
/*
|
|
* Array of user specified options for ISA adapters.
|
|
* Array of user specified options for ISA adapters.
|
|
@@ -747,22 +741,22 @@ static int open(struct tty_struct *tty, struct file *filp)
|
|
}
|
|
}
|
|
|
|
|
|
tty->driver_data = info;
|
|
tty->driver_data = info;
|
|
- info->tty = tty;
|
|
|
|
|
|
+ info->port.tty = tty;
|
|
|
|
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
printk("%s(%d):%s open(), old ref count = %d\n",
|
|
printk("%s(%d):%s open(), old ref count = %d\n",
|
|
- __FILE__,__LINE__,tty->driver->name, info->count);
|
|
|
|
|
|
+ __FILE__,__LINE__,tty->driver->name, info->port.count);
|
|
|
|
|
|
/* If port is closing, signal caller to try again */
|
|
/* If port is closing, signal caller to try again */
|
|
- if (tty_hung_up_p(filp) || info->flags & ASYNC_CLOSING){
|
|
|
|
- if (info->flags & ASYNC_CLOSING)
|
|
|
|
- interruptible_sleep_on(&info->close_wait);
|
|
|
|
- retval = ((info->flags & ASYNC_HUP_NOTIFY) ?
|
|
|
|
|
|
+ if (tty_hung_up_p(filp) || info->port.flags & ASYNC_CLOSING){
|
|
|
|
+ if (info->port.flags & ASYNC_CLOSING)
|
|
|
|
+ interruptible_sleep_on(&info->port.close_wait);
|
|
|
|
+ retval = ((info->port.flags & ASYNC_HUP_NOTIFY) ?
|
|
-EAGAIN : -ERESTARTSYS);
|
|
-EAGAIN : -ERESTARTSYS);
|
|
goto cleanup;
|
|
goto cleanup;
|
|
}
|
|
}
|
|
|
|
|
|
- info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
|
|
|
|
|
|
+ info->port.tty->low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
|
|
|
|
|
|
spin_lock_irqsave(&info->netlock, flags);
|
|
spin_lock_irqsave(&info->netlock, flags);
|
|
if (info->netcount) {
|
|
if (info->netcount) {
|
|
@@ -770,10 +764,10 @@ static int open(struct tty_struct *tty, struct file *filp)
|
|
spin_unlock_irqrestore(&info->netlock, flags);
|
|
spin_unlock_irqrestore(&info->netlock, flags);
|
|
goto cleanup;
|
|
goto cleanup;
|
|
}
|
|
}
|
|
- info->count++;
|
|
|
|
|
|
+ info->port.count++;
|
|
spin_unlock_irqrestore(&info->netlock, flags);
|
|
spin_unlock_irqrestore(&info->netlock, flags);
|
|
|
|
|
|
- if (info->count == 1) {
|
|
|
|
|
|
+ if (info->port.count == 1) {
|
|
/* 1st open on this device, init hardware */
|
|
/* 1st open on this device, init hardware */
|
|
retval = startup(info);
|
|
retval = startup(info);
|
|
if (retval < 0)
|
|
if (retval < 0)
|
|
@@ -796,9 +790,9 @@ static int open(struct tty_struct *tty, struct file *filp)
|
|
cleanup:
|
|
cleanup:
|
|
if (retval) {
|
|
if (retval) {
|
|
if (tty->count == 1)
|
|
if (tty->count == 1)
|
|
- info->tty = NULL; /* tty layer will release tty struct */
|
|
|
|
- if(info->count)
|
|
|
|
- info->count--;
|
|
|
|
|
|
+ info->port.tty = NULL; /* tty layer will release tty struct */
|
|
|
|
+ if(info->port.count)
|
|
|
|
+ info->port.count--;
|
|
}
|
|
}
|
|
|
|
|
|
return retval;
|
|
return retval;
|
|
@@ -816,33 +810,33 @@ static void close(struct tty_struct *tty, struct file *filp)
|
|
|
|
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
printk("%s(%d):%s close() entry, count=%d\n",
|
|
printk("%s(%d):%s close() entry, count=%d\n",
|
|
- __FILE__,__LINE__, info->device_name, info->count);
|
|
|
|
|
|
+ __FILE__,__LINE__, info->device_name, info->port.count);
|
|
|
|
|
|
- if (!info->count)
|
|
|
|
|
|
+ if (!info->port.count)
|
|
return;
|
|
return;
|
|
|
|
|
|
if (tty_hung_up_p(filp))
|
|
if (tty_hung_up_p(filp))
|
|
goto cleanup;
|
|
goto cleanup;
|
|
|
|
|
|
- if ((tty->count == 1) && (info->count != 1)) {
|
|
|
|
|
|
+ if ((tty->count == 1) && (info->port.count != 1)) {
|
|
/*
|
|
/*
|
|
* tty->count is 1 and the tty structure will be freed.
|
|
* tty->count is 1 and the tty structure will be freed.
|
|
- * info->count should be one in this case.
|
|
|
|
|
|
+ * info->port.count should be one in this case.
|
|
* if it's not, correct it so that the port is shutdown.
|
|
* if it's not, correct it so that the port is shutdown.
|
|
*/
|
|
*/
|
|
printk("%s(%d):%s close: bad refcount; tty->count is 1, "
|
|
printk("%s(%d):%s close: bad refcount; tty->count is 1, "
|
|
- "info->count is %d\n",
|
|
|
|
- __FILE__,__LINE__, info->device_name, info->count);
|
|
|
|
- info->count = 1;
|
|
|
|
|
|
+ "info->port.count is %d\n",
|
|
|
|
+ __FILE__,__LINE__, info->device_name, info->port.count);
|
|
|
|
+ info->port.count = 1;
|
|
}
|
|
}
|
|
|
|
|
|
- info->count--;
|
|
|
|
|
|
+ info->port.count--;
|
|
|
|
|
|
/* if at least one open remaining, leave hardware active */
|
|
/* if at least one open remaining, leave hardware active */
|
|
- if (info->count)
|
|
|
|
|
|
+ if (info->port.count)
|
|
goto cleanup;
|
|
goto cleanup;
|
|
|
|
|
|
- info->flags |= ASYNC_CLOSING;
|
|
|
|
|
|
+ info->port.flags |= ASYNC_CLOSING;
|
|
|
|
|
|
/* set tty->closing to notify line discipline to
|
|
/* set tty->closing to notify line discipline to
|
|
* only process XON/XOFF characters. Only the N_TTY
|
|
* only process XON/XOFF characters. Only the N_TTY
|
|
@@ -859,7 +853,7 @@ static void close(struct tty_struct *tty, struct file *filp)
|
|
tty_wait_until_sent(tty, info->closing_wait);
|
|
tty_wait_until_sent(tty, info->closing_wait);
|
|
}
|
|
}
|
|
|
|
|
|
- if (info->flags & ASYNC_INITIALIZED)
|
|
|
|
|
|
+ if (info->port.flags & ASYNC_INITIALIZED)
|
|
wait_until_sent(tty, info->timeout);
|
|
wait_until_sent(tty, info->timeout);
|
|
|
|
|
|
flush_buffer(tty);
|
|
flush_buffer(tty);
|
|
@@ -869,23 +863,23 @@ static void close(struct tty_struct *tty, struct file *filp)
|
|
shutdown(info);
|
|
shutdown(info);
|
|
|
|
|
|
tty->closing = 0;
|
|
tty->closing = 0;
|
|
- info->tty = NULL;
|
|
|
|
|
|
+ info->port.tty = NULL;
|
|
|
|
|
|
- if (info->blocked_open) {
|
|
|
|
|
|
+ if (info->port.blocked_open) {
|
|
if (info->close_delay) {
|
|
if (info->close_delay) {
|
|
msleep_interruptible(jiffies_to_msecs(info->close_delay));
|
|
msleep_interruptible(jiffies_to_msecs(info->close_delay));
|
|
}
|
|
}
|
|
- wake_up_interruptible(&info->open_wait);
|
|
|
|
|
|
+ wake_up_interruptible(&info->port.open_wait);
|
|
}
|
|
}
|
|
|
|
|
|
- info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
|
|
|
|
|
|
+ info->port.flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
|
|
|
|
|
|
- wake_up_interruptible(&info->close_wait);
|
|
|
|
|
|
+ wake_up_interruptible(&info->port.close_wait);
|
|
|
|
|
|
cleanup:
|
|
cleanup:
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
printk("%s(%d):%s close() exit, count=%d\n", __FILE__,__LINE__,
|
|
printk("%s(%d):%s close() exit, count=%d\n", __FILE__,__LINE__,
|
|
- tty->driver->name, info->count);
|
|
|
|
|
|
+ tty->driver->name, info->port.count);
|
|
}
|
|
}
|
|
|
|
|
|
/* Called by tty_hangup() when a hangup is signaled.
|
|
/* Called by tty_hangup() when a hangup is signaled.
|
|
@@ -905,11 +899,11 @@ static void hangup(struct tty_struct *tty)
|
|
flush_buffer(tty);
|
|
flush_buffer(tty);
|
|
shutdown(info);
|
|
shutdown(info);
|
|
|
|
|
|
- info->count = 0;
|
|
|
|
- info->flags &= ~ASYNC_NORMAL_ACTIVE;
|
|
|
|
- info->tty = NULL;
|
|
|
|
|
|
+ info->port.count = 0;
|
|
|
|
+ info->port.flags &= ~ASYNC_NORMAL_ACTIVE;
|
|
|
|
+ info->port.tty = NULL;
|
|
|
|
|
|
- wake_up_interruptible(&info->open_wait);
|
|
|
|
|
|
+ wake_up_interruptible(&info->port.open_wait);
|
|
}
|
|
}
|
|
|
|
|
|
/* Set new termios settings
|
|
/* Set new termios settings
|
|
@@ -1123,7 +1117,7 @@ static void wait_until_sent(struct tty_struct *tty, int timeout)
|
|
|
|
|
|
lock_kernel();
|
|
lock_kernel();
|
|
|
|
|
|
- if (!(info->flags & ASYNC_INITIALIZED))
|
|
|
|
|
|
+ if (!(info->port.flags & ASYNC_INITIALIZED))
|
|
goto exit;
|
|
goto exit;
|
|
|
|
|
|
orig_jiffies = jiffies;
|
|
orig_jiffies = jiffies;
|
|
@@ -1636,7 +1630,7 @@ static int hdlcdev_attach(struct net_device *dev, unsigned short encoding,
|
|
unsigned short new_crctype;
|
|
unsigned short new_crctype;
|
|
|
|
|
|
/* return error if TTY interface open */
|
|
/* return error if TTY interface open */
|
|
- if (info->count)
|
|
|
|
|
|
+ if (info->port.count)
|
|
return -EBUSY;
|
|
return -EBUSY;
|
|
|
|
|
|
switch (encoding)
|
|
switch (encoding)
|
|
@@ -1733,7 +1727,7 @@ static int hdlcdev_open(struct net_device *dev)
|
|
|
|
|
|
/* arbitrate between network and tty opens */
|
|
/* arbitrate between network and tty opens */
|
|
spin_lock_irqsave(&info->netlock, flags);
|
|
spin_lock_irqsave(&info->netlock, flags);
|
|
- if (info->count != 0 || info->netcount != 0) {
|
|
|
|
|
|
+ if (info->port.count != 0 || info->netcount != 0) {
|
|
printk(KERN_WARNING "%s: hdlc_open returning busy\n", dev->name);
|
|
printk(KERN_WARNING "%s: hdlc_open returning busy\n", dev->name);
|
|
spin_unlock_irqrestore(&info->netlock, flags);
|
|
spin_unlock_irqrestore(&info->netlock, flags);
|
|
return -EBUSY;
|
|
return -EBUSY;
|
|
@@ -1819,7 +1813,7 @@ static int hdlcdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|
printk("%s:hdlcdev_ioctl(%s)\n",__FILE__,dev->name);
|
|
printk("%s:hdlcdev_ioctl(%s)\n",__FILE__,dev->name);
|
|
|
|
|
|
/* return error if TTY interface open */
|
|
/* return error if TTY interface open */
|
|
- if (info->count)
|
|
|
|
|
|
+ if (info->port.count)
|
|
return -EBUSY;
|
|
return -EBUSY;
|
|
|
|
|
|
if (cmd != SIOCWANDEV)
|
|
if (cmd != SIOCWANDEV)
|
|
@@ -2128,7 +2122,7 @@ static void bh_receive(SLMP_INFO *info)
|
|
|
|
|
|
static void bh_transmit(SLMP_INFO *info)
|
|
static void bh_transmit(SLMP_INFO *info)
|
|
{
|
|
{
|
|
- struct tty_struct *tty = info->tty;
|
|
|
|
|
|
+ struct tty_struct *tty = info->port.tty;
|
|
|
|
|
|
if ( debug_level >= DEBUG_LEVEL_BH )
|
|
if ( debug_level >= DEBUG_LEVEL_BH )
|
|
printk( "%s(%d):%s bh_transmit() entry\n",
|
|
printk( "%s(%d):%s bh_transmit() entry\n",
|
|
@@ -2178,7 +2172,7 @@ static void isr_timer(SLMP_INFO * info)
|
|
|
|
|
|
static void isr_rxint(SLMP_INFO * info)
|
|
static void isr_rxint(SLMP_INFO * info)
|
|
{
|
|
{
|
|
- struct tty_struct *tty = info->tty;
|
|
|
|
|
|
+ struct tty_struct *tty = info->port.tty;
|
|
struct mgsl_icount *icount = &info->icount;
|
|
struct mgsl_icount *icount = &info->icount;
|
|
unsigned char status = read_reg(info, SR1) & info->ie1_value & (FLGD + IDLD + CDCD + BRKD);
|
|
unsigned char status = read_reg(info, SR1) & info->ie1_value & (FLGD + IDLD + CDCD + BRKD);
|
|
unsigned char status2 = read_reg(info, SR2) & info->ie2_value & OVRN;
|
|
unsigned char status2 = read_reg(info, SR2) & info->ie2_value & OVRN;
|
|
@@ -2205,7 +2199,7 @@ static void isr_rxint(SLMP_INFO * info)
|
|
if (!(status & info->ignore_status_mask1)) {
|
|
if (!(status & info->ignore_status_mask1)) {
|
|
if (info->read_status_mask1 & BRKD) {
|
|
if (info->read_status_mask1 & BRKD) {
|
|
tty_insert_flip_char(tty, 0, TTY_BREAK);
|
|
tty_insert_flip_char(tty, 0, TTY_BREAK);
|
|
- if (info->flags & ASYNC_SAK)
|
|
|
|
|
|
+ if (info->port.flags & ASYNC_SAK)
|
|
do_SAK(tty);
|
|
do_SAK(tty);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -2239,7 +2233,7 @@ static void isr_rxrdy(SLMP_INFO * info)
|
|
{
|
|
{
|
|
u16 status;
|
|
u16 status;
|
|
unsigned char DataByte;
|
|
unsigned char DataByte;
|
|
- struct tty_struct *tty = info->tty;
|
|
|
|
|
|
+ struct tty_struct *tty = info->port.tty;
|
|
struct mgsl_icount *icount = &info->icount;
|
|
struct mgsl_icount *icount = &info->icount;
|
|
|
|
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
@@ -2352,7 +2346,7 @@ static void isr_txeom(SLMP_INFO * info, unsigned char status)
|
|
else
|
|
else
|
|
#endif
|
|
#endif
|
|
{
|
|
{
|
|
- if (info->tty && (info->tty->stopped || info->tty->hw_stopped)) {
|
|
|
|
|
|
+ if (info->port.tty && (info->port.tty->stopped || info->port.tty->hw_stopped)) {
|
|
tx_stop(info);
|
|
tx_stop(info);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -2407,7 +2401,7 @@ static void isr_txrdy(SLMP_INFO * info)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if (info->tty && (info->tty->stopped || info->tty->hw_stopped)) {
|
|
|
|
|
|
+ if (info->port.tty && (info->port.tty->stopped || info->port.tty->hw_stopped)) {
|
|
tx_stop(info);
|
|
tx_stop(info);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -2554,29 +2548,29 @@ static void isr_io_pin( SLMP_INFO *info, u16 status )
|
|
wake_up_interruptible(&info->status_event_wait_q);
|
|
wake_up_interruptible(&info->status_event_wait_q);
|
|
wake_up_interruptible(&info->event_wait_q);
|
|
wake_up_interruptible(&info->event_wait_q);
|
|
|
|
|
|
- if ( (info->flags & ASYNC_CHECK_CD) &&
|
|
|
|
|
|
+ if ( (info->port.flags & ASYNC_CHECK_CD) &&
|
|
(status & MISCSTATUS_DCD_LATCHED) ) {
|
|
(status & MISCSTATUS_DCD_LATCHED) ) {
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
printk("%s CD now %s...", info->device_name,
|
|
printk("%s CD now %s...", info->device_name,
|
|
(status & SerialSignal_DCD) ? "on" : "off");
|
|
(status & SerialSignal_DCD) ? "on" : "off");
|
|
if (status & SerialSignal_DCD)
|
|
if (status & SerialSignal_DCD)
|
|
- wake_up_interruptible(&info->open_wait);
|
|
|
|
|
|
+ wake_up_interruptible(&info->port.open_wait);
|
|
else {
|
|
else {
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
printk("doing serial hangup...");
|
|
printk("doing serial hangup...");
|
|
- if (info->tty)
|
|
|
|
- tty_hangup(info->tty);
|
|
|
|
|
|
+ if (info->port.tty)
|
|
|
|
+ tty_hangup(info->port.tty);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if ( (info->flags & ASYNC_CTS_FLOW) &&
|
|
|
|
|
|
+ if ( (info->port.flags & ASYNC_CTS_FLOW) &&
|
|
(status & MISCSTATUS_CTS_LATCHED) ) {
|
|
(status & MISCSTATUS_CTS_LATCHED) ) {
|
|
- if ( info->tty ) {
|
|
|
|
- if (info->tty->hw_stopped) {
|
|
|
|
|
|
+ if ( info->port.tty ) {
|
|
|
|
+ if (info->port.tty->hw_stopped) {
|
|
if (status & SerialSignal_CTS) {
|
|
if (status & SerialSignal_CTS) {
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
printk("CTS tx start...");
|
|
printk("CTS tx start...");
|
|
- info->tty->hw_stopped = 0;
|
|
|
|
|
|
+ info->port.tty->hw_stopped = 0;
|
|
tx_start(info);
|
|
tx_start(info);
|
|
info->pending_bh |= BH_TRANSMIT;
|
|
info->pending_bh |= BH_TRANSMIT;
|
|
return;
|
|
return;
|
|
@@ -2585,7 +2579,7 @@ static void isr_io_pin( SLMP_INFO *info, u16 status )
|
|
if (!(status & SerialSignal_CTS)) {
|
|
if (!(status & SerialSignal_CTS)) {
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
printk("CTS tx stop...");
|
|
printk("CTS tx stop...");
|
|
- info->tty->hw_stopped = 1;
|
|
|
|
|
|
+ info->port.tty->hw_stopped = 1;
|
|
tx_stop(info);
|
|
tx_stop(info);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -2701,7 +2695,7 @@ static irqreturn_t synclinkmp_interrupt(int dummy, void *dev_id)
|
|
* do not request bottom half processing if the
|
|
* do not request bottom half processing if the
|
|
* device is not open in a normal mode.
|
|
* device is not open in a normal mode.
|
|
*/
|
|
*/
|
|
- if ( port && (port->count || port->netcount) &&
|
|
|
|
|
|
+ if ( port && (port->port.count || port->netcount) &&
|
|
port->pending_bh && !port->bh_running &&
|
|
port->pending_bh && !port->bh_running &&
|
|
!port->bh_requested ) {
|
|
!port->bh_requested ) {
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
if ( debug_level >= DEBUG_LEVEL_ISR )
|
|
@@ -2727,7 +2721,7 @@ static int startup(SLMP_INFO * info)
|
|
if ( debug_level >= DEBUG_LEVEL_INFO )
|
|
if ( debug_level >= DEBUG_LEVEL_INFO )
|
|
printk("%s(%d):%s tx_releaseup()\n",__FILE__,__LINE__,info->device_name);
|
|
printk("%s(%d):%s tx_releaseup()\n",__FILE__,__LINE__,info->device_name);
|
|
|
|
|
|
- if (info->flags & ASYNC_INITIALIZED)
|
|
|
|
|
|
+ if (info->port.flags & ASYNC_INITIALIZED)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
if (!info->tx_buf) {
|
|
if (!info->tx_buf) {
|
|
@@ -2750,10 +2744,10 @@ static int startup(SLMP_INFO * info)
|
|
|
|
|
|
mod_timer(&info->status_timer, jiffies + msecs_to_jiffies(10));
|
|
mod_timer(&info->status_timer, jiffies + msecs_to_jiffies(10));
|
|
|
|
|
|
- if (info->tty)
|
|
|
|
- clear_bit(TTY_IO_ERROR, &info->tty->flags);
|
|
|
|
|
|
+ if (info->port.tty)
|
|
|
|
+ clear_bit(TTY_IO_ERROR, &info->port.tty->flags);
|
|
|
|
|
|
- info->flags |= ASYNC_INITIALIZED;
|
|
|
|
|
|
+ info->port.flags |= ASYNC_INITIALIZED;
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -2764,7 +2758,7 @@ static void shutdown(SLMP_INFO * info)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
- if (!(info->flags & ASYNC_INITIALIZED))
|
|
|
|
|
|
+ if (!(info->port.flags & ASYNC_INITIALIZED))
|
|
return;
|
|
return;
|
|
|
|
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
@@ -2786,17 +2780,17 @@ static void shutdown(SLMP_INFO * info)
|
|
|
|
|
|
reset_port(info);
|
|
reset_port(info);
|
|
|
|
|
|
- if (!info->tty || info->tty->termios->c_cflag & HUPCL) {
|
|
|
|
|
|
+ if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) {
|
|
info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
|
|
info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
|
|
set_signals(info);
|
|
set_signals(info);
|
|
}
|
|
}
|
|
|
|
|
|
spin_unlock_irqrestore(&info->lock,flags);
|
|
spin_unlock_irqrestore(&info->lock,flags);
|
|
|
|
|
|
- if (info->tty)
|
|
|
|
- set_bit(TTY_IO_ERROR, &info->tty->flags);
|
|
|
|
|
|
+ if (info->port.tty)
|
|
|
|
+ set_bit(TTY_IO_ERROR, &info->port.tty->flags);
|
|
|
|
|
|
- info->flags &= ~ASYNC_INITIALIZED;
|
|
|
|
|
|
+ info->port.flags &= ~ASYNC_INITIALIZED;
|
|
}
|
|
}
|
|
|
|
|
|
static void program_hw(SLMP_INFO *info)
|
|
static void program_hw(SLMP_INFO *info)
|
|
@@ -2827,7 +2821,7 @@ static void program_hw(SLMP_INFO *info)
|
|
|
|
|
|
get_signals(info);
|
|
get_signals(info);
|
|
|
|
|
|
- if (info->netcount || (info->tty && info->tty->termios->c_cflag & CREAD) )
|
|
|
|
|
|
+ if (info->netcount || (info->port.tty && info->port.tty->termios->c_cflag & CREAD) )
|
|
rx_start(info);
|
|
rx_start(info);
|
|
|
|
|
|
spin_unlock_irqrestore(&info->lock,flags);
|
|
spin_unlock_irqrestore(&info->lock,flags);
|
|
@@ -2840,14 +2834,14 @@ static void change_params(SLMP_INFO *info)
|
|
unsigned cflag;
|
|
unsigned cflag;
|
|
int bits_per_char;
|
|
int bits_per_char;
|
|
|
|
|
|
- if (!info->tty || !info->tty->termios)
|
|
|
|
|
|
+ if (!info->port.tty || !info->port.tty->termios)
|
|
return;
|
|
return;
|
|
|
|
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
printk("%s(%d):%s change_params()\n",
|
|
printk("%s(%d):%s change_params()\n",
|
|
__FILE__,__LINE__, info->device_name );
|
|
__FILE__,__LINE__, info->device_name );
|
|
|
|
|
|
- cflag = info->tty->termios->c_cflag;
|
|
|
|
|
|
+ cflag = info->port.tty->termios->c_cflag;
|
|
|
|
|
|
/* if B0 rate (hangup) specified then negate DTR and RTS */
|
|
/* if B0 rate (hangup) specified then negate DTR and RTS */
|
|
/* otherwise assert DTR and RTS */
|
|
/* otherwise assert DTR and RTS */
|
|
@@ -2895,7 +2889,7 @@ static void change_params(SLMP_INFO *info)
|
|
* current data rate.
|
|
* current data rate.
|
|
*/
|
|
*/
|
|
if (info->params.data_rate <= 460800) {
|
|
if (info->params.data_rate <= 460800) {
|
|
- info->params.data_rate = tty_get_baud_rate(info->tty);
|
|
|
|
|
|
+ info->params.data_rate = tty_get_baud_rate(info->port.tty);
|
|
}
|
|
}
|
|
|
|
|
|
if ( info->params.data_rate ) {
|
|
if ( info->params.data_rate ) {
|
|
@@ -2905,30 +2899,30 @@ static void change_params(SLMP_INFO *info)
|
|
info->timeout += HZ/50; /* Add .02 seconds of slop */
|
|
info->timeout += HZ/50; /* Add .02 seconds of slop */
|
|
|
|
|
|
if (cflag & CRTSCTS)
|
|
if (cflag & CRTSCTS)
|
|
- info->flags |= ASYNC_CTS_FLOW;
|
|
|
|
|
|
+ info->port.flags |= ASYNC_CTS_FLOW;
|
|
else
|
|
else
|
|
- info->flags &= ~ASYNC_CTS_FLOW;
|
|
|
|
|
|
+ info->port.flags &= ~ASYNC_CTS_FLOW;
|
|
|
|
|
|
if (cflag & CLOCAL)
|
|
if (cflag & CLOCAL)
|
|
- info->flags &= ~ASYNC_CHECK_CD;
|
|
|
|
|
|
+ info->port.flags &= ~ASYNC_CHECK_CD;
|
|
else
|
|
else
|
|
- info->flags |= ASYNC_CHECK_CD;
|
|
|
|
|
|
+ info->port.flags |= ASYNC_CHECK_CD;
|
|
|
|
|
|
/* process tty input control flags */
|
|
/* process tty input control flags */
|
|
|
|
|
|
info->read_status_mask2 = OVRN;
|
|
info->read_status_mask2 = OVRN;
|
|
- if (I_INPCK(info->tty))
|
|
|
|
|
|
+ if (I_INPCK(info->port.tty))
|
|
info->read_status_mask2 |= PE | FRME;
|
|
info->read_status_mask2 |= PE | FRME;
|
|
- if (I_BRKINT(info->tty) || I_PARMRK(info->tty))
|
|
|
|
|
|
+ if (I_BRKINT(info->port.tty) || I_PARMRK(info->port.tty))
|
|
info->read_status_mask1 |= BRKD;
|
|
info->read_status_mask1 |= BRKD;
|
|
- if (I_IGNPAR(info->tty))
|
|
|
|
|
|
+ if (I_IGNPAR(info->port.tty))
|
|
info->ignore_status_mask2 |= PE | FRME;
|
|
info->ignore_status_mask2 |= PE | FRME;
|
|
- if (I_IGNBRK(info->tty)) {
|
|
|
|
|
|
+ if (I_IGNBRK(info->port.tty)) {
|
|
info->ignore_status_mask1 |= BRKD;
|
|
info->ignore_status_mask1 |= BRKD;
|
|
/* If ignoring parity and break indicators, ignore
|
|
/* If ignoring parity and break indicators, ignore
|
|
* overruns too. (For real raw support).
|
|
* overruns too. (For real raw support).
|
|
*/
|
|
*/
|
|
- if (I_IGNPAR(info->tty))
|
|
|
|
|
|
+ if (I_IGNPAR(info->port.tty))
|
|
info->ignore_status_mask2 |= OVRN;
|
|
info->ignore_status_mask2 |= OVRN;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3348,7 +3342,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
|
|
if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){
|
|
if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){
|
|
/* nonblock mode is set or port is not enabled */
|
|
/* nonblock mode is set or port is not enabled */
|
|
/* just verify that callout device is not active */
|
|
/* just verify that callout device is not active */
|
|
- info->flags |= ASYNC_NORMAL_ACTIVE;
|
|
|
|
|
|
+ info->port.flags |= ASYNC_NORMAL_ACTIVE;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3357,25 +3351,25 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
|
|
|
|
|
|
/* Wait for carrier detect and the line to become
|
|
/* Wait for carrier detect and the line to become
|
|
* free (i.e., not in use by the callout). While we are in
|
|
* free (i.e., not in use by the callout). While we are in
|
|
- * this loop, info->count is dropped by one, so that
|
|
|
|
|
|
+ * this loop, info->port.count is dropped by one, so that
|
|
* close() knows when to free things. We restore it upon
|
|
* close() knows when to free things. We restore it upon
|
|
* exit, either normal or abnormal.
|
|
* exit, either normal or abnormal.
|
|
*/
|
|
*/
|
|
|
|
|
|
retval = 0;
|
|
retval = 0;
|
|
- add_wait_queue(&info->open_wait, &wait);
|
|
|
|
|
|
+ add_wait_queue(&info->port.open_wait, &wait);
|
|
|
|
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
printk("%s(%d):%s block_til_ready() before block, count=%d\n",
|
|
printk("%s(%d):%s block_til_ready() before block, count=%d\n",
|
|
- __FILE__,__LINE__, tty->driver->name, info->count );
|
|
|
|
|
|
+ __FILE__,__LINE__, tty->driver->name, info->port.count );
|
|
|
|
|
|
spin_lock_irqsave(&info->lock, flags);
|
|
spin_lock_irqsave(&info->lock, flags);
|
|
if (!tty_hung_up_p(filp)) {
|
|
if (!tty_hung_up_p(filp)) {
|
|
extra_count = true;
|
|
extra_count = true;
|
|
- info->count--;
|
|
|
|
|
|
+ info->port.count--;
|
|
}
|
|
}
|
|
spin_unlock_irqrestore(&info->lock, flags);
|
|
spin_unlock_irqrestore(&info->lock, flags);
|
|
- info->blocked_open++;
|
|
|
|
|
|
+ info->port.blocked_open++;
|
|
|
|
|
|
while (1) {
|
|
while (1) {
|
|
if ((tty->termios->c_cflag & CBAUD)) {
|
|
if ((tty->termios->c_cflag & CBAUD)) {
|
|
@@ -3387,8 +3381,8 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
|
|
|
|
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
|
|
|
|
- if (tty_hung_up_p(filp) || !(info->flags & ASYNC_INITIALIZED)){
|
|
|
|
- retval = (info->flags & ASYNC_HUP_NOTIFY) ?
|
|
|
|
|
|
+ if (tty_hung_up_p(filp) || !(info->port.flags & ASYNC_INITIALIZED)){
|
|
|
|
+ retval = (info->port.flags & ASYNC_HUP_NOTIFY) ?
|
|
-EAGAIN : -ERESTARTSYS;
|
|
-EAGAIN : -ERESTARTSYS;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -3397,7 +3391,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
|
|
get_signals(info);
|
|
get_signals(info);
|
|
spin_unlock_irqrestore(&info->lock,flags);
|
|
spin_unlock_irqrestore(&info->lock,flags);
|
|
|
|
|
|
- if (!(info->flags & ASYNC_CLOSING) &&
|
|
|
|
|
|
+ if (!(info->port.flags & ASYNC_CLOSING) &&
|
|
(do_clocal || (info->serial_signals & SerialSignal_DCD)) ) {
|
|
(do_clocal || (info->serial_signals & SerialSignal_DCD)) ) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -3409,24 +3403,24 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
|
|
|
|
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
printk("%s(%d):%s block_til_ready() count=%d\n",
|
|
printk("%s(%d):%s block_til_ready() count=%d\n",
|
|
- __FILE__,__LINE__, tty->driver->name, info->count );
|
|
|
|
|
|
+ __FILE__,__LINE__, tty->driver->name, info->port.count );
|
|
|
|
|
|
schedule();
|
|
schedule();
|
|
}
|
|
}
|
|
|
|
|
|
set_current_state(TASK_RUNNING);
|
|
set_current_state(TASK_RUNNING);
|
|
- remove_wait_queue(&info->open_wait, &wait);
|
|
|
|
|
|
+ remove_wait_queue(&info->port.open_wait, &wait);
|
|
|
|
|
|
if (extra_count)
|
|
if (extra_count)
|
|
- info->count++;
|
|
|
|
- info->blocked_open--;
|
|
|
|
|
|
+ info->port.count++;
|
|
|
|
+ info->port.blocked_open--;
|
|
|
|
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
if (debug_level >= DEBUG_LEVEL_INFO)
|
|
printk("%s(%d):%s block_til_ready() after, count=%d\n",
|
|
printk("%s(%d):%s block_til_ready() after, count=%d\n",
|
|
- __FILE__,__LINE__, tty->driver->name, info->count );
|
|
|
|
|
|
+ __FILE__,__LINE__, tty->driver->name, info->port.count );
|
|
|
|
|
|
if (!retval)
|
|
if (!retval)
|
|
- info->flags |= ASYNC_NORMAL_ACTIVE;
|
|
|
|
|
|
+ info->port.flags |= ASYNC_NORMAL_ACTIVE;
|
|
|
|
|
|
return retval;
|
|
return retval;
|
|
}
|
|
}
|
|
@@ -3813,8 +3807,7 @@ static SLMP_INFO *alloc_dev(int adapter_num, int port_num, struct pci_dev *pdev)
|
|
info->max_frame_size = 4096;
|
|
info->max_frame_size = 4096;
|
|
info->close_delay = 5*HZ/10;
|
|
info->close_delay = 5*HZ/10;
|
|
info->closing_wait = 30*HZ;
|
|
info->closing_wait = 30*HZ;
|
|
- init_waitqueue_head(&info->open_wait);
|
|
|
|
- init_waitqueue_head(&info->close_wait);
|
|
|
|
|
|
+ tty_port_init(&info->port);
|
|
init_waitqueue_head(&info->status_event_wait_q);
|
|
init_waitqueue_head(&info->status_event_wait_q);
|
|
init_waitqueue_head(&info->event_wait_q);
|
|
init_waitqueue_head(&info->event_wait_q);
|
|
spin_lock_init(&info->netlock);
|
|
spin_lock_init(&info->netlock);
|
|
@@ -4885,7 +4878,7 @@ static bool rx_get_frame(SLMP_INFO *info)
|
|
unsigned int framesize = 0;
|
|
unsigned int framesize = 0;
|
|
bool ReturnCode = false;
|
|
bool ReturnCode = false;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
- struct tty_struct *tty = info->tty;
|
|
|
|
|
|
+ struct tty_struct *tty = info->port.tty;
|
|
unsigned char addr_field = 0xff;
|
|
unsigned char addr_field = 0xff;
|
|
SCADESC *desc;
|
|
SCADESC *desc;
|
|
SCADESC_EX *desc_ex;
|
|
SCADESC_EX *desc_ex;
|
|
@@ -5293,11 +5286,11 @@ static bool loopback_test(SLMP_INFO *info)
|
|
bool rc = false;
|
|
bool rc = false;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
- struct tty_struct *oldtty = info->tty;
|
|
|
|
|
|
+ struct tty_struct *oldtty = info->port.tty;
|
|
u32 speed = info->params.clock_speed;
|
|
u32 speed = info->params.clock_speed;
|
|
|
|
|
|
info->params.clock_speed = 3686400;
|
|
info->params.clock_speed = 3686400;
|
|
- info->tty = NULL;
|
|
|
|
|
|
+ info->port.tty = NULL;
|
|
|
|
|
|
/* assume failure */
|
|
/* assume failure */
|
|
info->init_error = DiagStatus_DmaFailure;
|
|
info->init_error = DiagStatus_DmaFailure;
|
|
@@ -5341,7 +5334,7 @@ static bool loopback_test(SLMP_INFO *info)
|
|
spin_unlock_irqrestore(&info->lock,flags);
|
|
spin_unlock_irqrestore(&info->lock,flags);
|
|
|
|
|
|
info->params.clock_speed = speed;
|
|
info->params.clock_speed = speed;
|
|
- info->tty = oldtty;
|
|
|
|
|
|
+ info->port.tty = oldtty;
|
|
|
|
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|