cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mrf24j40.c (36420B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Driver for Microchip MRF24J40 802.15.4 Wireless-PAN Networking controller
      4 *
      5 * Copyright (C) 2012 Alan Ott <alan@signal11.us>
      6 *                    Signal 11 Software
      7 */
      8
      9#include <linux/spi/spi.h>
     10#include <linux/interrupt.h>
     11#include <linux/mod_devicetable.h>
     12#include <linux/module.h>
     13#include <linux/regmap.h>
     14#include <linux/ieee802154.h>
     15#include <linux/irq.h>
     16#include <net/cfg802154.h>
     17#include <net/mac802154.h>
     18
     19/* MRF24J40 Short Address Registers */
     20#define REG_RXMCR	0x00  /* Receive MAC control */
     21#define BIT_PROMI	BIT(0)
     22#define BIT_ERRPKT	BIT(1)
     23#define BIT_NOACKRSP	BIT(5)
     24#define BIT_PANCOORD	BIT(3)
     25
     26#define REG_PANIDL	0x01  /* PAN ID (low) */
     27#define REG_PANIDH	0x02  /* PAN ID (high) */
     28#define REG_SADRL	0x03  /* Short address (low) */
     29#define REG_SADRH	0x04  /* Short address (high) */
     30#define REG_EADR0	0x05  /* Long address (low) (high is EADR7) */
     31#define REG_EADR1	0x06
     32#define REG_EADR2	0x07
     33#define REG_EADR3	0x08
     34#define REG_EADR4	0x09
     35#define REG_EADR5	0x0A
     36#define REG_EADR6	0x0B
     37#define REG_EADR7	0x0C
     38#define REG_RXFLUSH	0x0D
     39#define REG_ORDER	0x10
     40#define REG_TXMCR	0x11  /* Transmit MAC control */
     41#define TXMCR_MIN_BE_SHIFT		3
     42#define TXMCR_MIN_BE_MASK		0x18
     43#define TXMCR_CSMA_RETRIES_SHIFT	0
     44#define TXMCR_CSMA_RETRIES_MASK		0x07
     45
     46#define REG_ACKTMOUT	0x12
     47#define REG_ESLOTG1	0x13
     48#define REG_SYMTICKL	0x14
     49#define REG_SYMTICKH	0x15
     50#define REG_PACON0	0x16  /* Power Amplifier Control */
     51#define REG_PACON1	0x17  /* Power Amplifier Control */
     52#define REG_PACON2	0x18  /* Power Amplifier Control */
     53#define REG_TXBCON0	0x1A
     54#define REG_TXNCON	0x1B  /* Transmit Normal FIFO Control */
     55#define BIT_TXNTRIG	BIT(0)
     56#define BIT_TXNSECEN	BIT(1)
     57#define BIT_TXNACKREQ	BIT(2)
     58
     59#define REG_TXG1CON	0x1C
     60#define REG_TXG2CON	0x1D
     61#define REG_ESLOTG23	0x1E
     62#define REG_ESLOTG45	0x1F
     63#define REG_ESLOTG67	0x20
     64#define REG_TXPEND	0x21
     65#define REG_WAKECON	0x22
     66#define REG_FROMOFFSET	0x23
     67#define REG_TXSTAT	0x24  /* TX MAC Status Register */
     68#define REG_TXBCON1	0x25
     69#define REG_GATECLK	0x26
     70#define REG_TXTIME	0x27
     71#define REG_HSYMTMRL	0x28
     72#define REG_HSYMTMRH	0x29
     73#define REG_SOFTRST	0x2A  /* Soft Reset */
     74#define REG_SECCON0	0x2C
     75#define REG_SECCON1	0x2D
     76#define REG_TXSTBL	0x2E  /* TX Stabilization */
     77#define REG_RXSR	0x30
     78#define REG_INTSTAT	0x31  /* Interrupt Status */
     79#define BIT_TXNIF	BIT(0)
     80#define BIT_RXIF	BIT(3)
     81#define BIT_SECIF	BIT(4)
     82#define BIT_SECIGNORE	BIT(7)
     83
     84#define REG_INTCON	0x32  /* Interrupt Control */
     85#define BIT_TXNIE	BIT(0)
     86#define BIT_RXIE	BIT(3)
     87#define BIT_SECIE	BIT(4)
     88
     89#define REG_GPIO	0x33  /* GPIO */
     90#define REG_TRISGPIO	0x34  /* GPIO direction */
     91#define REG_SLPACK	0x35
     92#define REG_RFCTL	0x36  /* RF Control Mode Register */
     93#define BIT_RFRST	BIT(2)
     94
     95#define REG_SECCR2	0x37
     96#define REG_BBREG0	0x38
     97#define REG_BBREG1	0x39  /* Baseband Registers */
     98#define BIT_RXDECINV	BIT(2)
     99
    100#define REG_BBREG2	0x3A  /* */
    101#define BBREG2_CCA_MODE_SHIFT	6
    102#define BBREG2_CCA_MODE_MASK	0xc0
    103
    104#define REG_BBREG3	0x3B
    105#define REG_BBREG4	0x3C
    106#define REG_BBREG6	0x3E  /* */
    107#define REG_CCAEDTH	0x3F  /* Energy Detection Threshold */
    108
    109/* MRF24J40 Long Address Registers */
    110#define REG_RFCON0	0x200  /* RF Control Registers */
    111#define RFCON0_CH_SHIFT	4
    112#define RFCON0_CH_MASK	0xf0
    113#define RFOPT_RECOMMEND	3
    114
    115#define REG_RFCON1	0x201
    116#define REG_RFCON2	0x202
    117#define REG_RFCON3	0x203
    118
    119#define TXPWRL_MASK	0xc0
    120#define TXPWRL_SHIFT	6
    121#define TXPWRL_30	0x3
    122#define TXPWRL_20	0x2
    123#define TXPWRL_10	0x1
    124#define TXPWRL_0	0x0
    125
    126#define TXPWRS_MASK	0x38
    127#define TXPWRS_SHIFT	3
    128#define TXPWRS_6_3	0x7
    129#define TXPWRS_4_9	0x6
    130#define TXPWRS_3_7	0x5
    131#define TXPWRS_2_8	0x4
    132#define TXPWRS_1_9	0x3
    133#define TXPWRS_1_2	0x2
    134#define TXPWRS_0_5	0x1
    135#define TXPWRS_0	0x0
    136
    137#define REG_RFCON5	0x205
    138#define REG_RFCON6	0x206
    139#define REG_RFCON7	0x207
    140#define REG_RFCON8	0x208
    141#define REG_SLPCAL0	0x209
    142#define REG_SLPCAL1	0x20A
    143#define REG_SLPCAL2	0x20B
    144#define REG_RFSTATE	0x20F
    145#define REG_RSSI	0x210
    146#define REG_SLPCON0	0x211  /* Sleep Clock Control Registers */
    147#define BIT_INTEDGE	BIT(1)
    148
    149#define REG_SLPCON1	0x220
    150#define REG_WAKETIMEL	0x222  /* Wake-up Time Match Value Low */
    151#define REG_WAKETIMEH	0x223  /* Wake-up Time Match Value High */
    152#define REG_REMCNTL	0x224
    153#define REG_REMCNTH	0x225
    154#define REG_MAINCNT0	0x226
    155#define REG_MAINCNT1	0x227
    156#define REG_MAINCNT2	0x228
    157#define REG_MAINCNT3	0x229
    158#define REG_TESTMODE	0x22F  /* Test mode */
    159#define REG_ASSOEAR0	0x230
    160#define REG_ASSOEAR1	0x231
    161#define REG_ASSOEAR2	0x232
    162#define REG_ASSOEAR3	0x233
    163#define REG_ASSOEAR4	0x234
    164#define REG_ASSOEAR5	0x235
    165#define REG_ASSOEAR6	0x236
    166#define REG_ASSOEAR7	0x237
    167#define REG_ASSOSAR0	0x238
    168#define REG_ASSOSAR1	0x239
    169#define REG_UNONCE0	0x240
    170#define REG_UNONCE1	0x241
    171#define REG_UNONCE2	0x242
    172#define REG_UNONCE3	0x243
    173#define REG_UNONCE4	0x244
    174#define REG_UNONCE5	0x245
    175#define REG_UNONCE6	0x246
    176#define REG_UNONCE7	0x247
    177#define REG_UNONCE8	0x248
    178#define REG_UNONCE9	0x249
    179#define REG_UNONCE10	0x24A
    180#define REG_UNONCE11	0x24B
    181#define REG_UNONCE12	0x24C
    182#define REG_RX_FIFO	0x300  /* Receive FIFO */
    183
    184/* Device configuration: Only channels 11-26 on page 0 are supported. */
    185#define MRF24J40_CHAN_MIN 11
    186#define MRF24J40_CHAN_MAX 26
    187#define CHANNEL_MASK (((u32)1 << (MRF24J40_CHAN_MAX + 1)) \
    188		      - ((u32)1 << MRF24J40_CHAN_MIN))
    189
    190#define TX_FIFO_SIZE 128 /* From datasheet */
    191#define RX_FIFO_SIZE 144 /* From datasheet */
    192#define SET_CHANNEL_DELAY_US 192 /* From datasheet */
    193
    194enum mrf24j40_modules { MRF24J40, MRF24J40MA, MRF24J40MC };
    195
    196/* Device Private Data */
    197struct mrf24j40 {
    198	struct spi_device *spi;
    199	struct ieee802154_hw *hw;
    200
    201	struct regmap *regmap_short;
    202	struct regmap *regmap_long;
    203
    204	/* for writing txfifo */
    205	struct spi_message tx_msg;
    206	u8 tx_hdr_buf[2];
    207	struct spi_transfer tx_hdr_trx;
    208	u8 tx_len_buf[2];
    209	struct spi_transfer tx_len_trx;
    210	struct spi_transfer tx_buf_trx;
    211	struct sk_buff *tx_skb;
    212
    213	/* post transmit message to send frame out  */
    214	struct spi_message tx_post_msg;
    215	u8 tx_post_buf[2];
    216	struct spi_transfer tx_post_trx;
    217
    218	/* for protect/unprotect/read length rxfifo */
    219	struct spi_message rx_msg;
    220	u8 rx_buf[3];
    221	struct spi_transfer rx_trx;
    222
    223	/* receive handling */
    224	struct spi_message rx_buf_msg;
    225	u8 rx_addr_buf[2];
    226	struct spi_transfer rx_addr_trx;
    227	u8 rx_lqi_buf[2];
    228	struct spi_transfer rx_lqi_trx;
    229	u8 rx_fifo_buf[RX_FIFO_SIZE];
    230	struct spi_transfer rx_fifo_buf_trx;
    231
    232	/* isr handling for reading intstat */
    233	struct spi_message irq_msg;
    234	u8 irq_buf[2];
    235	struct spi_transfer irq_trx;
    236};
    237
    238/* regmap information for short address register access */
    239#define MRF24J40_SHORT_WRITE	0x01
    240#define MRF24J40_SHORT_READ	0x00
    241#define MRF24J40_SHORT_NUMREGS	0x3F
    242
    243/* regmap information for long address register access */
    244#define MRF24J40_LONG_ACCESS	0x80
    245#define MRF24J40_LONG_NUMREGS	0x38F
    246
    247/* Read/Write SPI Commands for Short and Long Address registers. */
    248#define MRF24J40_READSHORT(reg) ((reg) << 1)
    249#define MRF24J40_WRITESHORT(reg) ((reg) << 1 | 1)
    250#define MRF24J40_READLONG(reg) (1 << 15 | (reg) << 5)
    251#define MRF24J40_WRITELONG(reg) (1 << 15 | (reg) << 5 | 1 << 4)
    252
    253/* The datasheet indicates the theoretical maximum for SCK to be 10MHz */
    254#define MAX_SPI_SPEED_HZ 10000000
    255
    256#define printdev(X) (&X->spi->dev)
    257
    258static bool
    259mrf24j40_short_reg_writeable(struct device *dev, unsigned int reg)
    260{
    261	switch (reg) {
    262	case REG_RXMCR:
    263	case REG_PANIDL:
    264	case REG_PANIDH:
    265	case REG_SADRL:
    266	case REG_SADRH:
    267	case REG_EADR0:
    268	case REG_EADR1:
    269	case REG_EADR2:
    270	case REG_EADR3:
    271	case REG_EADR4:
    272	case REG_EADR5:
    273	case REG_EADR6:
    274	case REG_EADR7:
    275	case REG_RXFLUSH:
    276	case REG_ORDER:
    277	case REG_TXMCR:
    278	case REG_ACKTMOUT:
    279	case REG_ESLOTG1:
    280	case REG_SYMTICKL:
    281	case REG_SYMTICKH:
    282	case REG_PACON0:
    283	case REG_PACON1:
    284	case REG_PACON2:
    285	case REG_TXBCON0:
    286	case REG_TXNCON:
    287	case REG_TXG1CON:
    288	case REG_TXG2CON:
    289	case REG_ESLOTG23:
    290	case REG_ESLOTG45:
    291	case REG_ESLOTG67:
    292	case REG_TXPEND:
    293	case REG_WAKECON:
    294	case REG_FROMOFFSET:
    295	case REG_TXBCON1:
    296	case REG_GATECLK:
    297	case REG_TXTIME:
    298	case REG_HSYMTMRL:
    299	case REG_HSYMTMRH:
    300	case REG_SOFTRST:
    301	case REG_SECCON0:
    302	case REG_SECCON1:
    303	case REG_TXSTBL:
    304	case REG_RXSR:
    305	case REG_INTCON:
    306	case REG_TRISGPIO:
    307	case REG_GPIO:
    308	case REG_RFCTL:
    309	case REG_SECCR2:
    310	case REG_SLPACK:
    311	case REG_BBREG0:
    312	case REG_BBREG1:
    313	case REG_BBREG2:
    314	case REG_BBREG3:
    315	case REG_BBREG4:
    316	case REG_BBREG6:
    317	case REG_CCAEDTH:
    318		return true;
    319	default:
    320		return false;
    321	}
    322}
    323
    324static bool
    325mrf24j40_short_reg_readable(struct device *dev, unsigned int reg)
    326{
    327	bool rc;
    328
    329	/* all writeable are also readable */
    330	rc = mrf24j40_short_reg_writeable(dev, reg);
    331	if (rc)
    332		return rc;
    333
    334	/* readonly regs */
    335	switch (reg) {
    336	case REG_TXSTAT:
    337	case REG_INTSTAT:
    338		return true;
    339	default:
    340		return false;
    341	}
    342}
    343
    344static bool
    345mrf24j40_short_reg_volatile(struct device *dev, unsigned int reg)
    346{
    347	/* can be changed during runtime */
    348	switch (reg) {
    349	case REG_TXSTAT:
    350	case REG_INTSTAT:
    351	case REG_RXFLUSH:
    352	case REG_TXNCON:
    353	case REG_SOFTRST:
    354	case REG_RFCTL:
    355	case REG_TXBCON0:
    356	case REG_TXG1CON:
    357	case REG_TXG2CON:
    358	case REG_TXBCON1:
    359	case REG_SECCON0:
    360	case REG_RXSR:
    361	case REG_SLPACK:
    362	case REG_SECCR2:
    363	case REG_BBREG6:
    364	/* use them in spi_async and regmap so it's volatile */
    365	case REG_BBREG1:
    366		return true;
    367	default:
    368		return false;
    369	}
    370}
    371
    372static bool
    373mrf24j40_short_reg_precious(struct device *dev, unsigned int reg)
    374{
    375	/* don't clear irq line on read */
    376	switch (reg) {
    377	case REG_INTSTAT:
    378		return true;
    379	default:
    380		return false;
    381	}
    382}
    383
    384static const struct regmap_config mrf24j40_short_regmap = {
    385	.name = "mrf24j40_short",
    386	.reg_bits = 7,
    387	.val_bits = 8,
    388	.pad_bits = 1,
    389	.write_flag_mask = MRF24J40_SHORT_WRITE,
    390	.read_flag_mask = MRF24J40_SHORT_READ,
    391	.cache_type = REGCACHE_RBTREE,
    392	.max_register = MRF24J40_SHORT_NUMREGS,
    393	.writeable_reg = mrf24j40_short_reg_writeable,
    394	.readable_reg = mrf24j40_short_reg_readable,
    395	.volatile_reg = mrf24j40_short_reg_volatile,
    396	.precious_reg = mrf24j40_short_reg_precious,
    397};
    398
    399static bool
    400mrf24j40_long_reg_writeable(struct device *dev, unsigned int reg)
    401{
    402	switch (reg) {
    403	case REG_RFCON0:
    404	case REG_RFCON1:
    405	case REG_RFCON2:
    406	case REG_RFCON3:
    407	case REG_RFCON5:
    408	case REG_RFCON6:
    409	case REG_RFCON7:
    410	case REG_RFCON8:
    411	case REG_SLPCAL2:
    412	case REG_SLPCON0:
    413	case REG_SLPCON1:
    414	case REG_WAKETIMEL:
    415	case REG_WAKETIMEH:
    416	case REG_REMCNTL:
    417	case REG_REMCNTH:
    418	case REG_MAINCNT0:
    419	case REG_MAINCNT1:
    420	case REG_MAINCNT2:
    421	case REG_MAINCNT3:
    422	case REG_TESTMODE:
    423	case REG_ASSOEAR0:
    424	case REG_ASSOEAR1:
    425	case REG_ASSOEAR2:
    426	case REG_ASSOEAR3:
    427	case REG_ASSOEAR4:
    428	case REG_ASSOEAR5:
    429	case REG_ASSOEAR6:
    430	case REG_ASSOEAR7:
    431	case REG_ASSOSAR0:
    432	case REG_ASSOSAR1:
    433	case REG_UNONCE0:
    434	case REG_UNONCE1:
    435	case REG_UNONCE2:
    436	case REG_UNONCE3:
    437	case REG_UNONCE4:
    438	case REG_UNONCE5:
    439	case REG_UNONCE6:
    440	case REG_UNONCE7:
    441	case REG_UNONCE8:
    442	case REG_UNONCE9:
    443	case REG_UNONCE10:
    444	case REG_UNONCE11:
    445	case REG_UNONCE12:
    446		return true;
    447	default:
    448		return false;
    449	}
    450}
    451
    452static bool
    453mrf24j40_long_reg_readable(struct device *dev, unsigned int reg)
    454{
    455	bool rc;
    456
    457	/* all writeable are also readable */
    458	rc = mrf24j40_long_reg_writeable(dev, reg);
    459	if (rc)
    460		return rc;
    461
    462	/* readonly regs */
    463	switch (reg) {
    464	case REG_SLPCAL0:
    465	case REG_SLPCAL1:
    466	case REG_RFSTATE:
    467	case REG_RSSI:
    468		return true;
    469	default:
    470		return false;
    471	}
    472}
    473
    474static bool
    475mrf24j40_long_reg_volatile(struct device *dev, unsigned int reg)
    476{
    477	/* can be changed during runtime */
    478	switch (reg) {
    479	case REG_SLPCAL0:
    480	case REG_SLPCAL1:
    481	case REG_SLPCAL2:
    482	case REG_RFSTATE:
    483	case REG_RSSI:
    484	case REG_MAINCNT3:
    485		return true;
    486	default:
    487		return false;
    488	}
    489}
    490
    491static const struct regmap_config mrf24j40_long_regmap = {
    492	.name = "mrf24j40_long",
    493	.reg_bits = 11,
    494	.val_bits = 8,
    495	.pad_bits = 5,
    496	.write_flag_mask = MRF24J40_LONG_ACCESS,
    497	.read_flag_mask = MRF24J40_LONG_ACCESS,
    498	.cache_type = REGCACHE_RBTREE,
    499	.max_register = MRF24J40_LONG_NUMREGS,
    500	.writeable_reg = mrf24j40_long_reg_writeable,
    501	.readable_reg = mrf24j40_long_reg_readable,
    502	.volatile_reg = mrf24j40_long_reg_volatile,
    503};
    504
    505static int mrf24j40_long_regmap_write(void *context, const void *data,
    506				      size_t count)
    507{
    508	struct spi_device *spi = context;
    509	u8 buf[3];
    510
    511	if (count > 3)
    512		return -EINVAL;
    513
    514	/* regmap supports read/write mask only in frist byte
    515	 * long write access need to set the 12th bit, so we
    516	 * make special handling for write.
    517	 */
    518	memcpy(buf, data, count);
    519	buf[1] |= (1 << 4);
    520
    521	return spi_write(spi, buf, count);
    522}
    523
    524static int
    525mrf24j40_long_regmap_read(void *context, const void *reg, size_t reg_size,
    526			  void *val, size_t val_size)
    527{
    528	struct spi_device *spi = context;
    529
    530	return spi_write_then_read(spi, reg, reg_size, val, val_size);
    531}
    532
    533static const struct regmap_bus mrf24j40_long_regmap_bus = {
    534	.write = mrf24j40_long_regmap_write,
    535	.read = mrf24j40_long_regmap_read,
    536	.reg_format_endian_default = REGMAP_ENDIAN_BIG,
    537	.val_format_endian_default = REGMAP_ENDIAN_BIG,
    538};
    539
    540static void write_tx_buf_complete(void *context)
    541{
    542	struct mrf24j40 *devrec = context;
    543	__le16 fc = ieee802154_get_fc_from_skb(devrec->tx_skb);
    544	u8 val = BIT_TXNTRIG;
    545	int ret;
    546
    547	if (ieee802154_is_secen(fc))
    548		val |= BIT_TXNSECEN;
    549
    550	if (ieee802154_is_ackreq(fc))
    551		val |= BIT_TXNACKREQ;
    552
    553	devrec->tx_post_msg.complete = NULL;
    554	devrec->tx_post_buf[0] = MRF24J40_WRITESHORT(REG_TXNCON);
    555	devrec->tx_post_buf[1] = val;
    556
    557	ret = spi_async(devrec->spi, &devrec->tx_post_msg);
    558	if (ret)
    559		dev_err(printdev(devrec), "SPI write Failed for transmit buf\n");
    560}
    561
    562/* This function relies on an undocumented write method. Once a write command
    563   and address is set, as many bytes of data as desired can be clocked into
    564   the device. The datasheet only shows setting one byte at a time. */
    565static int write_tx_buf(struct mrf24j40 *devrec, u16 reg,
    566			const u8 *data, size_t length)
    567{
    568	u16 cmd;
    569	int ret;
    570
    571	/* Range check the length. 2 bytes are used for the length fields.*/
    572	if (length > TX_FIFO_SIZE-2) {
    573		dev_err(printdev(devrec), "write_tx_buf() was passed too large a buffer. Performing short write.\n");
    574		length = TX_FIFO_SIZE-2;
    575	}
    576
    577	cmd = MRF24J40_WRITELONG(reg);
    578	devrec->tx_hdr_buf[0] = cmd >> 8 & 0xff;
    579	devrec->tx_hdr_buf[1] = cmd & 0xff;
    580	devrec->tx_len_buf[0] = 0x0; /* Header Length. Set to 0 for now. TODO */
    581	devrec->tx_len_buf[1] = length; /* Total length */
    582	devrec->tx_buf_trx.tx_buf = data;
    583	devrec->tx_buf_trx.len = length;
    584
    585	ret = spi_async(devrec->spi, &devrec->tx_msg);
    586	if (ret)
    587		dev_err(printdev(devrec), "SPI write Failed for TX buf\n");
    588
    589	return ret;
    590}
    591
    592static int mrf24j40_tx(struct ieee802154_hw *hw, struct sk_buff *skb)
    593{
    594	struct mrf24j40 *devrec = hw->priv;
    595
    596	dev_dbg(printdev(devrec), "tx packet of %d bytes\n", skb->len);
    597	devrec->tx_skb = skb;
    598
    599	return write_tx_buf(devrec, 0x000, skb->data, skb->len);
    600}
    601
    602static int mrf24j40_ed(struct ieee802154_hw *hw, u8 *level)
    603{
    604	/* TODO: */
    605	pr_warn("mrf24j40: ed not implemented\n");
    606	*level = 0;
    607	return 0;
    608}
    609
    610static int mrf24j40_start(struct ieee802154_hw *hw)
    611{
    612	struct mrf24j40 *devrec = hw->priv;
    613
    614	dev_dbg(printdev(devrec), "start\n");
    615
    616	/* Clear TXNIE and RXIE. Enable interrupts */
    617	return regmap_update_bits(devrec->regmap_short, REG_INTCON,
    618				  BIT_TXNIE | BIT_RXIE | BIT_SECIE, 0);
    619}
    620
    621static void mrf24j40_stop(struct ieee802154_hw *hw)
    622{
    623	struct mrf24j40 *devrec = hw->priv;
    624
    625	dev_dbg(printdev(devrec), "stop\n");
    626
    627	/* Set TXNIE and RXIE. Disable Interrupts */
    628	regmap_update_bits(devrec->regmap_short, REG_INTCON,
    629			   BIT_TXNIE | BIT_RXIE, BIT_TXNIE | BIT_RXIE);
    630}
    631
    632static int mrf24j40_set_channel(struct ieee802154_hw *hw, u8 page, u8 channel)
    633{
    634	struct mrf24j40 *devrec = hw->priv;
    635	u8 val;
    636	int ret;
    637
    638	dev_dbg(printdev(devrec), "Set Channel %d\n", channel);
    639
    640	WARN_ON(page != 0);
    641	WARN_ON(channel < MRF24J40_CHAN_MIN);
    642	WARN_ON(channel > MRF24J40_CHAN_MAX);
    643
    644	/* Set Channel TODO */
    645	val = (channel - 11) << RFCON0_CH_SHIFT | RFOPT_RECOMMEND;
    646	ret = regmap_update_bits(devrec->regmap_long, REG_RFCON0,
    647				 RFCON0_CH_MASK, val);
    648	if (ret)
    649		return ret;
    650
    651	/* RF Reset */
    652	ret = regmap_update_bits(devrec->regmap_short, REG_RFCTL, BIT_RFRST,
    653				 BIT_RFRST);
    654	if (ret)
    655		return ret;
    656
    657	ret = regmap_update_bits(devrec->regmap_short, REG_RFCTL, BIT_RFRST, 0);
    658	if (!ret)
    659		udelay(SET_CHANNEL_DELAY_US); /* per datasheet */
    660
    661	return ret;
    662}
    663
    664static int mrf24j40_filter(struct ieee802154_hw *hw,
    665			   struct ieee802154_hw_addr_filt *filt,
    666			   unsigned long changed)
    667{
    668	struct mrf24j40 *devrec = hw->priv;
    669
    670	dev_dbg(printdev(devrec), "filter\n");
    671
    672	if (changed & IEEE802154_AFILT_SADDR_CHANGED) {
    673		/* Short Addr */
    674		u8 addrh, addrl;
    675
    676		addrh = le16_to_cpu(filt->short_addr) >> 8 & 0xff;
    677		addrl = le16_to_cpu(filt->short_addr) & 0xff;
    678
    679		regmap_write(devrec->regmap_short, REG_SADRH, addrh);
    680		regmap_write(devrec->regmap_short, REG_SADRL, addrl);
    681		dev_dbg(printdev(devrec),
    682			"Set short addr to %04hx\n", filt->short_addr);
    683	}
    684
    685	if (changed & IEEE802154_AFILT_IEEEADDR_CHANGED) {
    686		/* Device Address */
    687		u8 i, addr[8];
    688
    689		memcpy(addr, &filt->ieee_addr, 8);
    690		for (i = 0; i < 8; i++)
    691			regmap_write(devrec->regmap_short, REG_EADR0 + i,
    692				     addr[i]);
    693
    694#ifdef DEBUG
    695		pr_debug("Set long addr to: ");
    696		for (i = 0; i < 8; i++)
    697			pr_debug("%02hhx ", addr[7 - i]);
    698		pr_debug("\n");
    699#endif
    700	}
    701
    702	if (changed & IEEE802154_AFILT_PANID_CHANGED) {
    703		/* PAN ID */
    704		u8 panidl, panidh;
    705
    706		panidh = le16_to_cpu(filt->pan_id) >> 8 & 0xff;
    707		panidl = le16_to_cpu(filt->pan_id) & 0xff;
    708		regmap_write(devrec->regmap_short, REG_PANIDH, panidh);
    709		regmap_write(devrec->regmap_short, REG_PANIDL, panidl);
    710
    711		dev_dbg(printdev(devrec), "Set PANID to %04hx\n", filt->pan_id);
    712	}
    713
    714	if (changed & IEEE802154_AFILT_PANC_CHANGED) {
    715		/* Pan Coordinator */
    716		u8 val;
    717		int ret;
    718
    719		if (filt->pan_coord)
    720			val = BIT_PANCOORD;
    721		else
    722			val = 0;
    723		ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR,
    724					 BIT_PANCOORD, val);
    725		if (ret)
    726			return ret;
    727
    728		/* REG_SLOTTED is maintained as default (unslotted/CSMA-CA).
    729		 * REG_ORDER is maintained as default (no beacon/superframe).
    730		 */
    731
    732		dev_dbg(printdev(devrec), "Set Pan Coord to %s\n",
    733			filt->pan_coord ? "on" : "off");
    734	}
    735
    736	return 0;
    737}
    738
    739static void mrf24j40_handle_rx_read_buf_unlock(struct mrf24j40 *devrec)
    740{
    741	int ret;
    742
    743	/* Turn back on reception of packets off the air. */
    744	devrec->rx_msg.complete = NULL;
    745	devrec->rx_buf[0] = MRF24J40_WRITESHORT(REG_BBREG1);
    746	devrec->rx_buf[1] = 0x00; /* CLR RXDECINV */
    747	ret = spi_async(devrec->spi, &devrec->rx_msg);
    748	if (ret)
    749		dev_err(printdev(devrec), "failed to unlock rx buffer\n");
    750}
    751
    752static void mrf24j40_handle_rx_read_buf_complete(void *context)
    753{
    754	struct mrf24j40 *devrec = context;
    755	u8 len = devrec->rx_buf[2];
    756	u8 rx_local_buf[RX_FIFO_SIZE];
    757	struct sk_buff *skb;
    758
    759	memcpy(rx_local_buf, devrec->rx_fifo_buf, len);
    760	mrf24j40_handle_rx_read_buf_unlock(devrec);
    761
    762	skb = dev_alloc_skb(IEEE802154_MTU);
    763	if (!skb) {
    764		dev_err(printdev(devrec), "failed to allocate skb\n");
    765		return;
    766	}
    767
    768	skb_put_data(skb, rx_local_buf, len);
    769	ieee802154_rx_irqsafe(devrec->hw, skb, 0);
    770
    771#ifdef DEBUG
    772	 print_hex_dump(KERN_DEBUG, "mrf24j40 rx: ", DUMP_PREFIX_OFFSET, 16, 1,
    773			rx_local_buf, len, 0);
    774	 pr_debug("mrf24j40 rx: lqi: %02hhx rssi: %02hhx\n",
    775		  devrec->rx_lqi_buf[0], devrec->rx_lqi_buf[1]);
    776#endif
    777}
    778
    779static void mrf24j40_handle_rx_read_buf(void *context)
    780{
    781	struct mrf24j40 *devrec = context;
    782	u16 cmd;
    783	int ret;
    784
    785	/* if length is invalid read the full MTU */
    786	if (!ieee802154_is_valid_psdu_len(devrec->rx_buf[2]))
    787		devrec->rx_buf[2] = IEEE802154_MTU;
    788
    789	cmd = MRF24J40_READLONG(REG_RX_FIFO + 1);
    790	devrec->rx_addr_buf[0] = cmd >> 8 & 0xff;
    791	devrec->rx_addr_buf[1] = cmd & 0xff;
    792	devrec->rx_fifo_buf_trx.len = devrec->rx_buf[2];
    793	ret = spi_async(devrec->spi, &devrec->rx_buf_msg);
    794	if (ret) {
    795		dev_err(printdev(devrec), "failed to read rx buffer\n");
    796		mrf24j40_handle_rx_read_buf_unlock(devrec);
    797	}
    798}
    799
    800static void mrf24j40_handle_rx_read_len(void *context)
    801{
    802	struct mrf24j40 *devrec = context;
    803	u16 cmd;
    804	int ret;
    805
    806	/* read the length of received frame */
    807	devrec->rx_msg.complete = mrf24j40_handle_rx_read_buf;
    808	devrec->rx_trx.len = 3;
    809	cmd = MRF24J40_READLONG(REG_RX_FIFO);
    810	devrec->rx_buf[0] = cmd >> 8 & 0xff;
    811	devrec->rx_buf[1] = cmd & 0xff;
    812
    813	ret = spi_async(devrec->spi, &devrec->rx_msg);
    814	if (ret) {
    815		dev_err(printdev(devrec), "failed to read rx buffer length\n");
    816		mrf24j40_handle_rx_read_buf_unlock(devrec);
    817	}
    818}
    819
    820static int mrf24j40_handle_rx(struct mrf24j40 *devrec)
    821{
    822	/* Turn off reception of packets off the air. This prevents the
    823	 * device from overwriting the buffer while we're reading it.
    824	 */
    825	devrec->rx_msg.complete = mrf24j40_handle_rx_read_len;
    826	devrec->rx_trx.len = 2;
    827	devrec->rx_buf[0] = MRF24J40_WRITESHORT(REG_BBREG1);
    828	devrec->rx_buf[1] = BIT_RXDECINV; /* SET RXDECINV */
    829
    830	return spi_async(devrec->spi, &devrec->rx_msg);
    831}
    832
    833static int
    834mrf24j40_csma_params(struct ieee802154_hw *hw, u8 min_be, u8 max_be,
    835		     u8 retries)
    836{
    837	struct mrf24j40 *devrec = hw->priv;
    838	u8 val;
    839
    840	/* min_be */
    841	val = min_be << TXMCR_MIN_BE_SHIFT;
    842	/* csma backoffs */
    843	val |= retries << TXMCR_CSMA_RETRIES_SHIFT;
    844
    845	return regmap_update_bits(devrec->regmap_short, REG_TXMCR,
    846				  TXMCR_MIN_BE_MASK | TXMCR_CSMA_RETRIES_MASK,
    847				  val);
    848}
    849
    850static int mrf24j40_set_cca_mode(struct ieee802154_hw *hw,
    851				 const struct wpan_phy_cca *cca)
    852{
    853	struct mrf24j40 *devrec = hw->priv;
    854	u8 val;
    855
    856	/* mapping 802.15.4 to driver spec */
    857	switch (cca->mode) {
    858	case NL802154_CCA_ENERGY:
    859		val = 2;
    860		break;
    861	case NL802154_CCA_CARRIER:
    862		val = 1;
    863		break;
    864	case NL802154_CCA_ENERGY_CARRIER:
    865		switch (cca->opt) {
    866		case NL802154_CCA_OPT_ENERGY_CARRIER_AND:
    867			val = 3;
    868			break;
    869		default:
    870			return -EINVAL;
    871		}
    872		break;
    873	default:
    874		return -EINVAL;
    875	}
    876
    877	return regmap_update_bits(devrec->regmap_short, REG_BBREG2,
    878				  BBREG2_CCA_MODE_MASK,
    879				  val << BBREG2_CCA_MODE_SHIFT);
    880}
    881
    882/* array for representing ed levels */
    883static const s32 mrf24j40_ed_levels[] = {
    884	-9000, -8900, -8800, -8700, -8600, -8500, -8400, -8300, -8200, -8100,
    885	-8000, -7900, -7800, -7700, -7600, -7500, -7400, -7300, -7200, -7100,
    886	-7000, -6900, -6800, -6700, -6600, -6500, -6400, -6300, -6200, -6100,
    887	-6000, -5900, -5800, -5700, -5600, -5500, -5400, -5300, -5200, -5100,
    888	-5000, -4900, -4800, -4700, -4600, -4500, -4400, -4300, -4200, -4100,
    889	-4000, -3900, -3800, -3700, -3600, -3500
    890};
    891
    892/* map ed levels to register value */
    893static const s32 mrf24j40_ed_levels_map[][2] = {
    894	{ -9000, 0 }, { -8900, 1 }, { -8800, 2 }, { -8700, 5 }, { -8600, 9 },
    895	{ -8500, 13 }, { -8400, 18 }, { -8300, 23 }, { -8200, 27 },
    896	{ -8100, 32 }, { -8000, 37 }, { -7900, 43 }, { -7800, 48 },
    897	{ -7700, 53 }, { -7600, 58 }, { -7500, 63 }, { -7400, 68 },
    898	{ -7300, 73 }, { -7200, 78 }, { -7100, 83 }, { -7000, 89 },
    899	{ -6900, 95 }, { -6800, 100 }, { -6700, 107 }, { -6600, 111 },
    900	{ -6500, 117 }, { -6400, 121 }, { -6300, 125 }, { -6200, 129 },
    901	{ -6100, 133 },	{ -6000, 138 }, { -5900, 143 }, { -5800, 148 },
    902	{ -5700, 153 }, { -5600, 159 },	{ -5500, 165 }, { -5400, 170 },
    903	{ -5300, 176 }, { -5200, 183 }, { -5100, 188 }, { -5000, 193 },
    904	{ -4900, 198 }, { -4800, 203 }, { -4700, 207 }, { -4600, 212 },
    905	{ -4500, 216 }, { -4400, 221 }, { -4300, 225 }, { -4200, 228 },
    906	{ -4100, 233 }, { -4000, 239 }, { -3900, 245 }, { -3800, 250 },
    907	{ -3700, 253 }, { -3600, 254 }, { -3500, 255 },
    908};
    909
    910static int mrf24j40_set_cca_ed_level(struct ieee802154_hw *hw, s32 mbm)
    911{
    912	struct mrf24j40 *devrec = hw->priv;
    913	int i;
    914
    915	for (i = 0; i < ARRAY_SIZE(mrf24j40_ed_levels_map); i++) {
    916		if (mrf24j40_ed_levels_map[i][0] == mbm)
    917			return regmap_write(devrec->regmap_short, REG_CCAEDTH,
    918					    mrf24j40_ed_levels_map[i][1]);
    919	}
    920
    921	return -EINVAL;
    922}
    923
    924static const s32 mrf24j40ma_powers[] = {
    925	0, -50, -120, -190, -280, -370, -490, -630, -1000, -1050, -1120, -1190,
    926	-1280, -1370, -1490, -1630, -2000, -2050, -2120, -2190, -2280, -2370,
    927	-2490, -2630, -3000, -3050, -3120, -3190, -3280, -3370, -3490, -3630,
    928};
    929
    930static int mrf24j40_set_txpower(struct ieee802154_hw *hw, s32 mbm)
    931{
    932	struct mrf24j40 *devrec = hw->priv;
    933	s32 small_scale;
    934	u8 val;
    935
    936	if (0 >= mbm && mbm > -1000) {
    937		val = TXPWRL_0 << TXPWRL_SHIFT;
    938		small_scale = mbm;
    939	} else if (-1000 >= mbm && mbm > -2000) {
    940		val = TXPWRL_10 << TXPWRL_SHIFT;
    941		small_scale = mbm + 1000;
    942	} else if (-2000 >= mbm && mbm > -3000) {
    943		val = TXPWRL_20 << TXPWRL_SHIFT;
    944		small_scale = mbm + 2000;
    945	} else if (-3000 >= mbm && mbm > -4000) {
    946		val = TXPWRL_30 << TXPWRL_SHIFT;
    947		small_scale = mbm + 3000;
    948	} else {
    949		return -EINVAL;
    950	}
    951
    952	switch (small_scale) {
    953	case 0:
    954		val |= (TXPWRS_0 << TXPWRS_SHIFT);
    955		break;
    956	case -50:
    957		val |= (TXPWRS_0_5 << TXPWRS_SHIFT);
    958		break;
    959	case -120:
    960		val |= (TXPWRS_1_2 << TXPWRS_SHIFT);
    961		break;
    962	case -190:
    963		val |= (TXPWRS_1_9 << TXPWRS_SHIFT);
    964		break;
    965	case -280:
    966		val |= (TXPWRS_2_8 << TXPWRS_SHIFT);
    967		break;
    968	case -370:
    969		val |= (TXPWRS_3_7 << TXPWRS_SHIFT);
    970		break;
    971	case -490:
    972		val |= (TXPWRS_4_9 << TXPWRS_SHIFT);
    973		break;
    974	case -630:
    975		val |= (TXPWRS_6_3 << TXPWRS_SHIFT);
    976		break;
    977	default:
    978		return -EINVAL;
    979	}
    980
    981	return regmap_update_bits(devrec->regmap_long, REG_RFCON3,
    982				  TXPWRL_MASK | TXPWRS_MASK, val);
    983}
    984
    985static int mrf24j40_set_promiscuous_mode(struct ieee802154_hw *hw, bool on)
    986{
    987	struct mrf24j40 *devrec = hw->priv;
    988	int ret;
    989
    990	if (on) {
    991		/* set PROMI, ERRPKT and NOACKRSP */
    992		ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR,
    993					 BIT_PROMI | BIT_ERRPKT | BIT_NOACKRSP,
    994					 BIT_PROMI | BIT_ERRPKT | BIT_NOACKRSP);
    995	} else {
    996		/* clear PROMI, ERRPKT and NOACKRSP */
    997		ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR,
    998					 BIT_PROMI | BIT_ERRPKT | BIT_NOACKRSP,
    999					 0);
   1000	}
   1001
   1002	return ret;
   1003}
   1004
   1005static const struct ieee802154_ops mrf24j40_ops = {
   1006	.owner = THIS_MODULE,
   1007	.xmit_async = mrf24j40_tx,
   1008	.ed = mrf24j40_ed,
   1009	.start = mrf24j40_start,
   1010	.stop = mrf24j40_stop,
   1011	.set_channel = mrf24j40_set_channel,
   1012	.set_hw_addr_filt = mrf24j40_filter,
   1013	.set_csma_params = mrf24j40_csma_params,
   1014	.set_cca_mode = mrf24j40_set_cca_mode,
   1015	.set_cca_ed_level = mrf24j40_set_cca_ed_level,
   1016	.set_txpower = mrf24j40_set_txpower,
   1017	.set_promiscuous_mode = mrf24j40_set_promiscuous_mode,
   1018};
   1019
   1020static void mrf24j40_intstat_complete(void *context)
   1021{
   1022	struct mrf24j40 *devrec = context;
   1023	u8 intstat = devrec->irq_buf[1];
   1024
   1025	enable_irq(devrec->spi->irq);
   1026
   1027	/* Ignore Rx security decryption */
   1028	if (intstat & BIT_SECIF)
   1029		regmap_write_async(devrec->regmap_short, REG_SECCON0,
   1030				   BIT_SECIGNORE);
   1031
   1032	/* Check for TX complete */
   1033	if (intstat & BIT_TXNIF)
   1034		ieee802154_xmit_complete(devrec->hw, devrec->tx_skb, false);
   1035
   1036	/* Check for Rx */
   1037	if (intstat & BIT_RXIF)
   1038		mrf24j40_handle_rx(devrec);
   1039}
   1040
   1041static irqreturn_t mrf24j40_isr(int irq, void *data)
   1042{
   1043	struct mrf24j40 *devrec = data;
   1044	int ret;
   1045
   1046	disable_irq_nosync(irq);
   1047
   1048	devrec->irq_buf[0] = MRF24J40_READSHORT(REG_INTSTAT);
   1049	devrec->irq_buf[1] = 0;
   1050
   1051	/* Read the interrupt status */
   1052	ret = spi_async(devrec->spi, &devrec->irq_msg);
   1053	if (ret) {
   1054		enable_irq(irq);
   1055		return IRQ_NONE;
   1056	}
   1057
   1058	return IRQ_HANDLED;
   1059}
   1060
   1061static int mrf24j40_hw_init(struct mrf24j40 *devrec)
   1062{
   1063	u32 irq_type;
   1064	int ret;
   1065
   1066	/* Initialize the device.
   1067		From datasheet section 3.2: Initialization. */
   1068	ret = regmap_write(devrec->regmap_short, REG_SOFTRST, 0x07);
   1069	if (ret)
   1070		goto err_ret;
   1071
   1072	ret = regmap_write(devrec->regmap_short, REG_PACON2, 0x98);
   1073	if (ret)
   1074		goto err_ret;
   1075
   1076	ret = regmap_write(devrec->regmap_short, REG_TXSTBL, 0x95);
   1077	if (ret)
   1078		goto err_ret;
   1079
   1080	ret = regmap_write(devrec->regmap_long, REG_RFCON0, 0x03);
   1081	if (ret)
   1082		goto err_ret;
   1083
   1084	ret = regmap_write(devrec->regmap_long, REG_RFCON1, 0x01);
   1085	if (ret)
   1086		goto err_ret;
   1087
   1088	ret = regmap_write(devrec->regmap_long, REG_RFCON2, 0x80);
   1089	if (ret)
   1090		goto err_ret;
   1091
   1092	ret = regmap_write(devrec->regmap_long, REG_RFCON6, 0x90);
   1093	if (ret)
   1094		goto err_ret;
   1095
   1096	ret = regmap_write(devrec->regmap_long, REG_RFCON7, 0x80);
   1097	if (ret)
   1098		goto err_ret;
   1099
   1100	ret = regmap_write(devrec->regmap_long, REG_RFCON8, 0x10);
   1101	if (ret)
   1102		goto err_ret;
   1103
   1104	ret = regmap_write(devrec->regmap_long, REG_SLPCON1, 0x21);
   1105	if (ret)
   1106		goto err_ret;
   1107
   1108	ret = regmap_write(devrec->regmap_short, REG_BBREG2, 0x80);
   1109	if (ret)
   1110		goto err_ret;
   1111
   1112	ret = regmap_write(devrec->regmap_short, REG_CCAEDTH, 0x60);
   1113	if (ret)
   1114		goto err_ret;
   1115
   1116	ret = regmap_write(devrec->regmap_short, REG_BBREG6, 0x40);
   1117	if (ret)
   1118		goto err_ret;
   1119
   1120	ret = regmap_write(devrec->regmap_short, REG_RFCTL, 0x04);
   1121	if (ret)
   1122		goto err_ret;
   1123
   1124	ret = regmap_write(devrec->regmap_short, REG_RFCTL, 0x0);
   1125	if (ret)
   1126		goto err_ret;
   1127
   1128	udelay(192);
   1129
   1130	/* Set RX Mode. RXMCR<1:0>: 0x0 normal, 0x1 promisc, 0x2 error */
   1131	ret = regmap_update_bits(devrec->regmap_short, REG_RXMCR, 0x03, 0x00);
   1132	if (ret)
   1133		goto err_ret;
   1134
   1135	if (spi_get_device_id(devrec->spi)->driver_data == MRF24J40MC) {
   1136		/* Enable external amplifier.
   1137		 * From MRF24J40MC datasheet section 1.3: Operation.
   1138		 */
   1139		regmap_update_bits(devrec->regmap_long, REG_TESTMODE, 0x07,
   1140				   0x07);
   1141
   1142		/* Set GPIO3 as output. */
   1143		regmap_update_bits(devrec->regmap_short, REG_TRISGPIO, 0x08,
   1144				   0x08);
   1145
   1146		/* Set GPIO3 HIGH to enable U5 voltage regulator */
   1147		regmap_update_bits(devrec->regmap_short, REG_GPIO, 0x08, 0x08);
   1148
   1149		/* Reduce TX pwr to meet FCC requirements.
   1150		 * From MRF24J40MC datasheet section 3.1.1
   1151		 */
   1152		regmap_write(devrec->regmap_long, REG_RFCON3, 0x28);
   1153	}
   1154
   1155	irq_type = irq_get_trigger_type(devrec->spi->irq);
   1156	if (irq_type == IRQ_TYPE_EDGE_RISING ||
   1157	    irq_type == IRQ_TYPE_EDGE_FALLING)
   1158		dev_warn(&devrec->spi->dev,
   1159			 "Using edge triggered irq's are not recommended, because it can cause races and result in a non-functional driver!\n");
   1160	switch (irq_type) {
   1161	case IRQ_TYPE_EDGE_RISING:
   1162	case IRQ_TYPE_LEVEL_HIGH:
   1163		/* set interrupt polarity to rising */
   1164		ret = regmap_update_bits(devrec->regmap_long, REG_SLPCON0,
   1165					 BIT_INTEDGE, BIT_INTEDGE);
   1166		if (ret)
   1167			goto err_ret;
   1168		break;
   1169	default:
   1170		/* default is falling edge */
   1171		break;
   1172	}
   1173
   1174	return 0;
   1175
   1176err_ret:
   1177	return ret;
   1178}
   1179
   1180static void
   1181mrf24j40_setup_tx_spi_messages(struct mrf24j40 *devrec)
   1182{
   1183	spi_message_init(&devrec->tx_msg);
   1184	devrec->tx_msg.context = devrec;
   1185	devrec->tx_msg.complete = write_tx_buf_complete;
   1186	devrec->tx_hdr_trx.len = 2;
   1187	devrec->tx_hdr_trx.tx_buf = devrec->tx_hdr_buf;
   1188	spi_message_add_tail(&devrec->tx_hdr_trx, &devrec->tx_msg);
   1189	devrec->tx_len_trx.len = 2;
   1190	devrec->tx_len_trx.tx_buf = devrec->tx_len_buf;
   1191	spi_message_add_tail(&devrec->tx_len_trx, &devrec->tx_msg);
   1192	spi_message_add_tail(&devrec->tx_buf_trx, &devrec->tx_msg);
   1193
   1194	spi_message_init(&devrec->tx_post_msg);
   1195	devrec->tx_post_msg.context = devrec;
   1196	devrec->tx_post_trx.len = 2;
   1197	devrec->tx_post_trx.tx_buf = devrec->tx_post_buf;
   1198	spi_message_add_tail(&devrec->tx_post_trx, &devrec->tx_post_msg);
   1199}
   1200
   1201static void
   1202mrf24j40_setup_rx_spi_messages(struct mrf24j40 *devrec)
   1203{
   1204	spi_message_init(&devrec->rx_msg);
   1205	devrec->rx_msg.context = devrec;
   1206	devrec->rx_trx.len = 2;
   1207	devrec->rx_trx.tx_buf = devrec->rx_buf;
   1208	devrec->rx_trx.rx_buf = devrec->rx_buf;
   1209	spi_message_add_tail(&devrec->rx_trx, &devrec->rx_msg);
   1210
   1211	spi_message_init(&devrec->rx_buf_msg);
   1212	devrec->rx_buf_msg.context = devrec;
   1213	devrec->rx_buf_msg.complete = mrf24j40_handle_rx_read_buf_complete;
   1214	devrec->rx_addr_trx.len = 2;
   1215	devrec->rx_addr_trx.tx_buf = devrec->rx_addr_buf;
   1216	spi_message_add_tail(&devrec->rx_addr_trx, &devrec->rx_buf_msg);
   1217	devrec->rx_fifo_buf_trx.rx_buf = devrec->rx_fifo_buf;
   1218	spi_message_add_tail(&devrec->rx_fifo_buf_trx, &devrec->rx_buf_msg);
   1219	devrec->rx_lqi_trx.len = 2;
   1220	devrec->rx_lqi_trx.rx_buf = devrec->rx_lqi_buf;
   1221	spi_message_add_tail(&devrec->rx_lqi_trx, &devrec->rx_buf_msg);
   1222}
   1223
   1224static void
   1225mrf24j40_setup_irq_spi_messages(struct mrf24j40 *devrec)
   1226{
   1227	spi_message_init(&devrec->irq_msg);
   1228	devrec->irq_msg.context = devrec;
   1229	devrec->irq_msg.complete = mrf24j40_intstat_complete;
   1230	devrec->irq_trx.len = 2;
   1231	devrec->irq_trx.tx_buf = devrec->irq_buf;
   1232	devrec->irq_trx.rx_buf = devrec->irq_buf;
   1233	spi_message_add_tail(&devrec->irq_trx, &devrec->irq_msg);
   1234}
   1235
   1236static void  mrf24j40_phy_setup(struct mrf24j40 *devrec)
   1237{
   1238	ieee802154_random_extended_addr(&devrec->hw->phy->perm_extended_addr);
   1239	devrec->hw->phy->current_channel = 11;
   1240
   1241	/* mrf24j40 supports max_minbe 0 - 3 */
   1242	devrec->hw->phy->supported.max_minbe = 3;
   1243	/* datasheet doesn't say anything about max_be, but we have min_be
   1244	 * So we assume the max_be default.
   1245	 */
   1246	devrec->hw->phy->supported.min_maxbe = 5;
   1247	devrec->hw->phy->supported.max_maxbe = 5;
   1248
   1249	devrec->hw->phy->cca.mode = NL802154_CCA_CARRIER;
   1250	devrec->hw->phy->supported.cca_modes = BIT(NL802154_CCA_ENERGY) |
   1251					       BIT(NL802154_CCA_CARRIER) |
   1252					       BIT(NL802154_CCA_ENERGY_CARRIER);
   1253	devrec->hw->phy->supported.cca_opts = BIT(NL802154_CCA_OPT_ENERGY_CARRIER_AND);
   1254
   1255	devrec->hw->phy->cca_ed_level = -6900;
   1256	devrec->hw->phy->supported.cca_ed_levels = mrf24j40_ed_levels;
   1257	devrec->hw->phy->supported.cca_ed_levels_size = ARRAY_SIZE(mrf24j40_ed_levels);
   1258
   1259	switch (spi_get_device_id(devrec->spi)->driver_data) {
   1260	case MRF24J40:
   1261	case MRF24J40MA:
   1262		devrec->hw->phy->supported.tx_powers = mrf24j40ma_powers;
   1263		devrec->hw->phy->supported.tx_powers_size = ARRAY_SIZE(mrf24j40ma_powers);
   1264		devrec->hw->phy->flags |= WPAN_PHY_FLAG_TXPOWER;
   1265		break;
   1266	default:
   1267		break;
   1268	}
   1269}
   1270
   1271static int mrf24j40_probe(struct spi_device *spi)
   1272{
   1273	int ret = -ENOMEM, irq_type;
   1274	struct ieee802154_hw *hw;
   1275	struct mrf24j40 *devrec;
   1276
   1277	dev_info(&spi->dev, "probe(). IRQ: %d\n", spi->irq);
   1278
   1279	/* Register with the 802154 subsystem */
   1280
   1281	hw = ieee802154_alloc_hw(sizeof(*devrec), &mrf24j40_ops);
   1282	if (!hw)
   1283		goto err_ret;
   1284
   1285	devrec = hw->priv;
   1286	devrec->spi = spi;
   1287	spi_set_drvdata(spi, devrec);
   1288	devrec->hw = hw;
   1289	devrec->hw->parent = &spi->dev;
   1290	devrec->hw->phy->supported.channels[0] = CHANNEL_MASK;
   1291	devrec->hw->flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT |
   1292			    IEEE802154_HW_CSMA_PARAMS |
   1293			    IEEE802154_HW_PROMISCUOUS;
   1294
   1295	devrec->hw->phy->flags = WPAN_PHY_FLAG_CCA_MODE |
   1296				 WPAN_PHY_FLAG_CCA_ED_LEVEL;
   1297
   1298	mrf24j40_setup_tx_spi_messages(devrec);
   1299	mrf24j40_setup_rx_spi_messages(devrec);
   1300	mrf24j40_setup_irq_spi_messages(devrec);
   1301
   1302	devrec->regmap_short = devm_regmap_init_spi(spi,
   1303						    &mrf24j40_short_regmap);
   1304	if (IS_ERR(devrec->regmap_short)) {
   1305		ret = PTR_ERR(devrec->regmap_short);
   1306		dev_err(&spi->dev, "Failed to allocate short register map: %d\n",
   1307			ret);
   1308		goto err_register_device;
   1309	}
   1310
   1311	devrec->regmap_long = devm_regmap_init(&spi->dev,
   1312					       &mrf24j40_long_regmap_bus,
   1313					       spi, &mrf24j40_long_regmap);
   1314	if (IS_ERR(devrec->regmap_long)) {
   1315		ret = PTR_ERR(devrec->regmap_long);
   1316		dev_err(&spi->dev, "Failed to allocate long register map: %d\n",
   1317			ret);
   1318		goto err_register_device;
   1319	}
   1320
   1321	if (spi->max_speed_hz > MAX_SPI_SPEED_HZ) {
   1322		dev_warn(&spi->dev, "spi clock above possible maximum: %d",
   1323			 MAX_SPI_SPEED_HZ);
   1324		ret = -EINVAL;
   1325		goto err_register_device;
   1326	}
   1327
   1328	ret = mrf24j40_hw_init(devrec);
   1329	if (ret)
   1330		goto err_register_device;
   1331
   1332	mrf24j40_phy_setup(devrec);
   1333
   1334	/* request IRQF_TRIGGER_LOW as fallback default */
   1335	irq_type = irq_get_trigger_type(spi->irq);
   1336	if (!irq_type)
   1337		irq_type = IRQF_TRIGGER_LOW;
   1338
   1339	ret = devm_request_irq(&spi->dev, spi->irq, mrf24j40_isr,
   1340			       irq_type, dev_name(&spi->dev), devrec);
   1341	if (ret) {
   1342		dev_err(printdev(devrec), "Unable to get IRQ");
   1343		goto err_register_device;
   1344	}
   1345
   1346	dev_dbg(printdev(devrec), "registered mrf24j40\n");
   1347	ret = ieee802154_register_hw(devrec->hw);
   1348	if (ret)
   1349		goto err_register_device;
   1350
   1351	return 0;
   1352
   1353err_register_device:
   1354	ieee802154_free_hw(devrec->hw);
   1355err_ret:
   1356	return ret;
   1357}
   1358
   1359static void mrf24j40_remove(struct spi_device *spi)
   1360{
   1361	struct mrf24j40 *devrec = spi_get_drvdata(spi);
   1362
   1363	dev_dbg(printdev(devrec), "remove\n");
   1364
   1365	ieee802154_unregister_hw(devrec->hw);
   1366	ieee802154_free_hw(devrec->hw);
   1367	/* TODO: Will ieee802154_free_device() wait until ->xmit() is
   1368	 * complete? */
   1369}
   1370
   1371static const struct of_device_id mrf24j40_of_match[] = {
   1372	{ .compatible = "microchip,mrf24j40", .data = (void *)MRF24J40 },
   1373	{ .compatible = "microchip,mrf24j40ma", .data = (void *)MRF24J40MA },
   1374	{ .compatible = "microchip,mrf24j40mc", .data = (void *)MRF24J40MC },
   1375	{ },
   1376};
   1377MODULE_DEVICE_TABLE(of, mrf24j40_of_match);
   1378
   1379static const struct spi_device_id mrf24j40_ids[] = {
   1380	{ "mrf24j40", MRF24J40 },
   1381	{ "mrf24j40ma", MRF24J40MA },
   1382	{ "mrf24j40mc", MRF24J40MC },
   1383	{ },
   1384};
   1385MODULE_DEVICE_TABLE(spi, mrf24j40_ids);
   1386
   1387static struct spi_driver mrf24j40_driver = {
   1388	.driver = {
   1389		.of_match_table = mrf24j40_of_match,
   1390		.name = "mrf24j40",
   1391	},
   1392	.id_table = mrf24j40_ids,
   1393	.probe = mrf24j40_probe,
   1394	.remove = mrf24j40_remove,
   1395};
   1396
   1397module_spi_driver(mrf24j40_driver);
   1398
   1399MODULE_LICENSE("GPL");
   1400MODULE_AUTHOR("Alan Ott");
   1401MODULE_DESCRIPTION("MRF24J40 SPI 802.15.4 Controller Driver");