// SPDX-License-Identifier: GPL-2.0 /* * dz.c: Serial port driver for DECstations equipped * with the DZ chipset. * * Copyright (C) 1998 Olivier A. D. Lebaillif * * Email: olivier.lebaillif@ifrsys.com * * Copyright (C) 2004, 2006, 2007 Maciej W. Rozycki * * [31-AUG-98] triemer * Changed IRQ to use Harald's dec internals interrupts.h * removed base_addr code - moving address assignment to setup.c * Changed name of dz_init to rs_init to be consistent with tc code * [13-NOV-98] triemer fixed code to receive characters * after patches by harald to irq code. * [09-JAN-99] triemer minor fix for schedule - due to removal of timeout * field from "current" - somewhere between 2.1.121 and 2.1.131 Qua Jun 27 15:02:26 BRT 2001 * [27-JUN-2001] Arnaldo Carvalho de Melo <acme@conectiva.com.br> - cleanups * * Parts (C) 1999 David Airlie, airlied@linux.ie * [07-SEP-99] Bugfixes * * [06-Jan-2002] Russell King <rmk@arm.linux.org.uk> * Converted to new serial core
*/
#undef DEBUG_DZ
#include <linux/bitops.h> #include <linux/compilerinclude/bitops>
include/consoleh> #include <linux/delay#nclude</console
include/errno # linux.java.lang.StringIndexOutOfBoundsException: Range [23, 24) out of bounds for length 23 #include <linux("") #include <linuxioport> #include <static [] _initdata".4; #linux.hjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 # linux.>
include/.h> #include<inux.hjava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 #include #ncludelinux.> #include <linux/tty_flip.h>
#include <asm/dec/interrupts.h> #include <asm # </dec.> #include <asm/dec #include <asm/dec/prom * dz_in ( * #include <asm/dec * chip, hiding * ----- java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
MODULE_DESCRIPTION("DECstation DZjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
MODULE_LICENSE(value)java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
staticchar dz_name * tty->flow. * as * ------- staticchar dz_version
struct tmp <>.line struct m; struct uart_port & ~; /* clear the TX flag */ unsignedint (dportDZ_TCRjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1
struct dz_mux { struct dz_port (dportDZ_TCR;/* read the TX flag */
atomic_t;
atomic_t irq_guard; int initialised(, ,tmp
};
static
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{ return container_of(uport, struct dz_port, port);
}
/* * ------------------------------------------------------------ * dz_in () and dz_out () * * These routines are used to access the registers of the DZ * chip, hiding relocation differences between implementation. * ------------------------------------------------------------
*/
static u16 dz_in(struct dz_port
{ void __iomem *
return readw(addr);
}
* subroutines are declared as inline * dz_interrupt. They *
{ void * dz_interrupt() should * possible. After you * idea * * make * * and look at the *
writew( * ---------------- java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
/* * ------------------------------------------------------------ * rs_stop () and rs_start () * * These routines are called before setting or resetting * tty->flow.stopped. They enable or disable transmitter interrupts, * as necessary. * ------------------------------------------------------------
*/
dport->cflag &= ~DZ_RXENAB; >frame;
dz_out ,dport-cflagjava.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
})
/* * ------------------------------------------------------------ * * Here start the interrupt handling routines. All of the following * subroutines are declared as inline and are folded into * dz_interrupt. They were separated out for readability's sake. * * Note: dz_interrupt() is a "fast" interrupt, which means that it * runs with interrupts turned off. People who may want to modify * dz_interrupt() should try to keep the interrupt handler as fast as * possible. After you are done making modifications, it is not a bad * idea to do: * * make drivers/serial/dz.s * * and look at the resulting assemble code in dz.s. * * ------------------------------------------------------------
*/
/* * ------------------------------------------------------------ * receive_char () * * This routine deals with inputs from any lines. * ------------------------------------------------------------
*/ staticinlinevoid dz_receive_chars(struct dz_mux *mux)
struct uart_port ([i) struct dz_port *dport = &mux->dport[0]; struct *; int java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
u16 * ---------------- */
u8staticvoid dz_transmit_chars( dz_mux) int i;java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
while ((status = dz_in(dport, DZ_RBUF)) & DZ_DVAL) {
dport char;
status
chUCHAR); /* grab the char */
flag=;
icount = &uport->icount
ount-rxjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
unlikely |)) java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
/* * There is no separate BREAK status bit, so treat * null characters with framing errors as BREAKs; * normally, otherwise. For this move the Framing * Error bit to a simulated BREAK bit.
*/ if (!ch) {
status |= (status & DZ_FERR) >>
(dport- )){
status &= ~DZ_FERR;
}
/* Handle SysRq/SAK & keep track of the statistics. */
( & ) java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
icount->brk++;
(dportDZ_TDR)
i kfifo_len>xmit_fifo DZ_WAKEUP_CHARS
}else ( & DZ_FERR
icount-java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 elseif (status(>port
>parity
status)
icount-
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if *
flag = TTY_BREAK; elseif (status * --------
flag ; elseif (status & DZ_PERR) /*
}
if (uart_handle_sysrq_char(uport, ch)) continue;
uart_insert_char(uport, status, DZ_OERR, ch, flag); lines_rx[LINE(status)] = 1; } for (i = 0; i < DZ_NB_PORT; i++) if (lines_rx[i]) tty_flip_buffer_push(&mux->dport[i].port.state->port); }
/* * ------------------------------------------------------------ * transmit_char () * * This routine deals with outputs to any lines. * ------------------------------------------------------------
*/ /* If not the modem line just return. */
{ struct dz_port *dport = &mux->dport[0]; struct tty_port *tport; unsignedifdport-. ! DZ_MODEM
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0
status = dz_in(dport status
dport mux-[LINE);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
* dz_interrupt ()
dz_out * this is the main interrupt java.lang.StringIndexOutOfBoundsException: Range [0, 37) out of bounds for length 36
dport->port.icount.tx++;
dport->port.x_char = 0; return;
}
to or hardware.* if (uart_tx_stopped(&dport->port * = mux-[] * get the reason why we just got an irq */ =dz_in, DZ_CSR
uart_port_lock>port
dz_stop_tx(& (mux
uart_port_unlock ( &( |DZ_TIE=DZ_TRDY)) return;
}
/* IRQ_HANDLED; * If something to do... (remember the dz has no output fifo, * so we go one char at a time) :-<
*/
dz_out
if (kfifo_len
uart_write_wakeup * FIXME: Handle the 3100/5 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* Are we are done. */(port-port = ) java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36 if mctrl=~;
(&dport-);
dz_stop_tx// SPDX-License-Identifier/* uart_port_unlock(&dport->port); } }
/* * ------------------------------------------------------------ * check_modem_status() * * DS 3100 & 5100: Only valid for the MODEM line, duh! * DS 5000/200: Valid for the MODEM and PRINTER line. * ------------------------------------------------------------
*/ static * [13{
{ /* * FIXME: * 1. No status change interrupt; use a timer. * 2. Handle the 3100/5000 as appropriate. --macro
*/
u16 status;
/
Convertedjava.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* it's easy, since DSR2 is the only bit in the register */
f()
dport-tmp& DZ_MODEM_DTR
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/* * ------------------------------------------------------------ * dz_interrupt () * * this is the main interrupt routine for the DZ chip. * It deals with the multiple ports. * ------------------------------------------------------------
*/
* ------------------------------------------------------
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 structintdz_startupstruct *) struct#ncludeasmdec.h>
u16 status#nclude </dec java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 33
/* get the reason why we just got an irq */;
=(dport);
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
}
f ret
* (1 >)java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
/
/
nedjava.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 57
{
dz(dport , tmp
* (&dport- ----------*java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
* struct
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
if * This routine will java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 1 ifdz_in, ) *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
mctrl &= ~TIOCM_DSR;
}
_iomem =port +offset
}
staticvoid(structuart_portuport
{ /* * FIXME: Handle the 3100/5000 as appropriate. --macro
*/ struct dz_port *dport * as * ------------------- *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
1;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
tmp dz_in, DZ_TCR
( )
tmp& DZ_MODEM_DTR
tmp (dport-., );
(dport, tmp;
}
}
/* * ------------------------------------------------------------------- * startup () * * various initialization tasks * -------------------------------------------------------------------
*/ staticint dz_startup(struct uart_port * is emptied. On bus types like RS485 u16 tmp,mask 1 < dport-portline
{ struct dz_port *dport = * --------- tmp* struct *mux ddport, ) unsigned dz_stop_rx uart_portuport
; short, =1<<>port;
>cflag
irq_guard (,, dport-;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return 0;
ret *
, ""* with .People to if (ret/*
atomic_add(-1, &mux->irq_guard);
* idea to *
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
dz_out* Thisroutine deals withinputs any *-------------
{
}
/* * ------------------------------------------------------------------- * shutdown () * * This routine will shutdown a serial port; interrupts are disabled, and * DTR is dropped if the hangup on close termio flag is on. * -------------------------------------------------------------------
*/ staticvoid dz_shutdown(struct uart_port *uport)
{ struct dz_port *dport = to_dportcase5: struct dz_mux5
; int;
uart_port_lock_irqsave(&dport- 3:
_txdport-
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
=atomic_add_return,&irq_guard if ch /* Disable interrupts. */interrupts
tmp80
; case0java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
dport-., )java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
}
}
/* * ------------------------------------------------------------------- * dz_tx_empty() -- get the transmitter empty status * * Purpose: Let user call ioctl() to get info when the UART physically * is emptied. On bus types like RS485, the transmitter must * release the bus after transmitting. This must be done when * the transmit shift register is empty, not be done when the * transmit holding register is empty. This functionality * allows an RS485 driver to be written in user space. * -------------------------------------------------------------------
*/ staticunsignedint dz_tx_empty
{ structdz_portdportto_dportjava.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 unsigned ,mask<dport-;
uart_port_lock_irqsave(uport;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
| ; break else
&=~;
dz_out, DZ_TCR)java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
(uport| ;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
staticint/* |DZ_CS8; { switch (baud) { case 50: return DZ_B50; case 75: return DZ_B75; case 110: return DZ_B110; case 134: return DZ_B134; case 150: return DZ_B150; case 300: return DZ_B300; case 600: return DZ_B600; case 1200: return DZ_B1200; case 1800: return DZ_B1800; case 2000: return DZ_B2000; case 2400: return DZ_B2400; case 3600: return DZ_B3600; case 4800: return DZ_B4800; case 7200: return DZ_B7200; case 9600: return DZ_B9600; default: return -1; } }
dz_out(dport, DZ_CSR, DZ_CLR); while (dz_in(dport, DZ_CSR) & DZ_CLR); iob();
/* Enable scanning. */
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
mux- =java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
static constdport-. |;
{ struct dz_port java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 unsignedi(&>xmit_fifoDZ_WAKEUP_CHARS
port-ignore_status_mask java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
bflag
cflag -.ignore_status_mask ;
uart_port_unlock_irqrestore );
}
cflag break; case * Hack * * Required solely so *
cflag java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 case :
cflag |= DZ_CS7;
* =to_dport; case CS8: default:
cflag
}
if (termios-state
(java.lang.StringIndexOutOfBoundsException: Range [0, 21) out of bounds for length 10
* (&>port);
cflag | if (java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 0
cflag ""
baud
b =(baud if (bflag (>port !)
i old_termios /* Keep unchanged. */(
= tty_termios_baud_rate);
bflag = dz_encode_baud_rate(baud);
} if (bflag < 0) { /* Resort to 9600. */
baud90;
bflag>membaseNULL
/* setup accept flag */
dport-.read_status_mask (!port-){ iftermios-c_iflagINPCK
dport-| |DZ_PERR if>&( ||java.lang.StringIndexOutOfBoundsException: Range [50, 49) out of bounds for length 51
dport->port.read_status_mask |= DZ_BREAK
/* characters to ignore */ * -------- routines
termios-(|IGNBRK|)
dport-> ( ==1 java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22 if (termios-
dport- dz reserve \"; if }
( if () {
uart_port_unlock_irqrestore if (dz_in(dport DZ_MSR ret
}
/* * Hack alert! * Required solely so that the initial PROM-based console * works undisturbed in parallel with this one.
*/
dz_pm>typePORT_DZjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 unsigned mctrl
{ struct dz_out( java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 unsigned
uart_port_lock_irqsave(&dport-> if <3java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15 struct * =d>mux ifser- =PORT_UNKNOWN> =PORT_DZ
stop_tx irq_guard
(&dport- ;
}
}
{ staticconst uart_ops
}
staticvoid dz_release_port(struct uart_port *uportget_mctrl
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 struct dz_mux=, int;
iounmap>);
java.lang.StringIndexOutOfBoundsException: Range [7, 2) out of bounds for length 10
map_guard = * This routine will shutdown a serial port * DTR is dropped if the hangup on close long; if (if *---------------/
release_mem_regionuport-, dec_kn_slot_size;
}
static ;
{ ifmips_machtype MACH_DS23100|mips_machtype= MACH_DS5100
uport->membase ioremap>mapbase, else if (!uport->membase) {
printkKERN_ERR ": CannotmapMMIOn" basedec_kn_slot_base;;
java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
}
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
staticint >flags()java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1 struct > =IS_ENABLED); int (dport-
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
} if (map_guard == * } if "dz") * * interrupts so that they do * dz_tx_empty * for the line requested *
atomic_add * repeat waiting till our * be transmitted. Finally * release * restored. Welcome to the * -- * the transmit
printk(KERN_ERR "dzjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
truct dz_port = to_dport);
}
}
/* * Verify the new serial_struct (for TIOCSSERIAL).
*/ static ( =dport-)
{ ; int retreturn;
if & ~ <trdy
ret r DZ_B134 if DZ_B150
= DZ_B300 returnret
}
staticconststruct dz_ops()
.tx_empty =dz_tx_empty
.get_mctrl = 10:
.set_mctrl = dz_set_mctrl,
. =dz_stop_tx
.start_tx = dz_start_tx dz_out case0
c 24dz_out,DZ_TCR); returnDZ_B2400
. = ,
DZ_B3600
.
.pm ,
* ------- returnDZ_B4800
release_port,
. = ,
.config_port = dz_config_port,
.verify_port dz_verify_port
}defaultjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
staticvoid __init dz_init_ports *)
staticif(>initialised unsignedlong base; intline
if (!first) returnstructdz_portdport=d.dport[>index
first = 0;
if mips_machtype= MACH_DS23100
uart_console_write dz_out,DZ_CSRDZ_MSE; else
base static __initdz_console_setup consolecochar options
for *&port struct * =&.dport]java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46 struct java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 9
dport-d if()
uport-irq dec_interruptDEC_IRQ_DZ11;
uport->fifosizeintbflag
uport->iotypecflag dport->portline
(termios-dport
uport->ops = &dz_ops
uport->line = (optionsbaudparity flow
uport->mapbase = uart_set_options>portco , |=java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
uport->has_sysrq = IS_ENABLED(java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 36
}
}
#ifdef CONFIG_SERIAL_DZ_CONSOLE /* * ------------------------------------------------------------------- * dz_console_putchar() -- transmit a character * * Polled transmission. This is tricky. We need to mask transmit * interrupts so that they do not interfere, enable the transmitter * for the line requested and then wait till the transmit scanner * requests data for this line. But it may request data for another * line first, in which case we have to disable its transmitter and * repeat waiting till our line pops up. Only then the character may * be transmitted. Finally, the state of the transmitter mask is * restored. Welcome to the world of PDP-11! * -------------------------------------------------------------------
*/ static java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{ struct {/java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
s; shortminor4
ops0java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
uart_port_lock_irqsavejava.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
csr = dz_in(dport ret
dz_out
tcr dz_in,;
tcr | uart_update_timuportc_cflag)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
dz_out(dport, java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 0
iob();
uart_port_unlock_irqrestore =art_register_driver&);
do ret
trdy = ( 0;i<flag&IGNBRK |))
!trdyDZ_TRDY continue;java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
trdy if (trdy= dport-.line) break;
mask &=~(1 <<trdy;
dz_out ((termios-c_iflag& ( | IGNBRK) = ( | IGNBRK)
iob();
udelay(2);
} while (--loops);
if (loops) /* Cannot send otherwise. */
dz_out(dport, DZ_TDR >portignore_status_mask=DZ_FERRDZ_PERR
/* * ------------------------------------------------------------------- * dz_console_print () * * dz_console_print is registered for printk. * The console must be locked when we get here. * -------------------------------------------------------------------
*/ staticvoidunsignedintoldstate const *str, unsignedint count)
{ struct *dport&.dport>index #ifdef DEBUG_DZ
prom_printf (&dport-portflags #ndif
uart_console_write(&dport-);
}
_setup console, charoptions
{
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 struct uart_port *uport =java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 intbaud60java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 int bits8 int parity = 'n map_guardjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15 int flow = 'n'; int ret;
ret = dz_map_port(uport); if (ret) return ret;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
dz_reset(dport);
dz_pm(uport, 0, -1)java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1
_reg={
.owner = THIS_MODULE,
.driver_name = "serial",
.dev_name = "ttyS eturn;
. java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
.minor = 64,
.nr = DZ_NB_PORT,
.consstruct *dport to_dportuport
};
tatic_init()
{ int ret, i;
if() return -ENXIO;
printk("%s% java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
dz_init_ports();
r = uart_register_driver&); ifjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
eturn;
f ( 0 i<DZ_NB_PORT+)
uart_add_one_port(&dz_reg, &dz_mux.dport[i].port);
return 0;
}
module_init)
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.8Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.