well as way of introduction im running 2.6.27-rc7-wl-x86-smp and am keen 
to get my hands dirty with ath5k AP ....

ill be tracking this quite closely attached find the patch i have used 
to get it working as per Jiri 18/Aug/08

Ill try it out and feed back.

AFAIK some of the snipets bellow seem to make sense and could be 
introduced on the path to inclusion.

Greg

diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index e257488..405caab 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -27,6 +27,7 @@ EXPORT_SYMBOL(wiphy_to_hw);
 static bool nl80211_type_check(enum nl80211_iftype type)
 {
   switch (type) {
+  case NL80211_IFTYPE_AP:
   case NL80211_IFTYPE_ADHOC:
   case NL80211_IFTYPE_STATION:
   case NL80211_IFTYPE_MONITOR:

diff --git a/drivers/net/wireless/ath5k/base.c 
b/drivers/net/wireless/ath5k/base.c
index e09ed2c..c3664fb 100644
--- a/drivers/net/wireless/ath5k/base.c
+++ b/drivers/net/wireless/ath5k/base.c
@@ -231,7 +231,7 @@ static int ath5k_get_tx_stats(struct ieee80211_hw *hw,
         struct ieee80211_tx_queue_stats *stats);
 static u64 ath5k_get_tsf(struct ieee80211_hw *hw);
 static void ath5k_reset_tsf(struct ieee80211_hw *hw);
-static int ath5k_beacon_update(struct ieee80211_hw *hw,
+static void ath5k_beacon_update(struct ath5k_softc *sc,
         struct sk_buff *skb);
 
 static struct ieee80211_ops ath5k_hw_ops = {
@@ -2104,8 +2104,6 @@ ath5k_beacon_update_timers(struct ath5k_softc *sc, 
u64 bc_tsf)
  *
  * In IBSS mode we use a self-linked tx descriptor if possible. We 
enable SWBA
  * interrupts to detect TSF updates only.
- *
- * AP mode is missing.
  */
 static void
 ath5k_beacon_config(struct ath5k_softc *sc)
@@ -2118,7 +2116,7 @@ ath5k_beacon_config(struct ath5k_softc *sc)
 
     if (sc->opmode == NL80211_IFTYPE_STATION) {
         sc->imask |= AR5K_INT_BMISS;
-    } else if (sc->opmode == NL80211_IFTYPE_ADHOC) {
+    } else if ((sc->opmode == NL80211_IFTYPE_ADHOC) || (sc->opmode == 
NL80211_IFTYPE_AP)) {
         /*
          * In IBSS mode we use a self-linked tx descriptor and let the
          * hardware send the beacons automatically. We have to load it
@@ -2130,14 +2128,15 @@ ath5k_beacon_config(struct ath5k_softc *sc)
 
         sc->imask |= AR5K_INT_SWBA;
 
-        if (ath5k_hw_hasveol(ah)) {
-            spin_lock(&sc->block);
-            ath5k_beacon_send(sc);
-            spin_unlock(&sc->block);
-        }
+        if (sc->opmode == NL80211_IFTYPE_ADHOC) {
+            if (ath5k_hw_hasveol(ah)) {
+                spin_lock(&sc->block);
+                ath5k_beacon_send(sc);
+                spin_unlock(&sc->block);
+            }
+        } else
+            ath5k_beacon_update_timers(sc, -1);
     }
-    /* TODO else AP */
-
     ath5k_hw_set_imr(ah, sc->imask);
 }
 
@@ -2688,6 +2687,7 @@ static int ath5k_add_interface(struct ieee80211_hw 
*hw,
     sc->vif = conf->vif;
 
     switch (conf->type) {
+    case NL80211_IFTYPE_AP:
     case NL80211_IFTYPE_STATION:
     case NL80211_IFTYPE_ADHOC:
     case NL80211_IFTYPE_MONITOR:
@@ -2751,7 +2751,7 @@ ath5k_config_interface(struct ieee80211_hw *hw, 
struct ieee80211_vif *vif,
         ret = -EIO;
         goto unlock;
     }
-    if (conf->bssid) {
+    if (conf->changed & IEEE80211_IFCC_BSSID && conf->bssid) {
         /* Cache for later use during resets */
         memcpy(ah->ah_bssid, conf->bssid, ETH_ALEN);
         /* XXX: assoc id is set to 0 for now, mac80211 doesn't have
@@ -2759,18 +2759,16 @@ ath5k_config_interface(struct ieee80211_hw *hw, 
struct ieee80211_vif *vif,
         ath5k_hw_set_associd(ah, ah->ah_bssid, 0);
         mmiowb();
     }
-
     if (conf->changed & IEEE80211_IFCC_BEACON &&
-        vif->type == NL80211_IFTYPE_ADHOC) {
+        (vif->type == NL80211_IFTYPE_ADHOC ||
+             vif->type == NL80211_IFTYPE_AP)) {
         struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);
         if (!beacon) {
             ret = -ENOMEM;
             goto unlock;
         }
-        /* call old handler for now */
-        ath5k_beacon_update(hw, beacon);
+        ath5k_beacon_update(sc, beacon);
     }
-
     mutex_unlock(&sc->lock);
 
     return ath5k_reset_wake(sc);
@@ -3001,20 +2999,13 @@ ath5k_reset_tsf(struct ieee80211_hw *hw)
         ath5k_hw_reset_tsf(sc->ah);
 }
 
-static int
-ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
+static void ath5k_beacon_update(struct ath5k_softc *sc, struct sk_buff 
*skb)
 {
-    struct ath5k_softc *sc = hw->priv;
     unsigned long flags;
     int ret;
 
     ath5k_debug_dump_skb(sc, skb, "BC  ", 1);
 
-    if (sc->opmode != NL80211_IFTYPE_ADHOC) {
-        ret = -EIO;
-        goto end;
-    }
-
     spin_lock_irqsave(&sc->block, flags);
     ath5k_txbuf_free(sc, sc->bbuf);
     sc->bbuf->skb = skb;
@@ -3026,8 +3017,4 @@ ath5k_beacon_update(struct ieee80211_hw *hw, 
struct sk_buff *skb)
         ath5k_beacon_config(sc);
         mmiowb();
     }
-
-end:
-    return ret;
 }
-


--
This message has been scanned for viruses and
dangerous content by Network Sentry, and 
is believed to be clean.
http://www.dialandsave.co.za

_______________________________________________
ath5k-devel mailing list
ath5k-devel@lists.ath5k.org
https://lists.ath5k.org/mailman/listinfo/ath5k-devel

Reply via email to