diff options
author | Alexander Aring <alex.aring@gmail.com> | 2015-05-27 07:42:10 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2015-05-27 13:29:42 -0400 |
commit | b69644c1c72e179738dd5c7e52e99d8550189472 (patch) | |
tree | d211eea2d8c51db2e8cac0c2aa00bd4b2b9d243c /net/ieee802154 | |
parent | e4390592a4fc3ee10a8bc4742197fdbac3935f74 (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.c | 30 | ||||
-rw-r--r-- | net/ieee802154/rdev-ops.h | 11 | ||||
-rw-r--r-- | net/ieee802154/trace.h | 15 |
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 | ||
793 | static 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 | |||
793 | static int nl802154_set_tx_power(struct sk_buff *skb, struct genl_info *info) | 815 | static 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 | ||
77 | static inline int | 77 | static inline int |
78 | rdev_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 | |||
88 | static inline int | ||
78 | rdev_set_tx_power(struct cfg802154_registered_device *rdev, | 89 | rdev_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 | ||
126 | TRACE_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 | |||
126 | DECLARE_EVENT_CLASS(802154_le16_template, | 141 | DECLARE_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), |