aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2013-08-16 14:24:51 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-08-16 14:24:51 -0400
commitd0746663667f37e7be5646bf68cb452c8375a23d (patch)
tree85ae5a3d5e5bae53815baba5dba372e4d53a9745 /net/wireless
parent41caa760d6acaf47cbd44c3d78307fb9be089111 (diff)
parent27b3eb9c06a7193bdc9800cd00764a130343bc8a (diff)
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/nl80211.c74
-rw-r--r--net/wireless/rdev-ops.h5
-rw-r--r--net/wireless/trace.h8
3 files changed, 49 insertions, 38 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index adf1e98f4c3e..c6164da1c133 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6593,19 +6593,30 @@ static struct genl_multicast_group nl80211_testmode_mcgrp = {
6593static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 6593static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
6594{ 6594{
6595 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 6595 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6596 struct wireless_dev *wdev =
6597 __cfg80211_wdev_from_attrs(genl_info_net(info), info->attrs);
6596 int err; 6598 int err;
6597 6599
6600 if (!rdev->ops->testmode_cmd)
6601 return -EOPNOTSUPP;
6602
6603 if (IS_ERR(wdev)) {
6604 err = PTR_ERR(wdev);
6605 if (err != -EINVAL)
6606 return err;
6607 wdev = NULL;
6608 } else if (wdev->wiphy != &rdev->wiphy) {
6609 return -EINVAL;
6610 }
6611
6598 if (!info->attrs[NL80211_ATTR_TESTDATA]) 6612 if (!info->attrs[NL80211_ATTR_TESTDATA])
6599 return -EINVAL; 6613 return -EINVAL;
6600 6614
6601 err = -EOPNOTSUPP; 6615 rdev->testmode_info = info;
6602 if (rdev->ops->testmode_cmd) { 6616 err = rdev_testmode_cmd(rdev, wdev,
6603 rdev->testmode_info = info;
6604 err = rdev_testmode_cmd(rdev,
6605 nla_data(info->attrs[NL80211_ATTR_TESTDATA]), 6617 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
6606 nla_len(info->attrs[NL80211_ATTR_TESTDATA])); 6618 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
6607 rdev->testmode_info = NULL; 6619 rdev->testmode_info = NULL;
6608 }
6609 6620
6610 return err; 6621 return err;
6611} 6622}
@@ -7566,14 +7577,12 @@ static int nl80211_set_cqm_txe(struct genl_info *info,
7566 u32 rate, u32 pkts, u32 intvl) 7577 u32 rate, u32 pkts, u32 intvl)
7567{ 7578{
7568 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7579 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7569 struct wireless_dev *wdev;
7570 struct net_device *dev = info->user_ptr[1]; 7580 struct net_device *dev = info->user_ptr[1];
7581 struct wireless_dev *wdev = dev->ieee80211_ptr;
7571 7582
7572 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL) 7583 if (rate > 100 || intvl > NL80211_CQM_TXE_MAX_INTVL)
7573 return -EINVAL; 7584 return -EINVAL;
7574 7585
7575 wdev = dev->ieee80211_ptr;
7576
7577 if (!rdev->ops->set_cqm_txe_config) 7586 if (!rdev->ops->set_cqm_txe_config)
7578 return -EOPNOTSUPP; 7587 return -EOPNOTSUPP;
7579 7588
@@ -7588,13 +7597,15 @@ static int nl80211_set_cqm_rssi(struct genl_info *info,
7588 s32 threshold, u32 hysteresis) 7597 s32 threshold, u32 hysteresis)
7589{ 7598{
7590 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 7599 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7591 struct wireless_dev *wdev;
7592 struct net_device *dev = info->user_ptr[1]; 7600 struct net_device *dev = info->user_ptr[1];
7601 struct wireless_dev *wdev = dev->ieee80211_ptr;
7593 7602
7594 if (threshold > 0) 7603 if (threshold > 0)
7595 return -EINVAL; 7604 return -EINVAL;
7596 7605
7597 wdev = dev->ieee80211_ptr; 7606 /* disabling - hysteresis should also be zero then */
7607 if (threshold == 0)
7608 hysteresis = 0;
7598 7609
7599 if (!rdev->ops->set_cqm_rssi_config) 7610 if (!rdev->ops->set_cqm_rssi_config)
7600 return -EOPNOTSUPP; 7611 return -EOPNOTSUPP;
@@ -7613,36 +7624,33 @@ static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
7613 int err; 7624 int err;
7614 7625
7615 cqm = info->attrs[NL80211_ATTR_CQM]; 7626 cqm = info->attrs[NL80211_ATTR_CQM];
7616 if (!cqm) { 7627 if (!cqm)
7617 err = -EINVAL; 7628 return -EINVAL;
7618 goto out;
7619 }
7620 7629
7621 err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm, 7630 err = nla_parse_nested(attrs, NL80211_ATTR_CQM_MAX, cqm,
7622 nl80211_attr_cqm_policy); 7631 nl80211_attr_cqm_policy);
7623 if (err) 7632 if (err)
7624 goto out; 7633 return err;
7625 7634
7626 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] && 7635 if (attrs[NL80211_ATTR_CQM_RSSI_THOLD] &&
7627 attrs[NL80211_ATTR_CQM_RSSI_HYST]) { 7636 attrs[NL80211_ATTR_CQM_RSSI_HYST]) {
7628 s32 threshold; 7637 s32 threshold = nla_get_s32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
7629 u32 hysteresis; 7638 u32 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
7630 threshold = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_THOLD]);
7631 hysteresis = nla_get_u32(attrs[NL80211_ATTR_CQM_RSSI_HYST]);
7632 err = nl80211_set_cqm_rssi(info, threshold, hysteresis);
7633 } else if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
7634 attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
7635 attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
7636 u32 rate, pkts, intvl;
7637 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
7638 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
7639 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
7640 err = nl80211_set_cqm_txe(info, rate, pkts, intvl);
7641 } else
7642 err = -EINVAL;
7643 7639
7644out: 7640 return nl80211_set_cqm_rssi(info, threshold, hysteresis);
7645 return err; 7641 }
7642
7643 if (attrs[NL80211_ATTR_CQM_TXE_RATE] &&
7644 attrs[NL80211_ATTR_CQM_TXE_PKTS] &&
7645 attrs[NL80211_ATTR_CQM_TXE_INTVL]) {
7646 u32 rate = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_RATE]);
7647 u32 pkts = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_PKTS]);
7648 u32 intvl = nla_get_u32(attrs[NL80211_ATTR_CQM_TXE_INTVL]);
7649
7650 return nl80211_set_cqm_txe(info, rate, pkts, intvl);
7651 }
7652
7653 return -EINVAL;
7646} 7654}
7647 7655
7648static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) 7656static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h
index de870d4d0bcc..37ce9fdfe934 100644
--- a/net/wireless/rdev-ops.h
+++ b/net/wireless/rdev-ops.h
@@ -516,11 +516,12 @@ static inline void rdev_rfkill_poll(struct cfg80211_registered_device *rdev)
516 516
517#ifdef CONFIG_NL80211_TESTMODE 517#ifdef CONFIG_NL80211_TESTMODE
518static inline int rdev_testmode_cmd(struct cfg80211_registered_device *rdev, 518static inline int rdev_testmode_cmd(struct cfg80211_registered_device *rdev,
519 struct wireless_dev *wdev,
519 void *data, int len) 520 void *data, int len)
520{ 521{
521 int ret; 522 int ret;
522 trace_rdev_testmode_cmd(&rdev->wiphy); 523 trace_rdev_testmode_cmd(&rdev->wiphy, wdev);
523 ret = rdev->ops->testmode_cmd(&rdev->wiphy, data, len); 524 ret = rdev->ops->testmode_cmd(&rdev->wiphy, wdev, data, len);
524 trace_rdev_return_int(&rdev->wiphy, ret); 525 trace_rdev_return_int(&rdev->wiphy, ret);
525 return ret; 526 return ret;
526} 527}
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index f0ebdcd394ef..ba5f0d6614d5 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -1293,15 +1293,17 @@ TRACE_EVENT(rdev_return_int_int,
1293 1293
1294#ifdef CONFIG_NL80211_TESTMODE 1294#ifdef CONFIG_NL80211_TESTMODE
1295TRACE_EVENT(rdev_testmode_cmd, 1295TRACE_EVENT(rdev_testmode_cmd,
1296 TP_PROTO(struct wiphy *wiphy), 1296 TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev),
1297 TP_ARGS(wiphy), 1297 TP_ARGS(wiphy, wdev),
1298 TP_STRUCT__entry( 1298 TP_STRUCT__entry(
1299 WIPHY_ENTRY 1299 WIPHY_ENTRY
1300 WDEV_ENTRY
1300 ), 1301 ),
1301 TP_fast_assign( 1302 TP_fast_assign(
1302 WIPHY_ASSIGN; 1303 WIPHY_ASSIGN;
1304 WDEV_ASSIGN;
1303 ), 1305 ),
1304 TP_printk(WIPHY_PR_FMT, WIPHY_PR_ARG) 1306 TP_printk(WIPHY_PR_FMT WDEV_PR_FMT, WIPHY_PR_ARG, WDEV_PR_ARG)
1305); 1307);
1306 1308
1307TRACE_EVENT(rdev_testmode_dump, 1309TRACE_EVENT(rdev_testmode_dump,