|
@@ -226,6 +226,29 @@ void wl12xx_rearm_tx_watchdog_locked(struct wl1271 *wl)
|
|
|
msecs_to_jiffies(wl->conf.tx.tx_watchdog_timeout));
|
|
|
}
|
|
|
|
|
|
+static void wlcore_rc_update_work(struct work_struct *work)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
|
|
|
+ rc_update_work);
|
|
|
+ struct wl1271 *wl = wlvif->wl;
|
|
|
+
|
|
|
+ mutex_lock(&wl->mutex);
|
|
|
+
|
|
|
+ if (unlikely(wl->state != WLCORE_STATE_ON))
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ ret = wl1271_ps_elp_wakeup(wl);
|
|
|
+ if (ret < 0)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ wlcore_hw_sta_rc_update(wl, wlvif);
|
|
|
+
|
|
|
+ wl1271_ps_elp_sleep(wl);
|
|
|
+out:
|
|
|
+ mutex_unlock(&wl->mutex);
|
|
|
+}
|
|
|
+
|
|
|
static void wl12xx_tx_watchdog_work(struct work_struct *work)
|
|
|
{
|
|
|
struct delayed_work *dwork;
|
|
@@ -2279,6 +2302,7 @@ static int wl12xx_init_vif_data(struct wl1271 *wl, struct ieee80211_vif *vif)
|
|
|
wl1271_rx_streaming_enable_work);
|
|
|
INIT_WORK(&wlvif->rx_streaming_disable_work,
|
|
|
wl1271_rx_streaming_disable_work);
|
|
|
+ INIT_WORK(&wlvif->rc_update_work, wlcore_rc_update_work);
|
|
|
INIT_DELAYED_WORK(&wlvif->channel_switch_work,
|
|
|
wlcore_channel_switch_work);
|
|
|
INIT_DELAYED_WORK(&wlvif->connection_loss_work,
|
|
@@ -2723,6 +2747,7 @@ unlock:
|
|
|
del_timer_sync(&wlvif->rx_streaming_timer);
|
|
|
cancel_work_sync(&wlvif->rx_streaming_enable_work);
|
|
|
cancel_work_sync(&wlvif->rx_streaming_disable_work);
|
|
|
+ cancel_work_sync(&wlvif->rc_update_work);
|
|
|
cancel_delayed_work_sync(&wlvif->connection_loss_work);
|
|
|
cancel_delayed_work_sync(&wlvif->channel_switch_work);
|
|
|
cancel_delayed_work_sync(&wlvif->pending_auth_complete_work);
|
|
@@ -5370,9 +5395,15 @@ static void wlcore_op_sta_rc_update(struct ieee80211_hw *hw,
|
|
|
u32 changed)
|
|
|
{
|
|
|
struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
|
|
|
- struct wl1271 *wl = hw->priv;
|
|
|
|
|
|
- wlcore_hw_sta_rc_update(wl, wlvif, sta, changed);
|
|
|
+ wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update");
|
|
|
+
|
|
|
+ if (!(changed & IEEE80211_RC_BW_CHANGED))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* this callback is atomic, so schedule a new work */
|
|
|
+ wlvif->rc_update_bw = sta->bandwidth;
|
|
|
+ ieee80211_queue_work(hw, &wlvif->rc_update_work);
|
|
|
}
|
|
|
|
|
|
static int wlcore_op_get_rssi(struct ieee80211_hw *hw,
|