aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-06-18 14:07:15 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-08-20 07:58:22 -0400
commitf142c6b906da451ded2c7a8e17b2a0e6fee3e891 (patch)
treeed23b88e0cc23cb15fa28563d27965421ed47dd7 /net
parent98104fdeda63d57631c9f89e90a7b83b58fcee40 (diff)
mac80211: support P2P Device abstraction
After cfg80211 got a P2P Device abstraction, add support to mac80211. Whether it really is supported or not will depend on whether or not the driver has support for it, but mac80211 needs to change to be able to support drivers that need a P2P Device. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/cfg.c18
-rw-r--r--net/mac80211/driver-ops.h2
-rw-r--r--net/mac80211/ieee80211_i.h4
-rw-r--r--net/mac80211/iface.c231
-rw-r--r--net/mac80211/main.c9
-rw-r--r--net/mac80211/offchannel.c6
-rw-r--r--net/mac80211/rx.c14
-rw-r--r--net/mac80211/status.c22
-rw-r--r--net/mac80211/trace.h2
-rw-r--r--net/mac80211/util.c14
10 files changed, 226 insertions, 96 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 8052a7ad03a6..69b322f6ca2e 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -102,6 +102,18 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
102 return 0; 102 return 0;
103} 103}
104 104
105static int ieee80211_start_p2p_device(struct wiphy *wiphy,
106 struct wireless_dev *wdev)
107{
108 return ieee80211_do_open(wdev, true);
109}
110
111static void ieee80211_stop_p2p_device(struct wiphy *wiphy,
112 struct wireless_dev *wdev)
113{
114 ieee80211_sdata_stop(IEEE80211_WDEV_TO_SUB_IF(wdev));
115}
116
105static int ieee80211_set_noack_map(struct wiphy *wiphy, 117static int ieee80211_set_noack_map(struct wiphy *wiphy,
106 struct net_device *dev, 118 struct net_device *dev,
107 u16 noack_map) 119 u16 noack_map)
@@ -1774,6 +1786,7 @@ static int ieee80211_scan(struct wiphy *wiphy,
1774 case NL80211_IFTYPE_ADHOC: 1786 case NL80211_IFTYPE_ADHOC:
1775 case NL80211_IFTYPE_MESH_POINT: 1787 case NL80211_IFTYPE_MESH_POINT:
1776 case NL80211_IFTYPE_P2P_CLIENT: 1788 case NL80211_IFTYPE_P2P_CLIENT:
1789 case NL80211_IFTYPE_P2P_DEVICE:
1777 break; 1790 break;
1778 case NL80211_IFTYPE_P2P_GO: 1791 case NL80211_IFTYPE_P2P_GO:
1779 if (sdata->local->ops->hw_scan) 1792 if (sdata->local->ops->hw_scan)
@@ -2461,6 +2474,9 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
2461 if (!sdata->u.mgd.associated) 2474 if (!sdata->u.mgd.associated)
2462 need_offchan = true; 2475 need_offchan = true;
2463 break; 2476 break;
2477 case NL80211_IFTYPE_P2P_DEVICE:
2478 need_offchan = true;
2479 break;
2464 default: 2480 default:
2465 return -EOPNOTSUPP; 2481 return -EOPNOTSUPP;
2466 } 2482 }
@@ -3013,6 +3029,8 @@ struct cfg80211_ops mac80211_config_ops = {
3013 .add_virtual_intf = ieee80211_add_iface, 3029 .add_virtual_intf = ieee80211_add_iface,
3014 .del_virtual_intf = ieee80211_del_iface, 3030 .del_virtual_intf = ieee80211_del_iface,
3015 .change_virtual_intf = ieee80211_change_iface, 3031 .change_virtual_intf = ieee80211_change_iface,
3032 .start_p2p_device = ieee80211_start_p2p_device,
3033 .stop_p2p_device = ieee80211_stop_p2p_device,
3016 .add_key = ieee80211_add_key, 3034 .add_key = ieee80211_add_key,
3017 .del_key = ieee80211_del_key, 3035 .del_key = ieee80211_del_key,
3018 .get_key = ieee80211_get_key, 3036 .get_key = ieee80211_get_key,
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index a81154d27291..da9003b20004 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -9,7 +9,7 @@ static inline void check_sdata_in_driver(struct ieee80211_sub_if_data *sdata)
9{ 9{
10 WARN(!(sdata->flags & IEEE80211_SDATA_IN_DRIVER), 10 WARN(!(sdata->flags & IEEE80211_SDATA_IN_DRIVER),
11 "%s: Failed check-sdata-in-driver check, flags: 0x%x\n", 11 "%s: Failed check-sdata-in-driver check, flags: 0x%x\n",
12 sdata->dev->name, sdata->flags); 12 sdata->dev ? sdata->dev->name : sdata->name, sdata->flags);
13} 13}
14 14
15static inline struct ieee80211_sub_if_data * 15static inline struct ieee80211_sub_if_data *
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 2a80698b6324..0b81fa807179 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1080,6 +1080,8 @@ struct ieee80211_local {
1080 struct idr ack_status_frames; 1080 struct idr ack_status_frames;
1081 spinlock_t ack_status_lock; 1081 spinlock_t ack_status_lock;
1082 1082
1083 struct ieee80211_sub_if_data __rcu *p2p_sdata;
1084
1083 /* dummy netdev for use w/ NAPI */ 1085 /* dummy netdev for use w/ NAPI */
1084 struct net_device napi_dev; 1086 struct net_device napi_dev;
1085 1087
@@ -1296,6 +1298,8 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local);
1296void ieee80211_recalc_idle(struct ieee80211_local *local); 1298void ieee80211_recalc_idle(struct ieee80211_local *local);
1297void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, 1299void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata,
1298 const int offset); 1300 const int offset);
1301int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up);
1302void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata);
1299 1303
1300static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) 1304static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata)
1301{ 1305{
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 366d9d3e84c4..152aeea14c85 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -100,6 +100,10 @@ static u32 __ieee80211_recalc_idle(struct ieee80211_local *local)
100 sdata->vif.bss_conf.idle = true; 100 sdata->vif.bss_conf.idle = true;
101 continue; 101 continue;
102 } 102 }
103
104 if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE)
105 continue;
106
103 /* count everything else */ 107 /* count everything else */
104 sdata->vif.bss_conf.idle = false; 108 sdata->vif.bss_conf.idle = false;
105 count++; 109 count++;
@@ -121,7 +125,8 @@ static u32 __ieee80211_recalc_idle(struct ieee80211_local *local)
121 125
122 list_for_each_entry(sdata, &local->interfaces, list) { 126 list_for_each_entry(sdata, &local->interfaces, list) {
123 if (sdata->vif.type == NL80211_IFTYPE_MONITOR || 127 if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
124 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 128 sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
129 sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE)
125 continue; 130 continue;
126 if (sdata->old_idle == sdata->vif.bss_conf.idle) 131 if (sdata->old_idle == sdata->vif.bss_conf.idle)
127 continue; 132 continue;
@@ -204,6 +209,8 @@ static inline int identical_mac_addr_allowed(int type1, int type2)
204{ 209{
205 return type1 == NL80211_IFTYPE_MONITOR || 210 return type1 == NL80211_IFTYPE_MONITOR ||
206 type2 == NL80211_IFTYPE_MONITOR || 211 type2 == NL80211_IFTYPE_MONITOR ||
212 type1 == NL80211_IFTYPE_P2P_DEVICE ||
213 type2 == NL80211_IFTYPE_P2P_DEVICE ||
207 (type1 == NL80211_IFTYPE_AP && type2 == NL80211_IFTYPE_WDS) || 214 (type1 == NL80211_IFTYPE_AP && type2 == NL80211_IFTYPE_WDS) ||
208 (type1 == NL80211_IFTYPE_WDS && 215 (type1 == NL80211_IFTYPE_WDS &&
209 (type2 == NL80211_IFTYPE_WDS || 216 (type2 == NL80211_IFTYPE_WDS ||
@@ -406,9 +413,10 @@ static void ieee80211_del_virtual_monitor(struct ieee80211_local *local)
406 * an error on interface type changes that have been pre-checked, so most 413 * an error on interface type changes that have been pre-checked, so most
407 * checks should be in ieee80211_check_concurrent_iface. 414 * checks should be in ieee80211_check_concurrent_iface.
408 */ 415 */
409static int ieee80211_do_open(struct net_device *dev, bool coming_up) 416int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
410{ 417{
411 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 418 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
419 struct net_device *dev = wdev->netdev;
412 struct ieee80211_local *local = sdata->local; 420 struct ieee80211_local *local = sdata->local;
413 struct sta_info *sta; 421 struct sta_info *sta;
414 u32 changed = 0; 422 u32 changed = 0;
@@ -443,13 +451,13 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
443 case NL80211_IFTYPE_STATION: 451 case NL80211_IFTYPE_STATION:
444 case NL80211_IFTYPE_MONITOR: 452 case NL80211_IFTYPE_MONITOR:
445 case NL80211_IFTYPE_ADHOC: 453 case NL80211_IFTYPE_ADHOC:
454 case NL80211_IFTYPE_P2P_DEVICE:
446 /* no special treatment */ 455 /* no special treatment */
447 break; 456 break;
448 case NL80211_IFTYPE_UNSPECIFIED: 457 case NL80211_IFTYPE_UNSPECIFIED:
449 case NUM_NL80211_IFTYPES: 458 case NUM_NL80211_IFTYPES:
450 case NL80211_IFTYPE_P2P_CLIENT: 459 case NL80211_IFTYPE_P2P_CLIENT:
451 case NL80211_IFTYPE_P2P_GO: 460 case NL80211_IFTYPE_P2P_GO:
452 case NL80211_IFTYPE_P2P_DEVICE:
453 /* cannot happen */ 461 /* cannot happen */
454 WARN_ON(1); 462 WARN_ON(1);
455 break; 463 break;
@@ -472,7 +480,7 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
472 * Copy the hopefully now-present MAC address to 480 * Copy the hopefully now-present MAC address to
473 * this interface, if it has the special null one. 481 * this interface, if it has the special null one.
474 */ 482 */
475 if (is_zero_ether_addr(dev->dev_addr)) { 483 if (dev && is_zero_ether_addr(dev->dev_addr)) {
476 memcpy(dev->dev_addr, 484 memcpy(dev->dev_addr,
477 local->hw.wiphy->perm_addr, 485 local->hw.wiphy->perm_addr,
478 ETH_ALEN); 486 ETH_ALEN);
@@ -537,7 +545,8 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
537 local->fif_probe_req++; 545 local->fif_probe_req++;
538 } 546 }
539 547
540 changed |= ieee80211_reset_erp_info(sdata); 548 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE)
549 changed |= ieee80211_reset_erp_info(sdata);
541 ieee80211_bss_info_change_notify(sdata, changed); 550 ieee80211_bss_info_change_notify(sdata, changed);
542 551
543 switch (sdata->vif.type) { 552 switch (sdata->vif.type) {
@@ -548,6 +557,7 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
548 netif_carrier_off(dev); 557 netif_carrier_off(dev);
549 break; 558 break;
550 case NL80211_IFTYPE_WDS: 559 case NL80211_IFTYPE_WDS:
560 case NL80211_IFTYPE_P2P_DEVICE:
551 break; 561 break;
552 default: 562 default:
553 netif_carrier_on(dev); 563 netif_carrier_on(dev);
@@ -584,6 +594,8 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
584 594
585 rate_control_rate_init(sta); 595 rate_control_rate_init(sta);
586 netif_carrier_on(dev); 596 netif_carrier_on(dev);
597 } else if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) {
598 rcu_assign_pointer(local->p2p_sdata, sdata);
587 } 599 }
588 600
589 /* 601 /*
@@ -609,7 +621,8 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
609 621
610 ieee80211_recalc_ps(local, -1); 622 ieee80211_recalc_ps(local, -1);
611 623
612 netif_tx_start_all_queues(dev); 624 if (dev)
625 netif_tx_start_all_queues(dev);
613 626
614 return 0; 627 return 0;
615 err_del_interface: 628 err_del_interface:
@@ -639,7 +652,7 @@ static int ieee80211_open(struct net_device *dev)
639 if (err) 652 if (err)
640 return err; 653 return err;
641 654
642 return ieee80211_do_open(dev, true); 655 return ieee80211_do_open(&sdata->wdev, true);
643} 656}
644 657
645static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, 658static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
@@ -660,7 +673,8 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
660 /* 673 /*
661 * Stop TX on this interface first. 674 * Stop TX on this interface first.
662 */ 675 */
663 netif_tx_stop_all_queues(sdata->dev); 676 if (sdata->dev)
677 netif_tx_stop_all_queues(sdata->dev);
664 678
665 ieee80211_roc_purge(sdata); 679 ieee80211_roc_purge(sdata);
666 680
@@ -699,14 +713,16 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
699 local->fif_probe_req--; 713 local->fif_probe_req--;
700 } 714 }
701 715
702 netif_addr_lock_bh(sdata->dev); 716 if (sdata->dev) {
703 spin_lock_bh(&local->filter_lock); 717 netif_addr_lock_bh(sdata->dev);
704 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, 718 spin_lock_bh(&local->filter_lock);
705 sdata->dev->addr_len); 719 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc,
706 spin_unlock_bh(&local->filter_lock); 720 sdata->dev->addr_len);
707 netif_addr_unlock_bh(sdata->dev); 721 spin_unlock_bh(&local->filter_lock);
722 netif_addr_unlock_bh(sdata->dev);
708 723
709 ieee80211_configure_filter(local); 724 ieee80211_configure_filter(local);
725 }
710 726
711 del_timer_sync(&local->dynamic_ps_timer); 727 del_timer_sync(&local->dynamic_ps_timer);
712 cancel_work_sync(&local->dynamic_ps_enable_work); 728 cancel_work_sync(&local->dynamic_ps_enable_work);
@@ -767,6 +783,10 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
767 ieee80211_adjust_monitor_flags(sdata, -1); 783 ieee80211_adjust_monitor_flags(sdata, -1);
768 ieee80211_configure_filter(local); 784 ieee80211_configure_filter(local);
769 break; 785 break;
786 case NL80211_IFTYPE_P2P_DEVICE:
787 /* relies on synchronize_rcu() below */
788 rcu_assign_pointer(local->p2p_sdata, NULL);
789 /* fall through */
770 default: 790 default:
771 flush_work(&sdata->work); 791 flush_work(&sdata->work);
772 /* 792 /*
@@ -877,9 +897,8 @@ static void ieee80211_set_multicast_list(struct net_device *dev)
877 * Called when the netdev is removed or, by the code below, before 897 * Called when the netdev is removed or, by the code below, before
878 * the interface type changes. 898 * the interface type changes.
879 */ 899 */
880static void ieee80211_teardown_sdata(struct net_device *dev) 900static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata)
881{ 901{
882 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
883 struct ieee80211_local *local = sdata->local; 902 struct ieee80211_local *local = sdata->local;
884 int flushed; 903 int flushed;
885 int i; 904 int i;
@@ -900,6 +919,11 @@ static void ieee80211_teardown_sdata(struct net_device *dev)
900 WARN_ON(flushed); 919 WARN_ON(flushed);
901} 920}
902 921
922static void ieee80211_uninit(struct net_device *dev)
923{
924 ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
925}
926
903static u16 ieee80211_netdev_select_queue(struct net_device *dev, 927static u16 ieee80211_netdev_select_queue(struct net_device *dev,
904 struct sk_buff *skb) 928 struct sk_buff *skb)
905{ 929{
@@ -909,7 +933,7 @@ static u16 ieee80211_netdev_select_queue(struct net_device *dev,
909static const struct net_device_ops ieee80211_dataif_ops = { 933static const struct net_device_ops ieee80211_dataif_ops = {
910 .ndo_open = ieee80211_open, 934 .ndo_open = ieee80211_open,
911 .ndo_stop = ieee80211_stop, 935 .ndo_stop = ieee80211_stop,
912 .ndo_uninit = ieee80211_teardown_sdata, 936 .ndo_uninit = ieee80211_uninit,
913 .ndo_start_xmit = ieee80211_subif_start_xmit, 937 .ndo_start_xmit = ieee80211_subif_start_xmit,
914 .ndo_set_rx_mode = ieee80211_set_multicast_list, 938 .ndo_set_rx_mode = ieee80211_set_multicast_list,
915 .ndo_change_mtu = ieee80211_change_mtu, 939 .ndo_change_mtu = ieee80211_change_mtu,
@@ -940,7 +964,7 @@ static u16 ieee80211_monitor_select_queue(struct net_device *dev,
940static const struct net_device_ops ieee80211_monitorif_ops = { 964static const struct net_device_ops ieee80211_monitorif_ops = {
941 .ndo_open = ieee80211_open, 965 .ndo_open = ieee80211_open,
942 .ndo_stop = ieee80211_stop, 966 .ndo_stop = ieee80211_stop,
943 .ndo_uninit = ieee80211_teardown_sdata, 967 .ndo_uninit = ieee80211_uninit,
944 .ndo_start_xmit = ieee80211_monitor_start_xmit, 968 .ndo_start_xmit = ieee80211_monitor_start_xmit,
945 .ndo_set_rx_mode = ieee80211_set_multicast_list, 969 .ndo_set_rx_mode = ieee80211_set_multicast_list,
946 .ndo_change_mtu = ieee80211_change_mtu, 970 .ndo_change_mtu = ieee80211_change_mtu,
@@ -1099,7 +1123,6 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
1099 /* and set some type-dependent values */ 1123 /* and set some type-dependent values */
1100 sdata->vif.type = type; 1124 sdata->vif.type = type;
1101 sdata->vif.p2p = false; 1125 sdata->vif.p2p = false;
1102 sdata->dev->netdev_ops = &ieee80211_dataif_ops;
1103 sdata->wdev.iftype = type; 1126 sdata->wdev.iftype = type;
1104 1127
1105 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); 1128 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE);
@@ -1107,8 +1130,11 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
1107 1130
1108 sdata->noack_map = 0; 1131 sdata->noack_map = 0;
1109 1132
1110 /* only monitor differs */ 1133 /* only monitor/p2p-device differ */
1111 sdata->dev->type = ARPHRD_ETHER; 1134 if (sdata->dev) {
1135 sdata->dev->netdev_ops = &ieee80211_dataif_ops;
1136 sdata->dev->type = ARPHRD_ETHER;
1137 }
1112 1138
1113 skb_queue_head_init(&sdata->skb_queue); 1139 skb_queue_head_init(&sdata->skb_queue);
1114 INIT_WORK(&sdata->work, ieee80211_iface_work); 1140 INIT_WORK(&sdata->work, ieee80211_iface_work);
@@ -1146,9 +1172,8 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
1146 break; 1172 break;
1147 case NL80211_IFTYPE_WDS: 1173 case NL80211_IFTYPE_WDS:
1148 case NL80211_IFTYPE_AP_VLAN: 1174 case NL80211_IFTYPE_AP_VLAN:
1149 break;
1150 case NL80211_IFTYPE_P2P_DEVICE: 1175 case NL80211_IFTYPE_P2P_DEVICE:
1151 /* not yet supported */ 1176 break;
1152 case NL80211_IFTYPE_UNSPECIFIED: 1177 case NL80211_IFTYPE_UNSPECIFIED:
1153 case NUM_NL80211_IFTYPES: 1178 case NUM_NL80211_IFTYPES:
1154 BUG(); 1179 BUG();
@@ -1215,7 +1240,7 @@ static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
1215 1240
1216 ieee80211_do_stop(sdata, false); 1241 ieee80211_do_stop(sdata, false);
1217 1242
1218 ieee80211_teardown_sdata(sdata->dev); 1243 ieee80211_teardown_sdata(sdata);
1219 1244
1220 ret = drv_change_interface(local, sdata, internal_type, p2p); 1245 ret = drv_change_interface(local, sdata, internal_type, p2p);
1221 if (ret) 1246 if (ret)
@@ -1230,7 +1255,7 @@ static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
1230 1255
1231 ieee80211_setup_sdata(sdata, type); 1256 ieee80211_setup_sdata(sdata, type);
1232 1257
1233 err = ieee80211_do_open(sdata->dev, false); 1258 err = ieee80211_do_open(&sdata->wdev, false);
1234 WARN(err, "type change: do_open returned %d", err); 1259 WARN(err, "type change: do_open returned %d", err);
1235 1260
1236 return ret; 1261 return ret;
@@ -1257,7 +1282,7 @@ int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
1257 return ret; 1282 return ret;
1258 } else { 1283 } else {
1259 /* Purge and reset type-dependent state. */ 1284 /* Purge and reset type-dependent state. */
1260 ieee80211_teardown_sdata(sdata->dev); 1285 ieee80211_teardown_sdata(sdata);
1261 ieee80211_setup_sdata(sdata, type); 1286 ieee80211_setup_sdata(sdata, type);
1262 } 1287 }
1263 1288
@@ -1273,8 +1298,7 @@ int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
1273} 1298}
1274 1299
1275static void ieee80211_assign_perm_addr(struct ieee80211_local *local, 1300static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
1276 struct net_device *dev, 1301 u8 *perm_addr, enum nl80211_iftype type)
1277 enum nl80211_iftype type)
1278{ 1302{
1279 struct ieee80211_sub_if_data *sdata; 1303 struct ieee80211_sub_if_data *sdata;
1280 u64 mask, start, addr, val, inc; 1304 u64 mask, start, addr, val, inc;
@@ -1283,7 +1307,7 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
1283 int i; 1307 int i;
1284 1308
1285 /* default ... something at least */ 1309 /* default ... something at least */
1286 memcpy(dev->perm_addr, local->hw.wiphy->perm_addr, ETH_ALEN); 1310 memcpy(perm_addr, local->hw.wiphy->perm_addr, ETH_ALEN);
1287 1311
1288 if (is_zero_ether_addr(local->hw.wiphy->addr_mask) && 1312 if (is_zero_ether_addr(local->hw.wiphy->addr_mask) &&
1289 local->hw.wiphy->n_addresses <= 1) 1313 local->hw.wiphy->n_addresses <= 1)
@@ -1302,7 +1326,7 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
1302 list_for_each_entry(sdata, &local->interfaces, list) { 1326 list_for_each_entry(sdata, &local->interfaces, list) {
1303 if (sdata->vif.type != NL80211_IFTYPE_AP) 1327 if (sdata->vif.type != NL80211_IFTYPE_AP)
1304 continue; 1328 continue;
1305 memcpy(dev->perm_addr, sdata->vif.addr, ETH_ALEN); 1329 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN);
1306 break; 1330 break;
1307 } 1331 }
1308 /* keep default if no AP interface present */ 1332 /* keep default if no AP interface present */
@@ -1321,7 +1345,7 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
1321 } 1345 }
1322 1346
1323 if (!used) { 1347 if (!used) {
1324 memcpy(dev->perm_addr, 1348 memcpy(perm_addr,
1325 local->hw.wiphy->addresses[i].addr, 1349 local->hw.wiphy->addresses[i].addr,
1326 ETH_ALEN); 1350 ETH_ALEN);
1327 break; 1351 break;
@@ -1372,7 +1396,7 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
1372 } 1396 }
1373 1397
1374 if (!used) { 1398 if (!used) {
1375 memcpy(dev->perm_addr, tmp_addr, ETH_ALEN); 1399 memcpy(perm_addr, tmp_addr, ETH_ALEN);
1376 break; 1400 break;
1377 } 1401 }
1378 addr = (start & ~mask) | (val & mask); 1402 addr = (start & ~mask) | (val & mask);
@@ -1388,49 +1412,68 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
1388 struct wireless_dev **new_wdev, enum nl80211_iftype type, 1412 struct wireless_dev **new_wdev, enum nl80211_iftype type,
1389 struct vif_params *params) 1413 struct vif_params *params)
1390{ 1414{
1391 struct net_device *ndev; 1415 struct net_device *ndev = NULL;
1392 struct ieee80211_sub_if_data *sdata = NULL; 1416 struct ieee80211_sub_if_data *sdata = NULL;
1393 int ret, i; 1417 int ret, i;
1394 int txqs = 1; 1418 int txqs = 1;
1395 1419
1396 ASSERT_RTNL(); 1420 ASSERT_RTNL();
1397 1421
1398 if (local->hw.queues >= IEEE80211_NUM_ACS) 1422 if (type == NL80211_IFTYPE_P2P_DEVICE) {
1399 txqs = IEEE80211_NUM_ACS; 1423 struct wireless_dev *wdev;
1400 1424
1401 ndev = alloc_netdev_mqs(sizeof(*sdata) + local->hw.vif_data_size, 1425 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size,
1402 name, ieee80211_if_setup, txqs, 1); 1426 GFP_KERNEL);
1403 if (!ndev) 1427 if (!sdata)
1404 return -ENOMEM; 1428 return -ENOMEM;
1405 dev_net_set(ndev, wiphy_net(local->hw.wiphy)); 1429 wdev = &sdata->wdev;
1406 1430
1407 ndev->needed_headroom = local->tx_headroom + 1431 sdata->dev = NULL;
1408 4*6 /* four MAC addresses */ 1432 strlcpy(sdata->name, name, IFNAMSIZ);
1409 + 2 + 2 + 2 + 2 /* ctl, dur, seq, qos */ 1433 ieee80211_assign_perm_addr(local, wdev->address, type);
1410 + 6 /* mesh */ 1434 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN);
1411 + 8 /* rfc1042/bridge tunnel */ 1435 } else {
1412 - ETH_HLEN /* ethernet hard_header_len */ 1436 if (local->hw.queues >= IEEE80211_NUM_ACS)
1413 + IEEE80211_ENCRYPT_HEADROOM; 1437 txqs = IEEE80211_NUM_ACS;
1414 ndev->needed_tailroom = IEEE80211_ENCRYPT_TAILROOM; 1438
1415 1439 ndev = alloc_netdev_mqs(sizeof(*sdata) +
1416 ret = dev_alloc_name(ndev, ndev->name); 1440 local->hw.vif_data_size,
1417 if (ret < 0) 1441 name, ieee80211_if_setup, txqs, 1);
1418 goto fail; 1442 if (!ndev)
1419 1443 return -ENOMEM;
1420 ieee80211_assign_perm_addr(local, ndev, type); 1444 dev_net_set(ndev, wiphy_net(local->hw.wiphy));
1421 memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN); 1445
1422 SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); 1446 ndev->needed_headroom = local->tx_headroom +
1423 1447 4*6 /* four MAC addresses */
1424 /* don't use IEEE80211_DEV_TO_SUB_IF because it checks too much */ 1448 + 2 + 2 + 2 + 2 /* ctl, dur, seq, qos */
1425 sdata = netdev_priv(ndev); 1449 + 6 /* mesh */
1426 ndev->ieee80211_ptr = &sdata->wdev; 1450 + 8 /* rfc1042/bridge tunnel */
1427 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); 1451 - ETH_HLEN /* ethernet hard_header_len */
1428 memcpy(sdata->name, ndev->name, IFNAMSIZ); 1452 + IEEE80211_ENCRYPT_HEADROOM;
1453 ndev->needed_tailroom = IEEE80211_ENCRYPT_TAILROOM;
1454
1455 ret = dev_alloc_name(ndev, ndev->name);
1456 if (ret < 0) {
1457 free_netdev(ndev);
1458 return ret;
1459 }
1460
1461 ieee80211_assign_perm_addr(local, ndev->perm_addr, type);
1462 memcpy(ndev->dev_addr, ndev->perm_addr, ETH_ALEN);
1463 SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy));
1464
1465 /* don't use IEEE80211_DEV_TO_SUB_IF -- it checks too much */
1466 sdata = netdev_priv(ndev);
1467 ndev->ieee80211_ptr = &sdata->wdev;
1468 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN);
1469 memcpy(sdata->name, ndev->name, IFNAMSIZ);
1470
1471 sdata->dev = ndev;
1472 }
1429 1473
1430 /* initialise type-independent data */ 1474 /* initialise type-independent data */
1431 sdata->wdev.wiphy = local->hw.wiphy; 1475 sdata->wdev.wiphy = local->hw.wiphy;
1432 sdata->local = local; 1476 sdata->local = local;
1433 sdata->dev = ndev;
1434#ifdef CONFIG_INET 1477#ifdef CONFIG_INET
1435 sdata->arp_filter_state = true; 1478 sdata->arp_filter_state = true;
1436#endif 1479#endif
@@ -1459,17 +1502,21 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
1459 /* setup type-dependent data */ 1502 /* setup type-dependent data */
1460 ieee80211_setup_sdata(sdata, type); 1503 ieee80211_setup_sdata(sdata, type);
1461 1504
1462 if (params) { 1505 if (ndev) {
1463 ndev->ieee80211_ptr->use_4addr = params->use_4addr; 1506 if (params) {
1464 if (type == NL80211_IFTYPE_STATION) 1507 ndev->ieee80211_ptr->use_4addr = params->use_4addr;
1465 sdata->u.mgd.use_4addr = params->use_4addr; 1508 if (type == NL80211_IFTYPE_STATION)
1466 } 1509 sdata->u.mgd.use_4addr = params->use_4addr;
1510 }
1467 1511
1468 ndev->features |= local->hw.netdev_features; 1512 ndev->features |= local->hw.netdev_features;
1469 1513
1470 ret = register_netdevice(ndev); 1514 ret = register_netdevice(ndev);
1471 if (ret) 1515 if (ret) {
1472 goto fail; 1516 free_netdev(ndev);
1517 return ret;
1518 }
1519 }
1473 1520
1474 mutex_lock(&local->iflist_mtx); 1521 mutex_lock(&local->iflist_mtx);
1475 list_add_tail_rcu(&sdata->list, &local->interfaces); 1522 list_add_tail_rcu(&sdata->list, &local->interfaces);
@@ -1479,10 +1526,6 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
1479 *new_wdev = &sdata->wdev; 1526 *new_wdev = &sdata->wdev;
1480 1527
1481 return 0; 1528 return 0;
1482
1483 fail:
1484 free_netdev(ndev);
1485 return ret;
1486} 1529}
1487 1530
1488void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) 1531void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata)
@@ -1494,7 +1537,21 @@ void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata)
1494 mutex_unlock(&sdata->local->iflist_mtx); 1537 mutex_unlock(&sdata->local->iflist_mtx);
1495 1538
1496 synchronize_rcu(); 1539 synchronize_rcu();
1497 unregister_netdevice(sdata->dev); 1540
1541 if (sdata->dev) {
1542 unregister_netdevice(sdata->dev);
1543 } else {
1544 cfg80211_unregister_wdev(&sdata->wdev);
1545 kfree(sdata);
1546 }
1547}
1548
1549void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata)
1550{
1551 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state)))
1552 return;
1553 ieee80211_do_stop(sdata, true);
1554 ieee80211_teardown_sdata(sdata);
1498} 1555}
1499 1556
1500/* 1557/*
@@ -1505,6 +1562,7 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local)
1505{ 1562{
1506 struct ieee80211_sub_if_data *sdata, *tmp; 1563 struct ieee80211_sub_if_data *sdata, *tmp;
1507 LIST_HEAD(unreg_list); 1564 LIST_HEAD(unreg_list);
1565 LIST_HEAD(wdev_list);
1508 1566
1509 ASSERT_RTNL(); 1567 ASSERT_RTNL();
1510 1568
@@ -1512,11 +1570,20 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local)
1512 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { 1570 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
1513 list_del(&sdata->list); 1571 list_del(&sdata->list);
1514 1572
1515 unregister_netdevice_queue(sdata->dev, &unreg_list); 1573 if (sdata->dev)
1574 unregister_netdevice_queue(sdata->dev, &unreg_list);
1575 else
1576 list_add(&sdata->list, &wdev_list);
1516 } 1577 }
1517 mutex_unlock(&local->iflist_mtx); 1578 mutex_unlock(&local->iflist_mtx);
1518 unregister_netdevice_many(&unreg_list); 1579 unregister_netdevice_many(&unreg_list);
1519 list_del(&unreg_list); 1580 list_del(&unreg_list);
1581
1582 list_for_each_entry_safe(sdata, tmp, &wdev_list, list) {
1583 list_del(&sdata->list);
1584 cfg80211_unregister_wdev(&sdata->wdev);
1585 kfree(sdata);
1586 }
1520} 1587}
1521 1588
1522static int netdev_notify(struct notifier_block *nb, 1589static int netdev_notify(struct notifier_block *nb,
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index c26e231c733a..e706f9e5b051 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -207,6 +207,10 @@ void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
207 sdata->vif.bss_conf.bssid = NULL; 207 sdata->vif.bss_conf.bssid = NULL;
208 else if (ieee80211_vif_is_mesh(&sdata->vif)) { 208 else if (ieee80211_vif_is_mesh(&sdata->vif)) {
209 sdata->vif.bss_conf.bssid = zero; 209 sdata->vif.bss_conf.bssid = zero;
210 } else if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) {
211 sdata->vif.bss_conf.bssid = sdata->vif.addr;
212 WARN_ONCE(changed & ~(BSS_CHANGED_IDLE),
213 "P2P Device BSS changed %#x", changed);
210 } else { 214 } else {
211 WARN_ON(1); 215 WARN_ON(1);
212 return; 216 return;
@@ -514,6 +518,11 @@ ieee80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = {
514 BIT(IEEE80211_STYPE_AUTH >> 4) | 518 BIT(IEEE80211_STYPE_AUTH >> 4) |
515 BIT(IEEE80211_STYPE_DEAUTH >> 4), 519 BIT(IEEE80211_STYPE_DEAUTH >> 4),
516 }, 520 },
521 [NL80211_IFTYPE_P2P_DEVICE] = {
522 .tx = 0xffff,
523 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
524 BIT(IEEE80211_STYPE_PROBE_REQ >> 4),
525 },
517}; 526};
518 527
519static const struct ieee80211_ht_cap mac80211_ht_capa_mod_mask = { 528static const struct ieee80211_ht_cap mac80211_ht_capa_mod_mask = {
diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
index 635c3250c668..507121dad082 100644
--- a/net/mac80211/offchannel.c
+++ b/net/mac80211/offchannel.c
@@ -116,6 +116,9 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local,
116 if (!ieee80211_sdata_running(sdata)) 116 if (!ieee80211_sdata_running(sdata))
117 continue; 117 continue;
118 118
119 if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE)
120 continue;
121
119 if (sdata->vif.type != NL80211_IFTYPE_MONITOR) 122 if (sdata->vif.type != NL80211_IFTYPE_MONITOR)
120 set_bit(SDATA_STATE_OFFCHANNEL, &sdata->state); 123 set_bit(SDATA_STATE_OFFCHANNEL, &sdata->state);
121 124
@@ -144,6 +147,9 @@ void ieee80211_offchannel_return(struct ieee80211_local *local,
144 147
145 mutex_lock(&local->iflist_mtx); 148 mutex_lock(&local->iflist_mtx);
146 list_for_each_entry(sdata, &local->interfaces, list) { 149 list_for_each_entry(sdata, &local->interfaces, list) {
150 if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE)
151 continue;
152
147 if (sdata->vif.type != NL80211_IFTYPE_MONITOR) 153 if (sdata->vif.type != NL80211_IFTYPE_MONITOR)
148 clear_bit(SDATA_STATE_OFFCHANNEL, &sdata->state); 154 clear_bit(SDATA_STATE_OFFCHANNEL, &sdata->state);
149 155
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 78bf6c7e80c8..f5258ebc15be 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -2812,8 +2812,7 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
2812 if (!bssid) { 2812 if (!bssid) {
2813 if (!ether_addr_equal(sdata->vif.addr, hdr->addr1)) 2813 if (!ether_addr_equal(sdata->vif.addr, hdr->addr1))
2814 return 0; 2814 return 0;
2815 } else if (!ieee80211_bssid_match(bssid, 2815 } else if (!ieee80211_bssid_match(bssid, sdata->vif.addr)) {
2816 sdata->vif.addr)) {
2817 /* 2816 /*
2818 * Accept public action frames even when the 2817 * Accept public action frames even when the
2819 * BSSID doesn't match, this is used for P2P 2818 * BSSID doesn't match, this is used for P2P
@@ -2833,9 +2832,18 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
2833 if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2)) 2832 if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2))
2834 return 0; 2833 return 0;
2835 break; 2834 break;
2835 case NL80211_IFTYPE_P2P_DEVICE:
2836 if (!ieee80211_is_public_action(hdr, skb->len) &&
2837 !ieee80211_is_probe_req(hdr->frame_control) &&
2838 !ieee80211_is_probe_resp(hdr->frame_control) &&
2839 !ieee80211_is_beacon(hdr->frame_control))
2840 return 0;
2841 if (!ether_addr_equal(sdata->vif.addr, hdr->addr1))
2842 status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
2843 break;
2836 default: 2844 default:
2837 /* should never get here */ 2845 /* should never get here */
2838 WARN_ON(1); 2846 WARN_ON_ONCE(1);
2839 break; 2847 break;
2840 } 2848 }
2841 2849
diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index 8cd72914cdaf..b0801b7d572d 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -519,19 +519,27 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
519 u64 cookie = (unsigned long)skb; 519 u64 cookie = (unsigned long)skb;
520 acked = info->flags & IEEE80211_TX_STAT_ACK; 520 acked = info->flags & IEEE80211_TX_STAT_ACK;
521 521
522 /*
523 * TODO: When we have non-netdev frame TX,
524 * we cannot use skb->dev->ieee80211_ptr
525 */
526
527 if (ieee80211_is_nullfunc(hdr->frame_control) || 522 if (ieee80211_is_nullfunc(hdr->frame_control) ||
528 ieee80211_is_qos_nullfunc(hdr->frame_control)) 523 ieee80211_is_qos_nullfunc(hdr->frame_control)) {
529 cfg80211_probe_status(skb->dev, hdr->addr1, 524 cfg80211_probe_status(skb->dev, hdr->addr1,
530 cookie, acked, GFP_ATOMIC); 525 cookie, acked, GFP_ATOMIC);
531 else 526 } else if (skb->dev) {
532 cfg80211_mgmt_tx_status( 527 cfg80211_mgmt_tx_status(
533 skb->dev->ieee80211_ptr, cookie, skb->data, 528 skb->dev->ieee80211_ptr, cookie, skb->data,
534 skb->len, acked, GFP_ATOMIC); 529 skb->len, acked, GFP_ATOMIC);
530 } else {
531 struct ieee80211_sub_if_data *p2p_sdata;
532
533 rcu_read_lock();
534
535 p2p_sdata = rcu_dereference(local->p2p_sdata);
536 if (p2p_sdata) {
537 cfg80211_mgmt_tx_status(
538 &p2p_sdata->wdev, cookie, skb->data,
539 skb->len, acked, GFP_ATOMIC);
540 }
541 rcu_read_unlock();
542 }
535 } 543 }
536 544
537 if (unlikely(info->ack_frame_id)) { 545 if (unlikely(info->ack_frame_id)) {
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index c6d33b55b2df..65e9a2a1a3e1 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -24,7 +24,7 @@
24 __string(vif_name, sdata->dev ? sdata->dev->name : "<nodev>") 24 __string(vif_name, sdata->dev ? sdata->dev->name : "<nodev>")
25#define VIF_ASSIGN __entry->vif_type = sdata->vif.type; __entry->sdata = sdata; \ 25#define VIF_ASSIGN __entry->vif_type = sdata->vif.type; __entry->sdata = sdata; \
26 __entry->p2p = sdata->vif.p2p; \ 26 __entry->p2p = sdata->vif.p2p; \
27 __assign_str(vif_name, sdata->dev ? sdata->dev->name : "<nodev>") 27 __assign_str(vif_name, sdata->dev ? sdata->dev->name : sdata->name)
28#define VIF_PR_FMT " vif:%s(%d%s)" 28#define VIF_PR_FMT " vif:%s(%d%s)"
29#define VIF_PR_ARG __get_str(vif_name), __entry->vif_type, __entry->p2p ? "/p2p" : "" 29#define VIF_PR_ARG __get_str(vif_name), __entry->vif_type, __entry->p2p ? "/p2p" : ""
30 30
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 9a4e4e30ea6c..79bce870ad78 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -276,6 +276,9 @@ void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue)
276 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 276 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
277 int ac; 277 int ac;
278 278
279 if (!sdata->dev)
280 continue;
281
279 if (test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state)) 282 if (test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))
280 continue; 283 continue;
281 284
@@ -364,6 +367,9 @@ static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue,
364 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 367 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
365 int ac; 368 int ac;
366 369
370 if (!sdata->dev)
371 continue;
372
367 for (ac = 0; ac < n_acs; ac++) { 373 for (ac = 0; ac < n_acs; ac++) {
368 if (sdata->vif.hw_queue[ac] == queue || 374 if (sdata->vif.hw_queue[ac] == queue ||
369 sdata->vif.cab_queue == queue) 375 sdata->vif.cab_queue == queue)
@@ -902,7 +908,8 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
902 drv_conf_tx(local, sdata, ac, &qparam); 908 drv_conf_tx(local, sdata, ac, &qparam);
903 } 909 }
904 910
905 if (sdata->vif.type != NL80211_IFTYPE_MONITOR) { 911 if (sdata->vif.type != NL80211_IFTYPE_MONITOR &&
912 sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) {
906 sdata->vif.bss_conf.qos = enable_qos; 913 sdata->vif.bss_conf.qos = enable_qos;
907 if (bss_notify) 914 if (bss_notify)
908 ieee80211_bss_info_change_notify(sdata, 915 ieee80211_bss_info_change_notify(sdata,
@@ -1391,7 +1398,8 @@ int ieee80211_reconfig(struct ieee80211_local *local)
1391 /* ignore virtual */ 1398 /* ignore virtual */
1392 break; 1399 break;
1393 case NL80211_IFTYPE_P2P_DEVICE: 1400 case NL80211_IFTYPE_P2P_DEVICE:
1394 /* not yet supported */ 1401 changed = BSS_CHANGED_IDLE;
1402 break;
1395 case NL80211_IFTYPE_UNSPECIFIED: 1403 case NL80211_IFTYPE_UNSPECIFIED:
1396 case NUM_NL80211_IFTYPES: 1404 case NUM_NL80211_IFTYPES:
1397 case NL80211_IFTYPE_P2P_CLIENT: 1405 case NL80211_IFTYPE_P2P_CLIENT:
@@ -1578,6 +1586,8 @@ void ieee80211_recalc_smps(struct ieee80211_local *local)
1578 list_for_each_entry(sdata, &local->interfaces, list) { 1586 list_for_each_entry(sdata, &local->interfaces, list) {
1579 if (!ieee80211_sdata_running(sdata)) 1587 if (!ieee80211_sdata_running(sdata))
1580 continue; 1588 continue;
1589 if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE)
1590 continue;
1581 if (sdata->vif.type != NL80211_IFTYPE_STATION) 1591 if (sdata->vif.type != NL80211_IFTYPE_STATION)
1582 goto set; 1592 goto set;
1583 1593