]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/mac80211/cfg.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6
[karo-tx-linux.git] / net / mac80211 / cfg.c
index d2fc18c1ae0d162384a3ed435172fcf73c3af571..3f47276caeb85dcf7244270ff64d461979537be1 100644 (file)
@@ -1122,8 +1122,8 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
        p.txop = params->txop;
        if (drv_conf_tx(local, params->queue, &p)) {
                printk(KERN_DEBUG "%s: failed to set TX queue "
-                      "parameters for queue %d\n", local->mdev->name,
-                      params->queue);
+                      "parameters for queue %d\n",
+                      wiphy_name(local->hw.wiphy), params->queue);
                return -EINVAL;
        }
 
@@ -1334,6 +1334,53 @@ static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
        return 0;
 }
 
+static int ieee80211_set_tx_power(struct wiphy *wiphy,
+                                 enum tx_power_setting type, int dbm)
+{
+       struct ieee80211_local *local = wiphy_priv(wiphy);
+       struct ieee80211_channel *chan = local->hw.conf.channel;
+       u32 changes = 0;
+
+       switch (type) {
+       case TX_POWER_AUTOMATIC:
+               local->user_power_level = -1;
+               break;
+       case TX_POWER_LIMITED:
+               if (dbm < 0)
+                       return -EINVAL;
+               local->user_power_level = dbm;
+               break;
+       case TX_POWER_FIXED:
+               if (dbm < 0)
+                       return -EINVAL;
+               /* TODO: move to cfg80211 when it knows the channel */
+               if (dbm > chan->max_power)
+                       return -EINVAL;
+               local->user_power_level = dbm;
+               break;
+       }
+
+       ieee80211_hw_config(local, changes);
+
+       return 0;
+}
+
+static int ieee80211_get_tx_power(struct wiphy *wiphy, int *dbm)
+{
+       struct ieee80211_local *local = wiphy_priv(wiphy);
+
+       *dbm = local->hw.conf.power_level;
+
+       return 0;
+}
+
+static void ieee80211_rfkill_poll(struct wiphy *wiphy)
+{
+       struct ieee80211_local *local = wiphy_priv(wiphy);
+
+       drv_rfkill_poll(local);
+}
+
 struct cfg80211_ops mac80211_config_ops = {
        .add_virtual_intf = ieee80211_add_iface,
        .del_virtual_intf = ieee80211_del_iface,
@@ -1373,4 +1420,7 @@ struct cfg80211_ops mac80211_config_ops = {
        .join_ibss = ieee80211_join_ibss,
        .leave_ibss = ieee80211_leave_ibss,
        .set_wiphy_params = ieee80211_set_wiphy_params,
+       .set_tx_power = ieee80211_set_tx_power,
+       .get_tx_power = ieee80211_get_tx_power,
+       .rfkill_poll = ieee80211_rfkill_poll,
 };