diff options
Diffstat (limited to 'target/linux/generic/patches-2.6.37/750-hostap_txpower.patch')
| -rw-r--r-- | target/linux/generic/patches-2.6.37/750-hostap_txpower.patch | 154 | 
1 files changed, 154 insertions, 0 deletions
diff --git a/target/linux/generic/patches-2.6.37/750-hostap_txpower.patch b/target/linux/generic/patches-2.6.37/750-hostap_txpower.patch new file mode 100644 index 000000000..ad4471541 --- /dev/null +++ b/target/linux/generic/patches-2.6.37/750-hostap_txpower.patch @@ -0,0 +1,154 @@ +--- a/drivers/net/wireless/hostap/hostap_ap.c ++++ b/drivers/net/wireless/hostap/hostap_ap.c +@@ -2335,13 +2335,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; +@@ -2407,13 +2407,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 +@@ -932,6 +932,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 +@@ -433,6 +433,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 +@@ -1477,23 +1477,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; + } +@@ -4056,3 +4053,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);  | 
