Commit d92cb7bed28fe6e0d05c4991127b401da8593666

Authored by Craig McQueen
1 parent f4800a02

Move hardware handshaking null-modem connections into a single function.

Showing 1 changed file with 54 additions and 50 deletions
module/tty0tty.c
@@ -63,6 +63,8 @@ MODULE_LICENSE("GPL"); @@ -63,6 +63,8 @@ MODULE_LICENSE("GPL");
63 #define MCR_DTR 0x01 63 #define MCR_DTR 0x01
64 #define MCR_RTS 0x02 64 #define MCR_RTS 0x02
65 #define MCR_LOOP 0x04 65 #define MCR_LOOP 0x04
  66 +#define MCR_OUT1 0x08
  67 +#define MCR_OUT2 0x10
66 //in 68 //in
67 #define MSR_CTS 0x10 69 #define MSR_CTS 0x10
68 #define MSR_CD 0x20 70 #define MSR_CD 0x20
@@ -87,13 +89,36 @@ struct tty0tty_serial { @@ -87,13 +89,36 @@ struct tty0tty_serial {
87 static struct tty0tty_serial *tty0tty_table[TINY_TTY_MINORS]; /* initially all NULL */ 89 static struct tty0tty_serial *tty0tty_table[TINY_TTY_MINORS]; /* initially all NULL */
88 90
89 91
  92 +static inline void null_modem_signal_copy(struct tty0tty_serial * tty_to, const struct tty0tty_serial * tty_from)
  93 +{
  94 + unsigned int msr_to = 0;
  95 + unsigned int mcr_from = 0;
  96 +
  97 + if (tty_to != NULL && tty_to->open_count > 0) {
  98 + if (tty_from != NULL && tty_from->open_count > 0) {
  99 + mcr_from = tty_from->mcr;
  100 + }
  101 + msr_to = tty_to->msr & ~(MSR_CD | MSR_CTS | MSR_DSR | MSR_RI);
  102 +
  103 + /* RTS --> CTS */
  104 + if (mcr_from & MCR_RTS) {
  105 + msr_to |= MSR_CTS;
  106 + }
  107 + /* DTR --> DSR and DCD */
  108 + if (mcr_from & MCR_DTR) {
  109 + msr_to |= MSR_DSR;
  110 + msr_to |= MSR_CD;
  111 + }
  112 +
  113 + tty_to->msr = msr_to;
  114 + }
  115 +}
  116 +
90 static int tty0tty_open(struct tty_struct *tty, struct file *file) 117 static int tty0tty_open(struct tty_struct *tty, struct file *file)
91 { 118 {
92 struct tty0tty_serial *tty0tty; 119 struct tty0tty_serial *tty0tty;
93 int index; 120 int index;
94 int paired_index; 121 int paired_index;
95 - int msr=0;  
96 - int mcr=0;  
97 122
98 #ifdef SCULL_DEBUG 123 #ifdef SCULL_DEBUG
99 printk(KERN_DEBUG "%s - \n", __FUNCTION__); 124 printk(KERN_DEBUG "%s - \n", __FUNCTION__);
@@ -122,25 +147,6 @@ static int tty0tty_open(struct tty_struct *tty, struct file *file) @@ -122,25 +147,6 @@ static int tty0tty_open(struct tty_struct *tty, struct file *file)
122 147
123 } 148 }
124 149
125 - if (tty0tty_table[paired_index] != NULL &&  
126 - tty0tty_table[paired_index]->open_count > 0)  
127 - mcr = tty0tty_table[paired_index]->mcr;  
128 -  
129 -//null modem connection  
130 -  
131 - if( (mcr & MCR_RTS) == MCR_RTS )  
132 - {  
133 - msr |= MSR_CTS;  
134 - }  
135 -  
136 - if( (mcr & MCR_DTR) == MCR_DTR )  
137 - {  
138 - msr |= MSR_DSR;  
139 - msr |= MSR_CD;  
140 - }  
141 -  
142 - tty0tty->msr = msr;  
143 -  
144 down(&tty0tty->sem); 150 down(&tty0tty->sem);
145 151
146 /* save our structure within the tty structure */ 152 /* save our structure within the tty structure */
@@ -149,6 +155,8 @@ static int tty0tty_open(struct tty_struct *tty, struct file *file) @@ -149,6 +155,8 @@ static int tty0tty_open(struct tty_struct *tty, struct file *file)
149 155
150 ++tty0tty->open_count; 156 ++tty0tty->open_count;
151 157
  158 + null_modem_signal_copy(tty0tty, tty0tty_table[paired_index]);
  159 +
152 up(&tty0tty->sem); 160 up(&tty0tty->sem);
153 return 0; 161 return 0;
154 } 162 }
@@ -339,9 +347,11 @@ static int tty0tty_tiocmget(struct tty_struct *tty, struct file *file) @@ -339,9 +347,11 @@ static int tty0tty_tiocmget(struct tty_struct *tty, struct file *file)
339 unsigned int mcr = tty0tty->mcr; 347 unsigned int mcr = tty0tty->mcr;
340 348
341 349
342 - result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) | /* DTR is set */ 350 + result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) | /* DTR is set */
343 ((mcr & MCR_RTS) ? TIOCM_RTS : 0) | /* RTS is set */ 351 ((mcr & MCR_RTS) ? TIOCM_RTS : 0) | /* RTS is set */
344 ((mcr & MCR_LOOP) ? TIOCM_LOOP : 0) | /* LOOP is set */ 352 ((mcr & MCR_LOOP) ? TIOCM_LOOP : 0) | /* LOOP is set */
  353 + ((mcr & MCR_OUT1) ? TIOCM_OUT1 : 0) | /* OUT1 is set */
  354 + ((mcr & MCR_OUT2) ? TIOCM_OUT2 : 0) | /* OUT2 is set */
