summaryrefslogtreecommitdiffstats
path: root/sys/dev/iwi
diff options
context:
space:
mode:
authordamien <damien@FreeBSD.org>2006-03-10 20:35:09 +0000
committerdamien <damien@FreeBSD.org>2006-03-10 20:35:09 +0000
commit799fc2f61586f2b1e4461425293eb78dd3e284d1 (patch)
treeb89e3fd244c8374d7fd56d0fb9dfc9833c1e09fa /sys/dev/iwi
parentfb0aee8aca913192998277dcd0cf396d6565801b (diff)
downloadFreeBSD-src-799fc2f61586f2b1e4461425293eb78dd3e284d1.zip
FreeBSD-src-799fc2f61586f2b1e4461425293eb78dd3e284d1.tar.gz
o acknowledge interrupts early in the interrupt handler
o stop processing interrupts after a firmware fatal error or a radio kill o clarify the possible values for the 'antenna' sysctl. o by default, let the firmware do antenna diversity. the firmware will periodically switch to another antenna to evaluate the signal quality.
Diffstat (limited to 'sys/dev/iwi')
-rw-r--r--sys/dev/iwi/if_iwi.c21
-rw-r--r--sys/dev/iwi/if_iwireg.h2
2 files changed, 13 insertions, 10 deletions
diff --git a/sys/dev/iwi/if_iwi.c b/sys/dev/iwi/if_iwi.c
index 524d81e..e594acc 100644
--- a/sys/dev/iwi/if_iwi.c
+++ b/sys/dev/iwi/if_iwi.c
@@ -401,7 +401,7 @@ iwi_attach(device_t dev)
*/
sc->dwelltime = 100;
sc->bluetooth = 1;
- sc->antenna = 0;
+ sc->antenna = 2;
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "radio",
@@ -419,12 +419,14 @@ iwi_attach(device_t dev)
"channel dwell time (ms) for AP/station scanning");
SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
- SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "bluetooth",
- CTLFLAG_RW, &sc->bluetooth, 0, "bluetooth coexistence");
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
+ "bluetooth", CTLFLAG_RW, &sc->bluetooth, 0,
+ "bluetooth coexistence");
SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "antenna",
- CTLFLAG_RW, &sc->antenna, 0, "antenna (0=auto)");
+ CTLFLAG_RW, &sc->antenna, 0,
+ "antenna (0=auto,1=A,3=B,2=diversity)");
/*
* Hook our interrupt after all initialization is complete.
@@ -1417,11 +1419,14 @@ iwi_intr(void *arg)
/* disable interrupts */
CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
+ /* acknowledge interrupts */
+ CSR_WRITE_4(sc, IWI_CSR_INTR, r);
if (r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)) {
device_printf(sc->sc_dev, "fatal error\n");
sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
iwi_stop(sc);
+ r = 0; /* don't process more interrupts */
}
if (r & IWI_INTR_FW_INITED) {
@@ -1433,6 +1438,7 @@ iwi_intr(void *arg)
DPRINTF(("radio transmitter turned off\n"));
sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
iwi_stop(sc);
+ r = 0; /* don't process more interrupts */
}
if (r & IWI_INTR_CMD_DONE)
@@ -1453,9 +1459,6 @@ iwi_intr(void *arg)
if (r & IWI_INTR_RX_DONE)
iwi_rx_intr(sc);
- /* acknowledge interrupts */
- CSR_WRITE_4(sc, IWI_CSR_INTR, r);
-
/* re-enable interrupts */
CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, IWI_INTR_MASK);
@@ -2451,7 +2454,7 @@ iwi_init(void *priv)
hdr = (const struct iwi_firmware_hdr *)fp->data;
if (fp->datasize < sizeof *hdr + le32toh(hdr->bootsz) +
- le32toh(hdr->ucodesz) + le32toh(hdr->fwsz)) {
+ le32toh(hdr->ucodesz) + le32toh(hdr->mainsz)) {
device_printf(sc->sc_dev,
"firmware image too short: %d bytes\n", fp->datasize);
goto fail2;
@@ -2500,7 +2503,7 @@ iwi_init(void *priv)
fw = (const char *)fp->data + sizeof *hdr + le32toh(hdr->bootsz) +
le32toh(hdr->ucodesz);
- if (iwi_load_firmware(sc, fw, le32toh(hdr->fwsz)) != 0) {
+ if (iwi_load_firmware(sc, fw, le32toh(hdr->mainsz)) != 0) {
device_printf(sc->sc_dev, "could not load main firmware\n");
goto fail2;
}
diff --git a/sys/dev/iwi/if_iwireg.h b/sys/dev/iwi/if_iwireg.h
index 55f50e4..4461986 100644
--- a/sys/dev/iwi/if_iwireg.h
+++ b/sys/dev/iwi/if_iwireg.h
@@ -132,7 +132,7 @@ struct iwi_firmware_hdr {
uint32_t version;
uint32_t bootsz;
uint32_t ucodesz;
- uint32_t fwsz;
+ uint32_t mainsz;
} __packed;
struct iwi_hdr {
OpenPOWER on IntegriCloud