STA_NOTIFY_ADD, STA_NOTIFY_REMOVE
 };
 
+/**
+ * enum sta_notify_ps_cmd - sta power save notify command
+ *
+ * Used with the sta_notify_ps() callback in &struct ieee80211_ops to
+ * notify the driver if a station made a power state transition.
+ *
+ * @STA_NOTIFY_SLEEP: a station is now sleeping
+ * @STA_NOTIFY_AWAKE: a sleeping station woke up
+ */
+enum sta_notify_ps_cmd {
+       STA_NOTIFY_SLEEP, STA_NOTIFY_AWAKE,
+};
+
 /**
  * enum ieee80211_tkip_key_type - get tkip key
  *
  * @sta_notify: Notifies low level driver about addition or removal
  *     of associated station or AP.
  *
+ * @sta_ps_notify: Notifies low level driver about the power state transition
+ *     of a associated station. Must be atomic.
+ *
  * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max),
  *     bursting) for a hardware TX queue.
  *
        int (*set_frag_threshold)(struct ieee80211_hw *hw, u32 value);
        void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                        enum sta_notify_cmd, struct ieee80211_sta *sta);
+       void (*sta_notify_ps)(struct ieee80211_hw *hw,
+                       enum sta_notify_ps_cmd, struct ieee80211_sta *sta);
        int (*conf_tx)(struct ieee80211_hw *hw, u16 queue,
                       const struct ieee80211_tx_queue_params *params);
        int (*get_tx_stats)(struct ieee80211_hw *hw,
 
 static void ap_sta_ps_start(struct sta_info *sta)
 {
        struct ieee80211_sub_if_data *sdata = sta->sdata;
+       struct ieee80211_local *local = sdata->local;
 
        atomic_inc(&sdata->bss->num_sta_ps);
        set_and_clear_sta_flags(sta, WLAN_STA_PS, WLAN_STA_PSPOLL);
+       if (local->ops->sta_notify_ps)
+               local->ops->sta_notify_ps(local_to_hw(local), STA_NOTIFY_SLEEP,
+                                         &sta->sta);
 #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG
        printk(KERN_DEBUG "%s: STA %pM aid %d enters power save mode\n",
               sdata->dev->name, sta->sta.addr, sta->sta.aid);
        atomic_dec(&sdata->bss->num_sta_ps);
 
        clear_sta_flags(sta, WLAN_STA_PS | WLAN_STA_PSPOLL);
+       if (local->ops->sta_notify_ps)
+               local->ops->sta_notify_ps(local_to_hw(local), STA_NOTIFY_AWAKE,
+                                         &sta->sta);
 
        if (!skb_queue_empty(&sta->ps_tx_buf))
                sta_info_clear_tim_bit(sta);