blob: b1e73bc6e398955ded2ec48863095dc37d8581e6 [file] [log] [blame]
Alan Ott3731a332012-09-02 15:44:13 +00001/*
2 * Driver for Microchip MRF24J40 802.15.4 Wireless-PAN Networking controller
3 *
4 * Copyright (C) 2012 Alan Ott <alan@signal11.us>
5 * Signal 11 Software
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include <linux/spi/spi.h>
23#include <linux/interrupt.h>
24#include <linux/module.h>
25#include <net/wpan-phy.h>
26#include <net/mac802154.h>
Alan Ottcbde8122013-04-05 10:34:51 +000027#include <net/ieee802154.h>
Alan Ott3731a332012-09-02 15:44:13 +000028
29/* MRF24J40 Short Address Registers */
30#define REG_RXMCR 0x00 /* Receive MAC control */
31#define REG_PANIDL 0x01 /* PAN ID (low) */
32#define REG_PANIDH 0x02 /* PAN ID (high) */
33#define REG_SADRL 0x03 /* Short address (low) */
34#define REG_SADRH 0x04 /* Short address (high) */
35#define REG_EADR0 0x05 /* Long address (low) (high is EADR7) */
36#define REG_TXMCR 0x11 /* Transmit MAC control */
37#define REG_PACON0 0x16 /* Power Amplifier Control */
38#define REG_PACON1 0x17 /* Power Amplifier Control */
39#define REG_PACON2 0x18 /* Power Amplifier Control */
40#define REG_TXNCON 0x1B /* Transmit Normal FIFO Control */
41#define REG_TXSTAT 0x24 /* TX MAC Status Register */
42#define REG_SOFTRST 0x2A /* Soft Reset */
43#define REG_TXSTBL 0x2E /* TX Stabilization */
44#define REG_INTSTAT 0x31 /* Interrupt Status */
45#define REG_INTCON 0x32 /* Interrupt Control */
Simon Vincentdb9e0ee2014-10-06 10:39:45 +010046#define REG_GPIO 0x33 /* GPIO */
47#define REG_TRISGPIO 0x34 /* GPIO direction */
Alan Ott3731a332012-09-02 15:44:13 +000048#define REG_RFCTL 0x36 /* RF Control Mode Register */
49#define REG_BBREG1 0x39 /* Baseband Registers */
50#define REG_BBREG2 0x3A /* */
51#define REG_BBREG6 0x3E /* */
52#define REG_CCAEDTH 0x3F /* Energy Detection Threshold */
53
54/* MRF24J40 Long Address Registers */
55#define REG_RFCON0 0x200 /* RF Control Registers */
56#define REG_RFCON1 0x201
57#define REG_RFCON2 0x202
58#define REG_RFCON3 0x203
59#define REG_RFCON5 0x205
60#define REG_RFCON6 0x206
61#define REG_RFCON7 0x207
62#define REG_RFCON8 0x208
63#define REG_RSSI 0x210
64#define REG_SLPCON0 0x211 /* Sleep Clock Control Registers */
65#define REG_SLPCON1 0x220
66#define REG_WAKETIMEL 0x222 /* Wake-up Time Match Value Low */
67#define REG_WAKETIMEH 0x223 /* Wake-up Time Match Value High */
Simon Vincentdb9e0ee2014-10-06 10:39:45 +010068#define REG_TESTMODE 0x22F /* Test mode */
Alan Ott3731a332012-09-02 15:44:13 +000069#define REG_RX_FIFO 0x300 /* Receive FIFO */
70
71/* Device configuration: Only channels 11-26 on page 0 are supported. */
72#define MRF24J40_CHAN_MIN 11
73#define MRF24J40_CHAN_MAX 26
74#define CHANNEL_MASK (((u32)1 << (MRF24J40_CHAN_MAX + 1)) \
75 - ((u32)1 << MRF24J40_CHAN_MIN))
76
77#define TX_FIFO_SIZE 128 /* From datasheet */
78#define RX_FIFO_SIZE 144 /* From datasheet */
79#define SET_CHANNEL_DELAY_US 192 /* From datasheet */
80
Simon Vincentdb9e0ee2014-10-06 10:39:45 +010081enum mrf24j40_modules { MRF24J40, MRF24J40MA, MRF24J40MC };
82
Alan Ott3731a332012-09-02 15:44:13 +000083/* Device Private Data */
84struct mrf24j40 {
85 struct spi_device *spi;
86 struct ieee802154_dev *dev;
87
88 struct mutex buffer_mutex; /* only used to protect buf */
89 struct completion tx_complete;
Alan Ott3731a332012-09-02 15:44:13 +000090 u8 *buf; /* 3 bytes. Used for SPI single-register transfers. */
91};
92
93/* Read/Write SPI Commands for Short and Long Address registers. */
94#define MRF24J40_READSHORT(reg) ((reg) << 1)
95#define MRF24J40_WRITESHORT(reg) ((reg) << 1 | 1)
96#define MRF24J40_READLONG(reg) (1 << 15 | (reg) << 5)
97#define MRF24J40_WRITELONG(reg) (1 << 15 | (reg) << 5 | 1 << 4)
98
Alan Ottcf82dab2013-03-18 12:06:42 +000099/* The datasheet indicates the theoretical maximum for SCK to be 10MHz */
100#define MAX_SPI_SPEED_HZ 10000000
Alan Ott3731a332012-09-02 15:44:13 +0000101
102#define printdev(X) (&X->spi->dev)
103
104static int write_short_reg(struct mrf24j40 *devrec, u8 reg, u8 value)
105{
106 int ret;
107 struct spi_message msg;
108 struct spi_transfer xfer = {
109 .len = 2,
110 .tx_buf = devrec->buf,
111 .rx_buf = devrec->buf,
112 };
113
114 spi_message_init(&msg);
115 spi_message_add_tail(&xfer, &msg);
116
117 mutex_lock(&devrec->buffer_mutex);
118 devrec->buf[0] = MRF24J40_WRITESHORT(reg);
119 devrec->buf[1] = value;
120
121 ret = spi_sync(devrec->spi, &msg);
122 if (ret)
123 dev_err(printdev(devrec),
124 "SPI write Failed for short register 0x%hhx\n", reg);
125
126 mutex_unlock(&devrec->buffer_mutex);
127 return ret;
128}
129
130static int read_short_reg(struct mrf24j40 *devrec, u8 reg, u8 *val)
131{
132 int ret = -1;
133 struct spi_message msg;
134 struct spi_transfer xfer = {
135 .len = 2,
136 .tx_buf = devrec->buf,
137 .rx_buf = devrec->buf,
138 };
139
140 spi_message_init(&msg);
141 spi_message_add_tail(&xfer, &msg);
142
143 mutex_lock(&devrec->buffer_mutex);
144 devrec->buf[0] = MRF24J40_READSHORT(reg);
145 devrec->buf[1] = 0;
146
147 ret = spi_sync(devrec->spi, &msg);
148 if (ret)
149 dev_err(printdev(devrec),
150 "SPI read Failed for short register 0x%hhx\n", reg);
151 else
152 *val = devrec->buf[1];
153
154 mutex_unlock(&devrec->buffer_mutex);
155 return ret;
156}
157
158static int read_long_reg(struct mrf24j40 *devrec, u16 reg, u8 *value)
159{
160 int ret;
161 u16 cmd;
162 struct spi_message msg;
163 struct spi_transfer xfer = {
164 .len = 3,
165 .tx_buf = devrec->buf,
166 .rx_buf = devrec->buf,
167 };
168
169 spi_message_init(&msg);
170 spi_message_add_tail(&xfer, &msg);
171
172 cmd = MRF24J40_READLONG(reg);
173 mutex_lock(&devrec->buffer_mutex);
174 devrec->buf[0] = cmd >> 8 & 0xff;
175 devrec->buf[1] = cmd & 0xff;
176 devrec->buf[2] = 0;
177
178 ret = spi_sync(devrec->spi, &msg);
179 if (ret)
180 dev_err(printdev(devrec),
181 "SPI read Failed for long register 0x%hx\n", reg);
182 else
183 *value = devrec->buf[2];
184
185 mutex_unlock(&devrec->buffer_mutex);
186 return ret;
187}
188
189static int write_long_reg(struct mrf24j40 *devrec, u16 reg, u8 val)
190{
191 int ret;
192 u16 cmd;
193 struct spi_message msg;
194 struct spi_transfer xfer = {
195 .len = 3,
196 .tx_buf = devrec->buf,
197 .rx_buf = devrec->buf,
198 };
199
200 spi_message_init(&msg);
201 spi_message_add_tail(&xfer, &msg);
202
203 cmd = MRF24J40_WRITELONG(reg);
204 mutex_lock(&devrec->buffer_mutex);
205 devrec->buf[0] = cmd >> 8 & 0xff;
206 devrec->buf[1] = cmd & 0xff;
207 devrec->buf[2] = val;
208
209 ret = spi_sync(devrec->spi, &msg);
210 if (ret)
211 dev_err(printdev(devrec),
212 "SPI write Failed for long register 0x%hx\n", reg);
213
214 mutex_unlock(&devrec->buffer_mutex);
215 return ret;
216}
217
218/* This function relies on an undocumented write method. Once a write command
219 and address is set, as many bytes of data as desired can be clocked into
220 the device. The datasheet only shows setting one byte at a time. */
221static int write_tx_buf(struct mrf24j40 *devrec, u16 reg,
222 const u8 *data, size_t length)
223{
224 int ret;
225 u16 cmd;
226 u8 lengths[2];
227 struct spi_message msg;
228 struct spi_transfer addr_xfer = {
229 .len = 2,
230 .tx_buf = devrec->buf,
231 };
232 struct spi_transfer lengths_xfer = {
233 .len = 2,
234 .tx_buf = &lengths, /* TODO: Is DMA really required for SPI? */
235 };
236 struct spi_transfer data_xfer = {
237 .len = length,
238 .tx_buf = data,
239 };
240
241 /* Range check the length. 2 bytes are used for the length fields.*/
242 if (length > TX_FIFO_SIZE-2) {
243 dev_err(printdev(devrec), "write_tx_buf() was passed too large a buffer. Performing short write.\n");
244 length = TX_FIFO_SIZE-2;
245 }
246
247 spi_message_init(&msg);
248 spi_message_add_tail(&addr_xfer, &msg);
249 spi_message_add_tail(&lengths_xfer, &msg);
250 spi_message_add_tail(&data_xfer, &msg);
251
252 cmd = MRF24J40_WRITELONG(reg);
253 mutex_lock(&devrec->buffer_mutex);
254 devrec->buf[0] = cmd >> 8 & 0xff;
255 devrec->buf[1] = cmd & 0xff;
256 lengths[0] = 0x0; /* Header Length. Set to 0 for now. TODO */
257 lengths[1] = length; /* Total length */
258
259 ret = spi_sync(devrec->spi, &msg);
260 if (ret)
261 dev_err(printdev(devrec), "SPI write Failed for TX buf\n");
262
263 mutex_unlock(&devrec->buffer_mutex);
264 return ret;
265}
266
267static int mrf24j40_read_rx_buf(struct mrf24j40 *devrec,
268 u8 *data, u8 *len, u8 *lqi)
269{
270 u8 rx_len;
271 u8 addr[2];
272 u8 lqi_rssi[2];
273 u16 cmd;
274 int ret;
275 struct spi_message msg;
276 struct spi_transfer addr_xfer = {
277 .len = 2,
278 .tx_buf = &addr,
279 };
280 struct spi_transfer data_xfer = {
281 .len = 0x0, /* set below */
282 .rx_buf = data,
283 };
284 struct spi_transfer status_xfer = {
285 .len = 2,
286 .rx_buf = &lqi_rssi,
287 };
288
289 /* Get the length of the data in the RX FIFO. The length in this
290 * register exclues the 1-byte length field at the beginning. */
291 ret = read_long_reg(devrec, REG_RX_FIFO, &rx_len);
292 if (ret)
293 goto out;
294
295 /* Range check the RX FIFO length, accounting for the one-byte
296 * length field at the begining. */
297 if (rx_len > RX_FIFO_SIZE-1) {
298 dev_err(printdev(devrec), "Invalid length read from device. Performing short read.\n");
299 rx_len = RX_FIFO_SIZE-1;
300 }
301
302 if (rx_len > *len) {
303 /* Passed in buffer wasn't big enough. Should never happen. */
304 dev_err(printdev(devrec), "Buffer not big enough. Performing short read\n");
305 rx_len = *len;
306 }
307
308 /* Set up the commands to read the data. */
309 cmd = MRF24J40_READLONG(REG_RX_FIFO+1);
310 addr[0] = cmd >> 8 & 0xff;
311 addr[1] = cmd & 0xff;
312 data_xfer.len = rx_len;
313
314 spi_message_init(&msg);
315 spi_message_add_tail(&addr_xfer, &msg);
316 spi_message_add_tail(&data_xfer, &msg);
317 spi_message_add_tail(&status_xfer, &msg);
318
319 ret = spi_sync(devrec->spi, &msg);
320 if (ret) {
321 dev_err(printdev(devrec), "SPI RX Buffer Read Failed.\n");
322 goto out;
323 }
324
325 *lqi = lqi_rssi[0];
326 *len = rx_len;
327
328#ifdef DEBUG
329 print_hex_dump(KERN_DEBUG, "mrf24j40 rx: ",
330 DUMP_PREFIX_OFFSET, 16, 1, data, *len, 0);
Varka Bhadramca079ad2014-09-24 12:21:32 +0200331 pr_debug("mrf24j40 rx: lqi: %02hhx rssi: %02hhx\n",
332 lqi_rssi[0], lqi_rssi[1]);
Alan Ott3731a332012-09-02 15:44:13 +0000333#endif
334
335out:
336 return ret;
337}
338
339static int mrf24j40_tx(struct ieee802154_dev *dev, struct sk_buff *skb)
340{
341 struct mrf24j40 *devrec = dev->priv;
342 u8 val;
343 int ret = 0;
344
345 dev_dbg(printdev(devrec), "tx packet of %d bytes\n", skb->len);
346
347 ret = write_tx_buf(devrec, 0x000, skb->data, skb->len);
348 if (ret)
349 goto err;
350
Wolfram Sang16735d02013-11-14 14:32:02 -0800351 reinit_completion(&devrec->tx_complete);
Alan Ott9757f1d2013-10-05 23:52:22 -0400352
Alan Ott3731a332012-09-02 15:44:13 +0000353 /* Set TXNTRIG bit of TXNCON to send packet */
354 ret = read_short_reg(devrec, REG_TXNCON, &val);
355 if (ret)
356 goto err;
357 val |= 0x1;
Alan Ottcbde8122013-04-05 10:34:51 +0000358 /* Set TXNACKREQ if the ACK bit is set in the packet. */
359 if (skb->data[0] & IEEE802154_FC_ACK_REQ)
360 val |= 0x4;
Alan Ott3731a332012-09-02 15:44:13 +0000361 write_short_reg(devrec, REG_TXNCON, val);
362
Alan Ott3731a332012-09-02 15:44:13 +0000363 /* Wait for the device to send the TX complete interrupt. */
364 ret = wait_for_completion_interruptible_timeout(
365 &devrec->tx_complete,
366 5 * HZ);
367 if (ret == -ERESTARTSYS)
368 goto err;
369 if (ret == 0) {
Alan Ott7a1c2312013-03-18 12:06:41 +0000370 dev_warn(printdev(devrec), "Timeout waiting for TX interrupt\n");
Alan Ott3731a332012-09-02 15:44:13 +0000371 ret = -ETIMEDOUT;
372 goto err;
373 }
374
375 /* Check for send error from the device. */
376 ret = read_short_reg(devrec, REG_TXSTAT, &val);
377 if (ret)
378 goto err;
379 if (val & 0x1) {
Alan Ottcbde8122013-04-05 10:34:51 +0000380 dev_dbg(printdev(devrec), "Error Sending. Retry count exceeded\n");
Alan Ott3731a332012-09-02 15:44:13 +0000381 ret = -ECOMM; /* TODO: Better error code ? */
382 } else
383 dev_dbg(printdev(devrec), "Packet Sent\n");
384
385err:
386
387 return ret;
388}
389
390static int mrf24j40_ed(struct ieee802154_dev *dev, u8 *level)
391{
392 /* TODO: */
Varka Bhadramca079ad2014-09-24 12:21:32 +0200393 pr_warn("mrf24j40: ed not implemented\n");
Alan Ott3731a332012-09-02 15:44:13 +0000394 *level = 0;
395 return 0;
396}
397
398static int mrf24j40_start(struct ieee802154_dev *dev)
399{
400 struct mrf24j40 *devrec = dev->priv;
401 u8 val;
402 int ret;
403
404 dev_dbg(printdev(devrec), "start\n");
405
406 ret = read_short_reg(devrec, REG_INTCON, &val);
407 if (ret)
408 return ret;
409 val &= ~(0x1|0x8); /* Clear TXNIE and RXIE. Enable interrupts */
410 write_short_reg(devrec, REG_INTCON, val);
411
412 return 0;
413}
414
415static void mrf24j40_stop(struct ieee802154_dev *dev)
416{
417 struct mrf24j40 *devrec = dev->priv;
418 u8 val;
419 int ret;
Varka Bhadram529160d2014-09-24 12:21:30 +0200420
Alan Ott3731a332012-09-02 15:44:13 +0000421 dev_dbg(printdev(devrec), "stop\n");
422
423 ret = read_short_reg(devrec, REG_INTCON, &val);
424 if (ret)
425 return;
426 val |= 0x1|0x8; /* Set TXNIE and RXIE. Disable Interrupts */
427 write_short_reg(devrec, REG_INTCON, val);
Alan Ott3731a332012-09-02 15:44:13 +0000428}
429
430static int mrf24j40_set_channel(struct ieee802154_dev *dev,
431 int page, int channel)
432{
433 struct mrf24j40 *devrec = dev->priv;
434 u8 val;
435 int ret;
436
437 dev_dbg(printdev(devrec), "Set Channel %d\n", channel);
438
439 WARN_ON(page != 0);
440 WARN_ON(channel < MRF24J40_CHAN_MIN);
441 WARN_ON(channel > MRF24J40_CHAN_MAX);
442
443 /* Set Channel TODO */
444 val = (channel-11) << 4 | 0x03;
445 write_long_reg(devrec, REG_RFCON0, val);
446
447 /* RF Reset */
448 ret = read_short_reg(devrec, REG_RFCTL, &val);
449 if (ret)
450 return ret;
451 val |= 0x04;
452 write_short_reg(devrec, REG_RFCTL, val);
453 val &= ~0x04;
454 write_short_reg(devrec, REG_RFCTL, val);
455
456 udelay(SET_CHANNEL_DELAY_US); /* per datasheet */
457
458 return 0;
459}
460
461static int mrf24j40_filter(struct ieee802154_dev *dev,
462 struct ieee802154_hw_addr_filt *filt,
463 unsigned long changed)
464{
465 struct mrf24j40 *devrec = dev->priv;
466
467 dev_dbg(printdev(devrec), "filter\n");
468
469 if (changed & IEEE802515_AFILT_SADDR_CHANGED) {
470 /* Short Addr */
471 u8 addrh, addrl;
Varka Bhadram529160d2014-09-24 12:21:30 +0200472
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100473 addrh = le16_to_cpu(filt->short_addr) >> 8 & 0xff;
474 addrl = le16_to_cpu(filt->short_addr) & 0xff;
Alan Ott3731a332012-09-02 15:44:13 +0000475
476 write_short_reg(devrec, REG_SADRH, addrh);
477 write_short_reg(devrec, REG_SADRL, addrl);
478 dev_dbg(printdev(devrec),
479 "Set short addr to %04hx\n", filt->short_addr);
480 }
481
482 if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) {
483 /* Device Address */
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100484 u8 i, addr[8];
485
486 memcpy(addr, &filt->ieee_addr, 8);
Alan Ott3731a332012-09-02 15:44:13 +0000487 for (i = 0; i < 8; i++)
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100488 write_short_reg(devrec, REG_EADR0 + i, addr[i]);
Alan Ott3731a332012-09-02 15:44:13 +0000489
490#ifdef DEBUG
Varka Bhadramca079ad2014-09-24 12:21:32 +0200491 pr_debug("Set long addr to: ");
Alan Ott3731a332012-09-02 15:44:13 +0000492 for (i = 0; i < 8; i++)
Varka Bhadramca079ad2014-09-24 12:21:32 +0200493 pr_debug("%02hhx ", addr[7 - i]);
494 pr_debug("\n");
Alan Ott3731a332012-09-02 15:44:13 +0000495#endif
496 }
497
498 if (changed & IEEE802515_AFILT_PANID_CHANGED) {
499 /* PAN ID */
500 u8 panidl, panidh;
Varka Bhadram529160d2014-09-24 12:21:30 +0200501
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100502 panidh = le16_to_cpu(filt->pan_id) >> 8 & 0xff;
503 panidl = le16_to_cpu(filt->pan_id) & 0xff;
Alan Ott3731a332012-09-02 15:44:13 +0000504 write_short_reg(devrec, REG_PANIDH, panidh);
505 write_short_reg(devrec, REG_PANIDL, panidl);
506
507 dev_dbg(printdev(devrec), "Set PANID to %04hx\n", filt->pan_id);
508 }
509
510 if (changed & IEEE802515_AFILT_PANC_CHANGED) {
511 /* Pan Coordinator */
512 u8 val;
513 int ret;
514
515 ret = read_short_reg(devrec, REG_RXMCR, &val);
516 if (ret)
517 return ret;
518 if (filt->pan_coord)
519 val |= 0x8;
520 else
521 val &= ~0x8;
522 write_short_reg(devrec, REG_RXMCR, val);
523
524 /* REG_SLOTTED is maintained as default (unslotted/CSMA-CA).
525 * REG_ORDER is maintained as default (no beacon/superframe).
526 */
527
528 dev_dbg(printdev(devrec), "Set Pan Coord to %s\n",
529 filt->pan_coord ? "on" : "off");
530 }
531
532 return 0;
533}
534
535static int mrf24j40_handle_rx(struct mrf24j40 *devrec)
536{
537 u8 len = RX_FIFO_SIZE;
538 u8 lqi = 0;
539 u8 val;
540 int ret = 0;
541 struct sk_buff *skb;
542
543 /* Turn off reception of packets off the air. This prevents the
544 * device from overwriting the buffer while we're reading it. */
545 ret = read_short_reg(devrec, REG_BBREG1, &val);
546 if (ret)
547 goto out;
548 val |= 4; /* SET RXDECINV */
549 write_short_reg(devrec, REG_BBREG1, val);
550
551 skb = alloc_skb(len, GFP_KERNEL);
552 if (!skb) {
553 ret = -ENOMEM;
554 goto out;
555 }
556
557 ret = mrf24j40_read_rx_buf(devrec, skb_put(skb, len), &len, &lqi);
558 if (ret < 0) {
559 dev_err(printdev(devrec), "Failure reading RX FIFO\n");
560 kfree_skb(skb);
561 ret = -EINVAL;
562 goto out;
563 }
564
565 /* Cut off the checksum */
566 skb_trim(skb, len-2);
567
568 /* TODO: Other drivers call ieee20154_rx_irqsafe() here (eg: cc2040,
569 * also from a workqueue). I think irqsafe is not necessary here.
570 * Can someone confirm? */
571 ieee802154_rx_irqsafe(devrec->dev, skb, lqi);
572
573 dev_dbg(printdev(devrec), "RX Handled\n");
574
575out:
576 /* Turn back on reception of packets off the air. */
577 ret = read_short_reg(devrec, REG_BBREG1, &val);
578 if (ret)
579 return ret;
580 val &= ~0x4; /* Clear RXDECINV */
581 write_short_reg(devrec, REG_BBREG1, val);
582
583 return ret;
584}
585
586static struct ieee802154_ops mrf24j40_ops = {
587 .owner = THIS_MODULE,
588 .xmit = mrf24j40_tx,
589 .ed = mrf24j40_ed,
590 .start = mrf24j40_start,
591 .stop = mrf24j40_stop,
592 .set_channel = mrf24j40_set_channel,
593 .set_hw_addr_filt = mrf24j40_filter,
594};
595
596static irqreturn_t mrf24j40_isr(int irq, void *data)
597{
598 struct mrf24j40 *devrec = data;
Alan Ott3731a332012-09-02 15:44:13 +0000599 u8 intstat;
600 int ret;
601
602 /* Read the interrupt status */
603 ret = read_short_reg(devrec, REG_INTSTAT, &intstat);
604 if (ret)
605 goto out;
606
607 /* Check for TX complete */
608 if (intstat & 0x1)
609 complete(&devrec->tx_complete);
610
611 /* Check for Rx */
612 if (intstat & 0x8)
613 mrf24j40_handle_rx(devrec);
614
615out:
Alan Ott4a4e1da2013-10-05 23:52:23 -0400616 return IRQ_HANDLED;
Alan Ott3731a332012-09-02 15:44:13 +0000617}
618
Varka Bhadram3dac9a72014-06-16 09:12:31 +0530619static int mrf24j40_hw_init(struct mrf24j40 *devrec)
620{
621 int ret;
622 u8 val;
623
624 /* Initialize the device.
625 From datasheet section 3.2: Initialization. */
626 ret = write_short_reg(devrec, REG_SOFTRST, 0x07);
627 if (ret)
628 goto err_ret;
629
630 ret = write_short_reg(devrec, REG_PACON2, 0x98);
631 if (ret)
632 goto err_ret;
633
634 ret = write_short_reg(devrec, REG_TXSTBL, 0x95);
635 if (ret)
636 goto err_ret;
637
638 ret = write_long_reg(devrec, REG_RFCON0, 0x03);
639 if (ret)
640 goto err_ret;
641
642 ret = write_long_reg(devrec, REG_RFCON1, 0x01);
643 if (ret)
644 goto err_ret;
645
646 ret = write_long_reg(devrec, REG_RFCON2, 0x80);
647 if (ret)
648 goto err_ret;
649
650 ret = write_long_reg(devrec, REG_RFCON6, 0x90);
651 if (ret)
652 goto err_ret;
653
654 ret = write_long_reg(devrec, REG_RFCON7, 0x80);
655 if (ret)
656 goto err_ret;
657
658 ret = write_long_reg(devrec, REG_RFCON8, 0x10);
659 if (ret)
660 goto err_ret;
661
662 ret = write_long_reg(devrec, REG_SLPCON1, 0x21);
663 if (ret)
664 goto err_ret;
665
666 ret = write_short_reg(devrec, REG_BBREG2, 0x80);
667 if (ret)
668 goto err_ret;
669
670 ret = write_short_reg(devrec, REG_CCAEDTH, 0x60);
671 if (ret)
672 goto err_ret;
673
674 ret = write_short_reg(devrec, REG_BBREG6, 0x40);
675 if (ret)
676 goto err_ret;
677
678 ret = write_short_reg(devrec, REG_RFCTL, 0x04);
679 if (ret)
680 goto err_ret;
681
682 ret = write_short_reg(devrec, REG_RFCTL, 0x0);
683 if (ret)
684 goto err_ret;
685
686 udelay(192);
687
688 /* Set RX Mode. RXMCR<1:0>: 0x0 normal, 0x1 promisc, 0x2 error */
689 ret = read_short_reg(devrec, REG_RXMCR, &val);
690 if (ret)
691 goto err_ret;
692
693 val &= ~0x3; /* Clear RX mode (normal) */
694
695 ret = write_short_reg(devrec, REG_RXMCR, val);
696 if (ret)
697 goto err_ret;
698
Simon Vincentdb9e0ee2014-10-06 10:39:45 +0100699 if (spi_get_device_id(devrec->spi)->driver_data == MRF24J40MC) {
700 /* Enable external amplifier.
701 * From MRF24J40MC datasheet section 1.3: Operation.
702 */
703 read_long_reg(devrec, REG_TESTMODE, &val);
704 val |= 0x7; /* Configure GPIO 0-2 to control amplifier */
705 write_long_reg(devrec, REG_TESTMODE, val);
706
707 read_short_reg(devrec, REG_TRISGPIO, &val);
708 val |= 0x8; /* Set GPIO3 as output. */
709 write_short_reg(devrec, REG_TRISGPIO, val);
710
711 read_short_reg(devrec, REG_GPIO, &val);
712 val |= 0x8; /* Set GPIO3 HIGH to enable U5 voltage regulator */
713 write_short_reg(devrec, REG_GPIO, val);
714
715 /* Reduce TX pwr to meet FCC requirements.
716 * From MRF24J40MC datasheet section 3.1.1
717 */
718 write_long_reg(devrec, REG_RFCON3, 0x28);
719 }
720
Varka Bhadram3dac9a72014-06-16 09:12:31 +0530721 return 0;
722
723err_ret:
724 return ret;
725}
726
Bill Pembertonbb1f4602012-12-03 09:24:12 -0500727static int mrf24j40_probe(struct spi_device *spi)
Alan Ott3731a332012-09-02 15:44:13 +0000728{
729 int ret = -ENOMEM;
Alan Ott3731a332012-09-02 15:44:13 +0000730 struct mrf24j40 *devrec;
731
Varka Bhadramca079ad2014-09-24 12:21:32 +0200732 dev_info(&spi->dev, "probe(). IRQ: %d\n", spi->irq);
Alan Ott3731a332012-09-02 15:44:13 +0000733
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530734 devrec = devm_kzalloc(&spi->dev, sizeof(struct mrf24j40), GFP_KERNEL);
Alan Ott3731a332012-09-02 15:44:13 +0000735 if (!devrec)
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530736 goto err_ret;
737 devrec->buf = devm_kzalloc(&spi->dev, 3, GFP_KERNEL);
Alan Ott3731a332012-09-02 15:44:13 +0000738 if (!devrec->buf)
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530739 goto err_ret;
Alan Ott3731a332012-09-02 15:44:13 +0000740
741 spi->mode = SPI_MODE_0; /* TODO: Is this appropriate for right here? */
742 if (spi->max_speed_hz > MAX_SPI_SPEED_HZ)
743 spi->max_speed_hz = MAX_SPI_SPEED_HZ;
744
745 mutex_init(&devrec->buffer_mutex);
746 init_completion(&devrec->tx_complete);
Alan Ott3731a332012-09-02 15:44:13 +0000747 devrec->spi = spi;
Jingoo Han4fa0a0e2013-04-05 20:34:18 +0000748 spi_set_drvdata(spi, devrec);
Alan Ott3731a332012-09-02 15:44:13 +0000749
750 /* Register with the 802154 subsystem */
751
752 devrec->dev = ieee802154_alloc_device(0, &mrf24j40_ops);
753 if (!devrec->dev)
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530754 goto err_ret;
Alan Ott3731a332012-09-02 15:44:13 +0000755
756 devrec->dev->priv = devrec;
757 devrec->dev->parent = &devrec->spi->dev;
758 devrec->dev->phy->channels_supported[0] = CHANNEL_MASK;
759 devrec->dev->flags = IEEE802154_HW_OMIT_CKSUM|IEEE802154_HW_AACK;
760
761 dev_dbg(printdev(devrec), "registered mrf24j40\n");
762 ret = ieee802154_register_device(devrec->dev);
763 if (ret)
764 goto err_register_device;
765
Varka Bhadram3dac9a72014-06-16 09:12:31 +0530766 ret = mrf24j40_hw_init(devrec);
Alan Ott3731a332012-09-02 15:44:13 +0000767 if (ret)
Varka Bhadram3dac9a72014-06-16 09:12:31 +0530768 goto err_hw_init;
Alan Ott3731a332012-09-02 15:44:13 +0000769
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530770 ret = devm_request_threaded_irq(&spi->dev,
771 spi->irq,
772 NULL,
773 mrf24j40_isr,
774 IRQF_TRIGGER_LOW|IRQF_ONESHOT,
775 dev_name(&spi->dev),
776 devrec);
Alan Ott3731a332012-09-02 15:44:13 +0000777
778 if (ret) {
779 dev_err(printdev(devrec), "Unable to get IRQ");
780 goto err_irq;
781 }
782
783 return 0;
784
785err_irq:
Varka Bhadram3dac9a72014-06-16 09:12:31 +0530786err_hw_init:
Alan Ott3731a332012-09-02 15:44:13 +0000787 ieee802154_unregister_device(devrec->dev);
788err_register_device:
789 ieee802154_free_device(devrec->dev);
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530790err_ret:
Alan Ott3731a332012-09-02 15:44:13 +0000791 return ret;
792}
793
Bill Pembertonbb1f4602012-12-03 09:24:12 -0500794static int mrf24j40_remove(struct spi_device *spi)
Alan Ott3731a332012-09-02 15:44:13 +0000795{
Jingoo Han4fa0a0e2013-04-05 20:34:18 +0000796 struct mrf24j40 *devrec = spi_get_drvdata(spi);
Alan Ott3731a332012-09-02 15:44:13 +0000797
798 dev_dbg(printdev(devrec), "remove\n");
799
Alan Ott3731a332012-09-02 15:44:13 +0000800 ieee802154_unregister_device(devrec->dev);
801 ieee802154_free_device(devrec->dev);
802 /* TODO: Will ieee802154_free_device() wait until ->xmit() is
803 * complete? */
804
Alan Ott3731a332012-09-02 15:44:13 +0000805 return 0;
806}
807
808static const struct spi_device_id mrf24j40_ids[] = {
Simon Vincentdb9e0ee2014-10-06 10:39:45 +0100809 { "mrf24j40", MRF24J40 },
810 { "mrf24j40ma", MRF24J40MA },
811 { "mrf24j40mc", MRF24J40MC },
Alan Ott3731a332012-09-02 15:44:13 +0000812 { },
813};
814MODULE_DEVICE_TABLE(spi, mrf24j40_ids);
815
816static struct spi_driver mrf24j40_driver = {
817 .driver = {
818 .name = "mrf24j40",
819 .bus = &spi_bus_type,
820 .owner = THIS_MODULE,
821 },
822 .id_table = mrf24j40_ids,
823 .probe = mrf24j40_probe,
Bill Pembertonbb1f4602012-12-03 09:24:12 -0500824 .remove = mrf24j40_remove,
Alan Ott3731a332012-09-02 15:44:13 +0000825};
826
Wei Yongjun3d4a1312013-04-08 20:34:44 +0000827module_spi_driver(mrf24j40_driver);
Alan Ott3731a332012-09-02 15:44:13 +0000828
829MODULE_LICENSE("GPL");
830MODULE_AUTHOR("Alan Ott");
831MODULE_DESCRIPTION("MRF24J40 SPI 802.15.4 Controller Driver");