PERFORCE change 139481 for review
Sam Leffler
sam at FreeBSD.org
Sun Apr 6 22:51:56 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=139481
Change 139481 by sam at sam_ebb on 2008/04/06 22:51:46
Shuffle some more code to make the firmware happy:
o configuring the adapter cannot be done on each entry to the
SCAN state; we must enable the adapter only once after loading
firmware so strip down iwi_config to just setup parameters that
are vap-independent and call it from iwi_init
o move work that used to be done in iwi_config to iwi_auth_and_assoc
where it makes more sense (and we have a vap as parameters like
rtsthreshold are vap-specific)
o change DISASSOC request issues on RUN->INIT state change to also
send a frame to the AP
o add debug msg to iwi_ops to see the deferred ops being run
o widen the cmd arg to unsigned long so we can pass maxdwell using
it instead of having a special sc_maxdwell mechanism
o change IWI_* defs to integers instead of bits; can't see a reason
why they were as they were and having them small values means we
can setup an array of strings to debugging
I can now roam between wpa-enabled ap's.
Affected files ...
.. //depot/projects/vap/sys/dev/iwi/if_iwi.c#19 edit
.. //depot/projects/vap/sys/dev/iwi/if_iwivar.h#12 edit
Differences ...
==== //depot/projects/vap/sys/dev/iwi/if_iwi.c#19 (text+ko) ====
@@ -180,7 +180,7 @@
static int iwi_load_ucode(struct iwi_softc *, const struct iwi_fw *);
static int iwi_load_firmware(struct iwi_softc *, const struct iwi_fw *);
static void iwi_release_fw_dma(struct iwi_softc *sc);
-static int iwi_config(struct iwi_softc *, struct ieee80211vap *);
+static int iwi_config(struct iwi_softc *);
static int iwi_get_firmware(struct iwi_softc *, enum ieee80211_opmode);
static void iwi_put_firmware(struct iwi_softc *);
static int iwi_scanchan(struct iwi_softc *, unsigned long, int);
@@ -194,7 +194,7 @@
#endif
static void iwi_scan_mindwell(struct ieee80211_scan_state *);
static void iwi_ops(void *, int);
-static int iwi_queue_cmd(struct iwi_softc *, int, int);
+static int iwi_queue_cmd(struct iwi_softc *, int, unsigned long);
static int iwi_auth_and_assoc(struct iwi_softc *, struct ieee80211vap *);
static int iwi_disassociate(struct iwi_softc *, int quiet);
static void iwi_init(void *);
@@ -1001,14 +1001,9 @@
*/
if (vap->iv_state == IEEE80211_S_RUN &&
(sc->flags & IWI_FLAG_FW_INITED))
- iwi_queue_cmd(sc, IWI_DISASSOC, 0);
+ iwi_queue_cmd(sc, IWI_DISASSOC, 1);
IWI_UNLOCK(sc);
break;
- case IEEE80211_S_SCAN:
- if (vap->iv_state != IEEE80211_S_INIT)
- break;
- iwi_queue_cmd(sc, IWI_CONFIG, 0);
- return EINPROGRESS;
case IEEE80211_S_AUTH:
iwi_queue_cmd(sc, IWI_AUTH, arg);
return EINPROGRESS;
@@ -2575,7 +2570,7 @@
}
static int
-iwi_config(struct iwi_softc *sc, struct ieee80211vap *vap)
+iwi_config(struct iwi_softc *sc)
{
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
@@ -2587,9 +2582,9 @@
IWI_LOCK_ASSERT(sc);
- IEEE80211_ADDR_COPY(vap->iv_myaddr, IF_LLADDR(ifp));
- DPRINTF(("Setting MAC address to %6D\n", vap->iv_myaddr, ":"));
- error = iwi_cmd(sc, IWI_CMD_SET_MAC_ADDRESS, vap->iv_myaddr,
+ IEEE80211_ADDR_COPY(ic->ic_myaddr, IF_LLADDR(ifp));
+ DPRINTF(("Setting MAC address to %6D\n", ic->ic_myaddr, ":"));
+ error = iwi_cmd(sc, IWI_CMD_SET_MAC_ADDRESS, ic->ic_myaddr,
IEEE80211_ADDR_LEN);
if (error != 0)
return error;
@@ -2599,31 +2594,14 @@
config.silence_threshold = 0x1e;
config.antenna = sc->antenna;
config.multicast_enabled = 1;
- config.answer_pbreq = (vap->iv_opmode == IEEE80211_M_IBSS) ? 1 : 0;
+ config.answer_pbreq = (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
config.disable_unicast_decryption = 1;
config.disable_multicast_decryption = 1;
DPRINTF(("Configuring adapter\n"));
error = iwi_cmd(sc, IWI_CMD_SET_CONFIG, &config, sizeof config);
if (error != 0)
return error;
-
- error = iwi_setpowermode(sc, vap);
- if (error != 0)
- return error;
-
- data = htole32(vap->iv_rtsthreshold);
- DPRINTF(("Setting RTS threshold to %u\n", le32toh(data)));
- error = iwi_cmd(sc, IWI_CMD_SET_RTS_THRESHOLD, &data, sizeof data);
- if (error != 0)
- return error;
-
- data = htole32(vap->iv_fragthreshold);
- DPRINTF(("Setting fragmentation threshold to %u\n", le32toh(data)));
- error = iwi_cmd(sc, IWI_CMD_SET_FRAG_THRESHOLD, &data, sizeof data);
- if (error != 0)
- return error;
-
- if (vap->iv_opmode == IEEE80211_M_IBSS) {
+ if (ic->ic_opmode == IEEE80211_M_IBSS) {
power.mode = IWI_MODE_11B;
power.nchan = 11;
for (i = 0; i < 11; i++) {
@@ -2664,32 +2642,12 @@
if (error != 0)
return error;
- /* if we have a desired ESSID, set it now */
- if (vap->iv_des_ssid[0].len != 0) {
-#ifdef IWI_DEBUG
- if (iwi_debug > 0) {
- printf("Setting desired ESSID to ");
- ieee80211_print_essid(vap->iv_des_ssid[0].ssid,
- vap->iv_des_ssid[0].len);
- printf("\n");
- }
-#endif
- error = iwi_cmd(sc, IWI_CMD_SET_ESSID, vap->iv_des_ssid[0].ssid,
- vap->iv_des_ssid[0].len);
- if (error != 0)
- return error;
- }
-
data = htole32(arc4random());
DPRINTF(("Setting initialization vector to %u\n", le32toh(data)));
error = iwi_cmd(sc, IWI_CMD_SET_IV, &data, sizeof data);
if (error != 0)
return error;
- error = iwi_setwepkeys(sc, vap);
- if (error != 0)
- return error;
-
/* enable adapter */
DPRINTF(("Enabling adapter\n"));
return iwi_cmd(sc, IWI_CMD_ENABLE, NULL, 0);
@@ -2880,6 +2838,7 @@
struct iwi_associate *assoc = &sc->assoc;
struct iwi_rateset rs;
uint16_t capinfo;
+ uint32_t data;
int error, mode;
IWI_LOCK_ASSERT(sc);
@@ -2928,6 +2887,22 @@
if (error != 0)
goto done;
+ error = iwi_setpowermode(sc, vap);
+ if (error != 0)
+ goto done;
+
+ data = htole32(vap->iv_rtsthreshold);
+ DPRINTF(("Setting RTS threshold to %u\n", le32toh(data)));
+ error = iwi_cmd(sc, IWI_CMD_SET_RTS_THRESHOLD, &data, sizeof data);
+ if (error != 0)
+ goto done;
+
+ data = htole32(vap->iv_fragthreshold);
+ DPRINTF(("Setting fragmentation threshold to %u\n", le32toh(data)));
+ error = iwi_cmd(sc, IWI_CMD_SET_FRAG_THRESHOLD, &data, sizeof data);
+ if (error != 0)
+ goto done;
+
/* the rate set has already been "negotiated" */
memset(&rs, 0, sizeof rs);
rs.mode = mode;
@@ -3190,18 +3165,24 @@
}
sc->flags |= IWI_FLAG_FW_INITED;
+ IWI_STATE_END(sc, IWI_FW_LOADING);
+
+ if (iwi_config(sc) != 0) {
+ device_printf(sc->sc_dev, "unable to enable adapter\n");
+ goto fail2;
+ }
+
callout_reset(&sc->sc_wdtimer, hz, iwi_watchdog, sc);
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
ifp->if_drv_flags |= IFF_DRV_RUNNING;
- IWI_STATE_END(sc, IWI_FW_LOADING);
-
IWI_UNLOCK(sc);
ieee80211_start_all(ic); /* start all vap's */
return;
fail:
IWI_STATE_END(sc, IWI_FW_LOADING);
+fail2:
iwi_stop_locked(sc);
IWI_UNLOCK(sc);
}
@@ -3545,23 +3526,35 @@
static void
iwi_ops(void *arg0, int npending)
{
+ static const char *opnames[] = {
+ [IWI_CMD_FREE] = "FREE",
+ [IWI_SCAN_START] = "SCAN_START",
+ [IWI_SET_CHANNEL] = "SET_CHANNEL",
+ [IWI_AUTH] = "AUTH",
+ [IWI_ASSOC] = "ASSOC",
+ [IWI_DISASSOC] = "DISASSOC",
+ [IWI_SCAN_CURCHAN] = "SCAN_CURCHAN",
+ [IWI_SCAN_ALLCHAN] = "SCAN_ALLCHAN",
+ [IWI_SET_WME] = "SET_WME",
+ };
struct iwi_softc *sc = arg0;
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
IWI_LOCK_DECL;
- int cmd, arg;
+ int cmd;
+ unsigned long arg;
again:
IWI_CMD_LOCK(sc);
cmd = sc->sc_cmd[sc->sc_cmd_cur];
- if (cmd == 0) {
+ if (cmd == IWI_CMD_FREE) {
/* No more commands to process */
IWI_CMD_UNLOCK(sc);
return;
}
- arg = sc->sc_cmd[sc->sc_cmd_cur];
- sc->sc_cmd[sc->sc_cmd_cur] = 0; /* free the slot */
+ arg = sc->sc_arg[sc->sc_cmd_cur];
+ sc->sc_cmd[sc->sc_cmd_cur] = IWI_CMD_FREE; /* free the slot */
sc->sc_cmd_cur = (sc->sc_cmd_cur + 1) % IWI_CMD_MAXOPS;
IWI_CMD_UNLOCK(sc);
@@ -3575,17 +3568,8 @@
return;
}
+ DPRINTF(("%s: %s arg %lu\n", __func__, opnames[cmd], arg));
switch (cmd) {
- case IWI_CONFIG:
- iwi_config(sc, vap);
- IWI_UNLOCK(sc);
- IEEE80211_LOCK(ic);
- IWI_VAP(vap)->iwi_newstate(vap, IEEE80211_S_SCAN, arg);
- if (vap->iv_newstate_cb != NULL)
- vap->iv_newstate_cb(vap, IEEE80211_S_SCAN, arg);
- IEEE80211_UNLOCK(ic);
- IWI_LOCK(sc);
- break;
case IWI_AUTH:
case IWI_ASSOC:
if (cmd == IWI_AUTH)
@@ -3612,7 +3596,7 @@
__func__));
goto done;
}
- if (iwi_scanchan(sc, sc->sc_maxdwell, cmd))
+ if (iwi_scanchan(sc, arg, cmd))
ieee80211_cancel_scan(vap);
break;
}
@@ -3624,7 +3608,7 @@
}
static int
-iwi_queue_cmd(struct iwi_softc *sc, int cmd, int arg)
+iwi_queue_cmd(struct iwi_softc *sc, int cmd, unsigned long arg)
{
IWI_CMD_LOCK(sc);
if (sc->sc_cmd[sc->sc_cmd_next] != 0) {
@@ -3666,8 +3650,7 @@
struct ifnet *ifp = vap->iv_ic->ic_ifp;
struct iwi_softc *sc = ifp->if_softc;
- sc->sc_maxdwell = maxdwell;
- iwi_queue_cmd(sc, IWI_SCAN_CURCHAN, 0);
+ iwi_queue_cmd(sc, IWI_SCAN_CURCHAN, maxdwell);
}
#if 0
@@ -3677,8 +3660,7 @@
struct ifnet *ifp = ic->ic_ifp;
struct iwi_softc *sc = ifp->if_softc;
- sc->sc_maxdwell = maxdwell;
- iwi_queue_cmd(sc, IWI_SCAN_ALLCHAN, 0);
+ iwi_queue_cmd(sc, IWI_SCAN_ALLCHAN, maxdwell);
}
#endif
==== //depot/projects/vap/sys/dev/iwi/if_iwivar.h#12 (text+ko) ====
@@ -220,22 +220,20 @@
int sc_state_timer; /* firmware state timer */
int sc_busy_timer; /* firmware cmd timer */
-#define IWI_SCAN_START (1 << 0)
-#define IWI_SET_CHANNEL (1 << 1)
-#define IWI_SCAN_END (1 << 2)
-#define IWI_CONFIG (1 << 3)
-#define IWI_AUTH (1 << 4)
-#define IWI_ASSOC (1 << 5)
-#define IWI_DISASSOC (1 << 6)
-#define IWI_SCAN_CURCHAN (1 << 7)
-#define IWI_SCAN_ALLCHAN (1 << 8)
-#define IWI_SET_WME (1 << 9)
#define IWI_CMD_MAXOPS 10
int sc_cmd[IWI_CMD_MAXOPS];
- int sc_arg[IWI_CMD_MAXOPS];
+ unsigned long sc_arg[IWI_CMD_MAXOPS];
int sc_cmd_cur; /* current queued scan task */
int sc_cmd_next; /* last queued scan task */
- unsigned long sc_maxdwell; /* max dwell time for curchan */
+#define IWI_CMD_FREE 0 /* for marking slots unused */
+#define IWI_SCAN_START 1
+#define IWI_SET_CHANNEL 2
+#define IWI_AUTH 3
+#define IWI_ASSOC 4
+#define IWI_DISASSOC 5
+#define IWI_SCAN_CURCHAN 6
+#define IWI_SCAN_ALLCHAN 7
+#define IWI_SET_WME 8
struct iwi_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;
More information about the p4-projects
mailing list