aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2014-12-10 09:33:12 -0500
committerMarcel Holtmann <marcel@holtmann.org>2014-12-18 18:19:23 -0500
commit7fe9a3882bb37195c41ab125a0f2852398d2646a (patch)
tree2575090079228f59a93466eaf2d1b69524b97e8a
parentb40d6376ff470572e2fafb20ca06a68f2d7940cb (diff)
ieee802154: rework cca setting
The current cca setting handle is a driver specific call. We need to introduce some 802.15.4 specific layer and mapping 802.15.4 cca modes to driver specific ones inside the 802.15.4 driver. This patch will add such 802.15.4 layer and mapping the cca settings to driver specific ones. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--drivers/net/ieee802154/at86rf230.c30
-rw-r--r--include/net/cfg802154.h7
-rw-r--r--include/net/ieee802154_netdev.h4
-rw-r--r--include/net/mac802154.h5
-rw-r--r--net/ieee802154/nl-mac.c4
-rw-r--r--net/ieee802154/nl802154.c2
-rw-r--r--net/ieee802154/sysfs.c2
-rw-r--r--net/mac802154/driver-ops.h5
-rw-r--r--net/mac802154/mac_cmd.c6
9 files changed, 51 insertions, 14 deletions
diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c
index 1c0135620c62..1ac46ba41fd8 100644
--- a/drivers/net/ieee802154/at86rf230.c
+++ b/drivers/net/ieee802154/at86rf230.c
@@ -1146,11 +1146,37 @@ at86rf230_set_lbt(struct ieee802154_hw *hw, bool on)
1146} 1146}
1147 1147
1148static int 1148static int
1149at86rf230_set_cca_mode(struct ieee802154_hw *hw, u8 mode) 1149at86rf230_set_cca_mode(struct ieee802154_hw *hw,
1150 const struct wpan_phy_cca *cca)
1150{ 1151{
1151 struct at86rf230_local *lp = hw->priv; 1152 struct at86rf230_local *lp = hw->priv;
1153 u8 val;
1152 1154
1153 return at86rf230_write_subreg(lp, SR_CCA_MODE, mode); 1155 /* mapping 802.15.4 to driver spec */
1156 switch (cca->mode) {
1157 case NL802154_CCA_ENERGY:
1158 val = 1;
1159 break;
1160 case NL802154_CCA_CARRIER:
1161 val = 2;
1162 break;
1163 case NL802154_CCA_ENERGY_CARRIER:
1164 switch (cca->opt) {
1165 case NL802154_CCA_OPT_ENERGY_CARRIER_AND:
1166 val = 3;
1167 break;
1168 case NL802154_CCA_OPT_ENERGY_CARRIER_OR:
1169 val = 0;
1170 break;
1171 default:
1172 return -EINVAL;
1173 }
1174 break;
1175 default:
1176 return -EINVAL;
1177 }
1178
1179 return at86rf230_write_subreg(lp, SR_CCA_MODE, val);
1154} 1180}
1155 1181
1156static int 1182static int
diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h
index 7f713acfa106..6ee2618ac78a 100644
--- a/include/net/cfg802154.h
+++ b/include/net/cfg802154.h
@@ -56,6 +56,11 @@ struct cfg802154_ops {
56 struct wpan_dev *wpan_dev, bool mode); 56 struct wpan_dev *wpan_dev, bool mode);
57}; 57};
58 58
59struct wpan_phy_cca {
60 enum nl802154_cca_modes mode;
61 enum nl802154_cca_opts opt;
62};
63
59struct wpan_phy { 64struct wpan_phy {
60 struct mutex pib_lock; 65 struct mutex pib_lock;
61 66
@@ -76,7 +81,7 @@ struct wpan_phy {
76 u8 current_page; 81 u8 current_page;
77 u32 channels_supported[IEEE802154_MAX_PAGE + 1]; 82 u32 channels_supported[IEEE802154_MAX_PAGE + 1];
78 s8 transmit_power; 83 s8 transmit_power;
79 u8 cca_mode; 84 struct wpan_phy_cca cca;
80 85
81 __le64 perm_extended_addr; 86 __le64 perm_extended_addr;
82 87
diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h
index 83bb8a73d23c..94a297052442 100644
--- a/include/net/ieee802154_netdev.h
+++ b/include/net/ieee802154_netdev.h
@@ -28,6 +28,8 @@
28#include <linux/skbuff.h> 28#include <linux/skbuff.h>
29#include <linux/ieee802154.h> 29#include <linux/ieee802154.h>
30 30
31#include <net/cfg802154.h>
32
31struct ieee802154_sechdr { 33struct ieee802154_sechdr {
32#if defined(__LITTLE_ENDIAN_BITFIELD) 34#if defined(__LITTLE_ENDIAN_BITFIELD)
33 u8 level:3, 35 u8 level:3,
@@ -337,7 +339,7 @@ struct ieee802154_mac_params {
337 s8 frame_retries; 339 s8 frame_retries;
338 340
339 bool lbt; 341 bool lbt;
340 u8 cca_mode; 342 struct wpan_phy_cca cca;
341 s32 cca_ed_level; 343 s32 cca_ed_level;
342}; 344};
343 345
diff --git a/include/net/mac802154.h b/include/net/mac802154.h
index c823d910b46c..850647811749 100644
--- a/include/net/mac802154.h
+++ b/include/net/mac802154.h
@@ -20,6 +20,8 @@
20#include <linux/ieee802154.h> 20#include <linux/ieee802154.h>
21#include <linux/skbuff.h> 21#include <linux/skbuff.h>
22 22
23#include <net/cfg802154.h>
24
23/* General MAC frame format: 25/* General MAC frame format:
24 * 2 bytes: Frame Control 26 * 2 bytes: Frame Control
25 * 1 byte: Sequence Number 27 * 1 byte: Sequence Number
@@ -212,7 +214,8 @@ struct ieee802154_ops {
212 unsigned long changed); 214 unsigned long changed);
213 int (*set_txpower)(struct ieee802154_hw *hw, int db); 215 int (*set_txpower)(struct ieee802154_hw *hw, int db);
214 int (*set_lbt)(struct ieee802154_hw *hw, bool on); 216 int (*set_lbt)(struct ieee802154_hw *hw, bool on);
215 int (*set_cca_mode)(struct ieee802154_hw *hw, u8 mode); 217 int (*set_cca_mode)(struct ieee802154_hw *hw,
218 const struct wpan_phy_cca *cca);
216 int (*set_cca_ed_level)(struct ieee802154_hw *hw, 219 int (*set_cca_ed_level)(struct ieee802154_hw *hw,
217 s32 level); 220 s32 level);
218 int (*set_csma_params)(struct ieee802154_hw *hw, 221 int (*set_csma_params)(struct ieee802154_hw *hw,
diff --git a/net/ieee802154/nl-mac.c b/net/ieee802154/nl-mac.c
index cd919493c976..3c902e9516fb 100644
--- a/net/ieee802154/nl-mac.c
+++ b/net/ieee802154/nl-mac.c
@@ -121,7 +121,7 @@ static int ieee802154_nl_fill_iface(struct sk_buff *msg, u32 portid,
121 params.transmit_power) || 121 params.transmit_power) ||
122 nla_put_u8(msg, IEEE802154_ATTR_LBT_ENABLED, params.lbt) || 122 nla_put_u8(msg, IEEE802154_ATTR_LBT_ENABLED, params.lbt) ||
123 nla_put_u8(msg, IEEE802154_ATTR_CCA_MODE, 123 nla_put_u8(msg, IEEE802154_ATTR_CCA_MODE,
124 params.cca_mode) || 124 params.cca.mode) ||
125 nla_put_s32(msg, IEEE802154_ATTR_CCA_ED_LEVEL, 125 nla_put_s32(msg, IEEE802154_ATTR_CCA_ED_LEVEL,
126 params.cca_ed_level) || 126 params.cca_ed_level) ||
127 nla_put_u8(msg, IEEE802154_ATTR_CSMA_RETRIES, 127 nla_put_u8(msg, IEEE802154_ATTR_CSMA_RETRIES,
@@ -516,7 +516,7 @@ int ieee802154_set_macparams(struct sk_buff *skb, struct genl_info *info)
516 params.lbt = nla_get_u8(info->attrs[IEEE802154_ATTR_LBT_ENABLED]); 516 params.lbt = nla_get_u8(info->attrs[IEEE802154_ATTR_LBT_ENABLED]);
517 517
518 if (info->attrs[IEEE802154_ATTR_CCA_MODE]) 518 if (info->attrs[IEEE802154_ATTR_CCA_MODE])
519 params.cca_mode = nla_get_u8(info->attrs[IEEE802154_ATTR_CCA_MODE]); 519 params.cca.mode = nla_get_u8(info->attrs[IEEE802154_ATTR_CCA_MODE]);
520 520
521 if (info->attrs[IEEE802154_ATTR_CCA_ED_LEVEL]) 521 if (info->attrs[IEEE802154_ATTR_CCA_ED_LEVEL])
522 params.cca_ed_level = nla_get_s32(info->attrs[IEEE802154_ATTR_CCA_ED_LEVEL]); 522 params.cca_ed_level = nla_get_s32(info->attrs[IEEE802154_ATTR_CCA_ED_LEVEL]);
diff --git a/net/ieee802154/nl802154.c b/net/ieee802154/nl802154.c
index 889647744697..1efbe4250024 100644
--- a/net/ieee802154/nl802154.c
+++ b/net/ieee802154/nl802154.c
@@ -291,7 +291,7 @@ static int nl802154_send_wpan_phy(struct cfg802154_registered_device *rdev,
291 291
292 /* cca mode */ 292 /* cca mode */
293 if (nla_put_u8(msg, NL802154_ATTR_CCA_MODE, 293 if (nla_put_u8(msg, NL802154_ATTR_CCA_MODE,
294 rdev->wpan_phy.cca_mode)) 294 rdev->wpan_phy.cca.mode))
295 goto nla_put_failure; 295 goto nla_put_failure;
296 296
297 if (nla_put_s8(msg, NL802154_ATTR_TX_POWER, 297 if (nla_put_s8(msg, NL802154_ATTR_TX_POWER,
diff --git a/net/ieee802154/sysfs.c b/net/ieee802154/sysfs.c
index 1613b9c65dfa..dff55c2d87f3 100644
--- a/net/ieee802154/sysfs.c
+++ b/net/ieee802154/sysfs.c
@@ -68,7 +68,7 @@ static DEVICE_ATTR_RO(name)
68MASTER_SHOW(current_channel, "%d"); 68MASTER_SHOW(current_channel, "%d");
69MASTER_SHOW(current_page, "%d"); 69MASTER_SHOW(current_page, "%d");
70MASTER_SHOW(transmit_power, "%d +- 1 dB"); 70MASTER_SHOW(transmit_power, "%d +- 1 dB");
71MASTER_SHOW(cca_mode, "%d"); 71MASTER_SHOW_COMPLEX(cca_mode, "%d", phy->cca.mode);
72 72
73static ssize_t channels_supported_show(struct device *dev, 73static ssize_t channels_supported_show(struct device *dev,
74 struct device_attribute *attr, 74 struct device_attribute *attr,
diff --git a/net/mac802154/driver-ops.h b/net/mac802154/driver-ops.h
index f21e864613d0..98180a9fff4a 100644
--- a/net/mac802154/driver-ops.h
+++ b/net/mac802154/driver-ops.h
@@ -70,7 +70,8 @@ static inline int drv_set_tx_power(struct ieee802154_local *local, s8 dbm)
70 return local->ops->set_txpower(&local->hw, dbm); 70 return local->ops->set_txpower(&local->hw, dbm);
71} 71}
72 72
73static inline int drv_set_cca_mode(struct ieee802154_local *local, u8 cca_mode) 73static inline int drv_set_cca_mode(struct ieee802154_local *local,
74 const struct wpan_phy_cca *cca)
74{ 75{
75 might_sleep(); 76 might_sleep();
76 77
@@ -79,7 +80,7 @@ static inline int drv_set_cca_mode(struct ieee802154_local *local, u8 cca_mode)
79 return -EOPNOTSUPP; 80 return -EOPNOTSUPP;
80 } 81 }
81 82
82 return local->ops->set_cca_mode(&local->hw, cca_mode); 83 return local->ops->set_cca_mode(&local->hw, cca);
83} 84}
84 85
85static inline int drv_set_lbt_mode(struct ieee802154_local *local, bool mode) 86static inline int drv_set_lbt_mode(struct ieee802154_local *local, bool mode)
diff --git a/net/mac802154/mac_cmd.c b/net/mac802154/mac_cmd.c
index 6aacb1816889..bdccb4ecd30f 100644
--- a/net/mac802154/mac_cmd.c
+++ b/net/mac802154/mac_cmd.c
@@ -81,7 +81,7 @@ static int mac802154_set_mac_params(struct net_device *dev,
81 81
82 /* PHY */ 82 /* PHY */
83 wpan_dev->wpan_phy->transmit_power = params->transmit_power; 83 wpan_dev->wpan_phy->transmit_power = params->transmit_power;
84 wpan_dev->wpan_phy->cca_mode = params->cca_mode; 84 wpan_dev->wpan_phy->cca = params->cca;
85 wpan_dev->wpan_phy->cca_ed_level = params->cca_ed_level; 85 wpan_dev->wpan_phy->cca_ed_level = params->cca_ed_level;
86 86
87 /* MAC */ 87 /* MAC */
@@ -98,7 +98,7 @@ static int mac802154_set_mac_params(struct net_device *dev,
98 } 98 }
99 99
100 if (local->hw.flags & IEEE802154_HW_CCA_MODE) { 100 if (local->hw.flags & IEEE802154_HW_CCA_MODE) {
101 ret = drv_set_cca_mode(local, params->cca_mode); 101 ret = drv_set_cca_mode(local, &params->cca);
102 if (ret < 0) 102 if (ret < 0)
103 return ret; 103 return ret;
104 } 104 }
@@ -122,7 +122,7 @@ static void mac802154_get_mac_params(struct net_device *dev,
122 122
123 /* PHY */ 123 /* PHY */
124 params->transmit_power = wpan_dev->wpan_phy->transmit_power; 124 params->transmit_power = wpan_dev->wpan_phy->transmit_power;
125 params->cca_mode = wpan_dev->wpan_phy->cca_mode; 125 params->cca = wpan_dev->wpan_phy->cca;
126 params->cca_ed_level = wpan_dev->wpan_phy->cca_ed_level; 126 params->cca_ed_level = wpan_dev->wpan_phy->cca_ed_level;
127 127
128 /* MAC */ 128 /* MAC */