diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2008-04-30 03:54:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-30 11:29:47 -0400 |
commit | 8e8bcf16c2b2f949dfafa3e8e94a51fd37bfc3ef (patch) | |
tree | fcb154507ea08ad6f955fad7088f5a17444fdcde | |
parent | f34d7a5b7010b82fe97da95496b9971435530062 (diff) |
strip: Fix up strip for the new order
- Use the tty baud functions
- Call driver termios methods directly holding the right locking
- Check for a write method
Signed-off-by: Alan Cox <alan@redhat.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Jeff Garzik <jeff@garzik.org>
Cc: "John W. Linville" <linville@tuxdriver.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/net/wireless/strip.c | 66 |
1 files changed, 24 insertions, 42 deletions
diff --git a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c index bced3fe1cf8a..5dd23c93497d 100644 --- a/drivers/net/wireless/strip.c +++ b/drivers/net/wireless/strip.c | |||
@@ -768,41 +768,17 @@ static __u8 *UnStuffData(__u8 * src, __u8 * end, __u8 * dst, | |||
768 | /* General routines for STRIP */ | 768 | /* General routines for STRIP */ |
769 | 769 | ||
770 | /* | 770 | /* |
771 | * get_baud returns the current baud rate, as one of the constants defined in | ||
772 | * termbits.h | ||
773 | * If the user has issued a baud rate override using the 'setserial' command | ||
774 | * and the logical current rate is set to 38.4, then the true baud rate | ||
775 | * currently in effect (57.6 or 115.2) is returned. | ||
776 | */ | ||
777 | static unsigned int get_baud(struct tty_struct *tty) | ||
778 | { | ||
779 | if (!tty || !tty->termios) | ||
780 | return (0); | ||
781 | if ((tty->termios->c_cflag & CBAUD) == B38400 && tty->driver_data) { | ||
782 | struct async_struct *info = | ||
783 | (struct async_struct *) tty->driver_data; | ||
784 | if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) | ||
785 | return (B57600); | ||
786 | if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) | ||
787 | return (B115200); | ||
788 | } | ||
789 | return (tty->termios->c_cflag & CBAUD); | ||
790 | } | ||
791 | |||
792 | /* | ||
793 | * set_baud sets the baud rate to the rate defined by baudcode | 771 | * set_baud sets the baud rate to the rate defined by baudcode |
794 | * Note: The rate B38400 should be avoided, because the user may have | ||
795 | * issued a 'setserial' speed override to map that to a different speed. | ||
796 | * We could achieve a true rate of 38400 if we needed to by cancelling | ||
797 | * any user speed override that is in place, but that might annoy the | ||
798 | * user, so it is simplest to just avoid using 38400. | ||
799 | */ | 772 | */ |
800 | static void set_baud(struct tty_struct *tty, unsigned int baudcode) | 773 | static void set_baud(struct tty_struct *tty, speed_t baudrate) |
801 | { | 774 | { |
802 | struct ktermios old_termios = *(tty->termios); | 775 | struct ktermios old_termios; |
803 | tty->termios->c_cflag &= ~CBAUD; /* Clear the old baud setting */ | 776 | |
804 | tty->termios->c_cflag |= baudcode; /* Set the new baud setting */ | 777 | mutex_lock(&tty->termios_mutex); |
805 | tty->driver->set_termios(tty, &old_termios); | 778 | old_termios =*(tty->termios); |
779 | tty_encode_baud_rate(tty, baudrate, baudrate); | ||
780 | tty->ops->set_termios(tty, &old_termios); | ||
781 | mutex_unlock(&tty->termios_mutex); | ||
806 | } | 782 | } |
807 | 783 | ||
808 | /* | 784 | /* |
@@ -1217,7 +1193,7 @@ static void ResetRadio(struct strip *strip_info) | |||
1217 | strip_info->watchdog_doreset = jiffies + 1 * HZ; | 1193 | strip_info->watchdog_doreset = jiffies + 1 * HZ; |
1218 | 1194 | ||
1219 | /* If the user has selected a baud rate above 38.4 see what magic we have to do */ | 1195 | /* If the user has selected a baud rate above 38.4 see what magic we have to do */ |
1220 | if (strip_info->user_baud > B38400) { | 1196 | if (strip_info->user_baud > 38400) { |
1221 | /* | 1197 | /* |
1222 | * Subtle stuff: Pay attention :-) | 1198 | * Subtle stuff: Pay attention :-) |
1223 | * If the serial port is currently at the user's selected (>38.4) rate, | 1199 | * If the serial port is currently at the user's selected (>38.4) rate, |
@@ -1227,17 +1203,17 @@ static void ResetRadio(struct strip *strip_info) | |||
1227 | * issued the ATS304 command last time through, so this time we restore | 1203 | * issued the ATS304 command last time through, so this time we restore |
1228 | * the user's selected rate and issue the normal starmode reset string. | 1204 | * the user's selected rate and issue the normal starmode reset string. |
1229 | */ | 1205 | */ |
1230 | if (strip_info->user_baud == get_baud(tty)) { | 1206 | if (strip_info->user_baud == tty_get_baud_rate(tty)) { |
1231 | static const char b0[] = "ate0q1s304=57600\r"; | 1207 | static const char b0[] = "ate0q1s304=57600\r"; |
1232 | static const char b1[] = "ate0q1s304=115200\r"; | 1208 | static const char b1[] = "ate0q1s304=115200\r"; |
1233 | static const StringDescriptor baudstring[2] = | 1209 | static const StringDescriptor baudstring[2] = |
1234 | { {b0, sizeof(b0) - 1} | 1210 | { {b0, sizeof(b0) - 1} |
1235 | , {b1, sizeof(b1) - 1} | 1211 | , {b1, sizeof(b1) - 1} |
1236 | }; | 1212 | }; |
1237 | set_baud(tty, B19200); | 1213 | set_baud(tty, 19200); |
1238 | if (strip_info->user_baud == B57600) | 1214 | if (strip_info->user_baud == 57600) |
1239 | s = baudstring[0]; | 1215 | s = baudstring[0]; |
1240 | else if (strip_info->user_baud == B115200) | 1216 | else if (strip_info->user_baud == 115200) |
1241 | s = baudstring[1]; | 1217 | s = baudstring[1]; |
1242 | else | 1218 | else |
1243 | s = baudstring[1]; /* For now */ | 1219 | s = baudstring[1]; /* For now */ |
@@ -1245,7 +1221,7 @@ static void ResetRadio(struct strip *strip_info) | |||
1245 | set_baud(tty, strip_info->user_baud); | 1221 | set_baud(tty, strip_info->user_baud); |
1246 | } | 1222 | } |
1247 | 1223 | ||
1248 | tty->driver->write(tty, s.string, s.length); | 1224 | tty->ops->write(tty, s.string, s.length); |
1249 | #ifdef EXT_COUNTERS | 1225 | #ifdef EXT_COUNTERS |
1250 | strip_info->tx_ebytes += s.length; | 1226 | strip_info->tx_ebytes += s.length; |
1251 | #endif | 1227 | #endif |
@@ -1267,7 +1243,7 @@ static void strip_write_some_more(struct tty_struct *tty) | |||
1267 | 1243 | ||
1268 | if (strip_info->tx_left > 0) { | 1244 | if (strip_info->tx_left > 0) { |
1269 | int num_written = | 1245 | int num_written = |
1270 | tty->driver->write(tty, strip_info->tx_head, | 1246 | tty->ops->write(tty, strip_info->tx_head, |
1271 | strip_info->tx_left); | 1247 | strip_info->tx_left); |
1272 | strip_info->tx_left -= num_written; | 1248 | strip_info->tx_left -= num_written; |
1273 | strip_info->tx_head += num_written; | 1249 | strip_info->tx_head += num_written; |
@@ -2457,7 +2433,7 @@ static int strip_open_low(struct net_device *dev) | |||
2457 | strip_info->working = FALSE; | 2433 | strip_info->working = FALSE; |
2458 | strip_info->firmware_level = NoStructure; | 2434 | strip_info->firmware_level = NoStructure; |
2459 | strip_info->next_command = CompatibilityCommand; | 2435 | strip_info->next_command = CompatibilityCommand; |
2460 | strip_info->user_baud = get_baud(strip_info->tty); | 2436 | strip_info->user_baud = tty_get_baud_rate(strip_info->tty); |
2461 | 2437 | ||
2462 | printk(KERN_INFO "%s: Initializing Radio.\n", | 2438 | printk(KERN_INFO "%s: Initializing Radio.\n", |
2463 | strip_info->dev->name); | 2439 | strip_info->dev->name); |
@@ -2632,6 +2608,13 @@ static int strip_open(struct tty_struct *tty) | |||
2632 | return -EEXIST; | 2608 | return -EEXIST; |
2633 | 2609 | ||
2634 | /* | 2610 | /* |
2611 | * We need a write method. | ||
2612 | */ | ||
2613 | |||
2614 | if (tty->ops->write == NULL) | ||
2615 | return -EOPNOTSUPP; | ||
2616 | |||
2617 | /* | ||
2635 | * OK. Find a free STRIP channel to use. | 2618 | * OK. Find a free STRIP channel to use. |
2636 | */ | 2619 | */ |
2637 | if ((strip_info = strip_alloc()) == NULL) | 2620 | if ((strip_info = strip_alloc()) == NULL) |
@@ -2652,8 +2635,7 @@ static int strip_open(struct tty_struct *tty) | |||
2652 | tty->disc_data = strip_info; | 2635 | tty->disc_data = strip_info; |
2653 | tty->receive_room = 65536; | 2636 | tty->receive_room = 65536; |
2654 | 2637 | ||
2655 | if (tty->driver->flush_buffer) | 2638 | tty_driver_flush_buffer(tty); |
2656 | tty->driver->flush_buffer(tty); | ||
2657 | 2639 | ||
2658 | /* | 2640 | /* |
2659 | * Restore default settings | 2641 | * Restore default settings |