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 | |
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>
-rw-r--r-- | include/net/cfg802154.h | 1 | ||||
-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 | ||||
-rw-r--r-- | net/mac802154/cfg.c | 19 |
5 files changed, 76 insertions, 0 deletions
diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h index 2e3bb012c2ff..290a9a69af07 100644 --- a/include/net/cfg802154.h +++ b/include/net/cfg802154.h | |||
@@ -44,6 +44,7 @@ struct cfg802154_ops { | |||
44 | int (*set_channel)(struct wpan_phy *wpan_phy, u8 page, u8 channel); | 44 | int (*set_channel)(struct wpan_phy *wpan_phy, u8 page, u8 channel); |
45 | int (*set_cca_mode)(struct wpan_phy *wpan_phy, | 45 | int (*set_cca_mode)(struct wpan_phy *wpan_phy, |
46 | const struct wpan_phy_cca *cca); | 46 | const struct wpan_phy_cca *cca); |
47 | int (*set_cca_ed_level)(struct wpan_phy *wpan_phy, s32 ed_level); | ||
47 | int (*set_tx_power)(struct wpan_phy *wpan_phy, s32 power); | 48 | int (*set_tx_power)(struct wpan_phy *wpan_phy, s32 power); |
48 | int (*set_pan_id)(struct wpan_phy *wpan_phy, | 49 | int (*set_pan_id)(struct wpan_phy *wpan_phy, |
49 | struct wpan_dev *wpan_dev, __le16 pan_id); | 50 | struct wpan_dev *wpan_dev, __le16 pan_id); |
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), |
diff --git a/net/mac802154/cfg.c b/net/mac802154/cfg.c index ab12fa296eb3..317c4662e544 100644 --- a/net/mac802154/cfg.c +++ b/net/mac802154/cfg.c | |||
@@ -106,6 +106,24 @@ ieee802154_set_cca_mode(struct wpan_phy *wpan_phy, | |||
106 | } | 106 | } |
107 | 107 | ||
108 | static int | 108 | static int |
109 | ieee802154_set_cca_ed_level(struct wpan_phy *wpan_phy, s32 ed_level) | ||
110 | { | ||
111 | struct ieee802154_local *local = wpan_phy_priv(wpan_phy); | ||
112 | int ret; | ||
113 | |||
114 | ASSERT_RTNL(); | ||
115 | |||
116 | if (wpan_phy->cca_ed_level == ed_level) | ||
117 | return 0; | ||
118 | |||
119 | ret = drv_set_cca_ed_level(local, ed_level); | ||
120 | if (!ret) | ||
121 | wpan_phy->cca_ed_level = ed_level; | ||
122 | |||
123 | return ret; | ||
124 | } | ||
125 | |||
126 | static int | ||
109 | ieee802154_set_tx_power(struct wpan_phy *wpan_phy, s32 power) | 127 | ieee802154_set_tx_power(struct wpan_phy *wpan_phy, s32 power) |
110 | { | 128 | { |
111 | struct ieee802154_local *local = wpan_phy_priv(wpan_phy); | 129 | struct ieee802154_local *local = wpan_phy_priv(wpan_phy); |
@@ -213,6 +231,7 @@ const struct cfg802154_ops mac802154_config_ops = { | |||
213 | .del_virtual_intf = ieee802154_del_iface, | 231 | .del_virtual_intf = ieee802154_del_iface, |
214 | .set_channel = ieee802154_set_channel, | 232 | .set_channel = ieee802154_set_channel, |
215 | .set_cca_mode = ieee802154_set_cca_mode, | 233 | .set_cca_mode = ieee802154_set_cca_mode, |
234 | .set_cca_ed_level = ieee802154_set_cca_ed_level, | ||
216 | .set_tx_power = ieee802154_set_tx_power, | 235 | .set_tx_power = ieee802154_set_tx_power, |
217 | .set_pan_id = ieee802154_set_pan_id, | 236 | .set_pan_id = ieee802154_set_pan_id, |
218 | .set_short_addr = ieee802154_set_short_addr, | 237 | .set_short_addr = ieee802154_set_short_addr, |