Search Linux Wireless

Re: [patch/RFC] ath9k mesh mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I would also look at the ath5k driver as (last time I looked) it is
quite similar to ath9k in how mesh beacons would be handled and the RX
filter configuration code is nearly identical.

On Mon, Mar 9, 2009 at 10:53 PM, pat-lkml <pat-lkml@xxxxxxxxx> wrote:
> This patch begins the work to getting mesh mode working with ath9k.  I am
> using the b43 and rt2x00 drivers as templates on how to do this.
>
> Unfortunately it doesn't seem to work yet.  In attempting to set up a mesh between
> an ath9k device and a b43 device, the ath9k device does not seem to be enabling
> beaconing.  I have a third device in monitor mode that sees the b43 beacons,
> sees ath9k responding to them (I believe trying to establish a link), and b43
> is acknowledging those responses, but no link is established.  On the same ath9k
> device, I'm not seeing beaconing in ad-hoc mode, which leads me to believe that
> beaconing may be broken right now for my Atheros device.  What am I doing wrong?
>
> Atheros HW: Atheros AR9280 MAC/BB Rev:2 AR5133 RF Rev:d0: mem=0xf9280000, irq=17
> b43 HW: BCM4306 802.11b/g (rev 5)
>
> ---
> diff --git a/drivers/net/wireless/ath9k/beacon.c b/drivers/net/wireless/ath9k/beacon.c
> index 039c781..cbd94dd 100644
> --- a/drivers/net/wireless/ath9k/beacon.c
> +++ b/drivers/net/wireless/ath9k/beacon.c
> @@ -70,7 +70,8 @@ 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 &&
> +       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;
> @@ -727,6 +728,8 @@ void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
>                case NL80211_IFTYPE_AP:
>                        ath_beacon_config_ap(sc, &conf, avp);
>                        break;
> +               case NL80211_IFTYPE_MESH_POINT:
> +                       /* Handle mesh beaconing just like ad-hoc */
>                case NL80211_IFTYPE_ADHOC:
>                        ath_beacon_config_adhoc(sc, &conf, avp, vif);
>                        break;
> diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c
> index c10b33b..06376aa 100644
> --- a/drivers/net/wireless/ath9k/hw.c
> +++ b/drivers/net/wireless/ath9k/hw.c
> @@ -1430,6 +1430,8 @@ static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
>                          | AR_STA_ID1_KSRCH_MODE);
>                REG_CLR_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
>                break;
> +       case NL80211_IFTYPE_MESH_POINT:
> +               /* Configure HW same as ADHOC */
>        case NL80211_IFTYPE_ADHOC:
>                REG_WRITE(ah, AR_STA_ID1, val | AR_STA_ID1_ADHOC
>                          | AR_STA_ID1_KSRCH_MODE);
> @@ -3135,6 +3137,8 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
>                REG_WRITE(ah, AR_NEXT_SWBA, 0x7ffff);
>                flags |= AR_TBTT_TIMER_EN;
>                break;
> +       case NL80211_IFTYPE_MESH_POINT:
> +               /* Should IBSS style beaconing be used for mesh point? */
>        case NL80211_IFTYPE_ADHOC:
>                REG_SET_BIT(ah, AR_TXCFG,
>                            AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
> diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c
> index 5268697..e76e0de 100644
> --- a/drivers/net/wireless/ath9k/main.c
> +++ b/drivers/net/wireless/ath9k/main.c
> @@ -1590,6 +1590,7 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
>        hw->wiphy->interface_modes =
>                BIT(NL80211_IFTYPE_AP) |
>                BIT(NL80211_IFTYPE_STATION) |
> +               BIT(NL80211_IFTYPE_MESH_POINT) |
>                BIT(NL80211_IFTYPE_ADHOC);
>
>        hw->wiphy->reg_notifier = ath9k_reg_notifier;
> @@ -2198,18 +2199,13 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
>                ic_opmode = NL80211_IFTYPE_STATION;
>                break;
>        case NL80211_IFTYPE_ADHOC:
> -               if (sc->nbcnvifs >= ATH_BCBUF) {
> -                       ret = -ENOBUFS;
> -                       goto out;
> -               }
> -               ic_opmode = NL80211_IFTYPE_ADHOC;
> -               break;
>        case NL80211_IFTYPE_AP:
> +       case NL80211_IFTYPE_MESH_POINT:
>                if (sc->nbcnvifs >= ATH_BCBUF) {
>                        ret = -ENOBUFS;
>                        goto out;
>                }
> -               ic_opmode = NL80211_IFTYPE_AP;
> +               ic_opmode = conf->type;
>                break;
>        default:
>                DPRINTF(sc, ATH_DBG_FATAL,
> @@ -2242,10 +2238,11 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
>
>        /*
>         * Enable MIB interrupts when there are hardware phy counters.
> -        * Note we only do this (at the moment) for station mode.
> +        * Note we only do this (at the moment) for non AP modes.
>         */
>        if ((conf->type == NL80211_IFTYPE_STATION) ||
> -           (conf->type == NL80211_IFTYPE_ADHOC)) {
> +           (conf->type == NL80211_IFTYPE_ADHOC) ||
> +           (conf->type == NL80211_IFTYPE_MESH_POINT)) {
>                if (ath9k_hw_phycounters(sc->sc_ah))
>                        sc->imask |= ATH9K_INT_MIB;
>                sc->imask |= ATH9K_INT_TSFOOR;
> @@ -2292,8 +2289,9 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
>        del_timer_sync(&sc->ani.timer);
>
>        /* Reclaim beacon resources */
> -       if (sc->sc_ah->opmode == NL80211_IFTYPE_AP ||
> -           sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) {
> +       if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) ||
> +           (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
> +           (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
>                ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
>                ath_beacon_return(sc, avp);
>        }
> @@ -2446,10 +2444,31 @@ static int ath9k_config_interface(struct ieee80211_hw *hw,
>                default:
>                        break;
>                }
> +       } else if ((vif->type == NL80211_IFTYPE_MESH_POINT) && (conf->bssid)) {
> +               /* Both b43 and rt2x00 set the bssid in the case that one
> +                * is passed durint interface config, irregardless of the
> +                * status of conf->changed */
> +
> +               /* Set BSSID */
> +               memcpy(sc->curbssid, conf->bssid, ETH_ALEN);
> +               memcpy(avp->bssid, conf->bssid, ETH_ALEN);
> +               sc->curaid = 0;
> +               ath9k_hw_write_associd(sc);
> +
> +               /* Set aggregation protection mode parameters */
> +               sc->config.ath_aggr_prot = 0;
> +
> +               DPRINTF(sc, ATH_DBG_CONFIG,
> +                       "RX filter 0x%x bssid %pM aid 0x%x\n",
> +                       rfilt, sc->curbssid, sc->curaid);
> +
> +               /* need to reconfigure the beacon */
> +               sc->sc_flags &= ~SC_OP_BEACONS ;
>        }
>
>        if ((vif->type == NL80211_IFTYPE_ADHOC) ||
> -           (vif->type == NL80211_IFTYPE_AP)) {
> +           (vif->type == NL80211_IFTYPE_AP) ||
> +           (vif->type == NL80211_IFTYPE_MESH_POINT)) {
>                if ((conf->changed & IEEE80211_IFCC_BEACON) ||
>                    (conf->changed & IEEE80211_IFCC_BEACON_ENABLED &&
>                     conf->enable_beacon)) {
> @@ -2482,8 +2501,9 @@ static int ath9k_config_interface(struct ieee80211_hw *hw,
>                                                   sc->curbssid);
>        }
>
> -       /* Only legacy IBSS for now */
> -       if (vif->type == NL80211_IFTYPE_ADHOC)
> +       /* Only legacy IBSS and Mesh Point for now */
> +       if ((vif->type == NL80211_IFTYPE_ADHOC) ||
> +           (vif->type == NL80211_IFTYPE_MESH_POINT))
>                ath_update_chainmask(sc, 0);
>
>        mutex_unlock(&sc->mutex);
> diff --git a/drivers/net/wireless/ath9k/rc.c b/drivers/net/wireless/ath9k/rc.c
> index 8327356..61f8334 100644
> --- a/drivers/net/wireless/ath9k/rc.c
> +++ b/drivers/net/wireless/ath9k/rc.c
> @@ -1615,7 +1615,8 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband,
>        /* Choose rate table first */
>
>        if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) ||
> -           (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC)) {
> +           (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
> +           (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
>                rate_table = ath_choose_rate_table(sc, sband->band,
>                                                   sta->ht_cap.ht_supported,
>                                                   is_cw40);
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux