mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 07:22:33 +00:00
d0ba3bb1e2
it has been non-functional for years and caused numerous memleaks and crashes for people that tried to enable it. it has no maintained upstream source, and it does not look like it's going to be fixed any time soon Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 45423
155 lines
5.1 KiB
Diff
155 lines
5.1 KiB
Diff
--- a/drivers/net/wireless/hostap/hostap_ap.c
|
|
+++ b/drivers/net/wireless/hostap/hostap_ap.c
|
|
@@ -2403,13 +2403,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;
|
|
@@ -2475,13 +2475,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(info, current_ev, end_buf,
|
|
--- a/drivers/net/wireless/hostap/hostap_config.h
|
|
+++ b/drivers/net/wireless/hostap/hostap_config.h
|
|
@@ -45,4 +45,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 */
|
|
--- a/drivers/net/wireless/hostap/hostap.h
|
|
+++ b/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 */
|
|
--- a/drivers/net/wireless/hostap/hostap_hw.c
|
|
+++ b/drivers/net/wireless/hostap/hostap_hw.c
|
|
@@ -928,6 +928,7 @@ static int hfa384x_set_rid(struct net_de
|
|
prism2_hw_reset(dev);
|
|
}
|
|
|
|
+ hostap_restore_power(dev);
|
|
return res;
|
|
}
|
|
|
|
--- a/drivers/net/wireless/hostap/hostap_info.c
|
|
+++ b/drivers/net/wireless/hostap/hostap_info.c
|
|
@@ -435,6 +435,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);
|
|
--- a/drivers/net/wireless/hostap/hostap_ioctl.c
|
|
+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
|
|
@@ -1479,23 +1479,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;
|
|
}
|
|
@@ -4052,3 +4049,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 = netdev_priv(dev);
|
|
+ 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);
|