summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorThorsten Lockert <tholo@cvs.openbsd.org>2001-04-16 00:40:41 +0000
committerThorsten Lockert <tholo@cvs.openbsd.org>2001-04-16 00:40:41 +0000
commit7d11e968d14985a063578f22eae2c4b6c6cc7235 (patch)
treeb14030bfb44e0fde542c6f0779ddbf8e68331052 /sys
parent41081a5e36043e797aac2eb8786cc12171991eb2 (diff)
Avoid resetting the interface when not needed; allows temporary WEP keys
to work. ALso optimize some interactions with the card. Fixes rest of PR 1754; ok deraadt@
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ic/an.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/sys/dev/ic/an.c b/sys/dev/ic/an.c
index 2354242c2da..ba7812f8acf 100644
--- a/sys/dev/ic/an.c
+++ b/sys/dev/ic/an.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: an.c,v 1.13 2001/02/27 06:48:28 tholo Exp $ */
+/* $OpenBSD: an.c,v 1.14 2001/04/16 00:40:40 tholo Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -262,6 +262,7 @@ an_attach(sc)
shutdownhook_establish(an_shutdown, sc);
+ an_reset(sc);
an_init(sc);
return(0);
@@ -503,7 +504,13 @@ an_cmd(sc, cmd, val)
int cmd;
int val;
{
- int i;
+ int i, stat;
+
+ /* make sure previous command completed */
+ if (CSR_READ_2(sc, AN_COMMAND) & AN_CMD_BUSY) {
+ printf("%s: command busy\n", sc->sc_dev.dv_xname);
+ CSR_WRITE_2(sc, AN_EVENT_ACK, AN_EV_CLR_STUCK_BUSY);
+ }
CSR_WRITE_2(sc, AN_PARAM0, val);
CSR_WRITE_2(sc, AN_PARAM1, 0);
@@ -522,30 +529,23 @@ an_cmd(sc, cmd, val)
}
}
}
-/* printf("<<cmd %x,%d>>", cmd, i); */
-#if 0
- DELAY(100);
- for (i = AN_TIMEOUT; i--; DELAY(100)) {
- int s = CSR_READ_2(sc, AN_STATUS);
- CSR_READ_2(sc, AN_RESP0);
- CSR_READ_2(sc, AN_RESP1);
- CSR_READ_2(sc, AN_RESP2);
- if ((s & AN_STAT_CMD_CODE) == (cmd & AN_STAT_CMD_CODE))
- break;
- }
-/*printf("<<resp %d, %x>>", i, s);*/
-#endif
- /* Ack the command */
- CSR_WRITE_2(sc, AN_EVENT_ACK, AN_EV_CMD);
+ stat = CSR_READ_2(sc, AN_STATUS);
+
+ /* clear stuck command busy if needed */
if (CSR_READ_2(sc, AN_COMMAND) & AN_CMD_BUSY) {
-/*printf("busy");*/
CSR_WRITE_2(sc, AN_EVENT_ACK, AN_EV_CLR_STUCK_BUSY);
}
+ /* Ack the command */
+ CSR_WRITE_2(sc, AN_EVENT_ACK, AN_EV_CMD);
+
if (i <= 0)
return(ETIMEDOUT);
+ if (stat & AN_STAT_CMD_RESULT)
+ return(EIO);
+
return(0);
}
@@ -955,6 +955,7 @@ an_ioctl(ifp, command, data)
!(ifp->if_flags & IFF_PROMISC) &&
sc->an_if_flags & IFF_PROMISC) {
an_promisc(sc, 0);
+ an_reset(sc);
}
an_init(sc);
} else {
@@ -1055,8 +1056,6 @@ an_init(sc)
if (ifp->if_flags & IFF_RUNNING)
an_stop(sc);
- an_reset(sc);
-
sc->an_associated = 0;
/* Allocate the TX buffers */