diff options
-rw-r--r-- | drivers/net/ieee802154/at86rf230.c | 81 | ||||
-rw-r--r-- | include/net/mac802154.h | 19 | ||||
-rw-r--r-- | net/mac802154/ieee802154_dev.c | 60 |
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 | ||
786 | static int | 786 | static int |
787 | at86rf212_set_txpower(struct ieee802154_dev *dev, int db) | 787 | at86rf230_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 | ||
805 | static int | 805 | static int |
806 | at86rf212_set_lbt(struct ieee802154_dev *dev, bool on) | 806 | at86rf230_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 | ||
813 | static int | 813 | static int |
814 | at86rf212_set_cca_mode(struct ieee802154_dev *dev, u8 mode) | 814 | at86rf230_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 | ||
821 | static int | 821 | static int |
822 | at86rf212_set_cca_ed_level(struct ieee802154_dev *dev, s32 level) | 822 | at86rf230_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 | ||
835 | static int | 835 | static int |
836 | at86rf212_set_csma_params(struct ieee802154_dev *dev, u8 min_be, u8 max_be, | 836 | at86rf230_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 | ||
856 | static int | 856 | static int |
857 | at86rf212_set_frame_retries(struct ieee802154_dev *dev, s8 retries) | 857 | at86rf230_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, | |
883 | static 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 | ||
899 | static void at86rf230_irqwork(struct work_struct *work) | 889 | static 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) | |||
1185 | err_hw_init: | 1177 | err_hw_init: |
1186 | flush_work(&lp->irqwork); | 1178 | flush_work(&lp->irqwork); |
1187 | mutex_destroy(&lp->bmux); | 1179 | mutex_destroy(&lp->bmux); |
1180 | free_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); | |||
304 | int ieee802154_register_device(struct ieee802154_dev *dev) | 304 | int 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) |