wl12xx: move basic_rate into wlvif

move basic_rate into the per-interface data, rather than
being global.

Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
This commit is contained in:
Eliad Peller 2011-10-05 11:55:43 +02:00 committed by Luciano Coelho
parent 30d0c8fd5b
commit d2d66c56cf
9 changed files with 68 additions and 52 deletions

View File

@ -755,11 +755,11 @@ int wl1271_acx_sta_rate_policies(struct wl1271 *wl, struct wl12xx_vif *wlvif)
} }
wl1271_debug(DEBUG_ACX, "basic_rate: 0x%x, full_rate: 0x%x", wl1271_debug(DEBUG_ACX, "basic_rate: 0x%x, full_rate: 0x%x",
wl->basic_rate, wlvif->rate_set); wlvif->basic_rate, wlvif->rate_set);
/* configure one basic rate class */ /* configure one basic rate class */
acx->rate_policy_idx = cpu_to_le32(ACX_TX_BASIC_RATE); acx->rate_policy_idx = cpu_to_le32(ACX_TX_BASIC_RATE);
acx->rate_policy.enabled_rates = cpu_to_le32(wl->basic_rate); acx->rate_policy.enabled_rates = cpu_to_le32(wlvif->basic_rate);
acx->rate_policy.short_retry_limit = c->short_retry_limit; acx->rate_policy.short_retry_limit = c->short_retry_limit;
acx->rate_policy.long_retry_limit = c->long_retry_limit; acx->rate_policy.long_retry_limit = c->long_retry_limit;
acx->rate_policy.aflags = c->aflags; acx->rate_policy.aflags = c->aflags;
@ -1567,7 +1567,7 @@ out:
return ret; return ret;
} }
int wl1271_acx_config_ps(struct wl1271 *wl) int wl12xx_acx_config_ps(struct wl1271 *wl, struct wl12xx_vif *wlvif)
{ {
struct wl1271_acx_config_ps *config_ps; struct wl1271_acx_config_ps *config_ps;
int ret; int ret;
@ -1582,7 +1582,7 @@ int wl1271_acx_config_ps(struct wl1271 *wl)
config_ps->exit_retries = wl->conf.conn.psm_exit_retries; config_ps->exit_retries = wl->conf.conn.psm_exit_retries;
config_ps->enter_retries = wl->conf.conn.psm_entry_retries; config_ps->enter_retries = wl->conf.conn.psm_entry_retries;
config_ps->null_data_rate = cpu_to_le32(wl->basic_rate); config_ps->null_data_rate = cpu_to_le32(wlvif->basic_rate);
ret = wl1271_cmd_configure(wl, ACX_CONFIG_PS, config_ps, ret = wl1271_cmd_configure(wl, ACX_CONFIG_PS, config_ps,
sizeof(*config_ps)); sizeof(*config_ps));

View File

@ -1295,7 +1295,7 @@ int wl12xx_acx_set_ba_receiver_session(struct wl1271 *wl, u8 tid_index,
int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime); int wl1271_acx_tsf_info(struct wl1271 *wl, u64 *mactime);
int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable); int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable);
int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl); int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl);
int wl1271_acx_config_ps(struct wl1271 *wl); int wl12xx_acx_config_ps(struct wl1271 *wl, struct wl12xx_vif *wlvif);
int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr); int wl1271_acx_set_inconnection_sta(struct wl1271 *wl, u8 *addr);
int wl1271_acx_fm_coex(struct wl1271 *wl); int wl1271_acx_fm_coex(struct wl1271 *wl);
int wl12xx_acx_set_rate_mgmt_params(struct wl1271 *wl); int wl12xx_acx_set_rate_mgmt_params(struct wl1271 *wl);

View File

@ -1031,7 +1031,7 @@ out:
return ret; return ret;
} }
int wl1271_cmd_build_null_data(struct wl1271 *wl) int wl12xx_cmd_build_null_data(struct wl1271 *wl, struct wl12xx_vif *wlvif)
{ {
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
int size; int size;
@ -1043,7 +1043,8 @@ int wl1271_cmd_build_null_data(struct wl1271 *wl)
size = sizeof(struct wl12xx_null_data_template); size = sizeof(struct wl12xx_null_data_template);
ptr = NULL; ptr = NULL;
} else { } else {
skb = ieee80211_nullfunc_get(wl->hw, wl->vif); skb = ieee80211_nullfunc_get(wl->hw,
wl12xx_wlvif_to_vif(wlvif));
if (!skb) if (!skb)
goto out; goto out;
size = skb->len; size = skb->len;
@ -1051,7 +1052,7 @@ int wl1271_cmd_build_null_data(struct wl1271 *wl)
} }
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, ptr, size, 0, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, ptr, size, 0,
wl->basic_rate); wlvif->basic_rate);
out: out:
dev_kfree_skb(skb); dev_kfree_skb(skb);
@ -1062,19 +1063,21 @@ out:
} }
int wl1271_cmd_build_klv_null_data(struct wl1271 *wl) int wl12xx_cmd_build_klv_null_data(struct wl1271 *wl,
struct wl12xx_vif *wlvif)
{ {
struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
int ret = -ENOMEM; int ret = -ENOMEM;
skb = ieee80211_nullfunc_get(wl->hw, wl->vif); skb = ieee80211_nullfunc_get(wl->hw, vif);
if (!skb) if (!skb)
goto out; goto out;
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV,
skb->data, skb->len, skb->data, skb->len,
CMD_TEMPL_KLV_IDX_NULL_DATA, CMD_TEMPL_KLV_IDX_NULL_DATA,
wl->basic_rate); wlvif->basic_rate);
out: out:
dev_kfree_skb(skb); dev_kfree_skb(skb);
@ -1161,7 +1164,8 @@ out:
return skb; return skb;
} }
int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, __be32 ip_addr) int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif,
__be32 ip_addr)
{ {
int ret; int ret;
struct wl12xx_arp_rsp_template tmpl; struct wl12xx_arp_rsp_template tmpl;
@ -1197,13 +1201,14 @@ int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, __be32 ip_addr)
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_ARP_RSP, ret = wl1271_cmd_template_set(wl, CMD_TEMPL_ARP_RSP,
&tmpl, sizeof(tmpl), 0, &tmpl, sizeof(tmpl), 0,
wl->basic_rate); wlvif->basic_rate);
return ret; return ret;
} }
int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif) int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif)
{ {
struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
struct ieee80211_qos_hdr template; struct ieee80211_qos_hdr template;
memset(&template, 0, sizeof(template)); memset(&template, 0, sizeof(template));
@ -1221,7 +1226,7 @@ int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif)
return wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, &template, return wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, &template,
sizeof(template), 0, sizeof(template), 0,
wl->basic_rate); wlvif->basic_rate);
} }
int wl12xx_cmd_set_default_wep_key(struct wl1271 *wl, u8 id, u8 hlid) int wl12xx_cmd_set_default_wep_key(struct wl1271 *wl, u8 id, u8 hlid)

View File

@ -55,7 +55,7 @@ int wl1271_cmd_read_memory(struct wl1271 *wl, u32 addr, void *answer,
size_t len); size_t len);
int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id, int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id,
void *buf, size_t buf_len, int index, u32 rates); void *buf, size_t buf_len, int index, u32 rates);
int wl1271_cmd_build_null_data(struct wl1271 *wl); int wl12xx_cmd_build_null_data(struct wl1271 *wl, struct wl12xx_vif *wlvif);
int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif, int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif,
u16 aid); u16 aid);
int wl1271_cmd_build_probe_req(struct wl1271 *wl, int wl1271_cmd_build_probe_req(struct wl1271 *wl,
@ -63,9 +63,11 @@ int wl1271_cmd_build_probe_req(struct wl1271 *wl,
const u8 *ie, size_t ie_len, u8 band); const u8 *ie, size_t ie_len, u8 band);
struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl, struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl,
struct sk_buff *skb); struct sk_buff *skb);
int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, __be32 ip_addr); int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif,
__be32 ip_addr);
int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif); int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif);
int wl1271_cmd_build_klv_null_data(struct wl1271 *wl); int wl12xx_cmd_build_klv_null_data(struct wl1271 *wl,
struct wl12xx_vif *wlvif);
int wl12xx_cmd_set_default_wep_key(struct wl1271 *wl, u8 id, u8 hlid); int wl12xx_cmd_set_default_wep_key(struct wl1271 *wl, u8 id, u8 hlid);
int wl1271_cmd_set_sta_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type, int wl1271_cmd_set_sta_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
u8 key_size, const u8 *key, const u8 *addr, u8 key_size, const u8 *key, const u8 *addr,

View File

@ -352,7 +352,6 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf,
DRIVER_STATE_PRINT_INT(state); DRIVER_STATE_PRINT_INT(state);
DRIVER_STATE_PRINT_INT(bss_type); DRIVER_STATE_PRINT_INT(bss_type);
DRIVER_STATE_PRINT_INT(channel); DRIVER_STATE_PRINT_INT(channel);
DRIVER_STATE_PRINT_HEX(basic_rate);
DRIVER_STATE_PRINT_INT(band); DRIVER_STATE_PRINT_INT(band);
DRIVER_STATE_PRINT_INT(beacon_int); DRIVER_STATE_PRINT_INT(beacon_int);
DRIVER_STATE_PRINT_INT(psm_entry_retry); DRIVER_STATE_PRINT_INT(psm_entry_retry);

View File

@ -31,12 +31,16 @@
void wl1271_pspoll_work(struct work_struct *work) void wl1271_pspoll_work(struct work_struct *work)
{ {
struct ieee80211_vif *vif;
struct wl12xx_vif *wlvif;
struct delayed_work *dwork; struct delayed_work *dwork;
struct wl1271 *wl; struct wl1271 *wl;
int ret; int ret;
dwork = container_of(work, struct delayed_work, work); dwork = container_of(work, struct delayed_work, work);
wl = container_of(dwork, struct wl1271, pspoll_work); wl = container_of(dwork, struct wl1271, pspoll_work);
vif = wl->vif; /* TODO: move work into vif struct */
wlvif = wl12xx_vif_to_data(vif);
wl1271_debug(DEBUG_EVENT, "pspoll work"); wl1271_debug(DEBUG_EVENT, "pspoll work");
@ -60,14 +64,16 @@ void wl1271_pspoll_work(struct work_struct *work)
if (ret < 0) if (ret < 0)
goto out; goto out;
wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, wl->basic_rate, true); wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, wlvif->basic_rate,
true);
wl1271_ps_elp_sleep(wl); wl1271_ps_elp_sleep(wl);
out: out:
mutex_unlock(&wl->mutex); mutex_unlock(&wl->mutex);
}; };
static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl) static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl,
struct wl12xx_vif *wlvif)
{ {
int delay = wl->conf.conn.ps_poll_recovery_period; int delay = wl->conf.conn.ps_poll_recovery_period;
int ret; int ret;
@ -80,7 +86,7 @@ static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl)
/* force active mode receive data from the AP */ /* force active mode receive data from the AP */
if (test_bit(WL1271_FLAG_PSM, &wl->flags)) { if (test_bit(WL1271_FLAG_PSM, &wl->flags)) {
ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE, ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
wl->basic_rate, true); wlvif->basic_rate, true);
if (ret < 0) if (ret < 0)
return; return;
set_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags); set_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags);
@ -97,6 +103,7 @@ static void wl1271_event_pspoll_delivery_fail(struct wl1271 *wl)
} }
static int wl1271_event_ps_report(struct wl1271 *wl, static int wl1271_event_ps_report(struct wl1271 *wl,
struct wl12xx_vif *wlvif,
struct event_mailbox *mbox, struct event_mailbox *mbox,
bool *beacon_loss) bool *beacon_loss)
{ {
@ -118,7 +125,7 @@ static int wl1271_event_ps_report(struct wl1271 *wl,
if (wl->psm_entry_retry < total_retries) { if (wl->psm_entry_retry < total_retries) {
wl->psm_entry_retry++; wl->psm_entry_retry++;
ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
wl->basic_rate, true); wlvif->basic_rate, true);
} else { } else {
wl1271_info("No ack to nullfunc from AP."); wl1271_info("No ack to nullfunc from AP.");
wl->psm_entry_retry = 0; wl->psm_entry_retry = 0;
@ -217,6 +224,8 @@ static void wl1271_event_mbox_dump(struct event_mailbox *mbox)
static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox) static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
{ {
struct ieee80211_vif *vif = wl->vif; /* TODO: get as param */
struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
int ret; int ret;
u32 vector; u32 vector;
bool beacon_loss = false; bool beacon_loss = false;
@ -276,13 +285,13 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
if ((vector & PS_REPORT_EVENT_ID) && !is_ap) { if ((vector & PS_REPORT_EVENT_ID) && !is_ap) {
wl1271_debug(DEBUG_EVENT, "PS_REPORT_EVENT"); wl1271_debug(DEBUG_EVENT, "PS_REPORT_EVENT");
ret = wl1271_event_ps_report(wl, mbox, &beacon_loss); ret = wl1271_event_ps_report(wl, wlvif, mbox, &beacon_loss);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
if ((vector & PSPOLL_DELIVERY_FAILURE_EVENT_ID) && !is_ap) if ((vector & PSPOLL_DELIVERY_FAILURE_EVENT_ID) && !is_ap)
wl1271_event_pspoll_delivery_fail(wl); wl1271_event_pspoll_delivery_fail(wl, wlvif);
if (vector & RSSI_SNR_TRIGGER_0_EVENT_ID) { if (vector & RSSI_SNR_TRIGGER_0_EVENT_ID) {
wl1271_debug(DEBUG_EVENT, "RSSI_SNR_TRIGGER_0_EVENT"); wl1271_debug(DEBUG_EVENT, "RSSI_SNR_TRIGGER_0_EVENT");

View File

@ -331,7 +331,7 @@ static int wl1271_sta_hw_init(struct wl1271 *wl, struct wl12xx_vif *wlvif)
} }
/* PS config */ /* PS config */
ret = wl1271_acx_config_ps(wl); ret = wl12xx_acx_config_ps(wl, wlvif);
if (ret < 0) if (ret < 0)
return ret; return ret;

View File

@ -1609,7 +1609,8 @@ static struct notifier_block wl1271_dev_notifier = {
}; };
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int wl1271_configure_suspend_sta(struct wl1271 *wl) static int wl1271_configure_suspend_sta(struct wl1271 *wl,
struct wl12xx_vif *wlvif)
{ {
int ret = 0; int ret = 0;
@ -1628,7 +1629,7 @@ static int wl1271_configure_suspend_sta(struct wl1271 *wl)
wl->ps_compl = &compl; wl->ps_compl = &compl;
ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
wl->basic_rate, true); wlvif->basic_rate, true);
if (ret < 0) if (ret < 0)
goto out_sleep; goto out_sleep;
@ -1682,16 +1683,18 @@ out_unlock:
} }
static int wl1271_configure_suspend(struct wl1271 *wl) static int wl1271_configure_suspend(struct wl1271 *wl,
struct wl12xx_vif *wlvif)
{ {
if (wl->bss_type == BSS_TYPE_STA_BSS) if (wl->bss_type == BSS_TYPE_STA_BSS)
return wl1271_configure_suspend_sta(wl); return wl1271_configure_suspend_sta(wl, wlvif);
if (wl->bss_type == BSS_TYPE_AP_BSS) if (wl->bss_type == BSS_TYPE_AP_BSS)
return wl1271_configure_suspend_ap(wl); return wl1271_configure_suspend_ap(wl);
return 0; return 0;
} }
static void wl1271_configure_resume(struct wl1271 *wl) static void wl1271_configure_resume(struct wl1271 *wl,
struct wl12xx_vif *wlvif)
{ {
int ret; int ret;
bool is_sta = wl->bss_type == BSS_TYPE_STA_BSS; bool is_sta = wl->bss_type == BSS_TYPE_STA_BSS;
@ -1709,7 +1712,7 @@ static void wl1271_configure_resume(struct wl1271 *wl)
/* exit psm if it wasn't configured */ /* exit psm if it wasn't configured */
if (!test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) if (!test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags))
wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE, wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
wl->basic_rate, true); wlvif->basic_rate, true);
} else if (is_ap) { } else if (is_ap) {
wl1271_acx_beacon_filter_opt(wl, false); wl1271_acx_beacon_filter_opt(wl, false);
} }
@ -1723,13 +1726,15 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw,
struct cfg80211_wowlan *wow) struct cfg80211_wowlan *wow)
{ {
struct wl1271 *wl = hw->priv; struct wl1271 *wl = hw->priv;
struct ieee80211_vif *vif = wl->vif; /* TODO: get as param */
struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
int ret; int ret;
wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow); wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow);
WARN_ON(!wow || !wow->any); WARN_ON(!wow || !wow->any);
wl->wow_enabled = true; wl->wow_enabled = true;
ret = wl1271_configure_suspend(wl); ret = wl1271_configure_suspend(wl, wlvif);
if (ret < 0) { if (ret < 0) {
wl1271_warning("couldn't prepare device to suspend"); wl1271_warning("couldn't prepare device to suspend");
return ret; return ret;
@ -1760,6 +1765,8 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw,
static int wl1271_op_resume(struct ieee80211_hw *hw) static int wl1271_op_resume(struct ieee80211_hw *hw)
{ {
struct wl1271 *wl = hw->priv; struct wl1271 *wl = hw->priv;
struct ieee80211_vif *vif = wl->vif; /* TODO: get as param */
struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
unsigned long flags; unsigned long flags;
bool run_irq_work = false; bool run_irq_work = false;
@ -1783,7 +1790,7 @@ static int wl1271_op_resume(struct ieee80211_hw *hw)
wl1271_irq(0, wl); wl1271_irq(0, wl);
wl1271_enable_interrupts(wl); wl1271_enable_interrupts(wl);
} }
wl1271_configure_resume(wl); wl1271_configure_resume(wl, wlvif);
wl->wow_enabled = false; wl->wow_enabled = false;
return 0; return 0;
@ -1840,6 +1847,7 @@ static u8 wl12xx_get_role_type(struct wl1271 *wl)
static void wl12xx_init_vif_data(struct wl12xx_vif *wlvif) static void wl12xx_init_vif_data(struct wl12xx_vif *wlvif)
{ {
wlvif->basic_rate_set = CONF_TX_RATE_MASK_BASIC; wlvif->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
wlvif->basic_rate = CONF_TX_RATE_MASK_BASIC;
wlvif->rate_set = CONF_TX_RATE_MASK_BASIC; wlvif->rate_set = CONF_TX_RATE_MASK_BASIC;
} }
@ -2214,7 +2222,7 @@ static int wl1271_join(struct wl1271 *wl, struct wl12xx_vif *wlvif,
if (ret < 0) if (ret < 0)
goto out; goto out;
ret = wl1271_cmd_build_klv_null_data(wl); ret = wl12xx_cmd_build_klv_null_data(wl, wlvif);
if (ret < 0) if (ret < 0)
goto out; goto out;
@ -2384,7 +2392,7 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
wl1271_set_band_rate(wl, wlvif); wl1271_set_band_rate(wl, wlvif);
wl->basic_rate = wlvif->basic_rate =
wl1271_tx_min_rate_get(wl, wl1271_tx_min_rate_get(wl,
wlvif->basic_rate_set); wlvif->basic_rate_set);
ret = wl1271_acx_sta_rate_policies(wl, wlvif); ret = wl1271_acx_sta_rate_policies(wl, wlvif);
@ -2450,7 +2458,7 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) { if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
wl1271_debug(DEBUG_PSM, "psm enabled"); wl1271_debug(DEBUG_PSM, "psm enabled");
ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE, ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
wl->basic_rate, true); wlvif->basic_rate, true);
} }
} else if (!(conf->flags & IEEE80211_CONF_PS) && } else if (!(conf->flags & IEEE80211_CONF_PS) &&
test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) { test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
@ -2460,7 +2468,7 @@ static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
if (test_bit(WL1271_FLAG_PSM, &wl->flags)) if (test_bit(WL1271_FLAG_PSM, &wl->flags))
ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE, ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
wl->basic_rate, true); wlvif->basic_rate, true);
} }
if (conf->power_level != wl->power_level) { if (conf->power_level != wl->power_level) {
@ -3311,7 +3319,7 @@ static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
wlvif->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates, wlvif->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates,
wl->band); wl->band);
wl->basic_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate = wl1271_tx_min_rate_get(wl,
wlvif->basic_rate_set); wlvif->basic_rate_set);
ret = wl1271_init_ap_rates(wl, wlvif); ret = wl1271_init_ap_rates(wl, wlvif);
@ -3450,7 +3458,7 @@ static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN); memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
if (!is_zero_ether_addr(wl->bssid)) { if (!is_zero_ether_addr(wl->bssid)) {
ret = wl1271_cmd_build_null_data(wl); ret = wl12xx_cmd_build_null_data(wl, wlvif);
if (ret < 0) if (ret < 0)
goto out; goto out;
@ -3498,7 +3506,7 @@ sta_not_found:
wlvif->basic_rate_set = wlvif->basic_rate_set =
wl1271_tx_enabled_rates_get(wl, rates, wl1271_tx_enabled_rates_get(wl, rates,
wl->band); wl->band);
wl->basic_rate = wlvif->basic_rate =
wl1271_tx_min_rate_get(wl, wl1271_tx_min_rate_get(wl,
wlvif->basic_rate_set); wlvif->basic_rate_set);
if (sta_rate_set) if (sta_rate_set)
@ -3552,7 +3560,7 @@ sta_not_found:
/* revert back to minimum rates for the current band */ /* revert back to minimum rates for the current band */
wl1271_set_band_rate(wl, wlvif); wl1271_set_band_rate(wl, wlvif);
wl->basic_rate = wlvif->basic_rate =
wl1271_tx_min_rate_get(wl, wl1271_tx_min_rate_get(wl,
wlvif->basic_rate_set); wlvif->basic_rate_set);
ret = wl1271_acx_sta_rate_policies(wl, wlvif); ret = wl1271_acx_sta_rate_policies(wl, wlvif);
@ -3608,7 +3616,7 @@ sta_not_found:
wlvif->basic_rate_set = wlvif->basic_rate_set =
wl1271_tx_enabled_rates_get(wl, rates, wl1271_tx_enabled_rates_get(wl, rates,
wl->band); wl->band);
wl->basic_rate = wlvif->basic_rate =
wl1271_tx_min_rate_get(wl, wl1271_tx_min_rate_get(wl,
wlvif->basic_rate_set); wlvif->basic_rate_set);
@ -3636,7 +3644,7 @@ sta_not_found:
* isn't being set (when sending), so we have to * isn't being set (when sending), so we have to
* reconfigure the template upon every ip change. * reconfigure the template upon every ip change.
*/ */
ret = wl1271_cmd_build_arp_rsp(wl, addr); ret = wl1271_cmd_build_arp_rsp(wl, wlvif, addr);
if (ret < 0) { if (ret < 0) {
wl1271_warning("build arp rsp failed: %d", ret); wl1271_warning("build arp rsp failed: %d", ret);
goto out; goto out;
@ -3689,7 +3697,7 @@ sta_not_found:
mode = STATION_POWER_SAVE_MODE; mode = STATION_POWER_SAVE_MODE;
ret = wl1271_ps_set_mode(wl, mode, ret = wl1271_ps_set_mode(wl, mode,
wl->basic_rate, wlvif->basic_rate,
true); true);
if (ret < 0) if (ret < 0)
goto out; goto out;
@ -4844,7 +4852,6 @@ struct ieee80211_hw *wl1271_alloc_hw(void)
wl->rx_counter = 0; wl->rx_counter = 0;
wl->psm_entry_retry = 0; wl->psm_entry_retry = 0;
wl->power_level = WL1271_DEFAULT_POWER_LEVEL; wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
wl->basic_rate = CONF_TX_RATE_MASK_BASIC;
wl->band = IEEE80211_BAND_2GHZ; wl->band = IEEE80211_BAND_2GHZ;
wl->vif = NULL; wl->vif = NULL;
wl->flags = 0; wl->flags = 0;

View File

@ -519,13 +519,6 @@ struct wl1271 {
/* Our association ID */ /* Our association ID */
u16 aid; u16 aid;
/*
* currently configured rate set:
* bits 0-15 - 802.11abg rates
* bits 16-23 - 802.11n MCS index mask
* support only 1 stream, thus only 8 bits for the MCS rates (0-7).
*/
u32 basic_rate;
u32 bitrate_masks[IEEE80211_NUM_BANDS]; u32 bitrate_masks[IEEE80211_NUM_BANDS];
/* The current band */ /* The current band */
@ -646,6 +639,7 @@ struct wl12xx_vif {
* bits 16-23 - 802.11n MCS index mask * bits 16-23 - 802.11n MCS index mask
* support only 1 stream, thus only 8 bits for the MCS rates (0-7). * support only 1 stream, thus only 8 bits for the MCS rates (0-7).
*/ */
u32 basic_rate;
u32 rate_set; u32 rate_set;
}; };