diff options
| author | kaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-04-28 13:35:14 +0000 | 
|---|---|---|
| committer | kaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-04-28 13:35:14 +0000 | 
| commit | 27c303501e47f15ba64569c28b1a1a125ba1714b (patch) | |
| tree | 9f391646f3e5cf12683bf4b82c0ad6168042d1cf /target/linux/generic-2.6/patches-2.6.30/903-hostap_txpower.patch | |
| parent | 0c04ef4beefc6c59f51bca1ad20be72190d9c95c (diff) | |
preliminary 2.6.30 support
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@15468 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic-2.6/patches-2.6.30/903-hostap_txpower.patch')
| -rw-r--r-- | target/linux/generic-2.6/patches-2.6.30/903-hostap_txpower.patch | 154 | 
1 files changed, 154 insertions, 0 deletions
diff --git a/target/linux/generic-2.6/patches-2.6.30/903-hostap_txpower.patch b/target/linux/generic-2.6/patches-2.6.30/903-hostap_txpower.patch new file mode 100644 index 000000000..89d60bd14 --- /dev/null +++ b/target/linux/generic-2.6/patches-2.6.30/903-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 +@@ -431,6 +431,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 +@@ -1475,23 +1475,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; + } +@@ -4055,3 +4052,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);  | 
