📄 903-hostap_txpower.patch
字号:
Index: linux-2.6.21.7/drivers/net/wireless/hostap/hostap_ap.c===================================================================--- linux-2.6.21.7.orig/drivers/net/wireless/hostap/hostap_ap.c+++ linux-2.6.21.7/drivers/net/wireless/hostap/hostap_ap.c@@ -2346,13 +2346,13 @@ int prism2_ap_get_sta_qual(local_info_t addr[count].sa_family = ARPHRD_ETHER; memcpy(addr[count].sa_data, sta->addr, ETH_ALEN); if (sta->last_rx_silence == 0)- qual[count].qual = sta->last_rx_signal < 27 ?- 0 : (sta->last_rx_signal - 27) * 92 / 127;+ qual[count].qual = (sta->last_rx_signal - 156) == 0 ?+ 0 : (sta->last_rx_signal - 156) * 92 / 64; else- qual[count].qual = sta->last_rx_signal -- sta->last_rx_silence - 35;- qual[count].level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);- qual[count].noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);+ qual[count].qual = (sta->last_rx_signal -+ sta->last_rx_silence) * 92 / 64;+ qual[count].level = sta->last_rx_signal;+ qual[count].noise = sta->last_rx_silence; qual[count].updated = sta->last_rx_updated; sta->last_rx_updated = IW_QUAL_DBM;@@ -2417,13 +2417,13 @@ int prism2_ap_translate_scan(struct net_ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = IWEVQUAL; if (sta->last_rx_silence == 0)- iwe.u.qual.qual = sta->last_rx_signal < 27 ?- 0 : (sta->last_rx_signal - 27) * 92 / 127;+ iwe.u.qual.qual = (sta->last_rx_signal -156) == 0 ?+ 0 : (sta->last_rx_signal - 156) * 92 / 64; else- iwe.u.qual.qual = sta->last_rx_signal -- sta->last_rx_silence - 35;- iwe.u.qual.level = HFA384X_LEVEL_TO_dBm(sta->last_rx_signal);- iwe.u.qual.noise = HFA384X_LEVEL_TO_dBm(sta->last_rx_silence);+ iwe.u.qual.qual = (sta->last_rx_signal -+ sta->last_rx_silence) * 92 / 64;+ iwe.u.qual.level = sta->last_rx_signal;+ iwe.u.qual.noise = sta->last_rx_silence; iwe.u.qual.updated = sta->last_rx_updated; iwe.len = IW_EV_QUAL_LEN; current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,Index: linux-2.6.21.7/drivers/net/wireless/hostap/hostap_config.h===================================================================--- linux-2.6.21.7.orig/drivers/net/wireless/hostap/hostap_config.h+++ linux-2.6.21.7/drivers/net/wireless/hostap/hostap_config.h@@ -47,4 +47,9 @@ */ /* #define PRISM2_NO_STATION_MODES */ +/* Enable TX power Setting functions+ * (min att = -128 , max att = 127)+ */+#define RAW_TXPOWER_SETTING+ #endif /* HOSTAP_CONFIG_H */Index: linux-2.6.21.7/drivers/net/wireless/hostap/hostap.h===================================================================--- linux-2.6.21.7.orig/drivers/net/wireless/hostap/hostap.h+++ linux-2.6.21.7/drivers/net/wireless/hostap/hostap.h@@ -90,6 +90,7 @@ extern const struct iw_handler_def hosta extern const struct ethtool_ops prism2_ethtool_ops; int hostap_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);+int hostap_restore_power(struct net_device *dev); #endif /* HOSTAP_H */Index: linux-2.6.21.7/drivers/net/wireless/hostap/hostap_hw.c===================================================================--- linux-2.6.21.7.orig/drivers/net/wireless/hostap/hostap_hw.c+++ linux-2.6.21.7/drivers/net/wireless/hostap/hostap_hw.c@@ -933,6 +933,7 @@ static int hfa384x_set_rid(struct net_de prism2_hw_reset(dev); } + hostap_restore_power(dev); return res; } Index: linux-2.6.21.7/drivers/net/wireless/hostap/hostap_info.c===================================================================--- linux-2.6.21.7.orig/drivers/net/wireless/hostap/hostap_info.c+++ linux-2.6.21.7/drivers/net/wireless/hostap/hostap_info.c@@ -428,6 +428,11 @@ static void handle_info_queue_linkstatus } /* Get BSSID if we have a valid AP address */++ if ( val == HFA384X_LINKSTATUS_CONNECTED ||+ val == HFA384X_LINKSTATUS_DISCONNECTED ) + hostap_restore_power(local->dev);+ if (connected) { netif_carrier_on(local->dev); netif_carrier_on(local->ddev);Index: linux-2.6.21.7/drivers/net/wireless/hostap/hostap_ioctl.c===================================================================--- linux-2.6.21.7.orig/drivers/net/wireless/hostap/hostap_ioctl.c+++ linux-2.6.21.7/drivers/net/wireless/hostap/hostap_ioctl.c@@ -1504,23 +1504,20 @@ static int prism2_txpower_hfa386x_to_dBm val = 255; tmp = val;- tmp >>= 2; - return -12 - tmp;+ return tmp; } static u16 prism2_txpower_dBm_to_hfa386x(int val) { signed char tmp; - if (val > 20)- return 128;- else if (val < -43)+ if (val > 127) return 127;+ else if (val < -128)+ return 128; tmp = val;- tmp = -12 - tmp;- tmp <<= 2; return (unsigned char) tmp; }@@ -4080,3 +4077,35 @@ int hostap_ioctl(struct net_device *dev, return ret; }++/* BUG FIX: Restore power setting value when lost due to F/W bug */++int hostap_restore_power(struct net_device *dev)+{+ struct hostap_interface *iface = dev->priv;+ local_info_t *local = iface->local;+ + u16 val;+ int ret = 0;++ if (local->txpower_type == PRISM2_TXPOWER_OFF) {+ val = 0xff; /* use all standby and sleep modes */+ ret = local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,+ HFA386X_CR_A_D_TEST_MODES2,+ &val, NULL);+ }++#ifdef RAW_TXPOWER_SETTING+ if (local->txpower_type == PRISM2_TXPOWER_FIXED) {+ val = HFA384X_TEST_CFG_BIT_ALC;+ local->func->cmd(dev, HFA384X_CMDCODE_TEST |+ (HFA384X_TEST_CFG_BITS << 8), 0, &val, NULL);+ val = prism2_txpower_dBm_to_hfa386x(local->txpower);+ ret = (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,+ HFA386X_CR_MANUAL_TX_POWER, &val, NULL));+ }+#endif /* RAW_TXPOWER_SETTING */+ return (ret ? -EOPNOTSUPP : 0);+}++EXPORT_SYMBOL(hostap_restore_power);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -