iwn on 7.1-RC1
Jan Henrik Sylvester
me at janh.de
Fri Dec 19 07:23:24 PST 2008
Short version: Is there any chance to get iwn working on 7.1-RC1
reliably? I have got one problem with the initial perforce version and
the backport from gavin always crashes. Long version:
I have been using the initial perforce version of iwn on 7-STABLE for a
few month now, since the next version is already "vap'ify iwn". Usually,
the connection to my WPA2 ap is established on boot, but pretty often I
get an error instead:
iwn0: error, INTR=82000000<SW_ERROR,RX_INTR> STATUS=0x10000
iwn0: iwn_config: could not set power mode, error 35
Doing one or two "kldunload if_iwn" fixes the problem.
Rarely, I had crashes (on boot).
Today, I found that gavin did a backport of iwn in September:
http://lists.freebsd.org/pipermail/freebsd-stable/2008-September/045234.html
As it had some changes compared to the initial perforce version, I tried
that version instead. I always get a crash on boot:
[...]
iwn0: iwn_read_eeprom_ht40: no entry for channel 10
iwn0: iwn_read_eeprom_ht40: no entry for channel 11
iwn0: iwn_read_eeprom_ht40: no entry for channel 12
iwn0: iwn_read_eeprom_ht40: no entry for channel 13
Fatal trap 12: page fault while in kernel mode
cpuid = 0; apic id = 00
fault virtual address = 0xc5bb5004
fault code = supervisor read, page not present
instruction pointer = 0x20:0xc1543935
stack pointer = 0x28:0xc18207f8
frame pointer = 0x28:0xc1820858
code segment = base 0x0, limit 0xfffff, type 0x1b
= DPL 0, pres 1, def32 1, gran 1
processsor eflags = interrupt enabled, resume, IOPL = 0
current process = 0 (swapper)
trap number = 12
panic: page fault
cpuid = 0
Uptime: 1s
Automatic reboot in 15 seconds - press a key on the console to abort
I do not remember, if the crash is the same as I had with the initial
perforce version, which I cannot reproduce.
Does anyone have a better version of iwn without vap? Does anyone know
which current / perforce change could address the error mentioned above?
There are only a few differences between the initial perforce version
and the backport by gavin (besides man page). I will attach them below.
Cheers,
Jan Henrik
diff -u perforce/sys/dev/iwn/if_iwn.c gavin/sys/dev/iwn/if_iwn.c
--- perforce/sys/dev/iwn/if_iwn.c 2008-12-19 15:19:14.000000000
+0100
+++ gavin/sys/dev/iwn/if_iwn.c 2008-12-19 15:16:57.000000000 +0100
@@ -124,6 +124,7 @@
void iwn_rx_statistics(struct iwn_softc *, struct
iwn_rx_desc *);
void iwn_tx_intr(struct iwn_softc *, struct iwn_rx_desc *);
void iwn_cmd_intr(struct iwn_softc *, struct iwn_rx_desc *);
+static void iwn_bmiss(void *, int);
void iwn_notif_intr(struct iwn_softc *);
void iwn_intr(void *);
void iwn_read_eeprom(struct iwn_softc *);
@@ -292,7 +293,8 @@
taskqueue_start_threads(&sc->sc_tq, 1, PI_NET, "%s taskq",
device_get_nameunit(dev));
- TASK_INIT(&sc->sc_opstask, 0, iwn_ops, sc );
+ TASK_INIT(&sc->sc_ops_task, 0, iwn_ops, sc );
+ TASK_INIT(&sc->sc_bmiss_task, 0, iwn_bmiss, sc );
/*
* Put adapter into a known state.
@@ -379,6 +381,8 @@
#endif
| IEEE80211_C_WME /* WME */
;
+#if 0
+ /* XXX disable until HT channel setup works */
ic->ic_htcaps =
IEEE80211_HTCAP_SMPS_ENA /* SM PS mode enabled
*/
| IEEE80211_HTCAP_CHWIDTH40 /* 40MHz channel width
*/
@@ -391,7 +395,7 @@
| IEEE80211_HTC_AMPDU /* tx A-MPDU */
| IEEE80211_HTC_AMSDU /* tx A-MSDU */
;
-
+#endif
/* read supported channels and MAC address from EEPROM */
iwn_read_eeprom(sc);
@@ -1594,6 +1598,15 @@
wakeup(&ring->cmd[desc->idx]);
}
+static void
+iwn_bmiss(void *arg, int npending)
+{
+ struct iwn_softc *sc = arg;
+ struct ieee80211com *ic = sc->sc_ifp->if_l2com;
+
+ ieee80211_beacon_miss(ic);
+}
+
void
iwn_notif_intr(struct iwn_softc *sc)
{
@@ -1652,7 +1665,8 @@
if (ic->ic_state == IEEE80211_S_RUN && misses >
5)
(void) iwn_init_sensitivity(sc);
if (misses >= ic->ic_bmissthreshold)
- ieee80211_beacon_miss(ic);
+ taskqueue_enqueue(taskqueue_swi,
+ &sc->sc_bmiss_task);
break;
}
case IWN_UC_READY: {
@@ -2398,7 +2412,7 @@
static const struct iwn_chan_band iwn_bands[] = {
{ IWN_EEPROM_BAND1, IEEE80211_CHAN_G, 14,
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } },
- { IWN_EEPROM_BAND2, IEEE80211_CHAN_A, 13,
+/* { IWN_EEPROM_BAND2, IEEE80211_CHAN_A, 13,
{ 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12,
16 } },
{ IWN_EEPROM_BAND3, IEEE80211_CHAN_A, 12,
{ 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } },
@@ -2406,11 +2420,11 @@
{ 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140
} },
{ IWN_EEPROM_BAND5, IEEE80211_CHAN_A, 6,
{ 145, 149, 153, 157, 161, 165 } },
- { IWN_EEPROM_BAND6, IEEE80211_CHAN_G | IEEE80211_CHAN_HT40,
7,
+*/ { IWN_EEPROM_BAND6, IEEE80211_CHAN_G | IEEE80211_CHAN_HT40,
7,
{ 1, 2, 3, 4, 5, 6, 7 } },
- { IWN_EEPROM_BAND7, IEEE80211_CHAN_A | IEEE80211_CHAN_HT40,
11,
+/* { IWN_EEPROM_BAND7, IEEE80211_CHAN_A | IEEE80211_CHAN_HT40,
11,
{ 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } }
- };
+*/ };
struct ieee80211com *ic = &sc->sc_ic;
int i;
@@ -2651,14 +2665,14 @@
/* XXX all wrong */
/* compute remaining time until next beacon */
val = (uint64_t)ni->ni_intval * 1024; /* msecs -> usecs */
- DPRINTF(sc, IWN_DEBUG_ANY, "%s: val = %llu %s\n", __func__,
+ DPRINTF(sc, IWN_DEBUG_ANY, "%s: val = %ju %s\n", __func__,
val, val == 0 ? "correcting" : "");
if (val == 0)
val = 1;
mod = le64toh(tsf.tstamp) % val;
tsf.binitval = htole32((uint32_t)(val - mod));
- DPRINTF(sc, IWN_DEBUG_RESET, "TSF bintval=%u tstamp=%llu,
init=%u\n",
+ DPRINTF(sc, IWN_DEBUG_RESET, "TSF bintval=%u tstamp=%ju, init=%u\n",
ni->ni_intval, le64toh(tsf.tstamp), (uint32_t)(val - mod));
if (iwn_cmd(sc, IWN_CMD_TSF, &tsf, sizeof tsf, 1) != 0)
@@ -4243,7 +4257,7 @@
sc->sc_cmd_arg[sc->sc_cmd_next] = arg;
sc->sc_cmd_next = (sc->sc_cmd_next + 1) % IWN_CMD_MAXOPS;
}
- taskqueue_enqueue(sc->sc_tq, &sc->sc_opstask);
+ taskqueue_enqueue(sc->sc_tq, &sc->sc_ops_task);
IWN_CMD_UNLOCK(sc);
return 0;
}
--- perforce/sys/dev/iwn/if_iwnvar.h 2008-12-19 15:19:14.000000000 +0100
+++ gavin/sys/dev/iwn/if_iwnvar.h 2008-12-19 15:16:57.000000000 +0100
@@ -197,7 +197,8 @@
struct taskqueue *sc_tq; /* Main command task queue */
/* Tasks used by the driver */
- struct task sc_opstask; /* operation handling task */
+ struct task sc_ops_task; /* operation handling
task */
+ struct task sc_bmiss_task; /* beacon miss task */
/* Thermal calibration */
struct callout calib_to;
--- perforce/sys/modules/iwn/Makefile 2008-12-19 15:19:14.000000000 +0100
+++ gavin/sys/modules/iwn/Makefile 2008-12-19 15:16:57.000000000 +0100
@@ -3,6 +3,6 @@
.PATH: ${.CURDIR}/../../dev/iwn
KMOD = if_iwn
-SRCS = if_iwn.c opt_bdg.h device_if.h bus_if.h pci_if.h
-CFLAGS += -g -DWITNESS -DINVARIANT_SUPPORT -DINVARIANTS -I${.CURDIR}/../../
+SRCS = if_iwn.c device_if.h bus_if.h pci_if.h
+
.include <bsd.kmod.mk>
More information about the freebsd-stable
mailing list