summaryrefslogtreecommitdiffstats
path: root/net/ieee802154
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2015-05-27 07:42:10 -0400
committerMarcel Holtmann <marcel@holtmann.org>2015-05-27 13:29:42 -0400
commitb69644c1c72e179738dd5c7e52e99d8550189472 (patch)
treed211eea2d8c51db2e8cac0c2aa00bd4b2b9d243c /net/ieee802154
parente4390592a4fc3ee10a8bc4742197fdbac3935f74 (diff)
nl802154: add support to set cca ed level
This patch adds support for setting the current cca ed level value over nl802154. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Reviewed-by: Varka Bhadram <varkabhadram@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/ieee802154')
-rw-r--r--net/ieee802154/nl802154.c30
-rw-r--r--net/ieee802154/rdev-ops.h11
-rw-r--r--net/ieee802154/trace.h15
3 files changed, 56 insertions, 0 deletions
diff --git a/net/ieee802154/nl802154.c b/net/ieee802154/nl802154.c
index a89d9d024126..7dbb1f4ce7df 100644
--- a/net/ieee802154/nl802154.c
+++ b/net/ieee802154/nl802154.c
@@ -790,6 +790,28 @@ static int nl802154_set_cca_mode(struct sk_buff *skb, struct genl_info *info)
790 return rdev_set_cca_mode(rdev, &cca); 790 return rdev_set_cca_mode(rdev, &cca);
791} 791}
792 792
793static int nl802154_set_cca_ed_level(struct sk_buff *skb, struct genl_info *info)
794{
795 struct cfg802154_registered_device *rdev = info->user_ptr[0];
796 s32 ed_level;
797 int i;
798
799 if (!(rdev->wpan_phy.flags & WPAN_PHY_FLAG_CCA_ED_LEVEL))
800 return -EOPNOTSUPP;
801
802 if (!info->attrs[NL802154_ATTR_CCA_ED_LEVEL])
803 return -EINVAL;
804
805 ed_level = nla_get_s32(info->attrs[NL802154_ATTR_CCA_ED_LEVEL]);
806
807 for (i = 0; i < rdev->wpan_phy.supported.cca_ed_levels_size; i++) {
808 if (ed_level == rdev->wpan_phy.supported.cca_ed_levels[i])
809 return rdev_set_cca_ed_level(rdev, ed_level);
810 }
811
812 return -EINVAL;
813}
814
793static int nl802154_set_tx_power(struct sk_buff *skb, struct genl_info *info) 815static int nl802154_set_tx_power(struct sk_buff *skb, struct genl_info *info)
794{ 816{
795 struct cfg802154_registered_device *rdev = info->user_ptr[0]; 817 struct cfg802154_registered_device *rdev = info->user_ptr[0];
@@ -1123,6 +1145,14 @@ static const struct genl_ops nl802154_ops[] = {
1123 NL802154_FLAG_NEED_RTNL, 1145 NL802154_FLAG_NEED_RTNL,
1124 }, 1146 },
1125 { 1147 {
1148 .cmd = NL802154_CMD_SET_CCA_ED_LEVEL,
1149 .doit = nl802154_set_cca_ed_level,
1150 .policy = nl802154_policy,
1151 .flags = GENL_ADMIN_PERM,
1152 .internal_flags = NL802154_FLAG_NEED_WPAN_PHY |
1153 NL802154_FLAG_NEED_RTNL,
1154 },
1155 {
1126 .cmd = NL802154_CMD_SET_TX_POWER, 1156 .cmd = NL802154_CMD_SET_TX_POWER,
1127 .doit = nl802154_set_tx_power, 1157 .doit = nl802154_set_tx_power,
1128 .policy = nl802154_policy, 1158 .policy = nl802154_policy,
diff --git a/net/ieee802154/rdev-ops.h b/net/ieee802154/rdev-ops.h
index 36456118a6ec..b2155a123f6c 100644
--- a/net/ieee802154/rdev-ops.h
+++ b/net/ieee802154/rdev-ops.h
@@ -75,6 +75,17 @@ rdev_set_cca_mode(struct cfg802154_registered_device *rdev,
75} 75}
76 76
77static inline int 77static inline int
78rdev_set_cca_ed_level(struct cfg802154_registered_device *rdev, s32 ed_level)
79{
80 int ret;
81
82 trace_802154_rdev_set_cca_ed_level(&rdev->wpan_phy, ed_level);
83 ret = rdev->ops->set_cca_ed_level(&rdev->wpan_phy, ed_level);
84 trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
85 return ret;
86}
87
88static inline int
78rdev_set_tx_power(struct cfg802154_registered_device *rdev, 89rdev_set_tx_power(struct cfg802154_registered_device *rdev,
79 s32 power) 90 s32 power)
80{ 91{
diff --git a/net/ieee802154/trace.h b/net/ieee802154/trace.h
index ac790bb1b4fe..73eb7605c1eb 100644
--- a/net/ieee802154/trace.h
+++ b/net/ieee802154/trace.h
@@ -123,6 +123,21 @@ TRACE_EVENT(802154_rdev_set_cca_mode,
123 WPAN_CCA_PR_ARG) 123 WPAN_CCA_PR_ARG)
124); 124);
125 125
126TRACE_EVENT(802154_rdev_set_cca_ed_level,
127 TP_PROTO(struct wpan_phy *wpan_phy, s32 ed_level),
128 TP_ARGS(wpan_phy, ed_level),
129 TP_STRUCT__entry(
130 WPAN_PHY_ENTRY
131 __field(s32, ed_level)
132 ),
133 TP_fast_assign(
134 WPAN_PHY_ASSIGN;
135 __entry->ed_level = ed_level;
136 ),
137 TP_printk(WPAN_PHY_PR_FMT ", ed_level: %d", WPAN_PHY_PR_ARG,
138 __entry->ed_level)
139);
140
126DECLARE_EVENT_CLASS(802154_le16_template, 141DECLARE_EVENT_CLASS(802154_le16_template,
127 TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev, 142 TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev,
128 __le16 le16arg), 143 __le16 le16arg),