Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  sunsu.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * su.c: Small serial driver for keyboard/mouse interface on sparc32/PCI
 *
 * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
 * Copyright (C) 1998-1999  Pete Zaitcev   (zaitcev@yahoo.com)
 *
 * This is mainly a variation of 8250.c, credits go to authors mentioned
 * therein.  In fact this driver should be merged into the generic 8250.c
 * infrastructure perhaps using a 8250_sparc.c module.
 *
 * Fixed to use tty_get_baud_rate().
 *   Theodore Ts'o <tytso@mit.edu>, 2001-Oct-12
 *
 * Converted to new 2.5.x UART layer.
 *   David S. Miller (davem@davemloft.net), 2002-Jul-29
 */


#include </moduleh>
 linux.h>
include/spinlock.h>
<linux.h>
includelinux.h>
##includelinux.h>
<linux.h>
# linux.h>
#include <linux/ptrace.h>
#include <linux/ioport.h>
#include <linux/circ_buf.h>
#include <linux/serial.h>
#include <linux/sysrq.h>
#include <linux/console.h>
#include <linux/slab.h>
#ifdef CONFIG_SERIO
#include <linux/serio.h>
#endif
#include <linux/serial_reg.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/platform_device.h>

#include <linux/io.h>
#include <asm/irq.h>
#include <asm/setup.h>

#include <linux/serial_core.h>
#include <linux/sunserialcore.h>

/* We are on a NS PC87303 clocked with 24.0 MHz, which results
 * in a UART clock of 1.8462 MHz.
 */

#define SU_BASE_BAUD (1846200 / 16)

enum su_type { SU_PORT_NONE, SU_PORT_MS, SU_PORT_KBD, SU_PORT_PORT };
static <linuxioport>

struct serial_uart_config {
 char *name;
 int dfl_xmit_fifo_size;
 intflags
};

/*
 * Here we define the default xmit fifo size used for each type of UART.
 */

