iwlwifi: unify iwl_setup_rxon_timing
This patch unifies setup_rxon_timing funcions of AGN and 3945. HWs differ only in supported maximal beacon interval. This is reflected in hw_paras.max_beacon_itrvl Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
4e05c2347a
commit
2c2f3b3388
|
@ -2563,6 +2563,7 @@ int iwl3945_hw_set_hw_params(struct iwl_priv *priv)
|
||||||
priv->hw_params.bcast_sta_id = IWL3945_BROADCAST_ID;
|
priv->hw_params.bcast_sta_id = IWL3945_BROADCAST_ID;
|
||||||
|
|
||||||
priv->hw_params.rx_wrt_ptr_reg = FH39_RSCSR_CHNL0_WPTR;
|
priv->hw_params.rx_wrt_ptr_reg = FH39_RSCSR_CHNL0_WPTR;
|
||||||
|
priv->hw_params.max_beacon_itrvl = IWL39_MAX_UCODE_BEACON_INTERVAL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -512,70 +512,6 @@ int iwl_hw_tx_queue_init(struct iwl_priv *priv,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
*
|
|
||||||
* Misc. internal state and helper functions
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#define MAX_UCODE_BEACON_INTERVAL 4096
|
|
||||||
|
|
||||||
static u16 iwl_adjust_beacon_interval(u16 beacon_val)
|
|
||||||
{
|
|
||||||
u16 new_val = 0;
|
|
||||||
u16 beacon_factor = 0;
|
|
||||||
|
|
||||||
beacon_factor = (beacon_val + MAX_UCODE_BEACON_INTERVAL)
|
|
||||||
/ MAX_UCODE_BEACON_INTERVAL;
|
|
||||||
new_val = beacon_val / beacon_factor;
|
|
||||||
|
|
||||||
if (!new_val)
|
|
||||||
new_val = MAX_UCODE_BEACON_INTERVAL;
|
|
||||||
|
|
||||||
return new_val;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void iwl_setup_rxon_timing(struct iwl_priv *priv)
|
|
||||||
{
|
|
||||||
u64 tsf;
|
|
||||||
s32 interval_tm, rem;
|
|
||||||
unsigned long flags;
|
|
||||||
struct ieee80211_conf *conf = NULL;
|
|
||||||
u16 beacon_int = 0;
|
|
||||||
|
|
||||||
conf = ieee80211_get_hw_conf(priv->hw);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->lock, flags);
|
|
||||||
priv->rxon_timing.timestamp = cpu_to_le64(priv->timestamp);
|
|
||||||
priv->rxon_timing.listen_interval = cpu_to_le16(conf->listen_interval);
|
|
||||||
|
|
||||||
if (priv->iw_mode == NL80211_IFTYPE_STATION) {
|
|
||||||
beacon_int = iwl_adjust_beacon_interval(priv->beacon_int);
|
|
||||||
priv->rxon_timing.atim_window = 0;
|
|
||||||
} else {
|
|
||||||
beacon_int = iwl_adjust_beacon_interval(
|
|
||||||
priv->vif->bss_conf.beacon_int);
|
|
||||||
|
|
||||||
/* TODO: we need to get atim_window from upper stack
|
|
||||||
* for now we set to 0 */
|
|
||||||
priv->rxon_timing.atim_window = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->rxon_timing.beacon_interval = cpu_to_le16(beacon_int);
|
|
||||||
|
|
||||||
tsf = priv->timestamp; /* tsf is modifed by do_div: copy it */
|
|
||||||
interval_tm = beacon_int * 1024;
|
|
||||||
rem = do_div(tsf, interval_tm);
|
|
||||||
priv->rxon_timing.beacon_init_val = cpu_to_le32(interval_tm - rem);
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&priv->lock, flags);
|
|
||||||
IWL_DEBUG_ASSOC(priv, "beacon interval %d beacon timer %d beacon tim %d\n",
|
|
||||||
le16_to_cpu(priv->rxon_timing.beacon_interval),
|
|
||||||
le32_to_cpu(priv->rxon_timing.beacon_init_val),
|
|
||||||
le16_to_cpu(priv->rxon_timing.atim_window));
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Generic RX handler implementations
|
* Generic RX handler implementations
|
||||||
|
|
|
@ -765,6 +765,8 @@ struct iwl5000_rxon_assoc_cmd {
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
#define IWL_CONN_MAX_LISTEN_INTERVAL 10
|
#define IWL_CONN_MAX_LISTEN_INTERVAL 10
|
||||||
|
#define IWL_MAX_UCODE_BEACON_INTERVAL 4 /* 4096 */
|
||||||
|
#define IWL39_MAX_UCODE_BEACON_INTERVAL 1 /* 1024 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* REPLY_RXON_TIMING = 0x14 (command, has simple generic response)
|
* REPLY_RXON_TIMING = 0x14 (command, has simple generic response)
|
||||||
|
|
|
@ -635,6 +635,63 @@ u8 iwl_is_fat_tx_allowed(struct iwl_priv *priv,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(iwl_is_fat_tx_allowed);
|
EXPORT_SYMBOL(iwl_is_fat_tx_allowed);
|
||||||
|
|
||||||
|
static u16 iwl_adjust_beacon_interval(u16 beacon_val, u16 max_beacon_val)
|
||||||
|
{
|
||||||
|
u16 new_val = 0;
|
||||||
|
u16 beacon_factor = 0;
|
||||||
|
|
||||||
|
beacon_factor = (beacon_val + max_beacon_val) / max_beacon_val;
|
||||||
|
new_val = beacon_val / beacon_factor;
|
||||||
|
|
||||||
|
if (!new_val)
|
||||||
|
new_val = max_beacon_val;
|
||||||
|
|
||||||
|
return new_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
void iwl_setup_rxon_timing(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
u64 tsf;
|
||||||
|
s32 interval_tm, rem;
|
||||||
|
unsigned long flags;
|
||||||
|
struct ieee80211_conf *conf = NULL;
|
||||||
|
u16 beacon_int;
|
||||||
|
|
||||||
|
conf = ieee80211_get_hw_conf(priv->hw);
|
||||||
|
|
||||||
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
priv->rxon_timing.timestamp = cpu_to_le64(priv->timestamp);
|
||||||
|
priv->rxon_timing.listen_interval = cpu_to_le16(conf->listen_interval);
|
||||||
|
|
||||||
|
if (priv->iw_mode == NL80211_IFTYPE_STATION) {
|
||||||
|
beacon_int = priv->beacon_int;
|
||||||
|
priv->rxon_timing.atim_window = 0;
|
||||||
|
} else {
|
||||||
|
beacon_int = priv->vif->bss_conf.beacon_int;
|
||||||
|
|
||||||
|
/* TODO: we need to get atim_window from upper stack
|
||||||
|
* for now we set to 0 */
|
||||||
|
priv->rxon_timing.atim_window = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
beacon_int = iwl_adjust_beacon_interval(beacon_int,
|
||||||
|
priv->hw_params.max_beacon_itrvl * 1024);
|
||||||
|
priv->rxon_timing.beacon_interval = cpu_to_le16(beacon_int);
|
||||||
|
|
||||||
|
tsf = priv->timestamp; /* tsf is modifed by do_div: copy it */
|
||||||
|
interval_tm = beacon_int * 1024;
|
||||||
|
rem = do_div(tsf, interval_tm);
|
||||||
|
priv->rxon_timing.beacon_init_val = cpu_to_le32(interval_tm - rem);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
IWL_DEBUG_ASSOC(priv,
|
||||||
|
"beacon interval %d beacon timer %d beacon tim %d\n",
|
||||||
|
le16_to_cpu(priv->rxon_timing.beacon_interval),
|
||||||
|
le32_to_cpu(priv->rxon_timing.beacon_init_val),
|
||||||
|
le16_to_cpu(priv->rxon_timing.atim_window));
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(iwl_setup_rxon_timing);
|
||||||
|
|
||||||
void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt)
|
void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt)
|
||||||
{
|
{
|
||||||
struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
|
struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
|
||||||
|
@ -1369,6 +1426,8 @@ int iwl_set_hw_params(struct iwl_priv *priv)
|
||||||
priv->hw_params.rx_buf_size = IWL_RX_BUF_SIZE_4K;
|
priv->hw_params.rx_buf_size = IWL_RX_BUF_SIZE_4K;
|
||||||
priv->hw_params.max_pkt_size = priv->hw_params.rx_buf_size - 256;
|
priv->hw_params.max_pkt_size = priv->hw_params.rx_buf_size - 256;
|
||||||
|
|
||||||
|
priv->hw_params.max_beacon_itrvl = IWL_MAX_UCODE_BEACON_INTERVAL;
|
||||||
|
|
||||||
if (priv->cfg->mod_params->disable_11n)
|
if (priv->cfg->mod_params->disable_11n)
|
||||||
priv->cfg->sku &= ~IWL_SKU_N;
|
priv->cfg->sku &= ~IWL_SKU_N;
|
||||||
|
|
||||||
|
|
|
@ -554,6 +554,7 @@ extern void iwl_rx_reply_rx_phy(struct iwl_priv *priv,
|
||||||
void iwl_rx_reply_compressed_ba(struct iwl_priv *priv,
|
void iwl_rx_reply_compressed_ba(struct iwl_priv *priv,
|
||||||
struct iwl_rx_mem_buffer *rxb);
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
|
||||||
|
void iwl_setup_rxon_timing(struct iwl_priv *priv);
|
||||||
static inline int iwl_send_rxon_assoc(struct iwl_priv *priv)
|
static inline int iwl_send_rxon_assoc(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
return priv->cfg->ops->hcmd->rxon_assoc(priv);
|
return priv->cfg->ops->hcmd->rxon_assoc(priv);
|
||||||
|
|
|
@ -608,6 +608,7 @@ struct iwl_hw_params {
|
||||||
u8 max_stations;
|
u8 max_stations;
|
||||||
u8 bcast_sta_id;
|
u8 bcast_sta_id;
|
||||||
u8 fat_channel;
|
u8 fat_channel;
|
||||||
|
u8 max_beacon_itrvl; /* in 1024 ms */
|
||||||
u32 max_inst_size;
|
u32 max_inst_size;
|
||||||
u32 max_data_size;
|
u32 max_data_size;
|
||||||
u32 max_bsm_size;
|
u32 max_bsm_size;
|
||||||
|
|
|
@ -361,76 +361,6 @@ static void iwl3945_unset_hw_params(struct iwl_priv *priv)
|
||||||
priv->shared_phys);
|
priv->shared_phys);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_UCODE_BEACON_INTERVAL 1024
|
|
||||||
#define INTEL_CONN_LISTEN_INTERVAL cpu_to_le16(0xA)
|
|
||||||
|
|
||||||
static __le16 iwl3945_adjust_beacon_interval(u16 beacon_val)
|
|
||||||
{
|
|
||||||
u16 new_val = 0;
|
|
||||||
u16 beacon_factor = 0;
|
|
||||||
|
|
||||||
beacon_factor =
|
|
||||||
(beacon_val + MAX_UCODE_BEACON_INTERVAL)
|
|
||||||
/ MAX_UCODE_BEACON_INTERVAL;
|
|
||||||
new_val = beacon_val / beacon_factor;
|
|
||||||
|
|
||||||
return cpu_to_le16(new_val);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void iwl3945_setup_rxon_timing(struct iwl_priv *priv)
|
|
||||||
{
|
|
||||||
u64 interval_tm_unit;
|
|
||||||
u64 tsf, result;
|
|
||||||
unsigned long flags;
|
|
||||||
struct ieee80211_conf *conf = NULL;
|
|
||||||
u16 beacon_int = 0;
|
|
||||||
|
|
||||||
conf = ieee80211_get_hw_conf(priv->hw);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->lock, flags);
|
|
||||||
priv->rxon_timing.timestamp = cpu_to_le64(priv->timestamp);
|
|
||||||
priv->rxon_timing.listen_interval = INTEL_CONN_LISTEN_INTERVAL;
|
|
||||||
|
|
||||||
tsf = priv->timestamp;
|
|
||||||
|
|
||||||
beacon_int = priv->beacon_int;
|
|
||||||
spin_unlock_irqrestore(&priv->lock, flags);
|
|
||||||
|
|
||||||
if (priv->iw_mode == NL80211_IFTYPE_STATION) {
|
|
||||||
if (beacon_int == 0) {
|
|
||||||
priv->rxon_timing.beacon_interval = cpu_to_le16(100);
|
|
||||||
priv->rxon_timing.beacon_init_val = cpu_to_le32(102400);
|
|
||||||
} else {
|
|
||||||
priv->rxon_timing.beacon_interval =
|
|
||||||
cpu_to_le16(beacon_int);
|
|
||||||
priv->rxon_timing.beacon_interval =
|
|
||||||
iwl3945_adjust_beacon_interval(
|
|
||||||
le16_to_cpu(priv->rxon_timing.beacon_interval));
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->rxon_timing.atim_window = 0;
|
|
||||||
} else {
|
|
||||||
priv->rxon_timing.beacon_interval =
|
|
||||||
iwl3945_adjust_beacon_interval(
|
|
||||||
priv->vif->bss_conf.beacon_int);
|
|
||||||
/* TODO: we need to get atim_window from upper stack
|
|
||||||
* for now we set to 0 */
|
|
||||||
priv->rxon_timing.atim_window = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
interval_tm_unit =
|
|
||||||
(le16_to_cpu(priv->rxon_timing.beacon_interval) * 1024);
|
|
||||||
result = do_div(tsf, interval_tm_unit);
|
|
||||||
priv->rxon_timing.beacon_init_val =
|
|
||||||
cpu_to_le32((u32) ((u64) interval_tm_unit - result));
|
|
||||||
|
|
||||||
IWL_DEBUG_ASSOC(priv,
|
|
||||||
"beacon interval %d beacon timer %d beacon tim %d\n",
|
|
||||||
le16_to_cpu(priv->rxon_timing.beacon_interval),
|
|
||||||
le32_to_cpu(priv->rxon_timing.beacon_init_val),
|
|
||||||
le16_to_cpu(priv->rxon_timing.atim_window));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void iwl3945_build_tx_cmd_hwcrypto(struct iwl_priv *priv,
|
static void iwl3945_build_tx_cmd_hwcrypto(struct iwl_priv *priv,
|
||||||
struct ieee80211_tx_info *info,
|
struct ieee80211_tx_info *info,
|
||||||
struct iwl_cmd *cmd,
|
struct iwl_cmd *cmd,
|
||||||
|
@ -3066,7 +2996,7 @@ void iwl3945_post_associate(struct iwl_priv *priv)
|
||||||
iwlcore_commit_rxon(priv);
|
iwlcore_commit_rxon(priv);
|
||||||
|
|
||||||
memset(&priv->rxon_timing, 0, sizeof(struct iwl_rxon_time_cmd));
|
memset(&priv->rxon_timing, 0, sizeof(struct iwl_rxon_time_cmd));
|
||||||
iwl3945_setup_rxon_timing(priv);
|
iwl_setup_rxon_timing(priv);
|
||||||
rc = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
|
rc = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
|
||||||
sizeof(priv->rxon_timing), &priv->rxon_timing);
|
sizeof(priv->rxon_timing), &priv->rxon_timing);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@ -3261,7 +3191,7 @@ void iwl3945_config_ap(struct iwl_priv *priv)
|
||||||
|
|
||||||
/* RXON Timing */
|
/* RXON Timing */
|
||||||
memset(&priv->rxon_timing, 0, sizeof(struct iwl_rxon_time_cmd));
|
memset(&priv->rxon_timing, 0, sizeof(struct iwl_rxon_time_cmd));
|
||||||
iwl3945_setup_rxon_timing(priv);
|
iwl_setup_rxon_timing(priv);
|
||||||
rc = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
|
rc = iwl_send_cmd_pdu(priv, REPLY_RXON_TIMING,
|
||||||
sizeof(priv->rxon_timing),
|
sizeof(priv->rxon_timing),
|
||||||
&priv->rxon_timing);
|
&priv->rxon_timing);
|
||||||
|
|
Loading…
Reference in New Issue