diff options
Diffstat (limited to 'net/ieee802154/nl-phy.c')
-rw-r--r-- | net/ieee802154/nl-phy.c | 30 |
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 | ||
407 | static 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 | |||
406 | int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info) | 421 | int 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); |