PERFORCE change 127085 for review
Andrew Thompson
thompsa at FreeBSD.org
Mon Oct 1 20:31:47 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=127085
Change 127085 by thompsa at thompsa_heff on 2007/10/02 03:30:52
- Remove dead code in ipw_newstate.
- send disassociate to the AP when going to INIT.
Affected files ...
.. //depot/projects/wifi/sys/dev/ipw/if_ipw.c#32 edit
.. //depot/projects/wifi/sys/dev/ipw/if_ipwvar.h#11 edit
Differences ...
==== //depot/projects/wifi/sys/dev/ipw/if_ipw.c#32 (text+ko) ====
@@ -136,9 +136,11 @@
static int ipw_reset(struct ipw_softc *);
static int ipw_load_ucode(struct ipw_softc *, const char *, int);
static int ipw_load_firmware(struct ipw_softc *, const char *, int);
+static int ipw_config(struct ipw_softc *);
static void ipw_assoc_task(void *, int);
static int ipw_auth_and_assoc(struct ipw_softc *);
-static int ipw_config(struct ipw_softc *);
+static void ipw_disassoc_task(void *, int);
+static int ipw_disassociate(struct ipw_softc *);
static void ipw_init_task(void *, int);
static void ipw_init(void *);
static void ipw_init_locked(struct ipw_softc *, int);
@@ -230,6 +232,7 @@
TASK_INIT(&sc->sc_init_task, 0, ipw_init_task, sc);
TASK_INIT(&sc->sc_scan_task, 0, ipw_scan_task, sc);
TASK_INIT(&sc->sc_assoc_task, 0, ipw_assoc_task, sc);
+ TASK_INIT(&sc->sc_disassoc_task, 0, ipw_disassoc_task, sc);
callout_init_mtx(&sc->sc_wdtimer, &sc->sc_mtx, 0);
if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
@@ -836,47 +839,26 @@
{
struct ifnet *ifp = ic->ic_ifp;
struct ipw_softc *sc = ifp->if_softc;
-#if 0
- struct ieee80211_node *ni;
- uint32_t len, error;
-#endif
DPRINTF(("%s: %s -> %s flags 0x%x\n", __func__,
ieee80211_state_name[ic->ic_state],
ieee80211_state_name[nstate], sc->flags));
switch (nstate) {
+ case IEEE80211_S_SCAN:
case IEEE80211_S_RUN:
-#if 0
- ni = ic->ic_bss;
- DELAY(200); /* firmware needs a short delay here */
-
- len = IEEE80211_ADDR_LEN;
- ipw_read_table2(sc, IPW_INFO_CURRENT_BSSID, ni->ni_bssid, &len);
- IEEE80211_ADDR_COPY(ni->ni_macaddr, ni->ni_bssid);
-
- if (ic->ic_opmode != IEEE80211_M_HOSTAP) {
- len = IEEE80211_NWID_LEN;
- error = ipw_read_table2(sc, IPW_INFO_CURRENT_SSID,
- ni->ni_essid, &len);
-
- if (error == 0) {
- ni->ni_esslen = len;
-#ifdef IPW_DEBUG
- if (ipw_debug > 0) {
- printf("Associated to ");
- ieee80211_print_essid(ni->ni_essid,
- ni->ni_esslen);
- printf("\n");
- }
-#endif
- }
- }
-#endif
return (*sc->sc_newstate)(ic, nstate, arg);
case IEEE80211_S_INIT:
- case IEEE80211_S_SCAN:
+ /*
+ * NB: don't try to do this if ipw_stop_master has
+ * shutdown the firmware and disabled interrupts.
+ */
+ if (ic->ic_state == IEEE80211_S_RUN &&
+ (sc->flags & IPW_FLAG_FW_INITED))
+ taskqueue_enqueue_fast(taskqueue_fast,
+ &sc->sc_disassoc_task);
+
return sc->sc_newstate(ic, nstate, arg);
case IEEE80211_S_AUTH:
@@ -896,7 +878,6 @@
default:
break;
}
-
ic->ic_state = nstate;
return 0;
@@ -2368,7 +2349,8 @@
}
/*
- * Handler for sc_scan_task. This is a simple wrapper around ipw_scan().
+ * Handler for sc_assoc_task. This is a simple wrapper around
+ * ipw_auth_and_assoc().
*/
static void
ipw_assoc_task(void *context, int pending)
@@ -2452,7 +2434,21 @@
return ipw_enable(sc); /* finally, enable adapter */
}
-#if 0
+/*
+ * Handler for sc_disassoc_task. This is a simple wrapper around
+ * ipw_disassociate().
+ */
+static void
+ipw_disassoc_task(void *context, int pending)
+{
+ struct ipw_softc *sc = context;
+ IPW_LOCK_DECL;
+
+ IPW_LOCK(sc);
+ ipw_disassociate(sc);
+ IPW_UNLOCK(sc);
+}
+
static int
ipw_disassociate(struct ipw_softc *sc)
{
@@ -2460,6 +2456,8 @@
struct ieee80211_node *ni = ic->ic_bss;
DPRINTF(("Disassociate from %6D\n", ni->ni_bssid, ":"));
+
+ sc->flags &= ~IPW_FLAG_ASSOCIATED;
/*
* NB: firmware currently ignores bssid parameter, but
* supply it in case this changes (follow linux driver).
@@ -2467,7 +2465,6 @@
return ipw_cmd(sc, IPW_CMD_DISASSOCIATE,
ni->ni_bssid, IEEE80211_ADDR_LEN);
}
-#endif
/*
* Handler for sc_init_task. This is a simple wrapper around ipw_init().
==== //depot/projects/wifi/sys/dev/ipw/if_ipwvar.h#11 (text+ko) ====
@@ -87,6 +87,7 @@
struct task sc_init_task;
struct task sc_scan_task;
struct task sc_assoc_task;
+ struct task sc_disassoc_task;
struct callout sc_wdtimer; /* watchdog timer */
uint32_t flags;
More information about the p4-projects
mailing list