diff options
| -rw-r--r-- | target/linux/generic-2.6/patches-2.6.24/903-hostap_txpower.patch | 160 | 
1 files changed, 160 insertions, 0 deletions
| diff --git a/target/linux/generic-2.6/patches-2.6.24/903-hostap_txpower.patch b/target/linux/generic-2.6/patches-2.6.24/903-hostap_txpower.patch new file mode 100644 index 000000000..6f82cdb03 --- /dev/null +++ b/target/linux/generic-2.6/patches-2.6.24/903-hostap_txpower.patch @@ -0,0 +1,160 @@ +diff -Nur linux-2.6.17/drivers/net/wireless/hostap/hostap_ap.c linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_ap.c +--- linux-2.6.17/drivers/net/wireless/hostap/hostap_ap.c	2006-06-18 04:49:35.000000000 +0300 ++++ linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_ap.c	2006-12-10 19:13:33.000000000 +0200 +@@ -2345,13 +2345,13 @@ + 		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; +@@ -2416,13 +2416,13 @@ + 		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, +diff -Nur linux-2.6.17/drivers/net/wireless/hostap/hostap_config.h linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_config.h +--- linux-2.6.17/drivers/net/wireless/hostap/hostap_config.h	2006-06-18 04:49:35.000000000 +0300 ++++ linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_config.h	2006-12-10 19:13:33.000000000 +0200 +@@ -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 */ +diff -Nur linux-2.6.17/drivers/net/wireless/hostap/hostap.h linux-2.6.17-patched/drivers/net/wireless/hostap/hostap.h +--- linux-2.6.17/drivers/net/wireless/hostap/hostap.h	2006-06-18 04:49:35.000000000 +0300 ++++ linux-2.6.17-patched/drivers/net/wireless/hostap/hostap.h	2006-12-10 19:20:00.000000000 +0200 +@@ -89,6 +89,7 @@ + extern 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 */ +diff -Nur linux-2.6.17/drivers/net/wireless/hostap/hostap_hw.c linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_hw.c +--- linux-2.6.17/drivers/net/wireless/hostap/hostap_hw.c	2006-06-18 04:49:35.000000000 +0300 ++++ linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_hw.c	2006-12-10 19:13:33.000000000 +0200 +@@ -1043,6 +1043,7 @@ + 		       dev->name, local->fragm_threshold); + 	} +  ++	hostap_restore_power(dev); + 	return res; + } +  +diff -Nur linux-2.6.17/drivers/net/wireless/hostap/hostap_info.c linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_info.c +--- linux-2.6.17/drivers/net/wireless/hostap/hostap_info.c	2006-06-18 04:49:35.000000000 +0300 ++++ linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_info.c	2006-12-10 19:13:33.000000000 +0200 +@@ -429,6 +429,11 @@ + 	} +  + 	/* 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); +diff -Nur linux-2.6.17/drivers/net/wireless/hostap/hostap_ioctl.c linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_ioctl.c +--- linux-2.6.17/drivers/net/wireless/hostap/hostap_ioctl.c	2006-06-18 04:49:35.000000000 +0300 ++++ linux-2.6.17-patched/drivers/net/wireless/hostap/hostap_ioctl.c	2006-12-10 21:21:03.000000000 +0200 +@@ -1506,23 +1506,20 @@ + 		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; + } +@@ -4086,3 +4083,35 @@ +  + 	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); | 
