Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Jan 2006 19:57:48 +0100
From:      Max Laier <max@love2party.net>
To:        freebsd-current@freebsd.org
Cc:        Damien Bergamini <damien@freebsd.org>, Alexander Nedotsukov <bland@freebsd.org>
Subject:   Re: Intel 2915abg and 11a
Message-ID:  <200601071957.55542.max@love2party.net>
In-Reply-To: <200601070605.05535.max@love2party.net>
References:  <200601070605.05535.max@love2party.net>

next in thread | previous in thread | raw e-mail | index | archive | help
--nextPart1376887.ZC23clUomX
Content-Type: multipart/mixed;
  boundary="Boundary-01=_u8AwDzxaeWM2LKO"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

--Boundary-01=_u8AwDzxaeWM2LKO
Content-Type: text/plain;
  charset="iso-8859-6"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

On Saturday 07 January 2006 06:04, Max Laier wrote:
> Hi,
>
> is anyone successfully running their Intel 2915abg card in 11a mode with
> the iwi(4) driver?  I am wondering, because since 11a has been enabled in
> the driver I can't use it anymore.  "fatal error" while scanning through
> the 11a channels.  No matter what firmware I use.
>
> Please let me know - if there are no positive reports I'd like to disable
> 11a for the moment to have the driver working in 11b/g mode at least -
> which it does.

Andrew Atrens, who did the DragonFly port, was nice enough to let me know t=
hat=20
he had worked around the issue.  By looking at the diffs I came up with thi=
s=20
patch, which fixes things for me.  There is more to be done wrt locking, bu=
t=20
that's another story - for now only fixing the obvious problems.

BTW, I am working on the firmware loading proposed by Sam in -arch a while=
=20
back.  My latest version is here:
	http://people.freebsd.org/~mlaier/firmware.tgz
including these changes to iwi as well as the modified firmware loading.

=2D-=20
/"\  Best regards,                      | mlaier@freebsd.org
\ /  Max Laier                          | ICQ #67774661
 X   http://pf4freebsd.love2party.net/  | mlaier@EFnet
/ \  ASCII Ribbon Campaign              | Against HTML Mail and News

--Boundary-01=_u8AwDzxaeWM2LKO
Content-Type: text/x-diff;
  charset="iso-8859-6";
  name="if_iwi.11a.diff"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="if_iwi.11a.diff"

Index: if_iwi.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /usr/store/mlaier/fcvs/src/sys/dev/iwi/if_iwi.c,v
retrieving revision 1.26
diff -u -r1.26 if_iwi.c
=2D-- if_iwi.c	20 Nov 2005 16:02:04 -0000	1.26
+++ if_iwi.c	7 Jan 2006 18:46:16 -0000
@@ -150,6 +150,7 @@
 static int	iwi_scan(struct iwi_softc *);
 static int	iwi_auth_and_assoc(struct iwi_softc *);
 static void	iwi_init(void *);
+static void	iwi_init_locked(void *);
 static void	iwi_stop(void *);
 static int	iwi_read_firmware(const char *, caddr_t *, size_t *);
 static int	iwi_sysctl_stats(SYSCTL_HANDLER_ARGS);
@@ -881,7 +882,7 @@
 	}
=20
 	if ((ifp->if_flags & IFF_UP) && (ifp->if_drv_flags & IFF_DRV_RUNNING))
=2D		iwi_init(sc);
+		iwi_init_locked(sc);
=20
 	IWI_UNLOCK(sc);
=20
@@ -1773,7 +1774,7 @@
 	case SIOCSIFFLAGS:
 		if (ifp->if_flags & IFF_UP) {
 			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
=2D				iwi_init(sc);
+				iwi_init_locked(sc);
 		} else {
 			if (ifp->if_drv_flags & IFF_DRV_RUNNING)
 				iwi_stop(sc);
@@ -1788,7 +1789,7 @@
 		if ((ifp->if_flags & IFF_UP) &&
 		    (ifp->if_drv_flags & IFF_DRV_RUNNING) &&
 		    (ic->ic_roaming !=3D IEEE80211_ROAMING_MANUAL))
=2D			iwi_init(sc);
+			iwi_init_locked(sc);
 		error =3D 0;
 	}
=20
@@ -2255,10 +2256,12 @@
 	struct ieee80211com *ic =3D &sc->sc_ic;
 	struct iwi_scan scan;
 	uint8_t *p;
=2D	int i, count;
+	int i, count, do_5ghz_scan =3D 0;
=20
=2D	memset(&scan, 0, sizeof scan);
+	sc->scan_counter++;
+	sc->flags |=3D IWI_FLAG_SCANNING;
=20
+	bzero(&scan, sizeof(scan));
 	if (ic->ic_des_esslen !=3D 0) {
 		scan.bdirected =3D htole16(sc->dwelltime);
 		memset(scan.type, IWI_SCAN_TYPE_BDIRECTED, sizeof scan.type);
@@ -2268,25 +2271,40 @@
 	}
=20
 	p =3D scan.channels;
=2D	count =3D 0;
=2D	for (i =3D 0; i <=3D IEEE80211_CHAN_MAX; i++) {
=2D		if (IEEE80211_IS_CHAN_5GHZ(&ic->ic_channels[i]) &&
=2D		    isset(ic->ic_chan_active, i)) {
=2D			*++p =3D i;
=2D			count++;
=2D		}
+	/*
+	 * If we have .11a capable adapter, and
+	 * 	- we are in .11a mode, or
+	 *	- we are in auto mode and this is an odd numbered scan
+	 * then do a 5GHz scan, otherwise do a 2GHz scan.
+	 */
+	if ( ic->ic_sup_rates[IEEE80211_MODE_11A].rs_nrates > 0 ) {
+		if (( ic->ic_curmode =3D=3D IEEE80211_MODE_11A ) ||
+		    (( ic->ic_curmode =3D=3D IEEE80211_MODE_AUTO ) &&
+		     ( sc->scan_counter & 1)))
+			do_5ghz_scan =3D 1;
 	}
=2D	*(p - count) =3D IWI_CHAN_5GHZ | count;
=2D
 	count =3D 0;
=2D	for (i =3D 0; i <=3D IEEE80211_CHAN_MAX; i++) {
=2D		if (IEEE80211_IS_CHAN_2GHZ(&ic->ic_channels[i]) &&
=2D		    isset(ic->ic_chan_active, i)) {
=2D			*++p =3D i;
=2D			count++;
+	if ( do_5ghz_scan ) {
+		DPRINTF(("Scanning 5GHz band\n"));
+		for (i =3D 0; i <=3D IEEE80211_CHAN_MAX; i++) {
+			if (IEEE80211_IS_CHAN_5GHZ(&ic->ic_channels[i]) &&
+					isset(ic->ic_chan_active, i)) {
+				*++p =3D i;
+				count++;
+			}
+		}
+		*(p - count) =3D IWI_CHAN_5GHZ | count;
+	} else {
+		DPRINTF(("Scanning 2GHz band\n"));
+		for (i =3D 0; i <=3D IEEE80211_CHAN_MAX; i++) {
+			if (IEEE80211_IS_CHAN_2GHZ(&ic->ic_channels[i]) &&
+					isset(ic->ic_chan_active, i)) {
+				*++p =3D i;
+				count++;
+			}
 		}
+		*(p - count) =3D IWI_CHAN_2GHZ | count;
 	}
=2D	*(p - count) =3D IWI_CHAN_2GHZ | count;
=20
 	DPRINTF(("Start scanning\n"));
 	return iwi_cmd(sc, IWI_CMD_SCAN, &scan, sizeof scan, 1);
@@ -2418,6 +2436,16 @@
 iwi_init(void *priv)
 {
 	struct iwi_softc *sc =3D priv;
+
+	IWI_LOCK(sc);
+	iwi_init_locked(sc);
+	IWI_UNLOCK(sc);
+}
+
+static void
+iwi_init_locked(void *priv)
+{
+	struct iwi_softc *sc =3D priv;
 	struct ieee80211com *ic =3D &sc->sc_ic;
 	struct ifnet *ifp =3D ic->ic_ifp;
 	struct iwi_rx_data *data;
Index: if_iwivar.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /usr/store/mlaier/fcvs/src/sys/dev/iwi/if_iwivar.h,v
retrieving revision 1.8
diff -u -r1.8 if_iwivar.h
=2D-- if_iwivar.h	19 Nov 2005 16:54:55 -0000	1.8
+++ if_iwivar.h	7 Jan 2006 18:46:16 -0000
@@ -118,6 +118,7 @@
 	struct mtx		sc_mtx;
 	struct unrhdr		*sc_unr;
=20
+	uint32_t		scan_counter;
 	uint32_t		flags;
 #define IWI_FLAG_FW_INITED	(1 << 0)
 #define IWI_FLAG_SCANNING	(1 << 1)

--Boundary-01=_u8AwDzxaeWM2LKO--

--nextPart1376887.ZC23clUomX
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (FreeBSD)

iD8DBQBDwA8zXyyEoT62BG0RAlP2AJ9K8a7Ew4bsZLuf2sOK7JEs7WAl+QCePOoH
JKnQwQHZAW0HdMkszC4Jjuo=
=p7HK
-----END PGP SIGNATURE-----

--nextPart1376887.ZC23clUomX--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200601071957.55542.max>