aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2007-12-28 08:32:58 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:09:43 -0500
commit471b3efdfccc257591331724145f8ccf8b3217e1 (patch)
treec9e576442c7b62c8c667ae1046e560323f0821fd /drivers
parent2bc454b0b30b3645d114689b64321cb49be99923 (diff)
mac80211: add unified BSS configuration
This patch (based on Ron Rindjunsky's) creates a framework for a unified way to pass BSS configuration to drivers that require the information, e.g. for implementing power save mode. This patch introduces new ieee80211_bss_conf structure that is passed to the driver via the new bss_info_changed() callback when the BSS configuration changes. This new BSS configuration infrastructure adds the following new features: * drivers are notified of their association AID * drivers are notified of association status and replaces the erp_ie_changed() callback. The patch also does the relevant driver updates for the latter change. Signed-off-by: Ron Rindjunsky <ron.rindjunsky@intel.com> Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl4965-base.c24
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00.h6
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c13
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00mac.c16
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c2
-rw-r--r--drivers/net/wireless/zd1211rw/zd_mac.c12
12 files changed, 57 insertions, 36 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
index a793cd11f738..77e7202c026b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
@@ -520,10 +520,8 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv,
520 break; 520 break;
521 521
522 /* 522 /*
523 * TODO: There is no callback function from upper 523 * TODO: Use the new callback function from
524 * stack to inform us when associated status. this 524 * mac80211 instead of sniffing these packets.
525 * work around to sniff assoc_resp management frame
526 * and finish the association process.
527 */ 525 */
528 case IEEE80211_STYPE_ASSOC_RESP: 526 case IEEE80211_STYPE_ASSOC_RESP:
529 case IEEE80211_STYPE_REASSOC_RESP:{ 527 case IEEE80211_STYPE_REASSOC_RESP:{
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index 89e2c44bfcca..ed3f119b56cd 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -4095,10 +4095,8 @@ static void iwl4965_rx_reply_rx(struct iwl4965_priv *priv,
4095 break; 4095 break;
4096 4096
4097 /* 4097 /*
4098 * TODO: There is no callback function from upper 4098 * TODO: Use the new callback function from
4099 * stack to inform us when associated status. this 4099 * mac80211 instead of sniffing these packets.
4100 * work around to sniff assoc_resp management frame
4101 * and finish the association process.
4102 */ 4100 */
4103 case IEEE80211_STYPE_ASSOC_RESP: 4101 case IEEE80211_STYPE_ASSOC_RESP:
4104 case IEEE80211_STYPE_REASSOC_RESP: 4102 case IEEE80211_STYPE_REASSOC_RESP:
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c
index 92bb7e13a1f0..2597c08a2395 100644
--- a/drivers/net/wireless/iwlwifi/iwl4965-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c
@@ -7764,25 +7764,35 @@ static void iwl4965_mac_remove_interface(struct ieee80211_hw *hw,
7764 IWL_DEBUG_MAC80211("leave\n"); 7764 IWL_DEBUG_MAC80211("leave\n");
7765 7765
7766} 7766}
7767static void iwl4965_mac_erp_ie_changed(struct ieee80211_hw *hw, 7767
7768 u8 changes, int cts_protection, int preamble) 7768static void iwl4965_bss_info_changed(struct ieee80211_hw *hw,
7769 struct ieee80211_vif *vif,
7770 struct ieee80211_bss_conf *bss_conf,
7771 u32 changes)
7769{ 7772{
7770 struct iwl4965_priv *priv = hw->priv; 7773 struct iwl4965_priv *priv = hw->priv;
7771 7774
7772 if (changes & IEEE80211_ERP_CHANGE_PREAMBLE) { 7775 if (changes & BSS_CHANGED_ERP_PREAMBLE) {
7773 if (preamble == WLAN_ERP_PREAMBLE_SHORT) 7776 if (bss_conf->use_short_preamble)
7774 priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; 7777 priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
7775 else 7778 else
7776 priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; 7779 priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
7777 } 7780 }
7778 7781
7779 if (changes & IEEE80211_ERP_CHANGE_PROTECTION) { 7782 if (changes & BSS_CHANGED_ERP_CTS_PROT) {
7780 if (cts_protection && (priv->phymode != MODE_IEEE80211A)) 7783 if (bss_conf->use_cts_prot && (priv->phymode != MODE_IEEE80211A))
7781 priv->staging_rxon.flags |= RXON_FLG_TGG_PROTECT_MSK; 7784 priv->staging_rxon.flags |= RXON_FLG_TGG_PROTECT_MSK;
7782 else 7785 else
7783 priv->staging_rxon.flags &= ~RXON_FLG_TGG_PROTECT_MSK; 7786 priv->staging_rxon.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
7784 } 7787 }
7785 7788
7789 if (changes & BSS_CHANGED_ASSOC) {
7790 /*
7791 * TODO:
7792 * do stuff instead of sniffing assoc resp
7793 */
7794 }
7795
7786 if (iwl4965_is_associated(priv)) 7796 if (iwl4965_is_associated(priv))
7787 iwl4965_send_rxon_assoc(priv); 7797 iwl4965_send_rxon_assoc(priv);
7788} 7798}
@@ -8952,7 +8962,7 @@ static struct ieee80211_ops iwl4965_hw_ops = {
8952 .get_tsf = iwl4965_mac_get_tsf, 8962 .get_tsf = iwl4965_mac_get_tsf,
8953 .reset_tsf = iwl4965_mac_reset_tsf, 8963 .reset_tsf = iwl4965_mac_reset_tsf,
8954 .beacon_update = iwl4965_mac_beacon_update, 8964 .beacon_update = iwl4965_mac_beacon_update,
8955 .erp_ie_changed = iwl4965_mac_erp_ie_changed, 8965 .bss_info_changed = iwl4965_bss_info_changed,
8956#ifdef CONFIG_IWL4965_HT 8966#ifdef CONFIG_IWL4965_HT
8957 .conf_ht = iwl4965_mac_conf_ht, 8967 .conf_ht = iwl4965_mac_conf_ht,
8958 .ampdu_action = iwl4965_mac_ampdu_action, 8968 .ampdu_action = iwl4965_mac_ampdu_action,
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index f4d0c779ac78..d6cba138c7ab 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1524,7 +1524,7 @@ static const struct ieee80211_ops rt2400pci_mac80211_ops = {
1524 .configure_filter = rt2400pci_configure_filter, 1524 .configure_filter = rt2400pci_configure_filter,
1525 .get_stats = rt2x00mac_get_stats, 1525 .get_stats = rt2x00mac_get_stats,
1526 .set_retry_limit = rt2400pci_set_retry_limit, 1526 .set_retry_limit = rt2400pci_set_retry_limit,
1527 .erp_ie_changed = rt2x00mac_erp_ie_changed, 1527 .bss_info_changed = rt2x00mac_bss_info_changed,
1528 .conf_tx = rt2400pci_conf_tx, 1528 .conf_tx = rt2400pci_conf_tx,
1529 .get_tx_stats = rt2x00mac_get_tx_stats, 1529 .get_tx_stats = rt2x00mac_get_tx_stats,
1530 .get_tsf = rt2400pci_get_tsf, 1530 .get_tsf = rt2400pci_get_tsf,
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 206b50ff831f..e874fdcae204 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1835,7 +1835,7 @@ static const struct ieee80211_ops rt2500pci_mac80211_ops = {
1835 .configure_filter = rt2500pci_configure_filter, 1835 .configure_filter = rt2500pci_configure_filter,
1836 .get_stats = rt2x00mac_get_stats, 1836 .get_stats = rt2x00mac_get_stats,
1837 .set_retry_limit = rt2500pci_set_retry_limit, 1837 .set_retry_limit = rt2500pci_set_retry_limit,
1838 .erp_ie_changed = rt2x00mac_erp_ie_changed, 1838 .bss_info_changed = rt2x00mac_bss_info_changed,
1839 .conf_tx = rt2x00mac_conf_tx, 1839 .conf_tx = rt2x00mac_conf_tx,
1840 .get_tx_stats = rt2x00mac_get_tx_stats, 1840 .get_tx_stats = rt2x00mac_get_tx_stats,
1841 .get_tsf = rt2500pci_get_tsf, 1841 .get_tsf = rt2500pci_get_tsf,
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 6579718f36ad..1933113d7baf 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1776,7 +1776,7 @@ static const struct ieee80211_ops rt2500usb_mac80211_ops = {
1776 .config_interface = rt2x00mac_config_interface, 1776 .config_interface = rt2x00mac_config_interface,
1777 .configure_filter = rt2500usb_configure_filter, 1777 .configure_filter = rt2500usb_configure_filter,
1778 .get_stats = rt2x00mac_get_stats, 1778 .get_stats = rt2x00mac_get_stats,
1779 .erp_ie_changed = rt2x00mac_erp_ie_changed, 1779 .bss_info_changed = rt2x00mac_bss_info_changed,
1780 .conf_tx = rt2x00mac_conf_tx, 1780 .conf_tx = rt2x00mac_conf_tx,
1781 .get_tx_stats = rt2x00mac_get_tx_stats, 1781 .get_tx_stats = rt2x00mac_get_tx_stats,
1782 .beacon_update = rt2500usb_beacon_update, 1782 .beacon_update = rt2500usb_beacon_update,
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 94a8a7ce5382..05927b908f80 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -936,8 +936,10 @@ int rt2x00mac_get_stats(struct ieee80211_hw *hw,
936 struct ieee80211_low_level_stats *stats); 936 struct ieee80211_low_level_stats *stats);
937int rt2x00mac_get_tx_stats(struct ieee80211_hw *hw, 937int rt2x00mac_get_tx_stats(struct ieee80211_hw *hw,
938 struct ieee80211_tx_queue_stats *stats); 938 struct ieee80211_tx_queue_stats *stats);
939void rt2x00mac_erp_ie_changed(struct ieee80211_hw *hw, u8 changes, 939void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
940 int cts_protection, int preamble); 940 struct ieee80211_vif *vif,
941 struct ieee80211_bss_conf *bss_conf,
942 u32 changes);
941int rt2x00mac_conf_tx(struct ieee80211_hw *hw, int queue, 943int rt2x00mac_conf_tx(struct ieee80211_hw *hw, int queue,
942 const struct ieee80211_tx_queue_params *params); 944 const struct ieee80211_tx_queue_params *params);
943 945
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index b26c634f210b..72cfe6f866f8 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -481,10 +481,17 @@ static void rt2x00lib_configuration_scheduled(struct work_struct *work)
481{ 481{
482 struct rt2x00_dev *rt2x00dev = 482 struct rt2x00_dev *rt2x00dev =
483 container_of(work, struct rt2x00_dev, config_work); 483 container_of(work, struct rt2x00_dev, config_work);
484 int preamble = !test_bit(CONFIG_SHORT_PREAMBLE, &rt2x00dev->flags); 484 struct ieee80211_bss_conf bss_conf;
485 485
486 rt2x00mac_erp_ie_changed(rt2x00dev->hw, 486 bss_conf.use_short_preamble =
487 IEEE80211_ERP_CHANGE_PREAMBLE, 0, preamble); 487 test_bit(CONFIG_SHORT_PREAMBLE, &rt2x00dev->flags);
488
489 /*
490 * FIXME: shouldn't invoke it this way because all other contents
491 * of bss_conf is invalid.
492 */
493 rt2x00mac_bss_info_changed(rt2x00dev->hw, rt2x00dev->interface.id,
494 &bss_conf, BSS_CHANGED_ERP_PREAMBLE);
488} 495}
489 496
490/* 497/*
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c
index 1d67bcd46bcb..e3f15e518c76 100644
--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
@@ -342,23 +342,27 @@ int rt2x00mac_get_tx_stats(struct ieee80211_hw *hw,
342} 342}
343EXPORT_SYMBOL_GPL(rt2x00mac_get_tx_stats); 343EXPORT_SYMBOL_GPL(rt2x00mac_get_tx_stats);
344 344
345void rt2x00mac_erp_ie_changed(struct ieee80211_hw *hw, u8 changes, 345void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
346 int cts_protection, int preamble) 346 struct ieee80211_vif *vif,
347 struct ieee80211_bss_conf *bss_conf,
348 u32 changes)
347{ 349{
348 struct rt2x00_dev *rt2x00dev = hw->priv; 350 struct rt2x00_dev *rt2x00dev = hw->priv;
349 int short_preamble; 351 int short_preamble;
350 int ack_timeout; 352 int ack_timeout;
351 int ack_consume_time; 353 int ack_consume_time;
352 int difs; 354 int difs;
355 int preamble;
353 356
354 /* 357 /*
355 * We only support changing preamble mode. 358 * We only support changing preamble mode.
356 */ 359 */
357 if (!(changes & IEEE80211_ERP_CHANGE_PREAMBLE)) 360 if (!(changes & BSS_CHANGED_ERP_PREAMBLE))
358 return; 361 return;
359 362
360 short_preamble = !preamble; 363 short_preamble = bss_conf->use_short_preamble;
361 preamble = !!(preamble) ? PREAMBLE : SHORT_PREAMBLE; 364 preamble = bss_conf->use_short_preamble ?
365 SHORT_PREAMBLE : PREAMBLE;
362 366
363 difs = (hw->conf.flags & IEEE80211_CONF_SHORT_SLOT_TIME) ? 367 difs = (hw->conf.flags & IEEE80211_CONF_SHORT_SLOT_TIME) ?
364 SHORT_DIFS : DIFS; 368 SHORT_DIFS : DIFS;
@@ -374,7 +378,7 @@ void rt2x00mac_erp_ie_changed(struct ieee80211_hw *hw, u8 changes,
374 rt2x00dev->ops->lib->config_preamble(rt2x00dev, short_preamble, 378 rt2x00dev->ops->lib->config_preamble(rt2x00dev, short_preamble,
375 ack_timeout, ack_consume_time); 379 ack_timeout, ack_consume_time);
376} 380}
377EXPORT_SYMBOL_GPL(rt2x00mac_erp_ie_changed); 381EXPORT_SYMBOL_GPL(rt2x00mac_bss_info_changed);
378 382
379int rt2x00mac_conf_tx(struct ieee80211_hw *hw, int queue, 383int rt2x00mac_conf_tx(struct ieee80211_hw *hw, int queue,
380 const struct ieee80211_tx_queue_params *params) 384 const struct ieee80211_tx_queue_params *params)
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 88d169800886..ab52f221cd71 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -2441,7 +2441,7 @@ static const struct ieee80211_ops rt61pci_mac80211_ops = {
2441 .configure_filter = rt61pci_configure_filter, 2441 .configure_filter = rt61pci_configure_filter,
2442 .get_stats = rt2x00mac_get_stats, 2442 .get_stats = rt2x00mac_get_stats,
2443 .set_retry_limit = rt61pci_set_retry_limit, 2443 .set_retry_limit = rt61pci_set_retry_limit,
2444 .erp_ie_changed = rt2x00mac_erp_ie_changed, 2444 .bss_info_changed = rt2x00mac_bss_info_changed,
2445 .conf_tx = rt2x00mac_conf_tx, 2445 .conf_tx = rt2x00mac_conf_tx,
2446 .get_tx_stats = rt2x00mac_get_tx_stats, 2446 .get_tx_stats = rt2x00mac_get_tx_stats,
2447 .get_tsf = rt61pci_get_tsf, 2447 .get_tsf = rt61pci_get_tsf,
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 47ed3070ae0b..f9518764aeb0 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -2024,7 +2024,7 @@ static const struct ieee80211_ops rt73usb_mac80211_ops = {
2024 .configure_filter = rt73usb_configure_filter, 2024 .configure_filter = rt73usb_configure_filter,
2025 .get_stats = rt2x00mac_get_stats, 2025 .get_stats = rt2x00mac_get_stats,
2026 .set_retry_limit = rt73usb_set_retry_limit, 2026 .set_retry_limit = rt73usb_set_retry_limit,
2027 .erp_ie_changed = rt2x00mac_erp_ie_changed, 2027 .bss_info_changed = rt2x00mac_bss_info_changed,
2028 .conf_tx = rt2x00mac_conf_tx, 2028 .conf_tx = rt2x00mac_conf_tx,
2029 .get_tx_stats = rt2x00mac_get_tx_stats, 2029 .get_tx_stats = rt2x00mac_get_tx_stats,
2030 .get_tsf = rt73usb_get_tsf, 2030 .get_tsf = rt73usb_get_tsf,
diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c
index 3409cf97f5f8..49127e4b42c2 100644
--- a/drivers/net/wireless/zd1211rw/zd_mac.c
+++ b/drivers/net/wireless/zd1211rw/zd_mac.c
@@ -849,17 +849,19 @@ static void set_rts_cts_work(struct work_struct *work)
849 mutex_unlock(&mac->chip.mutex); 849 mutex_unlock(&mac->chip.mutex);
850} 850}
851 851
852static void zd_op_erp_ie_changed(struct ieee80211_hw *hw, u8 changes, 852static void zd_op_bss_info_changed(struct ieee80211_hw *hw,
853 int cts_protection, int preamble) 853 struct ieee80211_vif *vif,
854 struct ieee80211_bss_conf *bss_conf,
855 u32 changes)
854{ 856{
855 struct zd_mac *mac = zd_hw_mac(hw); 857 struct zd_mac *mac = zd_hw_mac(hw);
856 unsigned long flags; 858 unsigned long flags;
857 859
858 dev_dbg_f(zd_mac_dev(mac), "changes: %x\n", changes); 860 dev_dbg_f(zd_mac_dev(mac), "changes: %x\n", changes);
859 861
860 if (changes & IEEE80211_ERP_CHANGE_PREAMBLE) { 862 if (changes & BSS_CHANGED_ERP_PREAMBLE) {
861 spin_lock_irqsave(&mac->lock, flags); 863 spin_lock_irqsave(&mac->lock, flags);
862 mac->short_preamble = !preamble; 864 mac->short_preamble = bss_conf->use_short_preamble;
863 if (!mac->updating_rts_rate) { 865 if (!mac->updating_rts_rate) {
864 mac->updating_rts_rate = 1; 866 mac->updating_rts_rate = 1;
865 /* FIXME: should disable TX here, until work has 867 /* FIXME: should disable TX here, until work has
@@ -879,7 +881,7 @@ static const struct ieee80211_ops zd_ops = {
879 .config = zd_op_config, 881 .config = zd_op_config,
880 .config_interface = zd_op_config_interface, 882 .config_interface = zd_op_config_interface,
881 .configure_filter = zd_op_configure_filter, 883 .configure_filter = zd_op_configure_filter,
882 .erp_ie_changed = zd_op_erp_ie_changed, 884 .bss_info_changed = zd_op_bss_info_changed,
883}; 885};
884 886
885struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf) 887struct ieee80211_hw *zd_mac_alloc_hw(struct usb_interface *intf)