• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2003 Digi International (www.digi.com)
3  *	Scott H Kilau <Scott_Kilau at digi dot com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2, or (at your option)
8  * any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
12  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13  * PURPOSE.  See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  *
19  *
20  *	NOTE TO LINUX KERNEL HACKERS:  DO NOT REFORMAT THIS CODE!
21  *
22  *	This is shared code between Digi's CVS archive and the
23  *	Linux Kernel sources.
24  *	Changing the source just for reformatting needlessly breaks
25  *	our CVS diff history.
26  *
27  *	Send any bug fixes/changes to:  Eng.Linux at digi dot com.
28  *	Thank you.
29  *
30  */
31 
32 #include <linux/kernel.h>
33 #include <linux/sched.h>	/* For jiffies, task states */
34 #include <linux/interrupt.h>	/* For tasklet and interrupt structs/defines */
35 #include <linux/delay.h>	/* For udelay */
36 #include <linux/io.h>		/* For read[bwl]/write[bwl] */
37 #include <linux/serial.h>	/* For struct async_serial */
38 #include <linux/serial_reg.h>	/* For the various UART offsets */
39 #include <linux/pci.h>
40 
41 #include "dgnc_driver.h"	/* Driver main header file */
42 #include "dgnc_cls.h"
43 #include "dgnc_tty.h"
44 
45 static inline void cls_parse_isr(struct dgnc_board *brd, uint port);
46 static inline void cls_clear_break(struct channel_t *ch, int force);
47 static inline void cls_set_cts_flow_control(struct channel_t *ch);
48 static inline void cls_set_rts_flow_control(struct channel_t *ch);
49 static inline void cls_set_ixon_flow_control(struct channel_t *ch);
50 static inline void cls_set_ixoff_flow_control(struct channel_t *ch);
51 static inline void cls_set_no_output_flow_control(struct channel_t *ch);
52 static inline void cls_set_no_input_flow_control(struct channel_t *ch);
53 static void cls_parse_modem(struct channel_t *ch, unsigned char signals);
54 static void cls_tasklet(unsigned long data);
55 static void cls_vpd(struct dgnc_board *brd);
56 static void cls_uart_init(struct channel_t *ch);
57 static void cls_uart_off(struct channel_t *ch);
58 static int cls_drain(struct tty_struct *tty, uint seconds);
59 static void cls_param(struct tty_struct *tty);
60 static void cls_assert_modem_signals(struct channel_t *ch);
61 static void cls_flush_uart_write(struct channel_t *ch);
62 static void cls_flush_uart_read(struct channel_t *ch);
63 static void cls_disable_receiver(struct channel_t *ch);
64 static void cls_enable_receiver(struct channel_t *ch);
65 static void cls_send_break(struct channel_t *ch, int msecs);
66 static void cls_send_start_character(struct channel_t *ch);
67 static void cls_send_stop_character(struct channel_t *ch);
68 static void cls_copy_data_from_uart_to_queue(struct channel_t *ch);
69 static void cls_copy_data_from_queue_to_uart(struct channel_t *ch);
70 static uint cls_get_uart_bytes_left(struct channel_t *ch);
71 static void cls_send_immediate_char(struct channel_t *ch, unsigned char);
72 static irqreturn_t cls_intr(int irq, void *voidbrd);
73 
74 struct board_ops dgnc_cls_ops = {
75 	.tasklet =			cls_tasklet,
76 	.intr =				cls_intr,
77 	.uart_init =			cls_uart_init,
78 	.uart_off =			cls_uart_off,
79 	.drain =			cls_drain,
80 	.param =			cls_param,
81 	.vpd =				cls_vpd,
82 	.assert_modem_signals =		cls_assert_modem_signals,
83 	.flush_uart_write =		cls_flush_uart_write,
84 	.flush_uart_read =		cls_flush_uart_read,
85 	.disable_receiver =		cls_disable_receiver,
86 	.enable_receiver =		cls_enable_receiver,
87 	.send_break =			cls_send_break,
88 	.send_start_character =		cls_send_start_character,
89 	.send_stop_character =		cls_send_stop_character,
90 	.copy_data_from_queue_to_uart = cls_copy_data_from_queue_to_uart,
91 	.get_uart_bytes_left =		cls_get_uart_bytes_left,
92 	.send_immediate_char =		cls_send_immediate_char
93 };
94 
95 
cls_set_cts_flow_control(struct channel_t * ch)96 static inline void cls_set_cts_flow_control(struct channel_t *ch)
97 {
98 	unsigned char lcrb = readb(&ch->ch_cls_uart->lcr);
99 	unsigned char ier = readb(&ch->ch_cls_uart->ier);
100 	unsigned char isr_fcr = 0;
101 
102 
103 	/*
104 	 * The Enhanced Register Set may only be accessed when
105 	 * the Line Control Register is set to 0xBFh.
106 	 */
107 	writeb(UART_EXAR654_ENHANCED_REGISTER_SET, &ch->ch_cls_uart->lcr);
108 
109 	isr_fcr = readb(&ch->ch_cls_uart->isr_fcr);
110 
111 	/* Turn on CTS flow control, turn off IXON flow control */
112 	isr_fcr |= (UART_EXAR654_EFR_ECB | UART_EXAR654_EFR_CTSDSR);
113 	isr_fcr &= ~(UART_EXAR654_EFR_IXON);
114 
115 	writeb(isr_fcr, &ch->ch_cls_uart->isr_fcr);
116 
117 	/* Write old LCR value back out, which turns enhanced access off */
118 	writeb(lcrb, &ch->ch_cls_uart->lcr);
119 
120 	/*
121 	 * Enable interrupts for CTS flow, turn off interrupts for
122 	 * received XOFF chars
123 	 */
124 	ier |= (UART_EXAR654_IER_CTSDSR);
125 	ier &= ~(UART_EXAR654_IER_XOFF);
126 	writeb(ier, &ch->ch_cls_uart->ier);
127 
128 	/* Set the usual FIFO values */
129 	writeb((UART_FCR_ENABLE_FIFO), &ch->ch_cls_uart->isr_fcr);
130 
131 	writeb((UART_FCR_ENABLE_FIFO | UART_16654_FCR_RXTRIGGER_56 |
132 		UART_16654_FCR_TXTRIGGER_16 | UART_FCR_CLEAR_RCVR),
133 		&ch->ch_cls_uart->isr_fcr);
134 
135 	ch->ch_t_tlevel = 16;
136 
137 }
138 
139 
cls_set_ixon_flow_control(struct channel_t * ch)140 static inline void cls_set_ixon_flow_control(struct channel_t *ch)
141 {
142 	unsigned char lcrb = readb(&ch->ch_cls_uart->lcr);
143 	unsigned char ier = readb(&ch->ch_cls_uart->ier);
144 	unsigned char isr_fcr = 0;
145 
146 
147 	/*
148 	 * The Enhanced Register Set may only be accessed when
149 	 * the Line Control Register is set to 0xBFh.
150 	 */
151 	writeb(UART_EXAR654_ENHANCED_REGISTER_SET, &ch->ch_cls_uart->lcr);
152 
153 	isr_fcr = readb(&ch->ch_cls_uart->isr_fcr);
154 
155 	/* Turn on IXON flow control, turn off CTS flow control */
156 	isr_fcr |= (UART_EXAR654_EFR_ECB | UART_EXAR654_EFR_IXON);
157 	isr_fcr &= ~(UART_EXAR654_EFR_CTSDSR);
158 
159 	writeb(isr_fcr, &ch->ch_cls_uart->isr_fcr);
160 
161 	/* Now set our current start/stop chars while in enhanced mode */
162 	writeb(ch->ch_startc, &ch->ch_cls_uart->mcr);
163 	writeb(0, &ch->ch_cls_uart->lsr);
164 	writeb(ch->ch_stopc, &ch->ch_cls_uart->msr);
165 	writeb(0, &ch->ch_cls_uart->spr);
166 
167 	/* Write old LCR value back out, which turns enhanced access off */
168 	writeb(lcrb, &ch->ch_cls_uart->lcr);
169 
170 	/*
171 	 * Disable interrupts for CTS flow, turn on interrupts for
172 	 * received XOFF chars
173 	 */
174 	ier &= ~(UART_EXAR654_IER_CTSDSR);
175 	ier |= (UART_EXAR654_IER_XOFF);
176 	writeb(ier, &ch->ch_cls_uart->ier);
177 
178 	/* Set the usual FIFO values */
179 	writeb((UART_FCR_ENABLE_FIFO), &ch->ch_cls_uart->isr_fcr);
180 
181 	writeb((UART_FCR_ENABLE_FIFO | UART_16654_FCR_RXTRIGGER_16 |
182 		UART_16654_FCR_TXTRIGGER_16 | UART_FCR_CLEAR_RCVR),
183 		&ch->ch_cls_uart->isr_fcr);
184 
185 }
186 
187 
cls_set_no_output_flow_control(struct channel_t * ch)188 static inline void cls_set_no_output_flow_control(struct channel_t *ch)
189 {
190 	unsigned char lcrb = readb(&ch->ch_cls_uart->lcr);
191 	unsigned char ier = readb(&ch->ch_cls_uart->ier);
192 	unsigned char isr_fcr = 0;
193 
194 
195 	/*
196 	 * The Enhanced Register Set may only be accessed when
197 	 * the Line Control Register is set to 0xBFh.
198 	 */
199 	writeb(UART_EXAR654_ENHANCED_REGISTER_SET, &ch->ch_cls_uart->lcr);
200 
201 	isr_fcr = readb(&ch->ch_cls_uart->isr_fcr);
202 
203 	/* Turn off IXON flow control, turn off CTS flow control */
204 	isr_fcr |= (UART_EXAR654_EFR_ECB);
205 	isr_fcr &= ~(UART_EXAR654_EFR_CTSDSR | UART_EXAR654_EFR_IXON);
206 
207 	writeb(isr_fcr, &ch->ch_cls_uart->isr_fcr);
208 
209 	/* Write old LCR value back out, which turns enhanced access off */
210 	writeb(lcrb, &ch->ch_cls_uart->lcr);
211 
212 	/*
213 	 * Disable interrupts for CTS flow, turn off interrupts for
214 	 * received XOFF chars
215 	 */
216 	ier &= ~(UART_EXAR654_IER_CTSDSR);
217 	ier &= ~(UART_EXAR654_IER_XOFF);
218 	writeb(ier, &ch->ch_cls_uart->ier);
219 
220 	/* Set the usual FIFO values */
221 	writeb((UART_FCR_ENABLE_FIFO), &ch->ch_cls_uart->isr_fcr);
222 
223 	writeb((UART_FCR_ENABLE_FIFO | UART_16654_FCR_RXTRIGGER_16 |
224 		UART_16654_FCR_TXTRIGGER_16 | UART_FCR_CLEAR_RCVR),
225 		&ch->ch_cls_uart->isr_fcr);
226 
227 	ch->ch_r_watermark = 0;
228 	ch->ch_t_tlevel = 16;
229 	ch->ch_r_tlevel = 16;
230 
231 }
232 
233 
cls_set_rts_flow_control(struct channel_t * ch)234 static inline void cls_set_rts_flow_control(struct channel_t *ch)
235 {
236 	unsigned char lcrb = readb(&ch->ch_cls_uart->lcr);
237 	unsigned char ier = readb(&ch->ch_cls_uart->ier);
238 	unsigned char isr_fcr = 0;
239 
240 
241 	/*
242 	 * The Enhanced Register Set may only be accessed when
243 	 * the Line Control Register is set to 0xBFh.
244 	 */
245 	writeb(UART_EXAR654_ENHANCED_REGISTER_SET, &ch->ch_cls_uart->lcr);
246 
247 	isr_fcr = readb(&ch->ch_cls_uart->isr_fcr);
248 
249 	/* Turn on RTS flow control, turn off IXOFF flow control */
250 	isr_fcr |= (UART_EXAR654_EFR_ECB | UART_EXAR654_EFR_RTSDTR);
251 	isr_fcr &= ~(UART_EXAR654_EFR_IXOFF);
252 
253 	writeb(isr_fcr, &ch->ch_cls_uart->isr_fcr);
254 
255 	/* Write old LCR value back out, which turns enhanced access off */
256 	writeb(lcrb, &ch->ch_cls_uart->lcr);
257 
258 	/* Enable interrupts for RTS flow */
259 	ier |= (UART_EXAR654_IER_RTSDTR);
260 	writeb(ier, &ch->ch_cls_uart->ier);
261 
262 	/* Set the usual FIFO values */
263 	writeb((UART_FCR_ENABLE_FIFO), &ch->ch_cls_uart->isr_fcr);
264 
265 	writeb((UART_FCR_ENABLE_FIFO | UART_16654_FCR_RXTRIGGER_56 |
266 		UART_16654_FCR_TXTRIGGER_16 | UART_FCR_CLEAR_RCVR),
267 		&ch->ch_cls_uart->isr_fcr);
268 
269 
270 	ch->ch_r_watermark = 4;
271 	ch->ch_r_tlevel = 8;
272 
273 }
274 
275 
cls_set_ixoff_flow_control(struct channel_t * ch)276 static inline void cls_set_ixoff_flow_control(struct channel_t *ch)
277 {
278 	unsigned char lcrb = readb(&ch->ch_cls_uart->lcr);
279 	unsigned char ier = readb(&ch->ch_cls_uart->ier);
280 	unsigned char isr_fcr = 0;
281 
282 
283 	/*
284 	 * The Enhanced Register Set may only be accessed when
285 	 * the Line Control Register is set to 0xBFh.
286 	 */
287 	writeb(UART_EXAR654_ENHANCED_REGISTER_SET, &ch->ch_cls_uart->lcr);
288 
289 	isr_fcr = readb(&ch->ch_cls_uart->isr_fcr);
290 
291 	/* Turn on IXOFF flow control, turn off RTS flow control */
292 	isr_fcr |= (UART_EXAR654_EFR_ECB | UART_EXAR654_EFR_IXOFF);
293 	isr_fcr &= ~(UART_EXAR654_EFR_RTSDTR);
294 
295 	writeb(isr_fcr, &ch->ch_cls_uart->isr_fcr);
296 
297 	/* Now set our current start/stop chars while in enhanced mode */
298 	writeb(ch->ch_startc, &ch->ch_cls_uart->mcr);
299 	writeb(0, &ch->ch_cls_uart->lsr);
300 	writeb(ch->ch_stopc, &ch->ch_cls_uart->msr);
301 	writeb(0, &ch->ch_cls_uart->spr);
302 
303 	/* Write old LCR value back out, which turns enhanced access off */
304 	writeb(lcrb, &ch->ch_cls_uart->lcr);
305 
306 	/* Disable interrupts for RTS flow */
307 	ier &= ~(UART_EXAR654_IER_RTSDTR);
308 	writeb(ier, &ch->ch_cls_uart->ier);
309 
310 	/* Set the usual FIFO values */
311 	writeb((UART_FCR_ENABLE_FIFO), &ch->ch_cls_uart->isr_fcr);
312 
313 	writeb((UART_FCR_ENABLE_FIFO | UART_16654_FCR_RXTRIGGER_16 |
314 		UART_16654_FCR_TXTRIGGER_16 | UART_FCR_CLEAR_RCVR),
315 		&ch->ch_cls_uart->isr_fcr);
316 
317 }
318 
319 
cls_set_no_input_flow_control(struct channel_t * ch)320 static inline void cls_set_no_input_flow_control(struct channel_t *ch)
321 {
322 	unsigned char lcrb = readb(&ch->ch_cls_uart->lcr);
323 	unsigned char ier = readb(&ch->ch_cls_uart->ier);
324 	unsigned char isr_fcr = 0;
325 
326 
327 	/*
328 	 * The Enhanced Register Set may only be accessed when
329 	 * the Line Control Register is set to 0xBFh.
330 	 */
331 	writeb(UART_EXAR654_ENHANCED_REGISTER_SET, &ch->ch_cls_uart->lcr);
332 
333 	isr_fcr = readb(&ch->ch_cls_uart->isr_fcr);
334 
335 	/* Turn off IXOFF flow control, turn off RTS flow control */
336 	isr_fcr |= (UART_EXAR654_EFR_ECB);
337 	isr_fcr &= ~(UART_EXAR654_EFR_RTSDTR | UART_EXAR654_EFR_IXOFF);
338 
339 	writeb(isr_fcr, &ch->ch_cls_uart->isr_fcr);
340 
341 	/* Write old LCR value back out, which turns enhanced access off */
342 	writeb(lcrb, &ch->ch_cls_uart->lcr);
343 
344 	/* Disable interrupts for RTS flow */
345 	ier &= ~(UART_EXAR654_IER_RTSDTR);
346 	writeb(ier, &ch->ch_cls_uart->ier);
347 
348 	/* Set the usual FIFO values */
349 	writeb((UART_FCR_ENABLE_FIFO), &ch->ch_cls_uart->isr_fcr);
350 
351 	writeb((UART_FCR_ENABLE_FIFO | UART_16654_FCR_RXTRIGGER_16 |
352 		UART_16654_FCR_TXTRIGGER_16 | UART_FCR_CLEAR_RCVR),
353 		&ch->ch_cls_uart->isr_fcr);
354 
355 	ch->ch_t_tlevel = 16;
356 	ch->ch_r_tlevel = 16;
357 
358 }
359 
360 
361 /*
362  * cls_clear_break.
363  * Determines whether its time to shut off break condition.
364  *
365  * No locks are assumed to be held when calling this function.
366  * channel lock is held and released in this function.
367  */
cls_clear_break(struct channel_t * ch,int force)368 static inline void cls_clear_break(struct channel_t *ch, int force)
369 {
370 	unsigned long flags;
371 
372 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
373 		return;
374 
375 	spin_lock_irqsave(&ch->ch_lock, flags);
376 
377 	/* Bail if we aren't currently sending a break. */
378 	if (!ch->ch_stop_sending_break) {
379 		spin_unlock_irqrestore(&ch->ch_lock, flags);
380 		return;
381 	}
382 
383 	/* Turn break off, and unset some variables */
384 	if (ch->ch_flags & CH_BREAK_SENDING) {
385 		if (time_after(jiffies, ch->ch_stop_sending_break) || force) {
386 			unsigned char temp = readb(&ch->ch_cls_uart->lcr);
387 
388 			writeb((temp & ~UART_LCR_SBC), &ch->ch_cls_uart->lcr);
389 			ch->ch_flags &= ~(CH_BREAK_SENDING);
390 			ch->ch_stop_sending_break = 0;
391 		}
392 	}
393 	spin_unlock_irqrestore(&ch->ch_lock, flags);
394 }
395 
396 
397 /* Parse the ISR register for the specific port */
cls_parse_isr(struct dgnc_board * brd,uint port)398 static inline void cls_parse_isr(struct dgnc_board *brd, uint port)
399 {
400 	struct channel_t *ch;
401 	unsigned char isr = 0;
402 	unsigned long flags;
403 
404 	/*
405 	 * No need to verify board pointer, it was already
406 	 * verified in the interrupt routine.
407 	 */
408 
409 	if (port > brd->nasync)
410 		return;
411 
412 	ch = brd->channels[port];
413 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
414 		return;
415 
416 	/* Here we try to figure out what caused the interrupt to happen */
417 	while (1) {
418 
419 		isr = readb(&ch->ch_cls_uart->isr_fcr);
420 
421 		/* Bail if no pending interrupt on port */
422 		if (isr & UART_IIR_NO_INT)
423 			break;
424 
425 		/* Receive Interrupt pending */
426 		if (isr & (UART_IIR_RDI | UART_IIR_RDI_TIMEOUT)) {
427 			/* Read data from uart -> queue */
428 			brd->intr_rx++;
429 			ch->ch_intr_rx++;
430 			cls_copy_data_from_uart_to_queue(ch);
431 			dgnc_check_queue_flow_control(ch);
432 		}
433 
434 		/* Transmit Hold register empty pending */
435 		if (isr & UART_IIR_THRI) {
436 			/* Transfer data (if any) from Write Queue -> UART. */
437 			spin_lock_irqsave(&ch->ch_lock, flags);
438 			ch->ch_flags |= (CH_TX_FIFO_EMPTY | CH_TX_FIFO_LWM);
439 			brd->intr_tx++;
440 			ch->ch_intr_tx++;
441 			spin_unlock_irqrestore(&ch->ch_lock, flags);
442 			cls_copy_data_from_queue_to_uart(ch);
443 		}
444 
445 		/* CTS/RTS change of state */
446 		if (isr & UART_IIR_CTSRTS) {
447 			brd->intr_modem++;
448 			ch->ch_intr_modem++;
449 			/*
450 			 * Don't need to do anything, the cls_parse_modem
451 			 * below will grab the updated modem signals.
452 			 */
453 		}
454 
455 		/* Parse any modem signal changes */
456 		cls_parse_modem(ch, readb(&ch->ch_cls_uart->msr));
457 	}
458 }
459 
460 
461 /*
462  * cls_param()
463  * Send any/all changes to the line to the UART.
464  */
cls_param(struct tty_struct * tty)465 static void cls_param(struct tty_struct *tty)
466 {
467 	unsigned char lcr = 0;
468 	unsigned char uart_lcr = 0;
469 	unsigned char ier = 0;
470 	unsigned char uart_ier = 0;
471 	uint baud = 9600;
472 	int quot = 0;
473 	struct dgnc_board *bd;
474 	struct channel_t *ch;
475 	struct un_t   *un;
476 
477 	if (!tty || tty->magic != TTY_MAGIC)
478 		return;
479 
480 	un = (struct un_t *) tty->driver_data;
481 	if (!un || un->magic != DGNC_UNIT_MAGIC)
482 		return;
483 
484 	ch = un->un_ch;
485 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
486 		return;
487 
488 	bd = ch->ch_bd;
489 	if (!bd || bd->magic != DGNC_BOARD_MAGIC)
490 		return;
491 
492 	/*
493 	 * If baud rate is zero, flush queues, and set mval to drop DTR.
494 	 */
495 	if ((ch->ch_c_cflag & (CBAUD)) == 0) {
496 		ch->ch_r_head = 0;
497 		ch->ch_r_tail = 0;
498 		ch->ch_e_head = 0;
499 		ch->ch_e_tail = 0;
500 		ch->ch_w_head = 0;
501 		ch->ch_w_tail = 0;
502 
503 		cls_flush_uart_write(ch);
504 		cls_flush_uart_read(ch);
505 
506 		/* The baudrate is B0 so all modem lines are to be dropped. */
507 		ch->ch_flags |= (CH_BAUD0);
508 		ch->ch_mostat &= ~(UART_MCR_RTS | UART_MCR_DTR);
509 		cls_assert_modem_signals(ch);
510 		ch->ch_old_baud = 0;
511 		return;
512 	} else if (ch->ch_custom_speed) {
513 
514 		baud = ch->ch_custom_speed;
515 		/* Handle transition from B0 */
516 		if (ch->ch_flags & CH_BAUD0) {
517 			ch->ch_flags &= ~(CH_BAUD0);
518 
519 			/*
520 			 * Bring back up RTS and DTR...
521 			 * Also handle RTS or DTR toggle if set.
522 			 */
523 			if (!(ch->ch_digi.digi_flags & DIGI_RTS_TOGGLE))
524 				ch->ch_mostat |= (UART_MCR_RTS);
525 			if (!(ch->ch_digi.digi_flags & DIGI_DTR_TOGGLE))
526 				ch->ch_mostat |= (UART_MCR_DTR);
527 		}
528 
529 	} else {
530 		int iindex = 0;
531 		int jindex = 0;
532 
533 		ulong bauds[4][16] = {
534 			{ /* slowbaud */
535 				0,      50,     75,     110,
536 				134,    150,    200,    300,
537 				600,    1200,   1800,   2400,
538 				4800,   9600,   19200,  38400 },
539 			{ /* slowbaud & CBAUDEX */
540 				0,      57600,  115200, 230400,
541 				460800, 150,    200,    921600,
542 				600,    1200,   1800,   2400,
543 				4800,   9600,   19200,  38400 },
544 			{ /* fastbaud */
545 				0,      57600,   76800, 115200,
546 				131657, 153600, 230400, 460800,
547 				921600, 1200,   1800,   2400,
548 				4800,   9600,   19200,  38400 },
549 			{ /* fastbaud & CBAUDEX */
550 				0,      57600,  115200, 230400,
551 				460800, 150,    200,    921600,
552 				600,    1200,   1800,   2400,
553 				4800,   9600,   19200,  38400 }
554 		};
555 
556 		/*
557 		 * Only use the TXPrint baud rate if the terminal
558 		 * unit is NOT open
559 		 */
560 		if (!(ch->ch_tun.un_flags & UN_ISOPEN) &&
561 					 (un->un_type == DGNC_PRINT))
562 			baud = C_BAUD(ch->ch_pun.un_tty) & 0xff;
563 		else
564 			baud = C_BAUD(ch->ch_tun.un_tty) & 0xff;
565 
566 		if (ch->ch_c_cflag & CBAUDEX)
567 			iindex = 1;
568 
569 		if (ch->ch_digi.digi_flags & DIGI_FAST)
570 			iindex += 2;
571 
572 		jindex = baud;
573 
574 		if ((iindex >= 0) && (iindex < 4) && (jindex >= 0) &&
575 								(jindex < 16)) {
576 			baud = bauds[iindex][jindex];
577 		} else {
578 			baud = 0;
579 		}
580 
581 		if (baud == 0)
582 			baud = 9600;
583 
584 		/* Handle transition from B0 */
585 		if (ch->ch_flags & CH_BAUD0) {
586 			ch->ch_flags &= ~(CH_BAUD0);
587 
588 			/*
589 			 * Bring back up RTS and DTR...
590 			 * Also handle RTS or DTR toggle if set.
591 			 */
592 			if (!(ch->ch_digi.digi_flags & DIGI_RTS_TOGGLE))
593 				ch->ch_mostat |= (UART_MCR_RTS);
594 			if (!(ch->ch_digi.digi_flags & DIGI_DTR_TOGGLE))
595 				ch->ch_mostat |= (UART_MCR_DTR);
596 		}
597 	}
598 
599 	if (ch->ch_c_cflag & PARENB)
600 		lcr |= UART_LCR_PARITY;
601 
602 	if (!(ch->ch_c_cflag & PARODD))
603 		lcr |= UART_LCR_EPAR;
604 
605 	/*
606 	 * Not all platforms support mark/space parity,
607 	 * so this will hide behind an ifdef.
608 	 */
609 #ifdef CMSPAR
610 	if (ch->ch_c_cflag & CMSPAR)
611 		lcr |= UART_LCR_SPAR;
612 #endif
613 
614 	if (ch->ch_c_cflag & CSTOPB)
615 		lcr |= UART_LCR_STOP;
616 
617 	switch (ch->ch_c_cflag & CSIZE) {
618 	case CS5:
619 		lcr |= UART_LCR_WLEN5;
620 		break;
621 	case CS6:
622 		lcr |= UART_LCR_WLEN6;
623 		break;
624 	case CS7:
625 		lcr |= UART_LCR_WLEN7;
626 		break;
627 	case CS8:
628 	default:
629 		lcr |= UART_LCR_WLEN8;
630 		break;
631 	}
632 
633 	uart_ier = readb(&ch->ch_cls_uart->ier);
634 	ier =  uart_ier;
635 	uart_lcr = readb(&ch->ch_cls_uart->lcr);
636 
637 	if (baud == 0)
638 		baud = 9600;
639 
640 	quot = ch->ch_bd->bd_dividend / baud;
641 
642 	if (quot != 0 && ch->ch_old_baud != baud) {
643 		ch->ch_old_baud = baud;
644 		writeb(UART_LCR_DLAB, &ch->ch_cls_uart->lcr);
645 		writeb((quot & 0xff), &ch->ch_cls_uart->txrx);
646 		writeb((quot >> 8), &ch->ch_cls_uart->ier);
647 		writeb(lcr, &ch->ch_cls_uart->lcr);
648 	}
649 
650 	if (uart_lcr != lcr)
651 		writeb(lcr, &ch->ch_cls_uart->lcr);
652 
653 	if (ch->ch_c_cflag & CREAD)
654 		ier |= (UART_IER_RDI | UART_IER_RLSI);
655 	else
656 		ier &= ~(UART_IER_RDI | UART_IER_RLSI);
657 
658 	/*
659 	 * Have the UART interrupt on modem signal changes ONLY when
660 	 * we are in hardware flow control mode, or CLOCAL/FORCEDCD is not set.
661 	 */
662 	if ((ch->ch_digi.digi_flags & CTSPACE) ||
663 		(ch->ch_digi.digi_flags & RTSPACE) ||
664 		(ch->ch_c_cflag & CRTSCTS) ||
665 		!(ch->ch_digi.digi_flags & DIGI_FORCEDCD) ||
666 		!(ch->ch_c_cflag & CLOCAL))
667 			ier |= UART_IER_MSI;
668 	else
669 			ier &= ~UART_IER_MSI;
670 
671 	ier |= UART_IER_THRI;
672 
673 	if (ier != uart_ier)
674 		writeb(ier, &ch->ch_cls_uart->ier);
675 
676 	if (ch->ch_digi.digi_flags & CTSPACE || ch->ch_c_cflag & CRTSCTS) {
677 		cls_set_cts_flow_control(ch);
678 	} else if (ch->ch_c_iflag & IXON) {
679 		/*
680 		 * If start/stop is set to disable, then we should
681 		 * disable flow control
682 		 */
683 		if ((ch->ch_startc == _POSIX_VDISABLE) ||
684 					 (ch->ch_stopc == _POSIX_VDISABLE))
685 			cls_set_no_output_flow_control(ch);
686 		else
687 			cls_set_ixon_flow_control(ch);
688 	} else {
689 		cls_set_no_output_flow_control(ch);
690 	}
691 
692 	if (ch->ch_digi.digi_flags & RTSPACE || ch->ch_c_cflag & CRTSCTS) {
693 		cls_set_rts_flow_control(ch);
694 	} else if (ch->ch_c_iflag & IXOFF) {
695 		/*
696 		 * If start/stop is set to disable, then we should disable
697 		 * flow control
698 		 */
699 		if ((ch->ch_startc == _POSIX_VDISABLE) ||
700 				(ch->ch_stopc == _POSIX_VDISABLE))
701 			cls_set_no_input_flow_control(ch);
702 		else
703 			cls_set_ixoff_flow_control(ch);
704 	} else {
705 		cls_set_no_input_flow_control(ch);
706 	}
707 
708 	cls_assert_modem_signals(ch);
709 
710 	/* Get current status of the modem signals now */
711 	cls_parse_modem(ch, readb(&ch->ch_cls_uart->msr));
712 }
713 
714 
715 /*
716  * Our board poller function.
717  */
cls_tasklet(unsigned long data)718 static void cls_tasklet(unsigned long data)
719 {
720 	struct dgnc_board *bd = (struct dgnc_board *) data;
721 	struct channel_t *ch;
722 	unsigned long flags;
723 	int i;
724 	int state = 0;
725 	int ports = 0;
726 
727 	if (!bd || bd->magic != DGNC_BOARD_MAGIC) {
728 		APR(("poll_tasklet() - NULL or bad bd.\n"));
729 		return;
730 	}
731 
732 	/* Cache a couple board values */
733 	spin_lock_irqsave(&bd->bd_lock, flags);
734 	state = bd->state;
735 	ports = bd->nasync;
736 	spin_unlock_irqrestore(&bd->bd_lock, flags);
737 
738 	/*
739 	 * Do NOT allow the interrupt routine to read the intr registers
740 	 * Until we release this lock.
741 	 */
742 	spin_lock_irqsave(&bd->bd_intr_lock, flags);
743 
744 	/*
745 	 * If board is ready, parse deeper to see if there is anything to do.
746 	 */
747 	if ((state == BOARD_READY) && (ports > 0)) {
748 
749 		/* Loop on each port */
750 		for (i = 0; i < ports; i++) {
751 			ch = bd->channels[i];
752 			if (!ch)
753 				continue;
754 
755 			/*
756 			 * NOTE: Remember you CANNOT hold any channel
757 			 * locks when calling input.
758 			 * During input processing, its possible we
759 			 * will call ld, which might do callbacks back
760 			 * into us.
761 			 */
762 			dgnc_input(ch);
763 
764 			/*
765 			 * Channel lock is grabbed and then released
766 			 * inside this routine.
767 			 */
768 			cls_copy_data_from_queue_to_uart(ch);
769 			dgnc_wakeup_writes(ch);
770 
771 			/*
772 			 * Check carrier function.
773 			 */
774 			dgnc_carrier(ch);
775 
776 			/*
777 			 * The timing check of turning off the break is done
778 			 * inside clear_break()
779 			 */
780 			if (ch->ch_stop_sending_break)
781 				cls_clear_break(ch, 0);
782 		}
783 	}
784 
785 	spin_unlock_irqrestore(&bd->bd_intr_lock, flags);
786 
787 }
788 
789 
790 /*
791  * cls_intr()
792  *
793  * Classic specific interrupt handler.
794  */
cls_intr(int irq,void * voidbrd)795 static irqreturn_t cls_intr(int irq, void *voidbrd)
796 {
797 	struct dgnc_board *brd = (struct dgnc_board *) voidbrd;
798 	uint i = 0;
799 	unsigned char poll_reg;
800 	unsigned long flags;
801 
802 	if (!brd) {
803 		APR(("Received interrupt (%d) with null board associated\n",
804 									 irq));
805 		return IRQ_NONE;
806 	}
807 
808 	/*
809 	 * Check to make sure its for us.
810 	 */
811 	if (brd->magic != DGNC_BOARD_MAGIC) {
812 		APR(("Received interrupt (%d) with a board pointer that wasn't ours!\n",
813 			  irq));
814 		return IRQ_NONE;
815 	}
816 
817 	spin_lock_irqsave(&brd->bd_intr_lock, flags);
818 
819 	brd->intr_count++;
820 
821 	/*
822 	 * Check the board's global interrupt offset to see if we
823 	 * we actually do have an interrupt pending for us.
824 	 */
825 	poll_reg = readb(brd->re_map_membase + UART_CLASSIC_POLL_ADDR_OFFSET);
826 
827 	/* If 0, no interrupts pending */
828 	if (!poll_reg) {
829 		spin_unlock_irqrestore(&brd->bd_intr_lock, flags);
830 		return IRQ_NONE;
831 	}
832 
833 	/* Parse each port to find out what caused the interrupt */
834 	for (i = 0; i < brd->nasync; i++)
835 		cls_parse_isr(brd, i);
836 
837 	/*
838 	 * Schedule tasklet to more in-depth servicing at a better time.
839 	 */
840 	tasklet_schedule(&brd->helper_tasklet);
841 
842 	spin_unlock_irqrestore(&brd->bd_intr_lock, flags);
843 
844 	return IRQ_HANDLED;
845 }
846 
847 
cls_disable_receiver(struct channel_t * ch)848 static void cls_disable_receiver(struct channel_t *ch)
849 {
850 	unsigned char tmp = readb(&ch->ch_cls_uart->ier);
851 
852 	tmp &= ~(UART_IER_RDI);
853 	writeb(tmp, &ch->ch_cls_uart->ier);
854 }
855 
856 
cls_enable_receiver(struct channel_t * ch)857 static void cls_enable_receiver(struct channel_t *ch)
858 {
859 	unsigned char tmp = readb(&ch->ch_cls_uart->ier);
860 
861 	tmp |= (UART_IER_RDI);
862 	writeb(tmp, &ch->ch_cls_uart->ier);
863 }
864 
865 
cls_copy_data_from_uart_to_queue(struct channel_t * ch)866 static void cls_copy_data_from_uart_to_queue(struct channel_t *ch)
867 {
868 	int qleft = 0;
869 	unsigned char linestatus = 0;
870 	unsigned char error_mask = 0;
871 	ushort head;
872 	ushort tail;
873 	unsigned long flags;
874 
875 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
876 		return;
877 
878 	spin_lock_irqsave(&ch->ch_lock, flags);
879 
880 	/* cache head and tail of queue */
881 	head = ch->ch_r_head;
882 	tail = ch->ch_r_tail;
883 
884 	/* Store how much space we have left in the queue */
885 	qleft = (tail - head - 1);
886 	if (qleft < 0)
887 		qleft += RQUEUEMASK + 1;
888 
889 	/*
890 	 * Create a mask to determine whether we should
891 	 * insert the character (if any) into our queue.
892 	 */
893 	if (ch->ch_c_iflag & IGNBRK)
894 		error_mask |= UART_LSR_BI;
895 
896 	while (1) {
897 		linestatus = readb(&ch->ch_cls_uart->lsr);
898 
899 		if (!(linestatus & (UART_LSR_DR)))
900 			break;
901 
902 		/*
903 		 * Discard character if we are ignoring the error mask.
904 		*/
905 		if (linestatus & error_mask)  {
906 			unsigned char discard;
907 
908 			linestatus = 0;
909 			discard = readb(&ch->ch_cls_uart->txrx);
910 			continue;
911 		}
912 
913 		/*
914 		 * If our queue is full, we have no choice but to drop some
915 		 * data. The assumption is that HWFLOW or SWFLOW should have
916 		 * stopped things way way before we got to this point.
917 		 *
918 		 * I decided that I wanted to ditch the oldest data first,
919 		 * I hope thats okay with everyone? Yes? Good.
920 		 */
921 		while (qleft < 1) {
922 			tail = (tail + 1) & RQUEUEMASK;
923 			ch->ch_r_tail = tail;
924 			ch->ch_err_overrun++;
925 			qleft++;
926 		}
927 
928 		ch->ch_equeue[head] = linestatus & (UART_LSR_BI | UART_LSR_PE
929 								 | UART_LSR_FE);
930 		ch->ch_rqueue[head] = readb(&ch->ch_cls_uart->txrx);
931 		dgnc_sniff_nowait_nolock(ch, "UART READ",
932 						 ch->ch_rqueue + head, 1);
933 
934 		qleft--;
935 
936 		if (ch->ch_equeue[head] & UART_LSR_PE)
937 			ch->ch_err_parity++;
938 		if (ch->ch_equeue[head] & UART_LSR_BI)
939 			ch->ch_err_break++;
940 		if (ch->ch_equeue[head] & UART_LSR_FE)
941 			ch->ch_err_frame++;
942 
943 		/* Add to, and flip head if needed */
944 		head = (head + 1) & RQUEUEMASK;
945 		ch->ch_rxcount++;
946 	}
947 
948 	/*
949 	 * Write new final heads to channel structure.
950 	 */
951 	ch->ch_r_head = head & RQUEUEMASK;
952 	ch->ch_e_head = head & EQUEUEMASK;
953 
954 	spin_unlock_irqrestore(&ch->ch_lock, flags);
955 }
956 
957 
958 /*
959  * This function basically goes to sleep for secs, or until
960  * it gets signalled that the port has fully drained.
961  */
cls_drain(struct tty_struct * tty,uint seconds)962 static int cls_drain(struct tty_struct *tty, uint seconds)
963 {
964 	unsigned long flags;
965 	struct channel_t *ch;
966 	struct un_t *un;
967 	int rc = 0;
968 
969 	if (!tty || tty->magic != TTY_MAGIC)
970 		return -ENXIO;
971 
972 	un = (struct un_t *) tty->driver_data;
973 	if (!un || un->magic != DGNC_UNIT_MAGIC)
974 		return -ENXIO;
975 
976 	ch = un->un_ch;
977 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
978 		return -ENXIO;
979 
980 	spin_lock_irqsave(&ch->ch_lock, flags);
981 	un->un_flags |= UN_EMPTY;
982 	spin_unlock_irqrestore(&ch->ch_lock, flags);
983 
984 	/*
985 	 * NOTE: Do something with time passed in.
986 	 */
987 	rc = wait_event_interruptible(un->un_flags_wait,
988 					 ((un->un_flags & UN_EMPTY) == 0));
989 
990 	/* If ret is non-zero, user ctrl-c'ed us */
991 
992 	return rc;
993 }
994 
995 
996 /* Channel lock MUST be held before calling this function! */
cls_flush_uart_write(struct channel_t * ch)997 static void cls_flush_uart_write(struct channel_t *ch)
998 {
999 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1000 		return;
1001 
1002 	writeb((UART_FCR_ENABLE_FIFO | UART_FCR_CLEAR_XMIT),
1003 						&ch->ch_cls_uart->isr_fcr);
1004 	udelay(10);
1005 
1006 	ch->ch_flags |= (CH_TX_FIFO_EMPTY | CH_TX_FIFO_LWM);
1007 }
1008 
1009 
1010 /* Channel lock MUST be held before calling this function! */
cls_flush_uart_read(struct channel_t * ch)1011 static void cls_flush_uart_read(struct channel_t *ch)
1012 {
1013 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1014 		return;
1015 
1016 	/*
1017 	 * For complete POSIX compatibility, we should be purging the
1018 	 * read FIFO in the UART here.
1019 	 *
1020 	 * However, clearing the read FIFO (UART_FCR_CLEAR_RCVR) also
1021 	 * incorrectly flushes write data as well as just basically trashing the
1022 	 * FIFO.
1023 	 *
1024 	 * Presumably, this is a bug in this UART.
1025 	 */
1026 
1027 	udelay(10);
1028 }
1029 
1030 
cls_copy_data_from_queue_to_uart(struct channel_t * ch)1031 static void cls_copy_data_from_queue_to_uart(struct channel_t *ch)
1032 {
1033 	ushort head;
1034 	ushort tail;
1035 	int n;
1036 	int qlen;
1037 	uint len_written = 0;
1038 	unsigned long flags;
1039 
1040 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1041 		return;
1042 
1043 	spin_lock_irqsave(&ch->ch_lock, flags);
1044 
1045 	/* No data to write to the UART */
1046 	if (ch->ch_w_tail == ch->ch_w_head) {
1047 		spin_unlock_irqrestore(&ch->ch_lock, flags);
1048 		return;
1049 	}
1050 
1051 	/* If port is "stopped", don't send any data to the UART */
1052 	if ((ch->ch_flags & CH_FORCED_STOP) ||
1053 				 (ch->ch_flags & CH_BREAK_SENDING)) {
1054 		spin_unlock_irqrestore(&ch->ch_lock, flags);
1055 		return;
1056 	}
1057 
1058 	if (!(ch->ch_flags & (CH_TX_FIFO_EMPTY | CH_TX_FIFO_LWM))) {
1059 		spin_unlock_irqrestore(&ch->ch_lock, flags);
1060 		return;
1061 	}
1062 
1063 	n = 32;
1064 
1065 	/* cache head and tail of queue */
1066 	head = ch->ch_w_head & WQUEUEMASK;
1067 	tail = ch->ch_w_tail & WQUEUEMASK;
1068 	qlen = (head - tail) & WQUEUEMASK;
1069 
1070 	/* Find minimum of the FIFO space, versus queue length */
1071 	n = min(n, qlen);
1072 
1073 	while (n > 0) {
1074 
1075 		/*
1076 		 * If RTS Toggle mode is on, turn on RTS now if not already set,
1077 		 * and make sure we get an event when the data transfer has
1078 		 * completed.
1079 		 */
1080 		if (ch->ch_digi.digi_flags & DIGI_RTS_TOGGLE) {
1081 			if (!(ch->ch_mostat & UART_MCR_RTS)) {
1082 				ch->ch_mostat |= (UART_MCR_RTS);
1083 				cls_assert_modem_signals(ch);
1084 			}
1085 			ch->ch_tun.un_flags |= (UN_EMPTY);
1086 		}
1087 
1088 		/*
1089 		 * If DTR Toggle mode is on, turn on DTR now if not already set,
1090 		 * and make sure we get an event when the data transfer has
1091 		 * completed.
1092 		 */
1093 		if (ch->ch_digi.digi_flags & DIGI_DTR_TOGGLE) {
1094 			if (!(ch->ch_mostat & UART_MCR_DTR)) {
1095 				ch->ch_mostat |= (UART_MCR_DTR);
1096 				cls_assert_modem_signals(ch);
1097 			}
1098 			ch->ch_tun.un_flags |= (UN_EMPTY);
1099 		}
1100 		writeb(ch->ch_wqueue[ch->ch_w_tail], &ch->ch_cls_uart->txrx);
1101 		dgnc_sniff_nowait_nolock(ch, "UART WRITE",
1102 					    ch->ch_wqueue + ch->ch_w_tail, 1);
1103 		ch->ch_w_tail++;
1104 		ch->ch_w_tail &= WQUEUEMASK;
1105 		ch->ch_txcount++;
1106 		len_written++;
1107 		n--;
1108 	}
1109 
1110 	if (len_written > 0)
1111 		ch->ch_flags &= ~(CH_TX_FIFO_EMPTY | CH_TX_FIFO_LWM);
1112 
1113 	spin_unlock_irqrestore(&ch->ch_lock, flags);
1114 }
1115 
1116 
cls_parse_modem(struct channel_t * ch,unsigned char signals)1117 static void cls_parse_modem(struct channel_t *ch, unsigned char signals)
1118 {
1119 	unsigned char msignals = signals;
1120 	unsigned long flags;
1121 
1122 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1123 		return;
1124 
1125 	/*
1126 	 * Do altpin switching. Altpin switches DCD and DSR.
1127 	 * This prolly breaks DSRPACE, so we should be more clever here.
1128 	 */
1129 	spin_lock_irqsave(&ch->ch_lock, flags);
1130 	if (ch->ch_digi.digi_flags & DIGI_ALTPIN) {
1131 		unsigned char mswap = signals;
1132 
1133 		if (mswap & UART_MSR_DDCD) {
1134 			msignals &= ~UART_MSR_DDCD;
1135 			msignals |= UART_MSR_DDSR;
1136 		}
1137 		if (mswap & UART_MSR_DDSR) {
1138 			msignals &= ~UART_MSR_DDSR;
1139 			msignals |= UART_MSR_DDCD;
1140 		}
1141 		if (mswap & UART_MSR_DCD) {
1142 			msignals &= ~UART_MSR_DCD;
1143 			msignals |= UART_MSR_DSR;
1144 		}
1145 		if (mswap & UART_MSR_DSR) {
1146 			msignals &= ~UART_MSR_DSR;
1147 			msignals |= UART_MSR_DCD;
1148 		}
1149 	}
1150 	spin_unlock_irqrestore(&ch->ch_lock, flags);
1151 
1152 	/*
1153 	 * Scrub off lower bits. They signify delta's, which I don't
1154 	 * care about
1155 	 */
1156 	signals &= 0xf0;
1157 
1158 	spin_lock_irqsave(&ch->ch_lock, flags);
1159 	if (msignals & UART_MSR_DCD)
1160 		ch->ch_mistat |= UART_MSR_DCD;
1161 	else
1162 		ch->ch_mistat &= ~UART_MSR_DCD;
1163 
1164 	if (msignals & UART_MSR_DSR)
1165 		ch->ch_mistat |= UART_MSR_DSR;
1166 	else
1167 		ch->ch_mistat &= ~UART_MSR_DSR;
1168 
1169 	if (msignals & UART_MSR_RI)
1170 		ch->ch_mistat |= UART_MSR_RI;
1171 	else
1172 		ch->ch_mistat &= ~UART_MSR_RI;
1173 
1174 	if (msignals & UART_MSR_CTS)
1175 		ch->ch_mistat |= UART_MSR_CTS;
1176 	else
1177 		ch->ch_mistat &= ~UART_MSR_CTS;
1178 	spin_unlock_irqrestore(&ch->ch_lock, flags);
1179 }
1180 
1181 
1182 /* Make the UART raise any of the output signals we want up */
cls_assert_modem_signals(struct channel_t * ch)1183 static void cls_assert_modem_signals(struct channel_t *ch)
1184 {
1185 	unsigned char out;
1186 
1187 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1188 		return;
1189 
1190 	out = ch->ch_mostat;
1191 
1192 	if (ch->ch_flags & CH_LOOPBACK)
1193 		out |= UART_MCR_LOOP;
1194 
1195 	writeb(out, &ch->ch_cls_uart->mcr);
1196 
1197 	/* Give time for the UART to actually drop the signals */
1198 	udelay(10);
1199 }
1200 
1201 
cls_send_start_character(struct channel_t * ch)1202 static void cls_send_start_character(struct channel_t *ch)
1203 {
1204 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1205 		return;
1206 
1207 	if (ch->ch_startc != _POSIX_VDISABLE) {
1208 		ch->ch_xon_sends++;
1209 		writeb(ch->ch_startc, &ch->ch_cls_uart->txrx);
1210 	}
1211 }
1212 
1213 
cls_send_stop_character(struct channel_t * ch)1214 static void cls_send_stop_character(struct channel_t *ch)
1215 {
1216 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1217 		return;
1218 
1219 	if (ch->ch_stopc != _POSIX_VDISABLE) {
1220 		ch->ch_xoff_sends++;
1221 		writeb(ch->ch_stopc, &ch->ch_cls_uart->txrx);
1222 	}
1223 }
1224 
1225 
1226 /* Inits UART */
cls_uart_init(struct channel_t * ch)1227 static void cls_uart_init(struct channel_t *ch)
1228 {
1229 	unsigned char lcrb = readb(&ch->ch_cls_uart->lcr);
1230 	unsigned char isr_fcr = 0;
1231 
1232 	writeb(0, &ch->ch_cls_uart->ier);
1233 
1234 	/*
1235 	 * The Enhanced Register Set may only be accessed when
1236 	 * the Line Control Register is set to 0xBFh.
1237 	 */
1238 	writeb(UART_EXAR654_ENHANCED_REGISTER_SET, &ch->ch_cls_uart->lcr);
1239 
1240 	isr_fcr = readb(&ch->ch_cls_uart->isr_fcr);
1241 
1242 	/* Turn on Enhanced/Extended controls */
1243 	isr_fcr |= (UART_EXAR654_EFR_ECB);
1244 
1245 	writeb(isr_fcr, &ch->ch_cls_uart->isr_fcr);
1246 
1247 	/* Write old LCR value back out, which turns enhanced access off */
1248 	writeb(lcrb, &ch->ch_cls_uart->lcr);
1249 
1250 	/* Clear out UART and FIFO */
1251 	readb(&ch->ch_cls_uart->txrx);
1252 
1253 	writeb((UART_FCR_ENABLE_FIFO|UART_FCR_CLEAR_RCVR|UART_FCR_CLEAR_XMIT),
1254 						 &ch->ch_cls_uart->isr_fcr);
1255 	udelay(10);
1256 
1257 	ch->ch_flags |= (CH_FIFO_ENABLED | CH_TX_FIFO_EMPTY | CH_TX_FIFO_LWM);
1258 
1259 	readb(&ch->ch_cls_uart->lsr);
1260 	readb(&ch->ch_cls_uart->msr);
1261 }
1262 
1263 
1264 /*
1265  * Turns off UART.
1266  */
cls_uart_off(struct channel_t * ch)1267 static void cls_uart_off(struct channel_t *ch)
1268 {
1269 	writeb(0, &ch->ch_cls_uart->ier);
1270 }
1271 
1272 
1273 /*
1274  * cls_get_uarts_bytes_left.
1275  * Returns 0 is nothing left in the FIFO, returns 1 otherwise.
1276  *
1277  * The channel lock MUST be held by the calling function.
1278  */
cls_get_uart_bytes_left(struct channel_t * ch)1279 static uint cls_get_uart_bytes_left(struct channel_t *ch)
1280 {
1281 	unsigned char left = 0;
1282 	unsigned char lsr = 0;
1283 
1284 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1285 		return 0;
1286 
1287 	lsr = readb(&ch->ch_cls_uart->lsr);
1288 
1289 	/* Determine whether the Transmitter is empty or not */
1290 	if (!(lsr & UART_LSR_TEMT)) {
1291 		if (ch->ch_flags & CH_TX_FIFO_EMPTY)
1292 			tasklet_schedule(&ch->ch_bd->helper_tasklet);
1293 		left = 1;
1294 	} else {
1295 		ch->ch_flags |= (CH_TX_FIFO_EMPTY | CH_TX_FIFO_LWM);
1296 		left = 0;
1297 	}
1298 
1299 	return left;
1300 }
1301 
1302 
1303 /*
1304  * cls_send_break.
1305  * Starts sending a break thru the UART.
1306  *
1307  * The channel lock MUST be held by the calling function.
1308  */
cls_send_break(struct channel_t * ch,int msecs)1309 static void cls_send_break(struct channel_t *ch, int msecs)
1310 {
1311 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1312 		return;
1313 
1314 	/*
1315 	 * If we receive a time of 0, this means turn off the break.
1316 	 */
1317 	if (msecs == 0) {
1318 		/* Turn break off, and unset some variables */
1319 		if (ch->ch_flags & CH_BREAK_SENDING) {
1320 			unsigned char temp = readb(&ch->ch_cls_uart->lcr);
1321 
1322 			writeb((temp & ~UART_LCR_SBC), &ch->ch_cls_uart->lcr);
1323 			ch->ch_flags &= ~(CH_BREAK_SENDING);
1324 			ch->ch_stop_sending_break = 0;
1325 		}
1326 		return;
1327 	}
1328 
1329 	/*
1330 	 * Set the time we should stop sending the break.
1331 	 * If we are already sending a break, toss away the existing
1332 	 * time to stop, and use this new value instead.
1333 	 */
1334 	ch->ch_stop_sending_break = jiffies + dgnc_jiffies_from_ms(msecs);
1335 
1336 	/* Tell the UART to start sending the break */
1337 	if (!(ch->ch_flags & CH_BREAK_SENDING)) {
1338 		unsigned char temp = readb(&ch->ch_cls_uart->lcr);
1339 
1340 		writeb((temp | UART_LCR_SBC), &ch->ch_cls_uart->lcr);
1341 		ch->ch_flags |= (CH_BREAK_SENDING);
1342 	}
1343 }
1344 
1345 
1346 /*
1347  * cls_send_immediate_char.
1348  * Sends a specific character as soon as possible to the UART,
1349  * jumping over any bytes that might be in the write queue.
1350  *
1351  * The channel lock MUST be held by the calling function.
1352  */
cls_send_immediate_char(struct channel_t * ch,unsigned char c)1353 static void cls_send_immediate_char(struct channel_t *ch, unsigned char c)
1354 {
1355 	if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
1356 		return;
1357 
1358 	writeb(c, &ch->ch_cls_uart->txrx);
1359 }
1360 
cls_vpd(struct dgnc_board * brd)1361 static void cls_vpd(struct dgnc_board *brd)
1362 {
1363 	ulong           vpdbase;        /* Start of io base of the card */
1364 	u8 __iomem           *re_map_vpdbase;/* Remapped memory of the card */
1365 	int i = 0;
1366 
1367 
1368 	vpdbase = pci_resource_start(brd->pdev, 3);
1369 
1370 	/* No VPD */
1371 	if (!vpdbase)
1372 		return;
1373 
1374 	re_map_vpdbase = ioremap(vpdbase, 0x400);
1375 
1376 	if (!re_map_vpdbase)
1377 		return;
1378 
1379 	/* Store the VPD into our buffer */
1380 	for (i = 0; i < 0x40; i++) {
1381 		brd->vpd[i] = readb(re_map_vpdbase + i);
1382 		pr_info("%x ", brd->vpd[i]);
1383 	}
1384 	pr_info("\n");
1385 
1386 	if (re_map_vpdbase)
1387 		iounmap(re_map_vpdbase);
1388 }
1389 
1390