All pastes #422969 Raw Edit

old source

public c v1 · immutable
·published 2007-04-03 20:47 UTC
rendered paste body
diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_80211_tx.c linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_80211_tx.c	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c	2007-04-01 03:27:43.000000000 +0200@@ -69,6 +69,9 @@ 	iface = netdev_priv(dev); 	local = iface->local; +	if (local->iw_mode == IW_MODE_MONITOR)+		goto xmit;+ 	if (skb->len < ETH_HLEN) { 		printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb " 		       "(len=%d)\n", dev->name, skb->len);@@ -234,6 +237,7 @@ 		memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN); 	} +xmit: 	iface->stats.tx_packets++; 	iface->stats.tx_bytes += skb->len; @@ -404,8 +408,6 @@ 	}  	if (skb->len < 24) {-		printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb "-		       "(len=%d)\n", dev->name, skb->len); 		ret = 0; 		iface->stats.tx_dropped++; 		goto fail;diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_common.h linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_common.h--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_common.h	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_common.h	2007-04-01 03:32:50.000000000 +0200@@ -255,6 +255,7 @@ #define PRISM2_IOCTL_ADDMAC (SIOCIWFIRSTPRIV + 18) #define PRISM2_IOCTL_DELMAC (SIOCIWFIRSTPRIV + 20) #define PRISM2_IOCTL_KICKMAC (SIOCIWFIRSTPRIV + 22)+#define PRISM2_IOCTL_DSSSTEST (SIOCIWFIRSTPRIV + 24)  /* following are not in SIOCGIWPRIV list; check permission in the driver code  */diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_config.h linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_config.h--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_config.h	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_config.h	2007-04-01 03:27:43.000000000 +0200@@ -47,4 +47,22 @@  */ /* #define PRISM2_NO_STATION_MODES */ +/* Enable setting txpower */+#define RAW_TXPOWER_SETTING+++//PATCH:+/* Convert TX power to and from dBm (which does not work, it's just a+ * very rough estimate) */+/* #define PRISM2_DBM_CONVERSION */++//PATCH+/* define what settings should be restored after card reset */+#define PRISM2_RESTORE_POWER+/* #define PRISM2_RESTORE_SENS */+/* #define PRISM2_RESTORE_RETRY */+/* #define PRISM2_RESTORE_RATE */++#define RAW_TXPOWER_SETTING+ #endif /* HOSTAP_CONFIG_H */diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap.h linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap.h--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap.h	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap.h	2007-04-01 03:27:43.000000000 +0200@@ -54,6 +54,10 @@ int prism2_wds_del(local_info_t *local, u8 *remote_addr, 		   int rtnl_locked, int do_not_remove); +int prism2_set_rate_from_local(struct net_device *dev);+int prism2_set_power_from_local(struct net_device *dev);+int prism2_set_sens_from_local(struct net_device *dev);+int prism2_set_retry_from_local(struct net_device *dev);  /* hostap_ap.c */ diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_hw.c linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_hw.c--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_hw.c	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_hw.c	2007-04-01 03:35:53.000000000 +0200@@ -1006,6 +1006,65 @@ 	return fid; } +static int prism2_monitor_enable(struct net_device *dev)+{+	if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) {+		printk(KERN_DEBUG "Port type setting for monitor mode "+			"failed\n");+		return -EOPNOTSUPP;+	}++	if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8),+			     0, NULL, NULL)) {+		printk(KERN_DEBUG "Could not enter testmode 0x0a\n");+		return -EOPNOTSUPP;+	}++	if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS,+			    HFA384X_WEPFLAGS_PRIVACYINVOKED |+			    HFA384X_WEPFLAGS_HOSTENCRYPT |+			    HFA384X_WEPFLAGS_HOSTDECRYPT)) {+		printk(KERN_DEBUG "WEP flags setting failed\n");+		return -EOPNOTSUPP;+	}++	if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) {+		printk(KERN_DEBUG "Could not set promiscuous mode\n");+		return -EOPNOTSUPP;+	}++	return 0;+}++static int prism2_dssstest_enable(struct net_device *dev)+{+	if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) {+		printk(KERN_DEBUG "Port type setting for monitor mode "+			"failed\n");+		return -EOPNOTSUPP;+	}++	if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0e << 8),+			     0xa010, NULL, NULL)) {+		printk(KERN_DEBUG "Could not enter testmode 0x0a\n");+		return -EOPNOTSUPP;+	}++	if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS,+			    HFA384X_WEPFLAGS_PRIVACYINVOKED |+			    HFA384X_WEPFLAGS_HOSTENCRYPT |+			    HFA384X_WEPFLAGS_HOSTDECRYPT)) {+		printk(KERN_DEBUG "WEP flags setting failed\n");+		return -EOPNOTSUPP;+	}++	if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) {+		printk(KERN_DEBUG "Could not set promiscuous mode\n");+		return -EOPNOTSUPP;+	}++	return 0;+}  static int prism2_reset_port(struct net_device *dev) {@@ -1032,6 +1091,14 @@ 			       "port\n", dev->name); 	} +	if (local->iw_mode == IW_MODE_DSSSTEST)+		/* force mode 0x0a after port 0 reset */+		return prism2_dssstest_enable(dev);++	if (local->iw_mode == IW_MODE_MONITOR)+		/* force mode 0x0a after port 0 reset */+		return prism2_monitor_enable(dev);+ 	/* It looks like at least some STA firmware versions reset 	 * fragmentation threshold back to 2346 after enable command. Restore 	 * the configured value, if it differs from this default. */@@ -1464,6 +1531,10 @@ 		return 1; 	} +	if (local->iw_mode == IW_MODE_MONITOR)+		/* force mode 0x0a after port 0 reset */+		prism2_monitor_enable(dev);+ 	local->hw_ready = 1; 	local->hw_reset_tries = 0; 	local->hw_resetting = 0;@@ -1490,6 +1561,7 @@  static int prism2_hw_config(struct net_device *dev, int initial) {+	int ret=0; 	struct hostap_interface *iface; 	local_info_t *local; @@ -1512,11 +1584,32 @@ 	    (initial == 0 || (initial == 2 && local->num_dev_open > 0))) { 		if (!local->dev_enabled) 			prism2_callback(local, PRISM2_CALLBACK_ENABLE);+	}+	+	// PATCH: Set saved txpower, rate, sens & retry values after HW reset+#ifdef PRISM2_RESTORE_POWER+	prism2_set_power_from_local(dev);+#endif++#ifdef PRISM2_RESTORE_RATE+	prism2_set_rate_from_local(dev);+#endif++#ifdef PRISM2_RESTORE_SENS+	prism2_set_sens_from_local(dev);+#endif+	+#ifdef PRISM2_RESTORE_RETRY+	prism2_set_retry_from_local(dev);+#endif+	+	if (!local->pri_only && !initial) { 		local->dev_enabled = 1;-		return prism2_hw_enable(dev, initial);+		ret = prism2_hw_enable(dev, initial); 	} -	return 0;++	return ret; }  @@ -3146,6 +3239,8 @@ 	local->func->hw_config = prism2_hw_config; 	local->func->hw_reset = prism2_hw_reset; 	local->func->hw_shutdown = prism2_hw_shutdown;+	local->func->monitor_enable = prism2_monitor_enable;+	local->func->dssstest_enable = prism2_dssstest_enable; 	local->func->reset_port = prism2_reset_port; 	local->func->schedule_reset = prism2_schedule_reset; #ifdef PRISM2_DOWNLOAD_SUPPORT@@ -3198,6 +3293,18 @@ 	local->sram_type = -1; 	local->scan_channel_mask = 0xffff; +	// PATCH: set default txpower, rate, sens and retry+             +    	local->txpower_type = PRISM2_TXPOWER_FIXED;+     	local->txpower = 127;   /* minimal */+     	local->tx_rate_control = HFA384X_RATES_1MBPS |+            HFA384X_RATES_2MBPS | HFA384X_RATES_5MBPS |+            HFA384X_RATES_11MBPS; /* auto */+     	local->sensitivity = 1;+     	local->manual_retry_count = 8;+     	local->client_post_assoc_setup=0; /* a lock variable */+ + 	/* Initialize task queue structures */ 	INIT_WORK(&local->reset_queue, handle_reset_queue, local); 	INIT_WORK(&local->set_multicast_list_queue,@@ -3246,7 +3353,8 @@ 	local->tick_timer.expires = jiffies + 2 * HZ; 	add_timer(&local->tick_timer); -	INIT_LIST_HEAD(&local->bss_list);+ 	   +    INIT_LIST_HEAD(&local->bss_list);  	hostap_setup_dev(dev, local, 1); 	local->saved_eth_header_parse = dev->hard_header_parse;diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_info.c linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_info.c--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_info.c	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_info.c	2007-04-01 03:27:43.000000000 +0200@@ -449,6 +449,26 @@ 	if (connected || local->prev_linkstatus_connected) 		wireless_send_event(local->dev, SIOCGIWAP, &wrqu, NULL); 	local->prev_linkstatus_connected = connected;+	+	// PATCH: Set saved txpower, & retry after linkstatus change+	    if (connected) {+	#ifdef PRISM2_RESTORE_POWER+	    prism2_set_power_from_local(local->dev);+	#endif+	 +	#ifdef PRISM2_RESTORE_RETRY+	 	prism2_set_retry_from_local(local->dev);+	#endif+	    }+	 +	/* note: setting rate or sens triggers a new de-and-association+	I tried to work around this in version 0.1 of the psrrr patch.+	+	However, in some cases, the new association would cancel the correctly +	restored txpower, which is by far the most important value to be restored. +	See version 0.1 for detail.+	+	*/ }  diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_ioctl.c linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_ioctl.c	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c	2007-04-01 03:41:06.000000000 +0200@@ -343,8 +343,12 @@ 		printk(KERN_WARNING "%s: TXRateControl/cnfSupportedRates " 		       "setting to 0x%x failed\n", 		       dev->name, local->tx_rate_control);+	} else {+		printk(KERN_DEBUG "%s: TX Rate set to 0x%x\n",+		       dev->name, local->tx_rate_control); 	} + 	/* Update TX rate configuration for all STAs based on new operational 	 * rate set. */ 	hostap_update_rates(local);@@ -352,6 +356,11 @@ 	return ret; } +// PATCH: Global set rate function+int prism2_set_rate_from_local(struct net_device *dev)+{+	return hostap_set_rate(dev);+}  static int prism2_ioctl_siwrate(struct net_device *dev, 				struct iw_request_info *info,@@ -486,11 +495,11 @@ 	if (sens->value < 1 || sens->value > 3) 		return -EINVAL; -	if (hostap_set_word(dev, HFA384X_RID_CNFSYSTEMSCALE, sens->value) ||-	    local->func->reset_port(dev))-		return -EINVAL;+	local->sensitivity = sens->value;++	return prism2_set_sens_from_local(dev);+	 -	return 0; }  static int prism2_ioctl_giwsens(struct net_device *dev,@@ -1104,44 +1113,43 @@  	printk(KERN_DEBUG "Enabling monitor mode\n"); 	hostap_monitor_set_type(local);+	return local->func->reset_port(dev);+} -	if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE,-			    HFA384X_PORTTYPE_PSEUDO_IBSS)) {-		printk(KERN_DEBUG "Port type setting for monitor mode "-		       "failed\n");-		return -EOPNOTSUPP;-	} -	/* Host decrypt is needed to get the IV and ICV fields;-	 * however, monitor mode seems to remove WEP flag from frame-	 * control field */-	if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS,-			    HFA384X_WEPFLAGS_HOSTENCRYPT |-			    HFA384X_WEPFLAGS_HOSTDECRYPT)) {-		printk(KERN_DEBUG "WEP flags setting failed\n");-		return -EOPNOTSUPP;-	}+static int hostap_monitor_mode_disable(local_info_t *local)+{+	struct net_device *dev = local->ddev; -	if (local->func->reset_port(dev) ||-	    local->func->cmd(dev, HFA384X_CMDCODE_TEST |-			     (HFA384X_TEST_MONITOR << 8),-			     0, NULL, NULL)) {-		printk(KERN_DEBUG "Setting monitor mode failed\n");-		return -EOPNOTSUPP;-	}+	if (dev == NULL)+		return -1; -	return 0;+	printk(KERN_DEBUG "%s: Disabling monitor mode\n", dev->name);+	dev->type = ARPHRD_ETHER;+	dev->hard_header_parse = local->saved_eth_header_parse;+	if (local->func->cmd(dev, HFA384X_CMDCODE_TEST |+			     (HFA384X_TEST_STOP << 8),+			     0, NULL, NULL))+		return -1;+	return hostap_set_encryption(local); } +static int hostap_dssstest_mode_enable(local_info_t *local)+{+	struct net_device *dev = local->dev; -static int hostap_monitor_mode_disable(local_info_t *local)+	printk(KERN_DEBUG "Enabling dssstest mode\n");+	return local->func->reset_port(dev);+}++static int hostap_dssstest_mode_disable(local_info_t *local) { 	struct net_device *dev = local->ddev;  	if (dev == NULL) 		return -1; -	printk(KERN_DEBUG "%s: Disabling monitor mode\n", dev->name);+	printk(KERN_DEBUG "%s: Disabling dssstest mode\n", dev->name); 	dev->type = ARPHRD_ETHER; 	dev->hard_header_parse = local->saved_eth_header_parse; 	if (local->func->cmd(dev, HFA384X_CMDCODE_TEST |@@ -1151,7 +1159,6 @@ 	return hostap_set_encryption(local); } - static int prism2_ioctl_siwmode(struct net_device *dev, 				struct iw_request_info *info, 				__u32 *mode, char *extra)@@ -1165,7 +1172,7 @@  	if (*mode != IW_MODE_ADHOC && *mode != IW_MODE_INFRA && 	    *mode != IW_MODE_MASTER && *mode != IW_MODE_REPEAT &&-	    *mode != IW_MODE_MONITOR)+	    *mode != IW_MODE_MONITOR && *mode != IW_MODE_DSSSTEST) 		return -EOPNOTSUPP;  #ifdef PRISM2_NO_STATION_MODES@@ -1182,11 +1189,15 @@ 		return -EINVAL; 	} +	if (local->iw_mode == IW_MODE_DSSSTEST)+		hostap_dssstest_mode_disable(local);+ 	if (local->iw_mode == IW_MODE_MONITOR) 		hostap_monitor_mode_disable(local);  	if ((local->iw_mode == IW_MODE_ADHOC ||-	     local->iw_mode == IW_MODE_MONITOR) && *mode == IW_MODE_MASTER) {+	     local->iw_mode == IW_MODE_MONITOR ||+	     local->iw_mode == IW_MODE_DSSSTEST) && *mode == IW_MODE_MASTER) { 		/* There seems to be a firmware bug in at least STA f/w v1.5.6 		 * that leaves beacon frames to use IBSS type when moving from 		 * IBSS to Host AP mode. Doing double Port0 reset seems to be@@ -1198,8 +1209,11 @@ 	       "%d -> %d\n", dev->name, local->iw_mode, *mode); 	local->iw_mode = *mode; +	if (local->iw_mode == IW_MODE_DSSSTEST)+		return hostap_dssstest_mode_enable(local);+ 	if (local->iw_mode == IW_MODE_MONITOR)-		hostap_monitor_mode_enable(local);+		return hostap_monitor_mode_enable(local); 	else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt && 		 !local->fw_encrypt_ok) { 		printk(KERN_DEBUG "%s: defaulting to host-based encryption as "@@ -1392,16 +1406,14 @@ 			local->manual_retry_count = -1; 			local->tx_control &= ~HFA384X_TX_CTRL_ALT_RTRY; 		} else {-			if (hostap_set_word(dev, HFA384X_RID_CNFALTRETRYCOUNT,-					    rrq->value)) {-				printk(KERN_DEBUG "%s: Alternate retry count "-				       "setting to %d failed\n",-				       dev->name, rrq->value);+			local->manual_retry_count = rrq->value;+			local->tx_control |= HFA384X_TX_CTRL_ALT_RTRY;++			if (prism2_set_retry_from_local(dev)) {+				local->manual_retry_count = -1; 				return -EOPNOTSUPP; 			} -			local->manual_retry_count = rrq->value;-			local->tx_control |= HFA384X_TX_CTRL_ALT_RTRY; 		} 		return 0; 	}@@ -1498,6 +1510,8 @@  * increasing dBm value should correspond to increasing TX power.  */ ++#ifdef PRISM2_DBM_CONVERSION static int prism2_txpower_hfa386x_to_dBm(u16 val) { 	signed char tmp;@@ -1526,6 +1540,8 @@  	return (unsigned char) tmp; }+#endif /* PRISM2_DBM_CONVERSION */+ #endif /* RAW_TXPOWER_SETTING */  @@ -1565,24 +1581,15 @@ 		       dev->name, ret ? "failed" : "OK"); 		local->txpower_type = PRISM2_TXPOWER_UNKNOWN; 	}- #ifdef RAW_TXPOWER_SETTING-	if (!rrq->fixed && local->txpower_type != PRISM2_TXPOWER_AUTO) {-		printk(KERN_DEBUG "Setting ALC on\n");-		val = HFA384X_TEST_CFG_BIT_ALC;-		local->func->cmd(dev, HFA384X_CMDCODE_TEST |-				 (HFA384X_TEST_CFG_BITS << 8), 1, &val, NULL);-		local->txpower_type = PRISM2_TXPOWER_AUTO;-		return 0;-	} -	if (local->txpower_type != PRISM2_TXPOWER_FIXED) {-		printk(KERN_DEBUG "Setting ALC off\n");-		val = HFA384X_TEST_CFG_BIT_ALC;-		local->func->cmd(dev, HFA384X_CMDCODE_TEST |-				 (HFA384X_TEST_CFG_BITS << 8), 0, &val, NULL);-			local->txpower_type = PRISM2_TXPOWER_FIXED;-	}+// PATCH: Removed buggy/overengineered functions for setting txpower+// they relied on local variables and hardware being in sync, which was+// seldom true+ +	local->txpower_type = rrq->fixed?+		PRISM2_TXPOWER_FIXED:PRISM2_TXPOWER_AUTO;+	  	if (rrq->flags == IW_TXPOW_DBM) 		tmp = "dBm";@@ -1590,23 +1597,40 @@ 		tmp = "mW"; 	else 		tmp = "UNKNOWN";-	printk(KERN_DEBUG "Setting TX power to %d %s\n", rrq->value, tmp);  	if (rrq->flags != IW_TXPOW_DBM) { 		printk("SIOCSIWTXPOW with mW is not supported; use dBm\n"); 		return -EOPNOTSUPP; 	}-+// PATCH: crappy dBm concersion may be turned on/off +#ifdef PRISM2_DBM_CONVERSION+	local->txpower = prism2_txpower_dBm_to_hfa386x(rrq->value);+#else 	local->txpower = rrq->value;-	val = prism2_txpower_dBm_to_hfa386x(local->txpower);-	if (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,-			     HFA386X_CR_MANUAL_TX_POWER, &val, NULL))-		ret = -EOPNOTSUPP;+#endif+// PATCH: Use global function instead of setting locally++	/* in client mode, setting power has no efect without reset */+	if (local->iw_mode == IW_MODE_MASTER) +		ret = prism2_set_power_from_local(dev);+	else {+#ifdef PRISM2_RESTORE_POWER+		/* Disable and enable card */+		local->func->hw_shutdown(dev, 1);+		local->func->hw_config(dev, 0); +		ret=0;+		/* calls prism2_set_power_from_local() */+#else+		/* if a reset wouldn't set the txpower, do the original, +		 even tho' it does not work well... */+		ret = prism2_set_power_from_local(dev);+#endif+	}+ #else /* RAW_TXPOWER_SETTING */ 	if (rrq->fixed) 		ret = -EOPNOTSUPP; #endif /* RAW_TXPOWER_SETTING */- 	return ret; } @@ -1626,25 +1650,24 @@ 	rrq->disabled = 0; 	rrq->fixed = 0; -	if (local->txpower_type == PRISM2_TXPOWER_AUTO) {-		if (local->func->cmd(dev, HFA384X_CMDCODE_READMIF,-				     HFA386X_CR_MANUAL_TX_POWER,-				     NULL, &resp0) == 0) {-			rrq->value = prism2_txpower_hfa386x_to_dBm(resp0);-		} else {-			/* Could not get real txpower; guess 15 dBm */-			rrq->value = 15;-		}-	} else if (local->txpower_type == PRISM2_TXPOWER_OFF) {-		rrq->value = 0;-		rrq->disabled = 1;-	} else if (local->txpower_type == PRISM2_TXPOWER_FIXED) {-		rrq->value = local->txpower;-		rrq->fixed = 1;+// PATCH: read the real values from HW, don't return contents of local+// vars+	if (local->func->cmd(dev, HFA384X_CMDCODE_READMIF,+			     HFA386X_CR_MANUAL_TX_POWER,+			     NULL, &resp0) == 0) {+	+// PATCH: crappy dBm concersion may be turned on/off +#ifdef PRISM2_DBM_CONVERSION+		rrq->value = prism2_txpower_hfa386x_to_dBm(resp0);+#else+		rrq->value = resp0;+#endif+ 	} else {-		printk("SIOCGIWTXPOW - unknown txpower_type=%d\n",-		       local->txpower_type);+		/* Could not get real txpower; guess 0 dBm */+		rrq->value = 0; 	}+	 	return 0; #else /* RAW_TXPOWER_SETTING */ 	return -EOPNOTSUPP;@@ -1736,7 +1759,6 @@ 	return -EOPNOTSUPP; } - static inline int prism2_request_scan(struct net_device *dev) { 	return -EOPNOTSUPP;@@ -2132,6 +2154,8 @@ static const struct iw_priv_args prism2_priv[] = { 	{ PRISM2_IOCTL_MONITOR, 	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "monitor" },+	{ PRISM2_IOCTL_DSSSTEST,+	  IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "dssstest" }, 	{ PRISM2_IOCTL_READMIF, 	  IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 	  IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, "readmif" },@@ -2959,6 +2983,32 @@ }  +static int prism2_ioctl_priv_dssstest(struct net_device *dev, int *i)+{+	struct hostap_interface *iface;+	local_info_t *local;+	int ret = 0;+	u32 mode;++	iface = netdev_priv(dev);+	local = iface->local;++	if (*i == 0) {+		/* Disable dssstest mode - old mode was not saved, so go to+		 * Master mode */+		mode = IW_MODE_MASTER;+		ret = prism2_ioctl_siwmode(dev, NULL, &mode, NULL);+	} else if (*i == 1) {+		mode = IW_MODE_DSSSTEST;+		ret = prism2_ioctl_siwmode(dev, NULL, &mode, NULL);+		hostap_dssstest_mode_enable(local);+	} else+		ret = -EINVAL;++	return ret;+}++ static int prism2_ioctl_priv_reset(struct net_device *dev, int *i) { 	struct hostap_interface *iface;@@ -4019,6 +4069,11 @@ 		else ret = prism2_ioctl_priv_monitor(dev, (int *) wrq->u.name); 		break; +	case PRISM2_IOCTL_DSSSTEST:+		if (!capable(CAP_NET_ADMIN)) ret = -EPERM;+		else ret = prism2_ioctl_priv_dssstest(dev, (int *) wrq->u.name);+		break;+ 	case PRISM2_IOCTL_RESET: 		if (!capable(CAP_NET_ADMIN)) ret = -EPERM; 		else ret = prism2_ioctl_priv_reset(dev, (int *) wrq->u.name);@@ -4086,3 +4141,5 @@  	return ret; }++EXPORT_SYMBOL(prism2_set_rate_from_local);diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_main.c linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_main.c--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_main.c	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_main.c	2007-04-01 03:27:43.000000000 +0200@@ -332,7 +332,7 @@ 	if (local->iw_mode == IW_MODE_REPEAT) 		return HFA384X_PORTTYPE_WDS; 	if (local->iw_mode == IW_MODE_MONITOR)-		return HFA384X_PORTTYPE_PSEUDO_IBSS;+		return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/ 	return HFA384X_PORTTYPE_HOSTAP; } @@ -1090,6 +1090,69 @@ }  +// PATCH: Global set txpower function++int prism2_set_power_from_local(struct net_device *dev)+{+	int alc;+	u16 val;+        struct hostap_interface *iface = dev->priv;+	local_info_t *local = iface->local;+		+	/* set the ALC */+	alc = local->txpower_type != PRISM2_TXPOWER_FIXED;+	printk(KERN_DEBUG "%s: Setting ALC to %d\n", dev->name, alc);++	val = HFA384X_TEST_CFG_BIT_ALC;+	local->func->cmd(dev, HFA384X_CMDCODE_TEST |+			 (HFA384X_TEST_CFG_BITS << 8), alc, &val, NULL);++	/* if ALC is on, don't set the power */+	if (alc) return 0;+	+	/* set the txpower */+	val = local->txpower;+	printk(KERN_DEBUG "%s: Setting TX power to %d \n", dev->name, val);+	if (local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,+			     HFA386X_CR_MANUAL_TX_POWER, &val, NULL))+		return  -EOPNOTSUPP;+	else return 0;+}++// PATCH: Global set sensitivity function++int prism2_set_sens_from_local(struct net_device *dev)+{+	struct hostap_interface *iface = dev->priv;+	local_info_t *local = iface->local;++	if (hostap_set_word(dev, HFA384X_RID_CNFSYSTEMSCALE, local->sensitivity)+			|| local->func->reset_port(dev))+		return -EINVAL;+	+	printk(KERN_DEBUG "%s: sensitivity set to %d\n", dev->name, local->sensitivity);++	return 0;+}+					++// PATCH: Global set retry function+int prism2_set_retry_from_local(struct net_device *dev)+{+	int ret=0;+	struct hostap_interface *iface = dev->priv;+	local_info_t *local = iface->local;+	ret = hostap_set_word(dev, HFA384X_RID_CNFALTRETRYCOUNT,+			local->manual_retry_count);+	if (ret) +		printk(KERN_DEBUG "%s: Alternate retry count "+		"setting to %d failed\n", dev->name, local->manual_retry_count);+	else +		printk(KERN_DEBUG "%s: Alternate retry count "+			"set to %d\n", dev->name, local->manual_retry_count);+	return ret;+}+ struct proc_dir_entry *hostap_proc;  static int __init hostap_init(void)@@ -1137,5 +1200,9 @@ EXPORT_SYMBOL(hostap_remove_interface); EXPORT_SYMBOL(prism2_update_comms_qual); +EXPORT_SYMBOL(prism2_set_power_from_local);+EXPORT_SYMBOL(prism2_set_sens_from_local);+EXPORT_SYMBOL(prism2_set_retry_from_local);+ module_init(hostap_init); module_exit(hostap_exit);diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_plx.c linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_plx.c--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_plx.c	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_plx.c	2007-04-01 03:27:43.000000000 +0200@@ -100,6 +100,7 @@ 	{ 0xc250, 0x0002 } /* EMTAC A2424i */, 	{ 0xd601, 0x0002 } /* Z-Com XI300 */, 	{ 0xd601, 0x0005 } /* Zcomax XI-325H 200mW */,+	{ 0xd601, 0x0010 } /* Zcomax XI-325H 100mW */, 	{ 0, 0} }; diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_wlan.h linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_wlan.h--- linux-source-2.6.17-orig/drivers/net/wireless/hostap/hostap_wlan.h	2006-10-01 18:42:46.000000000 +0200+++ linux-source-2.6.17-rawtx/drivers/net/wireless/hostap/hostap_wlan.h	2007-04-01 03:42:22.000000000 +0200@@ -13,6 +13,7 @@ #define DEF_INTS -1, -1, -1, -1, -1, -1, -1 #define GET_INT_PARM(var,idx) var[var[idx] < 0 ? 0 : idx] +#define IW_MODE_DSSSTEST 7  /* Specific skb->protocol value that indicates that the packet already contains  * txdesc header.@@ -575,6 +576,8 @@ 	int (*hw_config)(struct net_device *dev, int initial); 	void (*hw_reset)(struct net_device *dev); 	void (*hw_shutdown)(struct net_device *dev, int no_disable);+	int (*monitor_enable)(struct net_device *dev);+	int (*dssstest_enable)(struct net_device *dev); 	int (*reset_port)(struct net_device *dev); 	void (*schedule_reset)(local_info_t *local); 	int (*download)(local_info_t *local,@@ -698,6 +701,9 @@ 		PRISM2_TXPOWER_FIXED, PRISM2_TXPOWER_UNKNOWN 	} txpower_type; 	int txpower; /* if txpower_type == PRISM2_TXPOWER_FIXED */+	int sensitivity;+	int client_post_assoc_setup;+  	/* command queue for hfa384x_cmd(); protected with cmdlock */ 	struct list_head cmd_queue;