From owner-p4-projects@FreeBSD.ORG Sun Sep 30 10:10:12 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 67CEB16A46B; Sun, 30 Sep 2007 10:10:12 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0DCA316A421 for ; Sun, 30 Sep 2007 10:10:12 +0000 (UTC) (envelope-from thompsa@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 0E4DF13C457 for ; Sun, 30 Sep 2007 10:10:12 +0000 (UTC) (envelope-from thompsa@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l8UAAChp065673 for ; Sun, 30 Sep 2007 10:10:12 GMT (envelope-from thompsa@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l8UAABNv065670 for perforce@freebsd.org; Sun, 30 Sep 2007 10:10:11 GMT (envelope-from thompsa@freebsd.org) Date: Sun, 30 Sep 2007 10:10:11 GMT Message-Id: <200709301010.l8UAABNv065670@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to thompsa@freebsd.org using -f From: Andrew Thompson To: Perforce Change Reviews Cc: Subject: PERFORCE change 127009 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 30 Sep 2007 10:10:12 -0000 http://perforce.freebsd.org/chv.cgi?CH=127009 Change 127009 by thompsa@thompsa_heff on 2007/09/30 10:09:51 - Use our own watchdog - Add WPA support again - Add more scan hacks and tricks - Put msdu tx rates back in Obtained from: sams ipw changes Affected files ... .. //depot/projects/wifi/sys/dev/ipw/if_ipw.c#27 edit .. //depot/projects/wifi/sys/dev/ipw/if_ipwreg.h#7 edit .. //depot/projects/wifi/sys/dev/ipw/if_ipwvar.h#9 edit Differences ... ==== //depot/projects/wifi/sys/dev/ipw/if_ipw.c#27 (text+ko) ==== @@ -126,7 +126,7 @@ static int ipw_tx_start(struct ifnet *, struct mbuf *, struct ieee80211_node *); static void ipw_start(struct ifnet *); -static void ipw_watchdog(struct ifnet *); +static void ipw_watchdog(void *); static int ipw_ioctl(struct ifnet *, u_long, caddr_t); static void ipw_stop_master(struct ipw_softc *); static int ipw_enable(struct ipw_softc *); @@ -226,6 +226,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); + callout_init_mtx(&sc->sc_wdtimer, &sc->sc_mtx, 0); if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) { device_printf(dev, "chip is in D%d power mode " @@ -279,7 +280,6 @@ ifp->if_init = ipw_init; ifp->if_ioctl = ipw_ioctl; ifp->if_start = ipw_start; - ifp->if_watchdog = ipw_watchdog; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; IFQ_SET_READY(&ifp->if_snd); @@ -290,11 +290,12 @@ ic->ic_state = IEEE80211_S_INIT; /* set device capabilities */ - ic->ic_caps = - IEEE80211_C_IBSS | /* IBSS mode supported */ - IEEE80211_C_MONITOR | /* monitor mode supported */ - IEEE80211_C_TXPMGT | /* tx power management */ - IEEE80211_C_SHPREAMBLE; /* short preamble supported */ + ic->ic_caps = IEEE80211_C_IBSS /* IBSS mode supported */ + | IEEE80211_C_MONITOR /* monitor mode supported */ + | IEEE80211_C_PMGT /* power save supported */ + | IEEE80211_C_SHPREAMBLE /* short preamble supported */ + | IEEE80211_C_WPA /* 802.11i supported */ + ; /* read MAC address from EEPROM */ val = ipw_read_prom_word(sc, IPW_EEPROM_MAC + 0); @@ -395,6 +396,7 @@ struct ifnet *ifp = ic->ic_ifp; ipw_stop(sc); + callout_drain(&sc->sc_wdtimer); if (ifp != NULL) { bpfdetach(ifp); @@ -966,7 +968,7 @@ cmd = mtod(sbuf->m, struct ipw_cmd *); - DPRINTFN(4, ("cmd ack'ed %s(%u, %u, %u, %u, %u)\n", + DPRINTFN(9, ("cmd ack'ed %s(%u, %u, %u, %u, %u)\n", ipw_cmdname(le32toh(cmd->type)), le32toh(cmd->type), le32toh(cmd->subtype), le32toh(cmd->seq), le32toh(cmd->len), le32toh(cmd->status))); @@ -1012,11 +1014,23 @@ break; case IPW_STATE_SCAN_COMPLETE: + /* + * XXX For some reason scan requests generate scan + * started + scan done events before any traffic is + * received (e.g. probe response frames). We work + * around this by marking the HACK flag and skipping + * the first scan complete event. + */ + if (sc->flags & IPW_FLAG_HACK) { + sc->flags &= ~IPW_FLAG_HACK; + break; + } DPRINTFN(3, ("Scan complete (%s flags 0x%x)\n", IEEESTATE(ic), sc->flags)); if (sc->flags & IPW_FLAG_SCANNING) { ieee80211_scan_done(ic); sc->flags &= ~IPW_FLAG_SCANNING; + sc->sc_scan_timer = 0; } break; @@ -1185,7 +1199,7 @@ bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m); } - if (ic->ic_state == IEEE80211_S_SCAN) + if (sc->flags & IPW_FLAG_SCANNING) ipw_fix_channel(sc, m); wh = mtod(m, struct ieee80211_frame *); @@ -1407,12 +1421,13 @@ { IPW_CMD_SET_ESSID, "SET_ESSID" }, { IPW_CMD_SET_FRAG_THRESHOLD, "SET_FRAG_THRESHOLD" }, { IPW_CMD_SET_MAC_ADDRESS, "SET_MAC_ADDRESS" }, - { IPW_CMD_SET_MANDATORY_BSSID, "SET_MANDATORY_BSSID" }, + { IPW_CMD_SET_MANDATORY_BSSID, "SET_MANDATORY_BSSID" }, { IPW_CMD_SET_MODE, "SET_MODE" }, + { IPW_CMD_SET_MSDU_TX_RATES, "SET_MSDU_TX_RATES" }, { IPW_CMD_SET_POWER_MODE, "SET_POWER_MODE" }, { IPW_CMD_SET_RTS_THRESHOLD, "SET_RTS_THRESHOLD" }, { IPW_CMD_SET_SCAN_OPTIONS, "SET_SCAN_OPTIONS" }, - { IPW_CMD_SET_SECURITY_INFORMATION, "SET_SECURITY_INFO" }, + { IPW_CMD_SET_SECURITY_INFO, "SET_SECURITY_INFO" }, { IPW_CMD_SET_TX_POWER_INDEX, "SET_TX_POWER_INDEX" }, { IPW_CMD_SET_TX_RATES, "SET_TX_RATES" }, { IPW_CMD_SET_WEP_FLAGS, "SET_WEP_FLAGS" }, @@ -1478,8 +1493,19 @@ bus_dmamap_sync(sc->cmd_dmat, sc->cmd_map, BUS_DMASYNC_PREWRITE); bus_dmamap_sync(sc->tbd_dmat, sc->tbd_map, BUS_DMASYNC_PREWRITE); - DPRINTFN(4, ("sending %s(%u, %u, %u, %u)\n", - ipw_cmdname(type), type, 0, 0, len)); +#ifdef IPW_DEBUG + if (ipw_debug >= 4) { + printf("sending %s(%u, %u, %u, %u)", ipw_cmdname(type), type, + 0, 0, len); + /* Print the data buffer in the higher debug level */ + if (ipw_debug >= 9 && len > 0) { + printf(" data: 0x"); + for (int i = 1; i <= len; i++) + printf("%1D", (char *)data + len - i, ""); + } + printf("\n"); + } +#endif /* kick firmware */ sc->txfree--; @@ -1703,20 +1729,19 @@ /* start watchdog timer */ sc->sc_tx_timer = 5; - ifp->if_timer = 1; } mtx_unlock(&sc->sc_mtx); } static void -ipw_watchdog(struct ifnet *ifp) +ipw_watchdog(void *arg) { - struct ipw_softc *sc = ifp->if_softc; + struct ipw_softc *sc = arg; + struct ieee80211com *ic = &sc->sc_ic; + struct ifnet *ifp = sc->sc_ifp; - mtx_lock(&sc->sc_mtx); - - ifp->if_timer = 0; + mtx_assert(&sc->sc_mtx, MA_OWNED); if (sc->sc_tx_timer > 0) { if (--sc->sc_tx_timer == 0) { @@ -1724,13 +1749,20 @@ ifp->if_oerrors++; taskqueue_enqueue_fast(taskqueue_fast, &sc->sc_init_task); - mtx_unlock(&sc->sc_mtx); - return; + } + } + if (sc->sc_scan_timer > 0) { + if (--sc->sc_scan_timer == 0) { + DPRINTFN(3, ("Scan timeout\n")); + /* End the scan */ + if (sc->flags & IPW_FLAG_SCANNING) { + ieee80211_scan_done(ic); + sc->flags &= ~IPW_FLAG_SCANNING; + } } - ifp->if_timer = 1; } - - mtx_unlock(&sc->sc_mtx); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + callout_reset(&sc->sc_wdtimer, hz, ipw_watchdog, sc); } static int @@ -1790,7 +1822,8 @@ tmp = CSR_READ_4(sc, IPW_CSR_RST); CSR_WRITE_4(sc, IPW_CSR_RST, tmp | IPW_RST_PRINCETON_RESET); - sc->flags &= ~IPW_FLAG_FW_INITED; + /* Clear all flags except the following */ + sc->flags &= IPW_FLAG_HAS_RADIO_SWITCH; } static int @@ -1979,6 +2012,48 @@ } static int +ipw_setwepkeys(struct ipw_softc *sc) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct ipw_wep_key wepkey; + struct ieee80211_key *wk; + int error, i; + + for (i = 0; i < IEEE80211_WEP_NKID; i++) { + wk = &ic->ic_crypto.cs_nw_keys[i]; + + if (wk->wk_cipher == NULL || + wk->wk_cipher->ic_cipher != IEEE80211_CIPHER_WEP) + continue; + + wepkey.idx = i; + wepkey.len = wk->wk_keylen; + memset(wepkey.key, 0, sizeof wepkey.key); + memcpy(wepkey.key, wk->wk_key, wk->wk_keylen); + DPRINTF(("Setting wep key index %u len %u\n", wepkey.idx, + wepkey.len)); + error = ipw_cmd(sc, IPW_CMD_SET_WEP_KEY, &wepkey, + sizeof wepkey); + if (error != 0) + return error; + } + return 0; +} + +static int +ipw_setwpaie(struct ipw_softc *sc, const void *ie, int ielen) +{ + struct ipw_wpa_ie wpaie; + + memset(&wpaie, 0, sizeof(wpaie)); + wpaie.len = htole32(ielen); + /* XXX verify length */ + memcpy(&wpaie.ie, ie, ielen); + DPRINTF(("Setting wpa ie\n")); + return ipw_cmd(sc, IPW_CMD_SET_WPA_IE, &wpaie, sizeof(wpaie)); +} + +static int ipw_setbssid(struct ipw_softc *sc, uint8_t *bssid) { static const uint8_t zerobssid[IEEE80211_ADDR_LEN]; @@ -2052,7 +2127,10 @@ int error; DPRINTF(("%s: flags 0x%x\n", __func__, sc->flags)); - sc->flags |= IPW_FLAG_SCANNING; + + if (sc->flags & IPW_FLAG_SCANNING) + return (EBUSY); + sc->flags |= IPW_FLAG_SCANNING | IPW_FLAG_HACK; /* NB: IPW_SCAN_DO_NOT_ASSOCIATE does not work (we set it anyway) */ error = ipw_setscanopts(sc, 0x3fff, IPW_SCAN_DO_NOT_ASSOCIATE); @@ -2073,6 +2151,7 @@ * if so just re-enable it to kick off scanning. */ DPRINTF(("Starting scan\n")); + sc->sc_scan_timer = 3; if (sc->flags & IPW_FLAG_ENABLED) { params = 0; /* XXX? */ error = ipw_cmd(sc, IPW_CMD_BROADCAST_SCAN, @@ -2082,7 +2161,7 @@ done: if (error != 0) { DPRINTF(("Scan failed\n")); - sc->flags &= ~IPW_FLAG_SCANNING; + sc->flags &= ~(IPW_FLAG_SCANNING | IPW_FLAG_HACK); } return (error); } @@ -2108,11 +2187,9 @@ struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = ic->ic_ifp; struct ipw_security security; - struct ieee80211_key *k; - struct ipw_wep_key wepkey; struct ipw_configuration config; uint32_t data; - int error, i; + int error; error = ipw_disable(sc); if (error != 0) @@ -2173,6 +2250,12 @@ if (error != 0) return error; + /* NB: use the same rate set */ + DPRINTF(("Setting msdu tx rates to 0x%x\n", le32toh(data))); + error = ipw_cmd(sc, IPW_CMD_SET_MSDU_TX_RATES, &data, sizeof data); + if (error != 0) + return error; + data = htole32(0xf); /* 1, 2, 5.5, 11 */ DPRINTF(("Setting tx rates to 0x%x\n", le32toh(data))); error = ipw_cmd(sc, IPW_CMD_SET_TX_RATES, &data, sizeof data); @@ -2228,35 +2311,25 @@ IPW_AUTH_SHARED : IPW_AUTH_OPEN; security.ciphers = htole32(IPW_CIPHER_NONE); DPRINTF(("Setting authmode to %u\n", security.authmode)); - error = ipw_cmd(sc, IPW_CMD_SET_SECURITY_INFORMATION, &security, + error = ipw_cmd(sc, IPW_CMD_SET_SECURITY_INFO, &security, sizeof security); if (error != 0) return error; if (ic->ic_flags & IEEE80211_F_PRIVACY) { - k = ic->ic_crypto.cs_nw_keys; - for (i = 0; i < IEEE80211_WEP_NKID; i++, k++) { - if (k->wk_keylen == 0) - continue; + error = ipw_setwepkeys(sc); + if (error != 0) + return error; - wepkey.idx = i; - wepkey.len = k->wk_keylen; - memset(wepkey.key, 0, sizeof wepkey.key); - memcpy(wepkey.key, k->wk_key, k->wk_keylen); - DPRINTF(("Setting wep key index %u len %u\n", - wepkey.idx, wepkey.len)); - error = ipw_cmd(sc, IPW_CMD_SET_WEP_KEY, &wepkey, - sizeof wepkey); + if (ic->ic_crypto.cs_def_txkey != IEEE80211_KEYIX_NONE) { + data = htole32(ic->ic_crypto.cs_def_txkey); + DPRINTF(("Setting wep tx key index to %u\n", + le32toh(data))); + error = ipw_cmd(sc, IPW_CMD_SET_WEP_KEY_INDEX, &data, + sizeof data); if (error != 0) return error; } - - data = htole32(ic->ic_crypto.cs_def_txkey); - DPRINTF(("Setting wep tx key index to %u\n", le32toh(data))); - error = ipw_cmd(sc, IPW_CMD_SET_WEP_KEY_INDEX, &data, - sizeof data); - if (error != 0) - return error; } data = htole32((ic->ic_flags & IEEE80211_F_PRIVACY) ? IPW_WEPON : 0); @@ -2265,16 +2338,11 @@ if (error != 0) return error; -#if 0 - struct ipw_wpa_ie ie; - - memset(&ie, 0, sizeof ie); - ie.len = htole32(sizeof (struct ieee80211_ie_wpa)); - DPRINTF(("Setting wpa ie\n")); - error = ipw_cmd(sc, IPW_CMD_SET_WPA_IE, &ie, sizeof ie); - if (error != 0) - return error; -#endif + if (ic->ic_opt_ie != NULL) { + error = ipw_setwpaie(sc, ic->ic_opt_ie, ic->ic_opt_ie_len); + if (error != 0) + return error; + } if (ic->ic_opmode == IEEE80211_M_IBSS) { data = htole32(ic->ic_bintval); @@ -2311,10 +2379,8 @@ struct ieee80211com *ic = &sc->sc_ic; struct ieee80211_node *ni = ic->ic_bss; struct ipw_security security; - struct ieee80211_key *k; - struct ipw_wep_key wepkey; uint32_t data; - int error, i; + int error; error = ipw_disable(sc); if (error != 0) @@ -2325,35 +2391,25 @@ IPW_AUTH_SHARED : IPW_AUTH_OPEN; security.ciphers = htole32(IPW_CIPHER_NONE); DPRINTF(("Setting authmode to %u\n", security.authmode)); - error = ipw_cmd(sc, IPW_CMD_SET_SECURITY_INFORMATION, &security, + error = ipw_cmd(sc, IPW_CMD_SET_SECURITY_INFO, &security, sizeof security); if (error != 0) return (error); if (ic->ic_flags & IEEE80211_F_PRIVACY) { - k = ic->ic_crypto.cs_nw_keys; - for (i = 0; i < IEEE80211_WEP_NKID; i++, k++) { - if (k->wk_keylen == 0) - continue; + error = ipw_setwepkeys(sc); + if (error != 0) + return error; - wepkey.idx = i; - wepkey.len = k->wk_keylen; - memset(wepkey.key, 0, sizeof wepkey.key); - memcpy(wepkey.key, k->wk_key, k->wk_keylen); - DPRINTF(("Setting wep key index %u len %u\n", - wepkey.idx, wepkey.len)); - error = ipw_cmd(sc, IPW_CMD_SET_WEP_KEY, &wepkey, - sizeof wepkey); + if (ic->ic_crypto.cs_def_txkey != IEEE80211_KEYIX_NONE) { + data = htole32(ic->ic_crypto.cs_def_txkey); + DPRINTF(("Setting wep tx key index to %u\n", + le32toh(data))); + error = ipw_cmd(sc, IPW_CMD_SET_WEP_KEY_INDEX, &data, + sizeof data); if (error != 0) return error; } - - data = htole32(ic->ic_crypto.cs_def_txkey); - DPRINTF(("Setting wep tx key index to %u\n", le32toh(data))); - error = ipw_cmd(sc, IPW_CMD_SET_WEP_KEY_INDEX, &data, - sizeof data); - if (error != 0) - return error; } data = htole32((ic->ic_flags & IEEE80211_F_PRIVACY) ? IPW_WEPON : 0); @@ -2370,6 +2426,11 @@ if (error != 0) return (error); + if (ic->ic_opt_ie != NULL) { + error = ipw_setwpaie(sc, ic->ic_opt_ie, ic->ic_opt_ie_len); + if (error != 0) + return error; + } if (ic->ic_opmode == IEEE80211_M_IBSS) { error = ipw_setchannel(sc, ni->ni_chan); if (error != 0) @@ -2557,6 +2618,7 @@ } else ieee80211_new_state(ic, IEEE80211_S_RUN, -1); + callout_reset(&sc->sc_wdtimer, hz, ipw_watchdog, sc); ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_RUNNING; @@ -2588,6 +2650,7 @@ ieee80211_new_state(ic, IEEE80211_S_INIT, -1); + callout_stop(&sc->sc_wdtimer); ipw_stop_master(sc); CSR_WRITE_4(sc, IPW_CSR_RST, IPW_RST_SW_RESET); @@ -2599,7 +2662,6 @@ ipw_release_sbd(sc, &sc->stbd_list[i]); sc->sc_tx_timer = 0; - ifp->if_timer = 0; ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); mtx_unlock(&sc->sc_mtx); ==== //depot/projects/wifi/sys/dev/ipw/if_ipwreg.h#7 (text+ko) ==== @@ -88,11 +88,18 @@ #define IPW_IO_LED_OFF 0x00002000 #define IPW_IO_RADIO_DISABLED 0x00010000 +/* state codes sent by fw on IPW_STATUS_CODE_NEWSTATE interrupt */ +#define IPW_STATE_INITIALIZED 0x0001 +#define IPW_STATE_CC_FOUND 0x0002 /* 802.11d cc received */ #define IPW_STATE_ASSOCIATED 0x0004 #define IPW_STATE_ASSOCIATION_LOST 0x0008 +#define IPW_STATE_ASSOCIATION_CHANGED 0x0010 /* assoc params changed? */ #define IPW_STATE_SCAN_COMPLETE 0x0020 +#define IPW_STATE_PS_ENTER 0x0040 /* entered power-save mode */ +#define IPW_STATE_PS_EXIT 0x0080 /* exited power-save mode */ #define IPW_STATE_RADIO_DISABLED 0x0100 #define IPW_STATE_DISABLED 0x0200 +#define IPW_STATE_POWER_DOWN 0x0400 /* ??? */ #define IPW_STATE_SCANNING 0x0800 /* table1 offsets */ @@ -146,7 +153,9 @@ uint8_t flags; #define IPW_STATUS_FLAG_DECRYPTED 0x01 #define IPW_STATUS_FLAG_WEP_ENCRYPTED 0x02 +#define IPW_STATUS_FLAG_CRC_ERROR 0x04 uint8_t rssi; /* received signal strength indicator */ +#define IPW_RSSI_TO_DBM (-98) /* XXX fixed nf to convert dBm */ } __packed; /* data header */ @@ -190,9 +199,13 @@ #define IPW_CMD_DISABLE 44 #define IPW_CMD_SET_DESIRED_BSSID 45 #define IPW_CMD_SET_SCAN_OPTIONS 46 +#define IPW_CMD_SET_SCAN_DWELL_TIME 47 +#define IPW_CMD_SET_SHORT_RETRY 51 +#define IPW_CMD_SET_LONG_RETRY 52 #define IPW_CMD_PREPARE_POWER_DOWN 58 #define IPW_CMD_DISABLE_PHY 61 -#define IPW_CMD_SET_SECURITY_INFORMATION 67 +#define IPW_CMD_SET_MSDU_TX_RATES 62 +#define IPW_CMD_SET_SECURITY_INFO 67 #define IPW_CMD_DISASSOCIATE 68 #define IPW_CMD_SET_WPA_IE 69 uint32_t subtype; @@ -205,7 +218,7 @@ /* possible values for command IPW_CMD_SET_POWER_MODE */ #define IPW_POWER_MODE_CAM 0 -#define IPW_POWER_AUTOMATIC 6 +#define IPW_POWER_MODE_AUTO 6 /* possible values for command IPW_CMD_SET_MODE */ #define IPW_MODE_BSS 0 @@ -242,6 +255,7 @@ struct ipw_scan_options { uint32_t flags; #define IPW_SCAN_DO_NOT_ASSOCIATE 0x00000001 +#define IPW_SCAN_MIXED_CELL 0x00000002 #define IPW_SCAN_PASSIVE 0x00000008 uint32_t channels; } __packed; ==== //depot/projects/wifi/sys/dev/ipw/if_ipwvar.h#9 (text+ko) ==== @@ -87,12 +87,13 @@ struct task sc_init_task; struct task sc_scan_task; struct task sc_assoc_task; + struct callout sc_wdtimer; /* watchdog timer */ uint32_t flags; #define IPW_FLAG_FW_INITED (1 << 0) #define IPW_FLAG_INIT_LOCKED (1 << 1) #define IPW_FLAG_HAS_RADIO_SWITCH (1 << 2) -#define IPW_FLAG_FW_WARNED (1 << 3) +#define IPW_FLAG_HACK (1 << 3) #define IPW_FLAG_SCANNING (1 << 4) #define IPW_FLAG_ENABLED (1 << 5) #define IPW_FLAG_BUSY (1 << 6) @@ -108,6 +109,7 @@ const struct firmware *sc_firmware; int sc_tx_timer; + int sc_scan_timer; bus_dma_tag_t tbd_dmat; bus_dma_tag_t rbd_dmat;