345 ((msr & MSR_CTS) ? TIOCM_CTS : 0) | /* CTS is set */ 355 ((msr & MSR_CTS) ? TIOCM_CTS : 0) | /* CTS is set */
346 ((msr & MSR_CD) ? TIOCM_CAR : 0) | /* Carrier detect is set*/ 356 ((msr & MSR_CD) ? TIOCM_CAR : 0) | /* Carrier detect is set*/
347 ((msr & MSR_RI) ? TIOCM_RI : 0) | /* Ring Indicator is set */ 357 ((msr & MSR_RI) ? TIOCM_RI : 0) | /* Ring Indicator is set */
@@ -355,53 +365,47 @@ static int tty0tty_tiocmset(struct tty_struct *tty, struct file *file, @@ -355,53 +365,47 @@ static int tty0tty_tiocmset(struct tty_struct *tty, struct file *file,
355 { 365 {
356 struct tty0tty_serial *tty0tty = tty->driver_data; 366 struct tty0tty_serial *tty0tty = tty->driver_data;
357 unsigned int mcr = tty0tty->mcr; 367 unsigned int mcr = tty0tty->mcr;
358 - unsigned int msr=0;  
359 int paired_index; 368 int paired_index;
360 369
361 #ifdef SCULL_DEBUG 370 #ifdef SCULL_DEBUG
362 printk(KERN_DEBUG "%s - \n", __FUNCTION__); 371 printk(KERN_DEBUG "%s - \n", __FUNCTION__);
363 #endif 372 #endif
364 373
365 - paired_index = PAIRED_INDEX(tty0tty->tty->index);  
366 - if (tty0tty_table[paired_index] != NULL &&  
367 - tty0tty_table[paired_index]->open_count > 0)  
368 - msr = tty0tty_table[paired_index]->msr;  
369 -  
370 -//null modem connection  
371 -  
372 - if (set & TIOCM_RTS)  
373 - { 374 + /* Set bits */
  375 + if (set & TIOCM_RTS) {
374 mcr |= MCR_RTS; 376 mcr |= MCR_RTS;
375 - msr |= MSR_CTS;  
376 } 377 }
377 -  
378 - if (set & TIOCM_DTR)  
379 - { 378 + if (set & TIOCM_DTR) {
380 mcr |= MCR_DTR; 379 mcr |= MCR_DTR;
381 - msr |= MSR_DSR;  
382 - msr |= MSR_CD; 380 + }
  381 + if (set & TIOCM_OUT1) {
  382 + mcr |= MCR_OUT1;
  383 + }
  384 + if (set & TIOCM_OUT2) {
  385 + mcr |= MCR_OUT2;
383 } 386 }
384 387
385 - if (clear & TIOCM_RTS)  
386 - { 388 + /* Clear bits */
  389 + if (clear & TIOCM_RTS) {
387 mcr &= ~MCR_RTS; 390 mcr &= ~MCR_RTS;
388 - msr &= ~MSR_CTS;  
389 } 391 }
390 -  
391 - if (clear & TIOCM_DTR)  
392 - { 392 + if (clear & TIOCM_DTR) {
393 mcr &= ~MCR_DTR; 393 mcr &= ~MCR_DTR;
394 - msr &= ~MSR_DSR;  
395 - msr &= ~MSR_CD;  
396 } 394 }
397 - 395 + if (clear & TIOCM_OUT1) {
  396 + mcr &= ~MCR_OUT1;
  397 + }
  398 + if (clear & TIOCM_OUT2) {
  399 + mcr &= ~MCR_OUT2;
  400 + }
398 401
399 /* set the new MCR value in the device */ 402 /* set the new MCR value in the device */
400 tty0tty->mcr = mcr; 403 tty0tty->mcr = mcr;
401 404
402 - if (tty0tty_table[paired_index] != NULL &&  
403 - tty0tty_table[paired_index]->open_count > 0)  
404 - tty0tty_table[paired_index]->msr = msr; 405 + //null modem connection
  406 + paired_index = PAIRED_INDEX(tty0tty->tty->index);
  407 + null_modem_signal_copy(tty0tty_table[paired_index], tty0tty);
  408 +
405 return 0; 409 return 0;
406 } 410 }
407 411