mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-11-01 09:13:37 +00:00
cyclades: push down tty_port_tty_get
Now, the tty is not needed at all places in the ISR. So we can just request in on demand when really needed. This cleans TX and RX paths a bit as the indentation level can be dropped by two now when we also invert the char_count if condition. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6732c8bb86
commit
dabe2c1385
1 changed files with 118 additions and 125 deletions
|
|
@ -917,7 +917,7 @@ cyz_issue_cmd(struct cyclades_card *cinfo,
|
|||
return 0;
|
||||
} /* cyz_issue_cmd */
|
||||
|
||||
static void cyz_handle_rx(struct cyclades_port *info, struct tty_struct *tty)
|
||||
static void cyz_handle_rx(struct cyclades_port *info)
|
||||
{
|
||||
struct BUF_CTRL __iomem *buf_ctrl = info->u.cyz.buf_ctrl;
|
||||
struct cyclades_card *cinfo = info->card;
|
||||
|
|
@ -940,7 +940,9 @@ static void cyz_handle_rx(struct cyclades_port *info, struct tty_struct *tty)
|
|||
else
|
||||
char_count = rx_put - rx_get + rx_bufsize;
|
||||
|
||||
if (char_count) {
|
||||
if (!char_count)
|
||||
return;
|
||||
|
||||
#ifdef CY_ENABLE_MONITORING
|
||||
info->mon.int_count++;
|
||||
info->mon.char_count += char_count;
|
||||
|
|
@ -948,12 +950,7 @@ static void cyz_handle_rx(struct cyclades_port *info, struct tty_struct *tty)
|
|||
info->mon.char_max = char_count;
|
||||
info->mon.char_last = char_count;
|
||||
#endif
|
||||
if (tty == NULL) {
|
||||
/* flush received characters */
|
||||
new_rx_get = (new_rx_get + char_count) &
|
||||
(rx_bufsize - 1);
|
||||
info->rflush_count++;
|
||||
} else {
|
||||
|
||||
#ifdef BLOCKMOVE
|
||||
/* we'd like to use memcpy(t, f, n) and memset(s, c, count)
|
||||
for performance, but because of buffer boundaries, there
|
||||
|
|
@ -1004,16 +1001,16 @@ static void cyz_handle_rx(struct cyclades_port *info, struct tty_struct *tty)
|
|||
#endif
|
||||
info->idle_stats.recv_idle = jiffies;
|
||||
tty_schedule_flip(&info->port);
|
||||
}
|
||||
|
||||
/* Update rx_get */
|
||||
cy_writel(&buf_ctrl->rx_get, new_rx_get);
|
||||
}
|
||||
}
|
||||
|
||||
static void cyz_handle_tx(struct cyclades_port *info, struct tty_struct *tty)
|
||||
static void cyz_handle_tx(struct cyclades_port *info)
|
||||
{
|
||||
struct BUF_CTRL __iomem *buf_ctrl = info->u.cyz.buf_ctrl;
|
||||
struct cyclades_card *cinfo = info->card;
|
||||
struct tty_struct *tty;
|
||||
u8 data;
|
||||
unsigned int char_count;
|
||||
#ifdef BLOCKMOVE
|
||||
|
|
@ -1033,8 +1030,10 @@ static void cyz_handle_tx(struct cyclades_port *info, struct tty_struct *tty)
|
|||
else
|
||||
char_count = tx_get - tx_put - 1;
|
||||
|
||||
if (char_count) {
|
||||
if (!char_count)
|
||||
return;
|
||||
|
||||
tty = tty_port_tty_get(&info->port);
|
||||
if (tty == NULL)
|
||||
goto ztxdone;
|
||||
|
||||
|
|
@ -1054,8 +1053,7 @@ static void cyz_handle_tx(struct cyclades_port *info, struct tty_struct *tty)
|
|||
min_t(unsigned int, info->xmit_cnt,
|
||||
char_count))))) {
|
||||
|
||||
memcpy_toio((char *)(cinfo->base_addr + tx_bufaddr +
|
||||
tx_put),
|
||||
memcpy_toio((char *)(cinfo->base_addr + tx_bufaddr + tx_put),
|
||||
&info->port.xmit_buf[info->xmit_tail],
|
||||
small_count);
|
||||
|
||||
|
|
@ -1080,16 +1078,15 @@ static void cyz_handle_tx(struct cyclades_port *info, struct tty_struct *tty)
|
|||
}
|
||||
#endif
|
||||
tty_wakeup(tty);
|
||||
tty_kref_put(tty);
|
||||
ztxdone:
|
||||
/* Update tx_put */
|
||||
cy_writel(&buf_ctrl->tx_put, tx_put);
|
||||
}
|
||||
}
|
||||
|
||||
static void cyz_handle_cmd(struct cyclades_card *cinfo)
|
||||
{
|
||||
struct BOARD_CTRL __iomem *board_ctrl = cinfo->board_ctrl;
|
||||
struct tty_struct *tty;
|
||||
struct cyclades_port *info;
|
||||
__u32 channel, param, fw_ver;
|
||||
__u8 cmd;
|
||||
|
|
@ -1102,9 +1099,6 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
|
|||
special_count = 0;
|
||||
delta_count = 0;
|
||||
info = &cinfo->ports[channel];
|
||||
tty = tty_port_tty_get(&info->port);
|
||||
if (tty == NULL)
|
||||
continue;
|
||||
|
||||
switch (cmd) {
|
||||
case C_CM_PR_ERROR:
|
||||
|
|
@ -1130,8 +1124,14 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
|
|||
readl(&info->u.cyz.ch_ctrl->rs_status);
|
||||
if (dcd & C_RS_DCD)
|
||||
wake_up_interruptible(&info->port.open_wait);
|
||||
else
|
||||
else {
|
||||
struct tty_struct *tty;
|
||||
tty = tty_port_tty_get(&info->port);
|
||||
if (tty) {
|
||||
tty_hangup(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case C_CM_MCTS:
|
||||
|
|
@ -1160,7 +1160,7 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
|
|||
printk(KERN_DEBUG "cyz_interrupt: rcvd intr, card %d, "
|
||||
"port %ld\n", info->card, channel);
|
||||
#endif
|
||||
cyz_handle_rx(info, tty);
|
||||
cyz_handle_rx(info);
|
||||
break;
|
||||
case C_CM_TXBEMPTY:
|
||||
case C_CM_TXLOWWM:
|
||||
|
|
@ -1170,7 +1170,7 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
|
|||
printk(KERN_DEBUG "cyz_interrupt: xmit intr, card %d, "
|
||||
"port %ld\n", info->card, channel);
|
||||
#endif
|
||||
cyz_handle_tx(info, tty);
|
||||
cyz_handle_tx(info);
|
||||
break;
|
||||
#endif /* CONFIG_CYZ_INTR */
|
||||
case C_CM_FATAL:
|
||||
|
|
@ -1183,7 +1183,6 @@ static void cyz_handle_cmd(struct cyclades_card *cinfo)
|
|||
wake_up_interruptible(&info->port.delta_msr_wait);
|
||||
if (special_count)
|
||||
tty_schedule_flip(&info->port);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1249,17 +1248,11 @@ static void cyz_poll(unsigned long arg)
|
|||
cyz_handle_cmd(cinfo);
|
||||
|
||||
for (port = 0; port < cinfo->nports; port++) {
|
||||
struct tty_struct *tty;
|
||||
|
||||
info = &cinfo->ports[port];
|
||||
tty = tty_port_tty_get(&info->port);
|
||||
/* OK to pass NULL to the handle functions below.
|
||||
They need to drop the data in that case. */
|
||||
|
||||
if (!info->throttle)
|
||||
cyz_handle_rx(info, tty);
|
||||
cyz_handle_tx(info, tty);
|
||||
tty_kref_put(tty);
|
||||
cyz_handle_rx(info);
|
||||
cyz_handle_tx(info);
|
||||
}
|
||||
/* poll every 'cyz_polling_cycle' period */
|
||||
expires = jiffies + cyz_polling_cycle;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue