summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2013-04-01 00:44:20 +0000
committerian <ian@FreeBSD.org>2013-04-01 00:44:20 +0000
commit5b38501da66ed672b34922190744d3b78ac38915 (patch)
tree7e8822165fb7859a3446e9b064f7645e377504e3 /sys
parent720da1df6b6f787228bb96d6f4ea9475a9918504 (diff)
downloadFreeBSD-src-5b38501da66ed672b34922190744d3b78ac38915.zip
FreeBSD-src-5b38501da66ed672b34922190744d3b78ac38915.tar.gz
Fix low-level uart drivers that set their fifo sizes in the softc too late.
uart(4) allocates send and receiver buffers in attach() before it calls the low-level driver's attach routine. Many low-level drivers set the fifo sizes in their attach routine, which is too late. Other drivers set them in the probe() routine, so that they're available when uart(4) allocates buffers. This fixes the ones that were setting the values too late by moving the code to probe().
Diffstat (limited to 'sys')
-rw-r--r--sys/arm/s3c2xx0/uart_dev_s3c2410.c18
-rw-r--r--sys/arm/sa11x0/uart_dev_sa1110.c4
-rw-r--r--sys/dev/uart/uart_dev_imx.c6
-rw-r--r--sys/dev/uart/uart_dev_pl011.c6
-rw-r--r--sys/dev/uart/uart_dev_quicc.c6
-rw-r--r--sys/dev/uart/uart_dev_sab82532.c6
-rw-r--r--sys/dev/uart/uart_dev_z8530.c6
-rw-r--r--sys/mips/adm5120/uart_dev_adm5120.c6
-rw-r--r--sys/mips/rt305x/uart_dev_rt305x.c6
-rw-r--r--sys/sparc64/pci/sbbc.c24
10 files changed, 47 insertions, 41 deletions
diff --git a/sys/arm/s3c2xx0/uart_dev_s3c2410.c b/sys/arm/s3c2xx0/uart_dev_s3c2410.c
index 9bd9c4b..0f9f798 100644
--- a/sys/arm/s3c2xx0/uart_dev_s3c2410.c
+++ b/sys/arm/s3c2xx0/uart_dev_s3c2410.c
@@ -233,14 +233,6 @@ static kobj_method_t s3c2410_methods[] = {
int
s3c2410_bus_probe(struct uart_softc *sc)
{
- return (0);
-}
-
-static int
-s3c2410_bus_attach(struct uart_softc *sc)
-{
- uintptr_t irq;
-
switch(s3c2xx0_softc->sc_cpu) {
case CPU_S3C2410:
sc->sc_txfifosz = 16;
@@ -253,7 +245,15 @@ s3c2410_bus_attach(struct uart_softc *sc)
default:
return (ENXIO);
}
-
+
+ return (0);
+}
+
+static int
+s3c2410_bus_attach(struct uart_softc *sc)
+{
+ uintptr_t irq;
+
sc->sc_hwiflow = 0;
sc->sc_hwoflow = 0;
diff --git a/sys/arm/sa11x0/uart_dev_sa1110.c b/sys/arm/sa11x0/uart_dev_sa1110.c
index 59a1290..6765cf2 100644
--- a/sys/arm/sa11x0/uart_dev_sa1110.c
+++ b/sys/arm/sa11x0/uart_dev_sa1110.c
@@ -156,6 +156,8 @@ static kobj_method_t sa1110_methods[] = {
int
sa1110_bus_probe(struct uart_softc *sc)
{
+ sc->sc_txfifosz = 3;
+ sc->sc_rxfifosz = 1;
return (0);
}
@@ -164,8 +166,6 @@ sa1110_bus_attach(struct uart_softc *sc)
{
bcopy(&sc->sc_sysdev->bas, &sc->sc_bas, sizeof(sc->sc_bas));
- sc->sc_txfifosz = 3;
- sc->sc_rxfifosz = 1;
sc->sc_hwiflow = 0;
uart_setreg(&sc->sc_bas, SACOM_CR3, CR3_RXE | CR3_TXE | CR3_RIE | CR3_TIE);
return (0);
diff --git a/sys/dev/uart/uart_dev_imx.c b/sys/dev/uart/uart_dev_imx.c
index 81fe163..1651a9f 100644
--- a/sys/dev/uart/uart_dev_imx.c
+++ b/sys/dev/uart/uart_dev_imx.c
@@ -187,9 +187,6 @@ imx_uart_bus_attach(struct uart_softc *sc)
imx_uart_init(bas, 115200, 8, 1, 0);
}
- sc->sc_rxfifosz = 1;
- sc->sc_txfifosz = 1;
-
(void)imx_uart_bus_getsig(sc);
/* XXX workaround to have working console on manut prompt */
@@ -353,6 +350,9 @@ imx_uart_bus_probe(struct uart_softc *sc)
if (error)
return (error);
+ sc->sc_rxfifosz = 1;
+ sc->sc_txfifosz = 1;
+
device_set_desc(sc->sc_dev, "imx_uart");
return (0);
}
diff --git a/sys/dev/uart/uart_dev_pl011.c b/sys/dev/uart/uart_dev_pl011.c
index d71ab11..583dedf 100644
--- a/sys/dev/uart/uart_dev_pl011.c
+++ b/sys/dev/uart/uart_dev_pl011.c
@@ -278,9 +278,6 @@ uart_pl011_bus_attach(struct uart_softc *sc)
/* Clear RX & TX interrupts */
__uart_setreg(bas, UART_ICR, IMSC_MASK_ALL);
- sc->sc_rxfifosz = 1;
- sc->sc_txfifosz = 1;
-
return (0);
}
@@ -377,6 +374,9 @@ uart_pl011_bus_probe(struct uart_softc *sc)
device_set_desc(sc->sc_dev, "PrimeCell UART (PL011)");
+ sc->sc_rxfifosz = 1;
+ sc->sc_txfifosz = 1;
+
return (0);
}
diff --git a/sys/dev/uart/uart_dev_quicc.c b/sys/dev/uart/uart_dev_quicc.c
index df327a8..337591e 100644
--- a/sys/dev/uart/uart_dev_quicc.c
+++ b/sys/dev/uart/uart_dev_quicc.c
@@ -293,9 +293,6 @@ quicc_bus_attach(struct uart_softc *sc)
quicc_setup(bas, 9600, 8, 1, UART_PARITY_NONE);
}
- sc->sc_rxfifosz = 1;
- sc->sc_txfifosz = 1;
-
/* Enable interrupts on the receive buffer. */
rb = quicc_read2(bas, QUICC_PRAM_SCC_RBASE(bas->chan - 1));
st = quicc_read2(bas, rb);
@@ -417,6 +414,9 @@ quicc_bus_probe(struct uart_softc *sc)
if (error)
return (error);
+ sc->sc_rxfifosz = 1;
+ sc->sc_txfifosz = 1;
+
snprintf(buf, sizeof(buf), "quicc, channel %d", sc->sc_bas.chan);
device_set_desc_copy(sc->sc_dev, buf);
return (0);
diff --git a/sys/dev/uart/uart_dev_sab82532.c b/sys/dev/uart/uart_dev_sab82532.c
index 11cdb4b..e2ec227 100644
--- a/sys/dev/uart/uart_dev_sab82532.c
+++ b/sys/dev/uart/uart_dev_sab82532.c
@@ -407,9 +407,6 @@ sab82532_bus_attach(struct uart_softc *sc)
if (sc->sc_sysdev == NULL)
sab82532_init(bas, 9600, 8, 1, UART_PARITY_NONE);
- sc->sc_rxfifosz = 32;
- sc->sc_txfifosz = 32;
-
imr0 = SAB_IMR0_TCD|SAB_IMR0_TIME|SAB_IMR0_CDSC|SAB_IMR0_RFO|
SAB_IMR0_RPF;
uart_setreg(bas, SAB_IMR0, 0xff & ~imr0);
@@ -592,6 +589,9 @@ sab82532_bus_probe(struct uart_softc *sc)
if (error)
return (error);
+ sc->sc_rxfifosz = 32;
+ sc->sc_txfifosz = 32;
+
ch = sc->sc_bas.chan - 1 + 'A';
switch (uart_getreg(&sc->sc_bas, SAB_VSTR) & SAB_VSTR_VMASK) {
diff --git a/sys/dev/uart/uart_dev_z8530.c b/sys/dev/uart/uart_dev_z8530.c
index 33bacdc..f948b26 100644
--- a/sys/dev/uart/uart_dev_z8530.c
+++ b/sys/dev/uart/uart_dev_z8530.c
@@ -332,9 +332,6 @@ z8530_bus_attach(struct uart_softc *sc)
}
z8530->txidle = 1; /* Report SER_INT_TXIDLE. */
- sc->sc_rxfifosz = 3;
- sc->sc_txfifosz = 1;
-
(void)z8530_bus_getsig(sc);
uart_setmreg(bas, WR_IC, IC_BRK | IC_CTS | IC_DCD);
@@ -515,6 +512,9 @@ z8530_bus_probe(struct uart_softc *sc)
if (error)
return (error);
+ sc->sc_rxfifosz = 3;
+ sc->sc_txfifosz = 1;
+
ch = sc->sc_bas.chan - 1 + 'A';
snprintf(buf, sizeof(buf), "z8530, channel %c", ch);
diff --git a/sys/mips/adm5120/uart_dev_adm5120.c b/sys/mips/adm5120/uart_dev_adm5120.c
index 8775389..9f2dc02 100644
--- a/sys/mips/adm5120/uart_dev_adm5120.c
+++ b/sys/mips/adm5120/uart_dev_adm5120.c
@@ -221,9 +221,6 @@ adm5120_uart_bus_attach(struct uart_softc *sc)
/* TODO: set parameters 115200, 8N1 */
}
- sc->sc_rxfifosz = 16;
- sc->sc_txfifosz = 16;
-
(void)adm5120_uart_bus_getsig(sc);
#if 1
@@ -367,6 +364,9 @@ adm5120_uart_bus_probe(struct uart_softc *sc)
if (error)
return (error);
+ sc->sc_rxfifosz = 16;
+ sc->sc_txfifosz = 16;
+
ch = sc->sc_bas.chan + 'A';
snprintf(buf, sizeof(buf), "adm5120_uart, channel %c", ch);
diff --git a/sys/mips/rt305x/uart_dev_rt305x.c b/sys/mips/rt305x/uart_dev_rt305x.c
index 677c0c6..94d0386 100644
--- a/sys/mips/rt305x/uart_dev_rt305x.c
+++ b/sys/mips/rt305x/uart_dev_rt305x.c
@@ -272,9 +272,6 @@ rt305x_uart_bus_attach(struct uart_softc *sc)
rt305x_uart_init(bas, 115200, 8, 1, 0);
}
- sc->sc_rxfifosz = 16;
- sc->sc_txfifosz = 16;
-
(void)rt305x_uart_bus_getsig(sc);
/* Enable FIFO */
@@ -438,6 +435,9 @@ rt305x_uart_bus_probe(struct uart_softc *sc)
if (error)
return (error);
+ sc->sc_rxfifosz = 16;
+ sc->sc_txfifosz = 16;
+
snprintf(buf, sizeof(buf), "rt305x_uart");
device_set_desc_copy(sc->sc_dev, buf);
diff --git a/sys/sparc64/pci/sbbc.c b/sys/sparc64/pci/sbbc.c
index 218093f..c19fb71 100644
--- a/sys/sparc64/pci/sbbc.c
+++ b/sys/sparc64/pci/sbbc.c
@@ -835,13 +835,6 @@ sbbc_uart_bus_attach(struct uart_softc *sc)
bst = bas->bst;
bsh = bas->bsh;
- sc->sc_rxfifosz = SBBC_SRAM_READ_4(sbbc_solcons +
- SBBC_CONS_OFF(cons_in_end)) - SBBC_SRAM_READ_4(sbbc_solcons +
- SBBC_CONS_OFF(cons_in_begin)) - 1;
- sc->sc_txfifosz = SBBC_SRAM_READ_4(sbbc_solcons +
- SBBC_CONS_OFF(cons_out_end)) - SBBC_SRAM_READ_4(sbbc_solcons +
- SBBC_CONS_OFF(cons_out_begin)) - 1;
-
uart_lock(sc->sc_hwmtx);
/*
@@ -995,11 +988,24 @@ sbbc_uart_bus_param(struct uart_softc *sc __unused, int baudrate __unused,
}
static int
-sbbc_uart_bus_probe(struct uart_softc *sc __unused)
+sbbc_uart_bus_probe(struct uart_softc *sc)
{
+ struct uart_bas *bas;
+ bus_space_tag_t bst;
+ bus_space_handle_t bsh;
- if (sbbc_console != 0)
+ if (sbbc_console != 0) {
+ bas = &sc->sc_bas;
+ bst = bas->bst;
+ bsh = bas->bsh;
+ sc->sc_rxfifosz = SBBC_SRAM_READ_4(sbbc_solcons +
+ SBBC_CONS_OFF(cons_in_end)) - SBBC_SRAM_READ_4(sbbc_solcons +
+ SBBC_CONS_OFF(cons_in_begin)) - 1;
+ sc->sc_txfifosz = SBBC_SRAM_READ_4(sbbc_solcons +
+ SBBC_CONS_OFF(cons_out_end)) - SBBC_SRAM_READ_4(sbbc_solcons +
+ SBBC_CONS_OFF(cons_out_begin)) - 1;
return (0);
+ }
return (ENXIO);
}
OpenPOWER on IntegriCloud