aboutsummaryrefslogtreecommitdiffstats
path: root/net/ieee802154
diff options
context:
space:
mode:
authorPhoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de>2014-02-17 05:34:12 -0500
committerDavid S. Miller <davem@davemloft.net>2014-02-17 16:42:38 -0500
commit6ca001978dce0d50ebac01a38d6287f241a520c6 (patch)
tree2ed75aadbfb16ca006a2cd94bc30ebf614783ffc /net/ieee802154
parentba08fea53a43e02b590d89224afdad976dece841 (diff)
ieee802154: add support for setting CCA energy detection levels
Since three of the four clear channel assesment modes make use of energy detection, provide an API to set the energy detection threshold. Driver support for this is available in at86rf230 for the RF212 chips. Since for these chips the minimal energy detection threshold depends on page and channel used, add a field to struct at86rf230_local that stores the minimal threshold. Actual ED thresholds are configured as offsets from this value. For RF212, setting the ED threshold will not work before a channel/page has been set due to the dependency of energy detection in the chip and the actual channel/page selected. Signed-off-by: Phoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ieee802154')
-rw-r--r--net/ieee802154/nl-phy.c30
-rw-r--r--net/ieee802154/nl_policy.c1
2 files changed, 28 insertions, 3 deletions
diff --git a/net/ieee802154/nl-phy.c b/net/ieee802154/nl-phy.c
index 36f58d633868..0af0d424dee0 100644
--- a/net/ieee802154/nl-phy.c
+++ b/net/ieee802154/nl-phy.c
@@ -58,7 +58,8 @@ static int ieee802154_nl_fill_phy(struct sk_buff *msg, u32 portid,
58 nla_put_u8(msg, IEEE802154_ATTR_CHANNEL, phy->current_channel) || 58 nla_put_u8(msg, IEEE802154_ATTR_CHANNEL, phy->current_channel) ||
59 nla_put_s8(msg, IEEE802154_ATTR_TXPOWER, phy->transmit_power) || 59 nla_put_s8(msg, IEEE802154_ATTR_TXPOWER, phy->transmit_power) ||
60 nla_put_u8(msg, IEEE802154_ATTR_LBT_ENABLED, phy->lbt) || 60 nla_put_u8(msg, IEEE802154_ATTR_LBT_ENABLED, phy->lbt) ||
61 nla_put_u8(msg, IEEE802154_ATTR_CCA_MODE, phy->cca_mode)) 61 nla_put_u8(msg, IEEE802154_ATTR_CCA_MODE, phy->cca_mode) ||
62 nla_put_s32(msg, IEEE802154_ATTR_CCA_ED_LEVEL, phy->cca_ed_level))
62 goto nla_put_failure; 63 goto nla_put_failure;
63 for (i = 0; i < 32; i++) { 64 for (i = 0; i < 32; i++) {
64 if (phy->channels_supported[i]) 65 if (phy->channels_supported[i])
@@ -403,6 +404,20 @@ static int phy_set_cca_mode(struct wpan_phy *phy, struct genl_info *info)
403 return 0; 404 return 0;
404} 405}
405 406
407static int phy_set_cca_ed_level(struct wpan_phy *phy, struct genl_info *info)
408{
409 s32 level = nla_get_s32(info->attrs[IEEE802154_ATTR_CCA_ED_LEVEL]);
410 int rc;
411
412 rc = phy->set_cca_ed_level(phy, level);
413 if (rc < 0)
414 return rc;
415
416 phy->cca_ed_level = level;
417
418 return 0;
419}
420
406int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info) 421int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info)
407{ 422{
408 struct wpan_phy *phy; 423 struct wpan_phy *phy;
@@ -413,7 +428,8 @@ int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info)
413 428
414 if (!info->attrs[IEEE802154_ATTR_PHY_NAME] && 429 if (!info->attrs[IEEE802154_ATTR_PHY_NAME] &&
415 !info->attrs[IEEE802154_ATTR_LBT_ENABLED] && 430 !info->attrs[IEEE802154_ATTR_LBT_ENABLED] &&
416 !info->attrs[IEEE802154_ATTR_CCA_MODE]) 431 !info->attrs[IEEE802154_ATTR_CCA_MODE] &&
432 !info->attrs[IEEE802154_ATTR_CCA_ED_LEVEL])
417 return -EINVAL; 433 return -EINVAL;
418 434
419 name = nla_data(info->attrs[IEEE802154_ATTR_PHY_NAME]); 435 name = nla_data(info->attrs[IEEE802154_ATTR_PHY_NAME]);
@@ -426,7 +442,9 @@ int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info)
426 442
427 if ((!phy->set_txpower && info->attrs[IEEE802154_ATTR_TXPOWER]) || 443 if ((!phy->set_txpower && info->attrs[IEEE802154_ATTR_TXPOWER]) ||
428 (!phy->set_lbt && info->attrs[IEEE802154_ATTR_LBT_ENABLED]) || 444 (!phy->set_lbt && info->attrs[IEEE802154_ATTR_LBT_ENABLED]) ||
429 (!phy->set_cca_mode && info->attrs[IEEE802154_ATTR_CCA_MODE])) 445 (!phy->set_cca_mode && info->attrs[IEEE802154_ATTR_CCA_MODE]) ||
446 (!phy->set_cca_ed_level &&
447 info->attrs[IEEE802154_ATTR_CCA_ED_LEVEL]))
430 goto out; 448 goto out;
431 449
432 mutex_lock(&phy->pib_lock); 450 mutex_lock(&phy->pib_lock);
@@ -449,6 +467,12 @@ int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info)
449 goto error; 467 goto error;
450 } 468 }
451 469
470 if (info->attrs[IEEE802154_ATTR_CCA_ED_LEVEL]) {
471 rc = phy_set_cca_ed_level(phy, info);
472 if (rc < 0)
473 goto error;
474 }
475
452 mutex_unlock(&phy->pib_lock); 476 mutex_unlock(&phy->pib_lock);
453 477
454 wpan_phy_put(phy); 478 wpan_phy_put(phy);
diff --git a/net/ieee802154/nl_policy.c b/net/ieee802154/nl_policy.c
index d87c2c904110..55b5616295ff 100644
--- a/net/ieee802154/nl_policy.c
+++ b/net/ieee802154/nl_policy.c
@@ -56,5 +56,6 @@ const struct nla_policy ieee802154_policy[IEEE802154_ATTR_MAX + 1] = {
56 [IEEE802154_ATTR_TXPOWER] = { .type = NLA_S8, }, 56 [IEEE802154_ATTR_TXPOWER] = { .type = NLA_S8, },
57 [IEEE802154_ATTR_LBT_ENABLED] = { .type = NLA_U8, }, 57 [IEEE802154_ATTR_LBT_ENABLED] = { .type = NLA_U8, },
58 [IEEE802154_ATTR_CCA_MODE] = { .type = NLA_U8, }, 58 [IEEE802154_ATTR_CCA_MODE] = { .type = NLA_U8, },
59 [IEEE802154_ATTR_CCA_ED_LEVEL] = { .type = NLA_S32, },
59}; 60};
60 61