ath9k_htc: Allow AP interface to be created
authorSujith Manoharan <Sujith.Manoharan@atheros.com>
Mon, 21 Feb 2011 02:19:23 +0000 (07:49 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 23 Feb 2011 21:25:27 +0000 (16:25 -0500)
Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/htc.h
drivers/net/wireless/ath/ath9k/htc_drv_main.c

index 0088c6e..b219428 100644 (file)
@@ -205,6 +205,7 @@ struct ath9k_htc_target_stats {
 } __packed;
 
 #define ATH9K_HTC_MAX_VIF 2
+#define ATH9K_HTC_MAX_BCN_VIF 2
 
 #define INC_VIF(_priv, _type) do {             \
                switch (_type) {                \
@@ -214,6 +215,9 @@ struct ath9k_htc_target_stats {
                case NL80211_IFTYPE_ADHOC:      \
                        _priv->num_ibss_vif++;  \
                        break;                  \
+               case NL80211_IFTYPE_AP:         \
+                       _priv->num_ap_vif++;    \
+                       break;                  \
                default:                        \
                        break;                  \
                }                               \
@@ -227,6 +231,9 @@ struct ath9k_htc_target_stats {
                case NL80211_IFTYPE_ADHOC:      \
                        _priv->num_ibss_vif--;  \
                        break;                  \
+               case NL80211_IFTYPE_AP:         \
+                       _priv->num_ap_vif--;    \
+                       break;                  \
                default:                        \
                        break;                  \
                }                               \
@@ -395,6 +402,7 @@ struct ath9k_htc_priv {
        u8 vif_sta_pos[ATH9K_HTC_MAX_VIF];
        u8 num_ibss_vif;
        u8 num_sta_vif;
+       u8 num_ap_vif;
 
        u16 op_flags;
        u16 curtxpow;
index 39074fc..51a8c51 100644 (file)
@@ -1204,6 +1204,14 @@ static int ath9k_htc_add_interface(struct ieee80211_hw *hw,
                return -ENOBUFS;
        }
 
+       if (((vif->type == NL80211_IFTYPE_AP) ||
+            (vif->type == NL80211_IFTYPE_ADHOC)) &&
+           ((priv->num_ap_vif + priv->num_ibss_vif) >= ATH9K_HTC_MAX_BCN_VIF)) {
+               ath_err(common, "Max. number of beaconing interfaces reached\n");
+               mutex_unlock(&priv->mutex);
+               return -ENOBUFS;
+       }
+
        ath9k_htc_ps_wakeup(priv);
        memset(&hvif, 0, sizeof(struct ath9k_htc_target_vif));
        memcpy(&hvif.myaddr, vif->addr, ETH_ALEN);
@@ -1215,6 +1223,9 @@ static int ath9k_htc_add_interface(struct ieee80211_hw *hw,
        case NL80211_IFTYPE_ADHOC:
                hvif.opmode = cpu_to_be32(HTC_M_IBSS);
                break;
+       case NL80211_IFTYPE_AP:
+               hvif.opmode = cpu_to_be32(HTC_M_HOSTAP);
+               break;
        default:
                ath_err(common,
                        "Interface type %d not yet supported\n", vif->type);