ctctty.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:36k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: ctctty.c,v 1.8 2001/05/16 16:28:31 felfert Exp $
  3.  *
  4.  * CTC / ESCON network driver, tty interface.
  5.  *
  6.  * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
  7.  * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.com)
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  *
  23.  */
  24. #define __NO_VERSION__
  25. #include <linux/config.h>
  26. #include <linux/module.h>
  27. #include <linux/tty.h>
  28. #include <linux/serial_reg.h>
  29. #include <linux/interrupt.h>
  30. #include <asm/uaccess.h>
  31. #ifdef CONFIG_DEVFS_FS
  32. #  include <linux/devfs_fs_kernel.h>
  33. #endif
  34. #include "ctctty.h"
  35. #if LINUX_VERSION_CODE < 0x020212
  36. typedef struct wait_queue wait_queue_t;
  37. typedef struct wait_queue *wait_queue_head_t;
  38. #define DECLARE_WAITQUEUE(wait, current) 
  39. struct wait_queue wait = { current, NULL }
  40. #define init_waitqueue_head(x) *(x)=NULL
  41. #define __set_current_state(state_value) 
  42. do { current->state = state_value; } while (0)
  43. #ifdef __SMP__
  44. #define set_current_state(state_value) 
  45. do { __set_current_state(state_value); mb(); } while (0)
  46. #else
  47. #define set_current_state(state_value) __set_current_state(state_value)
  48. #endif
  49. #define init_MUTEX(x) *(x)=MUTEX
  50. #endif
  51. #define CTC_TTY_MAJOR       43
  52. #define CTC_TTY_MAX_DEVICES 64
  53. #define CTC_ASYNC_MAGIC          0x49344C01 /* for paranoia-checking        */
  54. #define CTC_ASYNC_INITIALIZED    0x80000000 /* port was initialized         */
  55. #define CTC_ASYNC_NORMAL_ACTIVE  0x20000000 /* Normal device active         */
  56. #define CTC_ASYNC_CLOSING        0x08000000 /* Serial port is closing       */
  57. #define CTC_ASYNC_CTS_FLOW       0x04000000 /* Do CTS flow control          */
  58. #define CTC_ASYNC_CHECK_CD       0x02000000 /* i.e., CLOCAL                 */
  59. #define CTC_ASYNC_HUP_NOTIFY         0x0001 /* Notify tty on hangups/closes */
  60. #define CTC_ASYNC_NETDEV_OPEN        0x0002 /* Underlying netdev is open    */
  61. #define CTC_ASYNC_TX_LINESTAT        0x0004 /* Must send line status        */
  62. #define CTC_ASYNC_SPLIT_TERMIOS      0x0008 /* Sep. termios for dialin/out  */
  63. #define CTC_TTY_XMIT_SIZE              1024 /* Default bufsize for write    */
  64. #define CTC_SERIAL_XMIT_MAX            4000 /* Maximum bufsize for write    */
  65. #define CTC_SERIAL_TYPE_NORMAL            1
  66. /* Private data (similar to async_struct in <linux/serial.h>) */
  67. typedef struct {
  68.   int magic;
  69.   int flags;  /* defined in tty.h               */
  70.   int mcr;  /* Modem control register         */
  71.   int                   msr;             /* Modem status register          */
  72.   int                   lsr;             /* Line status register           */
  73.   int line;
  74.   int count;  /* # of fd on device              */
  75.   int blocked_open;  /* # of blocked opens             */
  76.   net_device            *netdev;
  77.   struct sk_buff_head   tx_queue;        /* transmit queue                 */
  78.   struct sk_buff_head   rx_queue;        /* receive queue                  */
  79.   struct tty_struct  *tty;            /* Pointer to corresponding tty   */
  80.   struct termios normal_termios;  /* For saving termios structs     */
  81.   wait_queue_head_t open_wait;
  82.   wait_queue_head_t close_wait;
  83.   struct semaphore      write_sem;
  84.   struct tq_struct      tq;
  85.   struct timer_list     stoptimer;
  86. } ctc_tty_info;
  87. /* Description of one CTC-tty */
  88. typedef struct {
  89.   int                refcount;    /* Number of opens        */
  90.   struct tty_driver  ctc_tty_device;    /* tty-device             */
  91.   struct tty_struct  *modem_table[CTC_TTY_MAX_DEVICES];
  92.   struct termios     *modem_termios[CTC_TTY_MAX_DEVICES];
  93.   struct termios     *modem_termios_locked[CTC_TTY_MAX_DEVICES];
  94.   ctc_tty_info       info[CTC_TTY_MAX_DEVICES];    /* Private data           */
  95. } ctc_tty_driver;
  96. static ctc_tty_driver *driver;
  97. /* Leave this unchanged unless you know what you do! */
  98. #define MODEM_PARANOIA_CHECK
  99. #define MODEM_DO_RESTART
  100. #define CTC_TTY_NAME "ctctty"
  101. #ifdef CONFIG_DEVFS_FS
  102. static char *ctc_ttyname = "ctc/" CTC_TTY_NAME "%d";
  103. #else
  104. static char *ctc_ttyname = CTC_TTY_NAME;
  105. #endif
  106. char *ctc_tty_revision = "$Revision: 1.8 $";
  107. static __u32 ctc_tty_magic = CTC_ASYNC_MAGIC;
  108. static int ctc_tty_shuttingdown = 0;
  109. static spinlock_t ctc_tty_lock;
  110. /* ctc_tty_try_read() is called from within ctc_tty_rcv_skb()
  111.  * to stuff incoming data directly into a tty's flip-buffer. If the
  112.  * flip buffer is full, the packet gets queued up.
  113.  *
  114.  * Return:
  115.  *  1 = Success
  116.  *  0 = Failure, data has to be buffered and later processed by
  117.  *      ctc_tty_readmodem().
  118.  */
  119. static int
  120. ctc_tty_try_read(ctc_tty_info * info, struct sk_buff *skb)
  121. {
  122. int c;
  123. int len;
  124. struct tty_struct *tty;
  125. if ((tty = info->tty)) {
  126. if (info->mcr & UART_MCR_RTS) {
  127. c = TTY_FLIPBUF_SIZE - tty->flip.count;
  128. len = skb->len;
  129. if (c >= len) {
  130. memcpy(tty->flip.char_buf_ptr, skb->data, len);
  131. memset(tty->flip.flag_buf_ptr, 0, len);
  132. tty->flip.count += len;
  133. tty->flip.char_buf_ptr += len;
  134. tty->flip.flag_buf_ptr += len;
  135. tty_flip_buffer_push(tty);
  136. kfree_skb(skb);
  137. return 1;
  138. }
  139. }
  140. }
  141. return 0;
  142. }
  143. /* ctc_tty_readmodem() is called periodically from within timer-interrupt.
  144.  * It tries getting received data from the receive queue an stuff it into
  145.  * the tty's flip-buffer.
  146.  */
  147. static int
  148. ctc_tty_readmodem(ctc_tty_info *info)
  149. {
  150. int ret = 1;
  151. struct tty_struct *tty;
  152. if ((tty = info->tty)) {
  153. if (info->mcr & UART_MCR_RTS) {
  154. int c = TTY_FLIPBUF_SIZE - tty->flip.count;
  155. struct sk_buff *skb;
  156. if ((c > 0) && (skb = skb_dequeue(&info->rx_queue))) {
  157. int len = skb->len;
  158. if (len > c)
  159. len = c;
  160. memcpy(tty->flip.char_buf_ptr, skb->data, len);
  161. skb_pull(skb, len);
  162. memset(tty->flip.flag_buf_ptr, 0, len);
  163. tty->flip.count += len;
  164. tty->flip.char_buf_ptr += len;
  165. tty->flip.flag_buf_ptr += len;
  166. tty_flip_buffer_push(tty);
  167. if (skb->len > 0)
  168. skb_queue_head(&info->rx_queue, skb);
  169. else {
  170. kfree_skb(skb);
  171. ret = skb_queue_len(&info->rx_queue);
  172. }
  173. }
  174. }
  175. }
  176. return ret;
  177. }
  178. void
  179. ctc_tty_setcarrier(net_device *netdev, int on)
  180. {
  181. int i;
  182. if ((!driver) || ctc_tty_shuttingdown)
  183. return;
  184. for (i = 0; i < CTC_TTY_MAX_DEVICES; i++)
  185. if (driver->info[i].netdev == netdev) {
  186. ctc_tty_info *info = &driver->info[i];
  187. if (on)
  188. info->msr |= UART_MSR_DCD;
  189. else
  190. info->msr &= ~UART_MSR_DCD;
  191. if ((info->flags & CTC_ASYNC_CHECK_CD) && (!on))
  192. tty_hangup(info->tty);
  193. }
  194. }
  195. void
  196. ctc_tty_netif_rx(struct sk_buff *skb)
  197. {
  198. int i;
  199. ctc_tty_info *info = NULL;
  200. if (!skb)
  201. return;
  202. if ((!skb->dev) || (!driver) || ctc_tty_shuttingdown) {
  203. dev_kfree_skb(skb);
  204. return;
  205. }
  206. for (i = 0; i < CTC_TTY_MAX_DEVICES; i++)
  207. if (driver->info[i].netdev == skb->dev) {
  208. info = &driver->info[i];
  209. break;
  210. }
  211. if (!info) {
  212. dev_kfree_skb(skb);
  213. return;
  214. }
  215. if (skb->len < 6) {
  216. dev_kfree_skb(skb);
  217. return;
  218. }
  219. if (memcmp(skb->data, &ctc_tty_magic, sizeof(__u32))) {
  220. dev_kfree_skb(skb);
  221. return;
  222. }
  223. skb_pull(skb, sizeof(__u32));
  224. i = *((int *)skb->data);
  225. skb_pull(skb, sizeof(info->mcr));
  226. if (i & UART_MCR_RTS) {
  227. info->msr |= UART_MSR_CTS;
  228. if (info->flags & CTC_ASYNC_CTS_FLOW)
  229. info->tty->hw_stopped = 0;
  230. } else {
  231. info->msr &= ~UART_MSR_CTS;
  232. if (info->flags & CTC_ASYNC_CTS_FLOW)
  233. info->tty->hw_stopped = 1;
  234. }
  235. if (i & UART_MCR_DTR)
  236. info->msr |= UART_MSR_DSR;
  237. else
  238. info->msr &= ~UART_MSR_DSR;
  239. if (skb->len <= 0) {
  240. kfree_skb(skb);
  241. return;
  242. }
  243. /* Try to deliver directly via tty-flip-buf if queue is empty */
  244. if (skb_queue_empty(&info->rx_queue))
  245. if (ctc_tty_try_read(info, skb))
  246. return;
  247. /* Direct deliver failed or queue wasn't empty.
  248.  * Queue up for later dequeueing via timer-irq.
  249.  */
  250. skb_queue_tail(&info->rx_queue, skb);
  251. /* Schedule dequeuing */
  252. queue_task(&info->tq, &tq_immediate);
  253. mark_bh(IMMEDIATE_BH);
  254. }
  255. static int
  256. ctc_tty_tint(ctc_tty_info * info)
  257. {
  258. struct sk_buff *skb = skb_dequeue(&info->tx_queue);
  259. int stopped = (info->tty->hw_stopped || info->tty->stopped);
  260. int wake = 1;
  261. int rc;
  262. if (!info->netdev) {
  263. if (skb)
  264. kfree_skb(skb);
  265. return 0;
  266. }
  267. if (info->flags & CTC_ASYNC_TX_LINESTAT) {
  268. int skb_res = info->netdev->hard_header_len +
  269. sizeof(info->mcr) + sizeof(__u32);
  270. /* If we must update line status,
  271.  * create an empty dummy skb and insert it.
  272.  */
  273. if (skb)
  274. skb_queue_head(&info->tx_queue, skb);
  275. skb = dev_alloc_skb(skb_res);
  276. if (!skb) {
  277. printk(KERN_WARNING
  278.        "ctc_tty: Out of memory in %s%d tintn",
  279.        CTC_TTY_NAME, info->line);
  280. return 1;
  281. }
  282. skb_reserve(skb, skb_res);
  283. stopped = 0;
  284. wake = 0;
  285. }
  286. if (!skb)
  287. return 0;
  288. if (stopped) {
  289. skb_queue_head(&info->tx_queue, skb);
  290. return 1;
  291. }
  292. #if 0
  293. if (skb->len > 0)
  294. printk(KERN_DEBUG "tint: %d %02xn", skb->len, *(skb->data));
  295. else
  296. printk(KERN_DEBUG "tint: %d STATn", skb->len);
  297. #endif
  298. memcpy(skb_push(skb, sizeof(info->mcr)), &info->mcr, sizeof(info->mcr));
  299. memcpy(skb_push(skb, sizeof(__u32)), &ctc_tty_magic, sizeof(__u32));
  300. rc = info->netdev->hard_start_xmit(skb, info->netdev);
  301. if (rc) {
  302. skb_pull(skb, sizeof(info->mcr) + sizeof(__u32));
  303. if (skb->len > 0)
  304. skb_queue_head(&info->tx_queue, skb);
  305. else
  306. kfree_skb(skb);
  307. } else {
  308. struct tty_struct *tty = info->tty;
  309. info->flags &= ~CTC_ASYNC_TX_LINESTAT;
  310. if (tty) {
  311. if (wake && (tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  312.     tty->ldisc.write_wakeup)
  313. (tty->ldisc.write_wakeup)(tty);
  314. wake_up_interruptible(&tty->write_wait);
  315. }
  316. }
  317. return (skb_queue_empty(&info->tx_queue) ? 0 : 1);
  318. }
  319. /************************************************************
  320.  *
  321.  * Modem-functions
  322.  *
  323.  * mostly "stolen" from original Linux-serial.c and friends.
  324.  *
  325.  ************************************************************/
  326. static inline int
  327. ctc_tty_paranoia_check(ctc_tty_info * info, kdev_t device, const char *routine)
  328. {
  329. #ifdef MODEM_PARANOIA_CHECK
  330. if (!info) {
  331. printk(KERN_WARNING "ctc_tty: null info_struct for (%d, %d) in %sn",
  332.        MAJOR(device), MINOR(device), routine);
  333. return 1;
  334. }
  335. if (info->magic != CTC_ASYNC_MAGIC) {
  336. printk(KERN_WARNING "ctc_tty: bad magic for info struct (%d, %d) in %sn",
  337.        MAJOR(device), MINOR(device), routine);
  338. return 1;
  339. }
  340. #endif
  341. return 0;
  342. }
  343. static void
  344. ctc_tty_inject(ctc_tty_info *info, char c)
  345. {
  346. int skb_res;
  347. struct sk_buff *skb;
  348. if (ctc_tty_shuttingdown)
  349. return;
  350. skb_res = info->netdev->hard_header_len + sizeof(info->mcr) +
  351. sizeof(__u32) + 1;
  352. skb = dev_alloc_skb(skb_res);
  353. if (!skb) {
  354. printk(KERN_WARNING
  355.        "ctc_tty: Out of memory in %s%d tx_injectn",
  356.        CTC_TTY_NAME, info->line);
  357. return;
  358. }
  359. skb_reserve(skb, skb_res);
  360. *(skb_put(skb, 1)) = c;
  361. skb_queue_head(&info->tx_queue, skb);
  362. queue_task(&info->tq, &tq_immediate);
  363. mark_bh(IMMEDIATE_BH);
  364. }
  365. static void
  366. ctc_tty_transmit_status(ctc_tty_info *info)
  367. {
  368. if (ctc_tty_shuttingdown)
  369. return;
  370. info->flags |= CTC_ASYNC_TX_LINESTAT;
  371. queue_task(&info->tq, &tq_immediate);
  372. mark_bh(IMMEDIATE_BH);
  373. }
  374. static void
  375. ctc_tty_change_speed(ctc_tty_info * info)
  376. {
  377. unsigned int cflag;
  378. unsigned int quot;
  379. int i;
  380. if (!info->tty || !info->tty->termios)
  381. return;
  382. cflag = info->tty->termios->c_cflag;
  383. quot = i = cflag & CBAUD;
  384. if (i & CBAUDEX) {
  385. i &= ~CBAUDEX;
  386. if (i < 1 || i > 2)
  387. info->tty->termios->c_cflag &= ~CBAUDEX;
  388. else
  389. i += 15;
  390. }
  391. if (quot) {
  392. info->mcr |= UART_MCR_DTR;
  393. info->mcr |= UART_MCR_RTS;
  394. ctc_tty_transmit_status(info);
  395. } else {
  396. info->mcr &= ~UART_MCR_DTR;
  397. info->mcr &= ~UART_MCR_RTS;
  398. ctc_tty_transmit_status(info);
  399. return;
  400. }
  401. /* CTS flow control flag and modem status interrupts */
  402. if (cflag & CRTSCTS) {
  403. info->flags |= CTC_ASYNC_CTS_FLOW;
  404. } else
  405. info->flags &= ~CTC_ASYNC_CTS_FLOW;
  406. if (cflag & CLOCAL)
  407. info->flags &= ~CTC_ASYNC_CHECK_CD;
  408. else {
  409. info->flags |= CTC_ASYNC_CHECK_CD;
  410. }
  411. }
  412. static int
  413. ctc_tty_startup(ctc_tty_info * info)
  414. {
  415. if (info->flags & CTC_ASYNC_INITIALIZED)
  416. return 0;
  417. #ifdef CTC_DEBUG_MODEM_OPEN
  418. printk(KERN_DEBUG "starting up %s%d ...n", CTC_TTY_NAME, info->line);
  419. #endif
  420. /*
  421.  * Now, initialize the UART
  422.  */
  423. info->mcr = UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2;
  424. if (info->tty)
  425. clear_bit(TTY_IO_ERROR, &info->tty->flags);
  426. /*
  427.  * and set the speed of the serial port
  428.  */
  429. ctc_tty_change_speed(info);
  430. info->flags |= CTC_ASYNC_INITIALIZED;
  431. if (!(info->flags & CTC_ASYNC_NETDEV_OPEN))
  432. info->netdev->open(info->netdev);
  433. info->flags |= CTC_ASYNC_NETDEV_OPEN;
  434. return 0;
  435. }
  436. static void
  437. ctc_tty_stopdev(unsigned long data)
  438. {
  439. ctc_tty_info *info = (ctc_tty_info *)data;
  440. if ((!info) || (!info->netdev) ||
  441.     (info->flags & CTC_ASYNC_INITIALIZED))
  442. return;
  443. info->netdev->stop(info->netdev);
  444. info->flags &= ~CTC_ASYNC_NETDEV_OPEN;
  445. }
  446. /*
  447.  * This routine will shutdown a serial port; interrupts are disabled, and
  448.  * DTR is dropped if the hangup on close termio flag is on.
  449.  */
  450. static void
  451. ctc_tty_shutdown(ctc_tty_info * info)
  452. {
  453. if (!(info->flags & CTC_ASYNC_INITIALIZED))
  454. return;
  455. #ifdef CTC_DEBUG_MODEM_OPEN
  456. printk(KERN_DEBUG "Shutting down %s%d ....n", CTC_TTY_NAME, info->line);
  457. #endif
  458. info->msr &= ~UART_MSR_RI;
  459. if (!info->tty || (info->tty->termios->c_cflag & HUPCL))
  460. info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS);
  461. if (info->tty)
  462. set_bit(TTY_IO_ERROR, &info->tty->flags);
  463. mod_timer(&info->stoptimer, jiffies + (10 * HZ));
  464. skb_queue_purge(&info->tx_queue);
  465. skb_queue_purge(&info->rx_queue);
  466. info->flags &= ~CTC_ASYNC_INITIALIZED;
  467. }
  468. /* ctc_tty_write() is the main send-routine. It is called from the upper
  469.  * levels within the kernel to perform sending data. Depending on the
  470.  * online-flag it either directs output to the at-command-interpreter or
  471.  * to the lower level. Additional tasks done here:
  472.  *  - If online, check for escape-sequence (+++)
  473.  *  - If sending audio-data, call ctc_tty_DLEdown() to parse DLE-codes.
  474.  *  - If receiving audio-data, call ctc_tty_end_vrx() to abort if needed.
  475.  *  - If dialing, abort dial.
  476.  */
  477. static int
  478. ctc_tty_write(struct tty_struct *tty, int from_user, const u_char * buf, int count)
  479. {
  480. int c;
  481. int total = 0;
  482. ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
  483. if (ctc_tty_shuttingdown)
  484. return 0;
  485. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_write"))
  486. return 0;
  487. if (!tty)
  488. return 0;
  489. if (!info->netdev)
  490. return -ENODEV;
  491. if (from_user)
  492. down(&info->write_sem);
  493. while (1) {
  494. struct sk_buff *skb;
  495. int skb_res;
  496. c = (count < CTC_TTY_XMIT_SIZE) ? count : CTC_TTY_XMIT_SIZE;
  497. if (c <= 0)
  498. break;
  499. skb_res = info->netdev->hard_header_len + sizeof(info->mcr) +
  500. + sizeof(__u32);
  501. skb = dev_alloc_skb(skb_res + c);
  502. if (!skb) {
  503. printk(KERN_WARNING
  504.        "ctc_tty: Out of memory in %s%d writen",
  505.        CTC_TTY_NAME, info->line);
  506. break;
  507. }
  508. skb_reserve(skb, skb_res);
  509. if (from_user)
  510. copy_from_user(skb_put(skb, c), buf, c);
  511. else
  512. memcpy(skb_put(skb, c), buf, c);
  513. skb_queue_tail(&info->tx_queue, skb);
  514. buf += c;
  515. total += c;
  516. count -= c;
  517. }
  518. if (skb_queue_len(&info->tx_queue)) {
  519. info->lsr &= ~UART_LSR_TEMT;
  520. queue_task(&info->tq, &tq_immediate);
  521. mark_bh(IMMEDIATE_BH);
  522. }
  523. if (from_user)
  524. up(&info->write_sem);
  525. return total;
  526. }
  527. static int
  528. ctc_tty_write_room(struct tty_struct *tty)
  529. {
  530. ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
  531. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_write_room"))
  532. return 0;
  533. return CTC_TTY_XMIT_SIZE;
  534. }
  535. static int
  536. ctc_tty_chars_in_buffer(struct tty_struct *tty)
  537. {
  538. ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
  539. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_chars_in_buffer"))
  540. return 0;
  541. return 0;
  542. }
  543. static void
  544. ctc_tty_flush_buffer(struct tty_struct *tty)
  545. {
  546. ctc_tty_info *info;
  547. unsigned long flags;
  548. save_flags(flags);
  549. cli();
  550. if (!tty) {
  551. restore_flags(flags);
  552. return;
  553. }
  554. info = (ctc_tty_info *) tty->driver_data;
  555. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_flush_buffer")) {
  556. restore_flags(flags);
  557. return;
  558. }
  559. skb_queue_purge(&info->tx_queue);
  560. info->lsr |= UART_LSR_TEMT;
  561. restore_flags(flags);
  562. wake_up_interruptible(&tty->write_wait);
  563. if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
  564.     tty->ldisc.write_wakeup)
  565. (tty->ldisc.write_wakeup) (tty);
  566. }
  567. static void
  568. ctc_tty_flush_chars(struct tty_struct *tty)
  569. {
  570. ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
  571. if (ctc_tty_shuttingdown)
  572. return;
  573. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_flush_chars"))
  574. return;
  575. if (tty->stopped || tty->hw_stopped || (!skb_queue_len(&info->tx_queue)))
  576. return;
  577. queue_task(&info->tq, &tq_immediate);
  578. mark_bh(IMMEDIATE_BH);
  579. }
  580. /*
  581.  * ------------------------------------------------------------
  582.  * ctc_tty_throttle()
  583.  *
  584.  * This routine is called by the upper-layer tty layer to signal that
  585.  * incoming characters should be throttled.
  586.  * ------------------------------------------------------------
  587.  */
  588. static void
  589. ctc_tty_throttle(struct tty_struct *tty)
  590. {
  591. ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
  592. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_throttle"))
  593. return;
  594. info->mcr &= ~UART_MCR_RTS;
  595. if (I_IXOFF(tty))
  596. ctc_tty_inject(info, STOP_CHAR(tty));
  597. ctc_tty_transmit_status(info);
  598. }
  599. static void
  600. ctc_tty_unthrottle(struct tty_struct *tty)
  601. {
  602. ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
  603. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_unthrottle"))
  604. return;
  605. info->mcr |= UART_MCR_RTS;
  606. if (I_IXOFF(tty))
  607. ctc_tty_inject(info, START_CHAR(tty));
  608. ctc_tty_transmit_status(info);
  609. }
  610. /*
  611.  * ------------------------------------------------------------
  612.  * ctc_tty_ioctl() and friends
  613.  * ------------------------------------------------------------
  614.  */
  615. /*
  616.  * ctc_tty_get_lsr_info - get line status register info
  617.  *
  618.  * Purpose: Let user call ioctl() to get info when the UART physically
  619.  *          is emptied.  On bus types like RS485, the transmitter must
  620.  *          release the bus after transmitting. This must be done when
  621.  *          the transmit shift register is empty, not be done when the
  622.  *          transmit holding register is empty.  This functionality
  623.  *          allows RS485 driver to be written in user space.
  624.  */
  625. static int
  626. ctc_tty_get_lsr_info(ctc_tty_info * info, uint * value)
  627. {
  628. u_char status;
  629. uint result;
  630. ulong flags;
  631. save_flags(flags);
  632. cli();
  633. status = info->lsr;
  634. restore_flags(flags);
  635. result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0);
  636. put_user(result, (uint *) value);
  637. return 0;
  638. }
  639. static int
  640. ctc_tty_get_ctc_tty_info(ctc_tty_info * info, uint * value)
  641. {
  642. u_char control,
  643.  status;
  644. uint result;
  645. ulong flags;
  646. control = info->mcr;
  647. save_flags(flags);
  648. cli();
  649. status = info->msr;
  650. restore_flags(flags);
  651. result = ((control & UART_MCR_RTS) ? TIOCM_RTS : 0)
  652.     | ((control & UART_MCR_DTR) ? TIOCM_DTR : 0)
  653.     | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0)
  654.     | ((status & UART_MSR_RI) ? TIOCM_RNG : 0)
  655.     | ((status & UART_MSR_DSR) ? TIOCM_DSR : 0)
  656.     | ((status & UART_MSR_CTS) ? TIOCM_CTS : 0);
  657. put_user(result, (uint *) value);
  658. return 0;
  659. }
  660. static int
  661. ctc_tty_set_ctc_tty_info(ctc_tty_info * info, uint cmd, uint * value)
  662. {
  663. uint arg;
  664. int old_mcr = info->mcr & (UART_MCR_RTS | UART_MCR_DTR);
  665. get_user(arg, (uint *) value);
  666. switch (cmd) {
  667. case TIOCMBIS:
  668. #ifdef CTC_DEBUG_MODEM_IOCTL
  669. printk(KERN_DEBUG "%s%d ioctl TIOCMBISn", CTC_TTY_NAME,
  670.        info->line);
  671. #endif
  672. if (arg & TIOCM_RTS)
  673. info->mcr |= UART_MCR_RTS;
  674. if (arg & TIOCM_DTR)
  675. info->mcr |= UART_MCR_DTR;
  676. break;
  677. case TIOCMBIC:
  678. #ifdef CTC_DEBUG_MODEM_IOCTL
  679. printk(KERN_DEBUG "%s%d ioctl TIOCMBICn", CTC_TTY_NAME,
  680.        info->line);
  681. #endif
  682. if (arg & TIOCM_RTS)
  683. info->mcr &= ~UART_MCR_RTS;
  684. if (arg & TIOCM_DTR)
  685. info->mcr &= ~UART_MCR_DTR;
  686. break;
  687. case TIOCMSET:
  688. #ifdef CTC_DEBUG_MODEM_IOCTL
  689. printk(KERN_DEBUG "%s%d ioctl TIOCMSETn", CTC_TTY_NAME,
  690.        info->line);
  691. #endif
  692. info->mcr = ((info->mcr & ~(UART_MCR_RTS | UART_MCR_DTR))
  693.  | ((arg & TIOCM_RTS) ? UART_MCR_RTS : 0)
  694.        | ((arg & TIOCM_DTR) ? UART_MCR_DTR : 0));
  695. break;
  696. default:
  697. return -EINVAL;
  698. }
  699. if ((info->mcr  & (UART_MCR_RTS | UART_MCR_DTR)) != old_mcr)
  700. ctc_tty_transmit_status(info);
  701. return 0;
  702. }
  703. static int
  704. ctc_tty_ioctl(struct tty_struct *tty, struct file *file,
  705.        uint cmd, ulong arg)
  706. {
  707. ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
  708. int error;
  709. int retval;
  710. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_ioctl"))
  711. return -ENODEV;
  712. if (tty->flags & (1 << TTY_IO_ERROR))
  713. return -EIO;
  714. switch (cmd) {
  715. case TCSBRK:   /* SVID version: non-zero arg --> no break */
  716. #ifdef CTC_DEBUG_MODEM_IOCTL
  717. printk(KERN_DEBUG "%s%d ioctl TCSBRKn", CTC_TTY_NAME, info->line);
  718. #endif
  719. retval = tty_check_change(tty);
  720. if (retval)
  721. return retval;
  722. tty_wait_until_sent(tty, 0);
  723. return 0;
  724. case TCSBRKP:  /* support for POSIX tcsendbreak() */
  725. #ifdef CTC_DEBUG_MODEM_IOCTL
  726. printk(KERN_DEBUG "%s%d ioctl TCSBRKPn", CTC_TTY_NAME, info->line);
  727. #endif
  728. retval = tty_check_change(tty);
  729. if (retval)
  730. return retval;
  731. tty_wait_until_sent(tty, 0);
  732. return 0;
  733. case TIOCGSOFTCAR:
  734. #ifdef CTC_DEBUG_MODEM_IOCTL
  735. printk(KERN_DEBUG "%s%d ioctl TIOCGSOFTCARn", CTC_TTY_NAME,
  736.        info->line);
  737. #endif
  738. error = verify_area(VERIFY_WRITE, (void *) arg, sizeof(long));
  739. if (error)
  740. return error;
  741. put_user(C_CLOCAL(tty) ? 1 : 0, (ulong *) arg);
  742. return 0;
  743. case TIOCSSOFTCAR:
  744. #ifdef CTC_DEBUG_MODEM_IOCTL
  745. printk(KERN_DEBUG "%s%d ioctl TIOCSSOFTCARn", CTC_TTY_NAME,
  746.        info->line);
  747. #endif
  748. error = verify_area(VERIFY_READ, (void *) arg, sizeof(long));
  749. if (error)
  750. return error;
  751. get_user(arg, (ulong *) arg);
  752. tty->termios->c_cflag =
  753.     ((tty->termios->c_cflag & ~CLOCAL) |
  754.      (arg ? CLOCAL : 0));
  755. return 0;
  756. case TIOCMGET:
  757. #ifdef CTC_DEBUG_MODEM_IOCTL
  758. printk(KERN_DEBUG "%s%d ioctl TIOCMGETn", CTC_TTY_NAME,
  759.        info->line);
  760. #endif
  761. error = verify_area(VERIFY_WRITE, (void *) arg, sizeof(uint));
  762. if (error)
  763. return error;
  764. return ctc_tty_get_ctc_tty_info(info, (uint *) arg);
  765. case TIOCMBIS:
  766. case TIOCMBIC:
  767. case TIOCMSET:
  768. error = verify_area(VERIFY_READ, (void *) arg, sizeof(uint));
  769. if (error)
  770. return error;
  771. return ctc_tty_set_ctc_tty_info(info, cmd, (uint *) arg);
  772. case TIOCSERGETLSR: /* Get line status register */
  773. #ifdef CTC_DEBUG_MODEM_IOCTL
  774. printk(KERN_DEBUG "%s%d ioctl TIOCSERGETLSRn", CTC_TTY_NAME,
  775.        info->line);
  776. #endif
  777. error = verify_area(VERIFY_WRITE, (void *) arg, sizeof(uint));
  778. if (error)
  779. return error;
  780. else
  781. return ctc_tty_get_lsr_info(info, (uint *) arg);
  782. default:
  783. #ifdef CTC_DEBUG_MODEM_IOCTL
  784. printk(KERN_DEBUG "UNKNOWN ioctl 0x%08x on %s%dn", cmd,
  785.        CTC_TTY_NAME, info->line);
  786. #endif
  787. return -ENOIOCTLCMD;
  788. }
  789. return 0;
  790. }
  791. static void
  792. ctc_tty_set_termios(struct tty_struct *tty, struct termios *old_termios)
  793. {
  794. ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
  795. unsigned int cflag = tty->termios->c_cflag;
  796. ctc_tty_change_speed(info);
  797. /* Handle transition to B0 */
  798. if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) {
  799. info->mcr &= ~(UART_MCR_DTR|UART_MCR_RTS);
  800. ctc_tty_transmit_status(info);
  801. }
  802. /* Handle transition from B0 to other */
  803. if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
  804. info->mcr |= UART_MCR_DTR;
  805. if (!(tty->termios->c_cflag & CRTSCTS) ||
  806.                     !test_bit(TTY_THROTTLED, &tty->flags)) {
  807.                         info->mcr |= UART_MCR_RTS;
  808.                 }
  809. ctc_tty_transmit_status(info);
  810. }
  811. /* Handle turning off CRTSCTS */
  812. if ((old_termios->c_cflag & CRTSCTS) &&
  813.             !(tty->termios->c_cflag & CRTSCTS))
  814.                 tty->hw_stopped = 0;
  815. }
  816. /*
  817.  * ------------------------------------------------------------
  818.  * ctc_tty_open() and friends
  819.  * ------------------------------------------------------------
  820.  */
  821. static int
  822. ctc_tty_block_til_ready(struct tty_struct *tty, struct file *filp, ctc_tty_info *info)
  823. {
  824. DECLARE_WAITQUEUE(wait, NULL);
  825. int do_clocal = 0;
  826. unsigned long flags;
  827. int retval;
  828. /*
  829.  * If the device is in the middle of being closed, then block
  830.  * until it's done, and then try again.
  831.  */
  832. if (tty_hung_up_p(filp) ||
  833.     (info->flags & CTC_ASYNC_CLOSING)) {
  834. if (info->flags & CTC_ASYNC_CLOSING)
  835. interruptible_sleep_on(&info->close_wait);
  836. #ifdef MODEM_DO_RESTART
  837. if (info->flags & CTC_ASYNC_HUP_NOTIFY)
  838. return -EAGAIN;
  839. else
  840. return -ERESTARTSYS;
  841. #else
  842. return -EAGAIN;
  843. #endif
  844. }
  845. /*
  846.  * If non-blocking mode is set, then make the check up front
  847.  * and then exit.
  848.  */
  849. if ((filp->f_flags & O_NONBLOCK) ||
  850.     (tty->flags & (1 << TTY_IO_ERROR))) {
  851. info->flags |= CTC_ASYNC_NORMAL_ACTIVE;
  852. return 0;
  853. }
  854. if (tty->termios->c_cflag & CLOCAL)
  855. do_clocal = 1;
  856. /*
  857.  * Block waiting for the carrier detect and the line to become
  858.  * free (i.e., not in use by the callout).  While we are in
  859.  * this loop, info->count is dropped by one, so that
  860.  * ctc_tty_close() knows when to free things.  We restore it upon
  861.  * exit, either normal or abnormal.
  862.  */
  863. retval = 0;
  864. add_wait_queue(&info->open_wait, &wait);
  865. #ifdef CTC_DEBUG_MODEM_OPEN
  866. printk(KERN_DEBUG "ctc_tty_block_til_ready before block: %s%d, count = %dn",
  867.        CTC_TTY_NAME, info->line, info->count);
  868. #endif
  869. save_flags(flags);
  870. cli();
  871. if (!(tty_hung_up_p(filp)))
  872. info->count--;
  873. restore_flags(flags);
  874. info->blocked_open++;
  875. while (1) {
  876. set_current_state(TASK_INTERRUPTIBLE);
  877. if (tty_hung_up_p(filp) ||
  878.     !(info->flags & CTC_ASYNC_INITIALIZED)) {
  879. #ifdef MODEM_DO_RESTART
  880. if (info->flags & CTC_ASYNC_HUP_NOTIFY)
  881. retval = -EAGAIN;
  882. else
  883. retval = -ERESTARTSYS;
  884. #else
  885. retval = -EAGAIN;
  886. #endif
  887. break;
  888. }
  889. if (!(info->flags & CTC_ASYNC_CLOSING) &&
  890.     (do_clocal || (info->msr & UART_MSR_DCD))) {
  891. break;
  892. }
  893. if (signal_pending(current)) {
  894. retval = -ERESTARTSYS;
  895. break;
  896. }
  897. #ifdef CTC_DEBUG_MODEM_OPEN
  898. printk(KERN_DEBUG "ctc_tty_block_til_ready blocking: %s%d, count = %dn",
  899.        CTC_TTY_NAME, info->line, info->count);
  900. #endif
  901. schedule();
  902. }
  903. current->state = TASK_RUNNING;
  904. remove_wait_queue(&info->open_wait, &wait);
  905. if (!tty_hung_up_p(filp))
  906. info->count++;
  907. info->blocked_open--;
  908. #ifdef CTC_DEBUG_MODEM_OPEN
  909. printk(KERN_DEBUG "ctc_tty_block_til_ready after blocking: %s%d, count = %dn",
  910.        CTC_TTY_NAME, info->line, info->count);
  911. #endif
  912. if (retval)
  913. return retval;
  914. info->flags |= CTC_ASYNC_NORMAL_ACTIVE;
  915. return 0;
  916. }
  917. /*
  918.  * This routine is called whenever a serial port is opened.  It
  919.  * enables interrupts for a serial port, linking in its async structure into
  920.  * the IRQ chain.   It also performs the serial-specific
  921.  * initialization for the tty structure.
  922.  */
  923. static int
  924. ctc_tty_open(struct tty_struct *tty, struct file *filp)
  925. {
  926. ctc_tty_info *info;
  927. unsigned long saveflags;
  928. int retval,
  929.  line;
  930. line = MINOR(tty->device) - tty->driver.minor_start;
  931. if (line < 0 || line > CTC_TTY_MAX_DEVICES)
  932. return -ENODEV;
  933. info = &driver->info[line];
  934. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_open"))
  935. return -ENODEV;
  936. if (!info->netdev)
  937. return -ENODEV;
  938. #ifdef CTC_DEBUG_MODEM_OPEN
  939. printk(KERN_DEBUG "ctc_tty_open %s%d, count = %dn", tty->driver.name,
  940.        info->line, info->count);
  941. #endif
  942. spin_lock_irqsave(&ctc_tty_lock, saveflags);
  943. info->count++;
  944. tty->driver_data = info;
  945. info->tty = tty;
  946. spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
  947. /*
  948.  * Start up serial port
  949.  */
  950. retval = ctc_tty_startup(info);
  951. if (retval) {
  952. #ifdef CTC_DEBUG_MODEM_OPEN
  953. printk(KERN_DEBUG "ctc_tty_open return after startupn");
  954. #endif
  955. return retval;
  956. }
  957. retval = ctc_tty_block_til_ready(tty, filp, info);
  958. if (retval) {
  959. #ifdef CTC_DEBUG_MODEM_OPEN
  960. printk(KERN_DEBUG "ctc_tty_open return after ctc_tty_block_til_ready n");
  961. #endif
  962. return retval;
  963. }
  964. if ((info->count == 1) && (info->flags & CTC_ASYNC_SPLIT_TERMIOS)) {
  965. *tty->termios = info->normal_termios;
  966. ctc_tty_change_speed(info);
  967. }
  968. #ifdef CTC_DEBUG_MODEM_OPEN
  969. printk(KERN_DEBUG "ctc_tty_open %s%d successful...n", CTC_TTY_NAME, info->line);
  970. #endif
  971. return 0;
  972. }
  973. static void
  974. ctc_tty_close(struct tty_struct *tty, struct file *filp)
  975. {
  976. ctc_tty_info *info = (ctc_tty_info *) tty->driver_data;
  977. unsigned long saveflags;
  978. ulong flags;
  979. ulong timeout;
  980. if (!info || ctc_tty_paranoia_check(info, tty->device, "ctc_tty_close"))
  981. return;
  982. save_flags(flags);
  983. cli();
  984. if (tty_hung_up_p(filp)) {
  985. restore_flags(flags);
  986. #ifdef CTC_DEBUG_MODEM_OPEN
  987. printk(KERN_DEBUG "ctc_tty_close return after tty_hung_up_pn");
  988. #endif
  989. return;
  990. }
  991. if ((tty->count == 1) && (info->count != 1)) {
  992. /*
  993.  * Uh, oh.  tty->count is 1, which means that the tty
  994.  * structure will be freed.  Info->count should always
  995.  * be one in these conditions.  If it's greater than
  996.  * one, we've got real problems, since it means the
  997.  * serial port won't be shutdown.
  998.  */
  999. printk(KERN_ERR "ctc_tty_close: bad port count; tty->count is 1, "
  1000.        "info->count is %dn", info->count);
  1001. info->count = 1;
  1002. }
  1003. if (--info->count < 0) {
  1004. printk(KERN_ERR "ctc_tty_close: bad port count for %s%d: %dn",
  1005.        CTC_TTY_NAME, info->line, info->count);
  1006. info->count = 0;
  1007. }
  1008. if (info->count) {
  1009. restore_flags(flags);
  1010. #ifdef CTC_DEBUG_MODEM_OPEN
  1011. printk(KERN_DEBUG "ctc_tty_close after info->count != 0n");
  1012. #endif
  1013. return;
  1014. }
  1015. info->flags |= CTC_ASYNC_CLOSING;
  1016. /*
  1017.  * Save the termios structure, since this port may have
  1018.  * separate termios for callout and dialin.
  1019.  */
  1020. if (info->flags & CTC_ASYNC_NORMAL_ACTIVE)
  1021. info->normal_termios = *tty->termios;
  1022. tty->closing = 1;
  1023. /*
  1024.  * At this point we stop accepting input.  To do this, we
  1025.  * disable the receive line status interrupts, and tell the
  1026.  * interrupt driver to stop checking the data ready bit in the
  1027.  * line status register.
  1028.  */
  1029. if (info->flags & CTC_ASYNC_INITIALIZED) {
  1030. tty_wait_until_sent(tty, 3000); /* 30 seconds timeout */
  1031. /*
  1032.  * Before we drop DTR, make sure the UART transmitter
  1033.  * has completely drained; this is especially
  1034.  * important if there is a transmit FIFO!
  1035.  */
  1036. timeout = jiffies + HZ;
  1037. while (!(info->lsr & UART_LSR_TEMT)) {
  1038. set_current_state(TASK_INTERRUPTIBLE);
  1039. schedule_timeout(20);
  1040. if (time_after(jiffies,timeout))
  1041. break;
  1042. }
  1043. }
  1044. ctc_tty_shutdown(info);
  1045. if (tty->driver.flush_buffer)
  1046. tty->driver.flush_buffer(tty);
  1047. if (tty->ldisc.flush_buffer)
  1048. tty->ldisc.flush_buffer(tty);
  1049. spin_lock_irqsave(&ctc_tty_lock, saveflags);
  1050. info->tty = 0;
  1051. spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
  1052. tty->closing = 0;
  1053. if (info->blocked_open) {
  1054. set_current_state(TASK_INTERRUPTIBLE);
  1055. schedule_timeout(50);
  1056. wake_up_interruptible(&info->open_wait);
  1057. }
  1058. info->flags &= ~(CTC_ASYNC_NORMAL_ACTIVE | CTC_ASYNC_CLOSING);
  1059. wake_up_interruptible(&info->close_wait);
  1060. restore_flags(flags);
  1061. #ifdef CTC_DEBUG_MODEM_OPEN
  1062. printk(KERN_DEBUG "ctc_tty_close normal exitn");
  1063. #endif
  1064. }
  1065. /*
  1066.  * ctc_tty_hangup() --- called by tty_hangup() when a hangup is signaled.
  1067.  */
  1068. static void
  1069. ctc_tty_hangup(struct tty_struct *tty)
  1070. {
  1071. ctc_tty_info *info = (ctc_tty_info *)tty->driver_data;
  1072. unsigned long saveflags;
  1073. if (ctc_tty_paranoia_check(info, tty->device, "ctc_tty_hangup"))
  1074. return;
  1075. ctc_tty_shutdown(info);
  1076. info->count = 0;
  1077. info->flags &= ~CTC_ASYNC_NORMAL_ACTIVE;
  1078. spin_lock_irqsave(&ctc_tty_lock, saveflags);
  1079. info->tty = 0;
  1080. spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
  1081. wake_up_interruptible(&info->open_wait);
  1082. }
  1083. /*
  1084.  * For all online tty's, try sending data to
  1085.  * the lower levels.
  1086.  */
  1087. static void
  1088. ctc_tty_task(ctc_tty_info *info)
  1089. {
  1090. unsigned long saveflags;
  1091. int again;
  1092. spin_lock_irqsave(&ctc_tty_lock, saveflags);
  1093. if ((!ctc_tty_shuttingdown) && info) {
  1094. again = ctc_tty_tint(info);
  1095. if (!again)
  1096. info->lsr |= UART_LSR_TEMT;
  1097. again |= ctc_tty_readmodem(info);
  1098. if (again) {
  1099. queue_task(&info->tq, &tq_immediate);
  1100. mark_bh(IMMEDIATE_BH);
  1101. }
  1102. }
  1103. spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
  1104. }
  1105. int
  1106. ctc_tty_init(void)
  1107. {
  1108. int i;
  1109. ctc_tty_info *info;
  1110. struct tty_driver *device;
  1111. driver = kmalloc(sizeof(ctc_tty_driver), GFP_KERNEL);
  1112. if (driver == NULL) {
  1113. printk(KERN_WARNING "Out of memory in ctc_tty_modem_initn");
  1114. return -ENOMEM;
  1115. }
  1116. memset(driver, 0, sizeof(ctc_tty_driver));
  1117. device = &driver->ctc_tty_device;
  1118. device->magic = TTY_DRIVER_MAGIC;
  1119. device->name = ctc_ttyname;
  1120. device->major = CTC_TTY_MAJOR;
  1121. device->minor_start = 0;
  1122. device->num = CTC_TTY_MAX_DEVICES;
  1123. device->type = TTY_DRIVER_TYPE_SERIAL;
  1124. device->subtype = CTC_SERIAL_TYPE_NORMAL;
  1125. device->init_termios = tty_std_termios;
  1126. device->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  1127. device->flags = TTY_DRIVER_REAL_RAW;
  1128. device->refcount = &driver->refcount;
  1129. device->table = driver->modem_table;
  1130. device->termios = driver->modem_termios;
  1131. device->termios_locked = driver->modem_termios_locked;
  1132. device->open = ctc_tty_open;
  1133. device->close = ctc_tty_close;
  1134. device->write = ctc_tty_write;
  1135. device->put_char = NULL;
  1136. device->flush_chars = ctc_tty_flush_chars;
  1137. device->write_room = ctc_tty_write_room;
  1138. device->chars_in_buffer = ctc_tty_chars_in_buffer;
  1139. device->flush_buffer = ctc_tty_flush_buffer;
  1140. device->ioctl = ctc_tty_ioctl;
  1141. device->throttle = ctc_tty_throttle;
  1142. device->unthrottle = ctc_tty_unthrottle;
  1143. device->set_termios = ctc_tty_set_termios;
  1144. device->stop = NULL;
  1145. device->start = NULL;
  1146. device->hangup = ctc_tty_hangup;
  1147. device->driver_name = "ctc_tty";
  1148. if (tty_register_driver(device)) {
  1149. printk(KERN_WARNING "ctc_tty: Couldn't register serial-devicen");
  1150. kfree(driver);
  1151. return -1;
  1152. }
  1153. for (i = 0; i < CTC_TTY_MAX_DEVICES; i++) {
  1154. info = &driver->info[i];
  1155. init_MUTEX(&info->write_sem);
  1156. #if LINUX_VERSION_CODE >= 0x020400
  1157. INIT_LIST_HEAD(&info->tq.list);
  1158. #else
  1159. info->tq.next    = NULL;
  1160. #endif
  1161. info->tq.sync    = 0;
  1162. info->tq.routine = (void *)(void *)ctc_tty_task;
  1163. info->tq.data    = info;
  1164. info->magic = CTC_ASYNC_MAGIC;
  1165. info->line = i;
  1166. info->tty = 0;
  1167. info->count = 0;
  1168. info->blocked_open = 0;
  1169. info->normal_termios = device->init_termios;
  1170. init_waitqueue_head(&info->open_wait);
  1171. init_waitqueue_head(&info->close_wait);
  1172. skb_queue_head_init(&info->tx_queue);
  1173. skb_queue_head_init(&info->rx_queue);
  1174. init_timer(&info->stoptimer);
  1175. info->stoptimer.function = ctc_tty_stopdev;
  1176. info->stoptimer.data = (unsigned long)info;
  1177. info->mcr = UART_MCR_RTS;
  1178. }
  1179. return 0;
  1180. }
  1181. int
  1182. ctc_tty_register_netdev(net_device *dev) {
  1183. int ttynum;
  1184. char *err;
  1185. char *p;
  1186. if ((!dev) || (!dev->name)) {
  1187. printk(KERN_WARNING
  1188.        "ctc_tty_register_netdev called "
  1189.        "with NULL dev or NULL dev-namen");
  1190. return -1;
  1191. }
  1192. for (p = dev->name; p && ((*p < '0') || (*p > '9')); p++);
  1193. ttynum = simple_strtoul(p, &err, 0);
  1194. if ((ttynum < 0) || (ttynum >= CTC_TTY_MAX_DEVICES) ||
  1195.     (err && *err)) {
  1196. printk(KERN_WARNING
  1197.        "ctc_tty_register_netdev called "
  1198.        "with number in name '%s'n", dev->name);
  1199. return -1;
  1200. }
  1201. if (driver->info[ttynum].netdev) {
  1202. printk(KERN_WARNING
  1203.        "ctc_tty_register_netdev called "
  1204.        "for already registered device '%s'n",
  1205.        dev->name);
  1206. return -1;
  1207. }
  1208. driver->info[ttynum].netdev = dev;
  1209. return 0;
  1210. }
  1211. void
  1212. ctc_tty_unregister_netdev(net_device *dev) {
  1213. int i;
  1214. unsigned long saveflags;
  1215. ctc_tty_info *info = NULL;
  1216. spin_lock_irqsave(&ctc_tty_lock, saveflags);
  1217. for (i = 0; i < CTC_TTY_MAX_DEVICES; i++)
  1218. if (driver->info[i].netdev == dev) {
  1219. info = &driver->info[i];
  1220. break;
  1221. }
  1222. if (info) {
  1223. info->netdev = NULL;
  1224. skb_queue_purge(&info->tx_queue);
  1225. skb_queue_purge(&info->rx_queue);
  1226. }
  1227. spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
  1228. }
  1229. void
  1230. ctc_tty_cleanup(int final) {
  1231. unsigned long saveflags;
  1232. spin_lock_irqsave(&ctc_tty_lock, saveflags);
  1233. ctc_tty_shuttingdown = 1;
  1234. if (final) {
  1235. kfree(driver);
  1236. driver = NULL;
  1237. } else {
  1238. int i;
  1239. for (i = 0; i < CTC_TTY_MAX_DEVICES; i++)
  1240. driver->info[i].tq.routine = NULL;
  1241. tty_unregister_driver(&driver->ctc_tty_device);
  1242. }
  1243. spin_unlock_irqrestore(&ctc_tty_lock, saveflags);
  1244. }