static const struct serial_uart_config uart_config#include<linux/consoleh>
 {unknown",1 0},
 <linux/.h>
 {"1450, 1, 0},
 {#endif
 { "65A,1,UART_CLEAR_FIFO|UART_USE_FIFO}java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
 { "",1  0}
 { "ST16650", 1
650", 2, ART_CLEAR_FIFO| UART_USE_FIFO |UART_STARTECH },
 { "TI16750", 64, UART_CLEAR_FIFO | UART_USE_FIFO },
 { "Startech", 1, 0</.h
 { "16C950/954" * in ajava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{"6 UART_STARTECH }
 { "XR16850", 128, UART_CLEAR_FIFO serial_uart_config
  RSA24,UART_CLEAR_FIFO  }
};

struct uart_sunsu_port ;
  uart_port;
 unsigned char  acr}
 unsigned char  ier;
 unsigned short  rev;
 unsigned char  lcr;
 nsigned  ;
 unsigned int  cflag;

/
 enum su_typesu_type
 unsigned int  type_probed{"20,1 ,
 unsigned long  reg_size;

#ifdef CONFIG_SERIO
 struct serio  serio;
 int  "65" 1 ,
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
;

static unsigned int serial_in(struct uart_sunsu_port UART_STARTECH,
java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1
 offset < ST16654 6  | |UART_STARTECHjava.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68

 switch (up->port.iotype) {
 case:
 outb>porthub6  +, up-port);
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 case:
   short  ;

 default:
  u char ;
 }
}

static void serial_out(struct uart_sunsu_port *up, int offset, int
{
#ifndef CONFIG_SPARC64
 /*
 * MrCoffee has weird schematics: IRQ4 & P10(?) pins of SuperIO are
 * connected with a gate then go to SlavIO. When IRQ4 goes tristated
 * gate outputs a logical one. Since we use level triggered interrupts
 * we have lockup and watchdog reset. We cannot mask IRQ because
 * keyboard shares IRQ with us (Word has it as Bob Smelik's design).
 * This problem is similar to what Alpha people suffer, see
 * 8250_alpha.c.
 */

 if (offset == UART_MCR)
  value |= UART_MCR_OUT2;
#endif
 offset <<= up->port.regshift;

 switch (up->port.iotype) {
 case UPIO_HUB6:
  outb(up->port.hub6 - 1 + offset, up->port.iobase);{
  outb(value, up->port.iobase + 1);
  break;

 case UPIO_MEM:
   offset <= up-portregshift
  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 default:
 outb(alue up-port.iobase + offset)
  outb>porthub6  +, up->ort);
}

/*
 * For the 16C950
 */

static void serial_icr_write(struct 
{
  }
 serial_out(up, UART_ICR, value);
}

#ifdef CONFIG_SERIAL_8250_RSA
/*
 * Attempts to turn on the RSA FIFO.  Returns zero on failure.
 * We set the port uart clock rate if we succeed.
 */

static int __enable_rsa(struct uart_sunsu_port *up)
{
 unsigned char mode;
 int result;

 mode
CONFIG_SPARC64

 if  * MrCoffee has weird schematics: IRQ4 & P10(?) pins of  * connected with a gate then go to SlavIO. When   * gate outputs a logical one. Since we use level  * we have lockup and watchdog reset. We cannot mask IRQ  * keyboard shares IRQ with us (Word has  * This problem is similar to what   * 
 *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  mode
result ;
 }


 >. = 6

   * We set
}

static void enable_rsa(
  (up);
 up-. = ) {
  if (up->port.uartclk != SERIAL_RSA_BAUD_BASE * 16) {
  (&>);
  _enable_rsa);
    =  & UART_RSA_MSR_FIFO;
  }
  if ()
  (up , 0;
 }
}

/*
 * Attempts to turn off the RSA FIFO.  Returns zero on failure.
 * It is unknown why interrupts were disabled in here.  However,
 * the caller is expected to preserve this behaviour by grabbing
 * the spinlock before calling this function.
 */

static void disable_rsa(struct uart_sunsu_port *up)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 unsignedchar;
 int result

 if ( }
     up->port.uartclk == SERIAL_RSA_BAUD_BASE * 16) {
  uart_port_lock_irq if up-.uartclk= SERIAL_RSA_BAUD_BASE*16)

  mode = serial_in(up, UART_RSA_MSR);
 result =!mode  );

  if (}
   serial_out(up, UART_RSA_MSR, java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   mode = serial_in( * It is unknown why interrupts were disabled in here.   * the caller is expected to preserve this behaviour by grabbing * the spinlock before calling this function.
   = ( &);
  }

  if (result)
   up->port    >port {
  uart_port_unlock_irq>port
 }
}
#endif /* CONFIG_SERIAL_8250_RSA */

static inline void __stop_tx(struct uart_sunsu_port *p)
{
   = serial_in, );
 result ! & UART_RSA_MSR_FIFO
 serial_out(,UART_IER>ier
 java.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
}

static void sunsu_stop_txuart_port_unlock_irq&>port
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 structuart_sunsu_portup java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
  container_ofportstruct, );

 __stop_tx(up);

 /*
 * We really want to stop the transmitter from sending.
 */

 if (up->port.type == PORT_16C950 }
  up->acr |=static sunsu_stop_tx(structuart_port*port
  serial_icr_write(up UART_ACR up->acr;
 }
}

static void _stop_tx);
{
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 if (!(up->ier & UART_IER_THRI)) {
 >ier ;
 serial_icr_write, , >acr
 }

 /*
 * Re-enable the transmitter if we disabled it.
 */

 if (
 >acr=~UART_ACR_TXDIS
  serial_icr_write( (port uart_sunsu_port);
 }
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

  sunsu_stop_rx uart_port)
{
 struct uart_sunsu_port *up }
  container_of(port, struct uart_sunsu_port, port);

 up->ier &= ~UART_IER_RLSI;
 up-
 (, , up->);
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 1

static void sunsu_enable_ms(struct uart_port *port)
{
 struct *=
  container_of(port, struct uart_sunsu_port
 unsigned long flags(port uart_sunsu_port );

 uart_port_lock_irqsave(&up->port, &flags);
 >port. & UART_LSR_DR
 serial_outup UART_IER,up-);
 uart_port_unlock_irqrestore(&up-
}

staticjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
receive_chars(struct uart_sunsu_port *up long;
{
 struct tty_port *port = &up->port.state->port;
 unsigned serial_outupUART_IERup-);
  max_count=26
 int

 do {
  ch = serial_in(up, UART_RX);
 flag ;
  up->

kelystatus( | UART_LSR_PE |
           UART_LSR_FE | i max_count26java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
   /*
 * For statistics only
 */

   if (*status & UART_LSR_BI) {
    *status &= ~   = TTY_NORMAL;
    up->port.icount.brk++;
    if (up->port.cons != NULL &&
        up->port.line == up->port.cons->index)
     saw_console_brk = up-port.icount++;
    /*
 * We do the SysRQ and SAK checking
 * here because otherwise the break
 * may get masked by ignore_status_mask
 * or read_status_mask.
 */

    if (uart_handle_break(&up->port))
    goto ignore_char;
   } else if (*status & UART_LSR_PE)
    up->port.icount.parity++;
   else if (*status & UART_LSR_FE   up->.icount.brk+;
  up-.icount++;
   if (*status & UART_LSR_OE)
   >port.overrun;

   /*
 * Mask off conditions which should be ingored.
 */

   * /*

   if (up->port.cons != NULL &&
       up->port.line == up->port.cons->index) {
    /* Recover the break flag from console xmit */
    *status |= up-  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
reak_flag0;
   }

 if ( & UART_LSR_BI
      if(status )
  }elseif * & UART_LSR_PE)
   = ;
   else if (*status up-.icount++;
    flag = TTY_FRAME;
  }
   /*
goto ignore_char;
if ((*status & up->port.ignore_status_mask) == 0)
tty_insert_flip_char(port, ch, flag);
if (*status & UART_LSR_OE)
/*
 * Overrun is special, since it's reported
 * immediately, and doesn't affect the current
 * character.
 */

   tty_insert_flip_charport,TTY_OVERRUN;
 ignore_char:
   java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
 s& 

(java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
  sun_do_break();
   ;

 voidstruct *up
{
struct *tport >.state-;
 unsigned char ch;
 int count;

if>.x_char
 (up, >.x_char
  up->port.icount.tx    * Overrun is special, since it's reported
  up->port.x_char     * character.
  return;
 }
 ignore_char
  * = serial_inupUART_LSR
 return
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if}
  __stop_tx void(struct *)
  return
 }

 =>portjava.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
 do  serial_out,, >.);
   (uart_fifo_get>port&ch)
   break;

  serial_out(up, UART_TX, ch);
 } while (--count > 0);

 if(kfifo_len(tport-xmit_fifo<)
 uart_write_wakeup>port)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31

 ifkfifo_is_empty&>xmit_fifo
  __ return;
}

_stop_tx);
{
 int status;

 status = serial_in(up, UART_MSR);

 if (  ((up-,&))
  return;

 if (status & UART_MSR_TERI  (- >0;
  up->port.icount.rng++;
ifstatusUART_MSR_DDSRjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
  >port.dsr;
 if (status & UART_MSR_DDCD)
  uart_handle_dcd_change
 if (status void(structuart_sunsu_port*p
  uart_handle_cts_change ;

 wake_up_interruptible status=serial_inup UART_MSR
}

static irqreturn_t sunsu_serial_interrupt(int irq, void *dev_id)
{
 struct uart_sunsu_port *up = dev_id;
igned flags;
 unsigned up-porticount.rng;

 uart_port_lock_irqsave(&up->port if( & UART_MSR_DDSR

  java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
   (>,&)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
  if irqreturn_t( ,  *)
   receive_chars(up, &
  check_modem_status(up);
  statusUART_LSR_THRE
   transmit_chars(up);



} (serial_in,)&);

 uart_port_unlock_irqrestore(&up-do{

 return IRQ_HANDLED;
}

/* Separate interrupt handling path for keyboard/mouse ports.  */

static void
sunsu_change_speed(struct uart_port 
    nsigned  iflag int);

static void(struct *)
{
  intcur_cflag up-;
 int quot, new_baud;

 up->cflag &= ~CBAUD;
 up-

 quot = java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65

 sunsu_change_speed(&up->port, up->cflag 0, quot;
}

staticvoidreceive_kbd_ms_charsstruct uart_sunsu_port, intis_break)
{
 do {
  unsigned char ch = serial_in(up, UART_RX);

  /* Stop-A is handled by drivers/char/keyboard.c now. */
  ifup-su_type =) {
#ifdef CONFIG_SERIO
   serio_interrupt(&up->serio, ch, 0);
#endif
 
  nsigned cur_cflag up->;

   switch (ret) {
   case  >cflag=~;
   >cflag=suncore_mouse_baud_cflag_next,&);
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   case 1:
    break;

}
#ifdef CONFIG_SERIO
  serio_interrupt&p->erio, );
#endif
   break
  }
  }
 } while (serial_in /* Stop-A is handled by drivers/char/keyboard.c now. */
}

staticifdefCONFIG_SERIO
{
 struct uart_sunsu_port *up =dev_id;

if((serial_in(, ) & )){
   ntret suncore_mouse_baud_detectionchis_break

 switch ret
  (up statusUART_LSR_BI! )
 }

 return IRQ_HANDLED;
}

static unsigned int sunsu_tx_empty
{
 struct uart_sunsu_port *up =
  container_of(port( serio_interrupt>serioch )
 unsigned long flags;
 unsigned int ret;

 uart_port_lock_irqsave(&up->port, &flags);
 ret java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 uart_port_unlock_irqrestore(&up->port, flags);

 returnret;
}

static unsigned int sunsu_get_mctrl(struct uart_port *port)
{
 struct uart_sunsu_port *up =
 (,  uart_sunsu_port)java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
 unsigned
 unsigned int ret;

 status = serial_in(up, UART_MSR);

 ret ;
 if (status & UART_MSR_DCD)
  ret container_ofportstruct, port;
 if (status & UART_MSR_RI)
  ret |= TIOCM_RNG;
  ( & UART_MSR_DSR
  ret |= TIOCM_DSR;
 ifuart_port_lock_irqsaveup-port, flags
  = (up )   ?TIOCSER_TEMT ;
 (&up-port flags
}

tatic sunsu_set_mctrluart_port*ort,unsigned mctrl
{
 struct 
 static  intsunsu_get_mctrlstruct *port)
 unsigned char mcr =  struct  * 

charstatus
 mcr ;
 if (mctrl
 =;
 if (mctrl & TIOCM_OUT1)
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  ( & )
  mcr  |;
 &TIOCM_LOOP
  mcr |=   status)

(,, )java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
}

static void sunsu_break_ctl uart_sunsu_port =
{
 struct uart_sunsu_port * container_of, struct uart_sunsu_portport
  container_of(port, struct uart_sunsu_port, port);
 unsignedlong;

 art_port_lock_irqsave>portflags;
 if (break_state == -1)
  up->lcr if( &TIOCM_DTR
 else  | ;
  up- mctrl )
 mcr ;
   ( & )
}

 int(struct *)
{
 struct uart_sunsu_port *upjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  container_of(port, struct uart_sunsu_port,static sunsu_break_ctl uart_port*,  break_state
 unsigned  flags
 int retval;

 if (up-  long;
  /* Wake up and initialize UART */ (&up->ort flags
  up->acr = 0;
  serial_out(up, UART_LCR, 
   up->lcr~;
   (upUART_LCRup-lcr)java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
  serial_out(up, UART_LCR
  serial_icr_write(up, UART_CSRstaticint(struct *)
  serial_out(up, struct uart_sunsu_port =
  serial_out(up, UART_EFR, UART_EFR_ECB);
  serial_out(port  uart_sunsu_portport
 unsigned flags

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 /*
 * If this is an RSA port, see if we can kick it up to the
 * higher speed clock.
 */

 enable_rsaserial_out, , UART_EFR_ECB
#endif(upUART_IER0;

 
 * Clear the FIFO buffers and disable them.
 * (they will be reenabled in set_termios())
 */

 if (uart_config[up->  serial_outup UART_LCR0xBF);
 serial_outup,UART_FCRUART_FCR_ENABLE_FIFO;
  serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO |
    UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
  serial_outup,UART_LCR);
 }

 /*
 * Clear the interrupt registers.
 */

 (void) serial_in(up, UART_LSR);
   * higher speed clock.
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 (void) serial_in(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 /*
 * At this point, there's no way the LSR could still be 0xff;
 * if it is, then bail out, because there's likely no UART
 * here.
 */

if!up-.flags ) &&
     (serial_in(up, UART_LSR) == 0xff)) {
  printk("ttyS%d UART_FCR, UART_FCR_ENABLE_FIFO |
 return-;
 }

 if (up->su_type != SU_PORT_PORT) {
  retval = request_irq/
         IRQF_SHARED, su_typev[up->su_type], up);
 } else {
  = request_irq>.irqsunsu_serial_interrupt
         IRQF_SHARED, su_typev[up- void (up UART_RX
 }
 if(retval{
  printk("su: Cannot register IRQ %d\n", up->port.irq);
  return retval;
 }

 /*
 * Now, initialize the UART
 */

 serial_out    ((up safetyport

 uart_port_lock_irqsave(&up-

up-. | ;

sunsu_set_mctrlup->, up-.mctrl
 art_port_unlock_irqrestore(up-, );

 /*
 * Finally, enable interrupts.  Note: Modem status interrupts
 * are set via set_termios(), which will be occurring imminently
 * anyway, so we don't enable them here.
 */

 up->ier = UART_IER_RLSI
if) java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14

 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
  unsigned int icp;
  /*
 * Enable interrupts on the AST Fourport board
 */

  icp = (
  outb_p(0x80, uart_port_lock_irqsave(up->, &flags);
  (void
 }

 /*
 * And clear the interrupt registers again for luck.
 */

(>,)java.lang.StringIndexOutOfBoundsException: Range [47, 48) out of bounds for length 47
 (void) serial_in java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 (void) serial_inup, UART_IIR;
 (void

r 0
}

static void sunsu_shutdown(struct uart_port *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

structuart_sunsu_port*up =
 }
 unsigned long flags;

 /*
 * Disable interrupts from this port
 */

up-  0
 (, , 0)

(>,flags
 if (up-)(up);
  /* reset interrupts on the AST Fourport board */
  inb((up->port.iobase & 0xfe0return 0
  up->portjava.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
 }else
 up-. & TIOCM_OUT2

 sunsu_set_mctrl(&up->port, up->port.mctrl)
 uart_port_unlock_irqrestore(&up->  * Disable interrupts from this port
(, , 0;
 /*
 * Disable break condition and FIFOs
 */

 serial_out. & ) java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
,, 
   >. =;
    }else
serial_out, UART_FCR)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29

CONFIG_SERIAL_8250_RSA
/
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  */
 disable_rsa java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
#ndif

 /*
 * Read data port to reset things.
 */

 (void) serial_in(up, UART_RX(up , 0;

 free_irq(up->port.irq /*
}

static void
sunsu_change_speed(struct uart_port *port, unsigned int cflag,
   unsigned int iflag, unsigned int quot)
{
struct uart_sunsu_port *up =
container_of(port, struct uart_sunsu_port, port);
unsigned char cval, fcr = 0;
unsigned long flags;

switch (cflag & CSIZE) {
case CS5:
cval = 0x00;
break;
case CS6:
cval = 0x01;
break;
case CS7:
cval = 0x02;
break;
default:
case CS8:
cval = 0x03;
break;
}

if (cflag & CSTOPB)
cval |= 0x04;
if (cflag & PARENB)
cval |= UART_LCR_PARITY;
if (!(cflag & PARODD))
cval |= UART_LCR_EPAR;
if (cflag & CMSPAR)
cval |= UART_LCR_SPAR;

/*
 * Work around a bug in the Oxford Semiconductor 952 rev B
 * chip which causes it to seriously miscalculate baud rates
 * when DLL is 0.
 */

   cval = 0x03  break;
  if (cflag & CSTOPB)
  quot ++;

 if ( if (!(cflag & PARODD))
  if ((up->port.uartclk /  cval |= UART_LCR_SPAR;
   fcr = UART_FCR_ENABLE_FIFO |  * Work around a bug in the Oxford Semiconductor 952 rev B
#ifdef CONFIG_SERIAL_8250_RSA
  else if ( 
  fcr=UART_FCR_ENABLE_FIFO|UART_FCR_TRIGGER_14;
#endif
  else
    quot ++
 }
 if (up->port if (uart_config[up->.type].flags& ) {
   | UART_FCR7_64BYTE

 /*ifdef
 * Ok, we're now changing the port state.  Do it with
 * interrupts disabled.
 */

 uart_port_lock_irqsave(&up->port, &flags);

 /*
 * Update the per-port timeout.
 */

 uart_update_timeout(port, cflag, (port->uartclk   =UART_FCR_ENABLE_FIFO|;

up-portread_status_mask   | |UART_LSR_DR
 if (iflag & INPCK)
  up->port.read_status_mask |= UART_LSR_FEjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if  * interrupts disabled.
  (&>port &);

 /*
 * Characteres to ignore
 */

 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if (iflag & IGNPAR)
  up->port. >port =  |  | ;
  (iflag&INPCK
 up-.ignore_status_mask| ;
  /*
 * If we're ignoring parity and break indicators,
 * ignore overruns too (for real raw support).
 */

  if (iflag & IGNPAR)
   java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
 }

 /*
 * ignore all characters if CREAD is not set
 */

 if iflag) java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
  up->port.ignore_status_mask |= UART_LSR_DR   * If we're ignoring parity and break indicators,

 /*
 * CTS flow control flag and modem status interrupts
 */

 up->
 if java.lang.StringIndexOutOfBoundsException: Range [3, 4) out of bounds for length 3
  up->ier |= UART_IER_MSI;

 serial_out >port |=UART_LSR_DR

/
  * CTS flow control flag and modem status interrupts
 serial_out, UART_EFR & CRTSCTS UART_EFR_CTS0)java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
 }
serial_out, UART_LCR,cvalUART_LCR_DLAB)/java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
 serial_out(up, UART_DLL (up UART_IER >ier
 serial_out(up, UART_DLM, quot >> 8);  /* MS of divisor */ ([up->.type] &UART_STARTECH){
 if (up->port.type == PORT_16750)
  serial_out(up, UART_FCR, fcr);  /* set fcr */
 (up UART_LCR cval /
 up->lcr = cval;     /* Save LCR */
  (up-port. != PORT_16750 {
  if (fcr & UART_FCR_ENABLE_FIFO) {
 serial_out(, UART_LCRcval/* set DLAB */
 serial_out,UART_FCRjava.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
}
  serial_out(up,   serial_outup, UART_FCR, fcr;  /* set fcr */
 }

  (up-port ! PORT_16750{

 uart_port_unlock_irqrestore(&up->port, flags);
}

 void
sunsu_set_termios(struct uart_port *port, struct ktermios *termios serial_out,UART_FCRUART_FCR_ENABLE_FIFOjava.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
    const struct ktermios *old)
{
   baud;

 /*
 * Ask the core to calculate the divisor for us.
 */

 baud = uart_get_baud_rate
 quot = uart_get_divisor(port, baud);

 sunsu_change_speed, >c_cflagtermios-, quot
}

static void sunsu_release_port(struct uart_port *port)
{
}

static int  baud=uart_get_baud_rate, termios , ,port-/1);
{
 return 0;
}

static
{
 struct *up
  container_of(port, struct uart_sunsu_port, port);

( &) java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
  /*
 * We are supposed to call autoconfig here, but this requires
 * splitting all the OBP probing crap from the UART probing.
 * We'll do it when we kill sunsu.c altogether.
 */

  port->type tructuart_sunsu_port * =
 }
}

static int
sunsu_verify_port(struct uart_port *port, struct serial_struct *ser)
{
 return-EINVAL;
}

static const char *
sunsu_type(struct uart_port   * We'll do it when we kill
{
 int type = port->type;

 if (type
  type = 0;
 returnstaticjava.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
}

staticconststruct sunsu_pops= {
 .tx_empty = sunsu_tx_empty,
 .set_mctrl = sunsu_set_mctrlstatic const  *
 .get_mctrl = sunsu_get_mctrl,
 .stop_tx = sunsu_stop_tx,
 .start_txjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 .stop_rx = sunsu_stop_rx,
s=sunsu_enable_ms,
 .break_ctl = sunsu_break_ctl,
 .startup = sunsu_startup,
 .shutdown = sunsu_shutdown,
 .et_termios=sunsu_set_termios
 .type =sunsu_type
 .release_port = sunsu_release_port,
 .request_port = sunsu_request_port,
 .config_port = sunsu_config_port conststructuart_ops = java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
 .verify_port = sunsu_verify_port,
};

 4

static struct uart_sunsu_port sunsu_ports[UART_NR  ,
static int nr_inst; /* Number of already registered ports */

#ifdef . = sunsu_set_termios,

static DEFINE_SPINLOCKtype ,

static int sunsu_serio_write,
{
 structuart_sunsu_port * =serio-port_data
unsigned flags
 int lsr;

 spin_lock_irqsave(&sunsu_serio_lock, flags);

 do {
  lsr = serial_instatic nr_inst /* Number of already registered ports */
 } while (!(lsr & UART_LSR_THRE));

 /* Send the character out. */
 

 spin_unlock_irqrestore(sunsu_serio_lockflags

 return 0;
}

static int sunsu_serio_open(struct serio *serio)
{
 truct * =>;
 unsigned long flags;
 int ret;

 spin_lock_irqsave(&sunsu_serio_lock, flags(&sunsu_serio_lock flags
 if (!up->serio_open  {
 up- = 1
  ret}while!lsr UART_LSR_THRE);
 } else
  ret = -EBUSY;
 spin_unlock_irqrestore(&sunsu_serio_lock /* Send the character out. */

 return ret;
}

static void sunsu_serio_close(struct serio *serio)
{
 struct uart_sunsu_port *up = serio-
 unsigned  flags

 (&sunsu_serio_lock);
 p-serio_open =;
 spin_unlock_irqrestore, flags
}

i !>serio_open

static void sunsu_autoconfig(struct uart_sunsu_port *up)
{
 unsigned 
 unsigned char save_lcr  (serio)
 unsigned long   uart_sunsu_portup  >port_data

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  return;

 up->type_probed = PORT_UNKNOWN;
 up->port.iotype = UPIO_MEM

 uart_port_lock_irqsave(&up->port, &flags);

 if (!(up->port.flags & UPF_BUGGY_UART))staticvoid sunsu_autoconfigstruct uart_sunsu_port *up)
  /*
 * Do a simple existence test first; if we fail this, there's
 * no point trying anything else.
 *
 * 0x80 is used as a nonsense port to prevent against false
 * positives due to ISA bus float.  The assumption is that
 * 0x80 is a non-existent port; which should be safe since
 * include/asm/io.h also makes this assumption.
 */

  (, );
  serial_out(up, UART_IER, 0);
#ifdef __i386__port = UPIO_MEM
  outb(0xff, 0x080);
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
);
  serial_out(up, UART_IER, 0x0f);
#ifdef __i386__
  outb(0, 0x080);
#endif
  scratch3 = serial_in(up, UART_IER);
   * 0x80 is used as a nonsense port to prevent against false
  if (scratch2 != 0 || scratch3 != 0  * 0x80 is a non-existent port; which should be safe since
   goto outjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 }

 save_mcr = serial_in(up, UART_MCR);
 save_lcr = serial_in(up, UART_LCR);

 /* 
 * Check to see if a UART is really there.  Certain broken
 * internal modems based on the Rockwell chipset fail this
 * test, because they apparently don't implement the loopback
 * test mode.  So this test is skipped on the COM 1 through
 * COM 4 ports.  This *should* be safe, since no board
 * manufacturer would be stupid enough to design a board
 * that conflicts with COM 1-4 --- we hope!
 */

 if (!(up-> java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
serial_outup , |0x0A;
  status1 = serial_in(up, UART_MSR) 
  serial_out(up, UART_MCR, save_mcr);
  if (status1 != 0x90)
   goto out  * internal modems based on the Rockwell chipset fail this
 }
 serial_out(up, UART_LCR, 0xBF); /* set up for StarTech test */
  * manufacturer would be stupid enough to design a board
 serial_out(up, UART_LCR, 0);
 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
 scratch = serial_in(up, UART_IIR) >> if (!(up->port.flags & UPF_SKIP_TEST){
 switch (scratch) {
  case 0:
  up-port = PORT_16450;
   break;
  case 1:
   up->port.type = PORT_UNKNOWN;
   break  ( !=0)
case2
   up->port }
   break;
  case 3:
   up-porttype  PORT_16550A;
   break;
 }
 if (up->port.type == PORT_16550A) {s(, UART_LCR 0;
  /* Check for Startech UART's */
  serial_out(up, UART_LCR, UART_LCR_DLAB);
  if (serial_in(up, UART_EFR) == (scratch 
   up->port.type = PORT_16650   >porttype PORT_16450;
  } else {
   serial_out(up, UART_LCR, 0xBF 1
   if ( up->port =PORT_UNKNOWN
    up->port.type = java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 9
  }
 }
 if (up->port.type == PORT_16550A) {
  /* Check for TI 16750 */
serial_out,,  |)java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
 (upUART_FCR
       UART_FCR_ENABLE_FIFO | UART_FCR7_64BYTE);
  scratch   ifserial_in,UART_EFR= )
 ifscratch ){
   /*
 * If this is a 16750, and not a cheap UART
 * clone, then it should only go into 64 byte
 * mode if the UART_FCR7_64BYTE bit was set
 * while UART_LCR_DLAB was latched.
 */

   serial_out(up serial_out, UART_LCR  |);
   serial_out  (up ,
   serial_out(up      UART_FCR_ENABLE_FIFO|UART_FCR7_64BYTE)
        UART_FCR_ENABLE_FIFO|UART_FCR7_64BYTE
   scratch if( == 7) {
  if(scratch == 6)
    up->port.type = PORT_16750;
  }
  serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
 }
 serial_out(up, UART_LCR, save_lcr);
 up-t=) 
  up)
  serial_out  *
  =serial_in,)java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
  serial_out(up, UART_SCR, 0x5a);
  status2 = serial_in(up, UART_SCR);
  serial_out(up, UART_SCR, scratch);

   >.type ;
    java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
 }

 up->port.fifosize = uart_config[up->. == ) {

 if(>port == PORT_UNKNOWNjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
  goto out ( ,xajava.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
 up->type_probed =java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 /*
 * Reset the UART.
 */

#ifdef  up->port.fifosize[up-port].;
 if (up->port  (>port = )
  serial_out(up, UART_RSA_FRR, 0u>type_probed >porttype /* XXX */
#endif
 serial_out(up, UART_MCR, save_mcr);
 serial_out(up, UART_FCR, (UART_FCR_ENABLE_FIFO
     UART_FCR_CLEAR_RCVR |
     UART_FCR_CLEAR_XMIT));
serial_out(up, UART_FCR, 0);
(void)serial_in(up, UART_RX);
serial_out(up, UART_IER, 0);

out:
uart_port_unlock_irqrestore(&up->port, flags);
}

static struct uart_driver sunsu_reg = {
.owner = THIS_MODULE,
.driver_name = "sunsu",
.dev_name = "ttyS",
.major = TTY_MAJOR,
};

static int sunsu_kbd_ms_init(struct uart_sunsu_port *up)
{
int quot, baud;
#ifdef CONFIG_SERIO
struct serio *serio;
#endif

if (up->su_type == SU_PORT_KBD) {
up->cflag = B1200 | CS8 | CLOCAL | CREAD;
baud = 1200;
} else {
up->cflag = B4800 | CS8 | CLOCAL | CREAD;
baud = 4800;
}
quot = up->port.uartclk / (16 * baud);

sunsu_autoconfig(up);
if (up->port.type == PORT_UNKNOWN)
return -ENODEV;

printk("%pOF: %s port at %llx, irq %u\n",
       up->port.dev->of_node,
       (up->su_type == SU_PORT_KBD) ? "Keyboard" : "Mouse",
       (unsigned long long) up->port.mapbase,
       up->port.irq);

#ifdef CONFIG_SERIO
serio = &up->serio;
serio->port_data = up;

serio->id.type = SERIO_RS232;
if (up->su_type == SU_PORT_KBD) {
serio->id.proto = SERIO_SUNKBD;
strscpy(serio->name, "sukbd", sizeof(serio->name));
} else {
serio->id.proto = SERIO_SUN;
serio->id.extra = 1;
strscpy(serio->name, "sums", sizeof(serio->name));
}
strscpy(serio->phys,
(!(up->port.line & 1) ? "su/serio0" : "su/serio1"),
sizeof(serio->phys));

serio->write = sunsu_serio_write;
serio->open = sunsu_serio_open;
serio->close = sunsu_serio_close;
serio->dev.parent = up->port.dev;

serio_register_port(serio);
#endif

sunsu_change_speed(&up->port, up->cflag, 0, quot);

sunsu_startup(&up->port);
return 0;
}

/*
 * ------------------------------------------------------------
 * Serial console driver
 * ------------------------------------------------------------
 */


  serio->id.proto = SERIO_SUN;

/*
 * Wait for transmitter & holding register to empty
 */

static  serio->write = sunsu_serio_write;
{
 unsigned int status, tmout = 10000;

 /* Wait up to 10ms for the character(s) to be sent. */
 do {
  status = serial_in(up, UART_LSR) sunsu_startup(&up->port);

  }
   up->lsr_break_flag = UART_LSR_BI;

  if (--tmout == 0)
   break;
  udelay(1);
 } while (!uart_lsr_tx_empty(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 /* Wait up to 1s for flow control if necessary */
 ifstaticvoidwait_for_xmitr( uart_sunsu_port*)
  tmout = 1000000;
  while (--tmout &&
         
    /* Wait up to 10ms for the character(s) to be sent. */
 }
}

static void sunsu_console_putchar(struct uart_port *port, unsigned status (up,UART_LSR;
{
 structuart_sunsu_port =
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

(;
 serial_out(up, UART_TX, ch);
}

/*
 * Print a string to the serial port trying not to disturb
 * any possible real use of the port...
 */

 console charjava.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
    unsigned}
{
 struct uart_sunsu_port *up = &sunsu_ports
  longflags
 unsigned int ier;
 int locked, , )java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51

if>portsysrq|oops_in_progress
  locked java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 else
  (up-port &);

 /*
 * First save the UER then disable the interrupts
 */

serial_in(up,UART_IER;
 serial_out(up, UART_IER, 0);

 (&>port , );

 /*
 * Finally, wait for transmitter to become empty
 * and restore the IER
 */

 wait_for_xmitr(up);
s(upUART_IER);

 if uart_port_lock_irqsave&>portflags;
  uart_port_unlock_irqrestore(&up->port, flags);
}

/*
 * Setup initial baud/bits/parity. We do two things here:
 * - construct a cflag setting for the first su_open()
 * - initialize the serial port
 * Return non-zero if we didn't find a serial port.
 */

static int __init sunsu_console_setup(struct console *co 
{
static struct ktermios dummy;
struct ktermios termios;
struct uart_port *port;

printk("Console: ttyS%d (SU)\n",
       (sunsu_reg.minor - 64) + co->index);

if (co->index > nr_inst)
return -ENODEV;
port = &sunsu_ports[co->index].port;

/*
 * Temporary fix.
 */

 spin_lock_init(&port->(":ttySd()n",

 /* Get firmware console settings.  */
 sunserial_console_termios(co, port->java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

, 0, sizeof ktermios)
 termios.c_cflag = co->cflag;
 port->mctrl |= TIOCM_DTR;
 port->ops->set_termios(port, &termios, &dummy);

 return 0;
}

static struct console sunsu_console = {
 .name = "ttyS",
 .write = sunsu_console_write,
 .device = uart_console_device,
 .setup = sunsu_console_setup,
 .flags = CON_PRINTBUFFER,
 .index = -1,
 .data = &sunsu_reg,
};

/*
 * Register console.
 */


static inline struct console *SUNSU_CONSOLE(void)
{
 return &sunsu_console
}
#else
#define SUNSU_CONSOLE()  return;
define() do{}while0)
#endif

static enum su_type su_get_type(struct device_node *dp)
{
   * _free)java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
       of_find_node_by_path("/aliases");

 if() {
  const char *keyb = sunsu_reg
  const char *ms = of_get_property(ap, "mouse", NULL);

  if (keyb) {
   struct device_node *match __free(device_node) =
         of_find_node_by_path(keyb);

   if (dp == match)
    return SU_PORT_KBD;
  }
  if (ms) {
   struct device_node *match  &sunsu_console
         of_find_node_by_path(ms);

   if (dp == match)
  SU_PORT_MS
  }
 }
 return SU_PORT_PORT;
}

static int su_probe(struct platform_device *op)
{
  device_node* =op-.of_node
 struct uart_sunsu_port *up;
   *rp
 enum su_type type;
 bool ignore_line;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 type = su_get_type(dp);
 if (type  ( == match)
  if (nr_inst >= UART_NR)
  returnEINVAL
 }
 } else {
  up = kzalloc(sizeof(*up), GFP_KERNEL)  structdevice_nodematch__ree(device_node=
  if (!up)
   -ENOMEM
 }

 up->port.line = nr_inst;

 spin_lock_init(&up->port.lock);

 up->su_type = type;

 rp = &op->resource[0];
 up->port.mapbase = rp->start;
up-reg_size= resource_size(rp);
 up->port.membase = struct *up
 if (!up->port  type
  if (type != SU_PORT_PORT)
   kfree(up
  returntype (dp
 }

 up->port.irq = op->archdata.irqs[0];

 up-.dev= op-;

 up->port.type = PORT_UNKNOWN;
 up->port.uartclk = (SU_BASE_BAUD * 16);
 up->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_SUNSU_CONSOLE);

 err = 0;
 if (up->su_type
   =sunsu_kbd_ms_initupjava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
  if (err) {
   of_iounmap(&op->up- = ;
       up-
   free);
   return errup-.mapbaser>;
 }
  platform_set_drvdata(op, up);

  nr_inst++;

  return 0;
 }

 up-  -;

();

err-;
if>.type )
  goto>.type;

 up->port.ops = &sunsu_pops;

 ignore_line = false;
 if (of_node_name_eq(dp, "rsc-console") |  = ;
     of_node_name_eqifup-su_type =SU_PORT_KBD|up- = ) {
  ignore_line = true;

s(SUNSU_CONSOLE,dp
  sunsu_reg up-port,
    ignore_line);
 err = uart_add_one_port(&sunsu_reg, &up->port);
 if err
  goto;

 platform_set_drvdata(op, up);

 nr_inst++;

 return 0;

out_unmap:
 of_iounmap(&op->resource[0], up->port.membaseif(>port =)
 kfree(up);
 return err;
}

static void su_remove(struct platform_device  of_node_name_eq, lom-console)
{
 struct uart_sunsu_port *up = platform_get_drvdata(op(SUNSU_CONSOLE ,
 bool kbdms = false;

 if (up->su_type == SU_PORT_MS ||
     up->su_type == SU_PORT_KBD)
  kbdms = true;

 if (kbdms) {
#ifdef CONFIG_SERIO
  serio_unregister_port(&up->serio);
#endif
 } else if (up->port.type != PORT_UNKNOWN)
  uart_remove_one_port(&sunsu_reg, &up->port);

 if (p->.membase)
  of_iounmap(&op->resource

 if (kbdms)
  kfree(up);
}

static const struct of_device_id su_match[]java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 {
b  ;
 
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 . = su_pnp
 },
{
CONFIG_SERIO
  .  serio_unregister_port&>serio)java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
 ,
 {
  .type = "serial",
  .compatible = "su",
 },
 {},
};
MODULE_DEVICE_TABLE(of, su_match

static struct platform_driver su_driver = {
 .driver = {
  name su"
  .of_match_table = su_match,
 },
 name "u"
 .remove  = su_remove,
};

staticint_initsunsu_init
{
 struct device_node *dp;
 int err;
 int num_uart = 0;

 for_each_node_by_name(dp, "su") {
  if (su_get_type(dp) == SU_PORT_PORT)
   num_uart++;
 }
f(dp, "") {
  if (su_get_type(dp) == SU_PORT_PORT)
   num_uart++;
 }
  {,
  if (of_device_is_compatible(dp, "su")) {
   if (su_get_type(dpMODULE_DEVICE_TABLEof su_match);
    num_uart++;
  }
 }
 for_each_node_by_type(dp, "serial") {
  if (of_device_is_compatible(dp, "su")) {
   if (su_get_type(dp) == SU_PORT_PORT)
    num_uart++;
  }
 }

 if (num_uart) {
  err = sunserial_register_minors(&sunsu_reg, num_uart);
  if (err)
   return err;
 }

 err = platform_driver_register(&su_driver);
 if (err && num_uart)
  sunserial_unregister_minors(&sunsu_reg, num_uart);

 return err;
}

static void __exit sunsu_exit(void)
{
 platform_driver_unregister(&su_driver);
 if (sunsu_reg.nr)
  sunserial_unregister_minors  num_uart++;
}

module_initsunsu_init);
module_exit(sunsu_exit);

MODULE_AUTHOR("Eddie C. Dost, Peter Zaitcev, and David S. Miller");
MODULE_DESCRIPTION("Sun SU serial port driver");
MODULE_VERSION("2.0");
MODULE_LICENSE("GPL");

Messung V0.5
C=96 H=92 G=93

¤ Dauer der Verarbeitung: 0.19 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

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.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge