iwmc3200wifi: Tx power setting
authorSamuel Ortiz <sameo@linux.intel.com>
Fri, 16 Oct 2009 05:18:53 +0000 (13:18 +0800)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 27 Oct 2009 20:48:26 +0000 (16:48 -0400)
We can now set the Tx power from e.g. iwconfig.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwmc3200wifi/cfg80211.c
drivers/net/wireless/iwmc3200wifi/commands.c
drivers/net/wireless/iwmc3200wifi/commands.h

index 89edb6629426ab9bb118d8888fb67539cb46e04e..af72cc746f1560467c15aa914b1b7655a0b4333e 100644 (file)
@@ -670,9 +670,19 @@ static int iwm_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
 static int iwm_cfg80211_set_txpower(struct wiphy *wiphy,
                                    enum tx_power_setting type, int dbm)
 {
+       struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
+       int ret;
+
        switch (type) {
        case TX_POWER_AUTOMATIC:
                return 0;
+       case TX_POWER_FIXED:
+               ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX,
+                                             CFG_TX_PWR_LIMIT_USR, dbm * 2);
+               if (ret < 0)
+                       return ret;
+
+               return iwm_tx_power_trigger(iwm);
        default:
                return -EOPNOTSUPP;
        }
@@ -684,7 +694,7 @@ static int iwm_cfg80211_get_txpower(struct wiphy *wiphy, int *dbm)
 {
        struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
 
-       *dbm = iwm->txpower;
+       *dbm = iwm->txpower >> 1;
 
        return 0;
 }
index aeea909992fe01f1b59856f9516db50830d06eb7..d5125b7659a8d0b48fc1280fba12d32360e6a5f4 100644 (file)
@@ -793,6 +793,19 @@ int iwm_invalidate_mlme_profile(struct iwm_priv *iwm)
        return ret ? 0 : -EBUSY;
 }
 
+int iwm_tx_power_trigger(struct iwm_priv *iwm)
+{
+       struct iwm_umac_pwr_trigger pwr_trigger;
+
+       pwr_trigger.hdr.oid = UMAC_WIFI_IF_CMD_TX_PWR_TRIGGER;
+       pwr_trigger.hdr.buf_size =
+               cpu_to_le16(sizeof(struct iwm_umac_pwr_trigger) -
+                           sizeof(struct iwm_umac_wifi_if));
+
+
+       return iwm_send_wifi_if_cmd(iwm, &pwr_trigger, sizeof(pwr_trigger), 1);
+}
+
 int iwm_send_umac_stats_req(struct iwm_priv *iwm, u32 flags)
 {
        struct iwm_udma_wifi_cmd udma_cmd = UDMA_UMAC_INIT;
index 511b6e395ac5e1464e18f819107aa0862f6642b9..b36be2b23a3c7557c99f37c56f48c7a47fecd596 100644 (file)
@@ -441,6 +441,11 @@ struct iwm_umac_tx_key_id {
        u8 reserved[3];
 } __attribute__ ((packed));
 
+struct iwm_umac_pwr_trigger {
+       struct iwm_umac_wifi_if hdr;
+       __le32 reseved;
+} __attribute__ ((packed));
+
 struct iwm_umac_cmd_stats_req {
        __le32 flags;
 } __attribute__ ((packed));
@@ -467,6 +472,7 @@ int iwm_invalidate_mlme_profile(struct iwm_priv *iwm);
 int iwm_send_packet(struct iwm_priv *iwm, struct sk_buff *skb, int pool_id);
 int iwm_set_tx_key(struct iwm_priv *iwm, u8 key_idx);
 int iwm_set_key(struct iwm_priv *iwm, bool remove, struct iwm_key *key);
+int iwm_tx_power_trigger(struct iwm_priv *iwm);
 int iwm_send_umac_stats_req(struct iwm_priv *iwm, u32 flags);
 int iwm_send_umac_channel_list(struct iwm_priv *iwm);
 int iwm_scan_ssids(struct iwm_priv *iwm, struct cfg80211_ssid *ssids,