blob: 12f0606dce3ef58c3017d53017bc42a59b38bf00 [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.
Alan Ott3731a332012-09-02 15:44:13 +000016 */
17
18#include <linux/spi/spi.h>
19#include <linux/interrupt.h>
20#include <linux/module.h>
Alexander Aring4ca24ac2014-10-25 09:41:04 +020021#include <linux/ieee802154.h>
Alexander Aring5ad60d32014-10-25 09:41:02 +020022#include <net/cfg802154.h>
Alan Ott3731a332012-09-02 15:44:13 +000023#include <net/mac802154.h>
24
25/* MRF24J40 Short Address Registers */
Alexander Aringc9f883f2015-09-21 11:24:22 +020026#define REG_RXMCR 0x00 /* Receive MAC control */
27#define REG_PANIDL 0x01 /* PAN ID (low) */
28#define REG_PANIDH 0x02 /* PAN ID (high) */
29#define REG_SADRL 0x03 /* Short address (low) */
30#define REG_SADRH 0x04 /* Short address (high) */
31#define REG_EADR0 0x05 /* Long address (low) (high is EADR7) */
Alexander Aring554b4942015-09-21 11:24:29 +020032#define REG_EADR1 0x06
33#define REG_EADR2 0x07
34#define REG_EADR3 0x08
35#define REG_EADR4 0x09
36#define REG_EADR5 0x0A
37#define REG_EADR6 0x0B
38#define REG_EADR7 0x0C
39#define REG_RXFLUSH 0x0D
40#define REG_ORDER 0x10
Alexander Aringc9f883f2015-09-21 11:24:22 +020041#define REG_TXMCR 0x11 /* Transmit MAC control */
Alexander Aring554b4942015-09-21 11:24:29 +020042#define REG_ACKTMOUT 0x12
43#define REG_ESLOTG1 0x13
44#define REG_SYMTICKL 0x14
45#define REG_SYMTICKH 0x15
Alexander Aringc9f883f2015-09-21 11:24:22 +020046#define REG_PACON0 0x16 /* Power Amplifier Control */
47#define REG_PACON1 0x17 /* Power Amplifier Control */
48#define REG_PACON2 0x18 /* Power Amplifier Control */
Alexander Aring554b4942015-09-21 11:24:29 +020049#define REG_TXBCON0 0x1A
Alexander Aringc9f883f2015-09-21 11:24:22 +020050#define REG_TXNCON 0x1B /* Transmit Normal FIFO Control */
Alexander Aring554b4942015-09-21 11:24:29 +020051#define REG_TXG1CON 0x1C
52#define REG_TXG2CON 0x1D
53#define REG_ESLOTG23 0x1E
54#define REG_ESLOTG45 0x1F
55#define REG_ESLOTG67 0x20
56#define REG_TXPEND 0x21
57#define REG_WAKECON 0x22
58#define REG_FROMOFFSET 0x23
Alexander Aringc9f883f2015-09-21 11:24:22 +020059#define REG_TXSTAT 0x24 /* TX MAC Status Register */
Alexander Aring554b4942015-09-21 11:24:29 +020060#define REG_TXBCON1 0x25
61#define REG_GATECLK 0x26
62#define REG_TXTIME 0x27
63#define REG_HSYMTMRL 0x28
64#define REG_HSYMTMRH 0x29
Alexander Aringc9f883f2015-09-21 11:24:22 +020065#define REG_SOFTRST 0x2A /* Soft Reset */
Alexander Aring554b4942015-09-21 11:24:29 +020066#define REG_SECCON0 0x2C
67#define REG_SECCON1 0x2D
Alexander Aringc9f883f2015-09-21 11:24:22 +020068#define REG_TXSTBL 0x2E /* TX Stabilization */
Alexander Aring554b4942015-09-21 11:24:29 +020069#define REG_RXSR 0x30
Alexander Aringc9f883f2015-09-21 11:24:22 +020070#define REG_INTSTAT 0x31 /* Interrupt Status */
71#define REG_INTCON 0x32 /* Interrupt Control */
72#define REG_GPIO 0x33 /* GPIO */
73#define REG_TRISGPIO 0x34 /* GPIO direction */
Alexander Aring554b4942015-09-21 11:24:29 +020074#define REG_SLPACK 0x35
Alexander Aringc9f883f2015-09-21 11:24:22 +020075#define REG_RFCTL 0x36 /* RF Control Mode Register */
Alexander Aring554b4942015-09-21 11:24:29 +020076#define REG_SECCR2 0x37
77#define REG_BBREG0 0x38
Alexander Aringc9f883f2015-09-21 11:24:22 +020078#define REG_BBREG1 0x39 /* Baseband Registers */
79#define REG_BBREG2 0x3A /* */
Alexander Aring554b4942015-09-21 11:24:29 +020080#define REG_BBREG3 0x3B
81#define REG_BBREG4 0x3C
Alexander Aringc9f883f2015-09-21 11:24:22 +020082#define REG_BBREG6 0x3E /* */
83#define REG_CCAEDTH 0x3F /* Energy Detection Threshold */
Alan Ott3731a332012-09-02 15:44:13 +000084
85/* MRF24J40 Long Address Registers */
Alexander Aringc9f883f2015-09-21 11:24:22 +020086#define REG_RFCON0 0x200 /* RF Control Registers */
87#define REG_RFCON1 0x201
88#define REG_RFCON2 0x202
89#define REG_RFCON3 0x203
90#define REG_RFCON5 0x205
91#define REG_RFCON6 0x206
92#define REG_RFCON7 0x207
93#define REG_RFCON8 0x208
Alexander Aring554b4942015-09-21 11:24:29 +020094#define REG_SLPCAL0 0x209
95#define REG_SLPCAL1 0x20A
96#define REG_SLPCAL2 0x20B
97#define REG_RFSTATE 0x20F
Alexander Aringc9f883f2015-09-21 11:24:22 +020098#define REG_RSSI 0x210
99#define REG_SLPCON0 0x211 /* Sleep Clock Control Registers */
100#define REG_SLPCON1 0x220
101#define REG_WAKETIMEL 0x222 /* Wake-up Time Match Value Low */
102#define REG_WAKETIMEH 0x223 /* Wake-up Time Match Value High */
Alexander Aring554b4942015-09-21 11:24:29 +0200103#define REG_REMCNTL 0x224
104#define REG_REMCNTH 0x225
105#define REG_MAINCNT0 0x226
106#define REG_MAINCNT1 0x227
107#define REG_MAINCNT2 0x228
108#define REG_MAINCNT3 0x229
Alexander Aringc9f883f2015-09-21 11:24:22 +0200109#define REG_TESTMODE 0x22F /* Test mode */
Alexander Aring554b4942015-09-21 11:24:29 +0200110#define REG_ASSOEAR0 0x230
111#define REG_ASSOEAR1 0x231
112#define REG_ASSOEAR2 0x232
113#define REG_ASSOEAR3 0x233
114#define REG_ASSOEAR4 0x234
115#define REG_ASSOEAR5 0x235
116#define REG_ASSOEAR6 0x236
117#define REG_ASSOEAR7 0x237
118#define REG_ASSOSAR0 0x238
119#define REG_ASSOSAR1 0x239
120#define REG_UNONCE0 0x240
121#define REG_UNONCE1 0x241
122#define REG_UNONCE2 0x242
123#define REG_UNONCE3 0x243
124#define REG_UNONCE4 0x244
125#define REG_UNONCE5 0x245
126#define REG_UNONCE6 0x246
127#define REG_UNONCE7 0x247
128#define REG_UNONCE8 0x248
129#define REG_UNONCE9 0x249
130#define REG_UNONCE10 0x24A
131#define REG_UNONCE11 0x24B
132#define REG_UNONCE12 0x24C
Alexander Aringc9f883f2015-09-21 11:24:22 +0200133#define REG_RX_FIFO 0x300 /* Receive FIFO */
Alan Ott3731a332012-09-02 15:44:13 +0000134
135/* Device configuration: Only channels 11-26 on page 0 are supported. */
136#define MRF24J40_CHAN_MIN 11
137#define MRF24J40_CHAN_MAX 26
138#define CHANNEL_MASK (((u32)1 << (MRF24J40_CHAN_MAX + 1)) \
139 - ((u32)1 << MRF24J40_CHAN_MIN))
140
141#define TX_FIFO_SIZE 128 /* From datasheet */
142#define RX_FIFO_SIZE 144 /* From datasheet */
143#define SET_CHANNEL_DELAY_US 192 /* From datasheet */
144
Simon Vincentdb9e0ee2014-10-06 10:39:45 +0100145enum mrf24j40_modules { MRF24J40, MRF24J40MA, MRF24J40MC };
146
Alan Ott3731a332012-09-02 15:44:13 +0000147/* Device Private Data */
148struct mrf24j40 {
149 struct spi_device *spi;
Alexander Aring5a504392014-10-25 17:16:34 +0200150 struct ieee802154_hw *hw;
Alan Ott3731a332012-09-02 15:44:13 +0000151
152 struct mutex buffer_mutex; /* only used to protect buf */
153 struct completion tx_complete;
Alan Ott3731a332012-09-02 15:44:13 +0000154 u8 *buf; /* 3 bytes. Used for SPI single-register transfers. */
155};
156
157/* Read/Write SPI Commands for Short and Long Address registers. */
158#define MRF24J40_READSHORT(reg) ((reg) << 1)
159#define MRF24J40_WRITESHORT(reg) ((reg) << 1 | 1)
160#define MRF24J40_READLONG(reg) (1 << 15 | (reg) << 5)
161#define MRF24J40_WRITELONG(reg) (1 << 15 | (reg) << 5 | 1 << 4)
162
Alan Ottcf82dab2013-03-18 12:06:42 +0000163/* The datasheet indicates the theoretical maximum for SCK to be 10MHz */
164#define MAX_SPI_SPEED_HZ 10000000
Alan Ott3731a332012-09-02 15:44:13 +0000165
166#define printdev(X) (&X->spi->dev)
167
168static int write_short_reg(struct mrf24j40 *devrec, u8 reg, u8 value)
169{
170 int ret;
171 struct spi_message msg;
172 struct spi_transfer xfer = {
173 .len = 2,
174 .tx_buf = devrec->buf,
175 .rx_buf = devrec->buf,
176 };
177
178 spi_message_init(&msg);
179 spi_message_add_tail(&xfer, &msg);
180
181 mutex_lock(&devrec->buffer_mutex);
182 devrec->buf[0] = MRF24J40_WRITESHORT(reg);
183 devrec->buf[1] = value;
184
185 ret = spi_sync(devrec->spi, &msg);
186 if (ret)
187 dev_err(printdev(devrec),
188 "SPI write Failed for short register 0x%hhx\n", reg);
189
190 mutex_unlock(&devrec->buffer_mutex);
191 return ret;
192}
193
194static int read_short_reg(struct mrf24j40 *devrec, u8 reg, u8 *val)
195{
196 int ret = -1;
197 struct spi_message msg;
198 struct spi_transfer xfer = {
199 .len = 2,
200 .tx_buf = devrec->buf,
201 .rx_buf = devrec->buf,
202 };
203
204 spi_message_init(&msg);
205 spi_message_add_tail(&xfer, &msg);
206
207 mutex_lock(&devrec->buffer_mutex);
208 devrec->buf[0] = MRF24J40_READSHORT(reg);
209 devrec->buf[1] = 0;
210
211 ret = spi_sync(devrec->spi, &msg);
212 if (ret)
213 dev_err(printdev(devrec),
214 "SPI read Failed for short register 0x%hhx\n", reg);
215 else
216 *val = devrec->buf[1];
217
218 mutex_unlock(&devrec->buffer_mutex);
219 return ret;
220}
221
222static int read_long_reg(struct mrf24j40 *devrec, u16 reg, u8 *value)
223{
224 int ret;
225 u16 cmd;
226 struct spi_message msg;
227 struct spi_transfer xfer = {
228 .len = 3,
229 .tx_buf = devrec->buf,
230 .rx_buf = devrec->buf,
231 };
232
233 spi_message_init(&msg);
234 spi_message_add_tail(&xfer, &msg);
235
236 cmd = MRF24J40_READLONG(reg);
237 mutex_lock(&devrec->buffer_mutex);
238 devrec->buf[0] = cmd >> 8 & 0xff;
239 devrec->buf[1] = cmd & 0xff;
240 devrec->buf[2] = 0;
241
242 ret = spi_sync(devrec->spi, &msg);
243 if (ret)
244 dev_err(printdev(devrec),
245 "SPI read Failed for long register 0x%hx\n", reg);
246 else
247 *value = devrec->buf[2];
248
249 mutex_unlock(&devrec->buffer_mutex);
250 return ret;
251}
252
253static int write_long_reg(struct mrf24j40 *devrec, u16 reg, u8 val)
254{
255 int ret;
256 u16 cmd;
257 struct spi_message msg;
258 struct spi_transfer xfer = {
259 .len = 3,
260 .tx_buf = devrec->buf,
261 .rx_buf = devrec->buf,
262 };
263
264 spi_message_init(&msg);
265 spi_message_add_tail(&xfer, &msg);
266
267 cmd = MRF24J40_WRITELONG(reg);
268 mutex_lock(&devrec->buffer_mutex);
269 devrec->buf[0] = cmd >> 8 & 0xff;
270 devrec->buf[1] = cmd & 0xff;
271 devrec->buf[2] = val;
272
273 ret = spi_sync(devrec->spi, &msg);
274 if (ret)
275 dev_err(printdev(devrec),
276 "SPI write Failed for long register 0x%hx\n", reg);
277
278 mutex_unlock(&devrec->buffer_mutex);
279 return ret;
280}
281
282/* This function relies on an undocumented write method. Once a write command
283 and address is set, as many bytes of data as desired can be clocked into
284 the device. The datasheet only shows setting one byte at a time. */
285static int write_tx_buf(struct mrf24j40 *devrec, u16 reg,
286 const u8 *data, size_t length)
287{
288 int ret;
289 u16 cmd;
290 u8 lengths[2];
291 struct spi_message msg;
292 struct spi_transfer addr_xfer = {
293 .len = 2,
294 .tx_buf = devrec->buf,
295 };
296 struct spi_transfer lengths_xfer = {
297 .len = 2,
298 .tx_buf = &lengths, /* TODO: Is DMA really required for SPI? */
299 };
300 struct spi_transfer data_xfer = {
301 .len = length,
302 .tx_buf = data,
303 };
304
305 /* Range check the length. 2 bytes are used for the length fields.*/
306 if (length > TX_FIFO_SIZE-2) {
307 dev_err(printdev(devrec), "write_tx_buf() was passed too large a buffer. Performing short write.\n");
308 length = TX_FIFO_SIZE-2;
309 }
310
311 spi_message_init(&msg);
312 spi_message_add_tail(&addr_xfer, &msg);
313 spi_message_add_tail(&lengths_xfer, &msg);
314 spi_message_add_tail(&data_xfer, &msg);
315
316 cmd = MRF24J40_WRITELONG(reg);
317 mutex_lock(&devrec->buffer_mutex);
318 devrec->buf[0] = cmd >> 8 & 0xff;
319 devrec->buf[1] = cmd & 0xff;
320 lengths[0] = 0x0; /* Header Length. Set to 0 for now. TODO */
321 lengths[1] = length; /* Total length */
322
323 ret = spi_sync(devrec->spi, &msg);
324 if (ret)
325 dev_err(printdev(devrec), "SPI write Failed for TX buf\n");
326
327 mutex_unlock(&devrec->buffer_mutex);
328 return ret;
329}
330
331static int mrf24j40_read_rx_buf(struct mrf24j40 *devrec,
332 u8 *data, u8 *len, u8 *lqi)
333{
334 u8 rx_len;
335 u8 addr[2];
336 u8 lqi_rssi[2];
337 u16 cmd;
338 int ret;
339 struct spi_message msg;
340 struct spi_transfer addr_xfer = {
341 .len = 2,
342 .tx_buf = &addr,
343 };
344 struct spi_transfer data_xfer = {
345 .len = 0x0, /* set below */
346 .rx_buf = data,
347 };
348 struct spi_transfer status_xfer = {
349 .len = 2,
350 .rx_buf = &lqi_rssi,
351 };
352
353 /* Get the length of the data in the RX FIFO. The length in this
354 * register exclues the 1-byte length field at the beginning. */
355 ret = read_long_reg(devrec, REG_RX_FIFO, &rx_len);
356 if (ret)
357 goto out;
358
359 /* Range check the RX FIFO length, accounting for the one-byte
Stefan Schmidt5c1be062014-12-12 12:45:32 +0100360 * length field at the beginning. */
Alan Ott3731a332012-09-02 15:44:13 +0000361 if (rx_len > RX_FIFO_SIZE-1) {
362 dev_err(printdev(devrec), "Invalid length read from device. Performing short read.\n");
363 rx_len = RX_FIFO_SIZE-1;
364 }
365
366 if (rx_len > *len) {
367 /* Passed in buffer wasn't big enough. Should never happen. */
368 dev_err(printdev(devrec), "Buffer not big enough. Performing short read\n");
369 rx_len = *len;
370 }
371
372 /* Set up the commands to read the data. */
373 cmd = MRF24J40_READLONG(REG_RX_FIFO+1);
374 addr[0] = cmd >> 8 & 0xff;
375 addr[1] = cmd & 0xff;
376 data_xfer.len = rx_len;
377
378 spi_message_init(&msg);
379 spi_message_add_tail(&addr_xfer, &msg);
380 spi_message_add_tail(&data_xfer, &msg);
381 spi_message_add_tail(&status_xfer, &msg);
382
383 ret = spi_sync(devrec->spi, &msg);
384 if (ret) {
385 dev_err(printdev(devrec), "SPI RX Buffer Read Failed.\n");
386 goto out;
387 }
388
389 *lqi = lqi_rssi[0];
390 *len = rx_len;
391
392#ifdef DEBUG
393 print_hex_dump(KERN_DEBUG, "mrf24j40 rx: ",
Stefan Schmidtce261bc2014-12-12 12:45:33 +0100394 DUMP_PREFIX_OFFSET, 16, 1, data, *len, 0);
Varka Bhadramca079ad2014-09-24 12:21:32 +0200395 pr_debug("mrf24j40 rx: lqi: %02hhx rssi: %02hhx\n",
396 lqi_rssi[0], lqi_rssi[1]);
Alan Ott3731a332012-09-02 15:44:13 +0000397#endif
398
399out:
400 return ret;
401}
402
Alexander Aring5a504392014-10-25 17:16:34 +0200403static int mrf24j40_tx(struct ieee802154_hw *hw, struct sk_buff *skb)
Alan Ott3731a332012-09-02 15:44:13 +0000404{
Alexander Aring5a504392014-10-25 17:16:34 +0200405 struct mrf24j40 *devrec = hw->priv;
Alan Ott3731a332012-09-02 15:44:13 +0000406 u8 val;
407 int ret = 0;
408
409 dev_dbg(printdev(devrec), "tx packet of %d bytes\n", skb->len);
410
411 ret = write_tx_buf(devrec, 0x000, skb->data, skb->len);
412 if (ret)
413 goto err;
414
Wolfram Sang16735d02013-11-14 14:32:02 -0800415 reinit_completion(&devrec->tx_complete);
Alan Ott9757f1d2013-10-05 23:52:22 -0400416
Alan Ott3731a332012-09-02 15:44:13 +0000417 /* Set TXNTRIG bit of TXNCON to send packet */
418 ret = read_short_reg(devrec, REG_TXNCON, &val);
419 if (ret)
420 goto err;
421 val |= 0x1;
Alan Ottcbde8122013-04-05 10:34:51 +0000422 /* Set TXNACKREQ if the ACK bit is set in the packet. */
423 if (skb->data[0] & IEEE802154_FC_ACK_REQ)
424 val |= 0x4;
Alan Ott3731a332012-09-02 15:44:13 +0000425 write_short_reg(devrec, REG_TXNCON, val);
426
Alan Ott3731a332012-09-02 15:44:13 +0000427 /* Wait for the device to send the TX complete interrupt. */
428 ret = wait_for_completion_interruptible_timeout(
429 &devrec->tx_complete,
430 5 * HZ);
431 if (ret == -ERESTARTSYS)
432 goto err;
433 if (ret == 0) {
Alan Ott7a1c2312013-03-18 12:06:41 +0000434 dev_warn(printdev(devrec), "Timeout waiting for TX interrupt\n");
Alan Ott3731a332012-09-02 15:44:13 +0000435 ret = -ETIMEDOUT;
436 goto err;
437 }
438
439 /* Check for send error from the device. */
440 ret = read_short_reg(devrec, REG_TXSTAT, &val);
441 if (ret)
442 goto err;
443 if (val & 0x1) {
Alan Ottcbde8122013-04-05 10:34:51 +0000444 dev_dbg(printdev(devrec), "Error Sending. Retry count exceeded\n");
Alan Ott3731a332012-09-02 15:44:13 +0000445 ret = -ECOMM; /* TODO: Better error code ? */
446 } else
447 dev_dbg(printdev(devrec), "Packet Sent\n");
448
449err:
450
451 return ret;
452}
453
Alexander Aring5a504392014-10-25 17:16:34 +0200454static int mrf24j40_ed(struct ieee802154_hw *hw, u8 *level)
Alan Ott3731a332012-09-02 15:44:13 +0000455{
456 /* TODO: */
Varka Bhadramca079ad2014-09-24 12:21:32 +0200457 pr_warn("mrf24j40: ed not implemented\n");
Alan Ott3731a332012-09-02 15:44:13 +0000458 *level = 0;
459 return 0;
460}
461
Alexander Aring5a504392014-10-25 17:16:34 +0200462static int mrf24j40_start(struct ieee802154_hw *hw)
Alan Ott3731a332012-09-02 15:44:13 +0000463{
Alexander Aring5a504392014-10-25 17:16:34 +0200464 struct mrf24j40 *devrec = hw->priv;
Alan Ott3731a332012-09-02 15:44:13 +0000465 u8 val;
466 int ret;
467
468 dev_dbg(printdev(devrec), "start\n");
469
470 ret = read_short_reg(devrec, REG_INTCON, &val);
471 if (ret)
472 return ret;
473 val &= ~(0x1|0x8); /* Clear TXNIE and RXIE. Enable interrupts */
474 write_short_reg(devrec, REG_INTCON, val);
475
476 return 0;
477}
478
Alexander Aring5a504392014-10-25 17:16:34 +0200479static void mrf24j40_stop(struct ieee802154_hw *hw)
Alan Ott3731a332012-09-02 15:44:13 +0000480{
Alexander Aring5a504392014-10-25 17:16:34 +0200481 struct mrf24j40 *devrec = hw->priv;
Alan Ott3731a332012-09-02 15:44:13 +0000482 u8 val;
483 int ret;
Varka Bhadram529160d2014-09-24 12:21:30 +0200484
Alan Ott3731a332012-09-02 15:44:13 +0000485 dev_dbg(printdev(devrec), "stop\n");
486
487 ret = read_short_reg(devrec, REG_INTCON, &val);
488 if (ret)
489 return;
490 val |= 0x1|0x8; /* Set TXNIE and RXIE. Disable Interrupts */
491 write_short_reg(devrec, REG_INTCON, val);
Alan Ott3731a332012-09-02 15:44:13 +0000492}
493
Alexander Aringe37d2ec2014-10-28 18:21:19 +0100494static int mrf24j40_set_channel(struct ieee802154_hw *hw, u8 page, u8 channel)
Alan Ott3731a332012-09-02 15:44:13 +0000495{
Alexander Aring5a504392014-10-25 17:16:34 +0200496 struct mrf24j40 *devrec = hw->priv;
Alan Ott3731a332012-09-02 15:44:13 +0000497 u8 val;
498 int ret;
499
500 dev_dbg(printdev(devrec), "Set Channel %d\n", channel);
501
502 WARN_ON(page != 0);
503 WARN_ON(channel < MRF24J40_CHAN_MIN);
504 WARN_ON(channel > MRF24J40_CHAN_MAX);
505
506 /* Set Channel TODO */
507 val = (channel-11) << 4 | 0x03;
508 write_long_reg(devrec, REG_RFCON0, val);
509
510 /* RF Reset */
511 ret = read_short_reg(devrec, REG_RFCTL, &val);
512 if (ret)
513 return ret;
514 val |= 0x04;
515 write_short_reg(devrec, REG_RFCTL, val);
516 val &= ~0x04;
517 write_short_reg(devrec, REG_RFCTL, val);
518
519 udelay(SET_CHANNEL_DELAY_US); /* per datasheet */
520
521 return 0;
522}
523
Alexander Aring5a504392014-10-25 17:16:34 +0200524static int mrf24j40_filter(struct ieee802154_hw *hw,
Alan Ott3731a332012-09-02 15:44:13 +0000525 struct ieee802154_hw_addr_filt *filt,
526 unsigned long changed)
527{
Alexander Aring5a504392014-10-25 17:16:34 +0200528 struct mrf24j40 *devrec = hw->priv;
Alan Ott3731a332012-09-02 15:44:13 +0000529
530 dev_dbg(printdev(devrec), "filter\n");
531
Alexander Aring57205c12014-10-25 05:25:09 +0200532 if (changed & IEEE802154_AFILT_SADDR_CHANGED) {
Alan Ott3731a332012-09-02 15:44:13 +0000533 /* Short Addr */
534 u8 addrh, addrl;
Varka Bhadram529160d2014-09-24 12:21:30 +0200535
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100536 addrh = le16_to_cpu(filt->short_addr) >> 8 & 0xff;
537 addrl = le16_to_cpu(filt->short_addr) & 0xff;
Alan Ott3731a332012-09-02 15:44:13 +0000538
539 write_short_reg(devrec, REG_SADRH, addrh);
540 write_short_reg(devrec, REG_SADRL, addrl);
541 dev_dbg(printdev(devrec),
542 "Set short addr to %04hx\n", filt->short_addr);
543 }
544
Alexander Aring57205c12014-10-25 05:25:09 +0200545 if (changed & IEEE802154_AFILT_IEEEADDR_CHANGED) {
Alan Ott3731a332012-09-02 15:44:13 +0000546 /* Device Address */
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100547 u8 i, addr[8];
548
549 memcpy(addr, &filt->ieee_addr, 8);
Alan Ott3731a332012-09-02 15:44:13 +0000550 for (i = 0; i < 8; i++)
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100551 write_short_reg(devrec, REG_EADR0 + i, addr[i]);
Alan Ott3731a332012-09-02 15:44:13 +0000552
553#ifdef DEBUG
Varka Bhadramca079ad2014-09-24 12:21:32 +0200554 pr_debug("Set long addr to: ");
Alan Ott3731a332012-09-02 15:44:13 +0000555 for (i = 0; i < 8; i++)
Varka Bhadramca079ad2014-09-24 12:21:32 +0200556 pr_debug("%02hhx ", addr[7 - i]);
557 pr_debug("\n");
Alan Ott3731a332012-09-02 15:44:13 +0000558#endif
559 }
560
Alexander Aring57205c12014-10-25 05:25:09 +0200561 if (changed & IEEE802154_AFILT_PANID_CHANGED) {
Alan Ott3731a332012-09-02 15:44:13 +0000562 /* PAN ID */
563 u8 panidl, panidh;
Varka Bhadram529160d2014-09-24 12:21:30 +0200564
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100565 panidh = le16_to_cpu(filt->pan_id) >> 8 & 0xff;
566 panidl = le16_to_cpu(filt->pan_id) & 0xff;
Alan Ott3731a332012-09-02 15:44:13 +0000567 write_short_reg(devrec, REG_PANIDH, panidh);
568 write_short_reg(devrec, REG_PANIDL, panidl);
569
570 dev_dbg(printdev(devrec), "Set PANID to %04hx\n", filt->pan_id);
571 }
572
Alexander Aring57205c12014-10-25 05:25:09 +0200573 if (changed & IEEE802154_AFILT_PANC_CHANGED) {
Alan Ott3731a332012-09-02 15:44:13 +0000574 /* Pan Coordinator */
575 u8 val;
576 int ret;
577
578 ret = read_short_reg(devrec, REG_RXMCR, &val);
579 if (ret)
580 return ret;
581 if (filt->pan_coord)
582 val |= 0x8;
583 else
584 val &= ~0x8;
585 write_short_reg(devrec, REG_RXMCR, val);
586
587 /* REG_SLOTTED is maintained as default (unslotted/CSMA-CA).
588 * REG_ORDER is maintained as default (no beacon/superframe).
589 */
590
591 dev_dbg(printdev(devrec), "Set Pan Coord to %s\n",
Stefan Schmidtce261bc2014-12-12 12:45:33 +0100592 filt->pan_coord ? "on" : "off");
Alan Ott3731a332012-09-02 15:44:13 +0000593 }
594
595 return 0;
596}
597
598static int mrf24j40_handle_rx(struct mrf24j40 *devrec)
599{
600 u8 len = RX_FIFO_SIZE;
601 u8 lqi = 0;
602 u8 val;
603 int ret = 0;
Stefan Schmidte5719b62015-06-09 10:52:26 +0200604 int ret2;
Alan Ott3731a332012-09-02 15:44:13 +0000605 struct sk_buff *skb;
606
607 /* Turn off reception of packets off the air. This prevents the
608 * device from overwriting the buffer while we're reading it. */
609 ret = read_short_reg(devrec, REG_BBREG1, &val);
610 if (ret)
611 goto out;
612 val |= 4; /* SET RXDECINV */
613 write_short_reg(devrec, REG_BBREG1, val);
614
Alexander Aring61a22812014-10-27 17:13:29 +0100615 skb = dev_alloc_skb(len);
Alan Ott3731a332012-09-02 15:44:13 +0000616 if (!skb) {
617 ret = -ENOMEM;
618 goto out;
619 }
620
621 ret = mrf24j40_read_rx_buf(devrec, skb_put(skb, len), &len, &lqi);
622 if (ret < 0) {
623 dev_err(printdev(devrec), "Failure reading RX FIFO\n");
624 kfree_skb(skb);
625 ret = -EINVAL;
626 goto out;
627 }
628
629 /* Cut off the checksum */
630 skb_trim(skb, len-2);
631
632 /* TODO: Other drivers call ieee20154_rx_irqsafe() here (eg: cc2040,
633 * also from a workqueue). I think irqsafe is not necessary here.
634 * Can someone confirm? */
Alexander Aring5a504392014-10-25 17:16:34 +0200635 ieee802154_rx_irqsafe(devrec->hw, skb, lqi);
Alan Ott3731a332012-09-02 15:44:13 +0000636
637 dev_dbg(printdev(devrec), "RX Handled\n");
638
639out:
640 /* Turn back on reception of packets off the air. */
Stefan Schmidte5719b62015-06-09 10:52:26 +0200641 ret2 = read_short_reg(devrec, REG_BBREG1, &val);
642 if (ret2)
643 return ret2;
Alan Ott3731a332012-09-02 15:44:13 +0000644 val &= ~0x4; /* Clear RXDECINV */
645 write_short_reg(devrec, REG_BBREG1, val);
646
647 return ret;
648}
649
Alexander Aring16301862014-10-28 18:21:18 +0100650static const struct ieee802154_ops mrf24j40_ops = {
Alan Ott3731a332012-09-02 15:44:13 +0000651 .owner = THIS_MODULE,
Alexander Aringed0a5dc2014-10-26 09:37:08 +0100652 .xmit_sync = mrf24j40_tx,
Alan Ott3731a332012-09-02 15:44:13 +0000653 .ed = mrf24j40_ed,
654 .start = mrf24j40_start,
655 .stop = mrf24j40_stop,
656 .set_channel = mrf24j40_set_channel,
657 .set_hw_addr_filt = mrf24j40_filter,
658};
659
660static irqreturn_t mrf24j40_isr(int irq, void *data)
661{
662 struct mrf24j40 *devrec = data;
Alan Ott3731a332012-09-02 15:44:13 +0000663 u8 intstat;
664 int ret;
665
666 /* Read the interrupt status */
667 ret = read_short_reg(devrec, REG_INTSTAT, &intstat);
668 if (ret)
669 goto out;
670
671 /* Check for TX complete */
672 if (intstat & 0x1)
673 complete(&devrec->tx_complete);
674
675 /* Check for Rx */
676 if (intstat & 0x8)
677 mrf24j40_handle_rx(devrec);
678
679out:
Alan Ott4a4e1da2013-10-05 23:52:23 -0400680 return IRQ_HANDLED;
Alan Ott3731a332012-09-02 15:44:13 +0000681}
682
Varka Bhadram3dac9a72014-06-16 09:12:31 +0530683static int mrf24j40_hw_init(struct mrf24j40 *devrec)
684{
685 int ret;
686 u8 val;
687
688 /* Initialize the device.
689 From datasheet section 3.2: Initialization. */
690 ret = write_short_reg(devrec, REG_SOFTRST, 0x07);
691 if (ret)
692 goto err_ret;
693
694 ret = write_short_reg(devrec, REG_PACON2, 0x98);
695 if (ret)
696 goto err_ret;
697
698 ret = write_short_reg(devrec, REG_TXSTBL, 0x95);
699 if (ret)
700 goto err_ret;
701
702 ret = write_long_reg(devrec, REG_RFCON0, 0x03);
703 if (ret)
704 goto err_ret;
705
706 ret = write_long_reg(devrec, REG_RFCON1, 0x01);
707 if (ret)
708 goto err_ret;
709
710 ret = write_long_reg(devrec, REG_RFCON2, 0x80);
711 if (ret)
712 goto err_ret;
713
714 ret = write_long_reg(devrec, REG_RFCON6, 0x90);
715 if (ret)
716 goto err_ret;
717
718 ret = write_long_reg(devrec, REG_RFCON7, 0x80);
719 if (ret)
720 goto err_ret;
721
722 ret = write_long_reg(devrec, REG_RFCON8, 0x10);
723 if (ret)
724 goto err_ret;
725
726 ret = write_long_reg(devrec, REG_SLPCON1, 0x21);
727 if (ret)
728 goto err_ret;
729
730 ret = write_short_reg(devrec, REG_BBREG2, 0x80);
731 if (ret)
732 goto err_ret;
733
734 ret = write_short_reg(devrec, REG_CCAEDTH, 0x60);
735 if (ret)
736 goto err_ret;
737
738 ret = write_short_reg(devrec, REG_BBREG6, 0x40);
739 if (ret)
740 goto err_ret;
741
742 ret = write_short_reg(devrec, REG_RFCTL, 0x04);
743 if (ret)
744 goto err_ret;
745
746 ret = write_short_reg(devrec, REG_RFCTL, 0x0);
747 if (ret)
748 goto err_ret;
749
750 udelay(192);
751
752 /* Set RX Mode. RXMCR<1:0>: 0x0 normal, 0x1 promisc, 0x2 error */
753 ret = read_short_reg(devrec, REG_RXMCR, &val);
754 if (ret)
755 goto err_ret;
756
757 val &= ~0x3; /* Clear RX mode (normal) */
758
759 ret = write_short_reg(devrec, REG_RXMCR, val);
760 if (ret)
761 goto err_ret;
762
Simon Vincentdb9e0ee2014-10-06 10:39:45 +0100763 if (spi_get_device_id(devrec->spi)->driver_data == MRF24J40MC) {
764 /* Enable external amplifier.
765 * From MRF24J40MC datasheet section 1.3: Operation.
766 */
767 read_long_reg(devrec, REG_TESTMODE, &val);
768 val |= 0x7; /* Configure GPIO 0-2 to control amplifier */
769 write_long_reg(devrec, REG_TESTMODE, val);
770
771 read_short_reg(devrec, REG_TRISGPIO, &val);
772 val |= 0x8; /* Set GPIO3 as output. */
773 write_short_reg(devrec, REG_TRISGPIO, val);
774
775 read_short_reg(devrec, REG_GPIO, &val);
776 val |= 0x8; /* Set GPIO3 HIGH to enable U5 voltage regulator */
777 write_short_reg(devrec, REG_GPIO, val);
778
779 /* Reduce TX pwr to meet FCC requirements.
780 * From MRF24J40MC datasheet section 3.1.1
781 */
782 write_long_reg(devrec, REG_RFCON3, 0x28);
783 }
784
Varka Bhadram3dac9a72014-06-16 09:12:31 +0530785 return 0;
786
787err_ret:
788 return ret;
789}
790
Alexander Aring766928f2015-09-21 11:24:27 +0200791static void mrf24j40_phy_setup(struct mrf24j40 *devrec)
792{
Alexander Aringd344c912015-09-21 11:24:28 +0200793 ieee802154_random_extended_addr(&devrec->hw->phy->perm_extended_addr);
Alexander Aring766928f2015-09-21 11:24:27 +0200794 devrec->hw->phy->current_channel = 11;
795}
796
Bill Pembertonbb1f4602012-12-03 09:24:12 -0500797static int mrf24j40_probe(struct spi_device *spi)
Alan Ott3731a332012-09-02 15:44:13 +0000798{
799 int ret = -ENOMEM;
Alexander Aringb2cfdf32015-09-21 11:24:23 +0200800 struct ieee802154_hw *hw;
Alan Ott3731a332012-09-02 15:44:13 +0000801 struct mrf24j40 *devrec;
802
Varka Bhadramca079ad2014-09-24 12:21:32 +0200803 dev_info(&spi->dev, "probe(). IRQ: %d\n", spi->irq);
Alan Ott3731a332012-09-02 15:44:13 +0000804
Alexander Aringb2cfdf32015-09-21 11:24:23 +0200805 /* Register with the 802154 subsystem */
806
807 hw = ieee802154_alloc_hw(sizeof(*devrec), &mrf24j40_ops);
808 if (!hw)
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530809 goto err_ret;
Alexander Aringb2cfdf32015-09-21 11:24:23 +0200810
811 devrec = hw->priv;
812 devrec->spi = spi;
813 spi_set_drvdata(spi, devrec);
814 devrec->hw = hw;
815 devrec->hw->parent = &spi->dev;
816 devrec->hw->phy->supported.channels[0] = CHANNEL_MASK;
817 devrec->hw->flags = IEEE802154_HW_OMIT_CKSUM | IEEE802154_HW_AFILT;
818
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530819 devrec->buf = devm_kzalloc(&spi->dev, 3, GFP_KERNEL);
Alan Ott3731a332012-09-02 15:44:13 +0000820 if (!devrec->buf)
Alexander Aringb2cfdf32015-09-21 11:24:23 +0200821 goto err_register_device;
Alan Ott3731a332012-09-02 15:44:13 +0000822
Alexander Aring78aedb62015-09-21 11:24:25 +0200823 if (spi->max_speed_hz > MAX_SPI_SPEED_HZ) {
824 dev_warn(&spi->dev, "spi clock above possible maximum: %d",
825 MAX_SPI_SPEED_HZ);
826 return -EINVAL;
827 }
Alan Ott3731a332012-09-02 15:44:13 +0000828
829 mutex_init(&devrec->buffer_mutex);
830 init_completion(&devrec->tx_complete);
Alan Ott3731a332012-09-02 15:44:13 +0000831
Varka Bhadram3dac9a72014-06-16 09:12:31 +0530832 ret = mrf24j40_hw_init(devrec);
Alan Ott3731a332012-09-02 15:44:13 +0000833 if (ret)
Alexander Aringa339e182015-09-21 11:24:24 +0200834 goto err_register_device;
Alan Ott3731a332012-09-02 15:44:13 +0000835
Alexander Aring766928f2015-09-21 11:24:27 +0200836 mrf24j40_phy_setup(devrec);
837
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530838 ret = devm_request_threaded_irq(&spi->dev,
839 spi->irq,
840 NULL,
841 mrf24j40_isr,
842 IRQF_TRIGGER_LOW|IRQF_ONESHOT,
843 dev_name(&spi->dev),
844 devrec);
Alan Ott3731a332012-09-02 15:44:13 +0000845
846 if (ret) {
847 dev_err(printdev(devrec), "Unable to get IRQ");
Alexander Aringa339e182015-09-21 11:24:24 +0200848 goto err_register_device;
Alan Ott3731a332012-09-02 15:44:13 +0000849 }
850
Alexander Aringa339e182015-09-21 11:24:24 +0200851 dev_dbg(printdev(devrec), "registered mrf24j40\n");
852 ret = ieee802154_register_hw(devrec->hw);
853 if (ret)
854 goto err_register_device;
855
Alan Ott3731a332012-09-02 15:44:13 +0000856 return 0;
857
Alan Ott3731a332012-09-02 15:44:13 +0000858err_register_device:
Alexander Aring5a504392014-10-25 17:16:34 +0200859 ieee802154_free_hw(devrec->hw);
Varka Bhadram0aaf43f2014-06-11 10:04:44 +0530860err_ret:
Alan Ott3731a332012-09-02 15:44:13 +0000861 return ret;
862}
863
Bill Pembertonbb1f4602012-12-03 09:24:12 -0500864static int mrf24j40_remove(struct spi_device *spi)
Alan Ott3731a332012-09-02 15:44:13 +0000865{
Jingoo Han4fa0a0e2013-04-05 20:34:18 +0000866 struct mrf24j40 *devrec = spi_get_drvdata(spi);
Alan Ott3731a332012-09-02 15:44:13 +0000867
868 dev_dbg(printdev(devrec), "remove\n");
869
Alexander Aring5a504392014-10-25 17:16:34 +0200870 ieee802154_unregister_hw(devrec->hw);
871 ieee802154_free_hw(devrec->hw);
Alan Ott3731a332012-09-02 15:44:13 +0000872 /* TODO: Will ieee802154_free_device() wait until ->xmit() is
873 * complete? */
874
Alan Ott3731a332012-09-02 15:44:13 +0000875 return 0;
876}
877
Alexander Aring2e6fd642015-09-21 11:24:26 +0200878static const struct of_device_id mrf24j40_of_match[] = {
879 { .compatible = "microchip,mrf24j40", .data = (void *)MRF24J40 },
880 { .compatible = "microchip,mrf24j40ma", .data = (void *)MRF24J40MA },
881 { .compatible = "microchip,mrf24j40mc", .data = (void *)MRF24J40MC },
882 { },
883};
884MODULE_DEVICE_TABLE(of, mrf24j40_of_match);
885
Alan Ott3731a332012-09-02 15:44:13 +0000886static const struct spi_device_id mrf24j40_ids[] = {
Simon Vincentdb9e0ee2014-10-06 10:39:45 +0100887 { "mrf24j40", MRF24J40 },
888 { "mrf24j40ma", MRF24J40MA },
889 { "mrf24j40mc", MRF24J40MC },
Alan Ott3731a332012-09-02 15:44:13 +0000890 { },
891};
892MODULE_DEVICE_TABLE(spi, mrf24j40_ids);
893
894static struct spi_driver mrf24j40_driver = {
895 .driver = {
Alexander Aring2e6fd642015-09-21 11:24:26 +0200896 .of_match_table = of_match_ptr(mrf24j40_of_match),
Alan Ott3731a332012-09-02 15:44:13 +0000897 .name = "mrf24j40",
Alan Ott3731a332012-09-02 15:44:13 +0000898 .owner = THIS_MODULE,
899 },
900 .id_table = mrf24j40_ids,
901 .probe = mrf24j40_probe,
Bill Pembertonbb1f4602012-12-03 09:24:12 -0500902 .remove = mrf24j40_remove,
Alan Ott3731a332012-09-02 15:44:13 +0000903};
904
Wei Yongjun3d4a1312013-04-08 20:34:44 +0000905module_spi_driver(mrf24j40_driver);
Alan Ott3731a332012-09-02 15:44:13 +0000906
907MODULE_LICENSE("GPL");
908MODULE_AUTHOR("Alan Ott");
909MODULE_DESCRIPTION("MRF24J40 SPI 802.15.4 Controller Driver");