Subject: Re: kern/31295: iwi(4) does not associate with AP
To: None <gnats-bugs@netbsd.org>
From: Nick Hudson <nick.hudson@dsl.pipex.com>
List: netbsd-bugs
Date: 09/12/2005 22:36:14
--Boundary-00=_fLgJDRQRaF2lOAo
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
On Sunday 11 September 2005 19:29, scw@netbsd.org wrote:
> >Synopsis: iwi(4) does not associate with AP
[...]
I think this patch fixes it. Could you please test?
Thanks,
Nick
--Boundary-00=_fLgJDRQRaF2lOAo
Content-Type: text/x-diff;
charset="iso-8859-1";
name="iwi.31295.diffs"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="iwi.31295.diffs"
Index: dev/pci/if_iwi.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_iwi.c,v
retrieving revision 1.22
diff -u -r1.22 if_iwi.c
--- dev/pci/if_iwi.c 12 Sep 2005 21:15:04 -0000 1.22
+++ dev/pci/if_iwi.c 12 Sep 2005 21:34:47 -0000
@@ -2110,21 +2110,44 @@
iwi_scan(struct iwi_softc *sc)
{
struct ieee80211com *ic = &sc->sc_ic;
- struct iwi_scan scan;
+ struct iwi_scan_v2 scan;
+ u_int32_t type;
u_int8_t *p;
int i, count;
(void)memset(&scan, 0, sizeof scan);
- scan.type = IWI_SCAN_TYPE_BROADCAST;
- scan.dwelltime = htole16(sc->dwelltime);
- p = scan.channels;
+ scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BROADCAST] =
+ htole16(sc->dwelltime);
+ scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BDIRECT] =
+ htole16(sc->dwelltime);
+
+ /* tell the firmware about the desired essid */
+ if (ic->ic_des_esslen) {
+ int error;
+
+ DPRINTF(("%s: Setting adapter desired ESSID to %s\n",
+ __func__, ic->ic_des_essid));
+
+ error = iwi_cmd(sc, IWI_CMD_SET_ESSID,
+ ic->ic_des_essid, ic->ic_des_esslen, 1);
+ if (error)
+ return error;
+
+ type = IWI_SCAN_TYPE_ACTIVE_BDIRECT;
+ } else {
+ type = IWI_SCAN_TYPE_ACTIVE_BROADCAST;
+ }
+
+ p = &scan.channels[0];
count = 0;
+
for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
if (IEEE80211_IS_CHAN_5GHZ(&ic->ic_channels[i]) &&
isset(ic->ic_chan_active, i)) {
*++p = i;
count++;
+ iwi_scan_type_set(scan, i, type);
}
}
*(p - count) = IWI_CHAN_5GHZ | count;
@@ -2135,12 +2158,13 @@
isset(ic->ic_chan_active, i)) {
*++p = i;
count++;
+ iwi_scan_type_set(scan, i, type);
}
}
*(p - count) = IWI_CHAN_2GHZ | count;
DPRINTF(("Start scanning\n"));
- return iwi_cmd(sc, IWI_CMD_SCAN, &scan, sizeof scan, 1);
+ return iwi_cmd(sc, IWI_CMD_SCAN_V2, &scan, sizeof scan, 1);
}
static int
Index: dev/pci/if_iwireg.h
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_iwireg.h,v
retrieving revision 1.6
diff -u -r1.6 if_iwireg.h
--- dev/pci/if_iwireg.h 12 Sep 2005 21:15:04 -0000 1.6
+++ dev/pci/if_iwireg.h 12 Sep 2005 21:34:47 -0000
@@ -249,6 +249,7 @@
#define IWI_CMD_ASSOCIATE 21
#define IWI_CMD_SET_RATES 22
#define IWI_CMD_ABORT_SCAN 23
+#define IWI_CMD_SCAN_V2 26
#define IWI_CMD_SET_OPTIE 31
#define IWI_CMD_DISABLE 33
#define IWI_CMD_SET_IV 34
@@ -316,11 +317,16 @@
#define IWI_SCAN_CHANNELS 54
+#define IWI_SCAN_TYPE_FIRST_BEACON 0
+#define IWI_SCAN_TYPE_PASSIVE 1
+#define IWI_SCAN_TYPE_ACTIVE_DIRECT 2
+#define IWI_SCAN_TYPE_ACTIVE_BROADCAST 3
+#define IWI_SCAN_TYPE_ACTIVE_BDIRECT 4
+#define IWI_SCAN_TYPES 5
+
/* structure for command IWI_CMD_SCAN */
struct iwi_scan {
u_int8_t type;
-#define IWI_SCAN_TYPE_PASSIVE 1
-#define IWI_SCAN_TYPE_BROADCAST 3
u_int16_t dwelltime;
u_int8_t channels[IWI_SCAN_CHANNELS];
@@ -330,6 +336,27 @@
u_int8_t reserved[3];
} __attribute__((__packed__));
+#define iwi_scan_type_set(s, i, t) \
+ do { \
+ if ((i) % 2 == 0) \
+ (s).type[(i) / 2].lsn = (t); \
+ else \
+ (s).type[(i) / 2].msn = (t); \
+ } while(0)
+
+/* structure for command IWI_CMD_SCAN_V2 */
+struct iwi_scan_v2 {
+ u_int32_t fsidx;
+ u_int8_t channels[IWI_SCAN_CHANNELS];
+ struct {
+ u_int8_t lsn:4;
+ u_int8_t msn:4;
+ } __attribute__ ((__packed__)) type[IWI_SCAN_CHANNELS / 2];
+ u_int8_t reserved1;
+ u_int16_t dwelltime[IWI_SCAN_TYPES];
+
+} __attribute__ ((__packed__));
+
/* structure for command IWI_CMD_SET_CONFIGURATION */
struct iwi_configuration {
u_int8_t bluetooth_coexistence;
--Boundary-00=_fLgJDRQRaF2lOAo--