p54: honour bss_info_changed's short slot time settings
PATCH 1/1 p54: honour bss_info_changed's short slot time settings
This patch was made on behalf of Johannes request. "mac80211 and IEEE80211_CONF_SHORT_SLOT_TIME"
Of course, bss_info_changed provides some more useful data. e.g.: basic_rates, dtim_period, beacon_int and maybe even more. Everything can be hooked up if it's necessary.
Signed-off-by Christian Lamparter <[email protected]>
---
drivers/net/wireless/p54/p54.h +1 -0
@@ -81,6 +81,7 @@ struct p54_common {unsigned int output_limit_len;struct pda_pa_curve_data *curve_data;unsigned int filter_flags; +bool use_short_slot;u16 rxhw;u8 version;u8 rx_antenna;
drivers/net/wireless/p54/p54common.c +16 -7
@@ -909,12 +909,10 @@ static int p54_set_filter(struct ieee80211_hw *dev, u16 filter_type,memset (filter->bssid, ~0 ,ETH_ALEN ); else memcpy(filter->bssid, bssid, ETH_ALEN); - filter->rx_antenna = priv->rx_antenna; -if (priv->fw_var <0x500 ) { data_len =P54_TX_CONTROL_FILTER_V1_LEN ; - filter->v1.basic_rate_mask =cpu_to_le32 (0x15F ); + filter->v1.basic_rate_mask =cpu_to_le32 (0x15f ); filter->v1.rx_addr =cpu_to_le32 (priv->rx_end); filter->v1.max_rx =cpu_to_le16 (priv->rx_mtu); filter->v1.rxhw =cpu_to_le16 (priv->rxhw);
@@ -926,7 +924,6 @@ static int p54_set_filter(struct ieee80211_hw *dev, u16 filter_type, filter->v2.rxhw =cpu_to_le16 (priv->rxhw); filter->v2.timer =cpu_to_le16 (1000 ); } - hdr->len =cpu_to_le16 (data_len);p54_assign_address (dev,NULL , hdr,sizeof (*hdr) + data_len); priv->tx (dev, hdr,sizeof (*hdr) + data_len,1 );
@@ -1096,7 +1093,7 @@ static void p54_set_vdcf(struct ieee80211_hw *dev) vdcf = (struct p54_tx_control_vdcf *) hdr->data; -if (dev->conf.flags &IEEE80211_CONF_SHORT_SLOT_TIME ) { +if (priv->use_short_slot) { vdcf->slottime =9 ; vdcf->magic1 =0x10 ; vdcf->magic2 =0x00 ;
@@ -1143,7 +1140,6 @@ static int p54_start(struct ieee80211_hw *dev) priv->mode =NL80211_IFTYPE_MONITOR ;p54_init_vdcf (dev); -mod_timer (&priv->stats_timer, jiffies +HZ );return err; }
@@ -1359,6 +1355,19 @@ static int p54_get_tx_stats(struct ieee80211_hw *dev,return 0 ; } +static void p54_bss_info_changed (struct ieee80211_hw *dev, +struct ieee80211_vif *vif, +struct ieee80211_bss_conf *info, +u32 changed) +{ +struct p54_common *priv = dev->priv; + +if (changed &BSS_CHANGED_ERP_SLOT ) { + priv->use_short_slot = info->use_short_slot; +p54_set_vdcf (dev); + } +} +static const struct ieee80211_ops p54_ops = { .tx = p54_tx, .start = p54_start,
@@ -1367,6 +1376,7 @@ static const struct ieee80211_ops p54_ops = { .remove_interface = p54_remove_interface, .config = p54_config, .config_interface = p54_config_interface, + .bss_info_changed = p54_bss_info_changed, .configure_filter = p54_configure_filter, .conf_tx = p54_conf_tx, .get_stats = p54_get_stats,
@@ -1393,7 +1403,6 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len) dev->wiphy->interface_modes =BIT (NL80211_IFTYPE_STATION ); dev->channel_change_time =1000 ;/* TODO: find actual value */ - priv->tx_stats[0 ].limit =1 ; priv->tx_stats[1 ].limit =1 ; priv->tx_stats[2 ].limit =1 ;
Johannes Berg
maintainerQuoted 2 lines · Christian Lamparter
This patch was made on behalf of Johannes request. "mac80211 and
IEEE80211_CONF_SHORT_SLOT_TIME"
Nice, thanks.
Quoted 3 lines
Of course,
bss_info_changedprovides some more useful data. e.g.:basic_rates,dtim_period,beacon_intand maybe even more. Everything can be hooked up if it's necessary.
It probably should be, yes. Well, beacon_int here is a bit confusing, I think.
Quoted 94 lines
Signed-off-by Christian Lamparter <[email protected]>---
drivers/net/wireless/p54/p54.h +1
-0@@ -81,6 +81,7 @@ struct p54_common {unsigned int output_limit_len;struct pda_pa_curve_data *curve_data;unsigned int filter_flags; +bool use_short_slot;u16 rxhw;u8 version;u8 rx_antenna;drivers/net/wireless/p54/p54common.c +16
-7@@ -909,12 +909,10 @@ static int p54_set_filter(struct ieee80211_hw *dev, u16 filter_type,memset (filter->bssid, ~0 ,ETH_ALEN ); else memcpy(filter->bssid, bssid, ETH_ALEN); - filter->rx_antenna = priv->rx_antenna; -if (priv->fw_var <0x500 ) { data_len =P54_TX_CONTROL_FILTER_V1_LEN ; - filter->v1.basic_rate_mask =cpu_to_le32 (0x15F ); + filter->v1.basic_rate_mask =cpu_to_le32 (0x15f ); filter->v1.rx_addr =cpu_to_le32 (priv->rx_end); filter->v1.max_rx =cpu_to_le16 (priv->rx_mtu); filter->v1.rxhw =cpu_to_le16 (priv->rxhw);@@ -926,7 +924,6 @@ static int p54_set_filter(struct ieee80211_hw *dev, u16 filter_type, filter->v2.rxhw =cpu_to_le16 (priv->rxhw); filter->v2.timer =cpu_to_le16 (1000 ); } - hdr->len =cpu_to_le16 (data_len);p54_assign_address (dev,NULL , hdr,sizeof (*hdr) + data_len); priv->tx (dev, hdr,sizeof (*hdr) + data_len,1 );@@ -1096,7 +1093,7 @@ static void p54_set_vdcf(struct ieee80211_hw *dev) vdcf = (struct p54_tx_control_vdcf *) hdr->data; -if (dev->conf.flags &IEEE80211_CONF_SHORT_SLOT_TIME ) { +if (priv->use_short_slot) { vdcf->slottime =9 ; vdcf->magic1 =0x10 ; vdcf->magic2 =0x00 ;@@ -1143,7 +1140,6 @@ static int p54_start(struct ieee80211_hw *dev) priv->mode =NL80211_IFTYPE_MONITOR ;p54_init_vdcf (dev); -mod_timer (&priv->stats_timer, jiffies +HZ );return err; }@@ -1359,6 +1355,19 @@ static int p54_get_tx_stats(struct ieee80211_hw *dev,return 0 ; } +static void p54_bss_info_changed (struct ieee80211_hw *dev, +struct ieee80211_vif *vif, +struct ieee80211_bss_conf *info, +u32 changed) +{ +struct p54_common *priv = dev->priv; + +if (changed &BSS_CHANGED_ERP_SLOT ) { + priv->use_short_slot = info->use_short_slot; +p54_set_vdcf (dev); + } +} +static const struct ieee80211_ops p54_ops = { .tx = p54_tx, .start = p54_start,@@ -1367,6 +1376,7 @@ static const struct ieee80211_ops p54_ops = { .remove_interface = p54_remove_interface, .config = p54_config, .config_interface = p54_config_interface, + .bss_info_changed = p54_bss_info_changed, .configure_filter = p54_configure_filter, .conf_tx = p54_conf_tx, .get_stats = p54_get_stats,@@ -1393,7 +1403,6 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len) dev->wiphy->interface_modes =BIT (NL80211_IFTYPE_STATION ); dev->channel_change_time =1000 ;/* TODO: find actual value */ - priv->tx_stats[0 ].limit =1 ; priv->tx_stats[1 ].limit =1 ; priv->tx_stats[2 ].limit =1 ;