aboutsummaryrefslogtreecommitdiffstats
path: root/net/ieee802154/nl-phy.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ieee802154/nl-phy.c')
-rw-r--r--net/ieee802154/nl-phy.c30
1 files changed, 27 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);