소스 검색

[PATCH] ipw2100: Fix setting txpower failed problem

The ipw2100 driver misunderstood the parameter of txpower.
Tx Power off means turn off the radio, but the driver interpret it as
"can't set txpower". So when getting the txpower, it sets disabled=1 to
the iwconifg tool in managed mode. And the tool will display "Tx Power off"
when disabled=1.

Now, in managed mode, iwconfig will not show "TX Power" if the radio is not
switched off. It will only display "Tx Power off" only if the radio is killed.

Signed-off-by: Hong Liu <hong.liu@intel.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Zhu Yi 19 년 전
부모
커밋
b6e4da7234
1개의 변경된 파일14개의 추가작업 그리고 13개의 파일을 삭제
  1. 14 13
      drivers/net/wireless/ipw2100.c

+ 14 - 13
drivers/net/wireless/ipw2100.c

@@ -7114,11 +7114,17 @@ static int ipw2100_wx_set_txpow(struct net_device *dev,
 {
 {
 	struct ipw2100_priv *priv = ieee80211_priv(dev);
 	struct ipw2100_priv *priv = ieee80211_priv(dev);
 	int err = 0, value;
 	int err = 0, value;
+	
+	if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled))
+		return -EINPROGRESS;
 
 
 	if (priv->ieee->iw_mode != IW_MODE_ADHOC)
 	if (priv->ieee->iw_mode != IW_MODE_ADHOC)
+		return 0;
+
+	if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
 		return -EINVAL;
 		return -EINVAL;
 
 
-	if (wrqu->txpower.disabled == 1 || wrqu->txpower.fixed == 0)
+	if (wrqu->txpower.fixed == 0)
 		value = IPW_TX_POWER_DEFAULT;
 		value = IPW_TX_POWER_DEFAULT;
 	else {
 	else {
 		if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
 		if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
@@ -7153,24 +7159,19 @@ static int ipw2100_wx_get_txpow(struct net_device *dev,
 
 
 	struct ipw2100_priv *priv = ieee80211_priv(dev);
 	struct ipw2100_priv *priv = ieee80211_priv(dev);
 
 
-	if (priv->ieee->iw_mode != IW_MODE_ADHOC) {
-		wrqu->power.disabled = 1;
-		return 0;
-	}
+	wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
 
 
 	if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
 	if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
-		wrqu->power.fixed = 0;
-		wrqu->power.value = IPW_TX_POWER_MAX_DBM;
-		wrqu->power.disabled = 1;
+		wrqu->txpower.fixed = 0;
+		wrqu->txpower.value = IPW_TX_POWER_MAX_DBM;
 	} else {
 	} else {
-		wrqu->power.disabled = 0;
-		wrqu->power.fixed = 1;
-		wrqu->power.value = priv->tx_power;
+		wrqu->txpower.fixed = 1;
+		wrqu->txpower.value = priv->tx_power;
 	}
 	}
 
 
-	wrqu->power.flags = IW_TXPOW_DBM;
+	wrqu->txpower.flags = IW_TXPOW_DBM;
 
 
-	IPW_DEBUG_WX("GET TX Power -> %d \n", wrqu->power.value);
+	IPW_DEBUG_WX("GET TX Power -> %d \n", wrqu->txpower.value);
 
 
 	return 0;
 	return 0;
 }
 }