aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/main.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-07-26 08:55:08 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-10-16 14:22:46 -0400
commitfe57d9f5c0a2c1ef97ba8cdc42cfda5743f287b8 (patch)
treea155a8bb9165b092703bec542aeaf0b707afa392 /net/mac80211/main.c
parente269d8600a8f6a9f2387b3f283bfb579a5479dc3 (diff)
mac80211: track whether to use channel contexts
Depending on the driver, channel contexts may be used or not. If they are used, the driver must have support for hardware scan and remain-on-channel; otherwise the driver must not advertise support for multiple channels. Also prohibit WDS type interfaces when channel contexts are to be used as there's no clear definition of which channel they use. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/main.c')
-rw-r--r--net/mac80211/main.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index d709a5d42f69..0dd1ea241c54 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -540,6 +540,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
540 struct ieee80211_local *local; 540 struct ieee80211_local *local;
541 int priv_size, i; 541 int priv_size, i;
542 struct wiphy *wiphy; 542 struct wiphy *wiphy;
543 bool use_chanctx;
543 544
544 if (WARN_ON(!ops->tx || !ops->start || !ops->stop || !ops->config || 545 if (WARN_ON(!ops->tx || !ops->start || !ops->stop || !ops->config ||
545 !ops->add_interface || !ops->remove_interface || 546 !ops->add_interface || !ops->remove_interface ||
@@ -555,6 +556,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
555 !!ops->unassign_vif_chanctx; 556 !!ops->unassign_vif_chanctx;
556 if (WARN_ON(i != 0 && i != 5)) 557 if (WARN_ON(i != 0 && i != 5))
557 return NULL; 558 return NULL;
559 use_chanctx = i == 5;
558 560
559 /* Ensure 32-byte alignment of our private data and hw private data. 561 /* Ensure 32-byte alignment of our private data and hw private data.
560 * We use the wiphy priv data for both our ieee80211_local and for 562 * We use the wiphy priv data for both our ieee80211_local and for
@@ -606,6 +608,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
606 local->hw.priv = (char *)local + ALIGN(sizeof(*local), NETDEV_ALIGN); 608 local->hw.priv = (char *)local + ALIGN(sizeof(*local), NETDEV_ALIGN);
607 609
608 local->ops = ops; 610 local->ops = ops;
611 local->use_chanctx = use_chanctx;
609 612
610 /* set up some defaults */ 613 /* set up some defaults */
611 local->hw.queues = 1; 614 local->hw.queues = 1;
@@ -729,6 +732,25 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
729 if ((hw->flags & IEEE80211_HW_SCAN_WHILE_IDLE) && !local->ops->hw_scan) 732 if ((hw->flags & IEEE80211_HW_SCAN_WHILE_IDLE) && !local->ops->hw_scan)
730 return -EINVAL; 733 return -EINVAL;
731 734
735 if (!local->use_chanctx) {
736 for (i = 0; i < local->hw.wiphy->n_iface_combinations; i++) {
737 const struct ieee80211_iface_combination *comb;
738
739 comb = &local->hw.wiphy->iface_combinations[i];
740
741 if (comb->num_different_channels > 1)
742 return -EINVAL;
743 }
744
745 /*
746 * WDS is currently prohibited when channel contexts are used
747 * because there's no clear definition of which channel WDS
748 * type interfaces use
749 */
750 if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_WDS))
751 return -EINVAL;
752 }
753
732 /* Only HW csum features are currently compatible with mac80211 */ 754 /* Only HW csum features are currently compatible with mac80211 */
733 feature_whitelist = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 755 feature_whitelist = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
734 NETIF_F_HW_CSUM; 756 NETIF_F_HW_CSUM;