mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 13:51:44 +00:00
cfda2d8e23
This patch fixes some issues with interface reconfiguration. It could for example happen that an AP interface in beacon slot 0 was removed leaving an IBSS station in one of the other slots. When this happens the driver never sends out the beacon as it only tries to send a beacon from slot 0. Appart from that the tracking of required changes to the beacon config is relatively complicated and prone to errors. The approach taken here is to solve reconfiguration issues is to reconfigure the beacons when any interface changes. This means that the complexity of deciding whether an interface change may modify the beacon configuration is gone. It also means that the beacon config will be reliably updated when an interface is removed. The issue that a single non-AP interface might not be in beacon slot 0 and wouldn't be send out is solved by moving it into the first slot. The TSF value in hardware is adjusted accordingly so that the timestamp of the beacons stay consistent. Signed-off-by: Benjamin Berg <benjamin.berg@open-mesh.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
93 lines
3.2 KiB
C
93 lines
3.2 KiB
C
/*
|
|
* Copyright (c) 2009-2011 Atheros Communications Inc.
|
|
*
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
#include <net/mac80211.h>
|
|
|
|
#include "../ath.h"
|
|
|
|
#include "hw.h"
|
|
#include "hw-ops.h"
|
|
|
|
#include "common-init.h"
|
|
#include "common-beacon.h"
|
|
#include "common-debug.h"
|
|
#include "common-spectral.h"
|
|
|
|
/* Common header for Atheros 802.11n base driver cores */
|
|
|
|
#define WME_BA_BMP_SIZE 64
|
|
#define WME_MAX_BA WME_BA_BMP_SIZE
|
|
#define ATH_TID_MAX_BUFS (2 * WME_MAX_BA)
|
|
|
|
#define ATH_RSSI_DUMMY_MARKER 127
|
|
#define ATH_RSSI_LPF_LEN 10
|
|
#define RSSI_LPF_THRESHOLD -20
|
|
#define ATH_RSSI_EP_MULTIPLIER (1<<7)
|
|
#define ATH_EP_MUL(x, mul) ((x) * (mul))
|
|
#define ATH_RSSI_IN(x) (ATH_EP_MUL((x), ATH_RSSI_EP_MULTIPLIER))
|
|
#define ATH_LPF_RSSI(x, y, len) \
|
|
((x != ATH_RSSI_DUMMY_MARKER) ? (((x) * ((len) - 1) + (y)) / (len)) : (y))
|
|
#define ATH_RSSI_LPF(x, y) do { \
|
|
if ((y) >= RSSI_LPF_THRESHOLD) \
|
|
x = ATH_LPF_RSSI((x), ATH_RSSI_IN((y)), ATH_RSSI_LPF_LEN); \
|
|
} while (0)
|
|
#define ATH_EP_RND(x, mul) \
|
|
(((x) + ((mul)/2)) / (mul))
|
|
|
|
#define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024)
|
|
|
|
struct ath_beacon_config {
|
|
struct ieee80211_vif *main_vif;
|
|
int beacon_interval;
|
|
u16 dtim_period;
|
|
u16 bmiss_timeout;
|
|
u8 dtim_count;
|
|
u8 enable_beacon;
|
|
bool ibss_creator;
|
|
u32 nexttbtt;
|
|
u32 intval;
|
|
};
|
|
|
|
bool ath9k_cmn_rx_accept(struct ath_common *common,
|
|
struct ieee80211_hdr *hdr,
|
|
struct ieee80211_rx_status *rxs,
|
|
struct ath_rx_status *rx_stats,
|
|
bool *decrypt_error,
|
|
unsigned int rxfilter);
|
|
void ath9k_cmn_rx_skb_postprocess(struct ath_common *common,
|
|
struct sk_buff *skb,
|
|
struct ath_rx_status *rx_stats,
|
|
struct ieee80211_rx_status *rxs,
|
|
bool decrypt_error);
|
|
int ath9k_cmn_process_rate(struct ath_common *common,
|
|
struct ieee80211_hw *hw,
|
|
struct ath_rx_status *rx_stats,
|
|
struct ieee80211_rx_status *rxs);
|
|
void ath9k_cmn_process_rssi(struct ath_common *common,
|
|
struct ieee80211_hw *hw,
|
|
struct ath_rx_status *rx_stats,
|
|
struct ieee80211_rx_status *rxs);
|
|
int ath9k_cmn_get_hw_crypto_keytype(struct sk_buff *skb);
|
|
struct ath9k_channel *ath9k_cmn_get_channel(struct ieee80211_hw *hw,
|
|
struct ath_hw *ah,
|
|
struct cfg80211_chan_def *chandef);
|
|
int ath9k_cmn_count_streams(unsigned int chainmask, int max);
|
|
void ath9k_cmn_btcoex_bt_stomp(struct ath_common *common,
|
|
enum ath_stomp_type stomp_type);
|
|
void ath9k_cmn_update_txpow(struct ath_hw *ah, u16 cur_txpow,
|
|
u16 new_txpow, u16 *txpower);
|
|
void ath9k_cmn_init_crypto(struct ath_hw *ah);
|