[kernel/f16] Apply patch to fix iwlwifi crash (rhbz 770484)
Josh Boyer
jwboyer at fedoraproject.org
Thu Oct 18 12:36:58 UTC 2012
commit dec491e2b4d135c6aeb25535ef7afab3a285f6a9
Author: Josh Boyer <jwboyer at redhat.com>
Date: Thu Oct 18 08:26:39 2012 -0400
Apply patch to fix iwlwifi crash (rhbz 770484)
iwlwifi-fix-6000-ch-switch.patch | 94 ++++++++++++++++++++++++++++++++++++++
kernel.spec | 11 ++++-
2 files changed, 104 insertions(+), 1 deletions(-)
---
diff --git a/iwlwifi-fix-6000-ch-switch.patch b/iwlwifi-fix-6000-ch-switch.patch
new file mode 100644
index 0000000..0fbca23
--- /dev/null
+++ b/iwlwifi-fix-6000-ch-switch.patch
@@ -0,0 +1,94 @@
+commit a7d3a5d97acd4b8db17e1d5c3014357c9b2040f9
+Author: Johannes Berg <johannes.berg at intel.com>
+Date: Tue Sep 25 16:40:12 2012 +0200
+
+ iwlwifi: fix 6000 series channel switch command
+
+ The channel switch command for 6000 series devices
+ is larger than the maximum inline command size of
+ 320 bytes. The command is therefore refused with a
+ warning. Fix this by allocating the command and
+ using the NOCOPY mechanism.
+
+ Cc: stable at kernel.org
+ Signed-off-by: Johannes Berg <johannes.berg at intel.com>
+
+diff --git a/drivers/net/wireless/iwlwifi/dvm/devices.c b/drivers/net/wireless/iwlwifi/dvm/devices.c
+index 349c205..da58620 100644
+--- a/drivers/net/wireless/iwlwifi/dvm/devices.c
++++ b/drivers/net/wireless/iwlwifi/dvm/devices.c
+@@ -518,7 +518,7 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
+ * See iwlagn_mac_channel_switch.
+ */
+ struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
+- struct iwl6000_channel_switch_cmd cmd;
++ struct iwl6000_channel_switch_cmd *cmd;
+ u32 switch_time_in_usec, ucode_switch_time;
+ u16 ch;
+ u32 tsf_low;
+@@ -527,18 +527,25 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
+ struct ieee80211_vif *vif = ctx->vif;
+ struct iwl_host_cmd hcmd = {
+ .id = REPLY_CHANNEL_SWITCH,
+- .len = { sizeof(cmd), },
++ .len = { sizeof(*cmd), },
+ .flags = CMD_SYNC,
+- .data = { &cmd, },
++ .dataflags[0] = IWL_HCMD_DFL_NOCOPY,
+ };
++ int err;
+
+- cmd.band = priv->band == IEEE80211_BAND_2GHZ;
++ cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
++ if (!cmd)
++ return -ENOMEM;
++
++ hcmd.data[0] = cmd;
++
++ cmd->band = priv->band == IEEE80211_BAND_2GHZ;
+ ch = ch_switch->channel->hw_value;
+ IWL_DEBUG_11H(priv, "channel switch from %u to %u\n",
+ ctx->active.channel, ch);
+- cmd.channel = cpu_to_le16(ch);
+- cmd.rxon_flags = ctx->staging.flags;
+- cmd.rxon_filter_flags = ctx->staging.filter_flags;
++ cmd->channel = cpu_to_le16(ch);
++ cmd->rxon_flags = ctx->staging.flags;
++ cmd->rxon_filter_flags = ctx->staging.filter_flags;
+ switch_count = ch_switch->count;
+ tsf_low = ch_switch->timestamp & 0x0ffffffff;
+ /*
+@@ -554,23 +561,25 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
+ switch_count = 0;
+ }
+ if (switch_count <= 1)
+- cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time);
++ cmd->switch_time = cpu_to_le32(priv->ucode_beacon_time);
+ else {
+ switch_time_in_usec =
+ vif->bss_conf.beacon_int * switch_count * TIME_UNIT;
+ ucode_switch_time = iwl_usecs_to_beacons(priv,
+ switch_time_in_usec,
+ beacon_interval);
+- cmd.switch_time = iwl_add_beacon_time(priv,
+- priv->ucode_beacon_time,
+- ucode_switch_time,
+- beacon_interval);
++ cmd->switch_time = iwl_add_beacon_time(priv,
++ priv->ucode_beacon_time,
++ ucode_switch_time,
++ beacon_interval);
+ }
+ IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n",
+- cmd.switch_time);
+- cmd.expect_beacon = ch_switch->channel->flags & IEEE80211_CHAN_RADAR;
++ cmd->switch_time);
++ cmd->expect_beacon = ch_switch->channel->flags & IEEE80211_CHAN_RADAR;
+
+- return iwl_dvm_send_cmd(priv, &hcmd);
++ err = iwl_dvm_send_cmd(priv, &hcmd);
++ kfree(cmd);
++ return err;
+ }
+
+ struct iwl_lib_ops iwl6000_lib = {
diff --git a/kernel.spec b/kernel.spec
index 7755974..2fbb11c 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -54,7 +54,7 @@ Summary: The Linux kernel
# For non-released -rc kernels, this will be appended after the rcX and
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
#
-%global baserelease 1
+%global baserelease 2
%global fedora_build %{baserelease}
# base_sublevel is the kernel version we're starting with and patching
@@ -681,6 +681,9 @@ Patch21300: unhandled-irqs-switch-to-polling.patch
#rhbz 804957 CVE-2012-1568
Patch21306: shlib_base_randomize.patch
+#rhbz 770484
+Patch22071: iwlwifi-fix-6000-ch-switch.patch
+
# Debug patches
Patch30000: weird-root-dentry-name-debug.patch
Patch30010: debug-808990.patch
@@ -1287,6 +1290,9 @@ ApplyPatch unhandled-irqs-switch-to-polling.patch
ApplyPatch weird-root-dentry-name-debug.patch
ApplyPatch debug-808990.patch
+#rhbz 770484
+ApplyPatch iwlwifi-fix-6000-ch-switch.patch
+
# END OF PATCH APPLICATIONS
%endif
@@ -1987,6 +1993,9 @@ fi
# and build.
%changelog
+* Thu Oct 18 2012 Josh Boyer <jwboyer at redhat.com>
+- Apply patch to fix iwlwifi crash (rhbz 770484)
+
* Tue Oct 16 2012 Dave Jones <davej at redhat.com> 3.6.2-1
- Linux 3.6.2
More information about the scm-commits
mailing list