diff options
author | Phoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de> | 2014-02-17 05:34:11 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-17 16:42:38 -0500 |
commit | ba08fea53a43e02b590d89224afdad976dece841 (patch) | |
tree | b7cfcfcfc9b923360c477e55df12a501eda169b0 /net/ieee802154 | |
parent | 84dda3c648fd55898064d76366b14f964cdc9d16 (diff) |
ieee802154: add support for CCA mode in wpan phys
The standard describes four modes of clear channel assesment: "energy
above threshold", "carrier found", and the logical and/or of these two.
Support for CCA mode setting is included in the at86rf230 driver,
predicated for RF212 chips.
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.c | 32 | ||||
-rw-r--r-- | net/ieee802154/nl_policy.c | 1 |
2 files changed, 30 insertions, 3 deletions
diff --git a/net/ieee802154/nl-phy.c b/net/ieee802154/nl-phy.c index f029310b0662..36f58d633868 100644 --- a/net/ieee802154/nl-phy.c +++ b/net/ieee802154/nl-phy.c | |||
@@ -57,7 +57,8 @@ static int ieee802154_nl_fill_phy(struct sk_buff *msg, u32 portid, | |||
57 | nla_put_u8(msg, IEEE802154_ATTR_PAGE, phy->current_page) || | 57 | nla_put_u8(msg, IEEE802154_ATTR_PAGE, phy->current_page) || |
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 | goto nla_put_failure; | 62 | goto nla_put_failure; |
62 | for (i = 0; i < 32; i++) { | 63 | for (i = 0; i < 32; i++) { |
63 | if (phy->channels_supported[i]) | 64 | if (phy->channels_supported[i]) |
@@ -385,6 +386,23 @@ static int phy_set_lbt(struct wpan_phy *phy, struct genl_info *info) | |||
385 | return 0; | 386 | return 0; |
386 | } | 387 | } |
387 | 388 | ||
389 | static int phy_set_cca_mode(struct wpan_phy *phy, struct genl_info *info) | ||
390 | { | ||
391 | u8 mode = nla_get_u8(info->attrs[IEEE802154_ATTR_CCA_MODE]); | ||
392 | int rc; | ||
393 | |||
394 | if (mode > 3) | ||
395 | return -EINVAL; | ||
396 | |||
397 | rc = phy->set_cca_mode(phy, mode); | ||
398 | if (rc < 0) | ||
399 | return rc; | ||
400 | |||
401 | phy->cca_mode = mode; | ||
402 | |||
403 | return 0; | ||
404 | } | ||
405 | |||
388 | int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info) | 406 | int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info) |
389 | { | 407 | { |
390 | struct wpan_phy *phy; | 408 | struct wpan_phy *phy; |
@@ -394,7 +412,8 @@ int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info) | |||
394 | pr_debug("%s\n", __func__); | 412 | pr_debug("%s\n", __func__); |
395 | 413 | ||
396 | if (!info->attrs[IEEE802154_ATTR_PHY_NAME] && | 414 | if (!info->attrs[IEEE802154_ATTR_PHY_NAME] && |
397 | !info->attrs[IEEE802154_ATTR_LBT_ENABLED]) | 415 | !info->attrs[IEEE802154_ATTR_LBT_ENABLED] && |
416 | !info->attrs[IEEE802154_ATTR_CCA_MODE]) | ||
398 | return -EINVAL; | 417 | return -EINVAL; |
399 | 418 | ||
400 | name = nla_data(info->attrs[IEEE802154_ATTR_PHY_NAME]); | 419 | name = nla_data(info->attrs[IEEE802154_ATTR_PHY_NAME]); |
@@ -406,7 +425,8 @@ int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info) | |||
406 | return -ENODEV; | 425 | return -ENODEV; |
407 | 426 | ||
408 | if ((!phy->set_txpower && info->attrs[IEEE802154_ATTR_TXPOWER]) || | 427 | if ((!phy->set_txpower && info->attrs[IEEE802154_ATTR_TXPOWER]) || |
409 | (!phy->set_lbt && info->attrs[IEEE802154_ATTR_LBT_ENABLED])) | 428 | (!phy->set_lbt && info->attrs[IEEE802154_ATTR_LBT_ENABLED]) || |
429 | (!phy->set_cca_mode && info->attrs[IEEE802154_ATTR_CCA_MODE])) | ||
410 | goto out; | 430 | goto out; |
411 | 431 | ||
412 | mutex_lock(&phy->pib_lock); | 432 | mutex_lock(&phy->pib_lock); |
@@ -423,6 +443,12 @@ int ieee802154_set_phyparams(struct sk_buff *skb, struct genl_info *info) | |||
423 | goto error; | 443 | goto error; |
424 | } | 444 | } |
425 | 445 | ||
446 | if (info->attrs[IEEE802154_ATTR_CCA_MODE]) { | ||
447 | rc = phy_set_cca_mode(phy, info); | ||
448 | if (rc < 0) | ||
449 | goto error; | ||
450 | } | ||
451 | |||
426 | mutex_unlock(&phy->pib_lock); | 452 | mutex_unlock(&phy->pib_lock); |
427 | 453 | ||
428 | wpan_phy_put(phy); | 454 | wpan_phy_put(phy); |
diff --git a/net/ieee802154/nl_policy.c b/net/ieee802154/nl_policy.c index a09f6423a6e9..d87c2c904110 100644 --- a/net/ieee802154/nl_policy.c +++ b/net/ieee802154/nl_policy.c | |||
@@ -55,5 +55,6 @@ const struct nla_policy ieee802154_policy[IEEE802154_ATTR_MAX + 1] = { | |||
55 | 55 | ||
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 | }; | 59 | }; |
59 | 60 | ||