diff options
author | damien <damien@FreeBSD.org> | 2006-03-10 20:35:09 +0000 |
---|---|---|
committer | damien <damien@FreeBSD.org> | 2006-03-10 20:35:09 +0000 |
commit | 799fc2f61586f2b1e4461425293eb78dd3e284d1 (patch) | |
tree | b89e3fd244c8374d7fd56d0fb9dfc9833c1e09fa /sys/dev | |
parent | fb0aee8aca913192998277dcd0cf396d6565801b (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/dev/iwi/if_iwi.c | 21 | ||||
-rw-r--r-- | sys/dev/iwi/if_iwireg.h | 2 |
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 { |