aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ieee802154/at86rf230.c
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2014-07-02 18:20:43 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-08 00:29:24 -0400
commit640985ec2ffd2a81f34dc5004f0951d2c6cb3d5e (patch)
tree6dc4ea00259a32766483c436aabe2a581bdee1e7 /drivers/net/ieee802154/at86rf230.c
parent1598c36afdd472560c1111cce473f8f88c747f14 (diff)
mac802154: at86rf230: add hw flags and merge ops
This patch adds new mac802154 hw flags for transmit power, csma and listen before transmit (lbt). These flags indicates that the transceiver supports these features. If the flags are set and the driver doesn't implement the necessary functions, then ieee802154_register_device returns -ENOSYS "Function not implemented". This patch merges also all at86rf230 operations into one operations structure and set the right hw flags for the at86rf230 transceivers. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ieee802154/at86rf230.c')
-rw-r--r--drivers/net/ieee802154/at86rf230.c81
1 files changed, 37 insertions, 44 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;