Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f1d03228 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds
Browse files

isicom: use tty_port



Switch isicom to use a tty_port structure for some fields

Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d99101fd
Loading
Loading
Loading
Loading
+79 −102
Original line number Original line Diff line number Diff line
@@ -198,17 +198,12 @@ struct isi_board {


struct	isi_port {
struct	isi_port {
	unsigned short		magic;
	unsigned short		magic;
	unsigned int		flags;
	struct tty_port		port;
	int			count;
	int			blocked_open;
	int			close_delay;
	int			close_delay;
	u16			channel;
	u16			channel;
	u16			status;
	u16			status;
	u16			closing_wait;
	u16			closing_wait;
	struct isi_board	*card;
	struct isi_board	*card;
	struct tty_struct 	*tty;
	wait_queue_head_t	close_wait;
	wait_queue_head_t	open_wait;
	unsigned char		*xmit_buf;
	unsigned char		*xmit_buf;
	int			xmit_head;
	int			xmit_head;
	int			xmit_tail;
	int			xmit_tail;
@@ -430,11 +425,11 @@ static void isicom_tx(unsigned long _data)


	for (; count > 0; count--, port++) {
	for (; count > 0; count--, port++) {
		/* port not active or tx disabled to force flow control */
		/* port not active or tx disabled to force flow control */
		if (!(port->flags & ASYNC_INITIALIZED) ||
		if (!(port->port.flags & ASYNC_INITIALIZED) ||
				!(port->status & ISI_TXOK))
				!(port->status & ISI_TXOK))
			continue;
			continue;


		tty = port->tty;
		tty = port->port.tty;


		if (tty == NULL)
		if (tty == NULL)
			continue;
			continue;
@@ -458,7 +453,7 @@ static void isicom_tx(unsigned long _data)
			if (residue == YES) {
			if (residue == YES) {
				residue = NO;
				residue = NO;
				if (cnt > 0) {
				if (cnt > 0) {
					wrd |= (port->xmit_buf[port->xmit_tail]
					wrd |= (port->port.xmit_buf[port->xmit_tail]
									<< 8);
									<< 8);
					port->xmit_tail = (port->xmit_tail + 1)
					port->xmit_tail = (port->xmit_tail + 1)
						& (SERIAL_XMIT_SIZE - 1);
						& (SERIAL_XMIT_SIZE - 1);
@@ -474,14 +469,14 @@ static void isicom_tx(unsigned long _data)
			if (cnt <= 0)
			if (cnt <= 0)
				break;
				break;
			word_count = cnt >> 1;
			word_count = cnt >> 1;
			outsw(base, port->xmit_buf+port->xmit_tail, word_count);
			outsw(base, port->port.xmit_buf+port->xmit_tail, word_count);
			port->xmit_tail = (port->xmit_tail
			port->xmit_tail = (port->xmit_tail
				+ (word_count << 1)) & (SERIAL_XMIT_SIZE - 1);
				+ (word_count << 1)) & (SERIAL_XMIT_SIZE - 1);
			txcount -= (word_count << 1);
			txcount -= (word_count << 1);
			port->xmit_cnt -= (word_count << 1);
			port->xmit_cnt -= (word_count << 1);
			if (cnt & 0x0001) {
			if (cnt & 0x0001) {
				residue = YES;
				residue = YES;
				wrd = port->xmit_buf[port->xmit_tail];
				wrd = port->port.xmit_buf[port->xmit_tail];
				port->xmit_tail = (port->xmit_tail + 1)
				port->xmit_tail = (port->xmit_tail + 1)
					& (SERIAL_XMIT_SIZE - 1);
					& (SERIAL_XMIT_SIZE - 1);
				port->xmit_cnt--;
				port->xmit_cnt--;
@@ -548,13 +543,13 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
		return IRQ_HANDLED;
		return IRQ_HANDLED;
	}
	}
	port = card->ports + channel;
	port = card->ports + channel;
	if (!(port->flags & ASYNC_INITIALIZED)) {
	if (!(port->port.flags & ASYNC_INITIALIZED)) {
		outw(0x0000, base+0x04); /* enable interrupts */
		outw(0x0000, base+0x04); /* enable interrupts */
		spin_unlock(&card->card_lock);
		spin_unlock(&card->card_lock);
		return IRQ_HANDLED;
		return IRQ_HANDLED;
	}
	}


	tty = port->tty;
	tty = port->port.tty;
	if (tty == NULL) {
	if (tty == NULL) {
		word_count = byte_count >> 1;
		word_count = byte_count >> 1;
		while (byte_count > 1) {
		while (byte_count > 1) {
@@ -572,7 +567,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
		header = inw(base);
		header = inw(base);
		switch (header & 0xff) {
		switch (header & 0xff) {
		case 0:	/* Change in EIA signals */
		case 0:	/* Change in EIA signals */
			if (port->flags & ASYNC_CHECK_CD) {
			if (port->port.flags & ASYNC_CHECK_CD) {
				if (port->status & ISI_DCD) {
				if (port->status & ISI_DCD) {
					if (!(header & ISI_DCD)) {
					if (!(header & ISI_DCD)) {
					/* Carrier has been lost  */
					/* Carrier has been lost  */
@@ -585,7 +580,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
				/* Carrier has been detected */
				/* Carrier has been detected */
					pr_dbg("interrupt: DCD->high.\n");
					pr_dbg("interrupt: DCD->high.\n");
					port->status |= ISI_DCD;
					port->status |= ISI_DCD;
					wake_up_interruptible(&port->open_wait);
					wake_up_interruptible(&port->port.open_wait);
				}
				}
			} else {
			} else {
				if (header & ISI_DCD)
				if (header & ISI_DCD)
@@ -594,17 +589,17 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
					port->status &= ~ISI_DCD;
					port->status &= ~ISI_DCD;
			}
			}


			if (port->flags & ASYNC_CTS_FLOW) {
			if (port->port.flags & ASYNC_CTS_FLOW) {
				if (port->tty->hw_stopped) {
				if (port->port.tty->hw_stopped) {
					if (header & ISI_CTS) {
					if (header & ISI_CTS) {
						port->tty->hw_stopped = 0;
						port->port.tty->hw_stopped = 0;
						/* start tx ing */
						/* start tx ing */
						port->status |= (ISI_TXOK
						port->status |= (ISI_TXOK
							| ISI_CTS);
							| ISI_CTS);
						tty_wakeup(tty);
						tty_wakeup(tty);
					}
					}
				} else if (!(header & ISI_CTS)) {
				} else if (!(header & ISI_CTS)) {
					port->tty->hw_stopped = 1;
					port->port.tty->hw_stopped = 1;
					/* stop tx ing */
					/* stop tx ing */
					port->status &= ~(ISI_TXOK | ISI_CTS);
					port->status &= ~(ISI_TXOK | ISI_CTS);
				}
				}
@@ -629,7 +624,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)


		case 1:	/* Received Break !!! */
		case 1:	/* Received Break !!! */
			tty_insert_flip_char(tty, 0, TTY_BREAK);
			tty_insert_flip_char(tty, 0, TTY_BREAK);
			if (port->flags & ASYNC_SAK)
			if (port->port.flags & ASYNC_SAK)
				do_SAK(tty);
				do_SAK(tty);
			tty_flip_buffer_push(tty);
			tty_flip_buffer_push(tty);
			break;
			break;
@@ -681,7 +676,7 @@ static void isicom_config_port(struct isi_port *port)
		shift_count = card->shift_count;
		shift_count = card->shift_count;
	unsigned char flow_ctrl;
	unsigned char flow_ctrl;


	tty = port->tty;
	tty = port->port.tty;


	if (tty == NULL)
	if (tty == NULL)
		return;
		return;
@@ -697,7 +692,7 @@ static void isicom_config_port(struct isi_port *port)


		/* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */
		/* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */
		if (baud < 1 || baud > 4)
		if (baud < 1 || baud > 4)
			port->tty->termios->c_cflag &= ~CBAUDEX;
			port->port.tty->termios->c_cflag &= ~CBAUDEX;
		else
		else
			baud += 15;
			baud += 15;
	}
	}
@@ -708,13 +703,13 @@ static void isicom_config_port(struct isi_port *port)
		 *  the 'setserial' utility.
		 *  the 'setserial' utility.
		 */
		 */


		if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
		if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
			baud++; /*  57.6 Kbps */
			baud++; /*  57.6 Kbps */
		if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
		if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
			baud += 2; /*  115  Kbps */
			baud += 2; /*  115  Kbps */
		if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
		if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
			baud += 3; /* 230 kbps*/
			baud += 3; /* 230 kbps*/
		if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
		if ((port->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
			baud += 4; /* 460 kbps*/
			baud += 4; /* 460 kbps*/
	}
	}
	if (linuxb_to_isib[baud] == -1) {
	if (linuxb_to_isib[baud] == -1) {
@@ -754,15 +749,15 @@ static void isicom_config_port(struct isi_port *port)
		InterruptTheCard(base);
		InterruptTheCard(base);
	}
	}
	if (C_CLOCAL(tty))
	if (C_CLOCAL(tty))
		port->flags &= ~ASYNC_CHECK_CD;
		port->port.flags &= ~ASYNC_CHECK_CD;
	else
	else
		port->flags |= ASYNC_CHECK_CD;
		port->port.flags |= ASYNC_CHECK_CD;


	/* flow control settings ...*/
	/* flow control settings ...*/
	flow_ctrl = 0;
	flow_ctrl = 0;
	port->flags &= ~ASYNC_CTS_FLOW;
	port->port.flags &= ~ASYNC_CTS_FLOW;
	if (C_CRTSCTS(tty)) {
	if (C_CRTSCTS(tty)) {
		port->flags |= ASYNC_CTS_FLOW;
		port->port.flags |= ASYNC_CTS_FLOW;
		flow_ctrl |= ISICOM_CTSRTS;
		flow_ctrl |= ISICOM_CTSRTS;
	}
	}
	if (I_IXON(tty))
	if (I_IXON(tty))
@@ -809,23 +804,15 @@ static int isicom_setup_port(struct isi_port *port)
	struct isi_board *card = port->card;
	struct isi_board *card = port->card;
	unsigned long flags;
	unsigned long flags;


	if (port->flags & ASYNC_INITIALIZED)
	if (port->port.flags & ASYNC_INITIALIZED)
		return 0;
		return 0;
	if (!port->xmit_buf) {
	if (tty_port_alloc_xmit_buf(&port->port) < 0)
		/* Relies on BKL */
		unsigned long page  = get_zeroed_page(GFP_KERNEL);
		if (page == 0)
		return -ENOMEM;
		return -ENOMEM;
		if (port->xmit_buf)
			free_page(page);
		else
			port->xmit_buf = (unsigned char *) page;
	}


	spin_lock_irqsave(&card->card_lock, flags);
	spin_lock_irqsave(&card->card_lock, flags);
	if (port->tty)
	if (port->port.tty)
		clear_bit(TTY_IO_ERROR, &port->tty->flags);
		clear_bit(TTY_IO_ERROR, &port->port.tty->flags);
	if (port->count == 1)
	if (port->port.count == 1)
		card->count++;
		card->count++;


	port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
	port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
@@ -839,7 +826,7 @@ static int isicom_setup_port(struct isi_port *port)
	}
	}


	isicom_config_port(port);
	isicom_config_port(port);
	port->flags |= ASYNC_INITIALIZED;
	port->port.flags |= ASYNC_INITIALIZED;
	spin_unlock_irqrestore(&card->card_lock, flags);
	spin_unlock_irqrestore(&card->card_lock, flags);


	return 0;
	return 0;
@@ -855,10 +842,10 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,


	/* block if port is in the process of being closed */
	/* block if port is in the process of being closed */


	if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) {
	if (tty_hung_up_p(filp) || port->port.flags & ASYNC_CLOSING) {
		pr_dbg("block_til_ready: close in progress.\n");
		pr_dbg("block_til_ready: close in progress.\n");
		interruptible_sleep_on(&port->close_wait);
		interruptible_sleep_on(&port->port.close_wait);
		if (port->flags & ASYNC_HUP_NOTIFY)
		if (port->port.flags & ASYNC_HUP_NOTIFY)
			return -EAGAIN;
			return -EAGAIN;
		else
		else
			return -ERESTARTSYS;
			return -ERESTARTSYS;
@@ -869,7 +856,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
	if ((filp->f_flags & O_NONBLOCK) ||
	if ((filp->f_flags & O_NONBLOCK) ||
			(tty->flags & (1 << TTY_IO_ERROR))) {
			(tty->flags & (1 << TTY_IO_ERROR))) {
		pr_dbg("block_til_ready: non-block mode.\n");
		pr_dbg("block_til_ready: non-block mode.\n");
		port->flags |= ASYNC_NORMAL_ACTIVE;
		port->port.flags |= ASYNC_NORMAL_ACTIVE;
		return 0;
		return 0;
	}
	}


@@ -879,26 +866,26 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
	/* block waiting for DCD to be asserted, and while
	/* block waiting for DCD to be asserted, and while
						callout dev is busy */
						callout dev is busy */
	retval = 0;
	retval = 0;
	add_wait_queue(&port->open_wait, &wait);
	add_wait_queue(&port->port.open_wait, &wait);


	spin_lock_irqsave(&card->card_lock, flags);
	spin_lock_irqsave(&card->card_lock, flags);
	if (!tty_hung_up_p(filp))
	if (!tty_hung_up_p(filp))
		port->count--;
		port->port.count--;
	port->blocked_open++;
	port->port.blocked_open++;
	spin_unlock_irqrestore(&card->card_lock, flags);
	spin_unlock_irqrestore(&card->card_lock, flags);


	while (1) {
	while (1) {
		raise_dtr_rts(port);
		raise_dtr_rts(port);


		set_current_state(TASK_INTERRUPTIBLE);
		set_current_state(TASK_INTERRUPTIBLE);
		if (tty_hung_up_p(filp) || !(port->flags & ASYNC_INITIALIZED)) {
		if (tty_hung_up_p(filp) || !(port->port.flags & ASYNC_INITIALIZED)) {
			if (port->flags & ASYNC_HUP_NOTIFY)
			if (port->port.flags & ASYNC_HUP_NOTIFY)
				retval = -EAGAIN;
				retval = -EAGAIN;
			else
			else
				retval = -ERESTARTSYS;
				retval = -ERESTARTSYS;
			break;
			break;
		}
		}
		if (!(port->flags & ASYNC_CLOSING) &&
		if (!(port->port.flags & ASYNC_CLOSING) &&
				(do_clocal || (port->status & ISI_DCD))) {
				(do_clocal || (port->status & ISI_DCD))) {
			break;
			break;
		}
		}
@@ -909,15 +896,15 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
		schedule();
		schedule();
	}
	}
	set_current_state(TASK_RUNNING);
	set_current_state(TASK_RUNNING);
	remove_wait_queue(&port->open_wait, &wait);
	remove_wait_queue(&port->port.open_wait, &wait);
	spin_lock_irqsave(&card->card_lock, flags);
	spin_lock_irqsave(&card->card_lock, flags);
	if (!tty_hung_up_p(filp))
	if (!tty_hung_up_p(filp))
		port->count++;
		port->port.count++;
	port->blocked_open--;
	port->port.blocked_open--;
	spin_unlock_irqrestore(&card->card_lock, flags);
	spin_unlock_irqrestore(&card->card_lock, flags);
	if (retval)
	if (retval)
		return retval;
		return retval;
	port->flags |= ASYNC_NORMAL_ACTIVE;
	port->port.flags |= ASYNC_NORMAL_ACTIVE;
	return 0;
	return 0;
}
}


@@ -947,9 +934,9 @@ static int isicom_open(struct tty_struct *tty, struct file *filp)


	isicom_setup_board(card);
	isicom_setup_board(card);


	port->count++;
	port->port.count++;
	tty->driver_data = port;
	tty->driver_data = port;
	port->tty = tty;
	port->port.tty = tty;
	error = isicom_setup_port(port);
	error = isicom_setup_port(port);
	if (error == 0)
	if (error == 0)
		error = block_til_ready(tty, filp, port);
		error = block_til_ready(tty, filp, port);
@@ -970,18 +957,15 @@ static void isicom_shutdown_port(struct isi_port *port)
	struct isi_board *card = port->card;
	struct isi_board *card = port->card;
	struct tty_struct *tty;
	struct tty_struct *tty;


	tty = port->tty;
	tty = port->port.tty;


	if (!(port->flags & ASYNC_INITIALIZED))
	if (!(port->port.flags & ASYNC_INITIALIZED))
		return;
		return;


	if (port->xmit_buf) {
	tty_port_free_xmit_buf(&port->port);
		free_page((unsigned long) port->xmit_buf);
	port->port.flags &= ~ASYNC_INITIALIZED;
		port->xmit_buf = NULL;
	}
	port->flags &= ~ASYNC_INITIALIZED;
	/* 3rd October 2000 : Vinayak P Risbud */
	/* 3rd October 2000 : Vinayak P Risbud */
	port->tty = NULL;
	port->port.tty = NULL;


	/*Fix done by Anil .S on 30-04-2001
	/*Fix done by Anil .S on 30-04-2001
	remote login through isi port has dtr toggle problem
	remote login through isi port has dtr toggle problem
@@ -1046,24 +1030,24 @@ static void isicom_close(struct tty_struct *tty, struct file *filp)
		return;
		return;
	}
	}


	if (tty->count == 1 && port->count != 1) {
	if (tty->count == 1 && port->port.count != 1) {
		printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port "
		printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port "
			"count tty->count = 1 port count = %d.\n",
			"count tty->count = 1 port count = %d.\n",
			card->base, port->count);
			card->base, port->port.count);
		port->count = 1;
		port->port.count = 1;
	}
	}
	if (--port->count < 0) {
	if (--port->port.count < 0) {
		printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port "
		printk(KERN_WARNING "ISICOM:(0x%lx) isicom_close: bad port "
			"count for channel%d = %d", card->base, port->channel,
			"count for channel%d = %d", card->base, port->channel,
			port->count);
			port->port.count);
		port->count = 0;
		port->port.count = 0;
	}
	}


	if (port->count) {
	if (port->port.count) {
		spin_unlock_irqrestore(&card->card_lock, flags);
		spin_unlock_irqrestore(&card->card_lock, flags);
		return;
		return;
	}
	}
	port->flags |= ASYNC_CLOSING;
	port->port.flags |= ASYNC_CLOSING;
	tty->closing = 1;
	tty->closing = 1;
	spin_unlock_irqrestore(&card->card_lock, flags);
	spin_unlock_irqrestore(&card->card_lock, flags);


@@ -1072,7 +1056,7 @@ static void isicom_close(struct tty_struct *tty, struct file *filp)
	/* indicate to the card that no more data can be received
	/* indicate to the card that no more data can be received
	   on this port */
	   on this port */
	spin_lock_irqsave(&card->card_lock, flags);
	spin_lock_irqsave(&card->card_lock, flags);
	if (port->flags & ASYNC_INITIALIZED) {
	if (port->port.flags & ASYNC_INITIALIZED) {
		card->port_status &= ~(1 << port->channel);
		card->port_status &= ~(1 << port->channel);
		outw(card->port_status, card->base + 0x02);
		outw(card->port_status, card->base + 0x02);
	}
	}
@@ -1085,7 +1069,7 @@ static void isicom_close(struct tty_struct *tty, struct file *filp)
	spin_lock_irqsave(&card->card_lock, flags);
	spin_lock_irqsave(&card->card_lock, flags);
	tty->closing = 0;
	tty->closing = 0;


	if (port->blocked_open) {
	if (port->port.blocked_open) {
		spin_unlock_irqrestore(&card->card_lock, flags);
		spin_unlock_irqrestore(&card->card_lock, flags);
		if (port->close_delay) {
		if (port->close_delay) {
			pr_dbg("scheduling until time out.\n");
			pr_dbg("scheduling until time out.\n");
@@ -1093,10 +1077,10 @@ static void isicom_close(struct tty_struct *tty, struct file *filp)
				jiffies_to_msecs(port->close_delay));
				jiffies_to_msecs(port->close_delay));
		}
		}
		spin_lock_irqsave(&card->card_lock, flags);
		spin_lock_irqsave(&card->card_lock, flags);
		wake_up_interruptible(&port->open_wait);
		wake_up_interruptible(&port->port.open_wait);
	}
	}
	port->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
	port->port.flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
	wake_up_interruptible(&port->close_wait);
	wake_up_interruptible(&port->port.close_wait);
	spin_unlock_irqrestore(&card->card_lock, flags);
	spin_unlock_irqrestore(&card->card_lock, flags);
}
}


@@ -1112,9 +1096,6 @@ static int isicom_write(struct tty_struct *tty, const unsigned char *buf,
	if (isicom_paranoia_check(port, tty->name, "isicom_write"))
	if (isicom_paranoia_check(port, tty->name, "isicom_write"))
		return 0;
		return 0;


	if (!port->xmit_buf)
		return 0;

	spin_lock_irqsave(&card->card_lock, flags);
	spin_lock_irqsave(&card->card_lock, flags);


	while (1) {
	while (1) {
@@ -1123,7 +1104,7 @@ static int isicom_write(struct tty_struct *tty, const unsigned char *buf,
		if (cnt <= 0)
		if (cnt <= 0)
			break;
			break;


		memcpy(port->xmit_buf + port->xmit_head, buf, cnt);
		memcpy(port->port.xmit_buf + port->xmit_head, buf, cnt);
		port->xmit_head = (port->xmit_head + cnt) & (SERIAL_XMIT_SIZE
		port->xmit_head = (port->xmit_head + cnt) & (SERIAL_XMIT_SIZE
			- 1);
			- 1);
		port->xmit_cnt += cnt;
		port->xmit_cnt += cnt;
@@ -1147,16 +1128,13 @@ static int isicom_put_char(struct tty_struct *tty, unsigned char ch)
	if (isicom_paranoia_check(port, tty->name, "isicom_put_char"))
	if (isicom_paranoia_check(port, tty->name, "isicom_put_char"))
		return 0;
		return 0;


	if (!port->xmit_buf)
		return 0;

	spin_lock_irqsave(&card->card_lock, flags);
	spin_lock_irqsave(&card->card_lock, flags);
	if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
	if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
		spin_unlock_irqrestore(&card->card_lock, flags);
		spin_unlock_irqrestore(&card->card_lock, flags);
		return 0;
		return 0;
	}
	}


	port->xmit_buf[port->xmit_head++] = ch;
	port->port.xmit_buf[port->xmit_head++] = ch;
	port->xmit_head &= (SERIAL_XMIT_SIZE - 1);
	port->xmit_head &= (SERIAL_XMIT_SIZE - 1);
	port->xmit_cnt++;
	port->xmit_cnt++;
	spin_unlock_irqrestore(&card->card_lock, flags);
	spin_unlock_irqrestore(&card->card_lock, flags);
@@ -1172,7 +1150,7 @@ static void isicom_flush_chars(struct tty_struct *tty)
		return;
		return;


	if (port->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
	if (port->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
			!port->xmit_buf)
			!port->port.xmit_buf)
		return;
		return;


	/* this tells the transmitter to consider this port for
	/* this tells the transmitter to consider this port for
@@ -1274,23 +1252,23 @@ static int isicom_set_serial_info(struct isi_port *port,


	lock_kernel();
	lock_kernel();


	reconfig_port = ((port->flags & ASYNC_SPD_MASK) !=
	reconfig_port = ((port->port.flags & ASYNC_SPD_MASK) !=
		(newinfo.flags & ASYNC_SPD_MASK));
		(newinfo.flags & ASYNC_SPD_MASK));


	if (!capable(CAP_SYS_ADMIN)) {
	if (!capable(CAP_SYS_ADMIN)) {
		if ((newinfo.close_delay != port->close_delay) ||
		if ((newinfo.close_delay != port->close_delay) ||
				(newinfo.closing_wait != port->closing_wait) ||
				(newinfo.closing_wait != port->closing_wait) ||
				((newinfo.flags & ~ASYNC_USR_MASK) !=
				((newinfo.flags & ~ASYNC_USR_MASK) !=
				(port->flags & ~ASYNC_USR_MASK))) {
				(port->port.flags & ~ASYNC_USR_MASK))) {
			unlock_kernel();
			unlock_kernel();
			return -EPERM;
			return -EPERM;
		}
		}
		port->flags = ((port->flags & ~ASYNC_USR_MASK) |
		port->port.flags = ((port->port.flags & ~ASYNC_USR_MASK) |
				(newinfo.flags & ASYNC_USR_MASK));
				(newinfo.flags & ASYNC_USR_MASK));
	} else {
	} else {
		port->close_delay = newinfo.close_delay;
		port->close_delay = newinfo.close_delay;
		port->closing_wait = newinfo.closing_wait;
		port->closing_wait = newinfo.closing_wait;
		port->flags = ((port->flags & ~ASYNC_FLAGS) |
		port->port.flags = ((port->port.flags & ~ASYNC_FLAGS) |
				(newinfo.flags & ASYNC_FLAGS));
				(newinfo.flags & ASYNC_FLAGS));
	}
	}
	if (reconfig_port) {
	if (reconfig_port) {
@@ -1314,7 +1292,7 @@ static int isicom_get_serial_info(struct isi_port *port,
	out_info.line = port - isi_ports;
	out_info.line = port - isi_ports;
	out_info.port = port->card->base;
	out_info.port = port->card->base;
	out_info.irq = port->card->irq;
	out_info.irq = port->card->irq;
	out_info.flags = port->flags;
	out_info.flags = port->port.flags;
/*	out_info.baud_base = ? */
/*	out_info.baud_base = ? */
	out_info.close_delay = port->close_delay;
	out_info.close_delay = port->close_delay;
	out_info.closing_wait = port->closing_wait;
	out_info.closing_wait = port->closing_wait;
@@ -1454,10 +1432,10 @@ static void isicom_hangup(struct tty_struct *tty)
	isicom_shutdown_port(port);
	isicom_shutdown_port(port);
	spin_unlock_irqrestore(&port->card->card_lock, flags);
	spin_unlock_irqrestore(&port->card->card_lock, flags);


	port->count = 0;
	port->port.count = 0;
	port->flags &= ~ASYNC_NORMAL_ACTIVE;
	port->port.flags &= ~ASYNC_NORMAL_ACTIVE;
	port->tty = NULL;
	port->port.tty = NULL;
	wake_up_interruptible(&port->open_wait);
	wake_up_interruptible(&port->port.open_wait);
}
}




@@ -1832,8 +1810,7 @@ static int __init isicom_init(void)
			port->close_delay = 50 * HZ/100;
			port->close_delay = 50 * HZ/100;
			port->closing_wait = 3000 * HZ/100;
			port->closing_wait = 3000 * HZ/100;
			port->status = 0;
			port->status = 0;
			init_waitqueue_head(&port->open_wait);
			tty_port_init(&port->port);
			init_waitqueue_head(&port->close_wait);
			/*  . . .  */
			/*  . . .  */
		}
		}
		isi_card[idx].base = 0;
		isi_card[idx].base = 0;