pacth: txpower/rate/sens/retry restored after card reset

Jirka Bohac jbohac at jikos.cz
Sun Mar 2 20:46:26 EST 2003


oops, this time the patch IS attached :-)
-------------- next part --------------
diff -Naur hostap/driver/modules/hostap.c hostap-jb/driver/modules/hostap.c
--- hostap/driver/modules/hostap.c	2003-01-11 07:04:58.000000000 +0100
+++ hostap-jb/driver/modules/hostap.c	2003-03-03 02:26:41.000000000 +0100
@@ -862,6 +862,84 @@
 	netif_stop_queue(dev);
 }
 
+// PATCH: Global set rate function
+
+int prism2_set_rate_from_local(struct net_device *dev)
+{
+	int ret;
+	local_info_t *local = (local_info_t *) dev->priv;
+	ret = (hostap_set_word(dev, HFA384X_RID_TXRATECONTROL,
+			       local->tx_rate_control) ||
+	       local->func->reset_port(dev));
+		
+	if (ret) {
+		printk(KERN_DEBUG "%s: TXRateControl 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);
+	}
+	return ret;
+}
+
+// PATCH: Global set txpower function
+
+int prism2_set_power_from_local(struct net_device *dev)
+{
+	int alc;
+	u16 val;
+	local_info_t *local = (local_info_t *) dev->priv;
+
+	/* 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)
+{
+	local_info_t *local = (local_info_t *) dev->priv;
+
+	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;
+	local_info_t *local = (local_info_t *) dev->priv;
+	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);
+}
 
 struct proc_dir_entry *hostap_proc;
 
@@ -904,6 +982,10 @@
 EXPORT_SYMBOL(hostap_setup_dev);
 EXPORT_SYMBOL(hostap_proc);
 EXPORT_SYMBOL(hostap_set_multicast_list_queue);
+EXPORT_SYMBOL(prism2_set_power_from_local);
+EXPORT_SYMBOL(prism2_set_rate_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 hostap/driver/modules/hostap.h hostap-jb/driver/modules/hostap.h
--- hostap/driver/modules/hostap.h	2002-11-24 05:58:37.000000000 +0100
+++ hostap-jb/driver/modules/hostap.h	2003-03-03 01:14:35.000000000 +0100
@@ -27,6 +27,8 @@
 void hostap_setup_dev(struct net_device *dev, local_info_t *local,
 		      int main_dev);
 void hostap_set_multicast_list_queue(void *data);
+int prism2_set_rate_from_local(struct net_device *dev);
+int prism2_set_power_from_local(struct net_device *dev);
 
 
 /* hostap_proc.c */
diff -Naur hostap/driver/modules/hostap_hw.c hostap-jb/driver/modules/hostap_hw.c
--- hostap/driver/modules/hostap_hw.c	2003-03-01 23:02:01.000000000 +0100
+++ hostap-jb/driver/modules/hostap_hw.c	2003-03-03 02:33:38.000000000 +0100
@@ -1182,6 +1182,16 @@
 	if (!initial || !delayed_enable) {
 		if (!local->dev_enabled)
 			prism2_callback(local, PRISM2_CALLBACK_ENABLE);
+	 }
+	
+// PATCH: Set saved txpower, rate, sens & retry values after HW reset
+
+	prism2_set_power_from_local(dev);
+	prism2_set_rate_from_local(dev);
+	prism2_set_sens_from_local(dev);
+	prism2_set_retry_from_local(dev);
+	
+	if (!initial || !delayed_enable) {
 		local->dev_enabled = 1;
 		return prism2_hw_enable(dev, initial);
 	}
@@ -1975,10 +1985,13 @@
 	if (!res)
 		res = prism2_transmit(dev, idx);
 	if (res) {
-		printk(KERN_DEBUG "%s: prism2_tx - to BAP0 failed\n",
+		printk(KERN_INFO "%s: prism2_tx - to BAP0 failed - skipping card reset\n",
 		       dev->name);
 		local->intransmitfid[idx] = PRISM2_TXFID_EMPTY;
-		PRISM2_SCHEDULE_TASK(&local->reset_queue);
+
+// PATCH: We usually don't need reset in client mode (caused by BAP0)
+		
+		/* PRISM2_SCHEDULE_TASK(&local->reset_queue); */
 		ret = 0; /* do not retry failed frames to avoid problems */
 		goto fail;
 	}
@@ -4031,6 +4044,17 @@
 
 	local->saved_eth_header_parse = local->dev->hard_header_parse;
 
+// 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;
+	
+
 	return local;
 
  fail:
diff -Naur hostap/driver/modules/hostap_ioctl.c hostap-jb/driver/modules/hostap_ioctl.c
--- hostap/driver/modules/hostap_ioctl.c	2003-02-14 05:56:42.000000000 +0100
+++ hostap-jb/driver/modules/hostap_ioctl.c	2003-03-03 02:22:48.000000000 +0100
@@ -340,7 +340,6 @@
 				struct iw_param *rrq, char *extra)
 {
 	local_info_t *local = (local_info_t *) dev->priv;
-	int ret = 0;
 
 	if (rrq->fixed) {
 		switch (rrq->value) {
@@ -388,15 +387,8 @@
 		}
 	}
 
-	ret = (hostap_set_word(dev, HFA384X_RID_TXRATECONTROL,
-			       local->tx_rate_control) ||
-	       local->func->reset_port(dev));
-		
-	if (ret) {
-		printk("%s: TXRateControl setting to 0x%x failed\n",
-		       dev->name, local->tx_rate_control);
-	}
-	return ret;
+// PATCH: Use global function instead of setting locally
+	return prism2_set_rate_from_local(dev);
 }
 
 static int prism2_ioctl_giwrate(struct net_device *dev,
@@ -464,11 +456,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,
@@ -1169,16 +1161,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;
 	}
@@ -1260,6 +1250,9 @@
  * increasing dBm value should correspond to increasing TX power.
  */
 
+// PATCH: We don't use HFA386 <-> dBm values conversion
+
+/*
 static int prism2_txpower_hfa386x_to_dBm(u16 val)
 {
 	signed char tmp;
@@ -1288,7 +1281,7 @@
 
 	return (unsigned char) tmp;
 }
-
+*/
 
 static int prism2_ioctl_siwtxpow(struct net_device *dev,
 				 struct iw_request_info *info,
@@ -1321,22 +1314,10 @@
 		local->txpower_type = PRISM2_TXPOWER_UNKNOWN;
 	}
 
-	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
+ 
+	local->txpower_type = rrq->fixed?
+		PRISM2_TXPOWER_FIXED:PRISM2_TXPOWER_AUTO;
 
 	if (rrq->flags == IW_TXPOW_DBM)
 		tmp = "dBm";
@@ -1344,7 +1325,6 @@
 		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");
@@ -1352,11 +1332,10 @@
 	}
 
 	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;
+	
+// PATCH: Use global function instead of setting locally
 
+	ret = prism2_set_power_from_local(dev);
 	return ret;
 }
 
