Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvar...
[pandora-kernel.git] / include / net / mac80211.h
index ea2c8c3..9259e97 100644 (file)
@@ -1585,6 +1585,20 @@ enum ieee80211_ampdu_mlme_action {
        IEEE80211_AMPDU_TX_OPERATIONAL,
 };
 
+/**
+ * enum ieee80211_tx_sync_type - TX sync type
+ * @IEEE80211_TX_SYNC_AUTH: sync TX for authentication
+ *     (and possibly also before direct probe)
+ * @IEEE80211_TX_SYNC_ASSOC: sync TX for association
+ * @IEEE80211_TX_SYNC_ACTION: sync TX for action frame
+ *     (not implemented yet)
+ */
+enum ieee80211_tx_sync_type {
+       IEEE80211_TX_SYNC_AUTH,
+       IEEE80211_TX_SYNC_ASSOC,
+       IEEE80211_TX_SYNC_ACTION,
+};
+
 /**
  * struct ieee80211_ops - callbacks from mac80211 to the driver
  *
@@ -1674,6 +1688,26 @@ enum ieee80211_ampdu_mlme_action {
  *     of the bss parameters has changed when a call is made. The callback
  *     can sleep.
  *
+ * @tx_sync: Called before a frame is sent to an AP/GO. In the GO case, the
+ *     driver should sync with the GO's powersaving so the device doesn't
+ *     transmit the frame while the GO is asleep. In the regular AP case
+ *     it may be used by drivers for devices implementing other restrictions
+ *     on talking to APs, e.g. due to regulatory enforcement or just HW
+ *     restrictions.
+ *     This function is called for every authentication, association and
+ *     action frame separately since applications might attempt to auth
+ *     with multiple APs before chosing one to associate to. If it returns
+ *     an error, the corresponding authentication, association or frame
+ *     transmission is aborted and reported as having failed. It is always
+ *     called after tuning to the correct channel.
+ *     The callback might be called multiple times before @finish_tx_sync
+ *     (but @finish_tx_sync will be called once for each) but in practice
+ *     this is unlikely to happen. It can also refuse in that case if the
+ *     driver cannot handle that situation.
+ *     This callback can sleep.
+ * @finish_tx_sync: Called as a counterpart to @tx_sync, unless that returned
+ *     an error. This callback can sleep.
+ *
  * @prepare_multicast: Prepare for multicast filter configuration.
  *     This callback is optional, and its return value is passed
  *     to configure_filter(). This callback must be atomic.
@@ -1901,6 +1935,14 @@ struct ieee80211_ops {
                                 struct ieee80211_vif *vif,
                                 struct ieee80211_bss_conf *info,
                                 u32 changed);
+
+       int (*tx_sync)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                      const u8 *bssid, enum ieee80211_tx_sync_type type);
+       void (*finish_tx_sync)(struct ieee80211_hw *hw,
+                              struct ieee80211_vif *vif,
+                              const u8 *bssid,
+                              enum ieee80211_tx_sync_type type);
+
        u64 (*prepare_multicast)(struct ieee80211_hw *hw,
                                 struct netdev_hw_addr_list *mc_list);
        void (*configure_filter)(struct ieee80211_hw *hw,
@@ -2612,6 +2654,20 @@ static inline void ieee80211_get_tkip_p1k(struct ieee80211_key_conf *keyconf,
        ieee80211_get_tkip_p1k_iv(keyconf, iv32, p1k);
 }
 
+/**
+ * ieee80211_get_tkip_rx_p1k - get a TKIP phase 1 key for RX
+ *
+ * This function returns the TKIP phase 1 key for the given IV32
+ * and transmitter address.
+ *
+ * @keyconf: the parameter passed with the set key
+ * @ta: TA that will be used with the key
+ * @iv32: IV32 to get the P1K for
+ * @p1k: a buffer to which the key will be written, as 5 u16 values
+ */
+void ieee80211_get_tkip_rx_p1k(struct ieee80211_key_conf *keyconf,
+                              const u8 *ta, u32 iv32, u16 *p1k);
+
 /**
  * ieee80211_get_tkip_p2k - get a TKIP phase 2 key
  *
@@ -2973,6 +3029,10 @@ void ieee80211_sta_block_awake(struct ieee80211_hw *hw,
  * needs reprogramming of the keys during suspend. Note that due
  * to locking reasons, it is also only safe to call this at few
  * spots since it must hold the RTNL and be able to sleep.
+ *
+ * The order in which the keys are iterated matches the order
+ * in which they were originally installed and handed to the
+ * set_key callback.
  */
 void ieee80211_iter_keys(struct ieee80211_hw *hw,
                         struct ieee80211_vif *vif,