ar9170: introduce functions for MAC programming
This patch introduces 3 new function which are used to update the MAC state, whenever needed... e.g: after a band switch. Signed-off-by: Christian Lamparter <chunkeey@web.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
d7433390e4
commit
29ceff5d58
3 changed files with 81 additions and 29 deletions
|
@ -215,6 +215,9 @@ int ar9170_update_multicast(struct ar9170 *ar);
|
||||||
int ar9170_update_frame_filter(struct ar9170 *ar);
|
int ar9170_update_frame_filter(struct ar9170 *ar);
|
||||||
int ar9170_set_operating_mode(struct ar9170 *ar);
|
int ar9170_set_operating_mode(struct ar9170 *ar);
|
||||||
int ar9170_set_beacon_timers(struct ar9170 *ar);
|
int ar9170_set_beacon_timers(struct ar9170 *ar);
|
||||||
|
int ar9170_set_dyn_sifs_ack(struct ar9170 *ar);
|
||||||
|
int ar9170_set_slot_time(struct ar9170 *ar);
|
||||||
|
int ar9170_set_basic_rates(struct ar9170 *ar);
|
||||||
int ar9170_set_hwretry_limit(struct ar9170 *ar, u32 max_retry);
|
int ar9170_set_hwretry_limit(struct ar9170 *ar, u32 max_retry);
|
||||||
int ar9170_update_beacon(struct ar9170 *ar);
|
int ar9170_update_beacon(struct ar9170 *ar);
|
||||||
void ar9170_new_beacon(struct work_struct *work);
|
void ar9170_new_beacon(struct work_struct *work);
|
||||||
|
|
|
@ -38,6 +38,55 @@
|
||||||
#include "ar9170.h"
|
#include "ar9170.h"
|
||||||
#include "cmd.h"
|
#include "cmd.h"
|
||||||
|
|
||||||
|
int ar9170_set_dyn_sifs_ack(struct ar9170 *ar)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
if (conf_is_ht40(&ar->hw->conf))
|
||||||
|
val = 0x010a;
|
||||||
|
else {
|
||||||
|
if (ar->hw->conf.channel->band == IEEE80211_BAND_2GHZ)
|
||||||
|
val = 0x105;
|
||||||
|
else
|
||||||
|
val = 0x104;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ar9170_write_reg(ar, AR9170_MAC_REG_DYNAMIC_SIFS_ACK, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ar9170_set_slot_time(struct ar9170 *ar)
|
||||||
|
{
|
||||||
|
u32 slottime = 20;
|
||||||
|
|
||||||
|
if (!ar->vif)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ((ar->hw->conf.channel->band == IEEE80211_BAND_5GHZ) ||
|
||||||
|
ar->vif->bss_conf.use_short_slot)
|
||||||
|
slottime = 9;
|
||||||
|
|
||||||
|
return ar9170_write_reg(ar, AR9170_MAC_REG_SLOT_TIME, slottime << 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ar9170_set_basic_rates(struct ar9170 *ar)
|
||||||
|
{
|
||||||
|
u8 cck, ofdm;
|
||||||
|
|
||||||
|
if (!ar->vif)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ofdm = ar->vif->bss_conf.basic_rates >> 4;
|
||||||
|
|
||||||
|
/* FIXME: is still necessary? */
|
||||||
|
if (ar->hw->conf.channel->band == IEEE80211_BAND_5GHZ)
|
||||||
|
cck = 0;
|
||||||
|
else
|
||||||
|
cck = ar->vif->bss_conf.basic_rates & 0xf;
|
||||||
|
|
||||||
|
return ar9170_write_reg(ar, AR9170_MAC_REG_BASIC_RATE,
|
||||||
|
ofdm << 8 | cck);
|
||||||
|
}
|
||||||
|
|
||||||
int ar9170_set_qos(struct ar9170 *ar)
|
int ar9170_set_qos(struct ar9170 *ar)
|
||||||
{
|
{
|
||||||
ar9170_regwrite_begin(ar);
|
ar9170_regwrite_begin(ar);
|
||||||
|
|
|
@ -1344,15 +1344,21 @@ static int ar9170_op_config(struct ieee80211_hw *hw, u32 changed)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
|
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
|
||||||
|
|
||||||
|
/* adjust slot time for 5 GHz */
|
||||||
|
err = ar9170_set_slot_time(ar);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
err = ar9170_set_dyn_sifs_ack(ar);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
|
||||||
err = ar9170_set_channel(ar, hw->conf.channel,
|
err = ar9170_set_channel(ar, hw->conf.channel,
|
||||||
AR9170_RFI_NONE,
|
AR9170_RFI_NONE,
|
||||||
nl80211_to_ar9170(hw->conf.channel_type));
|
nl80211_to_ar9170(hw->conf.channel_type));
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
/* adjust slot time for 5 GHz */
|
|
||||||
if (hw->conf.channel->band == IEEE80211_BAND_5GHZ)
|
|
||||||
err = ar9170_write_reg(ar, AR9170_MAC_REG_SLOT_TIME,
|
|
||||||
9 << 10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -1464,15 +1470,19 @@ static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||||
if (changed & BSS_CHANGED_BSSID) {
|
if (changed & BSS_CHANGED_BSSID) {
|
||||||
memcpy(ar->bssid, bss_conf->bssid, ETH_ALEN);
|
memcpy(ar->bssid, bss_conf->bssid, ETH_ALEN);
|
||||||
err = ar9170_set_operating_mode(ar);
|
err = ar9170_set_operating_mode(ar);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed & (BSS_CHANGED_BEACON | BSS_CHANGED_BEACON_ENABLED)) {
|
if (changed & (BSS_CHANGED_BEACON | BSS_CHANGED_BEACON_ENABLED)) {
|
||||||
err = ar9170_update_beacon(ar);
|
err = ar9170_update_beacon(ar);
|
||||||
if (!err)
|
if (err)
|
||||||
ar9170_set_beacon_timers(ar);
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
ar9170_regwrite_begin(ar);
|
err = ar9170_set_beacon_timers(ar);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (changed & BSS_CHANGED_ASSOC) {
|
if (changed & BSS_CHANGED_ASSOC) {
|
||||||
ar->state = bss_conf->assoc ? AR9170_ASSOCIATED : ar->state;
|
ar->state = bss_conf->assoc ? AR9170_ASSOCIATED : ar->state;
|
||||||
|
@ -1483,8 +1493,11 @@ static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||||
#endif /* CONFIG_AR9170_LEDS */
|
#endif /* CONFIG_AR9170_LEDS */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed & BSS_CHANGED_BEACON_INT)
|
if (changed & BSS_CHANGED_BEACON_INT) {
|
||||||
err = ar9170_set_beacon_timers(ar);
|
err = ar9170_set_beacon_timers(ar);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (changed & BSS_CHANGED_HT) {
|
if (changed & BSS_CHANGED_HT) {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
@ -1492,31 +1505,18 @@ static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed & BSS_CHANGED_ERP_SLOT) {
|
if (changed & BSS_CHANGED_ERP_SLOT) {
|
||||||
u32 slottime = 20;
|
err = ar9170_set_slot_time(ar);
|
||||||
|
if (err)
|
||||||
if (bss_conf->use_short_slot)
|
goto out;
|
||||||
slottime = 9;
|
|
||||||
|
|
||||||
ar9170_regwrite(AR9170_MAC_REG_SLOT_TIME, slottime << 10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed & BSS_CHANGED_BASIC_RATES) {
|
if (changed & BSS_CHANGED_BASIC_RATES) {
|
||||||
u32 cck, ofdm;
|
err = ar9170_set_basic_rates(ar);
|
||||||
|
if (err)
|
||||||
if (hw->conf.channel->band == IEEE80211_BAND_5GHZ) {
|
goto out;
|
||||||
ofdm = bss_conf->basic_rates;
|
|
||||||
cck = 0;
|
|
||||||
} else {
|
|
||||||
/* four cck rates */
|
|
||||||
cck = bss_conf->basic_rates & 0xf;
|
|
||||||
ofdm = bss_conf->basic_rates >> 4;
|
|
||||||
}
|
|
||||||
ar9170_regwrite(AR9170_MAC_REG_BASIC_RATE,
|
|
||||||
ofdm << 8 | cck);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ar9170_regwrite_finish();
|
out:
|
||||||
err = ar9170_regwrite_result();
|
|
||||||
mutex_unlock(&ar->mutex);
|
mutex_unlock(&ar->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue