p54: honour bss_info_changed's basic_rates and other settings
PATCH 4/4 p54: honour bss_info_changed's basic_rates and other settings
As was pointed out in "p54: honour bss_info_changed's short slot time settings" (84c693dbf07503...)
bss_info_changed provides more useful settings that can be used by the driver.
Signed-off-by Christian Lamparter <[email protected]>
---
drivers/net/wireless/p54/p54common.c +24 -5
@@ -1262,20 +1262,20 @@ static int p54_setup_mac(struct ieee8021 setup->rx_antenna = priv->rx_antenna; setup->rx_align =0 ;if (priv->fw_var <0x500 ) { - setup->v1.basic_rate_mask =cpu_to_le32 (0x15f ); + setup->v1.basic_rate_mask =cpu_to_le32 (priv->basic_rate_mask);memset (setup->v1.rts_rates,0 ,8 ); setup->v1.rx_addr =cpu_to_le32 (priv->rx_end); setup->v1.max_rx =cpu_to_le16 (priv->rx_mtu); setup->v1.rxhw =cpu_to_le16 (priv->rxhw); - setup->v1.wakeup_timer =cpu_to_le16 (500 ); + setup->v1.wakeup_timer =cpu_to_le16 (priv->wakeup_timer); setup->v1.unalloc0 =cpu_to_le16 (0 ); }else { setup->v2.rx_addr =cpu_to_le32 (priv->rx_end); setup->v2.max_rx =cpu_to_le16 (priv->rx_mtu); setup->v2.rxhw =cpu_to_le16 (priv->rxhw); - setup->v2.timer =cpu_to_le16 (1000 ); + setup->v2.timer =cpu_to_le16 (priv->wakeup_timer); setup->v2.truncate =cpu_to_le16 (48896 ); - setup->v2.basic_rate_mask =cpu_to_le32 (0x15f ); + setup->v2.basic_rate_mask =cpu_to_le32 (priv->basic_rate_mask); setup->v2.sbss_offset =0 ; setup->v2.mcast_window =0 ; setup->v2.rx_rssi_threshold =0 ;
@@ -1361,7 +1361,7 @@ static int p54_set_freq(struct ieee80211 }else { chan->v2.rssical_mul =cpu_to_le16 (130 ); chan->v2.rssical_add =cpu_to_le16 (0xfe70 ); - chan->v2.basic_rate_mask =cpu_to_le32 (0x15f ); + chan->v2.basic_rate_mask =cpu_to_le32 (priv->basic_rate_mask);memset (chan->v2.rts_rates,0 ,8 ); } priv->tx (dev, skb,1 );
@@ -1821,6 +1821,24 @@ static void p54_bss_info_changed(struct priv->use_short_slot = info->use_short_slot;p54_set_edcf (dev); } +if (changed &BSS_CHANGED_BASIC_RATES ) { +if (dev->conf.channel->band ==IEEE80211_BAND_5GHZ ) + priv->basic_rate_mask = (info->basic_rates <<4 ); +else + priv->basic_rate_mask = info->basic_rates; +p54_setup_mac (dev, priv->mac_mode, priv->bssid); +if (priv->fw_var >=0x500 ) +p54_set_freq (dev, dev->conf.channel->center_freq); + } +if (changed &BSS_CHANGED_ASSOC ) { +if (info->assoc) { + priv->aid = info->aid; + priv->wakeup_timer = info->beacon_int * + info->dtim_period *5 ; +p54_setup_mac (dev, priv->mac_mode, priv->bssid); + } + } + }static const struct ieee80211_ops p54_ops = {
@@ -1850,6 +1868,7 @@ struct ieee80211_hw *p54_init_common(siz priv = dev->priv; priv->mode =NL80211_IFTYPE_UNSPECIFIED ; + priv->basic_rate_mask =0x15f ;skb_queue_head_init (&priv->tx_queue); dev->flags =IEEE80211_HW_RX_INCLUDES_FCS | IEEE80211_HW_SIGNAL_DBM |
drivers/net/wireless/p54/p54.h +3 -0
@@ -103,6 +103,9 @@ struct p54_common {unsigned int output_power;u32 tsf_low32;u32 tsf_high32; +u64 basic_rate_mask; +u16 wakeup_timer; +u16 aid;struct ieee80211_tx_queue_stats tx_stats[8 ];struct p54_edcf_queue_param qos_params[8 ];struct ieee80211_low_level_stats stats;