summaryrefslogtreecommitdiff
path: root/sys/dev/pci/if_iwi.c
diff options
context:
space:
mode:
authorDamien Bergamini <damien@cvs.openbsd.org>2004-12-04 19:40:38 +0000
committerDamien Bergamini <damien@cvs.openbsd.org>2004-12-04 19:40:38 +0000
commitb5cd79980aacfc5f262e6fcb04fcc260e882c843 (patch)
treef7dfffb28c5b349c437ee610f709b71ad3e0f02b /sys/dev/pci/if_iwi.c
parentd63ba887a7919cd1de85c5b319490db212ddd71c (diff)
- reorder interrupt handlers
- don't request ack's for multicast frames - fix short preamble support - clear nic memory on reset - fix ioctl SIOCGTABLE0
Diffstat (limited to 'sys/dev/pci/if_iwi.c')
-rw-r--r--sys/dev/pci/if_iwi.c48
1 files changed, 28 insertions, 20 deletions
diff --git a/sys/dev/pci/if_iwi.c b/sys/dev/pci/if_iwi.c
index ec8d9ba6aca..8261e061833 100644
--- a/sys/dev/pci/if_iwi.c
+++ b/sys/dev/pci/if_iwi.c
@@ -1,4 +1,4 @@
-/* $Id: if_iwi.c,v 1.16 2004/12/04 19:19:24 damien Exp $ */
+/* $Id: if_iwi.c,v 1.17 2004/12/04 19:40:37 damien Exp $ */
/*-
* Copyright (c) 2004
@@ -1008,6 +1008,16 @@ iwi_intr(void *arg)
DPRINTFN(8, ("INTR!0x%08x\n", r));
+ if (r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)) {
+ printf("%s: fatal error\n", sc->sc_dev.dv_xname);
+ iwi_stop(&sc->sc_ic.ic_if, 1);
+ }
+
+ if (r & IWI_INTR_FW_INITED) {
+ if (!(r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)))
+ wakeup(sc);
+ }
+
if (r & IWI_INTR_RX_TRANSFER)
iwi_rx_intr(sc);
@@ -1017,16 +1027,6 @@ iwi_intr(void *arg)
if (r & IWI_INTR_TX1_TRANSFER)
iwi_tx_intr(sc);
- if (r & IWI_INTR_FW_INITED) {
- if (!(r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)))
- wakeup(sc);
- }
-
- if (r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)) {
- printf("%s: fatal error\n", sc->sc_dev.dv_xname);
- iwi_stop(&sc->sc_ic.ic_if, 1);
- }
-
/* Acknowledge interrupts */
CSR_WRITE_4(sc, IWI_CSR_INTR, r);
@@ -1112,17 +1112,18 @@ iwi_tx_start(struct ifnet *ifp, struct mbuf *m, struct ieee80211_node *ni)
desc->hdr.flags = IWI_HDR_FLAG_IRQ;
desc->cmd = IWI_DATA_CMD_TX;
desc->len = htole16(m->m_pkthdr.len);
- desc->flags = IWI_DATA_FLAG_NEED_ACK;
+ desc->flags = IEEE80211_IS_MULTICAST(wh->i_addr1) ? 0 :
+ IWI_DATA_FLAG_NEED_ACK;
if (ic->ic_flags & IEEE80211_F_WEPON) {
wh->i_fc[1] |= IEEE80211_FC1_WEP;
desc->wep_txkey = ic->ic_wep_txkey;
} else
desc->flags |= IWI_DATA_FLAG_NO_WEP;
-#if 0
+
if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
desc->flags |= IWI_DATA_FLAG_SHPREAMBLE;
-#endif
+
bcopy(wh, &desc->wh, sizeof (struct ieee80211_frame));
desc->nseg = htole32(buf->map->dm_nsegs);
for (i = 0; i < buf->map->dm_nsegs; i++) {
@@ -1220,13 +1221,15 @@ iwi_get_table0(struct iwi_softc *sc, u_int32_t *tbl)
{
u_int32_t size, buf[128];
- if (!(sc->flags & IWI_FLAG_FW_INITED))
- return ENOTTY;
+ if (!(sc->flags & IWI_FLAG_FW_INITED)) {
+ bzero(buf, sizeof buf);
+ return copyout(buf, tbl, sizeof buf);
+ }
- size = CSR_READ_4(sc, IWI_CSR_TABLE0_SIZE);
+ size = min(CSR_READ_4(sc, IWI_CSR_TABLE0_SIZE), 128 - 1);
CSR_READ_REGION_4(sc, IWI_CSR_TABLE0_BASE, &buf[1], size);
- return copyout(buf, tbl, size * sizeof (u_int32_t));
+ return copyout(buf, tbl, sizeof buf);
}
int
@@ -1235,7 +1238,7 @@ iwi_get_radio(struct iwi_softc *sc, int *ret)
int val;
val = (CSR_READ_4(sc, IWI_CSR_IO) & IWI_IO_RADIO_ENABLED) ? 1 : 0;
- return copyout(&val, ret, sizeof (int));
+ return copyout(&val, ret, sizeof val);
}
int
@@ -1338,7 +1341,7 @@ iwi_stop_master(struct iwi_softc *sc)
int
iwi_reset(struct iwi_softc *sc)
{
- int ntries;
+ int i, ntries;
iwi_stop_master(sc);
@@ -1366,6 +1369,11 @@ iwi_reset(struct iwi_softc *sc)
CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
IWI_CTL_INIT);
+ /* clear NIC memory */
+ CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0);
+ for (i = 0; i < 0xc000; i++)
+ CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
+
return 0;
}