Date: Sun, 12 Jan 2014 14:27:00 +0100 From: Oliver Pinter <oliver.pntr@gmail.com> To: current@freebsd.org Subject: iwn0: iwn_intr: fatal firmware error (10-STABLE + iwn2230) Message-ID: <CAPjTQNFRi2S6SpBFaByfFU76tipL8G4Uh2gL7k-KUzTaC67ZBg@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hi all!
I got this firmware crash with 10-STABLE + backported iwn patches from CURRENT:
iwn0: device timeout
wlan0: link state changed to UP
wlan0: link state changed to DOWN
wlan0: link state changed to UP
iwn0: device timeout
iwn0: iwn_intr: fatal firmware error
firmware error log:
error type = "UNKNOWN" (0x0000102C)
program counter = 0x0000D978
source line = 0x000006A4
error data = 0x000000FE00000000
branch link = 0x0000D88A0000D88A
interrupt link = 0x0000EC7A00000000
time = 17657601
driver status:
tx ring 0: qid=0 cur=2 queued=2
tx ring 1: qid=1 cur=0 queued=0
tx ring 2: qid=2 cur=0 queued=0
tx ring 3: qid=3 cur=0 queued=0
tx ring 4: qid=4 cur=0 queued=0
tx ring 5: qid=5 cur=0 queued=0
tx ring 6: qid=6 cur=0 queued=0
tx ring 7: qid=7 cur=0 queued=0
tx ring 8: qid=8 cur=0 queued=0
tx ring 9: qid=9 cur=18 queued=0
tx ring 10: qid=10 cur=0 queued=0
tx ring 11: qid=11 cur=0 queued=0
tx ring 12: qid=12 cur=0 queued=0
tx ring 13: qid=13 cur=0 queued=0
tx ring 14: qid=14 cur=0 queued=0
tx ring 15: qid=15 cur=0 queued=0
tx ring 16: qid=16 cur=0 queued=0
tx ring 17: qid=17 cur=0 queued=0
tx ring 18: qid=18 cur=0 queued=0
tx ring 19: qid=19 cur=0 queued=0
rx ring: cur=36
wlan0: link state changed to DOWN
wlan0: link state changed to UP
wlan0: link state changed to DOWN
iwn0: device timeout
The hardware is:
iwn0@pci0:4:0:0: class=0x028000 card=0x40628086 chip=0x08878086
rev=0xc4 hdr=0x00
vendor = 'Intel Corporation'
device = 'Centrino Wireless-N 2230'
class = network
Attached the patch, that I use to support 2230 in 10-STABLE.
And attached the output of:
git diff op/stable/10/iwn origin/master -- sys/dev/iwn/ as
iwn_-_10_-_current.diff
and
git diff op/stable/10/iwn origin/master -- sys/dev/net80211/ as
net80211_-_10_-_current.diff
The git repo mirrored from FreeBSD's github repo.
[-- Attachment #2 --]
diff --git a/sys/net80211/ieee80211_alq.c b/sys/net80211/ieee80211_alq.c
index e651574..a52103a 100644
--- a/sys/net80211/ieee80211_alq.c
+++ b/sys/net80211/ieee80211_alq.c
@@ -53,10 +53,8 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/if_var.h>
-#include <net/if_dl.h>
-#include <net/if_clone.h>
#include <net/if_media.h>
-#include <net/if_types.h>
+#include <net/ethernet.h>
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_freebsd.h>
diff --git a/sys/net80211/ieee80211_amrr.c b/sys/net80211/ieee80211_amrr.c
index c745b05..ab1f033 100644
--- a/sys/net80211/ieee80211_amrr.c
+++ b/sys/net80211/ieee80211_amrr.c
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_media.h>
+#include <net/ethernet.h>
#ifdef INET
#include <netinet/in.h>
@@ -130,6 +131,12 @@ amrr_deinit(struct ieee80211vap *vap)
free(vap->iv_rs, M_80211_RATECTL);
}
+/*
+ * Return whether 11n rates are possible.
+ *
+ * Some 11n devices may return HT information but no HT rates.
+ * Thus, we shouldn't treat them as an 11n node.
+ */
static int
amrr_node_is_11n(struct ieee80211_node *ni)
{
@@ -138,6 +145,8 @@ amrr_node_is_11n(struct ieee80211_node *ni)
return (0);
if (ni->ni_chan == IEEE80211_CHAN_ANYC)
return (0);
+ if (IEEE80211_IS_CHAN_HT(ni->ni_chan) && ni->ni_htrates.rs_nrates == 0)
+ return (0);
return (IEEE80211_IS_CHAN_HT(ni->ni_chan));
}
@@ -190,13 +199,13 @@ amrr_node_init(struct ieee80211_node *ni)
amn->amn_rix--) {
/* legacy - anything < 36mbit, stop searching */
/* 11n - stop at MCS4 / MCS12 / MCS28 */
- if (amrr_node_is_11n(ni) &&
- (rs->rs_rates[amn->amn_rix] & 0x7) < 4)
- break;
- else if ((rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL) <= 72)
+ if (amrr_node_is_11n(ni)) {
+ if ((rs->rs_rates[amn->amn_rix] & 0x7) < 4)
+ break;
+ } else if ((rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL) <= 72)
break;
- rate = rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL;
}
+ rate = rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL;
/* if the rate is an 11n rate, ensure the MCS bit is set */
if (amrr_node_is_11n(ni))
diff --git a/sys/net80211/ieee80211_dfs.c b/sys/net80211/ieee80211_dfs.c
index af50cb5..5fa9ba4 100644
--- a/sys/net80211/ieee80211_dfs.c
+++ b/sys/net80211/ieee80211_dfs.c
@@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_media.h>
+#include <net/ethernet.h>
#include <net80211/ieee80211_var.h>
diff --git a/sys/net80211/ieee80211_phy.c b/sys/net80211/ieee80211_phy.c
index 923266c..4242ac0 100644
--- a/sys/net80211/ieee80211_phy.c
+++ b/sys/net80211/ieee80211_phy.c
@@ -35,12 +35,16 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/systm.h>
+#include <sys/malloc.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_media.h>
+#include <net/ethernet.h>
+#include <net/route.h>
+
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_phy.h>
diff --git a/sys/net80211/ieee80211_radiotap.c b/sys/net80211/ieee80211_radiotap.c
index 6c73e02..5638f52 100644
--- a/sys/net80211/ieee80211_radiotap.c
+++ b/sys/net80211/ieee80211_radiotap.c
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <net/if_var.h>
#include <net/if_llc.h>
#include <net/if_media.h>
+#include <net/ethernet.h>
#include <net80211/ieee80211_var.h>
diff --git a/sys/net80211/ieee80211_ratectl.c b/sys/net80211/ieee80211_ratectl.c
index 0ad46bd3..3eff898 100644
--- a/sys/net80211/ieee80211_ratectl.c
+++ b/sys/net80211/ieee80211_ratectl.c
@@ -30,9 +30,12 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/socket.h>
+#include <sys/malloc.h>
#include <net/if.h>
#include <net/if_media.h>
+#include <net/ethernet.h>
+#include <net/route.h>
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_ratectl.h>
diff --git a/sys/net80211/ieee80211_ratectl_none.c b/sys/net80211/ieee80211_ratectl_none.c
index 0edec44..a0056f3 100644
--- a/sys/net80211/ieee80211_ratectl_none.c
+++ b/sys/net80211/ieee80211_ratectl_none.c
@@ -29,13 +29,16 @@ __FBSDID("$FreeBSD$");
#include "opt_wlan.h"
#include <sys/param.h>
+#include <sys/systm.h>
#include <sys/kernel.h>
+#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_media.h>
+#include <net/ethernet.h>
#ifdef INET
#include <netinet/in.h>
diff --git a/sys/net80211/ieee80211_regdomain.c b/sys/net80211/ieee80211_regdomain.c
index e7efb7e..ed7f422 100644
--- a/sys/net80211/ieee80211_regdomain.c
+++ b/sys/net80211/ieee80211_regdomain.c
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_media.h>
+#include <net/ethernet.h>
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_regdomain.h>
diff --git a/sys/net80211/ieee80211_rssadapt.c b/sys/net80211/ieee80211_rssadapt.c
index aaf4057..f230f60 100644
--- a/sys/net80211/ieee80211_rssadapt.c
+++ b/sys/net80211/ieee80211_rssadapt.c
@@ -33,13 +33,17 @@
#include "opt_wlan.h"
#include <sys/param.h>
+#include <sys/systm.h>
#include <sys/kernel.h>
+#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
+#include <net/if_var.h>
#include <net/if_media.h>
+#include <net/ethernet.h>
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_rssadapt.h>
diff --git a/sys/net80211/ieee80211_scan_sta.c b/sys/net80211/ieee80211_scan_sta.c
index 75abb2b..6da06fd 100644
--- a/sys/net80211/ieee80211_scan_sta.c
+++ b/sys/net80211/ieee80211_scan_sta.c
@@ -733,7 +733,7 @@ sta_cancel(struct ieee80211_scan_state *ss, struct ieee80211vap *vap)
return 0;
}
-/* unalligned little endian access */
+/* unaligned little endian access */
#define LE_READ_2(p) \
((uint16_t) \
((((const uint8_t *)(p))[0] ) | \
diff --git a/sys/net80211/ieee80211_superg.c b/sys/net80211/ieee80211_superg.c
index 21f3b99..94af70d 100644
--- a/sys/net80211/ieee80211_superg.c
+++ b/sys/net80211/ieee80211_superg.c
@@ -38,11 +38,12 @@ __FBSDID("$FreeBSD$");
#include <sys/socket.h>
-#include <net/bpf.h>
-#include <net/ethernet.h>
#include <net/if.h>
+#include <net/if_var.h>
#include <net/if_llc.h>
#include <net/if_media.h>
+#include <net/bpf.h>
+#include <net/ethernet.h>
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_input.h>
[-- Attachment #3 --]
7zXZ ִF ! t/"] 2I }P
OG?)d_H0p;Bg Z,z3 q8Nm&#vqAȨV^<S6xs,n@%}JeC&*40{(j-hY%BB1-2ݵ_͊QDXcΫ34=pP';I~Q72zݞ71WN>>;o5fboyMXIrr-u wQ
xĬsV灄2-!Dd5jeuF= WE\fO z|UŗC|Og5'7
1VxiᅇaM{)V~k0!(ր^fwyGdV$k)e^$ 5|LhQ18#=yֈ}-ճ. GB^KgF7fqwzVw Jls~P+j<W`n#}hgJv4 bPI[ps!l
oDPwm?֥L.JC͏ɢ1%iD}fvEAO¬l6ɓZS W]-Whp=
\߆ eˉcYR'ɡo``g9; yl o+m#@@Fbъ?`mmx".[-hg [ȍ'q"*""Kp F9QPܝdSTPgNhفᯩ 䓣MHFl3zC]gyBxp}6m2(
<K4LjA0& z%$I}5mԴ( d'?celm+mO{bK߸%ij&uxqD3''bʹw-[x7[-LBgPCzhu4 #ؼ~SGV 6,d\~r(Klj .,>:rI{3DE>wd ~{zV_IJyۏϩ؞s>1K-9~'LYRUWQK 駼VM$B'b.@휴K1){,b۬t%
<O;䕟OG{:@}mxn(/W#C 4?PB$*6P.Erw7+tU6 >3 +9:+.WC?^+87
Vvx#?_.=L1H3 h3DYѲ>fqSpw'Ԅ~Vy:>$2cw> L0ȦVˉ(pf$fA}*u^lyd`GƜ">Lm<_Ƒm*ml-A9L[ڎhސ]ә[ȮEh(!"Uj(7H"+,hV]A])@b۬ĥk8go5M6-$K?H=R} $k 2Pbv㶹wpR'f%<ʘ
b(WY-4ĕ5Lˣ-Ƽ&*ch5zIːu0GR48"rwm;YbT(n"Z*PŃk2btQ&Մd8( &C'cZMIh|Oe_>YPaj1q=`a7Am('>