* [PATCH 1/2] ath9k: change beacon allocation to prefer the first beacon slot @ 2010-05-13 18:37 Felix Fietkau 2010-05-13 18:37 ` [PATCH 2/2] ath9k: remove VEOL support for ad-hoc Felix Fietkau 0 siblings, 1 reply; 3+ messages in thread From: Felix Fietkau @ 2010-05-13 18:37 UTC (permalink / raw) To: linux-wireless; +Cc: lrodriguez, linville This fixes IBSS beacon transmissions without VEOL enabled Signed-off-by: Felix Fietkau <nbd@openwrt.org> --- drivers/net/wireless/ath/ath9k/beacon.c | 12 +++--------- 1 files changed, 3 insertions(+), 9 deletions(-) diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index c8a4558..77face7 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c @@ -274,17 +274,11 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif) avp->av_bslot = 0; for (slot = 0; slot < ATH_BCBUF; slot++) if (sc->beacon.bslot[slot] == NULL) { - /* - * XXX hack, space out slots to better - * deal with misses - */ - if (slot+1 < ATH_BCBUF && - sc->beacon.bslot[slot+1] == NULL) { - avp->av_bslot = slot+1; - break; - } avp->av_bslot = slot; + /* NB: keep looking for a double slot */ + if (slot == 0 || !sc->beacon.bslot[slot-1]) + break; } BUG_ON(sc->beacon.bslot[avp->av_bslot] != NULL); sc->beacon.bslot[avp->av_bslot] = vif; -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] ath9k: remove VEOL support for ad-hoc 2010-05-13 18:37 [PATCH 1/2] ath9k: change beacon allocation to prefer the first beacon slot Felix Fietkau @ 2010-05-13 18:37 ` Felix Fietkau 2010-05-13 21:05 ` Benoit Papillault 0 siblings, 1 reply; 3+ messages in thread From: Felix Fietkau @ 2010-05-13 18:37 UTC (permalink / raw) To: linux-wireless; +Cc: lrodriguez, linville With VEOL, Beacon transmission in ad-hoc does not currently work. I believe for larger ad-hoc networks, VEOL is too unreliable, as it can get beacon transmissions stuck during synchronization. Use SWBA based beacon trasmission similar to AP mode instead. Signed-off-by: Felix Fietkau <nbd@openwrt.org> --- drivers/net/wireless/ath/ath9k/beacon.c | 63 +++++-------------------------- 1 files changed, 10 insertions(+), 53 deletions(-) diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index 77face7..f43d85a 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c @@ -76,22 +76,13 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, ds = bf->bf_desc; flags = ATH9K_TXDESC_NOACK; - if (((sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) || - (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) && - (ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) { - ds->ds_link = bf->bf_daddr; /* self-linked */ - flags |= ATH9K_TXDESC_VEOL; - /* Let hardware handle antenna switching. */ - antenna = 0; - } else { - ds->ds_link = 0; - /* - * Switch antenna every beacon. - * Should only switch every beacon period, not for every SWBA - * XXX assumes two antennae - */ - antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1); - } + ds->ds_link = 0; + /* + * Switch antenna every beacon. + * Should only switch every beacon period, not for every SWBA + * XXX assumes two antennae + */ + antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1); sband = &sc->sbands[common->hw->conf.channel->band]; rate = sband->bitrates[rateidx].hw_value; @@ -215,36 +206,6 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw, return bf; } -/* - * Startup beacon transmission for adhoc mode when they are sent entirely - * by the hardware using the self-linked descriptor + veol trick. -*/ -static void ath_beacon_start_adhoc(struct ath_softc *sc, - struct ieee80211_vif *vif) -{ - struct ath_hw *ah = sc->sc_ah; - struct ath_common *common = ath9k_hw_common(ah); - struct ath_buf *bf; - struct ath_vif *avp; - struct sk_buff *skb; - - avp = (void *)vif->drv_priv; - - if (avp->av_bcbuf == NULL) - return; - - bf = avp->av_bcbuf; - skb = bf->bf_mpdu; - - ath_beacon_setup(sc, avp, bf, 0); - - /* NB: caller is known to have already stopped tx dma */ - ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr); - ath9k_hw_txstart(ah, sc->beacon.beaconq); - ath_print(common, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n", - sc->beacon.beaconq, ito64(bf->bf_daddr), bf->bf_desc); -} - int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif) { struct ath_softc *sc = aphy->sc; @@ -265,7 +226,8 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif) list_del(&avp->av_bcbuf->list); if (sc->sc_ah->opmode == NL80211_IFTYPE_AP || - !(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) { + sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC || + sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) { int slot; /* * Assign the vif to a beacon xmit slot. As @@ -715,8 +677,7 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc, * self-linked tx descriptor and let the hardware deal with things. */ intval |= ATH9K_BEACON_ENA; - if (!(ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) - ah->imask |= ATH9K_INT_SWBA; + ah->imask |= ATH9K_INT_SWBA; ath_beaconq_config(sc); @@ -726,10 +687,6 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc, ath9k_beacon_init(sc, nexttbtt, intval); sc->beacon.bmisscnt = 0; ath9k_hw_set_interrupts(ah, ah->imask); - - /* FIXME: Handle properly when vif is NULL */ - if (vif && ah->caps.hw_caps & ATH9K_HW_CAP_VEOL) - ath_beacon_start_adhoc(sc, vif); } void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif) -- 1.6.4.2 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 2/2] ath9k: remove VEOL support for ad-hoc 2010-05-13 18:37 ` [PATCH 2/2] ath9k: remove VEOL support for ad-hoc Felix Fietkau @ 2010-05-13 21:05 ` Benoit Papillault 0 siblings, 0 replies; 3+ messages in thread From: Benoit Papillault @ 2010-05-13 21:05 UTC (permalink / raw) To: Felix Fietkau; +Cc: linux-wireless, lrodriguez, linville Le 13/05/2010 20:37, Felix Fietkau a écrit : > With VEOL, Beacon transmission in ad-hoc does not currently work. > I believe for larger ad-hoc networks, VEOL is too unreliable, as > it can get beacon transmissions stuck during synchronization. > Use SWBA based beacon trasmission similar to AP mode instead. > > Signed-off-by: Felix Fietkau<nbd@openwrt.org> This is very good step toward IBSS. Thanks Felix! Acked-by: Benoit Papillault <benoit.papillault@free.fr> > --- > drivers/net/wireless/ath/ath9k/beacon.c | 63 +++++-------------------------- > 1 files changed, 10 insertions(+), 53 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c > index 77face7..f43d85a 100644 > --- a/drivers/net/wireless/ath/ath9k/beacon.c > +++ b/drivers/net/wireless/ath/ath9k/beacon.c > @@ -76,22 +76,13 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, > ds = bf->bf_desc; > flags = ATH9K_TXDESC_NOACK; > > - if (((sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) || > - (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT))&& > - (ah->caps.hw_caps& ATH9K_HW_CAP_VEOL)) { > - ds->ds_link = bf->bf_daddr; /* self-linked */ > - flags |= ATH9K_TXDESC_VEOL; > - /* Let hardware handle antenna switching. */ > - antenna = 0; > - } else { > - ds->ds_link = 0; > - /* > - * Switch antenna every beacon. > - * Should only switch every beacon period, not for every SWBA > - * XXX assumes two antennae > - */ > - antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs)& 1 ? 2 : 1); > - } > + ds->ds_link = 0; > + /* > + * Switch antenna every beacon. > + * Should only switch every beacon period, not for every SWBA > + * XXX assumes two antennae > + */ > + antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs)& 1 ? 2 : 1); > > sband =&sc->sbands[common->hw->conf.channel->band]; > rate = sband->bitrates[rateidx].hw_value; > @@ -215,36 +206,6 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw, > return bf; > } > > -/* > - * Startup beacon transmission for adhoc mode when they are sent entirely > - * by the hardware using the self-linked descriptor + veol trick. > -*/ > -static void ath_beacon_start_adhoc(struct ath_softc *sc, > - struct ieee80211_vif *vif) > -{ > - struct ath_hw *ah = sc->sc_ah; > - struct ath_common *common = ath9k_hw_common(ah); > - struct ath_buf *bf; > - struct ath_vif *avp; > - struct sk_buff *skb; > - > - avp = (void *)vif->drv_priv; > - > - if (avp->av_bcbuf == NULL) > - return; > - > - bf = avp->av_bcbuf; > - skb = bf->bf_mpdu; > - > - ath_beacon_setup(sc, avp, bf, 0); > - > - /* NB: caller is known to have already stopped tx dma */ > - ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr); > - ath9k_hw_txstart(ah, sc->beacon.beaconq); > - ath_print(common, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n", > - sc->beacon.beaconq, ito64(bf->bf_daddr), bf->bf_desc); > -} > - > int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif) > { > struct ath_softc *sc = aphy->sc; > @@ -265,7 +226,8 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif) > list_del(&avp->av_bcbuf->list); > > if (sc->sc_ah->opmode == NL80211_IFTYPE_AP || > - !(sc->sc_ah->caps.hw_caps& ATH9K_HW_CAP_VEOL)) { > + sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC || > + sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) { > int slot; > /* > * Assign the vif to a beacon xmit slot. As > @@ -715,8 +677,7 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc, > * self-linked tx descriptor and let the hardware deal with things. > */ > intval |= ATH9K_BEACON_ENA; > - if (!(ah->caps.hw_caps& ATH9K_HW_CAP_VEOL)) > - ah->imask |= ATH9K_INT_SWBA; > + ah->imask |= ATH9K_INT_SWBA; > > ath_beaconq_config(sc); > > @@ -726,10 +687,6 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc, > ath9k_beacon_init(sc, nexttbtt, intval); > sc->beacon.bmisscnt = 0; > ath9k_hw_set_interrupts(ah, ah->imask); > - > - /* FIXME: Handle properly when vif is NULL */ > - if (vif&& ah->caps.hw_caps& ATH9K_HW_CAP_VEOL) > - ath_beacon_start_adhoc(sc, vif); > } > > void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif) ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-05-13 21:05 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-05-13 18:37 [PATCH 1/2] ath9k: change beacon allocation to prefer the first beacon slot Felix Fietkau 2010-05-13 18:37 ` [PATCH 2/2] ath9k: remove VEOL support for ad-hoc Felix Fietkau 2010-05-13 21:05 ` Benoit Papillault
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.