[Madwifi-cvs] revision 2002 committed
Status: Beta
Brought to you by:
otaku
From: Nick K. <svn...@ma...> - 2007-01-26 17:34:34
|
Project : madwifi Revision : 2002 Author : mickflemm (Nick Kossifidis) Date : 2007-01-26 18:33:49 +0100 (Fri, 26 Jan 2007) Log Message : * Updated OpenHAL's code * Re-ported OpenHAL to latest dadwifi code (if_ath.c/if_ath_d80211.c) * It works ;-) Affected Files: * branches/dadwifi-openhal/ath/if_ath.c updated * branches/dadwifi-openhal/ath/if_ath.h updated * branches/dadwifi-openhal/ath/if_ath_ahb.c updated * branches/dadwifi-openhal/ath/if_ath_ahb.h updated * branches/dadwifi-openhal/ath/if_ath_d80211.c updated * branches/dadwifi-openhal/ath/if_ath_pci.c updated * branches/dadwifi-openhal/ath/if_athvar.h updated * branches/dadwifi-openhal/openhal/ah_devid.h updated * branches/dadwifi-openhal/openhal/ah_osdep.c updated * branches/dadwifi-openhal/openhal/ah_osdep.h updated * branches/dadwifi-openhal/openhal/ar5210.c updated * branches/dadwifi-openhal/openhal/ar5211.c updated * branches/dadwifi-openhal/openhal/ar5212.c updated * branches/dadwifi-openhal/openhal/ar5xxx.c updated * branches/dadwifi-openhal/openhal/ar5xxx.h updated * branches/dadwifi-openhal/openhal/ieee80211_regdomain.h updated * branches/dadwifi-openhal/openhal/stack_d80211.h added * branches/dadwifi-openhal/openhal/stack_net80211.h added * branches/dadwifi-openhal/openhal/translation.h updated Modified: branches/dadwifi-openhal/ath/if_ath.c =================================================================== --- branches/dadwifi-openhal/ath/if_ath.c 2007-01-26 12:18:00 UTC (rev 2001) +++ branches/dadwifi-openhal/ath/if_ath.c 2007-01-26 17:33:49 UTC (rev 2002) @@ -71,7 +71,7 @@ #include "if_athvar.h" #include "ah_desc.h" -#include "ah_devid.h" /* XXX to identify IBM cards */ +#include "ah_devid.h" /* XXX to identify chipset */ #ifdef ATH_PCI /* PCI BUS */ #include "if_ath_pci.h" @@ -115,7 +115,7 @@ static void ath_bstuck_tasklet(TQUEUE_ARG); static void ath_beacon_tasklet(TQUEUE_ARG); #if 0 -static void ath_radar_task(TQUEUE_ARG); +static void ath_radar_task(struct ATH_WORK_THREAD *); static void ath_dfs_test_return(unsigned long); #endif @@ -133,9 +133,6 @@ static void ath_updateslot(struct net_device *); #endif static int ath_beaconq_setup(struct ath_hal *); -#if 0 -static int ath_beacon_alloc(struct ath_softc *, struct ieee80211_node *); -#endif #ifdef ATH_SUPERG_DYNTURBO static void ath_beacon_dturbo_update(struct ieee80211vap *, int *, u_int8_t); static void ath_beacon_dturbo_config(struct ieee80211vap *, u_int32_t); @@ -291,11 +288,11 @@ MODULE_PARM(autocreate, "s"); #else #include <linux/moduleparam.h> -module_param(countrycode, int, 0); -module_param(outdoor, int, 0); -module_param(xchanmode, int, 0); -module_param(rfkill, int, 0); -module_param(autocreate, charp, 0); +module_param(countrycode, int, 0600); +module_param(outdoor, int, 0600); +module_param(xchanmode, int, 0600); +module_param(rfkill, int, 0600); +module_param(autocreate, charp, 0600); #endif MODULE_PARM_DESC(countrycode, "Override default country code"); MODULE_PARM_DESC(outdoor, "Enable/disable outdoor use"); @@ -308,7 +305,7 @@ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,52)) MODULE_PARM(ath_debug, "i"); #else -module_param(ath_debug, int, 0); +module_param(ath_debug, int, 0600); #endif MODULE_PARM_DESC(ath_debug, "Load-time debug output enable"); @@ -318,7 +315,7 @@ static void ath_printtxbuf(struct ath_buf *, int); #define KEYPRINTF(sc, ix, hk, mac) do { \ if (sc->sc_debug & ATH_DEBUG_KEYCACHE) \ - ath_keyprint(__func__, ix, hk, mac); \ + ath_keyprint(sc, __func__, ix, hk, mac); \ } while (0) #else /* defined(AR_DEBUG) */ #define IFF_DUMPPKTS(sc, _m) netif_msg_dumppkts(&sc->sc_ic) @@ -360,7 +357,6 @@ AR5K_STATUS status; int error = 0, i; u_int8_t csz; - sc->devid = devid; sc->sc_debug = ath_debug; DPRINTF(sc, ATH_DEBUG_ANY, "%s: devid 0x%x\n", __func__, devid); @@ -391,13 +387,15 @@ #endif /* - * Attach the hal and verify ABI compatibility by checking - * the hal's ABI signature against the one the driver was + * Attach the HAL and verify ABI compatibility by checking + * the HAL's ABI signature against the one the driver was * compiled with. A mismatch indicates the driver was - * built with an ah.h that does not correspond to the hal + * built with an ah.h that does not correspond to the HAL * module loaded in the kernel. */ - ah = _ath_hal_attach(devid, sc, 0, (void *) sc->sc_mem_start, &status); + ah = _ath_hal_attach(devid, sc, 0, + (__force AR5K_BUS_HANDLE) sc->sc_iobase, + &status); if (ah == NULL) { printk(KERN_ERR "%s: unable to attach hardware: '%s' (HAL status %u)\n", sc->name, ath_get_hal_status_desc(status), status); @@ -442,7 +440,7 @@ /* * Collect the channel list using the default country * code and including outdoor channels. The 802.11 layer - * is resposible for filtering this list based on settings + * is responsible for filtering this list based on settings * like the phy mode. */ if (countrycode != -1) @@ -475,7 +473,7 @@ ath_rate_setup(sc, AR5K_MODE_11G); #if 0 /* FIXME: hostapd does not support turbo modes. */ - ath_rate_setup(dev, AR5K_MODE_108A); + ath_rate_setup(dev, AR5K_MODE_TURBO); ath_rate_setup(dev, AR5K_MODE_108G); #endif #if 0 @@ -507,7 +505,7 @@ /* * Allocate hardware transmit queues: one queue for * beacon frames and one data queue for each QoS - * priority. Note that the hal handles reseting + * priority. Note that the HAL handles resetting * these queues at the needed time. * * XXX PS-Poll @@ -575,7 +573,7 @@ sc->sc_xrpollcount = XR_DEFAULT_POLL_COUNT; strcpy(sc->sc_grppoll_str, XR_DEFAULT_GRPPOLL_RATE_STR); sc->sc_grpplq.axq_qnum = -1; - sc->sc_xrtxq = ath_txq_setup(sc, AR5K_TX_QUEUE_XR_DATA, AR5K_WME_AC_BE); + sc->sc_xrtxq = ath_txq_setup(sc, AR5K_TX_QUEUE_DATA, AR5K_XR_DATA); #endif /* @@ -603,9 +601,7 @@ #endif ATH_INIT_TQUEUE(&sc->sc_txtq, ath_tx_tasklet_q0, sc); /* FIXME: we are only using a single hardware queue. */ - if (!ath_tx_setup(sc, WME_AC_BE, AR5K_WME_AC_BK) || - !ath_tx_setup(sc, WME_AC_BK, AR5K_WME_AC_BE) || - !ath_tx_setup(sc, WME_AC_VI, AR5K_WME_AC_VI)) { + if (!ath_tx_setup(sc, WME_AC_BK, AR5K_WME_AC_BK)) { printk(KERN_ERR "unable to setup xmit queue\n"); error = -EIO; goto bad2; @@ -623,7 +619,7 @@ sc->sc_blinking = 0; sc->sc_ledstate = 1; sc->sc_ledon = 0; /* low true */ - sc->sc_ledidle = msecs_to_jiffies(2700); /* 2.7sec */ + sc->sc_ledidle = msecs_to_jiffies(2700); /* 2.7 sec */ sc->sc_dfstesttime = ATH_DFS_TEST_RETURN_PERIOD; init_timer(&sc->sc_ledtimer); #if 0 @@ -631,12 +627,6 @@ init_timer(&sc->sc_dfstesttimer); #endif sc->sc_ledtimer.data = (unsigned long) sc; - /* - * Auto-enable soft led processing for IBM cards and for - * 5211 minipci cards. Users can also manually enable/disable - * support with a sysctl. - */ - sc->sc_softled = (devid == PCI_PRODUCT_ATHEROS_AR5212_IBM || devid == PCI_PRODUCT_ATHEROS_AR5211); if (sc->sc_softled) { ath_hal_gpioCfgOutput(ah, sc->sc_ledpin); ath_hal_gpioset(ah, sc->sc_ledpin, !sc->sc_ledon); @@ -659,8 +649,8 @@ dev->hard_header_len += sizeof(struct ieee80211_qosframe) + sizeof(struct llc) + IEEE80211_ADDR_LEN + - AR5K_KEYVAL_IVLEN + - AR5K_KEYVAL_KIDLEN; + IEEE80211_WEP_IVLEN + + IEEE80211_WEP_KIDLEN; #ifdef ATH_SUPERG_FF dev->hard_header_len += ATH_FF_MAX_HDR; #endif @@ -676,7 +666,7 @@ ic->ic_uapsd_flush = ath_uapsd_flush; /* XXX not right but it's not used anywhere important */ - ic->ic_phytype = ieee80211_phytype_dsss_dot11_b; /*OpenHAL starts on 802.11b*/ + ic->ic_phytype = MODULATION_CCK; ic->ic_opmode = IEEE80211_IF_TYPE_STA; sc->sc_opmode = IEEE80211_IF_TYPE_STA; /* @@ -715,7 +705,7 @@ ; #endif /* - * Query the hal to figure out h/w crypto support. + * Query the HAL to figure out h/w crypto support. */ if (ath_hal_ciphersupported(ah, AR5K_CIPHER_TKIP)) { /* @@ -738,8 +728,13 @@ } else { hw->flags |= IEEE80211_HW_TKIP_INCLUDE_MMIC; } - - if (ath_hal_tkipsplit(ah)) + + /* + * If the h/w supports storing tx+rx MIC keys + * in one cache slot automatically enable use. + */ + if (ath_hal_hastkipsplit(ah) || + !ath_hal_settkipsplit(ah, FALSE)) sc->sc_splitmic = 1; } #if 0 @@ -779,8 +774,8 @@ #endif /* - * Query the hal about antenna support - * Enable rx fast diversity if hal has support + * Query the HAL about antenna support + * Enable rx fast diversity if HAL has support */ if (ath_hal_hasdiversity(ah)) { sc->sc_hasdiversity = 1; @@ -876,7 +871,7 @@ DPRINTF(sc, ATH_DEBUG_ANY, "%s\n", __func__); ath_stop(sc); - ath_hal_setpower(sc->sc_ah, AR5K_PM_AWAKE); + ath_hal_setpower(sc->sc_ah, AR5K_PM_AWAKE,0); /* Flush the radar task if it's scheduled */ #if 0 if (sc->sc_rtasksched == 1) @@ -887,13 +882,13 @@ /* * NB: the order of these is important: - * o call the 802.11 layer before detaching the hal to + * o call the 802.11 layer before detaching the HAL to * ensure callbacks into the driver to delete global * key cache entries can be handled * o reclaim the tx queue data structures after calling * the 802.11 layer as we'll get called back to reclaim * node state and potentially want to use them - * o to cleanup the tx queues the hal is called, so detach + * o to cleanup the tx queues the HAL is called, so detach * it last * Other than that, it's straightforward... */ @@ -921,50 +916,58 @@ int opmode, int flags, struct net_device *mdev) { struct ath_softc *sc = ic->ic_dev->priv; + struct ath_hal *ah = sc->sc_ah; struct net_device *dev; struct ath_vap *avp; struct ieee80211vap *vap; int ic_opmode; + if (ic->ic_dev->flags & IFF_RUNNING) { + /* needs to disable hardware too */ + ath_hal_intrset(ah, 0); /* disable interrupts */ + ath_draintxq(sc); /* stop xmit side */ + ath_stoprecv(sc); /* stop recv side */ + } /* XXX ic unlocked and race against add */ switch (opmode) { - case IEEE80211_IF_TYPE_STA: /* ap+sta for repeater application */ + case IEEE80211_M_STA: /* ap+sta for repeater application */ if (sc->sc_nstavaps != 0) /* only one sta regardless */ return NULL; if ((sc->sc_nvaps != 0) && (!(flags & IEEE80211_NO_STABEACONS))) return NULL; /* If using station beacons, must first up */ if (flags & IEEE80211_NO_STABEACONS) { sc->sc_nostabeacons = 1; - ic_opmode = IEEE80211_IF_TYPE_AP; /* Run with chip in AP mode */ + ic_opmode = IEEE80211_M_HOSTAP; /* Run with chip in AP mode */ } else ic_opmode = opmode; break; - case IEEE80211_IF_TYPE_IBSS: + case IEEE80211_M_IBSS: if (sc->sc_nvaps != 0) /* only one */ return NULL; ic_opmode = opmode; break; - case IEEE80211_IF_TYPE_MNTR: + case IEEE80211_M_AHDEMO: + case IEEE80211_M_MONITOR: if (sc->sc_nvaps != 0 && ic->ic_opmode != opmode) { /* preserve existing mode */ ic_opmode = ic->ic_opmode; } else ic_opmode = opmode; break; - case IEEE80211_IF_TYPE_AP: - case IEEE80211_IF_TYPE_WDS: + case IEEE80211_M_HOSTAP: + case IEEE80211_M_WDS: /* permit multiple ap's and/or wds links */ /* XXX sta+ap for repeater/bridge application */ - if ((sc->sc_nvaps != 0) && (ic->ic_opmode == IEEE80211_IF_TYPE_STA)) + if ((sc->sc_nvaps != 0) && (ic->ic_opmode == IEEE80211_M_STA)) return NULL; /* XXX not right, beacon buffer is allocated on RUN trans */ - if (opmode == IEEE80211_IF_TYPE_AP && STAILQ_EMPTY(&sc->sc_bbuf)) + if (opmode == IEEE80211_M_HOSTAP && STAILQ_EMPTY(&sc->sc_bbuf)) return NULL; /* * XXX Not sure if this is correct when operating only * with WDS links. */ - ic_opmode = IEEE80211_IF_TYPE_AP; + ic_opmode = IEEE80211_M_HOSTAP; break; default: @@ -994,16 +997,16 @@ vap->iv_comp_set = ath_comp_set; #endif - /* Let rate control register proc entries for the vap */ + /* Let rate control register proc entries for the VAP */ ath_rate_dynamic_proc_register(vap); /* * Change the interface type for monitor mode. */ - if (opmode == IEEE80211_IF_TYPE_MNTR) + if (opmode == IEEE80211_M_MONITOR) dev->type = ARPHRD_IEEE80211_PRISM; if ((flags & IEEE80211_CLONE_BSSID) && - sc->sc_nvaps != 0 && opmode != IEEE80211_IF_TYPE_WDS && sc->sc_hasbmask) { + sc->sc_nvaps != 0 && opmode != IEEE80211_M_WDS && sc->sc_hasbmask) { struct ieee80211vap *v; int id_mask, id; @@ -1014,7 +1017,7 @@ * virtual ap's with distinct addresses. */ - /* do a full search to mark all the allocated vaps */ + /* do a full search to mark all the allocated VAPs */ id_mask = 0; TAILQ_FOREACH(v, &ic->ic_vaps, iv_next) id_mask |= (1 << ATH_GET_VAP_ID(v->iv_myaddr)); @@ -1030,17 +1033,17 @@ avp->av_bslot = -1; STAILQ_INIT(&avp->av_mcastq.axq_q); ATH_TXQ_LOCK_INIT(&avp->av_mcastq); - if (opmode == IEEE80211_IF_TYPE_AP || opmode == IEEE80211_IF_TYPE_IBSS) { + if (opmode == IEEE80211_M_HOSTAP || opmode == IEEE80211_M_IBSS) { /* * Allocate beacon state for hostap/ibss. We know * a buffer is available because of the check above. */ avp->av_bcbuf = STAILQ_FIRST(&sc->sc_bbuf); STAILQ_REMOVE_HEAD(&sc->sc_bbuf, bf_list); - if (opmode == IEEE80211_IF_TYPE_AP || !sc->sc_hasveol) { + if (opmode == IEEE80211_M_HOSTAP || !sc->sc_hasveol) { int slot; /* - * Assign the vap to a beacon xmit slot. As + * Assign the VAP to a beacon xmit slot. As * above, this cannot fail to find one. */ avp->av_bslot = 0; @@ -1063,9 +1066,9 @@ sc->sc_bslot[avp->av_bslot] = vap; sc->sc_nbcnvaps++; } - if (sc->sc_hastsfadd) { + if ((opmode == IEEE80211_M_HOSTAP) && (sc->sc_hastsfadd)) { /* - * Multiple vaps are to transmit beacons and we + * Multiple VAPs are to transmit beacons and we * have h/w support for TSF adjusting; enable use * of staggered beacons. */ @@ -1082,22 +1085,22 @@ ic->ic_opmode = ic_opmode; - if (opmode != IEEE80211_IF_TYPE_WDS) + if (opmode != IEEE80211_M_WDS) sc->sc_nvaps++; - if (opmode == IEEE80211_IF_TYPE_STA) + if (opmode == IEEE80211_M_STA) sc->sc_nstavaps++; - else if (opmode == IEEE80211_IF_TYPE_MNTR) + else if (opmode == IEEE80211_M_MONITOR) sc->sc_nmonvaps++; /* - * Adhoc demo mode is a pseudo mode; to the hal it's + * Adhoc demo mode is a pseudo mode; to the HAL it's * just ibss mode and the driver doesn't use management - * frames. Other modes carry over directly to the hal. + * frames. Other modes carry over directly to the HAL. */ -// if (ic->ic_opmode == IEEE80211_M_AHDEMO) -// sc->sc_opmode = IEEE80211_IF_TYPE_IBSS; -// else - sc->sc_opmode = (u_int32_t) ic->ic_opmode; /* NB: compatible */ + if (ic->ic_opmode == IEEE80211_M_AHDEMO) + sc->sc_opmode = AR5K_M_IBSS; + else + sc->sc_opmode = (AR5K_OPMODE) ic->ic_opmode; /* NB: compatible */ #ifdef ATH_SUPERG_XR if ( vap->iv_flags & IEEE80211_F_XR ) { @@ -1105,15 +1108,24 @@ "grppoll", (sc->sc_xrpollcount+1) * AR5K_ANTENNA_MAX_MODE, 1) != 0) printk("%s:grppoll Buf allocation failed \n",__func__); if (!sc->sc_xrtxq) - sc->sc_xrtxq = ath_txq_setup(sc, AR5K_TX_QUEUE_XR_DATA, AR5K_WME_AC_BE); + sc->sc_xrtxq = ath_txq_setup(sc, AR5K_TX_QUEUE_XR_DATA, AR5K_WME_AC_BE) if (sc->sc_hasdiversity) { - /* Save current diversity state if user destroys XR vap */ + /* Save current diversity state if user destroys XR VAP */ sc->sc_olddiversity = sc->sc_diversity; ath_hal_setdiversity(sc->sc_ah, 0); sc->sc_diversity = 0; } } #endif + if (ic->ic_dev->flags & IFF_RUNNING) { + /* restart hardware */ + if (ath_startrecv(sc) != 0) /* restart recv */ + printk("%s: %s: unable to start recv logic\n", + dev->name, __func__); + if (sc->sc_beacons) + ath_beacon_config(sc, NULL); /* restart beacons */ + ath_hal_intrset(ah, sc->sc_imask); + } return vap; } @@ -1126,15 +1138,16 @@ struct ath_hal *ah = sc->sc_ah; struct ath_vap *avp = ATH_VAP(vap); int decrease = 1; - KASSERT(vap->iv_state == IEEE80211_S_INIT, ("vap not stopped")); + int i; + KASSERT(vap->iv_state == IEEE80211_S_INIT, ("VAP not stopped")); if (dev->flags & IFF_RUNNING) { /* - * Quiesce the hardware while we remove the vap. In + * Quiesce the hardware while we remove the VAP. In * particular we need to reclaim all references to the - * vap state by any frames pending on the tx queues. + * VAP state by any frames pending on the tx queues. * - * XXX can we do this w/o affecting other vap's? + * XXX can we do this w/o affecting other VAPs? */ ath_hal_intrset(ah, 0); /* disable interrupts */ ath_draintxq(sc); /* stop xmit side */ @@ -1142,14 +1155,14 @@ } /* - * Reclaim any pending mcast bufs on the vap. + * Reclaim any pending mcast bufs on the VAP. */ ath_tx_draintxq(sc, &avp->av_mcastq); ATH_TXQ_LOCK_DESTROY(&avp->av_mcastq); /* * Reclaim beacon state. Note this must be done before - * vap instance is reclaimed as we may have a reference + * VAP instance is reclaimed as we may have a reference * to it in the buffer for the beacon frame. */ if (avp->av_bcbuf != NULL) { @@ -1162,13 +1175,13 @@ if (sc->sc_nbcnvaps == 0) sc->sc_stagbeacons = 0; } - if (vap->iv_opmode == IEEE80211_IF_TYPE_STA) { + if (vap->iv_opmode == IEEE80211_M_STA) { sc->sc_nstavaps--; if (sc->sc_nostabeacons) sc->sc_nostabeacons = 0; - } else if (vap->iv_opmode == IEEE80211_IF_TYPE_MNTR) { + } else if (vap->iv_opmode == IEEE80211_M_MONITOR) { sc->sc_nmonvaps--; - } else if (vap->iv_opmode == IEEE80211_IF_TYPE_WDS) { + } else if (vap->iv_opmode == IEEE80211_M_WDS) { decrease = 0; } ieee80211_vap_detach(vap); @@ -1178,8 +1191,8 @@ #ifdef ATH_SUPERG_XR /* - * if its an XR vap ,free the memory allocated explicitly. - * since the XR vap is not registered , OS can not free the memory. + * If it's an XR VAP, free the memory allocated explicitly. + * Since the XR VAP is not registered, OS cannot free the memory. */ if (vap->iv_flags & IEEE80211_F_XR) { ath_grppoll_stop(vap); @@ -1199,6 +1212,14 @@ } #endif + for (i = 0; i < IEEE80211_APPIE_NUM_OF_FRAME; ++ i) { + if (vap->app_ie[i].ie != NULL) { + FREE(vap->app_ie[i].ie, M_DEVBUF); + vap->app_ie[i].ie = NULL; + vap->app_ie[i].length = 0; + } + } + if (dev->flags & IFF_RUNNING) { /* * Restart rx+tx machines if device is still running. @@ -1288,11 +1309,6 @@ continue; } - /* - * XXXAPSD: consider new hal call that does only the subset - * of ath_hal_rxprocdesc we require for trigger search. - */ - /* * NB: descriptor memory doesn't need to be sync'd * due to the way it was allocated. @@ -1309,7 +1325,7 @@ * on. All this is necessary because of our use of * a self-linked list to avoid rx overruns. */ - retval = ath_hal_rxprocdesc(ah, ds, bf->bf_daddr, PA2DESC(sc, ds->ds_link), tsf); + retval = ath_hal_rxprocdesc(ah, ds, bf->bf_daddr, PA2DESC(sc, ds->ds_link)); if (AR5K_EINPROGRESS == retval) break; @@ -1331,7 +1347,7 @@ if (ds->ds_rxstat.rs_keyix == AR5K_RXKEYIX_INVALID || (ni = sc->sc_keyixmap[ds->ds_rxstat.rs_keyix]) == NULL) { /* - * XXX: this can occur if WEP mode is used for non-atheros clients + * XXX: this can occur if WEP mode is used for non-Atheros clients * (since we do not know which of the 4 WEP keys will be used * at association time, so cannot setup a key-cache entry. * The Atheros client can convey this in the Atheros IE.) @@ -1367,7 +1383,7 @@ * (that does nothing) to make this more clear. */ ni->ni_flags |= IEEE80211_NODE_PS_CHANGED; - ni->ni_pschangeseq = *(u_int16_t *)(&qwh->i_seq[0]); + ni->ni_pschangeseq = *(__le16 *)(&qwh->i_seq[0]); ni->ni_flags &= ~IEEE80211_NODE_UAPSD_SP; ni->ni_flags ^= IEEE80211_NODE_PWR_MGT; if (qwh->i_fc[1] & IEEE80211_FC1_PWR_MGT) { @@ -1405,7 +1421,7 @@ /* make sure the frame is QoS data/null */ /* NB: with current sub-type definitions, the * IEEE80211_FC0_SUBTYPE_QOS check, below, covers the - * qos null case too. + * QoS null case too. */ if (((qwh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_DATA) || !(qwh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS)) @@ -1435,7 +1451,7 @@ /* * Detect duplicate triggers and drop if so. */ - frame_seq = le16toh(*(u_int16_t *)qwh->i_seq); + frame_seq = le16toh(*(__le16 *)qwh->i_seq); if ((qwh->i_fc[1] & IEEE80211_FC1_RETRY) && frame_seq == ni->ni_uapsd_trigseq[ac]) { DPRINTF(sc, ATH_DEBUG_UAPSD, "%s: dropped dup trigger, ac %d, seq %d\n", @@ -1458,8 +1474,8 @@ "%s: Queue empty, generating QoS NULL to send\n", __func__); /* - * Empty queue, so need to send qos null on this ac. Make a - * call that will dump a qos null onto the node's queue, then + * Empty queue, so need to send QoS null on this ac. Make a + * call that will dump a QoS null onto the node's queue, then * we can proceed as normal. */ ieee80211_send_qosnulldata(ni, ac); @@ -1521,7 +1537,11 @@ * Interrupt handler. Most of the actual processing is deferred. */ irqreturn_t +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19) ath_intr(int irq, void *dev_id) +#else +ath_intr(int irq, void *dev_id, struct pt_regs *regs) +#endif { struct ath_softc *sc = dev_id; struct ath_hal *ah = sc->sc_ah; @@ -1541,7 +1561,7 @@ needmark = 0; /* * Figure out the reason(s) for the interrupt. Note - * that the hal returns a pseudo-ISR that may include + * that the HAL returns a pseudo-ISR that may include * bits we haven't explicitly enabled so we mask the * value to ensure we only process bits we requested. */ @@ -1578,6 +1598,11 @@ } if (status & AR5K_INT_RX) { ath_uapsd_processtriggers(sc); + /* Get the noise floor data in interrupt context as we can't get it + * per frame, so we need to get it as soon as possible (i.e. the tasklet + * might take too long to fire */ + //ath_hal_process_noisefloor(ah); + //sc->sc_channoise = ath_hal_get_channel_noise(ah, &(sc->sc_curchan)); ATH_SCHEDULE_TQUEUE(&sc->sc_rxtq, &needmark); } if (status & AR5K_INT_TX) { @@ -1586,7 +1611,7 @@ * Check if the beacon queue caused the interrupt * when a dynamic turbo switch * is pending so we can initiate the change. - * XXX must wait for all vap's beacons + * XXX must wait for all VAPs' beacons */ if (sc->sc_dturbo_switch) { @@ -1618,7 +1643,7 @@ */ ath_hal_intrset(ah, 0); /* - * Let the hal handle the event. We assume it will + * Let the HAL handle the event. We assume it will * clear whatever condition caused the interrupt. */ // ath_hal_mibevent(ah, &sc->sc_halstats); @@ -1645,18 +1670,18 @@ /* * DFS was found, initiate channel change */ - ichan.ic_ieee = ath_hal_mhz2ieee(ah, hchan.channel, hchan.channel_flags); - ichan.ic_freq = hchan.channel; + ichan.ic_ieee = ath_hal_mhz2ieee(hchan.freq, hchan.channel_flags); + ichan.ic_freq = hchan.freq; ichan.ic_flags = hchan.channel_flags; - if ((sc->sc_curchan.channel == hchan.channel) && - (sc->sc_curchan.channel_flags == hchan.channel)) { + if ((sc->sc_curchan.freq == hchan.freq) && + (sc->sc_curchan.channel_flags == hchan.freq)) { if (hchan.private_flags & CHANNEL_INTERFERENCE) sc->sc_curchan.private_flags |= CHANNEL_INTERFERENCE; } ieee80211_mark_dfs(ic, &ichan); if (((ic->ic_flags_ext & IEEE80211_FEXT_MARKDFS) == 0) && - (ic->ic_opmode == IEEE80211_IF_TYPE_AP)) { + (ic->ic_opmode == IEEE80211_M_HOSTAP)) { sc->sc_dfstest_ieeechan = ic->ic_curchan->ic_ieee; sc->sc_dfstesttimer.function = ath_dfs_test_return; sc->sc_dfstesttimer.expires = jiffies + (sc->sc_dfstesttime * HZ); @@ -1685,7 +1710,7 @@ { struct ath_softc *sc = (struct ath_softc *)data; - printk("%s: hardware error; reseting\n", sc->name); + printk("%s: hardware error; resetting\n", sc->name); ath_reset(sc); } @@ -1694,7 +1719,7 @@ { struct ath_softc *sc = (struct ath_softc *)data; - printk("%s: rx FIFO overrun; reseting\n", sc->name); + printk("%s: rx FIFO overrun; resetting\n", sc->name); ath_reset(sc); } @@ -1743,7 +1768,7 @@ ath_init(struct ath_softc *sc) { struct ieee80211_conf *conf = &sc->sc_hw->conf; - u_int32_t opmode = sc->sc_opmode; + AR5K_OPMODE opmode = sc->sc_opmode; struct ath_hal *ah = sc->sc_ah; AR5K_STATUS status; int error = 0; @@ -1790,13 +1815,13 @@ * be followed by initialization of the appropriate bits * and then setup of the interrupt mask. */ - sc->sc_curchan.channel = conf->freq; + sc->sc_curchan.freq = conf->freq; sc->sc_curchan.channel_flags = conf->channel_val; if (!ath_hal_reset(ah, opmode, &sc->sc_curchan, FALSE, &status)) { printk("%s: unable to reset hardware: '%s' (HAL status %u) " "(freq %u flags 0x%x)\n", sc->name, ath_get_hal_status_desc(status), status, - sc->sc_curchan.channel, sc->sc_curchan.channel_flags); + sc->sc_curchan.freq, sc->sc_curchan.channel_flags); error = -EIO; goto done; } @@ -1834,7 +1859,7 @@ * Enable MIB interrupts when there are hardware phy counters. * Note we only do this (at the moment) for station mode. */ - if (sc->sc_needmib && sc->sc_opmode == IEEE80211_IF_TYPE_STA) + if (sc->sc_needmib && sc->sc_opmode == AR5K_M_STA) sc->sc_imask |= AR5K_INT_MIB; ath_hal_intrset(ah, sc->sc_imask); @@ -1925,7 +1950,7 @@ ATH_LOCK(sc); if (!sc->sc_invalid) - ath_hal_setpower(sc->sc_ah, AR5K_PM_AWAKE); + ath_hal_setpower(sc->sc_ah, AR5K_PM_AWAKE,0); error = ath_stop_locked(sc); #if 0 @@ -1939,7 +1964,7 @@ * (and system). This varies by chip and is mostly an * issue with newer parts that go to sleep more quickly. */ - ath_hal_setpower(sc->sc_ah, AR5K_PM_FULL_SLEEP); + ath_hal_setpower(sc->sc_ah, AR5K_PM_FULL_SLEEP,0); } #endif ATH_UNLOCK(sc); @@ -2001,7 +2026,7 @@ struct ath_hal *hal = sc->sc_ah; if (ar_device(sc->devid) == 5212 || ar_device(sc->devid) == 5213) { /* set ack to be sent at low bit-rate */ - /* registers taken from the openbsd 5212 hal */ + /* registers taken from the OpenBSD 5212 HAL */ #define AR5K_AR5212_STA_ID1 0x8004 #define AR5K_AR5212_STA_ID1_ACKCTS_6MB 0x01000000 #define AR5K_AR5212_STA_ID1_BASE_RATE_11B 0x02000000 @@ -2027,7 +2052,7 @@ ath_reset(struct ath_softc *sc) { struct ieee80211_conf *conf = &sc->sc_hw->conf; - u_int32_t opmode = sc->sc_opmode; + AR5K_OPMODE opmode = sc->sc_opmode; struct ath_hal *ah = sc->sc_ah; AR5K_STATUS status; int i; @@ -2036,7 +2061,7 @@ * Convert to a HAL channel description with the flags * constrained to reflect the current operating mode. */ - sc->sc_curchan.channel = conf->freq; + sc->sc_curchan.freq = conf->freq; sc->sc_curchan.channel_flags = conf->channel_val; ath_hal_intrset(ah, 0); /* disable interrupts */ @@ -2169,13 +2194,13 @@ #if 0 static int -dot11_to_rate_code(struct ath_softc *sc, const AR5K_RATE_TABLE *rt, int dot11) +dot11_to_ratecode(struct ath_softc *sc, const AR5K_RATE_TABLE *rt, int dot11) { int index = sc->sc_rixmap[dot11 & IEEE80211_RATE_VAL]; if (index >= 0 && index < rt->rate_count) - return rt->info[index].rate_code; + return rt->rates[index].rateCode; - return rt->info[sc->sc_minrateix].rate_code; + return rt->rates[sc->sc_minrateix].rateCode; } #endif @@ -2281,17 +2306,17 @@ , flags /* flags */ , 0 /* rts/cts rate */ , 0 /* rts/cts duration */ - , 0 /* comp icv len */ - , 0 /* comp iv len */ - , ATH_COMP_PROC_NO_COMP_NO_CCS /* comp scheme */ +// , 0 /* comp icv len */ +// , 0 /* comp iv len */ +// , ATH_COMP_PROC_NO_COMP_NO_CCS /* comp scheme */ ); #if 0 if (ph->try1) { ath_hal_setupxtxdesc(sc->sc_ah, ds - , dot11_to_rate_code(sc, rt, ph->rate1), ph->try1 /* series 1 */ - , dot11_to_rate_code(sc, rt, ph->rate2), ph->try2 /* series 2 */ - , dot11_to_rate_code(sc, rt, ph->rate3), ph->try3 /* series 3 */ + , dot11_to_ratecode(sc, rt, ph->rate1), ph->try1 /* series 1 */ + , dot11_to_ratecode(sc, rt, ph->rate2), ph->try2 /* series 2 */ + , dot11_to_ratecode(sc, rt, ph->rate3), ph->try3 /* series 3 */ ); } #endif @@ -2450,7 +2475,6 @@ goto hardstart_fail; \ } -#ifndef CONFIG_NET80211 int ath_d80211_tx(struct ieee80211_hw *hw, struct sk_buff *skb, @@ -2471,388 +2495,9 @@ return 1; } -#else - -/* - * Transmit a data packet. On failure caller is - * assumed to reclaim the resources. - * - * Context: process context with BH's disabled - */ -static int -ath_hardstart(struct sk_buff *skb, struct net_device *dev) -{ - struct ath_softc *sc = dev->priv; - struct ieee80211com *ic = &sc->sc_ic; - struct ieee80211_node *ni = NULL; - struct ath_buf *bf = NULL; - struct ieee80211_cb *cb = (struct ieee80211_cb *) skb->cb; - struct ether_header *eh; - int pktlen; - STAILQ_HEAD(tmp_bf_head, ath_buf) bf_head; - struct ath_buf *tbf, *tempbf; - struct sk_buff *tskb; - int framecnt; -#ifdef ATH_SUPERG_FF - struct ath_node *an; - struct ath_txq *txq = NULL; - int ff_flush; - struct ieee80211vap *vap; -#endif - - if ((dev->flags & IFF_RUNNING) == 0 || sc->sc_invalid) { - DPRINTF(sc, ATH_DEBUG_XMIT, - "%s: discard, invalid %d flags %x\n", - __func__, sc->sc_invalid, dev->flags); - sc->sc_stats.ast_tx_invalid++; - return -ENETDOWN; - } - - - STAILQ_INIT(&bf_head); - - if (cb->flags & M_RAW) { - ATH_HARDSTART_GET_TX_BUF_WITH_LOCK; - return ath_tx_startraw(dev, bf, skb); - } - - eh = (struct ether_header *) skb->data; - ni = cb->ni; /* NB: always passed down by 802.11 layer */ - if (ni == NULL) { - /* NB: this happens if someone marks the underlying device up */ - DPRINTF(sc, ATH_DEBUG_XMIT, - "%s: discard, no node in cb\n", __func__); - goto hardstart_fail; - } -#ifdef ATH_SUPERG_FF - vap = ni->ni_vap; - - if (M_FLAG_GET(skb, M_UAPSD)) { - /* bypass FF handling */ - ATH_HARDSTART_GET_TX_BUF_WITH_LOCK; - goto ff_bypass; - } - - /* - * Fast frames check. - */ - ATH_FF_MAGIC_CLR(skb); - an = ATH_NODE(ni); - - txq = sc->sc_ac2q[skb->priority]; - - if (txq->axq_depth > TAIL_DROP_COUNT) { - sc->sc_stats.ast_tx_discard++; - goto hardstart_fail; - } - - /* NB: use this lock to protect an->an_ff_txbuf in athff_can_aggregate() - * call too. - */ - ATH_TXQ_LOCK(txq); - if (athff_can_aggregate(sc, eh, an, skb, vap->iv_fragthreshold, &ff_flush)) { - - if (an->an_tx_ffbuf[skb->priority]) { /* i.e., frame on the staging queue */ - bf = an->an_tx_ffbuf[skb->priority]; - - /* get (and remove) the frame from staging queue */ - TAILQ_REMOVE(&txq->axq_stageq, bf, bf_stagelist); - an->an_tx_ffbuf[skb->priority] = NULL; - - ATH_TXQ_UNLOCK(txq); - - /* - * chain skbs and add FF magic - * - * NB: the arriving skb should not be on a list (skb->list), - * so "re-using" the skb next field should be OK. - */ - bf->bf_skb->next = skb; - skb->next = NULL; - skb = bf->bf_skb; - ATH_FF_MAGIC_PUT(skb); - - /* decrement extra node reference made when an_tx_ffbuf[] was set */ - //ieee80211_free_node(ni); /* XXX where was it set ? */ - - DPRINTF(sc, ATH_DEBUG_XMIT | ATH_DEBUG_FF, - "%s: aggregating fast-frame\n", __func__); - } else { - /* NB: careful grabbing the TX_BUF lock since still holding the txq lock. - * this could be avoided by always obtaining the txbuf earlier, - * but the "if" portion of this "if/else" clause would then need - * to give the buffer back. - */ - ATH_HARDSTART_GET_TX_BUF_WITH_LOCK; - DPRINTF(sc, ATH_DEBUG_XMIT | ATH_DEBUG_FF, - "%s: adding to fast-frame stage Q\n", __func__); - - bf->bf_skb = skb; - bf->bf_node = ni; - bf->bf_queueage = txq->axq_totalqueued; - an->an_tx_ffbuf[skb->priority] = bf; - - TAILQ_INSERT_HEAD(&txq->axq_stageq, bf, bf_stagelist); - - ATH_TXQ_UNLOCK(txq); - - return 0; - } - } else { - if (ff_flush) { - struct ath_buf *bf_ff = an->an_tx_ffbuf[skb->priority]; - - TAILQ_REMOVE(&txq->axq_stageq, bf_ff, bf_stagelist); - an->an_tx_ffbuf[skb->priority] = NULL; - - ATH_TXQ_UNLOCK(txq); - - /* encap and xmit */ - bf_ff->bf_skb = ieee80211_encap(ni, bf_ff->bf_skb, &framecnt); - - if (bf_ff->bf_skb == NULL) { - DPRINTF(sc, ATH_DEBUG_XMIT, - "%s: discard, ff flush encap failure\n", - __func__); - sc->sc_stats.ast_tx_encap++; - goto ff_flushbad; - } - pktlen = bf_ff->bf_skb->len; /* NB: don't reference skb below */ - /* NB: ath_tx_start() will use ATH_TXBUF_LOCK_BH(). The _BH - * portion is not needed here since we're running at - * interrupt time, but should be harmless. - */ - if (ath_tx_start(dev, ni, bf_ff, bf_ff->bf_skb, 0)) - goto ff_flushbad; - goto ff_flushdone; - ff_flushbad: - DPRINTF(sc, ATH_DEBUG_XMIT | ATH_DEBUG_FF, - "%s: ff stageq flush failure\n", __func__); - ieee80211_free_node(ni); - if (bf_ff->bf_skb) { - dev_kfree_skb(bf_ff->bf_skb); - bf_ff->bf_skb = NULL; - } - bf_ff->bf_node = NULL; - - ATH_TXBUF_LOCK(sc); - STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf_ff, bf_list); - ATH_TXBUF_UNLOCK(sc); - goto ff_flushdone; - } - /* - * XXX: out-of-order condition only occurs for AP mode and multicast. - * But, there may be no valid way to get this condition. - */ - else if (an->an_tx_ffbuf[skb->priority]) { - DPRINTF(sc, ATH_DEBUG_XMIT | ATH_DEBUG_FF, - "%s: Out-Of-Order fast-frame\n", __func__); - ATH_TXQ_UNLOCK(txq); - } else - ATH_TXQ_UNLOCK(txq); - - ff_flushdone: - ATH_HARDSTART_GET_TX_BUF_WITH_LOCK; - } - -ff_bypass: - -#else /* ATH_SUPERG_FF */ - - ATH_HARDSTART_GET_TX_BUF_WITH_LOCK; - -#endif /* ATH_SUPERG_FF */ - - /* - * Encapsulate the packet for transmission. - */ - skb = ieee80211_encap(ni, skb, &framecnt); - if (skb == NULL) { - DPRINTF(sc, ATH_DEBUG_XMIT, - "%s: discard, encapsulation failure\n", __func__); - sc->sc_stats.ast_tx_encap++; - goto hardstart_fail; - } - - if (framecnt > 1) { - int bfcnt; - - /* - ** Allocate 1 ath_buf for each frame given 1 was - ** already alloc'd - */ - ATH_TXBUF_LOCK(sc); - for (bfcnt = 1; bfcnt < framecnt; ++bfcnt) { - if ((tbf = STAILQ_FIRST(&sc->sc_txbuf)) != NULL) { - STAILQ_REMOVE_HEAD(&sc->sc_txbuf, bf_list); - STAILQ_INSERT_TAIL(&bf_head, tbf, bf_list); - } - else - break; - - ieee80211_ref_node(ni); - } - - if (bfcnt != framecnt) { - if (!STAILQ_EMPTY(&bf_head)) { - /* - ** Failed to alloc enough ath_bufs; - ** return to sc_txbuf list - */ - STAILQ_FOREACH_SAFE(tbf, &bf_head, bf_list, tempbf) { - STAILQ_INSERT_TAIL(&sc->sc_txbuf, tbf, bf_list); - } - } - ATH_TXBUF_UNLOCK(sc); - STAILQ_INIT(&bf_head); - goto hardstart_fail; - } - ATH_TXBUF_UNLOCK(sc); - - while ((bf = STAILQ_FIRST(&bf_head)) != NULL && skb != NULL) { - int nextfraglen = 0; - - STAILQ_REMOVE_HEAD(&bf_head, bf_list); - tskb = skb->next; - skb->next = NULL; - if (tskb) - nextfraglen = tskb->len; - - if (ath_tx_start(dev, ni, bf, skb, nextfraglen) != 0) { - STAILQ_INSERT_TAIL(&bf_head, bf, bf_list); - skb->next = tskb; - goto hardstart_fail; - } - skb = tskb; - } - } else { - if (ath_tx_start(dev, ni, bf, skb, 0) != 0) { - STAILQ_INSERT_TAIL(&bf_head, bf, bf_list); - goto hardstart_fail; - } - } - -#ifdef ATH_SUPERG_FF - /* - * flush out stale FF from staging Q for applicable operational modes. - */ - /* XXX: ADHOC mode too? */ - if (txq && ic->ic_opmode == IEEE80211_IF_TYPE_AP) - ath_ffstageq_flush(sc, txq, ath_ff_ageflushtestdone); -#endif - - return 0; - -hardstart_fail: - if (!STAILQ_EMPTY(&bf_head)) { - ATH_TXBUF_LOCK(sc); - STAILQ_FOREACH_SAFE(tbf, &bf_head, bf_list, tempbf) { - tbf->bf_skb = NULL; - tbf->bf_node = NULL; - - if (ni != NULL) - ieee80211_free_node(ni); - - STAILQ_INSERT_TAIL(&sc->sc_txbuf, tbf, bf_list); - } - ATH_TXBUF_UNLOCK(sc); - } - - /* free sk_buffs */ - while (skb) { - tskb = skb->next; - skb->next = NULL; - dev_kfree_skb(skb); - skb = tskb; - } - return 0; /* NB: return !0 only in a ``hard error condition'' */ -} -#undef ATH_HARDSTART_GET_TX_BUF_WITH_LOCK -#endif - -#if 0 -/* - * Transmit a management frame. On failure we reclaim the skbuff. - * Note that management frames come directly from the 802.11 layer - * and do not honor the send queue flow control. Need to investigate - * using priority queueing so management frames can bypass data. - * - * Context: hwIRQ and softIRQ - */ -static int -ath_mgtstart(struct ieee80211com *ic, struct sk_buff *skb) -{ - struct net_device *dev = ic->ic_dev; - struct ath_softc *sc = dev->priv; - struct ieee80211_node *ni = NULL; - struct ath_buf *bf = NULL; - struct ieee80211_cb *cb; - int error; - - if ((dev->flags & IFF_RUNNING) == 0 || sc->sc_invalid) { - DPRINTF(sc, ATH_DEBUG_XMIT, - "%s: discard, invalid %d flags %x\n", - __func__, sc->sc_invalid, dev->flags); - sc->sc_stats.ast_tx_invalid++; - error = -ENETDOWN; - goto bad; - } - /* - * Grab a TX buffer and associated resources. - */ - ATH_TXBUF_LOCK_IRQ(sc); - bf = STAILQ_FIRST(&sc->sc_txbuf); - if (bf != NULL) - STAILQ_REMOVE_HEAD(&sc->sc_txbuf, bf_list); - if (STAILQ_EMPTY(&sc->sc_txbuf)) { - DPRINTF(sc, ATH_DEBUG_XMIT, "%s: stop queue\n", __func__); - sc->sc_stats.ast_tx_qstop++; - netif_stop_queue(dev); - sc->sc_devstopped=1; - ATH_SCHEDULE_TQUEUE(&sc->sc_txtq, NULL); - } - ATH_TXBUF_UNLOCK_IRQ(sc); - if (bf == NULL) { - printk("ath_mgtstart: discard, no xmit buf\n"); - sc->sc_stats.ast_tx_nobufmgt++; - error = -ENOBUFS; - goto bad; - } - - /* - * NB: the referenced node pointer is in the - * control block of the sk_buff. This is - * placed there by ieee80211_mgmt_output because - * we need to hold the reference with the frame. - */ - cb = (struct ieee80211_cb *)skb->cb; - ni = cb->ni; - error = ath_tx_start(dev, ni, bf, skb, 0); - if (error == 0) { - sc->sc_stats.ast_tx_mgmt++; - return 0; - } - /* fall thru... */ -bad: - if (ni != NULL) - ieee80211_free_node(ni); - if (bf != NULL) { - bf->bf_skb = NULL; - bf->bf_node = NULL; - - ATH_TXBUF_LOCK_IRQ(sc); - STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list); - ATH_TXBUF_UNLOCK_IRQ(sc); - } - dev_kfree_skb_any(skb); - skb = NULL; - return error; -} -#endif - #ifdef AR_DEBUG static void -ath_keyprint(const char *tag, u_int ix, +ath_keyprint(struct ath_softc *sc, const char *tag, u_int ix, const AR5K_KEYVAL *hk, const u_int8_t mac[IEEE80211_ADDR_LEN]) { static const char *ciphers[] = { @@ -2870,9 +2515,16 @@ printk("%02x", hk->wk_key[i]); printk(" mac " MAC_FMT, MAC_ARG(mac)); if (hk->wk_type == AR5K_CIPHER_TKIP) { - printk(" mic "); + printk(" %s ", sc->sc_splitmic ? "mic" : "rxmic"); for (i = 0; i < sizeof(hk->wk_mic); i++) printk("%02x", hk->wk_mic[i]); +#if AR5K_ABI_VERSION > 0x06052200 + if (!sc->sc_splitmic) { + printk(" txmic "); + for (i = 0; i < sizeof(hk->kv_txmic); i++) + printk("%02x", hk->kv_txmic[i]); + } +#endif } printk("\n"); } @@ -2892,27 +2544,41 @@ KASSERT(hk->wk_type == AR5K_CIPHER_TKIP, ("got a non-TKIP key, cipher %u", hk->wk_type)); - KASSERT(sc->sc_splitmic, ("key cache !split")); - if (!(sc->sc_opmode == IEEE80211_IF_TYPE_STA && key->hw_key_idx < AR5K_KEYVAL_ID_NUM)) { - /* - * TX key goes at first index, RX key at +32. - * The hal handles the MIC keys at index+64. - */ - memcpy(hk->wk_mic, key->key + 16 /* ALG_TKIP_TEMP_AUTH_TX_MIC_KEY */, - 8 /* FIXME: define a constant */); - KEYPRINTF(sc, key->hw_key_idx, hk, zerobssid); - if (!ath_hal_keyset(ah, key->hw_key_idx, hk, zerobssid)) - return 0; - - memcpy(hk->wk_mic, key->key + 24 /* ALG_TKIP_TEMP_AUTH_RX_MIC_KEY */, - 8 /* FIXME: define a constant */); - KEYPRINTF(sc, key->hw_key_idx + 32, hk, mac); - /* XXX delete tx key on failure? */ - return ath_hal_keyset(ah, key->hw_key_idx + 32, hk, mac); + if (!(sc->sc_opmode == AR5K_M_STA && key->hw_key_idx < IEEE80211_WEP_NKID)) { + if (sc->sc_splitmic) { + /* + * TX key goes at first index, RX key at the rx index. + * The hal handles the MIC keys at index+64. + */ + memcpy(hk->wk_mic, key->key + 16 /* ALG_TKIP_TEMP_AUTH_TX_MIC_KEY */, + 8 /* FIXME: define a constant */); + KEYPRINTF(sc, key->hw_key_idx, hk, zerobssid); + if (!ath_hal_keyset(ah, key->hw_key_idx, hk, zerobssid)) + return 0; + memcpy(hk->wk_mic, key->key + 24 /* ALG_TKIP_TEMP_AUTH_RX_MIC_KEY */, + 8 /* FIXME: define a constant */); + KEYPRINTF(sc, key->hw_key_idx + 32, hk, mac); + /* XXX delete tx key on failure? */ + return ath_hal_keyset(ah, key->hw_key_idx + 32, hk, mac); + } else { + /* + * Room for both TX+RX MIC keys in one key cache + * slot, just set key at the first index; the HAL + * will handle the reset. + */ + memcpy(hk->wk_mic, key->key + 24 /* ALG_TKIP_TEMP_AUTH_RX_MIC_KEY */, + 8 /* FIXME: define a constant */); +#if AR5K_ABI_VERSION > 0x06052200 + memcpy(hk->kv_txmic, key->key + 16 /* ALG_TKIP_TEMP_AUTH_TX_MIC_KEY */, + 8 /* FIXME: define a constant */); +#endif + KEYPRINTF(sc, key->hw_key_idx, hk, mac); + return ath_hal_keyset(ah, key->hw_key_idx, hk, mac); + } } else { /* * RX key goes at first index. - * The hal handles the MIC keys are index+64. + * The HAL handles the MIC keys are index+64. */ memcpy(hk->wk_mic, key->key + 24 /* ALG_TKIP_TEMP_AUTH_RX_MIC_KEY */, 8 /* FIXME: define a constant */); @@ -2965,8 +2631,7 @@ hk.wk_type = AR5K_CIPHER_CLR; if (hk.wk_type == AR5K_CIPHER_TKIP && - (hw->flags & IEEE80211_HW_TKIP_INCLUDE_MMIC) == 0 && - sc->sc_splitmic) { + (hw->flags & IEEE80211_HW_TKIP_INCLUDE_MMIC) == 0) { return ath_keyset_tkip(sc, key, &hk, mac); } else { KEYPRINTF(sc, key->hw_key_idx, &hk, mac); @@ -3003,7 +2668,7 @@ if (isset(sc->sc_keymap, keyix + 32) || isset(sc->sc_keymap, keyix + 64) || isset(sc->sc_keymap, keyix + 32 + 64) || - keyix < AR5K_KEYVAL_ID_NUM) { + keyix < IEEE80211_WEP_NKID) { /* index unavailable */ /* XXX statistic */ if (keyix == (i + 1) * NBBY) { @@ -3029,6 +2694,53 @@ } /* + * Allocate tx/rx key slots for TKIP. We allocate two slots for + * each key, one for decrypt/encrypt and the other for the MIC. + */ +static u_int16_t +key_alloc_pair(struct ath_softc *sc) +{ +#define N(a) (sizeof(a)/sizeof(a[0])) + u_int i, keyix; + + KASSERT(!sc->sc_splitmic, ("key cache split")); + /* XXX could optimize */ + for (i = 0; i < N(sc->sc_keymap)/4; i++) { + u_int8_t b = sc->sc_keymap[i]; + if (b != 0xff) { + /* + * One or more slots in this byte are free. + */ + keyix = i*NBBY; + while (b & 1) { + again: + keyix++; + b >>= 1; + } + if (keyix < IEEE80211_WEP_NKID || + isset(sc->sc_keymap, keyix+64)) { + /* full pair unavailable */ + /* XXX statistic */ + if (keyix == (i+1)*NBBY) { + /* no slots were appropriate, advance */ + continue; + } + goto again; + } + setbit(sc->sc_keymap, keyix); + setbit(sc->sc_keymap, keyix+64); + DPRINTF(sc, ATH_DEBUG_KEYCACHE, + "%s: key pair %u,%u\n", + __func__, keyix, keyix+64); + return keyix; + } + } + DPRINTF(sc, ATH_DEBUG_KEYCACHE, "%s: out of pair space\n", __func__); + return IEEE80211_KEYIX_NONE; +#undef N +} + +/* * Allocate a single key cache slot. */ static u_int16_t @@ -3049,11 +2761,11 @@ again: keyix++, b >>= 1; } - if (keyix < AR5K_KEYVAL_ID_NUM || - (keyix >= 32 && keyix < (32 + AR5K_KEYVAL_ID_NUM)) || - (keyix >= 64 && keyix < (64 + AR5K_KEYVAL_ID_NUM)) || + if (keyix < IEEE80211_WEP_NKID || + (keyix >= 32 && keyix < (32 + IEEE80211_WEP_NKID)) || + (keyix >= 64 && keyix < (64 + IEEE80211_WEP_NKID)) || (keyix >= (32 + 64) && - keyix < (32 + 64 + AR5K_KEYVAL_ID_NUM))) { + keyix < (32 + 64 + IEEE80211_WEP_NKID))) { /* never alloc a default key or default TKIP key pair */ if (keyix == (i + 1) * NBBY) { @@ -3074,7 +2786,7 @@ } /* - * Allocate one or more key cache slots for a uniacst key. The + * Allocate one or more key cache slots for a unicast key. The * key itself is needed only to identify the cipher. For hardware * TKIP with split cipher+MIC keys we allocate two key cache slot * pairs so that we can setup separate TX and RX MIC keys. Note @@ -3116,9 +2828,11 @@ * is not a shared-key. */ if (key->alg == ALG_TKIP && - (hw->flags & IEEE80211_HW_TKIP_INCLUDE_MMIC) == 0 && - sc->sc_splitmic) { - return key_alloc_2pair(sc); + (hw->flags & IEEE80211_HW_TKIP_INCLUDE_MMIC) == 0) { + if (sc->sc_splitmic) + return key_alloc_2pair(sc); + else + return key_alloc_pair(sc); } else return key_alloc_single(sc); } @@ -3150,11 +2864,13 @@ if (1) { clrbit(sc->sc_keymap, keyix); if (key->alg == ALG_TKIP && - (hw->flags & IEEE80211_HW_TKIP_INCLUDE_MMIC) == 0 && - sc->sc_splitmic) { + (hw->flags & IEEE80211_HW_TKIP_INCLUDE_MMIC) == 0) { clrbit(sc->sc_keymap, keyix + 64); /* TX key MIC */ - clrbit(sc->sc_keymap, keyix + 32); /* RX key */ - clrbit(sc->sc_keymap, keyix + 32 + 64); /* RX key MIC */ + if (sc->sc_splitmic) { + /* +32 for RX key, +32+64 for RX key MIC */ + clrbit(sc->sc_keymap, keyix+32); + clrbit(sc->sc_keymap, keyix+32+64); + } } } return 1; @@ -3206,7 +2922,7 @@ * operating mode and state: * * o always accept unicast, broadcast, and multicast traffic - * o maintain current state of phy error reception (the hal + * o maintain current state of phy error reception (the HAL * may enable phy error frames for noise immunity work) * o probe request frames are accepted only when operating in * hostap, adhoc, or monitor modes @@ -3229,15 +2945,15 @@ rfilt = (ath_hal_getrxfilter(ah) & RX_FILTER_PRESERVE) | AR5K_RX_FILTER_UCAST | AR5K_RX_FILTER_BCAST | AR5K_RX_FILTER_MCAST; - if (sc->sc_opmode != IEEE80211_IF_TYPE_STA) + if (sc->sc_opmode != AR5K_M_STA) rfilt |= AR5K_RX_FILTER_PROBEREQ; - if (sc->sc_opmode != IEEE80211_IF_TYPE_AP) + if (sc->sc_opmode != AR5K_M_HOSTAP) rfilt |= AR5K_RX_FILTER_PROM; - if (sc->sc_opmode == IEEE80211_IF_TYPE_STA || - sc->sc_opmode == IEEE80211_IF_TYPE_IBSS || /* NB: AHDEMO too */ + if (sc->sc_opmode == AR5K_M_STA || + sc->sc_opmode == AR5K_M_IBSS || /* NB: AHDEMO too */ (sc->sc_nostabeacons) || sc->sc_scanning) rfilt |= AR5K_RX_FILTER_BEACON; - if (sc->sc_opmode == IEEE80211_IF_TYPE_MNTR) + if (sc->sc_opmode == AR5K_M_MONITOR) rfilt |= (AR5K_RX_FILTER_CONTROL | AR5K_RX_FILTER_BEACON | AR5K_RX_FILTER_PROBEREQ | AR5K_RX_FILTER_PROM); return rfilt; @@ -3246,7 +2962,7 @@ #if 0 /* - * Merge multicast addresses from all vap's to form the + * Merge multicast addresses from all VAPs to form the * hardware filter. Ideally we should only inspect our * own list and the 802.11 layer would merge for us but * that's a bit difficult so for now we put the onus on @@ -3266,7 +2982,7 @@ TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) { struct net_device *dev = vap->iv_dev; for (mc = dev->mc_list; mc; mc = mc->next) { - /* calculate XOR of eight 6bit values */ + /* calculate XOR of eight 6-bit values */ val = LE_READ_4(mc->dmi_addr + 0); pos = (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val; val = LE_READ_4(mc->dmi_addr + 3); @@ -3343,7 +3059,7 @@ * immediately. For other operation we defer the change * until beacon updates have propagated to the stations. */ - if (ic->ic_opmode == IEEE80211_IF_TYPE_AP) + if (ic->ic_opmode == IEEE80211_M_HOSTAP) sc->sc_updateslot = UPDATE; else if (dev->flags & IFF_RUNNING) ath_setslottime(sc); @@ -3367,7 +3083,7 @@ struct ieee80211com *ic = vap->iv_ic; struct ath_softc *sc = ic->ic_dev->priv; - if (ic->ic_opmode == IEEE80211_IF_TYPE_AP && IS_CAPABLE(vap)) { + if (ic->ic_opmode == IEEE80211_M_HOSTAP && IS_CAPABLE(vap)) { /* Dynamic Turbo is supported on this channel. */ sc->sc_dturbo = 1; @@ -3560,7 +3276,7 @@ struct ieee80211com *ic = &sc->sc_ic; int newflags; - KASSERT(ic->ic_opmode == IEEE80211_IF_TYPE_AP, + KASSERT(ic->ic_opmode == IEEE80211_M_HOSTAP, ("unexpected operating mode %d", ic->ic_opmode)); DPRINTF(sc, ATH_DEBUG_STATE, "%s: dynamic turbo switch to %s mode\n", @@ -3623,14 +3339,11 @@ ath_beaconq_config(struct ath_softc *sc) { #define ATH_EXPONENT_TO_VALUE(v) ((1<<v)-1) -#ifdef CONFIG_NET80211 - struct ieee80211com *ic = &sc->sc_ic; -#endif struct ath_hal *ah = sc->sc_ah; AR5K_TXQ_INFO qi; ath_hal_gettxqueueprops(ah, sc->sc_bhalq, &qi); - if (sc->sc_opmode == IEEE80211_IF_TYPE_AP) { + if (sc->sc_opmode == AR5K_M_HOSTAP) { /* * Always burst out beacon and CAB traffic. */ @@ -3661,88 +3374,7 @@ #undef ATH_EXPONENT_TO_VALUE } -#ifdef CONFIG_NET80211 -/* - * Allocate and setup an initial beacon frame. - * - * Context: softIRQ - */ -static int -ath_beacon_alloc(struct ath_softc *sc, struct ieee80211_node *ni) -{ - struct ath_vap *avp = ATH_VAP(ni->ni_vap); - struct ieee80211_frame *wh; - struct ath_buf *bf; - struct sk_buff *skb; - /* - * release the previous beacon skb , if it already exists. - */ - bf = avp->av_bcbuf; - if (bf->bf_skb != NULL) { - bus_unmap_single(sc->sc_bdev, - bf->bf_skbaddr, bf->bf_skb->len, BUS_DMA_TODEVICE); - dev_kfree_skb(bf->bf_skb); - bf->bf_skb = NULL; - } - if (bf->bf_node != NULL) { - ieee80211_free_node(bf->bf_node); - bf->bf_node = NULL; - } - - /* - * NB: the beacon data buffer must be 32-bit aligned; - * we assume the mbuf routines will return us something - * with this alignment (perhaps should assert). - */ - skb = ieee80211_beacon_alloc(ni, &avp->av_boff); - if (skb == NULL) { - DPRINTF(sc, ATH_DEBUG_BEACON, "%s: cannot get sk_buff\n", - __func__); - sc->sc_stats.ast_be_nobuf++; - return -ENOMEM; - } - - /* - * Calculate a TSF adjustment factor required for - * staggered beacons. Note that we assume the format - * of the beacon frame leaves the tstamp field immediately - * following the header. - */ - if (sc->sc_stagbeacons && avp->av_bslot > 0) { - uint64_t tsfadjust; - /* - * The beacon interval is in TU's; the TSF in usecs. - * We figure out how many TU's to add to align the - * timestamp then convert to TSF units and handle - * byte swapping before writing it in the frame. - * The hardware will then add this each time a beacon - * frame is sent. Note that we align vap's 1..N - * and leave vap 0 untouched. This means vap 0 - * has a timestamp in one beacon interval while the - * others get a timestamp aligned to the next interval. - */ - tsfadjust = (ni->ni_intval * (ATH_BCBUF - avp->av_bslot)) / ATH_BCBUF; - tsfadjust = cpu_to_le64(tsfadjust << 10); /* TU->TSF */ - - DPRINTF(sc, ATH_DEBUG_BEACON, - "%s: %s beacons, bslot %d intval %u tsfadjust %llu\n", - __func__, sc->sc_stagbeacons ? "stagger" : "burst", - avp->av_bslot, ni->ni_intval, (long long) tsfadjust); - - wh = (struct ieee80211_frame *) skb->data; - memcpy(&wh[1], &tsfadjust, sizeof(tsfadjust)); - } - - bf->bf_node = ieee80211_ref_node(ni); - bf->bf_skbaddr = bus_map_single(sc->sc_bdev, - skb->data, skb->len, BUS_DMA_TODEVICE); - bf->bf_skb = skb; - - return 0; -} -#endif - /* * Setup the beacon frame for transmit. */ @@ -3774,7 +3406,7 @@ flags |= AR5K_TXDESC_INTREQ; #endif - if (sc->sc_opmode == IEEE80211_IF_TYPE_IBSS && sc->sc_hasveol) { + if (sc->sc_opmode == AR5K_M_IBSS && sc->sc_hasveol) { ds->ds_link = bf->bf_daddr; /* self-linked */ flags |= AR5K_TXDESC_VEOL; /* @@ -3809,27 +3441,22 @@ u_int8_t cix; int pktlen; pktlen = skb->len + IEEE80211_CRC_LEN; - cix = rt->info[sc->sc_protrix].control_rate; + cix = rt->rates[sc->sc_protrix].controlRate; /* for XR VAP use different RTSCTS rates and calculate duration */ - ctsrate = rt->info[cix].rate_code; - if (USE_SHPREAMBLE(ic) && HAS_SHPREAMBLE(cix)) - ctsrate |= AR5K_SET_SHORT_PREAMBLE; + ctsrate = rt->rates[cix].rateCode; + if (USE_SHPREAMBLE(ic)) + ctsrate |= rt->rates[cix].shortPreamble; flags |= AR5K_TXDESC_CTSENA; rt = sc->sc_xr_rates; ctsduration = ath_hal_computetxtime(ah,rt, pktlen, IEEE80211_XR_DEFAULT_RATE_INDEX, FALSE); - rate = rt->info[IEEE80211_XR_DEFAULT_RATE_INDEX].rate_code; + rate = rt->rates[IEEE80211_XR_DEFAULT_RATE_INDEX].rateCode; } #endif -#ifdef CONFIG_NET80211 - hdrlen = sizeof(struct ieee80211_frame); - power = ni->ni_txpower; -#else hdrlen = ieee80211_get_hdrlen_from_skb(skb); /* FIXME : what unit does the hal need power is? */ power = control->power_level > 60 ? 60 : control->power_level; -#endif ath_hal_setuptxdesc(ah, ds , skb->len + IEEE80211_CRC_LEN /* frame length */ @@ -3842,9 +3469,9 @@ , flags /* no ack, veol for beacons */ , ctsrate /* rts/cts rate */ , ctsduration /* rts/cts duration */ - , 0 /* comp icv len */ - , 0 /* comp iv len */ - , ATH_COMP_PROC_NO_COMP_NO_CCS /* comp scheme */ +// , 0 /* comp icv len */ +// , 0 /* comp iv len */ +// , ATH_COMP_PROC_NO_COMP_NO_CCS /* comp scheme */ ); /* NB: beacon's BufLen must be a multiple of 4 bytes */ @@ -3916,10 +3543,11 @@ /* * if the CABQ traffic from previous DTIM is pending and the current * beacon is also a DTIM. - * 1) if there is only one vap let the cab traffic continue. - * 2) if there are more than one vap and we are using staggered + * 1) if there is only one VAP let the cab traffic continue. + * 2) if there are more than one VAP and we are using staggered * beacons, then drain the cabq by dropping all the frames in - * the cabq so that the current vaps cab traffic can be scheduled. + * the cabq so that the current VAP's cab traffic can be scheduled. + * XXX: Need to handle the last MORE_DATA bit here. */ /* FIXME: why drop the packets? */ if (ncabq && (avp->av_boff.bo_tim[4] & 1) && sc->sc_cabq->axq_depth) { @@ -3986,7 +3614,7 @@ */ if (ath_hal_numtxpending(ah, sc->sc_bhalq) != 0) { sc->sc_bmisscount++; - /* XXX: doth needs the chanchange IE countdown decremented. + /* XXX: 802.11h needs the chanchange IE countdown decremented. * We should consider adding a net80211 call to indicate * a beacon miss so appropriate action could be taken * (in that layer). @@ -4005,57 +3633,6 @@ sc->sc_bmisscount = 0; } -#ifdef CONFIG_NET80211 - /* - * Generate beacon frames. If we are sending frames - * staggered then calculate the slot for this frame based - * on the tsf to safeguard against missing an swba. - * Otherwise we are bursting all frames together and need - * to generate a frame for each vap that is up and running. - */ - if (sc->sc_stagbeacons) { /* staggered beacons */ - struct ieee80211com *ic = &sc->sc_ic; - u_int64_t tsf; - u_int32_t tsftu; - - tsf = ath_hal_gettsf64(ah); - tsftu = TSF_TO_TU(tsf >> 32, tsf); - slot = ((tsftu % ic->ic_lintval) * ATH_BCBUF) / ic->ic_lintval; - vap = sc->sc_bslot[(slot + 1) % ATH_BCBUF]; - DPRINTF(sc, ATH_DEBUG_BEACON_PROC, - "%s: slot %d [tsf %llu tsftu %u intval %u] vap %p\n", - __func__, slot, (long long) tsf, tsftu, ic->ic_lintval, vap); - bfaddr = 0; - if (vap != NULL) { - bf = ath_beacon_generate(sc, vap, needmark); - if (bf != NULL) - bfaddr = bf->bf_daddr; - } - } else { /* burst'd beacons */ - u_int32_t *bflink; - - bflink = &bfaddr; - /* XXX rotate/randomize order? */ - for (slot = 0; slot < ATH_BCBUF; slot++) { - vap = sc->sc_bslot[slot]; - if (vap != NULL) { - bf = ath_beacon_generate(sc, vap, needmark); - if (bf != NULL) { -#ifdef AH_NEED_DESC_SWAP - if (bflink != &bfaddr) - *bflink = cpu_to_le32(bf->bf_daddr); - else - *bflink = bf->bf_daddr; -#else - *bflink = bf->bf_daddr; -#endif - bflink = &bf->bf_desc->ds_link; - } - } - } - *bflink = 0; /* link of last frame */ - } -#else { u_int32_t *bflink; @@ -4083,7 +3660,6 @@ spin_unlock(&sc->sc_bss_lock); } -#endif /* * Handle slot time change when a non-ERP station joins/leaves * an 11g network. The 802.11 layer notifies us via callback, @@ -4098,7 +3674,7 @@ * again. If we miss a beacon for that slot then we'll be * slow to transition but we'll be sure at least one beacon * interval has passed. When bursting slot is always left - * set to sc_num_bss so this check is a noop. + * set to sc_num_bss so this check is a no-op. */ /* XXX locking */ if (sc->sc_updateslot == UPDATE) { @@ -4115,7 +3691,7 @@ * the default rx antenna if noticeably more frames went out * on the non-default antenna. Only do this if rx diversity * is off. - * XXX assumes 2 anntenae + * XXX assumes 2 antennae */ otherant = sc->sc_defant & 1 ? 2 : 1; if (sc->sc_ant_tx[otherant] > sc->sc_ant_tx[sc->sc_defant] + ATH_ANTENNA_DIFF) { @@ -4131,7 +3707,7 @@ if (bfaddr != 0) { /* - * Stop any current dma and put the new frame(s) on the queue. + * Stop any current DMA and put the new frame(s) on the queue. * This should never fail since we check above that no frames * are still pending on the queue. */ @@ -4145,7 +3721,7 @@ ath_hal_puttxbuf(ah, sc->sc_bhalq, bfaddr); ath_hal_txstart(ah, sc->sc_bhalq); - sc->sc_stats.ast_be_xmit++; /* XXX per-vap? */ + sc->sc_stats.ast_be_xmit++; /* XXX per-VAP? */ } #undef TSF_TO_TU } @@ -4160,7 +3736,7 @@ /* * XXX:if the bmisscount is cleared while the * tasklet execution is pending, the following - * check will be true , in which case return + * check will be true, in which case return * without resetting the driver. */ if (sc->sc_bmisscount <= BSTUCK_THRESH) @@ -4225,7 +3801,7 @@ bus_dma_sync_single(sc->sc_bdev, bf->bf_skbaddr, bf->bf_skb->len, BUS_DMA_TODEVICE); - /* NB: caller is known to have already stopped tx dma */ + /* NB: caller is known to have already stopped tx DMA */ ath_hal_puttxbuf(ah, sc->sc_bhalq, bf->bf_daddr); ath_hal_txstart(ah, sc->sc_bhalq); DPRINTF(sc, ATH_DEBUG_BEACON_PROC, "%s: TXDP%u = %llx (%p)\n", __func__, @@ -4282,7 +3858,7 @@ * timers according to the timestamp of the last received * beacon and the current TSF, configures PCF and DTIM * handling, programs the sleep registers so the hardware - * will wakeup in time to receive beacons, and configures + * will wake up in time to receive beacons, and configures * the beacon miss handling so we'll receive a BMISS * interrupt when we stop seeing beacons from the AP * we've associated with. @@ -4311,7 +3887,7 @@ nexttbtt = TSF_TO_TU(LE_READ_4(ni->ni_tstamp.data + 4), LE_READ_4(ni->ni_tstamp.data)); /* XXX conditionalize multi-bss support? */ - if (ic->ic_opmode == IEEE80211_IF_TYPE_AP) { + if (ic->ic_opmode == IEEE80211_M_HOSTAP) { /* * For multi-bss ap support beacons are either staggered * evenly over N slots or burst together. For the former @@ -4323,7 +3899,7 @@ if (sc->sc_stagbeacons) intval /= ATH_BCBUF; /* for staggered beacons */ if ((sc->sc_nostabeacons) && - (vap->iv_opmode == IEEE80211_IF_TYPE_AP)) + (vap->iv_opmode == IEEE80211_M_HOSTAP)) nexttbtt = 0; } else intval = ni->ni_intval & AR5K_BEACON_PERIOD; @@ -4333,7 +3909,7 @@ nexttbtt = roundup(nexttbtt, intval); DPRINTF(sc, ATH_DEBUG_BEACON, "%s: nexttbtt %u intval %u (%u)\n", __func__, nexttbtt, intval, ni->ni_intval); - if (ic->ic_opmode == IEEE80211_IF_TYPE_STA && !(sc->sc_nostabeacons)) { + if (ic->ic_opmode == IEEE80211_M_STA && !(sc->sc_nostabeacons)) { AR5K_BEACON_STATE bs; u_int64_t tsf; u_int32_t tsftu; @@ -4369,13 +3945,13 @@ } while (nexttbtt < tsftu); #undef FUDGE memset(&bs, 0, sizeof(bs)); - bs.bs_interval = intval; - bs.bs_next_beacon = nexttbtt; - bs.bs_dtim_period = dtimperiod * intval; - bs.bs_next_dtim = bs.bs_next_beacon + dtimcount * intval; - bs.bs_cfp_period = cfpperiod * bs.bs_dtim_period; - bs.bs_cfp_next = bs.bs_next_dtim + cfpcount * bs.bs_dtim_period; - bs.bs_cfp_max_duration = 0; + bs.bs_intval = intval; + bs.bs_nexttbtt = nexttbtt; + bs.bs_dtim... [truncated message content] |