]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 3 Jun 2014 00:29:44 +0000 (17:29 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 3 Jun 2014 00:29:44 +0000 (17:29 -0700)
added patches:
cfg80211-add-cfg80211_sched_scan_stopped_rtnl.patch
cfg80211-fix-few-minor-issues-in-reg_process_hint.patch
cfg80211-free-sme-on-connection-failures.patch
gpu-host1x-handle-the-correct-of-syncpt-regs.patch
ipmi-fix-a-race-restarting-the-timer.patch
ipmi-reset-the-kcs-timeout-when-starting-error-recovery.patch
mac80211-fix-nested-rtnl-locking-on-ieee80211_reconfig.patch
mac80211-fix-on-channel-remain-on-channel.patch
mac80211-fix-suspend-vs.-association-race.patch
timer-prevent-overflow-in-apply_slack.patch

queue-3.14/cfg80211-add-cfg80211_sched_scan_stopped_rtnl.patch [new file with mode: 0644]
queue-3.14/cfg80211-fix-few-minor-issues-in-reg_process_hint.patch [new file with mode: 0644]
queue-3.14/cfg80211-free-sme-on-connection-failures.patch [new file with mode: 0644]
queue-3.14/gpu-host1x-handle-the-correct-of-syncpt-regs.patch [new file with mode: 0644]
queue-3.14/ipmi-fix-a-race-restarting-the-timer.patch [new file with mode: 0644]
queue-3.14/ipmi-reset-the-kcs-timeout-when-starting-error-recovery.patch [new file with mode: 0644]
queue-3.14/mac80211-fix-nested-rtnl-locking-on-ieee80211_reconfig.patch [new file with mode: 0644]
queue-3.14/mac80211-fix-on-channel-remain-on-channel.patch [new file with mode: 0644]
queue-3.14/mac80211-fix-suspend-vs.-association-race.patch [new file with mode: 0644]
queue-3.14/series
queue-3.14/timer-prevent-overflow-in-apply_slack.patch [new file with mode: 0644]

diff --git a/queue-3.14/cfg80211-add-cfg80211_sched_scan_stopped_rtnl.patch b/queue-3.14/cfg80211-add-cfg80211_sched_scan_stopped_rtnl.patch
new file mode 100644 (file)
index 0000000..344561b
--- /dev/null
@@ -0,0 +1,71 @@
+From 792e6aa7a15ea0fb16f8687e93caede1ea9118c7 Mon Sep 17 00:00:00 2001
+From: Eliad Peller <eliad@wizery.com>
+Date: Wed, 30 Apr 2014 16:14:23 +0300
+Subject: cfg80211: add cfg80211_sched_scan_stopped_rtnl
+
+From: Eliad Peller <eliad@wizery.com>
+
+commit 792e6aa7a15ea0fb16f8687e93caede1ea9118c7 upstream.
+
+Add locked-version for cfg80211_sched_scan_stopped.
+This is used for some users that might want to
+call it when rtnl is already locked.
+
+Fixes: d43c6b6 ("mac80211: reschedule sched scan after HW restart")
+Signed-off-by: Eliad Peller <eliadx.peller@intel.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ include/net/cfg80211.h |   12 ++++++++++++
+ net/wireless/scan.c    |   12 ++++++++++--
+ 2 files changed, 22 insertions(+), 2 deletions(-)
+
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -3637,6 +3637,18 @@ void cfg80211_sched_scan_results(struct
+ void cfg80211_sched_scan_stopped(struct wiphy *wiphy);
+ /**
++ * cfg80211_sched_scan_stopped_rtnl - notify that the scheduled scan has stopped
++ *
++ * @wiphy: the wiphy on which the scheduled scan stopped
++ *
++ * The driver can call this function to inform cfg80211 that the
++ * scheduled scan had to be stopped, for whatever reason.  The driver
++ * is then called back via the sched_scan_stop operation when done.
++ * This function should be called with rtnl locked.
++ */
++void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy);
++
++/**
+  * cfg80211_inform_bss_width_frame - inform cfg80211 of a received BSS frame
+  *
+  * @wiphy: the wiphy reporting the BSS
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -284,14 +284,22 @@ void cfg80211_sched_scan_results(struct
+ }
+ EXPORT_SYMBOL(cfg80211_sched_scan_results);
+-void cfg80211_sched_scan_stopped(struct wiphy *wiphy)
++void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy)
+ {
+       struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
++      ASSERT_RTNL();
++
+       trace_cfg80211_sched_scan_stopped(wiphy);
+-      rtnl_lock();
+       __cfg80211_stop_sched_scan(rdev, true);
++}
++EXPORT_SYMBOL(cfg80211_sched_scan_stopped_rtnl);
++
++void cfg80211_sched_scan_stopped(struct wiphy *wiphy)
++{
++      rtnl_lock();
++      cfg80211_sched_scan_stopped_rtnl(wiphy);
+       rtnl_unlock();
+ }
+ EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
diff --git a/queue-3.14/cfg80211-fix-few-minor-issues-in-reg_process_hint.patch b/queue-3.14/cfg80211-fix-few-minor-issues-in-reg_process_hint.patch
new file mode 100644 (file)
index 0000000..d795faf
--- /dev/null
@@ -0,0 +1,77 @@
+From 772f0389338cfcf96da1c178046dc7e1649ab554 Mon Sep 17 00:00:00 2001
+From: Ilan Peer <ilan.peer@intel.com>
+Date: Tue, 14 Jan 2014 15:17:23 +0200
+Subject: cfg80211: fix few minor issues in reg_process_hint()
+
+From: Ilan Peer <ilan.peer@intel.com>
+
+commit 772f0389338cfcf96da1c178046dc7e1649ab554 upstream.
+
+Fix the following issues in reg_process_hint():
+
+1. Add verification that wiphy is valid before processing
+   NL80211_REGDOMAIN_SET_BY_COUNTRY_IE.
+2. Free the request in case of invalid initiator.
+3. Remove WARN_ON check on reg_request->alpha2 as it is not a
+   pointer.
+
+Signed-off-by: Ilan Peer <ilan.peer@intel.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/wireless/reg.c |   19 ++++++++++---------
+ 1 file changed, 10 insertions(+), 9 deletions(-)
+
+--- a/net/wireless/reg.c
++++ b/net/wireless/reg.c
+@@ -1683,17 +1683,9 @@ static void reg_process_hint(struct regu
+       struct wiphy *wiphy = NULL;
+       enum reg_request_treatment treatment;
+-      if (WARN_ON(!reg_request->alpha2))
+-              return;
+-
+       if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
+               wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);
+-      if (reg_request->initiator == NL80211_REGDOM_SET_BY_DRIVER && !wiphy) {
+-              kfree(reg_request);
+-              return;
+-      }
+-
+       switch (reg_request->initiator) {
+       case NL80211_REGDOM_SET_BY_CORE:
+               reg_process_hint_core(reg_request);
+@@ -1706,20 +1698,29 @@ static void reg_process_hint(struct regu
+               schedule_delayed_work(&reg_timeout, msecs_to_jiffies(3142));
+               return;
+       case NL80211_REGDOM_SET_BY_DRIVER:
++              if (!wiphy)
++                      goto out_free;
+               treatment = reg_process_hint_driver(wiphy, reg_request);
+               break;
+       case NL80211_REGDOM_SET_BY_COUNTRY_IE:
++              if (!wiphy)
++                      goto out_free;
+               treatment = reg_process_hint_country_ie(wiphy, reg_request);
+               break;
+       default:
+               WARN(1, "invalid initiator %d\n", reg_request->initiator);
+-              return;
++              goto out_free;
+       }
+       /* This is required so that the orig_* parameters are saved */
+       if (treatment == REG_REQ_ALREADY_SET && wiphy &&
+           wiphy->regulatory_flags & REGULATORY_STRICT_REG)
+               wiphy_update_regulatory(wiphy, reg_request->initiator);
++
++      return;
++
++out_free:
++      kfree(reg_request);
+ }
+ /*
diff --git a/queue-3.14/cfg80211-free-sme-on-connection-failures.patch b/queue-3.14/cfg80211-free-sme-on-connection-failures.patch
new file mode 100644 (file)
index 0000000..9ebeb04
--- /dev/null
@@ -0,0 +1,50 @@
+From c1fbb258846dfc425507a093922d2d001e54c3ea Mon Sep 17 00:00:00 2001
+From: Eliad Peller <eliad@wizery.com>
+Date: Wed, 30 Apr 2014 15:58:13 +0300
+Subject: cfg80211: free sme on connection failures
+
+From: Eliad Peller <eliad@wizery.com>
+
+commit c1fbb258846dfc425507a093922d2d001e54c3ea upstream.
+
+cfg80211 is notified about connection failures by
+__cfg80211_connect_result() call. However, this
+function currently does not free cfg80211 sme.
+
+This results in hanging connection attempts in some cases
+
+e.g. when mac80211 authentication attempt is denied,
+we have this function call:
+ieee80211_rx_mgmt_auth() -> cfg80211_rx_mlme_mgmt() ->
+cfg80211_process_auth() -> cfg80211_sme_rx_auth() ->
+__cfg80211_connect_result()
+
+but cfg80211_sme_free() is never get called.
+
+Fixes: ceca7b712 ("cfg80211: separate internal SME implementation")
+Signed-off-by: Eliad Peller <eliadx.peller@intel.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/wireless/sme.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/wireless/sme.c
++++ b/net/wireless/sme.c
+@@ -235,7 +235,6 @@ void cfg80211_conn_work(struct work_stru
+                                       NULL, 0, NULL, 0,
+                                       WLAN_STATUS_UNSPECIFIED_FAILURE,
+                                       false, NULL);
+-                      cfg80211_sme_free(wdev);
+               }
+               wdev_unlock(wdev);
+       }
+@@ -649,6 +648,7 @@ void __cfg80211_connect_result(struct ne
+                       cfg80211_unhold_bss(bss_from_pub(bss));
+                       cfg80211_put_bss(wdev->wiphy, bss);
+               }
++              cfg80211_sme_free(wdev);
+               return;
+       }
diff --git a/queue-3.14/gpu-host1x-handle-the-correct-of-syncpt-regs.patch b/queue-3.14/gpu-host1x-handle-the-correct-of-syncpt-regs.patch
new file mode 100644 (file)
index 0000000..1a1ac5b
--- /dev/null
@@ -0,0 +1,51 @@
+From 22bbd5d949dc7fdd72a4e78e767fa09d8e54b446 Mon Sep 17 00:00:00 2001
+From: Stephen Warren <swarren@nvidia.com>
+Date: Fri, 4 Apr 2014 16:31:05 -0600
+Subject: gpu: host1x: handle the correct # of syncpt regs
+
+From: Stephen Warren <swarren@nvidia.com>
+
+commit 22bbd5d949dc7fdd72a4e78e767fa09d8e54b446 upstream.
+
+BIT_WORD() truncates rather than rounds, so the loops in
+syncpt_thresh_isr() and _host1x_intr_disable_all_syncpt_intrs() use <=
+rather than < in an attempt to process the correct number of registers
+when rounding of the conversion of count of bits to count of words is
+necessary. However, when rounding isn't necessary because the value is
+already a multiple of the divisor (as is the case for all values of
+nb_pts the code actually sees), this causes one too many registers to
+be processed.
+
+Solve this by using and explicit DIV_ROUND_UP() call, rather than
+BIT_WORD(), and comparing with < rather than <=.
+
+Fixes: 7ede0b0bf3e2 ("gpu: host1x: Add syncpoint wait and interrupts")
+Signed-off-by: Stephen Warren <swarren@nvidia.com>
+Acked-By: Terje Bergstrom <tbergstrom@nvidia.com>
+Signed-off-by: Thierry Reding <treding@nvidia.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/gpu/host1x/hw/intr_hw.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/gpu/host1x/hw/intr_hw.c
++++ b/drivers/gpu/host1x/hw/intr_hw.c
+@@ -47,7 +47,7 @@ static irqreturn_t syncpt_thresh_isr(int
+       unsigned long reg;
+       int i, id;
+-      for (i = 0; i <= BIT_WORD(host->info->nb_pts); i++) {
++      for (i = 0; i < DIV_ROUND_UP(host->info->nb_pts, 32); i++) {
+               reg = host1x_sync_readl(host,
+                       HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(i));
+               for_each_set_bit(id, &reg, BITS_PER_LONG) {
+@@ -64,7 +64,7 @@ static void _host1x_intr_disable_all_syn
+ {
+       u32 i;
+-      for (i = 0; i <= BIT_WORD(host->info->nb_pts); ++i) {
++      for (i = 0; i < DIV_ROUND_UP(host->info->nb_pts, 32); ++i) {
+               host1x_sync_writel(host, 0xffffffffu,
+                       HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(i));
+               host1x_sync_writel(host, 0xffffffffu,
diff --git a/queue-3.14/ipmi-fix-a-race-restarting-the-timer.patch b/queue-3.14/ipmi-fix-a-race-restarting-the-timer.patch
new file mode 100644 (file)
index 0000000..24b662a
--- /dev/null
@@ -0,0 +1,138 @@
+From 48e8ac2979920ffa39117e2d725afa3a749bfe8d Mon Sep 17 00:00:00 2001
+From: Bodo Stroesser <bstroesser@ts.fujitsu.com>
+Date: Mon, 14 Apr 2014 09:46:51 -0500
+Subject: ipmi: Fix a race restarting the timer
+
+From: Bodo Stroesser <bstroesser@ts.fujitsu.com>
+
+commit 48e8ac2979920ffa39117e2d725afa3a749bfe8d upstream.
+
+With recent changes it is possible for the timer handler to detect an
+idle interface and not start the timer, but the thread to start an
+operation at the same time.  The thread will not start the timer in that
+instance, resulting in the timer not running.
+
+Instead, move all timer operations under the lock and start the timer in
+the thread if it detect non-idle and the timer is not already running.
+Moving under locks allows the last timeout to be set in both the thread
+and the timer.  'Timer is not running' means that the timer is not
+pending and smi_timeout() is not running.  So we need a flag to detect
+this correctly.
+
+Also fix a few other timeout bugs: setting the last timeout when the
+interrupt has to be disabled and the timer started, and setting the last
+timeout in check_start_timer_thread possibly racing with the timer
+
+Signed-off-by: Corey Minyard <cminyard@mvista.com>
+Signed-off-by: Bodo Stroesser <bstroesser@ts.fujitsu.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/char/ipmi/ipmi_si_intf.c |   46 +++++++++++++++++++++++----------------
+ 1 file changed, 28 insertions(+), 18 deletions(-)
+
+--- a/drivers/char/ipmi/ipmi_si_intf.c
++++ b/drivers/char/ipmi/ipmi_si_intf.c
+@@ -249,6 +249,9 @@ struct smi_info {
+       /* The timer for this si. */
+       struct timer_list   si_timer;
++      /* This flag is set, if the timer is running (timer_pending() isn't enough) */
++      bool                timer_running;
++
+       /* The time (in jiffies) the last timeout occurred at. */
+       unsigned long       last_timeout_jiffies;
+@@ -435,6 +438,13 @@ static void start_clear_flags(struct smi
+       smi_info->si_state = SI_CLEARING_FLAGS;
+ }
++static void smi_mod_timer(struct smi_info *smi_info, unsigned long new_val)
++{
++      smi_info->last_timeout_jiffies = jiffies;
++      mod_timer(&smi_info->si_timer, new_val);
++      smi_info->timer_running = true;
++}
++
+ /*
+  * When we have a situtaion where we run out of memory and cannot
+  * allocate messages, we just leave them in the BMC and run the system
+@@ -447,8 +457,7 @@ static inline void disable_si_irq(struct
+               start_disable_irq(smi_info);
+               smi_info->interrupt_disabled = 1;
+               if (!atomic_read(&smi_info->stop_operation))
+-                      mod_timer(&smi_info->si_timer,
+-                                jiffies + SI_TIMEOUT_JIFFIES);
++                      smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES);
+       }
+ }
+@@ -908,15 +917,7 @@ static void sender(void                *
+               list_add_tail(&msg->link, &smi_info->xmit_msgs);
+       if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) {
+-              /*
+-               * last_timeout_jiffies is updated here to avoid
+-               * smi_timeout() handler passing very large time_diff
+-               * value to smi_event_handler() that causes
+-               * the send command to abort.
+-               */
+-              smi_info->last_timeout_jiffies = jiffies;
+-
+-              mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES);
++              smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES);
+               if (smi_info->thread)
+                       wake_up_process(smi_info->thread);
+@@ -1005,6 +1006,17 @@ static int ipmi_thread(void *data)
+               spin_lock_irqsave(&(smi_info->si_lock), flags);
+               smi_result = smi_event_handler(smi_info, 0);
++
++              /*
++               * If the driver is doing something, there is a possible
++               * race with the timer.  If the timer handler see idle,
++               * and the thread here sees something else, the timer
++               * handler won't restart the timer even though it is
++               * required.  So start it here if necessary.
++               */
++              if (smi_result != SI_SM_IDLE && !smi_info->timer_running)
++                      smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES);
++
+               spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+               busy_wait = ipmi_thread_busy_wait(smi_result, smi_info,
+                                                 &busy_until);
+@@ -1074,10 +1086,6 @@ static void smi_timeout(unsigned long da
+                    * SI_USEC_PER_JIFFY);
+       smi_result = smi_event_handler(smi_info, time_diff);
+-      spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+-
+-      smi_info->last_timeout_jiffies = jiffies_now;
+-
+       if ((smi_info->irq) && (!smi_info->interrupt_disabled)) {
+               /* Running with interrupts, only do long timeouts. */
+               timeout = jiffies + SI_TIMEOUT_JIFFIES;
+@@ -1099,7 +1107,10 @@ static void smi_timeout(unsigned long da
+  do_mod_timer:
+       if (smi_result != SI_SM_IDLE)
+-              mod_timer(&(smi_info->si_timer), timeout);
++              smi_mod_timer(smi_info, timeout);
++      else
++              smi_info->timer_running = false;
++      spin_unlock_irqrestore(&(smi_info->si_lock), flags);
+ }
+ static irqreturn_t si_irq_handler(int irq, void *data)
+@@ -1147,8 +1158,7 @@ static int smi_start_processing(void
+       /* Set up the timer that drives the interface. */
+       setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi);
+-      new_smi->last_timeout_jiffies = jiffies;
+-      mod_timer(&new_smi->si_timer, jiffies + SI_TIMEOUT_JIFFIES);
++      smi_mod_timer(new_smi, jiffies + SI_TIMEOUT_JIFFIES);
+       /*
+        * Check if the user forcefully enabled the daemon.
diff --git a/queue-3.14/ipmi-reset-the-kcs-timeout-when-starting-error-recovery.patch b/queue-3.14/ipmi-reset-the-kcs-timeout-when-starting-error-recovery.patch
new file mode 100644 (file)
index 0000000..85429b8
--- /dev/null
@@ -0,0 +1,35 @@
+From eb6d78ec213e6938559b801421d64714dafcf4b2 Mon Sep 17 00:00:00 2001
+From: Corey Minyard <cminyard@mvista.com>
+Date: Mon, 14 Apr 2014 09:46:52 -0500
+Subject: ipmi: Reset the KCS timeout when starting error recovery
+
+From: Corey Minyard <cminyard@mvista.com>
+
+commit eb6d78ec213e6938559b801421d64714dafcf4b2 upstream.
+
+The OBF timer in KCS was not reset in one situation when error recovery
+was started, resulting in an immediate timeout.
+
+Reported-by: Bodo Stroesser <bstroesser@ts.fujitsu.com>
+Signed-off-by: Corey Minyard <cminyard@mvista.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/char/ipmi/ipmi_kcs_sm.c |    5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/char/ipmi/ipmi_kcs_sm.c
++++ b/drivers/char/ipmi/ipmi_kcs_sm.c
+@@ -251,8 +251,9 @@ static inline int check_obf(struct si_sm
+       if (!GET_STATUS_OBF(status)) {
+               kcs->obf_timeout -= time;
+               if (kcs->obf_timeout < 0) {
+-                  start_error_recovery(kcs, "OBF not ready in time");
+-                  return 1;
++                      kcs->obf_timeout = OBF_RETRY_TIMEOUT;
++                      start_error_recovery(kcs, "OBF not ready in time");
++                      return 1;
+               }
+               return 0;
+       }
diff --git a/queue-3.14/mac80211-fix-nested-rtnl-locking-on-ieee80211_reconfig.patch b/queue-3.14/mac80211-fix-nested-rtnl-locking-on-ieee80211_reconfig.patch
new file mode 100644 (file)
index 0000000..bb69d9a
--- /dev/null
@@ -0,0 +1,34 @@
+From e669ba2d06c6195662601956454ac959892f0762 Mon Sep 17 00:00:00 2001
+From: Eliad Peller <eliad@wizery.com>
+Date: Wed, 30 Apr 2014 16:14:24 +0300
+Subject: mac80211: fix nested rtnl locking on ieee80211_reconfig
+
+From: Eliad Peller <eliad@wizery.com>
+
+commit e669ba2d06c6195662601956454ac959892f0762 upstream.
+
+ieee80211_reconfig already holds rtnl, so calling
+cfg80211_sched_scan_stopped results in deadlock.
+
+Use the rtnl-version of this function instead.
+
+Fixes: d43c6b6 ("mac80211: reschedule sched scan after HW restart")
+Signed-off-by: Eliad Peller <eliadx.peller@intel.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/mac80211/util.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/mac80211/util.c
++++ b/net/mac80211/util.c
+@@ -1754,7 +1754,7 @@ int ieee80211_reconfig(struct ieee80211_
+       mutex_unlock(&local->mtx);
+       if (sched_scan_stopped)
+-              cfg80211_sched_scan_stopped(local->hw.wiphy);
++              cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy);
+       /*
+        * If this is for hw restart things are still running.
diff --git a/queue-3.14/mac80211-fix-on-channel-remain-on-channel.patch b/queue-3.14/mac80211-fix-on-channel-remain-on-channel.patch
new file mode 100644 (file)
index 0000000..f5bf768
--- /dev/null
@@ -0,0 +1,100 @@
+From b4b177a5556a686909e643f1e9b6434c10de079f Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Wed, 14 May 2014 15:34:41 +0200
+Subject: mac80211: fix on-channel remain-on-channel
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit b4b177a5556a686909e643f1e9b6434c10de079f upstream.
+
+Jouni reported that if a remain-on-channel was active on the
+same channel as the current operating channel, then the ROC
+would start, but any frames transmitted using mgmt-tx on the
+same channel would get delayed until after the ROC.
+
+The reason for this is that the ROC starts, but doesn't have
+any handling for "remain on the same channel", so it stops
+the interface queues. The later mgmt-tx then puts the frame
+on the interface queues (since it's on the current operating
+channel) and thus they get delayed until after the ROC.
+
+To fix this, add some logic to handle remaining on the same
+channel specially and not stop the queues etc. in this case.
+This not only fixes the bug but also improves behaviour in
+this case as data frames etc. can continue to flow.
+
+Reported-by: Jouni Malinen <j@w1.fi>
+Tested-by: Jouni Malinen <j@w1.fi>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/mac80211/ieee80211_i.h |    1 +
+ net/mac80211/offchannel.c  |   27 ++++++++++++++++++++-------
+ 2 files changed, 21 insertions(+), 7 deletions(-)
+
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -317,6 +317,7 @@ struct ieee80211_roc_work {
+       bool started, abort, hw_begun, notified;
+       bool to_be_freed;
++      bool on_channel;
+       unsigned long hw_start_time;
+--- a/net/mac80211/offchannel.c
++++ b/net/mac80211/offchannel.c
+@@ -333,7 +333,7 @@ void ieee80211_sw_roc_work(struct work_s
+               container_of(work, struct ieee80211_roc_work, work.work);
+       struct ieee80211_sub_if_data *sdata = roc->sdata;
+       struct ieee80211_local *local = sdata->local;
+-      bool started;
++      bool started, on_channel;
+       mutex_lock(&local->mtx);
+@@ -354,14 +354,26 @@ void ieee80211_sw_roc_work(struct work_s
+       if (!roc->started) {
+               struct ieee80211_roc_work *dep;
+-              /* start this ROC */
+-              ieee80211_offchannel_stop_vifs(local);
++              WARN_ON(local->use_chanctx);
++
++              /* If actually operating on the desired channel (with at least
++               * 20 MHz channel width) don't stop all the operations but still
++               * treat it as though the ROC operation started properly, so
++               * other ROC operations won't interfere with this one.
++               */
++              roc->on_channel = roc->chan == local->_oper_chandef.chan &&
++                                local->_oper_chandef.width != NL80211_CHAN_WIDTH_5 &&
++                                local->_oper_chandef.width != NL80211_CHAN_WIDTH_10;
+-              /* switch channel etc */
++              /* start this ROC */
+               ieee80211_recalc_idle(local);
+-              local->tmp_channel = roc->chan;
+-              ieee80211_hw_config(local, 0);
++              if (!roc->on_channel) {
++                      ieee80211_offchannel_stop_vifs(local);
++
++                      local->tmp_channel = roc->chan;
++                      ieee80211_hw_config(local, 0);
++              }
+               /* tell userspace or send frame */
+               ieee80211_handle_roc_started(roc);
+@@ -380,9 +392,10 @@ void ieee80211_sw_roc_work(struct work_s
+  finish:
+               list_del(&roc->list);
+               started = roc->started;
++              on_channel = roc->on_channel;
+               ieee80211_roc_notify_destroy(roc, !roc->abort);
+-              if (started) {
++              if (started && !on_channel) {
+                       ieee80211_flush_queues(local, NULL);
+                       local->tmp_channel = NULL;
diff --git a/queue-3.14/mac80211-fix-suspend-vs.-association-race.patch b/queue-3.14/mac80211-fix-suspend-vs.-association-race.patch
new file mode 100644 (file)
index 0000000..ea3fcee
--- /dev/null
@@ -0,0 +1,63 @@
+From c52666aef9f2dff39276eb53f15d99e2e229870f Mon Sep 17 00:00:00 2001
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Date: Tue, 13 May 2014 12:54:09 +0300
+Subject: mac80211: fix suspend vs. association race
+
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+
+commit c52666aef9f2dff39276eb53f15d99e2e229870f upstream.
+
+If the association is in progress while we suspend, the
+stack will be in a messed up state. Clean it before we
+suspend.
+
+This patch completes Johannes's patch:
+
+1a1cb744de160ee70086a77afff605bbc275d291
+Author: Johannes Berg <johannes.berg@intel.com>
+
+    mac80211: fix suspend vs. authentication race
+
+Fixes: 12e7f517029d ("mac80211: cleanup generic suspend/resume procedures")
+Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/mac80211/mlme.c |   20 +++++++++++++-------
+ 1 file changed, 13 insertions(+), 7 deletions(-)
+
+--- a/net/mac80211/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -3511,18 +3511,24 @@ void ieee80211_mgd_quiesce(struct ieee80
+       sdata_lock(sdata);
+-      if (ifmgd->auth_data) {
++      if (ifmgd->auth_data || ifmgd->assoc_data) {
++              const u8 *bssid = ifmgd->auth_data ?
++                              ifmgd->auth_data->bss->bssid :
++                              ifmgd->assoc_data->bss->bssid;
++
+               /*
+-               * If we are trying to authenticate while suspending, cfg80211
+-               * won't know and won't actually abort those attempts, thus we
+-               * need to do that ourselves.
++               * If we are trying to authenticate / associate while suspending,
++               * cfg80211 won't know and won't actually abort those attempts,
++               * thus we need to do that ourselves.
+                */
+-              ieee80211_send_deauth_disassoc(sdata,
+-                                             ifmgd->auth_data->bss->bssid,
++              ieee80211_send_deauth_disassoc(sdata, bssid,
+                                              IEEE80211_STYPE_DEAUTH,
+                                              WLAN_REASON_DEAUTH_LEAVING,
+                                              false, frame_buf);
+-              ieee80211_destroy_auth_data(sdata, false);
++              if (ifmgd->assoc_data)
++                      ieee80211_destroy_assoc_data(sdata, false);
++              if (ifmgd->auth_data)
++                      ieee80211_destroy_auth_data(sdata, false);
+               cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
+                                     IEEE80211_DEAUTH_FRAME_LEN);
+       }
index 2bb24349704335d9ff2e4af57c48d99cb3bd08b0..199bf9ba309f3dc34b7f0546ce7e9c4a376862d4 100644 (file)
@@ -24,3 +24,13 @@ iwlwifi-mvm-avoid-searching-unnecessary-columns.patch
 iwlwifi-mvm-rs-fix-and-cleanup-rs_get_rate_action.patch
 iwlwifi-mvm-rs-reinit-rs-if-no-tx-for-a-long-time.patch
 iwlwifi-7000-bump-api-to-9.patch
+gpu-host1x-handle-the-correct-of-syncpt-regs.patch
+timer-prevent-overflow-in-apply_slack.patch
+ipmi-fix-a-race-restarting-the-timer.patch
+ipmi-reset-the-kcs-timeout-when-starting-error-recovery.patch
+cfg80211-fix-few-minor-issues-in-reg_process_hint.patch
+cfg80211-free-sme-on-connection-failures.patch
+cfg80211-add-cfg80211_sched_scan_stopped_rtnl.patch
+mac80211-fix-nested-rtnl-locking-on-ieee80211_reconfig.patch
+mac80211-fix-suspend-vs.-association-race.patch
+mac80211-fix-on-channel-remain-on-channel.patch
diff --git a/queue-3.14/timer-prevent-overflow-in-apply_slack.patch b/queue-3.14/timer-prevent-overflow-in-apply_slack.patch
new file mode 100644 (file)
index 0000000..046ded6
--- /dev/null
@@ -0,0 +1,45 @@
+From 98a01e779f3c66b0b11cd7e64d531c0e41c95762 Mon Sep 17 00:00:00 2001
+From: Jiri Bohac <jbohac@suse.cz>
+Date: Fri, 18 Apr 2014 17:23:11 +0200
+Subject: timer: Prevent overflow in apply_slack
+
+From: Jiri Bohac <jbohac@suse.cz>
+
+commit 98a01e779f3c66b0b11cd7e64d531c0e41c95762 upstream.
+
+On architectures with sizeof(int) < sizeof (long), the
+computation of mask inside apply_slack() can be undefined if the
+computed bit is > 32.
+
+E.g. with: expires = 0xffffe6f5 and slack = 25, we get:
+
+expires_limit = 0x20000000e
+bit = 33
+mask = (1 << 33) - 1  /* undefined */
+
+On x86, mask becomes 1 and and the slack is not applied properly.
+On s390, mask is -1, expires is set to 0 and the timer fires immediately.
+
+Use 1UL << bit to solve that issue.
+
+Suggested-by: Deborah Townsend <dstownse@us.ibm.com>
+Signed-off-by: Jiri Bohac <jbohac@suse.cz>
+Link: http://lkml.kernel.org/r/20140418152310.GA13654@midget.suse.cz
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/timer.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/kernel/timer.c
++++ b/kernel/timer.c
+@@ -822,7 +822,7 @@ unsigned long apply_slack(struct timer_l
+       bit = find_last_bit(&mask, BITS_PER_LONG);
+-      mask = (1 << bit) - 1;
++      mask = (1UL << bit) - 1;
+       expires_limit = expires_limit & ~(mask);