@@ -1375,7 +1354,8 @@
 		if (local->func->cmd(dev, HFA384X_CMDCODE_READMIF,
 				     HFA386X_CR_MANUAL_TX_POWER,
 				     NULL, &resp0) == 0) {
-			rrq->value = prism2_txpower_hfa386x_to_dBm(resp0);
+// PATCH: removed crappy dBm conversion
+			rrq->value = resp0;
 		} else {
 			/* Could not get real txpower; guess 15 dBm */
 			rrq->value = 15;
diff -Naur hostap/driver/modules/hostap_wlan.h hostap-jb/driver/modules/hostap_wlan.h
--- hostap/driver/modules/hostap_wlan.h	2003-02-15 06:39:13.000000000 +0100
+++ hostap-jb/driver/modules/hostap_wlan.h	2003-03-03 01:41:58.000000000 +0100
@@ -1133,6 +1133,8 @@
 		PRISM2_TXPOWER_FIXED, PRISM2_TXPOWER_UNKNOWN
 	} txpower_type;
 	int txpower; /* if txpower_type == PRISM2_TXPOWER_FIXED */
+	int sensitivity;
+
 
 	/* command queue for hfa384x_cmd(); protected with cmdlock */
 	struct list_head cmd_queue;


More information about the HostAP mailing list