1 /* 2 * AT86RF230/RF231 driver 3 * 4 * Copyright (C) 2009-2012 Siemens AG 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 8 * as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Written by: 20 * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> 21 * Alexander Smirnov <alex.bluesman.smirnov@gmail.com> 22 */ 23 #include <linux/kernel.h> 24 #include <linux/module.h> 25 #include <linux/interrupt.h> 26 #include <linux/gpio.h> 27 #include <linux/delay.h> 28 #include <linux/mutex.h> 29 #include <linux/workqueue.h> 30 #include <linux/spinlock.h> 31 #include <linux/spi/spi.h> 32 #include <linux/spi/at86rf230.h> 33 #include <linux/skbuff.h> 34 35 #include <net/mac802154.h> 36 #include <net/wpan-phy.h> 37 38 struct at86rf230_local { 39 struct spi_device *spi; 40 int rstn, slp_tr, dig2; 41 42 u8 part; 43 u8 vers; 44 45 u8 buf[2]; 46 struct mutex bmux; 47 48 struct work_struct irqwork; 49 struct completion tx_complete; 50 51 struct ieee802154_dev *dev; 52 53 spinlock_t lock; 54 bool irq_busy; 55 bool is_tx; 56 }; 57 58 #define RG_TRX_STATUS (0x01) 59 #define SR_TRX_STATUS 0x01, 0x1f, 0 60 #define SR_RESERVED_01_3 0x01, 0x20, 5 61 #define SR_CCA_STATUS 0x01, 0x40, 6 62 #define SR_CCA_DONE 0x01, 0x80, 7 63 #define RG_TRX_STATE (0x02) 64 #define SR_TRX_CMD 0x02, 0x1f, 0 65 #define SR_TRAC_STATUS 0x02, 0xe0, 5 66 #define RG_TRX_CTRL_0 (0x03) 67 #define SR_CLKM_CTRL 0x03, 0x07, 0 68 #define SR_CLKM_SHA_SEL 0x03, 0x08, 3 69 #define SR_PAD_IO_CLKM 0x03, 0x30, 4 70 #define SR_PAD_IO 0x03, 0xc0, 6 71 #define RG_TRX_CTRL_1 (0x04) 72 #define SR_IRQ_POLARITY 0x04, 0x01, 0 73 #define SR_IRQ_MASK_MODE 0x04, 0x02, 1 74 #define SR_SPI_CMD_MODE 0x04, 0x0c, 2 75 #define SR_RX_BL_CTRL 0x04, 0x10, 4 76 #define SR_TX_AUTO_CRC_ON 0x04, 0x20, 5 77 #define SR_IRQ_2_EXT_EN 0x04, 0x40, 6 78 #define SR_PA_EXT_EN 0x04, 0x80, 7 79 #define RG_PHY_TX_PWR (0x05) 80 #define SR_TX_PWR 0x05, 0x0f, 0 81 #define SR_PA_LT 0x05, 0x30, 4 82 #define SR_PA_BUF_LT 0x05, 0xc0, 6 83 #define RG_PHY_RSSI (0x06) 84 #define SR_RSSI 0x06, 0x1f, 0 85 #define SR_RND_VALUE 0x06, 0x60, 5 86 #define SR_RX_CRC_VALID 0x06, 0x80, 7 87 #define RG_PHY_ED_LEVEL (0x07) 88 #define SR_ED_LEVEL 0x07, 0xff, 0 89 #define RG_PHY_CC_CCA (0x08) 90 #define SR_CHANNEL 0x08, 0x1f, 0 91 #define SR_CCA_MODE 0x08, 0x60, 5 92 #define SR_CCA_REQUEST 0x08, 0x80, 7 93 #define RG_CCA_THRES (0x09) 94 #define SR_CCA_ED_THRES 0x09, 0x0f, 0 95 #define SR_RESERVED_09_1 0x09, 0xf0, 4 96 #define RG_RX_CTRL (0x0a) 97 #define SR_PDT_THRES 0x0a, 0x0f, 0 98 #define SR_RESERVED_0a_1 0x0a, 0xf0, 4 99 #define RG_SFD_VALUE (0x0b) 100 #define SR_SFD_VALUE 0x0b, 0xff, 0 101 #define RG_TRX_CTRL_2 (0x0c) 102 #define SR_OQPSK_DATA_RATE 0x0c, 0x03, 0 103 #define SR_RESERVED_0c_2 0x0c, 0x7c, 2 104 #define SR_RX_SAFE_MODE 0x0c, 0x80, 7 105 #define RG_ANT_DIV (0x0d) 106 #define SR_ANT_CTRL 0x0d, 0x03, 0 107 #define SR_ANT_EXT_SW_EN 0x0d, 0x04, 2 108 #define SR_ANT_DIV_EN 0x0d, 0x08, 3 109 #define SR_RESERVED_0d_2 0x0d, 0x70, 4 110 #define SR_ANT_SEL 0x0d, 0x80, 7 111 #define RG_IRQ_MASK (0x0e) 112 #define SR_IRQ_MASK 0x0e, 0xff, 0 113 #define RG_IRQ_STATUS (0x0f) 114 #define SR_IRQ_0_PLL_LOCK 0x0f, 0x01, 0 115 #define SR_IRQ_1_PLL_UNLOCK 0x0f, 0x02, 1 116 #define SR_IRQ_2_RX_START 0x0f, 0x04, 2 117 #define SR_IRQ_3_TRX_END 0x0f, 0x08, 3 118 #define SR_IRQ_4_CCA_ED_DONE 0x0f, 0x10, 4 119 #define SR_IRQ_5_AMI 0x0f, 0x20, 5 120 #define SR_IRQ_6_TRX_UR 0x0f, 0x40, 6 121 #define SR_IRQ_7_BAT_LOW 0x0f, 0x80, 7 122 #define RG_VREG_CTRL (0x10) 123 #define SR_RESERVED_10_6 0x10, 0x03, 0 124 #define SR_DVDD_OK 0x10, 0x04, 2 125 #define SR_DVREG_EXT 0x10, 0x08, 3 126 #define SR_RESERVED_10_3 0x10, 0x30, 4 127 #define SR_AVDD_OK 0x10, 0x40, 6 128 #define SR_AVREG_EXT 0x10, 0x80, 7 129 #define RG_BATMON (0x11) 130 #define SR_BATMON_VTH 0x11, 0x0f, 0 131 #define SR_BATMON_HR 0x11, 0x10, 4 132 #define SR_BATMON_OK 0x11, 0x20, 5 133 #define SR_RESERVED_11_1 0x11, 0xc0, 6 134 #define RG_XOSC_CTRL (0x12) 135 #define SR_XTAL_TRIM 0x12, 0x0f, 0 136 #define SR_XTAL_MODE 0x12, 0xf0, 4 137 #define RG_RX_SYN (0x15) 138 #define SR_RX_PDT_LEVEL 0x15, 0x0f, 0 139 #define SR_RESERVED_15_2 0x15, 0x70, 4 140 #define SR_RX_PDT_DIS 0x15, 0x80, 7 141 #define RG_XAH_CTRL_1 (0x17) 142 #define SR_RESERVED_17_8 0x17, 0x01, 0 143 #define SR_AACK_PROM_MODE 0x17, 0x02, 1 144 #define SR_AACK_ACK_TIME 0x17, 0x04, 2 145 #define SR_RESERVED_17_5 0x17, 0x08, 3 146 #define SR_AACK_UPLD_RES_FT 0x17, 0x10, 4 147 #define SR_AACK_FLTR_RES_FT 0x17, 0x20, 5 148 #define SR_RESERVED_17_2 0x17, 0x40, 6 149 #define SR_RESERVED_17_1 0x17, 0x80, 7 150 #define RG_FTN_CTRL (0x18) 151 #define SR_RESERVED_18_2 0x18, 0x7f, 0 152 #define SR_FTN_START 0x18, 0x80, 7 153 #define RG_PLL_CF (0x1a) 154 #define SR_RESERVED_1a_2 0x1a, 0x7f, 0 155 #define SR_PLL_CF_START 0x1a, 0x80, 7 156 #define RG_PLL_DCU (0x1b) 157 #define SR_RESERVED_1b_3 0x1b, 0x3f, 0 158 #define SR_RESERVED_1b_2 0x1b, 0x40, 6 159 #define SR_PLL_DCU_START 0x1b, 0x80, 7 160 #define RG_PART_NUM (0x1c) 161 #define SR_PART_NUM 0x1c, 0xff, 0 162 #define RG_VERSION_NUM (0x1d) 163 #define SR_VERSION_NUM 0x1d, 0xff, 0 164 #define RG_MAN_ID_0 (0x1e) 165 #define SR_MAN_ID_0 0x1e, 0xff, 0 166 #define RG_MAN_ID_1 (0x1f) 167 #define SR_MAN_ID_1 0x1f, 0xff, 0 168 #define RG_SHORT_ADDR_0 (0x20) 169 #define SR_SHORT_ADDR_0 0x20, 0xff, 0 170 #define RG_SHORT_ADDR_1 (0x21) 171 #define SR_SHORT_ADDR_1 0x21, 0xff, 0 172 #define RG_PAN_ID_0 (0x22) 173 #define SR_PAN_ID_0 0x22, 0xff, 0 174 #define RG_PAN_ID_1 (0x23) 175 #define SR_PAN_ID_1 0x23, 0xff, 0 176 #define RG_IEEE_ADDR_0 (0x24) 177 #define SR_IEEE_ADDR_0 0x24, 0xff, 0 178 #define RG_IEEE_ADDR_1 (0x25) 179 #define SR_IEEE_ADDR_1 0x25, 0xff, 0 180 #define RG_IEEE_ADDR_2 (0x26) 181 #define SR_IEEE_ADDR_2 0x26, 0xff, 0 182 #define RG_IEEE_ADDR_3 (0x27) 183 #define SR_IEEE_ADDR_3 0x27, 0xff, 0 184 #define RG_IEEE_ADDR_4 (0x28) 185 #define SR_IEEE_ADDR_4 0x28, 0xff, 0 186 #define RG_IEEE_ADDR_5 (0x29) 187 #define SR_IEEE_ADDR_5 0x29, 0xff, 0 188 #define RG_IEEE_ADDR_6 (0x2a) 189 #define SR_IEEE_ADDR_6 0x2a, 0xff, 0 190 #define RG_IEEE_ADDR_7 (0x2b) 191 #define SR_IEEE_ADDR_7 0x2b, 0xff, 0 192 #define RG_XAH_CTRL_0 (0x2c) 193 #define SR_SLOTTED_OPERATION 0x2c, 0x01, 0 194 #define SR_MAX_CSMA_RETRIES 0x2c, 0x0e, 1 195 #define SR_MAX_FRAME_RETRIES 0x2c, 0xf0, 4 196 #define RG_CSMA_SEED_0 (0x2d) 197 #define SR_CSMA_SEED_0 0x2d, 0xff, 0 198 #define RG_CSMA_SEED_1 (0x2e) 199 #define SR_CSMA_SEED_1 0x2e, 0x07, 0 200 #define SR_AACK_I_AM_COORD 0x2e, 0x08, 3 201 #define SR_AACK_DIS_ACK 0x2e, 0x10, 4 202 #define SR_AACK_SET_PD 0x2e, 0x20, 5 203 #define SR_AACK_FVN_MODE 0x2e, 0xc0, 6 204 #define RG_CSMA_BE (0x2f) 205 #define SR_MIN_BE 0x2f, 0x0f, 0 206 #define SR_MAX_BE 0x2f, 0xf0, 4 207 208 #define CMD_REG 0x80 209 #define CMD_REG_MASK 0x3f 210 #define CMD_WRITE 0x40 211 #define CMD_FB 0x20 212 213 #define IRQ_BAT_LOW (1 << 7) 214 #define IRQ_TRX_UR (1 << 6) 215 #define IRQ_AMI (1 << 5) 216 #define IRQ_CCA_ED (1 << 4) 217 #define IRQ_TRX_END (1 << 3) 218 #define IRQ_RX_START (1 << 2) 219 #define IRQ_PLL_UNL (1 << 1) 220 #define IRQ_PLL_LOCK (1 << 0) 221 222 #define IRQ_ACTIVE_HIGH 0 223 #define IRQ_ACTIVE_LOW 1 224 225 #define STATE_P_ON 0x00 /* BUSY */ 226 #define STATE_BUSY_RX 0x01 227 #define STATE_BUSY_TX 0x02 228 #define STATE_FORCE_TRX_OFF 0x03 229 #define STATE_FORCE_TX_ON 0x04 /* IDLE */ 230 /* 0x05 */ /* INVALID_PARAMETER */ 231 #define STATE_RX_ON 0x06 232 /* 0x07 */ /* SUCCESS */ 233 #define STATE_TRX_OFF 0x08 234 #define STATE_TX_ON 0x09 235 /* 0x0a - 0x0e */ /* 0x0a - UNSUPPORTED_ATTRIBUTE */ 236 #define STATE_SLEEP 0x0F 237 #define STATE_BUSY_RX_AACK 0x11 238 #define STATE_BUSY_TX_ARET 0x12 239 #define STATE_RX_AACK_ON 0x16 240 #define STATE_TX_ARET_ON 0x19 241 #define STATE_RX_ON_NOCLK 0x1C 242 #define STATE_RX_AACK_ON_NOCLK 0x1D 243 #define STATE_BUSY_RX_AACK_NOCLK 0x1E 244 #define STATE_TRANSITION_IN_PROGRESS 0x1F 245 246 static int 247 __at86rf230_write(struct at86rf230_local *lp, u8 addr, u8 data) 248 { 249 u8 *buf = lp->buf; 250 int status; 251 struct spi_message msg; 252 struct spi_transfer xfer = { 253 .len = 2, 254 .tx_buf = buf, 255 }; 256 257 buf[0] = (addr & CMD_REG_MASK) | CMD_REG | CMD_WRITE; 258 buf[1] = data; 259 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 260 dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); 261 spi_message_init(&msg); 262 spi_message_add_tail(&xfer, &msg); 263 264 status = spi_sync(lp->spi, &msg); 265 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 266 if (msg.status) 267 status = msg.status; 268 269 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 270 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 271 dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); 272 273 return status; 274 } 275 276 static int 277 __at86rf230_read_subreg(struct at86rf230_local *lp, 278 u8 addr, u8 mask, int shift, u8 *data) 279 { 280 u8 *buf = lp->buf; 281 int status; 282 struct spi_message msg; 283 struct spi_transfer xfer = { 284 .len = 2, 285 .tx_buf = buf, 286 .rx_buf = buf, 287 }; 288 289 buf[0] = (addr & CMD_REG_MASK) | CMD_REG; 290 buf[1] = 0xff; 291 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 292 spi_message_init(&msg); 293 spi_message_add_tail(&xfer, &msg); 294 295 status = spi_sync(lp->spi, &msg); 296 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 297 if (msg.status) 298 status = msg.status; 299 300 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 301 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 302 dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); 303 304 if (status == 0) 305 *data = buf[1]; 306 307 return status; 308 } 309 310 static int 311 at86rf230_read_subreg(struct at86rf230_local *lp, 312 u8 addr, u8 mask, int shift, u8 *data) 313 { 314 int status; 315 316 mutex_lock(&lp->bmux); 317 status = __at86rf230_read_subreg(lp, addr, mask, shift, data); 318 mutex_unlock(&lp->bmux); 319 320 return status; 321 } 322 323 static int 324 at86rf230_write_subreg(struct at86rf230_local *lp, 325 u8 addr, u8 mask, int shift, u8 data) 326 { 327 int status; 328 u8 val; 329 330 mutex_lock(&lp->bmux); 331 status = __at86rf230_read_subreg(lp, addr, 0xff, 0, &val); 332 if (status) 333 goto out; 334 335 val &= ~mask; 336 val |= (data << shift) & mask; 337 338 status = __at86rf230_write(lp, addr, val); 339 out: 340 mutex_unlock(&lp->bmux); 341 342 return status; 343 } 344 345 static int 346 at86rf230_write_fbuf(struct at86rf230_local *lp, u8 *data, u8 len) 347 { 348 u8 *buf = lp->buf; 349 int status; 350 struct spi_message msg; 351 struct spi_transfer xfer_head = { 352 .len = 2, 353 .tx_buf = buf, 354 355 }; 356 struct spi_transfer xfer_buf = { 357 .len = len, 358 .tx_buf = data, 359 }; 360 361 mutex_lock(&lp->bmux); 362 buf[0] = CMD_WRITE | CMD_FB; 363 buf[1] = len + 2; /* 2 bytes for CRC that isn't written */ 364 365 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 366 dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); 367 368 spi_message_init(&msg); 369 spi_message_add_tail(&xfer_head, &msg); 370 spi_message_add_tail(&xfer_buf, &msg); 371 372 status = spi_sync(lp->spi, &msg); 373 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 374 if (msg.status) 375 status = msg.status; 376 377 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 378 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 379 dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); 380 381 mutex_unlock(&lp->bmux); 382 return status; 383 } 384 385 static int 386 at86rf230_read_fbuf(struct at86rf230_local *lp, u8 *data, u8 *len, u8 *lqi) 387 { 388 u8 *buf = lp->buf; 389 int status; 390 struct spi_message msg; 391 struct spi_transfer xfer_head = { 392 .len = 2, 393 .tx_buf = buf, 394 .rx_buf = buf, 395 }; 396 struct spi_transfer xfer_head1 = { 397 .len = 2, 398 .tx_buf = buf, 399 .rx_buf = buf, 400 }; 401 struct spi_transfer xfer_buf = { 402 .len = 0, 403 .rx_buf = data, 404 }; 405 406 mutex_lock(&lp->bmux); 407 408 buf[0] = CMD_FB; 409 buf[1] = 0x00; 410 411 spi_message_init(&msg); 412 spi_message_add_tail(&xfer_head, &msg); 413 414 status = spi_sync(lp->spi, &msg); 415 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 416 417 xfer_buf.len = *(buf + 1) + 1; 418 *len = buf[1]; 419 420 buf[0] = CMD_FB; 421 buf[1] = 0x00; 422 423 spi_message_init(&msg); 424 spi_message_add_tail(&xfer_head1, &msg); 425 spi_message_add_tail(&xfer_buf, &msg); 426 427 status = spi_sync(lp->spi, &msg); 428 429 if (msg.status) 430 status = msg.status; 431 432 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 433 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 434 dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); 435 436 if (status) { 437 if (lqi && (*len > lp->buf[1])) 438 *lqi = data[lp->buf[1]]; 439 } 440 mutex_unlock(&lp->bmux); 441 442 return status; 443 } 444 445 static int 446 at86rf230_ed(struct ieee802154_dev *dev, u8 *level) 447 { 448 might_sleep(); 449 BUG_ON(!level); 450 *level = 0xbe; 451 return 0; 452 } 453 454 static int 455 at86rf230_state(struct ieee802154_dev *dev, int state) 456 { 457 struct at86rf230_local *lp = dev->priv; 458 int rc; 459 u8 val; 460 u8 desired_status; 461 462 might_sleep(); 463 464 if (state == STATE_FORCE_TX_ON) 465 desired_status = STATE_TX_ON; 466 else if (state == STATE_FORCE_TRX_OFF) 467 desired_status = STATE_TRX_OFF; 468 else 469 desired_status = state; 470 471 do { 472 rc = at86rf230_read_subreg(lp, SR_TRX_STATUS, &val); 473 if (rc) 474 goto err; 475 } while (val == STATE_TRANSITION_IN_PROGRESS); 476 477 if (val == desired_status) 478 return 0; 479 480 /* state is equal to phy states */ 481 rc = at86rf230_write_subreg(lp, SR_TRX_CMD, state); 482 if (rc) 483 goto err; 484 485 do { 486 rc = at86rf230_read_subreg(lp, SR_TRX_STATUS, &val); 487 if (rc) 488 goto err; 489 } while (val == STATE_TRANSITION_IN_PROGRESS); 490 491 492 if (val == desired_status) 493 return 0; 494 495 pr_err("unexpected state change: %d, asked for %d\n", val, state); 496 return -EBUSY; 497 498 err: 499 pr_err("error: %d\n", rc); 500 return rc; 501 } 502 503 static int 504 at86rf230_start(struct ieee802154_dev *dev) 505 { 506 struct at86rf230_local *lp = dev->priv; 507 u8 rc; 508 509 rc = at86rf230_write_subreg(lp, SR_RX_SAFE_MODE, 1); 510 if (rc) 511 return rc; 512 513 return at86rf230_state(dev, STATE_RX_ON); 514 } 515 516 static void 517 at86rf230_stop(struct ieee802154_dev *dev) 518 { 519 at86rf230_state(dev, STATE_FORCE_TRX_OFF); 520 } 521 522 static int 523 at86rf230_channel(struct ieee802154_dev *dev, int page, int channel) 524 { 525 struct at86rf230_local *lp = dev->priv; 526 int rc; 527 528 might_sleep(); 529 530 if (page != 0 || channel < 11 || channel > 26) { 531 WARN_ON(1); 532 return -EINVAL; 533 } 534 535 rc = at86rf230_write_subreg(lp, SR_CHANNEL, channel); 536 msleep(1); /* Wait for PLL */ 537 dev->phy->current_channel = channel; 538 539 return 0; 540 } 541 542 static int 543 at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) 544 { 545 struct at86rf230_local *lp = dev->priv; 546 int rc; 547 unsigned long flags; 548 549 spin_lock(&lp->lock); 550 if (lp->irq_busy) { 551 spin_unlock(&lp->lock); 552 return -EBUSY; 553 } 554 spin_unlock(&lp->lock); 555 556 might_sleep(); 557 558 rc = at86rf230_state(dev, STATE_FORCE_TX_ON); 559 if (rc) 560 goto err; 561 562 spin_lock_irqsave(&lp->lock, flags); 563 lp->is_tx = 1; 564 reinit_completion(&lp->tx_complete); 565 spin_unlock_irqrestore(&lp->lock, flags); 566 567 rc = at86rf230_write_fbuf(lp, skb->data, skb->len); 568 if (rc) 569 goto err_rx; 570 571 rc = at86rf230_write_subreg(lp, SR_TRX_CMD, STATE_BUSY_TX); 572 if (rc) 573 goto err_rx; 574 575 rc = wait_for_completion_interruptible(&lp->tx_complete); 576 if (rc < 0) 577 goto err_rx; 578 579 rc = at86rf230_start(dev); 580 581 return rc; 582 583 err_rx: 584 at86rf230_start(dev); 585 err: 586 pr_err("error: %d\n", rc); 587 588 spin_lock_irqsave(&lp->lock, flags); 589 lp->is_tx = 0; 590 spin_unlock_irqrestore(&lp->lock, flags); 591 592 return rc; 593 } 594 595 static int at86rf230_rx(struct at86rf230_local *lp) 596 { 597 u8 len = 128, lqi = 0; 598 struct sk_buff *skb; 599 600 skb = alloc_skb(len, GFP_KERNEL); 601 602 if (!skb) 603 return -ENOMEM; 604 605 if (at86rf230_read_fbuf(lp, skb_put(skb, len), &len, &lqi)) 606 goto err; 607 608 if (len < 2) 609 goto err; 610 611 skb_trim(skb, len - 2); /* We do not put CRC into the frame */ 612 613 ieee802154_rx_irqsafe(lp->dev, skb, lqi); 614 615 dev_dbg(&lp->spi->dev, "READ_FBUF: %d %x\n", len, lqi); 616 617 return 0; 618 err: 619 pr_debug("received frame is too small\n"); 620 621 kfree_skb(skb); 622 return -EINVAL; 623 } 624 625 static int 626 at86rf230_set_hw_addr_filt(struct ieee802154_dev *dev, 627 struct ieee802154_hw_addr_filt *filt, 628 unsigned long changed) 629 { 630 struct at86rf230_local *lp = dev->priv; 631 632 if (changed & IEEE802515_AFILT_SADDR_CHANGED) { 633 dev_vdbg(&lp->spi->dev, 634 "at86rf230_set_hw_addr_filt called for saddr\n"); 635 __at86rf230_write(lp, RG_SHORT_ADDR_0, filt->short_addr); 636 __at86rf230_write(lp, RG_SHORT_ADDR_1, filt->short_addr >> 8); 637 } 638 639 if (changed & IEEE802515_AFILT_PANID_CHANGED) { 640 dev_vdbg(&lp->spi->dev, 641 "at86rf230_set_hw_addr_filt called for pan id\n"); 642 __at86rf230_write(lp, RG_PAN_ID_0, filt->pan_id); 643 __at86rf230_write(lp, RG_PAN_ID_1, filt->pan_id >> 8); 644 } 645 646 if (changed & IEEE802515_AFILT_IEEEADDR_CHANGED) { 647 dev_vdbg(&lp->spi->dev, 648 "at86rf230_set_hw_addr_filt called for IEEE addr\n"); 649 at86rf230_write_subreg(lp, SR_IEEE_ADDR_0, filt->ieee_addr[7]); 650 at86rf230_write_subreg(lp, SR_IEEE_ADDR_1, filt->ieee_addr[6]); 651 at86rf230_write_subreg(lp, SR_IEEE_ADDR_2, filt->ieee_addr[5]); 652 at86rf230_write_subreg(lp, SR_IEEE_ADDR_3, filt->ieee_addr[4]); 653 at86rf230_write_subreg(lp, SR_IEEE_ADDR_4, filt->ieee_addr[3]); 654 at86rf230_write_subreg(lp, SR_IEEE_ADDR_5, filt->ieee_addr[2]); 655 at86rf230_write_subreg(lp, SR_IEEE_ADDR_6, filt->ieee_addr[1]); 656 at86rf230_write_subreg(lp, SR_IEEE_ADDR_7, filt->ieee_addr[0]); 657 } 658 659 if (changed & IEEE802515_AFILT_PANC_CHANGED) { 660 dev_vdbg(&lp->spi->dev, 661 "at86rf230_set_hw_addr_filt called for panc change\n"); 662 if (filt->pan_coord) 663 at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 1); 664 else 665 at86rf230_write_subreg(lp, SR_AACK_I_AM_COORD, 0); 666 } 667 668 return 0; 669 } 670 671 static struct ieee802154_ops at86rf230_ops = { 672 .owner = THIS_MODULE, 673 .xmit = at86rf230_xmit, 674 .ed = at86rf230_ed, 675 .set_channel = at86rf230_channel, 676 .start = at86rf230_start, 677 .stop = at86rf230_stop, 678 .set_hw_addr_filt = at86rf230_set_hw_addr_filt, 679 }; 680 681 static void at86rf230_irqwork(struct work_struct *work) 682 { 683 struct at86rf230_local *lp = 684 container_of(work, struct at86rf230_local, irqwork); 685 u8 status = 0, val; 686 int rc; 687 unsigned long flags; 688 689 rc = at86rf230_read_subreg(lp, RG_IRQ_STATUS, 0xff, 0, &val); 690 status |= val; 691 692 status &= ~IRQ_PLL_LOCK; /* ignore */ 693 status &= ~IRQ_RX_START; /* ignore */ 694 status &= ~IRQ_AMI; /* ignore */ 695 status &= ~IRQ_TRX_UR; /* FIXME: possibly handle ???*/ 696 697 if (status & IRQ_TRX_END) { 698 spin_lock_irqsave(&lp->lock, flags); 699 status &= ~IRQ_TRX_END; 700 if (lp->is_tx) { 701 lp->is_tx = 0; 702 spin_unlock_irqrestore(&lp->lock, flags); 703 complete(&lp->tx_complete); 704 } else { 705 spin_unlock_irqrestore(&lp->lock, flags); 706 at86rf230_rx(lp); 707 } 708 } 709 710 spin_lock_irqsave(&lp->lock, flags); 711 lp->irq_busy = 0; 712 spin_unlock_irqrestore(&lp->lock, flags); 713 } 714 715 static void at86rf230_irqwork_level(struct work_struct *work) 716 { 717 struct at86rf230_local *lp = 718 container_of(work, struct at86rf230_local, irqwork); 719 720 at86rf230_irqwork(work); 721 722 enable_irq(lp->spi->irq); 723 } 724 725 static irqreturn_t at86rf230_isr(int irq, void *data) 726 { 727 struct at86rf230_local *lp = data; 728 729 spin_lock(&lp->lock); 730 lp->irq_busy = 1; 731 spin_unlock(&lp->lock); 732 733 schedule_work(&lp->irqwork); 734 735 return IRQ_HANDLED; 736 } 737 738 static irqreturn_t at86rf230_isr_level(int irq, void *data) 739 { 740 disable_irq_nosync(irq); 741 742 return at86rf230_isr(irq, data); 743 } 744 745 static int at86rf230_irq_polarity(struct at86rf230_local *lp, int pol) 746 { 747 return at86rf230_write_subreg(lp, SR_IRQ_POLARITY, pol); 748 } 749 750 static int at86rf230_hw_init(struct at86rf230_local *lp) 751 { 752 struct at86rf230_platform_data *pdata = lp->spi->dev.platform_data; 753 int rc, irq_pol; 754 u8 status; 755 756 rc = at86rf230_read_subreg(lp, SR_TRX_STATUS, &status); 757 if (rc) 758 return rc; 759 760 dev_info(&lp->spi->dev, "Status: %02x\n", status); 761 if (status == STATE_P_ON) { 762 rc = at86rf230_write_subreg(lp, SR_TRX_CMD, STATE_TRX_OFF); 763 if (rc) 764 return rc; 765 msleep(1); 766 rc = at86rf230_read_subreg(lp, SR_TRX_STATUS, &status); 767 if (rc) 768 return rc; 769 dev_info(&lp->spi->dev, "Status: %02x\n", status); 770 } 771 772 /* configure irq polarity, defaults to high active */ 773 if (pdata->irq_type & (IRQF_TRIGGER_FALLING | IRQF_TRIGGER_LOW)) 774 irq_pol = IRQ_ACTIVE_LOW; 775 else 776 irq_pol = IRQ_ACTIVE_HIGH; 777 778 rc = at86rf230_irq_polarity(lp, irq_pol); 779 if (rc) 780 return rc; 781 782 rc = at86rf230_write_subreg(lp, SR_IRQ_MASK, IRQ_TRX_END); 783 if (rc) 784 return rc; 785 786 /* CLKM changes are applied immediately */ 787 rc = at86rf230_write_subreg(lp, SR_CLKM_SHA_SEL, 0x00); 788 if (rc) 789 return rc; 790 791 /* Turn CLKM Off */ 792 rc = at86rf230_write_subreg(lp, SR_CLKM_CTRL, 0x00); 793 if (rc) 794 return rc; 795 /* Wait the next SLEEP cycle */ 796 msleep(100); 797 798 rc = at86rf230_write_subreg(lp, SR_TRX_CMD, STATE_TX_ON); 799 if (rc) 800 return rc; 801 msleep(1); 802 803 rc = at86rf230_read_subreg(lp, SR_TRX_STATUS, &status); 804 if (rc) 805 return rc; 806 dev_info(&lp->spi->dev, "Status: %02x\n", status); 807 808 rc = at86rf230_read_subreg(lp, SR_DVDD_OK, &status); 809 if (rc) 810 return rc; 811 if (!status) { 812 dev_err(&lp->spi->dev, "DVDD error\n"); 813 return -EINVAL; 814 } 815 816 rc = at86rf230_read_subreg(lp, SR_AVDD_OK, &status); 817 if (rc) 818 return rc; 819 if (!status) { 820 dev_err(&lp->spi->dev, "AVDD error\n"); 821 return -EINVAL; 822 } 823 824 return 0; 825 } 826 827 static void at86rf230_fill_data(struct spi_device *spi) 828 { 829 struct at86rf230_local *lp = spi_get_drvdata(spi); 830 struct at86rf230_platform_data *pdata = spi->dev.platform_data; 831 832 lp->rstn = pdata->rstn; 833 lp->slp_tr = pdata->slp_tr; 834 lp->dig2 = pdata->dig2; 835 } 836 837 static int at86rf230_probe(struct spi_device *spi) 838 { 839 struct at86rf230_platform_data *pdata; 840 struct ieee802154_dev *dev; 841 struct at86rf230_local *lp; 842 u8 man_id_0, man_id_1, status; 843 irq_handler_t irq_handler; 844 work_func_t irq_worker; 845 int rc, supported = 0; 846 const char *chip; 847 848 if (!spi->irq) { 849 dev_err(&spi->dev, "no IRQ specified\n"); 850 return -EINVAL; 851 } 852 853 pdata = spi->dev.platform_data; 854 if (!pdata) { 855 dev_err(&spi->dev, "no platform_data\n"); 856 return -EINVAL; 857 } 858 859 dev = ieee802154_alloc_device(sizeof(*lp), &at86rf230_ops); 860 if (!dev) 861 return -ENOMEM; 862 863 lp = dev->priv; 864 lp->dev = dev; 865 866 lp->spi = spi; 867 868 dev->parent = &spi->dev; 869 dev->extra_tx_headroom = 0; 870 /* We do support only 2.4 Ghz */ 871 dev->phy->channels_supported[0] = 0x7FFF800; 872 dev->flags = IEEE802154_HW_OMIT_CKSUM; 873 874 if (pdata->irq_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) { 875 irq_worker = at86rf230_irqwork; 876 irq_handler = at86rf230_isr; 877 } else { 878 irq_worker = at86rf230_irqwork_level; 879 irq_handler = at86rf230_isr_level; 880 } 881 882 mutex_init(&lp->bmux); 883 INIT_WORK(&lp->irqwork, irq_worker); 884 spin_lock_init(&lp->lock); 885 init_completion(&lp->tx_complete); 886 887 spi_set_drvdata(spi, lp); 888 889 at86rf230_fill_data(spi); 890 891 rc = gpio_request(lp->rstn, "rstn"); 892 if (rc) 893 goto err_rstn; 894 895 if (gpio_is_valid(lp->slp_tr)) { 896 rc = gpio_request(lp->slp_tr, "slp_tr"); 897 if (rc) 898 goto err_slp_tr; 899 } 900 901 rc = gpio_direction_output(lp->rstn, 1); 902 if (rc) 903 goto err_gpio_dir; 904 905 if (gpio_is_valid(lp->slp_tr)) { 906 rc = gpio_direction_output(lp->slp_tr, 0); 907 if (rc) 908 goto err_gpio_dir; 909 } 910 911 /* Reset */ 912 msleep(1); 913 gpio_set_value(lp->rstn, 0); 914 msleep(1); 915 gpio_set_value(lp->rstn, 1); 916 msleep(1); 917 918 rc = at86rf230_read_subreg(lp, SR_MAN_ID_0, &man_id_0); 919 if (rc) 920 goto err_gpio_dir; 921 rc = at86rf230_read_subreg(lp, SR_MAN_ID_1, &man_id_1); 922 if (rc) 923 goto err_gpio_dir; 924 925 if (man_id_1 != 0x00 || man_id_0 != 0x1f) { 926 dev_err(&spi->dev, "Non-Atmel dev found (MAN_ID %02x %02x)\n", 927 man_id_1, man_id_0); 928 rc = -EINVAL; 929 goto err_gpio_dir; 930 } 931 932 rc = at86rf230_read_subreg(lp, SR_PART_NUM, &lp->part); 933 if (rc) 934 goto err_gpio_dir; 935 936 rc = at86rf230_read_subreg(lp, SR_VERSION_NUM, &lp->vers); 937 if (rc) 938 goto err_gpio_dir; 939 940 switch (lp->part) { 941 case 2: 942 chip = "at86rf230"; 943 /* supported = 1; FIXME: should be easy to support; */ 944 break; 945 case 3: 946 chip = "at86rf231"; 947 supported = 1; 948 break; 949 default: 950 chip = "UNKNOWN"; 951 break; 952 } 953 954 dev_info(&spi->dev, "Detected %s chip version %d\n", chip, lp->vers); 955 if (!supported) { 956 rc = -ENOTSUPP; 957 goto err_gpio_dir; 958 } 959 960 rc = at86rf230_hw_init(lp); 961 if (rc) 962 goto err_gpio_dir; 963 964 rc = request_irq(spi->irq, irq_handler, 965 IRQF_SHARED | pdata->irq_type, 966 dev_name(&spi->dev), lp); 967 if (rc) 968 goto err_gpio_dir; 969 970 /* Read irq status register to reset irq line */ 971 rc = at86rf230_read_subreg(lp, RG_IRQ_STATUS, 0xff, 0, &status); 972 if (rc) 973 goto err_irq; 974 975 rc = ieee802154_register_device(lp->dev); 976 if (rc) 977 goto err_irq; 978 979 return rc; 980 981 err_irq: 982 free_irq(spi->irq, lp); 983 flush_work(&lp->irqwork); 984 err_gpio_dir: 985 if (gpio_is_valid(lp->slp_tr)) 986 gpio_free(lp->slp_tr); 987 err_slp_tr: 988 gpio_free(lp->rstn); 989 err_rstn: 990 spi_set_drvdata(spi, NULL); 991 mutex_destroy(&lp->bmux); 992 ieee802154_free_device(lp->dev); 993 return rc; 994 } 995 996 static int at86rf230_remove(struct spi_device *spi) 997 { 998 struct at86rf230_local *lp = spi_get_drvdata(spi); 999 1000 ieee802154_unregister_device(lp->dev); 1001 1002 free_irq(spi->irq, lp); 1003 flush_work(&lp->irqwork); 1004 1005 if (gpio_is_valid(lp->slp_tr)) 1006 gpio_free(lp->slp_tr); 1007 gpio_free(lp->rstn); 1008 1009 spi_set_drvdata(spi, NULL); 1010 mutex_destroy(&lp->bmux); 1011 ieee802154_free_device(lp->dev); 1012 1013 dev_dbg(&spi->dev, "unregistered at86rf230\n"); 1014 return 0; 1015 } 1016 1017 static struct spi_driver at86rf230_driver = { 1018 .driver = { 1019 .name = "at86rf230", 1020 .owner = THIS_MODULE, 1021 }, 1022 .probe = at86rf230_probe, 1023 .remove = at86rf230_remove, 1024 }; 1025 1026 module_spi_driver(at86rf230_driver); 1027 1028 MODULE_DESCRIPTION("AT86RF230 Transceiver Driver"); 1029 MODULE_LICENSE("GPL v2"); 1030