[PATCH] implement sensitivity control
Denis Vlasenko
vda
Thu Jul 3 02:29:43 PDT 2003
Hi Jouni, Pavel, folks.
I made a patch which implements sensitivity control for hostap.
Currently it does not program sensitivity at card initialization
(you'll need explicit iwconfig wlan# sens N or card remains
programmed as per default (max sens)) and sens settings do not
survive card reset. These can be fixed later.
Applies to today's CVS.
After iwconfig wlan0 sens 117:
wlan0 IEEE 802.11b
Mode:Master Frequency:2.422GHz
Bit Rate:11Mb/s Tx-Power=-1 dBm Sensitivity=117/127
Untouched by iwconfig sens N:
wlan1 IEEE 802.11b
Mode:Managed Frequency:2.462GHz
Bit Rate:2Mb/s Tx-Power:5 dBm Sensitivity=0/127
(this is wrong, should show 127/127. later...)
This is what I get in my logs with these patches:
=================================================
01:21:45 kernel: A1=01:02:2d:61:49:cd A2=00:02:2d:51:3e:ab A3=00:00:00:00:00:00 A4=aa:aa:03:00:20:f6
01:21:45 kernel: wlan0: dropped received packet from 00:02:2d:51:3e:ab with no ToDS flag (type=0x02, subtype=0x00)
01:21:45 kernel: wlan0: RX signal=163 noise=156 rate=20 len=118 jiffies=16877
01:21:45 kernel: FC=0x0008 (type=2:0) dur=0x0000 seq=0xdca0
01:21:45 kernel: A1=01:02:2d:61:49:cd A2=00:02:2d:51:3e:ab A3=00:00:00:00:00:00 A4=aa:aa:03:00:20:f6
01:21:46 kernel: wlan0: dropped received packet from 00:02:2d:51:3e:ab with no ToDS flag (type=0x02, subtype=0x00)
01:21:46 kernel: wlan0: RX signal=163 noise=156 rate=20 len=281 jiffies=16892
01:21:46 kernel: FC=0x0008 (type=2:0) dur=0x0000 seq=0xdd20
01:21:46 kernel: A1=01:02:2d:61:49:cd A2=00:02:2d:51:3e:ab A3=00:00:00:00:00:00 A4=aa:aa:03:00:20:f6
01:21:46 kernel: wlan0: dropped received packet from 00:02:2d:51:3e:ab with no ToDS flag (type=0x02, subtype=0x00)
these are 'foreign' packets which I do not want to receive...
01:21:46 kernel: wlan0: RX signal=163 noise=156 rate=20 len=118 jiffies=16897
01:21:46 kernel: FC=0x0008 (type=2:0) dur=0x0000 seq=0xdd40
01:21:46 kernel: A1=01:02:2d:61:49:cd A2=00:02:2d:51:3e:ab A3=00:00:00:00:00:00 A4=aa:aa:03:00:20:f6
01:21:47 kernel: wlan0: dropped received packet from 00:02:2d:51:3e:ab with no ToDS flag (type=0x02, subtype=0x00)
01:21:47 kernel: wlan0: RX signal=163 noise=156 rate=20 len=50 jiffies=17030
01:21:47 kernel: FC=0x0008 (type=2:0) dur=0x0000 seq=0xe240
01:21:47 kernel: A1=01:02:2d:61:49:cd A2=00:02:2d:51:3e:ab A3=00:00:00:00:00:00 A4=aa:aa:03:00:20:f6
I do 'iwconfig wlan0 sens 117'
01:21:52 kernel: wlan0: ED_THRESHOLD: ->0a
01:21:52 kernel: wlan0: ACQUISITION_THRESHOLDS: 1e->5e
and no more bad packets seen ;)
--
vda
Now iwconfig sens N (0..127) does indeed have some effect
diff -ur hostap-2003-06-16/driver/modules/hostap_ioctl.c hostap-2003-06-16.sens/driver/modules/hostap_ioctl.c
--- hostap-2003-06-16/driver/modules/hostap_ioctl.c Fri Jun 6 06:07:01 2003
+++ hostap-2003-06-16.sens/driver/modules/hostap_ioctl.c Thu Jul 3 01:13:48 2003
@@ -503,14 +503,75 @@
struct iw_param *sens, char *extra)
{
local_info_t *local = (local_info_t *) dev->priv;
-
- /* Set the desired AP density */
- if (sens->value < 1 || sens->value > 3)
+ u16 val,newv;
+
+ /* Energy Detected threshold: 0..127 <-> Sensitivity 127..0 */
+
+ /* NB: by default ED seen programmed to 127 (maxed out, lowest sens)
+ * but ignored in both TX_CONFIGURE and ACQ_THRESH regs
+ * That's how hw was prgrammed in my DWL-520
+ * before I started to have fun with sens.
+ * TODO: special case sens 128: do not make Acquisition Thresholds
+ * honour Energy Detected threshold.
+ * Maybe it can pick weaker signals with that setting
+ * TODO: set max sens 127 (128) at init.
+ * TODO: teach driver to set sens after hw reset.
+ */
+ /* Set Energy Detected threshold */
+ if(sens->value < 0 || sens->value > 127)
+ return -EINVAL;
+ val = 127 - sens->value; /* bit 7=0 - threshold is rel to noise */
+ printk(KERN_DEBUG "%s: ED_THRESHOLD: ->%02x\n", dev->name, val);
+ if(local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
+ HFA386X_CR_ED_THRESHOLD, &val, NULL)) {
+ printk(KERN_ERR "%s: failure writing ED_THRESHOLD\n",
+ dev->name);
return -EINVAL;
-
- if (hostap_set_word(dev, HFA384X_RID_CNFSYSTEMSCALE, sens->value) ||
- local->func->reset_port(dev))
+ }
+#if 0 /* Seems like it has no effect (on my hw/fw conf) */
+ /* Make Clear Channel Assessment honour Energy Detected threshold */
+ if(local->func->cmd(dev, HFA384X_CMDCODE_READMIF,
+ HFA386X_CR_TX_CONFIGURE, NULL, &val)) {
+ printk(KERN_ERR "%s: failure reading TX_CONFIGURE\n",
+ dev->name);
return -EINVAL;
+ }
+ /* bits 6:5
+ * 00 - CCA is based only on ED.
+ * 01 - CCA is based on (CS1 OR SQ1).
+ * 10 - CCA is based on (ED AND (CS1 OR SQ1)).
+ * 11 - CCA is based on (ED OR (CS1 OR SQ1)). */
+ newv = (val&0x9f)|0x40; /* 6:5=10 */
+ printk(KERN_DEBUG "%s: TX_CONFIGURE: %02x->%02x\n",
+ dev->name, val, newv);
+ if(val != newv) {
+ if(local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
+ HFA386X_CR_TX_CONFIGURE, &newv, NULL)) {
+ printk(KERN_ERR "%s: failure writing TX_CONFIGURE\n",
+ dev->name);
+ return -EINVAL;
+ }
+ }
+#endif
+ /* Make Acquisition Thresholds honour Energy Detected threshold */
+ if(local->func->cmd(dev, HFA384X_CMDCODE_READMIF,
+ HFA386X_CR_ACQUISITION_THRESHOLDS, NULL, &val)) {
+ printk(KERN_ERR "%s: failure reading ACQUISITION_THRESHOLDS\n",
+ dev->name);
+ return -EINVAL;
+ }
+ /* bit 6 - ED and SQ1 control for acquisition. 0 = SQ1. 1 = ED and SQ1. */
+ newv = val|0x40;
+ printk(KERN_DEBUG "%s: ACQUISITION_THRESHOLDS: %02x->%02x\n",
+ dev->name, val, newv);
+ if(val != newv) {
+ if(local->func->cmd(dev, HFA384X_CMDCODE_WRITEMIF,
+ HFA386X_CR_ACQUISITION_THRESHOLDS, &newv, NULL)) {
+ printk(KERN_ERR "%s: failure writing "
+ "ACQUISITION_THRESHOLDS\n", dev->name);
+ return -EINVAL;
+ }
+ }
return 0;
}
@@ -520,14 +581,15 @@
struct iw_param *sens, char *extra)
{
local_info_t *local = (local_info_t *) dev->priv;
- u16 val;
-
- /* Get the current AP density */
- if (local->func->get_rid(dev, HFA384X_RID_CNFSYSTEMSCALE, &val, 2, 1) <
- 0)
- return -EINVAL;
- sens->value = __le16_to_cpu(val);
+ u16 val;
+ if (local->func->cmd(dev, HFA384X_CMDCODE_READMIF,
+ HFA386X_CR_ED_THRESHOLD, NULL, &val)) {
+ printk(KERN_ERR "%s: failure reading ED_THRESHOLD\n",
+ dev->name);
+ return -EINVAL; /* or what? */
+ }
+ sens->value = 127-(val&0x7f);
sens->fixed = 1;
return 0;
@@ -932,7 +994,7 @@
range->max_qual.qual = 92; /* 0 .. 92 */
range->max_qual.level = 154; /* 27 .. 154 */
range->max_qual.noise = 154; /* 27 .. 154 */
- range->sensitivity = 3;
+ range->sensitivity = 127;
range->max_encoding_tokens = WEP_KEYS;
range->num_encoding_sizes = 2;
diff -ur hostap-2003-06-16/driver/modules/hostap_wlan.h hostap-2003-06-16.sens/driver/modules/hostap_wlan.h
--- hostap-2003-06-16/driver/modules/hostap_wlan.h Fri May 23 05:23:48 2003
+++ hostap-2003-06-16.sens/driver/modules/hostap_wlan.h Sat Jun 28 23:38:54 2003
@@ -681,6 +681,8 @@
#define HFA386X_CR_RX_CONFIGURE 0x14
#define HFA386X_CR_A_D_TEST_MODES2 0x1A
#define HFA386X_CR_MANUAL_TX_POWER 0x3E
+#define HFA386X_CR_ED_THRESHOLD 0x46
+#define HFA386X_CR_ACQUISITION_THRESHOLDS 0x5E
/* IEEE 802.11 defines */
More information about the Hostap
mailing list