aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ieee802154/at86rf230.c81
-rw-r--r--include/net/mac802154.h19
-rw-r--r--net/mac802154/ieee802154_dev.c60
3 files changed, 102 insertions, 58 deletions
diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c
index 50899416f668..dca6bae1402c 100644
--- a/drivers/net/ieee802154/at86rf230.c
+++ b/drivers/net/ieee802154/at86rf230.c
@@ -784,7 +784,7 @@ at86rf230_set_hw_addr_filt(struct ieee802154_dev *dev,
784} 784}
785 785
786static int 786static int
787at86rf212_set_txpower(struct ieee802154_dev *dev, int db) 787at86rf230_set_txpower(struct ieee802154_dev *dev, int db)
788{ 788{
789 struct at86rf230_local *lp = dev->priv; 789 struct at86rf230_local *lp = dev->priv;
790 790
@@ -803,7 +803,7 @@ at86rf212_set_txpower(struct ieee802154_dev *dev, int db)
803} 803}
804 804
805static int 805static int
806at86rf212_set_lbt(struct ieee802154_dev *dev, bool on) 806at86rf230_set_lbt(struct ieee802154_dev *dev, bool on)
807{ 807{
808 struct at86rf230_local *lp = dev->priv; 808 struct at86rf230_local *lp = dev->priv;
809 809
@@ -811,7 +811,7 @@ at86rf212_set_lbt(struct ieee802154_dev *dev, bool on)
811} 811}
812 812
813static int 813static int
814at86rf212_set_cca_mode(struct ieee802154_dev *dev, u8 mode) 814at86rf230_set_cca_mode(struct ieee802154_dev *dev, u8 mode)
815{ 815{
816 struct at86rf230_local *lp = dev->priv; 816 struct at86rf230_local *lp = dev->priv;
817 817
@@ -819,7 +819,7 @@ at86rf212_set_cca_mode(struct ieee802154_dev *dev, u8 mode)
819} 819}
820 820
821static int 821static int
822at86rf212_set_cca_ed_level(struct ieee802154_dev *dev, s32 level) 822at86rf230_set_cca_ed_level(struct ieee802154_dev *dev, s32 level)
823{ 823{
824 struct at86rf230_local *lp = dev->priv; 824 struct at86rf230_local *lp = dev->priv;
825 int desens_steps; 825 int desens_steps;
@@ -833,7 +833,7 @@ at86rf212_set_cca_ed_level(struct ieee802154_dev *dev, s32 level)
833} 833}
834 834
835static int 835static int
836at86rf212_set_csma_params(struct ieee802154_dev *dev, u8 min_be, u8 max_be, 836at86rf230_set_csma_params(struct ieee802154_dev *dev, u8 min_be, u8 max_be,
837 u8 retries) 837 u8 retries)
838{ 838{
839 struct at86rf230_local *lp = dev->priv; 839 struct at86rf230_local *lp = dev->priv;
@@ -854,7 +854,7 @@ at86rf212_set_csma_params(struct ieee802154_dev *dev, u8 min_be, u8 max_be,
854} 854}
855 855
856static int 856static int
857at86rf212_set_frame_retries(struct ieee802154_dev *dev, s8 retries) 857at86rf230_set_frame_retries(struct ieee802154_dev *dev, s8 retries)
858{ 858{
859 struct at86rf230_local *lp = dev->priv; 859 struct at86rf230_local *lp = dev->priv;
860 int rc = 0; 860 int rc = 0;
@@ -878,22 +878,12 @@ static struct ieee802154_ops at86rf230_ops = {
878 .start = at86rf230_start, 878 .start = at86rf230_start,
879 .stop = at86rf230_stop, 879 .stop = at86rf230_stop,
880 .set_hw_addr_filt = at86rf230_set_hw_addr_filt, 880 .set_hw_addr_filt = at86rf230_set_hw_addr_filt,
881}; 881 .set_txpower = at86rf230_set_txpower,
882 882 .set_lbt = at86rf230_set_lbt,
883static struct ieee802154_ops at86rf212_ops = { 883 .set_cca_mode = at86rf230_set_cca_mode,
884 .owner = THIS_MODULE, 884 .set_cca_ed_level = at86rf230_set_cca_ed_level,
885 .xmit = at86rf230_xmit, 885 .set_csma_params = at86rf230_set_csma_params,
886 .ed = at86rf230_ed, 886 .set_frame_retries = at86rf230_set_frame_retries,
887 .set_channel = at86rf230_channel,
888 .start = at86rf230_start,
889 .stop = at86rf230_stop,
890 .set_hw_addr_filt = at86rf230_set_hw_addr_filt,
891 .set_txpower = at86rf212_set_txpower,
892 .set_lbt = at86rf212_set_lbt,
893 .set_cca_mode = at86rf212_set_cca_mode,
894 .set_cca_ed_level = at86rf212_set_cca_ed_level,
895 .set_csma_params = at86rf212_set_csma_params,
896 .set_frame_retries = at86rf212_set_frame_retries,
897}; 887};
898 888
899static void at86rf230_irqwork(struct work_struct *work) 889static void at86rf230_irqwork(struct work_struct *work)
@@ -1048,7 +1038,6 @@ static int at86rf230_probe(struct spi_device *spi)
1048 work_func_t irq_worker; 1038 work_func_t irq_worker;
1049 int rc, irq_type; 1039 int rc, irq_type;
1050 const char *chip; 1040 const char *chip;
1051 struct ieee802154_ops *ops = NULL;
1052 1041
1053 if (!spi->irq) { 1042 if (!spi->irq) {
1054 dev_err(&spi->dev, "no IRQ specified\n"); 1043 dev_err(&spi->dev, "no IRQ specified\n");
@@ -1084,9 +1073,25 @@ static int at86rf230_probe(struct spi_device *spi)
1084 usleep_range(120, 240); 1073 usleep_range(120, 240);
1085 } 1074 }
1086 1075
1076 dev = ieee802154_alloc_device(sizeof(*lp), &at86rf230_ops);
1077 if (!dev)
1078 return -ENOMEM;
1079
1080 lp = dev->priv;
1081 lp->dev = dev;
1082 lp->part = part;
1083 lp->vers = version;
1084
1085 lp->spi = spi;
1086
1087 dev->parent = &spi->dev;
1088 dev->extra_tx_headroom = 0;
1089 dev->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK |
1090 IEEE802154_HW_TXPOWER | IEEE802154_HW_CSMA;
1091
1087 rc = __at86rf230_detect_device(spi, &man_id, &part, &version); 1092 rc = __at86rf230_detect_device(spi, &man_id, &part, &version);
1088 if (rc < 0) 1093 if (rc < 0)
1089 return rc; 1094 goto free_dev;
1090 1095
1091 if (man_id != 0x001f) { 1096 if (man_id != 0x001f) {
1092 dev_err(&spi->dev, "Non-Atmel dev found (MAN_ID %02x %02x)\n", 1097 dev_err(&spi->dev, "Non-Atmel dev found (MAN_ID %02x %02x)\n",
@@ -1097,44 +1102,31 @@ static int at86rf230_probe(struct spi_device *spi)
1097 switch (part) { 1102 switch (part) {
1098 case 2: 1103 case 2:
1099 chip = "at86rf230"; 1104 chip = "at86rf230";
1105 rc = -ENOTSUPP;
1100 /* FIXME: should be easy to support; */ 1106 /* FIXME: should be easy to support; */
1101 break; 1107 break;
1102 case 3: 1108 case 3:
1103 chip = "at86rf231"; 1109 chip = "at86rf231";
1104 ops = &at86rf230_ops;
1105 break; 1110 break;
1106 case 7: 1111 case 7:
1107 chip = "at86rf212"; 1112 chip = "at86rf212";
1108 if (version == 1) 1113 if (version == 1)
1109 ops = &at86rf212_ops; 1114 dev->flags |= IEEE802154_HW_LBT;
1115 else
1116 rc = -ENOTSUPP;
1110 break; 1117 break;
1111 case 11: 1118 case 11:
1112 chip = "at86rf233"; 1119 chip = "at86rf233";
1113 ops = &at86rf230_ops;
1114 break; 1120 break;
1115 default: 1121 default:
1116 chip = "UNKNOWN"; 1122 chip = "UNKNOWN";
1123 rc = -ENOTSUPP;
1117 break; 1124 break;
1118 } 1125 }
1119 1126
1120 dev_info(&spi->dev, "Detected %s chip version %d\n", chip, version); 1127 dev_info(&spi->dev, "Detected %s chip version %d\n", chip, version);
1121 if (!ops) 1128 if (rc < 0)
1122 return -ENOTSUPP; 1129 goto free_dev;
1123
1124 dev = ieee802154_alloc_device(sizeof(*lp), ops);
1125 if (!dev)
1126 return -ENOMEM;
1127
1128 lp = dev->priv;
1129 lp->dev = dev;
1130 lp->part = part;
1131 lp->vers = version;
1132
1133 lp->spi = spi;
1134
1135 dev->parent = &spi->dev;
1136 dev->extra_tx_headroom = 0;
1137 dev->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AACK;
1138 1130
1139 irq_type = irq_get_trigger_type(spi->irq); 1131 irq_type = irq_get_trigger_type(spi->irq);
1140 if (!irq_type) 1132 if (!irq_type)
@@ -1185,6 +1177,7 @@ static int at86rf230_probe(struct spi_device *spi)
1185err_hw_init: 1177err_hw_init:
1186 flush_work(&lp->irqwork); 1178 flush_work(&lp->irqwork);
1187 mutex_destroy(&lp->bmux); 1179 mutex_destroy(&lp->bmux);
1180free_dev:
1188 ieee802154_free_device(lp->dev); 1181 ieee802154_free_device(lp->dev);
1189 1182
1190 return rc; 1183 return rc;
diff --git a/include/net/mac802154.h b/include/net/mac802154.h
index a591053cae63..2e67cdd19cdc 100644
--- a/include/net/mac802154.h
+++ b/include/net/mac802154.h
@@ -80,6 +80,25 @@ struct ieee802154_dev {
80#define IEEE802154_HW_OMIT_CKSUM 0x00000001 80#define IEEE802154_HW_OMIT_CKSUM 0x00000001
81/* Indicates that receiver will autorespond with ACK frames. */ 81/* Indicates that receiver will autorespond with ACK frames. */
82#define IEEE802154_HW_AACK 0x00000002 82#define IEEE802154_HW_AACK 0x00000002
83/* Indicates that transceiver will support transmit power setting. */
84#define IEEE802154_HW_TXPOWER 0x00000004
85/* Indicates that transceiver will support listen before transmit. */
86#define IEEE802154_HW_LBT 0x00000008
87/* Indicates that transceiver will support cca mode setting. */
88#define IEEE802154_HW_CCA_MODE 0x00000010
89/* Indicates that transceiver will support cca ed level setting. */
90#define IEEE802154_HW_CCA_ED_LEVEL 0x00000020
91/* Indicates that transceiver will support csma (max_be, min_be, csma retries)
92 * settings. */
93#define IEEE802154_HW_CSMA_PARAMS 0x00000040
94/* Indicates that transceiver will support ARET frame retries setting. */
95#define IEEE802154_HW_FRAME_RETRIES 0x00000080
96
97/* This groups the most common CSMA support fields into one. */
98#define IEEE802154_HW_CSMA (IEEE802154_HW_CCA_MODE | \
99 IEEE802154_HW_CCA_ED_LEVEL | \
100 IEEE802154_HW_CSMA_PARAMS | \
101 IEEE802154_HW_FRAME_RETRIES)
83 102
84/* struct ieee802154_ops - callbacks from mac802154 to the driver 103/* struct ieee802154_ops - callbacks from mac802154 to the driver
85 * 104 *
diff --git a/net/mac802154/ieee802154_dev.c b/net/mac802154/ieee802154_dev.c
index c4d4568611ca..9b54370f5e87 100644
--- a/net/mac802154/ieee802154_dev.c
+++ b/net/mac802154/ieee802154_dev.c
@@ -304,29 +304,61 @@ EXPORT_SYMBOL(ieee802154_free_device);
304int ieee802154_register_device(struct ieee802154_dev *dev) 304int ieee802154_register_device(struct ieee802154_dev *dev)
305{ 305{
306 struct mac802154_priv *priv = mac802154_to_priv(dev); 306 struct mac802154_priv *priv = mac802154_to_priv(dev);
307 int rc = -ENOMEM; 307 int rc = -ENOSYS;
308
309 if (dev->flags & IEEE802154_HW_TXPOWER) {
310 if (!priv->ops->set_txpower)
311 goto out;
312
313 priv->phy->set_txpower = mac802154_set_txpower;
314 }
315
316 if (dev->flags & IEEE802154_HW_LBT) {
317 if (!priv->ops->set_lbt)
318 goto out;
319
320 priv->phy->set_lbt = mac802154_set_lbt;
321 }
322
323 if (dev->flags & IEEE802154_HW_CCA_MODE) {
324 if (!priv->ops->set_cca_mode)
325 goto out;
326
327 priv->phy->set_cca_mode = mac802154_set_cca_mode;
328 }
329
330 if (dev->flags & IEEE802154_HW_CCA_ED_LEVEL) {
331 if (!priv->ops->set_cca_ed_level)
332 goto out;
333
334 priv->phy->set_cca_ed_level = mac802154_set_cca_ed_level;
335 }
336
337 if (dev->flags & IEEE802154_HW_CSMA_PARAMS) {
338 if (!priv->ops->set_csma_params)
339 goto out;
340
341 priv->phy->set_csma_params = mac802154_set_csma_params;
342 }
343
344 if (dev->flags & IEEE802154_HW_FRAME_RETRIES) {
345 if (!priv->ops->set_frame_retries)
346 goto out;
347
348 priv->phy->set_frame_retries = mac802154_set_frame_retries;
349 }
308 350
309 priv->dev_workqueue = 351 priv->dev_workqueue =
310 create_singlethread_workqueue(wpan_phy_name(priv->phy)); 352 create_singlethread_workqueue(wpan_phy_name(priv->phy));
311 if (!priv->dev_workqueue) 353 if (!priv->dev_workqueue) {
354 rc = -ENOMEM;
312 goto out; 355 goto out;
356 }
313 357
314 wpan_phy_set_dev(priv->phy, priv->hw.parent); 358 wpan_phy_set_dev(priv->phy, priv->hw.parent);
315 359
316 priv->phy->add_iface = mac802154_add_iface; 360 priv->phy->add_iface = mac802154_add_iface;
317 priv->phy->del_iface = mac802154_del_iface; 361 priv->phy->del_iface = mac802154_del_iface;
318 if (priv->ops->set_txpower)
319 priv->phy->set_txpower = mac802154_set_txpower;
320 if (priv->ops->set_lbt)
321 priv->phy->set_lbt = mac802154_set_lbt;
322 if (priv->ops->set_cca_mode)
323 priv->phy->set_cca_mode = mac802154_set_cca_mode;
324 if (priv->ops->set_cca_ed_level)
325 priv->phy->set_cca_ed_level = mac802154_set_cca_ed_level;
326 if (priv->ops->set_csma_params)
327 priv->phy->set_csma_params = mac802154_set_csma_params;
328 if (priv->ops->set_frame_retries)
329 priv->phy->set_frame_retries = mac802154_set_frame_retries;
330 362
331 rc = wpan_phy_register(priv->phy); 363 rc = wpan_phy_register(priv->phy);
332 if (rc < 0) 364 if (rc < 0)