]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/mac80211_hwsim.c
Merge branch 'master' into for-davem
[karo-tx-linux.git] / drivers / net / wireless / mac80211_hwsim.c
index 538783f51989e46454b590c007ccf2a657a86566..2d913644d92b5d202a065dd55f1c6dab58bcdaca 100644 (file)
@@ -637,6 +637,7 @@ static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw *hw,
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct ieee80211_rx_status rx_status;
+       struct ieee80211_rate *txrate = ieee80211_get_tx_rate(hw, info);
 
        if (data->idle) {
                wiphy_debug(hw->wiphy, "Trying to TX when idle - reject\n");
@@ -671,6 +672,7 @@ static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw *hw,
        spin_lock(&hwsim_radio_lock);
        list_for_each_entry(data2, &hwsim_radios, list) {
                struct sk_buff *nskb;
+               struct ieee80211_mgmt *mgmt;
 
                if (data == data2)
                        continue;
@@ -688,8 +690,17 @@ static bool mac80211_hwsim_tx_frame_no_nl(struct ieee80211_hw *hw,
 
                if (mac80211_hwsim_addr_match(data2, hdr->addr1))
                        ack = true;
+
+               /* set bcn timestamp relative to receiver mactime */
                rx_status.mactime =
-                       le64_to_cpu(__mac80211_hwsim_get_tsf(data2));
+                               le64_to_cpu(__mac80211_hwsim_get_tsf(data2));
+               mgmt = (struct ieee80211_mgmt *) nskb->data;
+               if (ieee80211_is_beacon(mgmt->frame_control) ||
+                   ieee80211_is_probe_resp(mgmt->frame_control))
+                       mgmt->u.beacon.timestamp = cpu_to_le64(
+                               rx_status.mactime +
+                               24 * 8 * 10 / txrate->bitrate);
+
                memcpy(IEEE80211_SKB_RXCB(nskb), &rx_status, sizeof(rx_status));
                ieee80211_rx_irqsafe(data2->hw, nskb);
        }
@@ -703,12 +714,6 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
        bool ack;
        struct ieee80211_tx_info *txi;
        u32 _pid;
-       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) skb->data;
-       struct mac80211_hwsim_data *data = hw->priv;
-
-       if (ieee80211_is_beacon(mgmt->frame_control) ||
-           ieee80211_is_probe_resp(mgmt->frame_control))
-               mgmt->u.beacon.timestamp = __mac80211_hwsim_get_tsf(data);
 
        mac80211_hwsim_monitor_rx(hw, skb);
 
@@ -805,11 +810,9 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
                                     struct ieee80211_vif *vif)
 {
        struct ieee80211_hw *hw = arg;
-       struct mac80211_hwsim_data *data = hw->priv;
        struct sk_buff *skb;
        struct ieee80211_tx_info *info;
        u32 _pid;
-       struct ieee80211_mgmt *mgmt;
 
        hwsim_check_magic(vif);
 
@@ -823,9 +826,6 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
                return;
        info = IEEE80211_SKB_CB(skb);
 
-       mgmt = (struct ieee80211_mgmt *) skb->data;
-       mgmt->u.beacon.timestamp = __mac80211_hwsim_get_tsf(data);
-
        mac80211_hwsim_monitor_rx(hw, skb);
 
        /* wmediumd mode check */
@@ -1450,7 +1450,7 @@ DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_group,
                        hwsim_fops_group_read, hwsim_fops_group_write,
                        "%llx\n");
 
-struct mac80211_hwsim_data *get_hwsim_data_ref_from_addr(
+static struct mac80211_hwsim_data *get_hwsim_data_ref_from_addr(
                             struct mac_address *addr)
 {
        struct mac80211_hwsim_data *data;
@@ -1795,9 +1795,11 @@ static int __init init_mac80211_hwsim(void)
                            IEEE80211_HW_SIGNAL_DBM |
                            IEEE80211_HW_SUPPORTS_STATIC_SMPS |
                            IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
-                           IEEE80211_HW_AMPDU_AGGREGATION;
+                           IEEE80211_HW_AMPDU_AGGREGATION |
+                           IEEE80211_HW_WANT_MONITOR_VIF;
 
-               hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
+               hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS |
+                                   WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
 
                /* ask mac80211 to reserve space for magic */
                hw->vif_data_size = sizeof(struct hwsim_vif_priv);