From: Felipe W Damasio <felipewd@terra.com.br>
To: torvalds@osdl.org, akpm@osdl.org, alan@redhat.com
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH] drivers/char/riscom8.c: cli/sti removal
Date: Wed, 30 Jul 2003 14:47:56 -0300 [thread overview]
Message-ID: <3F2804CC.90602@terra.com.br> (raw)
[-- Attachment #1: Type: text/plain, Size: 272 bytes --]
Hi,
Since Dmitry Gorodchanin doesn't have a valid email, I'm sending this
directly here.
This patch, against 2.6-test2, replaces {save|restore}_flags and cli
with lock spinlocks on the RISCom/8 multiport serial driver.
Please consider applying.
Thanks,
Felipe
[-- Attachment #2: riscom8-cli_sti_removal.patch --]
[-- Type: text/plain, Size: 10375 bytes --]
--- linux-2.6.0-test2/drivers/char/riscom8.c.orig Wed Jul 30 14:39:11 2003
+++ linux-2.6.0-test2/drivers/char/riscom8.c Wed Jul 30 14:42:44 2003
@@ -29,6 +29,9 @@
* ChangeLog:
* Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 27-Jun-2001
* - get rid of check_region and several cleanups
+ *
+ * Felipe Damasio <felipewd@terra.com.br> - 30-Jul-2003
+ * - Fixed SMP support by removing {save|restore}_flags, cli/sti
*/
#include <linux/module.h>
@@ -45,6 +48,7 @@
#include <linux/fcntl.h>
#include <linux/major.h>
#include <linux/init.h>
+#include <linux/spinlock.h>
#include <asm/uaccess.h>
@@ -88,6 +92,8 @@
static unsigned char * tmp_buf;
static DECLARE_MUTEX(tmp_buf_sem);
+static spinlock_t rc_lock = SPIN_LOCK_UNLOCKED;
+
static unsigned long baud_table[] = {
0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
9600, 19200, 38400, 57600, 76800, 0,
@@ -237,13 +243,13 @@
{
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
rc_out(bp, RC_CTOUT, 0); /* Clear timeout */
rc_wait_CCR(bp); /* Wait for CCR ready */
rc_out(bp, CD180_CCR, CCR_HARDRESET); /* Reset CD180 chip */
- sti();
+ spin_unlock_irqsave(&rc_lock, flags);
rc_long_delay(HZ/20); /* Delay 0.05 sec */
- cli();
+ spin_lock_irqsave(&rc_lock, flags);
rc_out(bp, CD180_GIVR, RC_ID); /* Set ID for this chip */
rc_out(bp, CD180_GICR, 0); /* Clear all bits */
rc_out(bp, CD180_PILR1, RC_ACK_MINT); /* Prio for modem intr */
@@ -253,8 +259,8 @@
/* Setting up prescaler. We need 4 ticks per 1 ms */
rc_out(bp, CD180_PPRH, (RC_OSCFREQ/(1000000/RISCOM_TPS)) >> 8);
rc_out(bp, CD180_PPRL, (RC_OSCFREQ/(1000000/RISCOM_TPS)) & 0xff);
-
- restore_flags(flags);
+
+ spin_unlock_irqsave(&rc_lock, flags);
}
/* Main probing routine, also sets irq. */
@@ -875,7 +881,7 @@
port->xmit_buf = (unsigned char *) tmp;
}
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
if (port->tty)
clear_bit(TTY_IO_ERROR, &port->tty->flags);
@@ -886,8 +892,8 @@
port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
rc_change_speed(bp, port);
port->flags |= ASYNC_INITIALIZED;
-
- restore_flags(flags);
+
+ spin_unlock_irqsave(&rc_lock, flags);
return 0;
}
@@ -998,19 +1004,19 @@
*/
retval = 0;
add_wait_queue(&port->open_wait, &wait);
- cli();
+ spin_lock(&rc_lock);
if (!tty_hung_up_p(filp))
port->count--;
- sti();
+ spin_unlock(&rc_lock);
port->blocked_open++;
while (1) {
- cli();
+ spin_lock(&rc_lock);
rc_out(bp, CD180_CAR, port_No(port));
CD = rc_in(bp, CD180_MSVR) & MSVR_CD;
rc_out(bp, CD180_MSVR, MSVR_RTS);
bp->DTR &= ~(1u << port_No(port));
rc_out(bp, RC_DTR, bp->DTR);
- sti();
+ spin_unlock(&rc_lock);
set_current_state(TASK_INTERRUPTIBLE);
if (tty_hung_up_p(filp) ||
!(port->flags & ASYNC_INITIALIZED)) {
@@ -1084,7 +1090,7 @@
if (!port || rc_paranoia_check(port, tty->name, "close"))
return;
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
if (tty_hung_up_p(filp))
goto out;
@@ -1153,7 +1159,7 @@
}
port->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
wake_up_interruptible(&port->close_wait);
-out: restore_flags(flags);
+out: spin_unlock_irqsave(&rc_lock, flags);
}
static int rc_write(struct tty_struct * tty, int from_user,
@@ -1172,30 +1178,31 @@
if (!tty || !port->xmit_buf || !tmp_buf)
return 0;
- save_flags(flags);
if (from_user) {
down(&tmp_buf_sem);
while (1) {
- cli();
+ spin_lock_irqsave(&rc_lock, flags);
c = MIN(count, MIN(SERIAL_XMIT_SIZE - port->xmit_cnt - 1,
SERIAL_XMIT_SIZE - port->xmit_head));
- if (c <= 0)
+ if (c <= 0){
+ spin_unlock_irqsave(&rc_lock, flags);
break;
+ }
c -= copy_from_user(tmp_buf, buf, c);
if (!c) {
if (!total)
total = -EFAULT;
+ spin_unlock_irqsave(&rc_lock, flags);
break;
}
- cli();
c = MIN(c, MIN(SERIAL_XMIT_SIZE - port->xmit_cnt - 1,
SERIAL_XMIT_SIZE - port->xmit_head));
memcpy(port->xmit_buf + port->xmit_head, tmp_buf, c);
port->xmit_head = (port->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
port->xmit_cnt += c;
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
buf += c;
count -= c;
@@ -1204,18 +1211,18 @@
up(&tmp_buf_sem);
} else {
while (1) {
- cli();
+ spin_lock_irqsave(&rc_lock, flags);
c = MIN(count, MIN(SERIAL_XMIT_SIZE - port->xmit_cnt - 1,
SERIAL_XMIT_SIZE - port->xmit_head));
if (c <= 0) {
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
break;
}
memcpy(port->xmit_buf + port->xmit_head, buf, c);
port->xmit_head = (port->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
port->xmit_cnt += c;
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
buf += c;
count -= c;
@@ -1223,14 +1230,14 @@
}
}
- cli();
+ spin_lock_irqsave(&rc_lock, flags);
if (port->xmit_cnt && !tty->stopped && !tty->hw_stopped &&
!(port->IER & IER_TXRDY)) {
port->IER |= IER_TXRDY;
rc_out(bp, CD180_CAR, port_No(port));
rc_out(bp, CD180_IER, port->IER);
}
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
return total;
}
@@ -1246,7 +1253,7 @@
if (!tty || !port->xmit_buf)
return;
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1)
goto out;
@@ -1254,7 +1261,7 @@
port->xmit_buf[port->xmit_head++] = ch;
port->xmit_head &= SERIAL_XMIT_SIZE - 1;
port->xmit_cnt++;
-out: restore_flags(flags);
+out: spin_unlock_irqsave(&rc_lock, flags);
}
static void rc_flush_chars(struct tty_struct * tty)
@@ -1269,11 +1276,11 @@
!port->xmit_buf)
return;
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
port->IER |= IER_TXRDY;
rc_out(port_Board(port), CD180_CAR, port_No(port));
rc_out(port_Board(port), CD180_IER, port->IER);
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
}
static int rc_write_room(struct tty_struct * tty)
@@ -1308,9 +1315,9 @@
if (rc_paranoia_check(port, tty->name, "rc_flush_buffer"))
return;
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
wake_up_interruptible(&tty->write_wait);
if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
@@ -1326,11 +1333,11 @@
unsigned long flags;
bp = port_Board(port);
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
rc_out(bp, CD180_CAR, port_No(port));
status = rc_in(bp, CD180_MSVR);
result = rc_in(bp, RC_RI) & (1u << port_No(port)) ? 0 : TIOCM_RNG;
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
result |= ((status & MSVR_RTS) ? TIOCM_RTS : 0)
| ((status & MSVR_DTR) ? TIOCM_DTR : 0)
| ((status & MSVR_CD) ? TIOCM_CAR : 0)
@@ -1370,11 +1377,11 @@
default:
return -EINVAL;
}
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
rc_out(bp, CD180_CAR, port_No(port));
rc_out(bp, CD180_MSVR, port->MSVR);
rc_out(bp, RC_DTR, bp->DTR);
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
return 0;
}
@@ -1383,7 +1390,7 @@
struct riscom_board *bp = port_Board(port);
unsigned long flags;
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
port->break_length = RISCOM_TPS / HZ * length;
port->COR2 |= COR2_ETC;
port->IER |= IER_TXRDY;
@@ -1393,7 +1400,7 @@
rc_wait_CCR(bp);
rc_out(bp, CD180_CCR, CCR_CORCHG2);
rc_wait_CCR(bp);
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
}
static inline int rc_set_serial_info(struct riscom_port * port,
@@ -1436,9 +1443,9 @@
port->closing_wait = tmp.closing_wait;
}
if (change_speed) {
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
rc_change_speed(bp, port);
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
}
return 0;
}
@@ -1524,7 +1531,7 @@
bp = port_Board(port);
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
port->MSVR &= ~MSVR_RTS;
rc_out(bp, CD180_CAR, port_No(port));
if (I_IXOFF(tty)) {
@@ -1533,7 +1540,7 @@
rc_wait_CCR(bp);
}
rc_out(bp, CD180_MSVR, port->MSVR);
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
}
static void rc_unthrottle(struct tty_struct * tty)
@@ -1547,7 +1554,7 @@
bp = port_Board(port);
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
port->MSVR |= MSVR_RTS;
rc_out(bp, CD180_CAR, port_No(port));
if (I_IXOFF(tty)) {
@@ -1556,7 +1563,7 @@
rc_wait_CCR(bp);
}
rc_out(bp, CD180_MSVR, port->MSVR);
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
}
static void rc_stop(struct tty_struct * tty)
@@ -1570,11 +1577,11 @@
bp = port_Board(port);
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
port->IER &= ~IER_TXRDY;
rc_out(bp, CD180_CAR, port_No(port));
rc_out(bp, CD180_IER, port->IER);
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
}
static void rc_start(struct tty_struct * tty)
@@ -1588,13 +1595,13 @@
bp = port_Board(port);
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
if (port->xmit_cnt && port->xmit_buf && !(port->IER & IER_TXRDY)) {
port->IER |= IER_TXRDY;
rc_out(bp, CD180_CAR, port_No(port));
rc_out(bp, CD180_IER, port->IER);
}
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
}
/*
@@ -1646,9 +1653,9 @@
tty->termios->c_iflag == old_termios->c_iflag)
return;
- save_flags(flags); cli();
+ spin_lock_irqsave(&rc_lock, flags);
rc_change_speed(port_Board(port), port);
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
if ((old_termios->c_cflag & CRTSCTS) &&
!(tty->termios->c_cflag & CRTSCTS)) {
@@ -1751,13 +1758,12 @@
{
unsigned long flags;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&rc_lock, flags);
remove_bh(RISCOM8_BH);
free_page((unsigned long)tmp_buf);
tty_unregister_driver(riscom_driver);
put_tty_driver(riscom_driver);
- restore_flags(flags);
+ spin_unlock_irqsave(&rc_lock, flags);
}
#ifndef MODULE
next reply other threads:[~2003-07-30 17:44 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-07-30 17:47 Felipe W Damasio [this message]
2003-07-30 19:05 ` [PATCH] drivers/char/riscom8.c: cli/sti removal Francois Romieu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3F2804CC.90602@terra.com.br \
--to=felipewd@terra.com.br \
--cc=akpm@osdl.org \
--cc=alan@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.