mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
wl1271: Add TSF handling
Add functionality to pass the current TSF (mac time) to the mac80211. This is needed for ad-hoc merging. Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com> Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com> Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
ab2807efcf
commit
bbbb538e33
@ -1266,3 +1266,29 @@ out:
|
|||||||
kfree(acx);
|
kfree(acx);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime)
|
||||||
|
{
|
||||||
|
struct wl1271_acx_fw_tsf_information *tsf_info;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
tsf_info = kzalloc(sizeof(*tsf_info), GFP_KERNEL);
|
||||||
|
if (!tsf_info) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = wl1271_cmd_interrogate(wl, ACX_TSF_INFO,
|
||||||
|
tsf_info, sizeof(*tsf_info));
|
||||||
|
if (ret < 0) {
|
||||||
|
wl1271_warning("acx tsf info interrogate failed");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
*mactime = le32_to_cpu(tsf_info->current_tsf_low) |
|
||||||
|
((u64) le32_to_cpu(tsf_info->current_tsf_high) << 32);
|
||||||
|
|
||||||
|
out:
|
||||||
|
kfree(tsf_info);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@ -993,6 +993,17 @@ struct wl1271_acx_rssi_snr_avg_weights {
|
|||||||
u8 snr_data;
|
u8 snr_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct wl1271_acx_fw_tsf_information {
|
||||||
|
struct acx_header header;
|
||||||
|
|
||||||
|
__le32 current_tsf_high;
|
||||||
|
__le32 current_tsf_low;
|
||||||
|
__le32 last_bttt_high;
|
||||||
|
__le32 last_tbtt_low;
|
||||||
|
u8 last_dtim_count;
|
||||||
|
u8 padding[3];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
ACX_WAKE_UP_CONDITIONS = 0x0002,
|
ACX_WAKE_UP_CONDITIONS = 0x0002,
|
||||||
ACX_MEM_CFG = 0x0003,
|
ACX_MEM_CFG = 0x0003,
|
||||||
@ -1114,5 +1125,6 @@ int wl1271_acx_keep_alive_config(struct wl1271 *wl, u8 index, u8 tpl_valid);
|
|||||||
int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable,
|
int wl1271_acx_rssi_snr_trigger(struct wl1271 *wl, bool enable,
|
||||||
s16 thold, u8 hyst);
|
s16 thold, u8 hyst);
|
||||||
int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl);
|
int wl1271_acx_rssi_snr_avg_weights(struct wl1271 *wl);
|
||||||
|
int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime);
|
||||||
|
|
||||||
#endif /* __WL1271_ACX_H__ */
|
#endif /* __WL1271_ACX_H__ */
|
||||||
|
@ -1966,6 +1966,32 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct wl1271 *wl = hw->priv;
|
||||||
|
u64 mactime = ULLONG_MAX;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
|
||||||
|
|
||||||
|
mutex_lock(&wl->mutex);
|
||||||
|
|
||||||
|
ret = wl1271_ps_elp_wakeup(wl, false);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
ret = wl1271_acx_tsf_info(wl, &mactime);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out_sleep;
|
||||||
|
|
||||||
|
out_sleep:
|
||||||
|
wl1271_ps_elp_sleep(wl);
|
||||||
|
|
||||||
|
out:
|
||||||
|
mutex_unlock(&wl->mutex);
|
||||||
|
return mactime;
|
||||||
|
}
|
||||||
|
|
||||||
/* can't be const, mac80211 writes to this */
|
/* can't be const, mac80211 writes to this */
|
||||||
static struct ieee80211_rate wl1271_rates[] = {
|
static struct ieee80211_rate wl1271_rates[] = {
|
||||||
@ -2195,6 +2221,7 @@ static const struct ieee80211_ops wl1271_ops = {
|
|||||||
.bss_info_changed = wl1271_op_bss_info_changed,
|
.bss_info_changed = wl1271_op_bss_info_changed,
|
||||||
.set_rts_threshold = wl1271_op_set_rts_threshold,
|
.set_rts_threshold = wl1271_op_set_rts_threshold,
|
||||||
.conf_tx = wl1271_op_conf_tx,
|
.conf_tx = wl1271_op_conf_tx,
|
||||||
|
.get_tsf = wl1271_op_get_tsf,
|
||||||
CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
|
CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -53,12 +53,6 @@ static void wl1271_rx_status(struct wl1271 *wl,
|
|||||||
status->band = wl->band;
|
status->band = wl->band;
|
||||||
status->rate_idx = wl1271_rate_to_idx(wl, desc->rate);
|
status->rate_idx = wl1271_rate_to_idx(wl, desc->rate);
|
||||||
|
|
||||||
/*
|
|
||||||
* FIXME: Add mactime handling. For IBSS (ad-hoc) we need to get the
|
|
||||||
* timestamp from the beacon (acx_tsf_info). In BSS mode (infra) we
|
|
||||||
* only need the mactime for monitor mode. For now the mactime is
|
|
||||||
* not valid, so RX_FLAG_TSFT should not be set
|
|
||||||
*/
|
|
||||||
status->signal = desc->rssi;
|
status->signal = desc->rssi;
|
||||||
|
|
||||||
status->freq = ieee80211_channel_to_frequency(desc->channel);
|
status->freq = ieee80211_channel_to_frequency(desc->channel);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user