ref: 237be5bcc31f6247b718132e1e27413ec6cb7eca
parent: 81572400693fd739d076f1bacfaff904bcdadb8a
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sun Jan 13 05:23:31 EST 2013
remove non standard COM3 (eia2) serial port from i8250 uart. access to non standard serial port COM3 at i/o port 0x200 causes kernel panic on some machines (Toshiba Sattelite 1415-S115). also, some machines have gameport at 0x200. i readded uartisa to the pcf and pccpuf kernel configurations so one can use plan9.ini to add non standard uarts like: uart2=type=isa port=0x200 irq=5
--- a/sys/src/9/omap/devuart.c
+++ b/sys/src/9/omap/devuart.c
@@ -124,33 +124,6 @@
iunlock(&uartalloc);
}
-void
-uartmouse(Uart* p, int (*putc)(Queue*, int), int setb1200)
-{- qlock(p);
- if(p->opens++ == 0 && uartenable(p) == nil){- qunlock(p);
- error(Enodev);
- }
- if(setb1200)
- uartctl(p, "b1200");
- p->putc = putc;
- p->special = 1;
- qunlock(p);
-}
-
-void
-uartsetmouseputc(Uart* p, int (*putc)(Queue*, int))
-{- qlock(p);
- if(p->opens == 0 || p->special == 0){- qunlock(p);
- error(Enodev);
- }
- p->putc = putc;
- qunlock(p);
-}
-
static void
setlength(int i)
{--- a/sys/src/9/pc/fns.h
+++ b/sys/src/9/pc/fns.h
@@ -50,8 +50,6 @@
void i8042reset(void);
void i8250console(void);
void* i8250alloc(int, int, int);
-void i8250mouse(char*, int (*)(Queue*, int), int);
-void i8250setmouseputc(char*, int (*)(Queue*, int));
void i8253enable(void);
void i8253init(void);
void i8253reset(void);
--- a/sys/src/9/pc/mouse.c
+++ b/sys/src/9/pc/mouse.c
@@ -240,7 +240,7 @@
i8042auxcmd(0x50);
break;
case Mouseserial:
- i8250setmouseputc(mouseport, m5mouseputc);
+ uartsetmouseputc(mouseport, m5mouseputc);
break;
}
}
@@ -311,13 +311,13 @@
if(cb->nf > 2){if(strcmp(cb->f[2], "M") == 0)
- i8250mouse(cb->f[1], m3mouseputc, 0);
+ uartmouse(cb->f[1], m3mouseputc, 0);
else if(strcmp(cb->f[2], "MI") == 0)
- i8250mouse(cb->f[1], m5mouseputc, 0);
+ uartmouse(cb->f[1], m5mouseputc, 0);
else
- i8250mouse(cb->f[1], mouseputc, cb->nf == 1);
+ uartmouse(cb->f[1], mouseputc, cb->nf == 1);
} else
- i8250mouse(cb->f[1], mouseputc, cb->nf == 1);
+ uartmouse(cb->f[1], mouseputc, cb->nf == 1);
mousetype = Mouseserial;
strncpy(mouseport, cb->f[1], sizeof(mouseport)-1);
--- a/sys/src/9/pc/pccpuf
+++ b/sys/src/9/pc/pccpuf
@@ -84,6 +84,7 @@
mtrr
uarti8250
+ uartisa
uartpci pci
sdaoe
--- a/sys/src/9/pc/pcf
+++ b/sys/src/9/pc/pcf
@@ -95,6 +95,7 @@
sdloop
uarti8250
+ uartisa
uartpci pci
vga3dfx +cur
--- a/sys/src/9/pc/uarti8250.c
+++ b/sys/src/9/pc/uarti8250.c
@@ -14,8 +14,6 @@
Uart0IRQ = 4,
Uart1 = 0x2F8, /* COM2 */
Uart1IRQ = 3,
- Uart2 = 0x200, /* COM3 */
- Uart2IRQ = 5,
UartFREQ = 1843200,
};
@@ -123,7 +121,7 @@
extern PhysUart i8250physuart;
-static Ctlr i8250ctlr[3] = {+static Ctlr i8250ctlr[2] = { { .io = Uart0,.irq = Uart0IRQ,
.tbdf = BUSUNKNOWN, },
@@ -131,13 +129,9 @@
{ .io = Uart1,.irq = Uart1IRQ,
.tbdf = BUSUNKNOWN, },
-
-{ .io = Uart2,- .irq = Uart2IRQ,
- .tbdf = BUSUNKNOWN, },
};
-static Uart i8250uart[3] = {+static Uart i8250uart[2] = { { .regs = &i8250ctlr[0],.name = "COM1",
.freq = UartFREQ,
@@ -150,13 +144,6 @@
.freq = UartFREQ,
.phys = &i8250physuart,
.special= 0,
- .next = &i8250uart[2], },
-
-{ .regs = &i8250ctlr[2],- .name = "COM3",
- .freq = UartFREQ,
- .phys = &i8250physuart,
- .special= 0,
.next = nil, },
};
@@ -704,21 +691,9 @@
if((p = getconf("console")) == nil)return;
n = strtoul(p, &cmd, 0);
- if(p == cmd)
+ if(p == cmd || n < 0 || n >= nelem(i8250uart))
return;
- switch(n){- default:
- return;
- case 0:
- uart = &i8250uart[0];
- break;
- case 1:
- uart = &i8250uart[1];
- break;
- case 2:
- uart = &i8250uart[2];
- break;
- }
+ uart = &i8250uart[n];
(*uart->phys->enable)(uart, 0);
uartctl(uart, "b9600 l8 pn s1");
@@ -727,29 +702,4 @@
consuart = uart;
uart->console = 1;
-}
-
-void
-i8250mouse(char* which, int (*putc)(Queue*, int), int setb1200)
-{- char *p;
- int port;
-
- port = strtol(which, &p, 0);
- if(p == which || port < 0 || port > 1)
- error(Ebadarg);
- uartmouse(&i8250uart[port], putc, setb1200);
-}
-
-void
-i8250setmouseputc(char* which, int (*putc)(Queue*, int))
-{- char *p;
- int port;
-
- port = strtol(which, &p, 0);
- if(p == which || port < 0 || port > 1)
- error(Ebadarg);
- uartsetmouseputc(&i8250uart[port], putc);
-
}
--- a/sys/src/9/port/devuart.c
+++ b/sys/src/9/port/devuart.c
@@ -121,9 +121,26 @@
iunlock(&uartalloc);
}
+static Uart*
+uartport(char *which)
+{+ int port;
+ char *p;
+
+ port = strtol(which, &p, 0);
+ if(p == which)
+ error(Ebadarg);
+ if(port < 0 || port >= uartnuart || uart[port] == nil)
+ error(Enodev);
+ return uart[port];
+}
+
void
-uartmouse(Uart* p, int (*putc)(Queue*, int), int setb1200)
+uartmouse(char *which, int (*putc)(Queue*, int), int setb1200)
{+ Uart *p;
+
+ p = uartport(which);
qlock(p);
if(p->opens++ == 0 && uartenable(p) == nil){qunlock(p);
@@ -137,8 +154,11 @@
}
void
-uartsetmouseputc(Uart* p, int (*putc)(Queue*, int))
+uartsetmouseputc(char *which, int (*putc)(Queue*, int))
{+ Uart *p;
+
+ p = uartport(which);
qlock(p);
if(p->opens == 0 || p->special == 0){qunlock(p);
--- a/sys/src/9/port/portfns.h
+++ b/sys/src/9/port/portfns.h
@@ -345,8 +345,8 @@
int uartctl(Uart*, char*);
int uartgetc(void);
void uartkick(void*);
-void uartmouse(Uart*, int (*)(Queue*, int), int);
-void uartsetmouseputc(Uart*, int (*)(Queue*, int));
+void uartmouse(char*, int (*)(Queue*, int), int);
+void uartsetmouseputc(char*, int (*)(Queue*, int));
void uartputc(int);
void uartputs(char*, int);
void uartrecv(Uart*, char);
--
⑨