[RFC bluetooth-next 10/15] ieee802154: add support for get cca ed levels

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds support for get cca energy detection levels. The driver
needs to implement a driver ops callback which can iterate over each
transmit power level index. This callback can return zero for successful
iteration, 1 for ending the iteration, 2 for continue the iteration
which an index increment and values below 0 zero if failed.

Signed-off-by: Alexander Aring <alex.aring@xxxxxxxxx>
---
 include/net/cfg802154.h    |  2 ++
 include/net/mac802154.h    |  9 +++++++++
 net/ieee802154/rdev-ops.h  | 12 ++++++++++++
 net/ieee802154/trace.h     | 31 +++++++++++++++++++++++++++++++
 net/mac802154/cfg.c        | 11 +++++++++++
 net/mac802154/driver-ops.h | 12 ++++++++++++
 6 files changed, 77 insertions(+)

diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h
index 89995dd..7d44dcc 100644
--- a/include/net/cfg802154.h
+++ b/include/net/cfg802154.h
@@ -43,6 +43,8 @@ struct cfg802154_ops {
 	int	(*set_cca_mode)(struct wpan_phy *wpan_phy,
 				const struct wpan_phy_cca *cca);
 	int	(*get_tx_powers)(struct wpan_phy *wpan_phy, s8 *dbm, u32 idx);
+	int	(*get_cca_ed_levels)(struct wpan_phy *wpan_phy, s32 *dbm,
+				     u32 idx);
 	int	(*set_pan_id)(struct wpan_phy *wpan_phy,
 			      struct wpan_dev *wpan_dev, __le16 pan_id);
 	int	(*set_short_addr)(struct wpan_phy *wpan_phy,
diff --git a/include/net/mac802154.h b/include/net/mac802154.h
index c489946..009e64c 100644
--- a/include/net/mac802154.h
+++ b/include/net/mac802154.h
@@ -182,6 +182,13 @@ struct ieee802154_hw {
  *	  returned for skipping dbm but increment idx value, this can be useful
  *	  for register to dbm array mapping.
  *
+ * get_cca_ed_levels
+ *	  Get cca ed levels in dBm for cca mode 3. Called when rtnl lock is
+ *	  held. Parameter idx descibes the index of cca ed levels which is
+ *	  supported. Returns either zero or negative errno. One should be
+ *	  returned to break the iteration of cca ed levels setting. Two should
+ *	  be returned for skipping dbm but increment idx value.
+ *
  * set_lbt
  *	  Enables or disables listen before talk on the device. Called with
  *	  pib_lock held.
@@ -224,6 +231,8 @@ struct ieee802154_ops {
 	int		(*set_txpower)(struct ieee802154_hw *hw, s8 dbm);
 	int		(*get_tx_powers)(struct ieee802154_hw *hw, s8 *dbm,
 					 u32 idx);
+	int		(*get_cca_ed_levels)(struct ieee802154_hw *hw,
+					     s32 *dbm, u32 idx);
 	int		(*set_lbt)(struct ieee802154_hw *hw, bool on);
 	int		(*set_cca_mode)(struct ieee802154_hw *hw,
 					const struct wpan_phy_cca *cca);
diff --git a/net/ieee802154/rdev-ops.h b/net/ieee802154/rdev-ops.h
index d944a7a..5d2666f 100644
--- a/net/ieee802154/rdev-ops.h
+++ b/net/ieee802154/rdev-ops.h
@@ -71,6 +71,18 @@ rdev_set_cca_mode(struct cfg802154_registered_device *rdev,
 }
 
 static inline int
+rdev_get_cca_ed_levels(struct cfg802154_registered_device *rdev, s32 *dbm,
+		       u32 idx)
+{
+	int ret;
+
+	trace_802154_rdev_get_cca_ed_levels(&rdev->wpan_phy, idx);
+	ret = rdev->ops->get_cca_ed_levels(&rdev->wpan_phy, dbm, idx);
+	trace_802154_rdev_return_int_cca_ed_levels(&rdev->wpan_phy, ret, dbm);
+	return ret;
+}
+
+static inline int
 rdev_get_tx_powers(struct cfg802154_registered_device *rdev, s8 *dbm, u32 idx)
 {
 	int ret;
diff --git a/net/ieee802154/trace.h b/net/ieee802154/trace.h
index 94ac3b9..c06b57f 100644
--- a/net/ieee802154/trace.h
+++ b/net/ieee802154/trace.h
@@ -108,6 +108,37 @@ TRACE_EVENT(802154_rdev_set_cca_mode,
 		  WPAN_CCA_PR_ARG)
 );
 
+TRACE_EVENT(802154_rdev_get_cca_ed_levels,
+	TP_PROTO(struct wpan_phy *wpan_phy, u32 idx),
+	TP_ARGS(wpan_phy, idx),
+	TP_STRUCT__entry(
+		WPAN_PHY_ENTRY
+		__field(u32, idx)
+	),
+	TP_fast_assign(
+		WPAN_PHY_ASSIGN;
+		__entry->idx = idx;
+	),
+	TP_printk(WPAN_PHY_PR_FMT ", idx: %d", WPAN_PHY_PR_ARG, __entry->idx)
+);
+
+TRACE_EVENT(802154_rdev_return_int_cca_ed_levels,
+	TP_PROTO(struct wpan_phy *wpan_phy, int ret, s32 *dbm),
+	TP_ARGS(wpan_phy, ret, dbm),
+	TP_STRUCT__entry(
+		WPAN_PHY_ENTRY
+		__field(int, ret)
+		__field(s32, dbm)
+	),
+	TP_fast_assign(
+		WPAN_PHY_ASSIGN;
+		__entry->ret = ret;
+		__entry->dbm = *dbm;
+	),
+	TP_printk(WPAN_PHY_PR_FMT ", returned: %d, dbm: %d", WPAN_PHY_PR_ARG,
+		  __entry->ret, __entry->dbm)
+);
+
 TRACE_EVENT(802154_rdev_get_tx_powers,
 	TP_PROTO(struct wpan_phy *wpan_phy, u32 idx),
 	TP_ARGS(wpan_phy, idx),
diff --git a/net/mac802154/cfg.c b/net/mac802154/cfg.c
index 2b80a77..e5234ab 100644
--- a/net/mac802154/cfg.c
+++ b/net/mac802154/cfg.c
@@ -103,6 +103,16 @@ ieee802154_set_cca_mode(struct wpan_phy *wpan_phy,
 }
 
 static int
+ieee802154_get_cca_ed_levels(struct wpan_phy *wpan_phy, s32 *dbm, u32 idx)
+{
+	struct ieee802154_local *local = wpan_phy_priv(wpan_phy);
+
+	ASSERT_RTNL();
+
+	return drv_get_cca_ed_levels(local, dbm, idx);
+}
+
+static int
 ieee802154_get_tx_powers(struct wpan_phy *wpan_phy, s8 *dbm, u32 idx)
 {
 	struct ieee802154_local *local = wpan_phy_priv(wpan_phy);
@@ -203,6 +213,7 @@ const struct cfg802154_ops mac802154_config_ops = {
 	.set_channel = ieee802154_set_channel,
 	.set_cca_mode = ieee802154_set_cca_mode,
 	.get_tx_powers = ieee802154_get_tx_powers,
+	.get_cca_ed_levels = ieee802154_get_cca_ed_levels,
 	.set_pan_id = ieee802154_set_pan_id,
 	.set_short_addr = ieee802154_set_short_addr,
 	.set_backoff_exponent = ieee802154_set_backoff_exponent,
diff --git a/net/mac802154/driver-ops.h b/net/mac802154/driver-ops.h
index 08e2b09..323da5c 100644
--- a/net/mac802154/driver-ops.h
+++ b/net/mac802154/driver-ops.h
@@ -120,6 +120,18 @@ drv_set_cca_ed_level(struct ieee802154_local *local, s32 ed_level)
 	return local->ops->set_cca_ed_level(&local->hw, ed_level);
 }
 
+static inline int
+drv_get_cca_ed_levels(struct ieee802154_local *local, s32 *dbm, u32 idx)
+{
+	might_sleep();
+
+	/* if not implemented indicate a empty list */
+	if (!local->ops->get_tx_powers)
+		return 1;
+
+	return local->ops->get_cca_ed_levels(&local->hw, dbm, idx);
+}
+
 static inline int drv_set_pan_id(struct ieee802154_local *local, __le16 pan_id)
 {
 	struct ieee802154_hw_addr_filt filt;
-- 
2.3.6

--
To unsubscribe from this list: send the line "unsubscribe linux-wpan" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux