Re: [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]

 



On Thu, 23 Apr 2015 18:47:49 +0200
Alexander Aring <alex.aring@xxxxxxxxx> wrote:

> 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);

mBm instead of dBm would be better here, too.

>  	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;

--
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