aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ieee802154
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2014-07-02 18:20:48 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-08 00:29:24 -0400
commit1d15d6b5b951063184c1749f6145db3170de9e07 (patch)
tree11bfd0f9e72149f57bf48a3dbee888688f03dc0c /drivers/net/ieee802154
parenta7d7eda9054450320d5f7144ff8a0767ab619da3 (diff)
at86rf230: rework transmit and receive handling
This patch is a complete reimplementation of transmit and receive handling for the at86rf230 driver. It solves also six bugs: First: The RX_SAFE_MODE is enabled and the transceiver doesn't leave the receive state while the framebuffer isn't read by a CMD_FB command. This is useful to read out the frame and don't get into another receive or transmit state, otherwise the frame would be overwritten. The current driver do twice CMD_FB calls, the first one leaves this protection. Second: Sometimes the CRC calculation is correct and the length field is greater 127. The current mac802154 layer and filter of a at86rf2xx doesn't check on this and the kernel crashes. In this case the frame is corrupted, we send the whole receive buffer to the next layer which can be useful for sniffing. Thrid: There is a undocumented race condition. When we are go into the RX_AACK_ON state the transceiver could be changed into RX_AACK_BUSY state. This is a normal behaviour. In this case the transceiver received a SHR while assert wasn't finished. Fourth: It also handle some more "correct" state changes. In aret mode the transceiver need to go to TX_ON before the transceiver go into RX_AACK_ON. Fifth: The programming model [0] describes also a error handling in ARET mode if the trac status is different than zero. This is patch adds support for handling this. Sixth: In receive handling the transceiver should also get the trac status according [0]. The driver could use the trac status as error statistic handling, but the driver doesn't use this currently. There is maybe some timing behaviour or the read of this register change some transceiver states. In addition the irqworker is removed. Instead we do async spi calls and no scheduling is involved anymore. The transmit function is also asynchron but with a wait_for_completion handling. The mac802154 layer doesn't support asynchron transmit handling right now. The state change behaviour is now changes, before it was: 1. assert while(!STATE_TRANSITION_IN_PROGRESS) 2. state change 3. assert while(!STATE_TRANSITION_IN_PROGRESS) 4. assert once(wanted state != current state) Sometimes a unexcepted state change occurs when 4. assert was violated. The new state change behaviour is: 1. assert while(!STATE_TRANSITION_IN_PROGRESS) 2. state change 3. wait state change timing according datasheet 4. assert once(wanted state != current state) This behaviour is described in the at86rf231 software programming model [0]. The state change documentation in this programming guide should also valid for at86rf212 and at86rf233 chips. The transceiver don't do a FORCE_TX_ON while we want to transmit a PDU. The new behaviour is a TX_ON and wait a receiving time (tFrame + tPAck). If we are still in RX_AACK_BUSY then we transmit a FORCE_TX_ON as timeout handling. The different is that FORCE_TX_ON aborts receiving and TX_ON waits if RX_AACK_BUSY is finished. This should decrease the drop rate of packets. [0] http://www.atmel.com/Images/AVR2022_swpm231-2.0.zip Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ieee802154')
-rw-r--r--drivers/net/ieee802154/at86rf230.c839
1 files changed, 571 insertions, 268 deletions
diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c
index 6556fecec5e2..39c3c117340d 100644
--- a/drivers/net/ieee802154/at86rf230.c
+++ b/drivers/net/ieee802154/at86rf230.c
@@ -26,8 +26,6 @@
26#include <linux/irq.h> 26#include <linux/irq.h>
27#include <linux/gpio.h> 27#include <linux/gpio.h>
28#include <linux/delay.h> 28#include <linux/delay.h>
29#include <linux/mutex.h>
30#include <linux/workqueue.h>
31#include <linux/spinlock.h> 29#include <linux/spinlock.h>
32#include <linux/spi/spi.h> 30#include <linux/spi/spi.h>
33#include <linux/spi/at86rf230.h> 31#include <linux/spi/at86rf230.h>
@@ -35,6 +33,7 @@
35#include <linux/skbuff.h> 33#include <linux/skbuff.h>
36#include <linux/of_gpio.h> 34#include <linux/of_gpio.h>
37 35
36#include <net/ieee802154.h>
38#include <net/mac802154.h> 37#include <net/mac802154.h>
39#include <net/wpan-phy.h> 38#include <net/wpan-phy.h>
40 39
@@ -43,30 +42,50 @@ struct at86rf230_local;
43 * All timings are in us. 42 * All timings are in us.
44 */ 43 */
45struct at86rf2xx_chip_data { 44struct at86rf2xx_chip_data {
45 u16 t_frame;
46 u16 t_p_ack;
47 /* short interframe spacing time */
48 u16 t_sifs;
49 /* long interframe spacing time */
50 u16 t_lifs;
51 /* completion timeout for tx in msecs */
52 u16 t_tx_timeout;
46 int rssi_base_val; 53 int rssi_base_val;
47 54
48 int (*set_channel)(struct at86rf230_local *, int, int); 55 int (*set_channel)(struct at86rf230_local *, int, int);
49 int (*get_desense_steps)(struct at86rf230_local *, s32); 56 int (*get_desense_steps)(struct at86rf230_local *, s32);
50}; 57};
51 58
52struct at86rf230_local { 59#define AT86RF2XX_MAX_BUF (127 + 3)
53 struct spi_device *spi;
54 60
55 u8 buf[2]; 61struct at86rf230_state_change {
56 struct mutex bmux; 62 struct at86rf230_local *lp;
57 63
58 struct work_struct irqwork; 64 struct spi_message msg;
59 struct completion tx_complete; 65 struct spi_transfer trx;
66 u8 buf[AT86RF2XX_MAX_BUF];
67
68 void (*complete)(void *context);
69 u8 from_state;
70 u8 to_state;
71};
72
73struct at86rf230_local {
74 struct spi_device *spi;
60 75
61 struct ieee802154_dev *dev; 76 struct ieee802154_dev *dev;
77 struct at86rf2xx_chip_data *data;
62 struct regmap *regmap; 78 struct regmap *regmap;
63 79
64 spinlock_t lock; 80 struct at86rf230_state_change irq;
65 bool irq_busy;
66 bool is_tx;
67 81
68 struct at86rf2xx_chip_data *data;
69 bool tx_aret; 82 bool tx_aret;
83 bool is_tx;
84 /* spinlock for is_tx protection */
85 spinlock_t lock;
86 struct completion tx_complete;
87 struct sk_buff *tx_skb;
88 struct at86rf230_state_change tx;
70}; 89};
71 90
72#define RG_TRX_STATUS (0x01) 91#define RG_TRX_STATUS (0x01)
@@ -263,6 +282,11 @@ struct at86rf230_local {
263 282
264#define AT86RF2XX_NUMREGS 0x3F 283#define AT86RF2XX_NUMREGS 0x3F
265 284
285static int
286at86rf230_async_state_change(struct at86rf230_local *lp,
287 struct at86rf230_state_change *ctx,
288 const u8 state, void (*complete)(void *context));
289
266static inline int 290static inline int
267__at86rf230_write(struct at86rf230_local *lp, 291__at86rf230_write(struct at86rf230_local *lp,
268 unsigned int addr, unsigned int data) 292 unsigned int addr, unsigned int data)
@@ -412,104 +436,515 @@ static struct regmap_config at86rf230_regmap_spi_config = {
412 .precious_reg = at86rf230_reg_precious, 436 .precious_reg = at86rf230_reg_precious,
413}; 437};
414 438
439static void
440at86rf230_async_error_recover(void *context)
441{
442 struct at86rf230_state_change *ctx = context;
443 struct at86rf230_local *lp = ctx->lp;
444
445 at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, NULL);
446}
447
448static void
449at86rf230_async_error(struct at86rf230_local *lp,
450 struct at86rf230_state_change *ctx, int rc)
451{
452 dev_err(&lp->spi->dev, "spi_async error %d\n", rc);
453
454 at86rf230_async_state_change(lp, ctx, STATE_FORCE_TRX_OFF,
455 at86rf230_async_error_recover);
456}
457
458/* Generic function to get some register value in async mode */
415static int 459static int
416at86rf230_write_fbuf(struct at86rf230_local *lp, u8 *data, u8 len) 460at86rf230_async_read_reg(struct at86rf230_local *lp, const u8 reg,
461 struct at86rf230_state_change *ctx,
462 void (*complete)(void *context))
417{ 463{
418 u8 *buf = lp->buf; 464 u8 *tx_buf = ctx->buf;
419 int status; 465
420 struct spi_message msg; 466 tx_buf[0] = (reg & CMD_REG_MASK) | CMD_REG;
421 struct spi_transfer xfer_head = { 467 ctx->trx.len = 2;
422 .len = 2, 468 ctx->msg.complete = complete;
423 .tx_buf = buf, 469 return spi_async(lp->spi, &ctx->msg);
424 470}
425 }; 471
426 struct spi_transfer xfer_buf = { 472static void
427 .len = len, 473at86rf230_async_state_assert(void *context)
428 .tx_buf = data, 474{
429 }; 475 struct at86rf230_state_change *ctx = context;
430 476 struct at86rf230_local *lp = ctx->lp;
431 mutex_lock(&lp->bmux); 477 const u8 *buf = ctx->buf;
432 buf[0] = CMD_WRITE | CMD_FB; 478 const u8 trx_state = buf[1] & 0x1f;
433 buf[1] = len + 2; /* 2 bytes for CRC that isn't written */ 479
434 480 /* Assert state change */
435 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 481 if (trx_state != ctx->to_state) {
436 dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); 482 /* Special handling if transceiver state is in
437 483 * STATE_BUSY_RX_AACK and a SHR was detected.
438 spi_message_init(&msg); 484 */
439 spi_message_add_tail(&xfer_head, &msg); 485 if (trx_state == STATE_BUSY_RX_AACK) {
440 spi_message_add_tail(&xfer_buf, &msg); 486 /* Undocumented race condition. If we send a state
441 487 * change to STATE_RX_AACK_ON the transceiver could
442 status = spi_sync(lp->spi, &msg); 488 * change his state automatically to STATE_BUSY_RX_AACK
443 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 489 * if a SHR was detected. This is not an error, but we
444 if (msg.status) 490 * can't assert this.
445 status = msg.status; 491 */
446 492 if (ctx->to_state == STATE_RX_AACK_ON)
447 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 493 goto done;
448 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 494
449 dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); 495 /* If we change to STATE_TX_ON without forcing and
450 496 * transceiver state is STATE_BUSY_RX_AACK, we wait
451 mutex_unlock(&lp->bmux); 497 * 'tFrame + tPAck' receiving time. In this time the
452 return status; 498 * PDU should be received. If the transceiver is still
499 * in STATE_BUSY_RX_AACK, we run a force state change
500 * to STATE_TX_ON. This is a timeout handling, if the
501 * transceiver stucks in STATE_BUSY_RX_AACK.
502 */
503 if (ctx->to_state == STATE_TX_ON) {
504 at86rf230_async_state_change(lp, ctx,
505 STATE_FORCE_TX_ON,
506 ctx->complete);
507 return;
508 }
509 }
510
511
512 dev_warn(&lp->spi->dev, "unexcept state change from 0x%02x to 0x%02x. Actual state: 0x%02x\n",
513 ctx->from_state, ctx->to_state, trx_state);
514 }
515
516done:
517 if (ctx->complete)
518 ctx->complete(context);
519}
520
521/* Do state change timing delay. */
522static void
523at86rf230_async_state_delay(void *context)
524{
525 struct at86rf230_state_change *ctx = context;
526 struct at86rf230_local *lp = ctx->lp;
527 struct at86rf2xx_chip_data *c = lp->data;
528 bool force = false;
529 int rc;
530
531 /* The force state changes are will show as normal states in the
532 * state status subregister. We change the to_state to the
533 * corresponding one and remember if it was a force change, this
534 * differs if we do a state change from STATE_BUSY_RX_AACK.
535 */
536 switch (ctx->to_state) {
537 case STATE_FORCE_TX_ON:
538 ctx->to_state = STATE_TX_ON;
539 force = true;
540 break;
541 case STATE_FORCE_TRX_OFF:
542 ctx->to_state = STATE_TRX_OFF;
543 force = true;
544 break;
545 default:
546 break;
547 }
548
549 switch (ctx->from_state) {
550 case STATE_BUSY_RX_AACK:
551 switch (ctx->to_state) {
552 case STATE_TX_ON:
553 /* Wait for worst case receiving time if we
554 * didn't make a force change from BUSY_RX_AACK
555 * to TX_ON.
556 */
557 if (!force) {
558 usleep_range(c->t_frame + c->t_p_ack,
559 c->t_frame + c->t_p_ack + 1000);
560 goto change;
561 }
562 break;
563 default:
564 break;
565 }
566 break;
567 default:
568 break;
569 }
570
571 /* Default delay is 1us in the most cases */
572 udelay(1);
573
574change:
575 rc = at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx,
576 at86rf230_async_state_assert);
577 if (rc)
578 dev_err(&lp->spi->dev, "spi_async error %d\n", rc);
579}
580
581static void
582at86rf230_async_state_change_start(void *context)
583{
584 struct at86rf230_state_change *ctx = context;
585 struct at86rf230_local *lp = ctx->lp;
586 u8 *buf = ctx->buf;
587 const u8 trx_state = buf[1] & 0x1f;
588 int rc;
589
590 /* Check for "possible" STATE_TRANSITION_IN_PROGRESS */
591 if (trx_state == STATE_TRANSITION_IN_PROGRESS) {
592 udelay(1);
593 rc = at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx,
594 at86rf230_async_state_change_start);
595 if (rc)
596 dev_err(&lp->spi->dev, "spi_async error %d\n", rc);
597 return;
598 }
599
600 /* Check if we already are in the state which we change in */
601 if (trx_state == ctx->to_state) {
602 if (ctx->complete)
603 ctx->complete(context);
604 return;
605 }
606
607 /* Set current state to the context of state change */
608 ctx->from_state = trx_state;
609
610 /* Going into the next step for a state change which do a timing
611 * relevant delay.
612 */
613 buf[0] = (RG_TRX_STATE & CMD_REG_MASK) | CMD_REG | CMD_WRITE;
614 buf[1] = ctx->to_state;
615 ctx->trx.len = 2;
616 ctx->msg.complete = at86rf230_async_state_delay;
617 rc = spi_async(lp->spi, &ctx->msg);
618 if (rc)
619 dev_err(&lp->spi->dev, "spi_async error %d\n", rc);
453} 620}
454 621
455static int 622static int
456at86rf230_read_fbuf(struct at86rf230_local *lp, u8 *data, u8 *len, u8 *lqi) 623at86rf230_async_state_change(struct at86rf230_local *lp,
624 struct at86rf230_state_change *ctx,
625 const u8 state, void (*complete)(void *context))
457{ 626{
458 u8 *buf = lp->buf; 627 /* Initialization for the state change context */
459 int status; 628 ctx->to_state = state;
460 struct spi_message msg; 629 ctx->complete = complete;
461 struct spi_transfer xfer_head = { 630 return at86rf230_async_read_reg(lp, RG_TRX_STATUS, ctx,
462 .len = 2, 631 at86rf230_async_state_change_start);
463 .tx_buf = buf, 632}
464 .rx_buf = buf,
465 };
466 struct spi_transfer xfer_head1 = {
467 .len = 2,
468 .tx_buf = buf,
469 .rx_buf = buf,
470 };
471 struct spi_transfer xfer_buf = {
472 .len = 0,
473 .rx_buf = data,
474 };
475
476 mutex_lock(&lp->bmux);
477 633
478 buf[0] = CMD_FB; 634static void
479 buf[1] = 0x00; 635at86rf230_tx_complete(void *context)
636{
637 struct at86rf230_state_change *ctx = context;
638 struct at86rf230_local *lp = ctx->lp;
639
640 complete(&lp->tx_complete);
641}
642
643static void
644at86rf230_tx_on(void *context)
645{
646 struct at86rf230_state_change *ctx = context;
647 struct at86rf230_local *lp = ctx->lp;
648 int rc;
649
650 rc = at86rf230_async_state_change(lp, &lp->irq, STATE_RX_AACK_ON,
651 at86rf230_tx_complete);
652 if (rc)
653 at86rf230_async_error(lp, ctx, rc);
654}
655
656static void
657at86rf230_tx_trac_error(void *context)
658{
659 struct at86rf230_state_change *ctx = context;
660 struct at86rf230_local *lp = ctx->lp;
661 int rc;
662
663 rc = at86rf230_async_state_change(lp, ctx, STATE_TX_ON,
664 at86rf230_tx_on);
665 if (rc)
666 at86rf230_async_error(lp, ctx, rc);
667}
668
669static void
670at86rf230_tx_trac_check(void *context)
671{
672 struct at86rf230_state_change *ctx = context;
673 struct at86rf230_local *lp = ctx->lp;
674 const u8 *buf = ctx->buf;
675 const u8 trac = (buf[1] & 0xe0) >> 5;
676 int rc;
677
678 /* If trac status is different than zero we need to do a state change
679 * to STATE_FORCE_TRX_OFF then STATE_TX_ON to recover the transceiver
680 * state to TX_ON.
681 */
682 if (trac) {
683 rc = at86rf230_async_state_change(lp, ctx, STATE_FORCE_TRX_OFF,
684 at86rf230_tx_trac_error);
685 if (rc)
686 at86rf230_async_error(lp, ctx, rc);
687 return;
688 }
689
690 at86rf230_tx_on(context);
691}
692
693
694static void
695at86rf230_tx_trac_status(void *context)
696{
697 struct at86rf230_state_change *ctx = context;
698 struct at86rf230_local *lp = ctx->lp;
699 int rc;
700
701 rc = at86rf230_async_read_reg(lp, RG_TRX_STATE, ctx,
702 at86rf230_tx_trac_check);
703 if (rc)
704 at86rf230_async_error(lp, ctx, rc);
705}
706
707static void
708at86rf230_rx(struct at86rf230_local *lp,
709 const u8 *data, u8 len)
710{
711 u8 lqi;
712 struct sk_buff *skb;
713 u8 rx_local_buf[AT86RF2XX_MAX_BUF];
714
715 if (len < 2)
716 return;
717
718 /* read full frame buffer and invalid lqi value to lowest
719 * indicator if frame was is in a corrupted state.
720 */
721 if (len > IEEE802154_MTU) {
722 lqi = 0;
723 len = IEEE802154_MTU;
724 dev_vdbg(&lp->spi->dev, "corrupted frame received\n");
725 } else {
726 lqi = data[len];
727 }
728
729 memcpy(rx_local_buf, data, len);
730 enable_irq(lp->spi->irq);
731
732 skb = alloc_skb(IEEE802154_MTU, GFP_ATOMIC);
733 if (!skb) {
734 dev_vdbg(&lp->spi->dev, "failed to allocate sk_buff\n");
735 return;
736 }
737
738 memcpy(skb_put(skb, len), rx_local_buf, len);
739
740 /* We do not put CRC into the frame */
741 skb_trim(skb, len - 2);
480 742
481 spi_message_init(&msg); 743 ieee802154_rx_irqsafe(lp->dev, skb, lqi);
482 spi_message_add_tail(&xfer_head, &msg); 744}
483 745
484 status = spi_sync(lp->spi, &msg); 746static void
485 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 747at86rf230_rx_read_frame_complete(void *context)
748{
749 struct at86rf230_state_change *ctx = context;
750 struct at86rf230_local *lp = ctx->lp;
751 const u8 *buf = lp->irq.buf;
752 const u8 len = buf[1];
486 753
487 xfer_buf.len = *(buf + 1) + 1; 754 at86rf230_rx(lp, buf + 2, len);
488 *len = buf[1]; 755}
756
757static int
758at86rf230_rx_read_frame(struct at86rf230_local *lp)
759{
760 u8 *buf = lp->irq.buf;
489 761
490 buf[0] = CMD_FB; 762 buf[0] = CMD_FB;
491 buf[1] = 0x00; 763 lp->irq.trx.len = AT86RF2XX_MAX_BUF;
764 lp->irq.msg.complete = at86rf230_rx_read_frame_complete;
765 return spi_async(lp->spi, &lp->irq.msg);
766}
767
768static void
769at86rf230_rx_trac_check(void *context)
770{
771 struct at86rf230_state_change *ctx = context;
772 struct at86rf230_local *lp = ctx->lp;
773 int rc;
774
775 /* Possible check on trac status here. This could be useful to make
776 * some stats why receive is failed. Not used at the moment, but it's
777 * maybe timing relevant. Datasheet doesn't say anything about this.
778 * The programming guide say do it so.
779 */
780
781 rc = at86rf230_rx_read_frame(lp);
782 if (rc) {
783 enable_irq(lp->spi->irq);
784 at86rf230_async_error(lp, ctx, rc);
785 }
786}
787
788static int
789at86rf230_irq_trx_end(struct at86rf230_local *lp)
790{
791 spin_lock(&lp->lock);
792 if (lp->is_tx) {
793 lp->is_tx = 0;
794 spin_unlock(&lp->lock);
795 enable_irq(lp->spi->irq);
796
797 if (lp->tx_aret)
798 return at86rf230_async_state_change(lp, &lp->irq,
799 STATE_FORCE_TX_ON,
800 at86rf230_tx_trac_status);
801 else
802 return at86rf230_async_state_change(lp, &lp->irq,
803 STATE_RX_AACK_ON,
804 at86rf230_tx_complete);
805 } else {
806 spin_unlock(&lp->lock);
807 return at86rf230_async_read_reg(lp, RG_TRX_STATE, &lp->irq,
808 at86rf230_rx_trac_check);
809 }
810}
811
812static void
813at86rf230_irq_status(void *context)
814{
815 struct at86rf230_state_change *ctx = context;
816 struct at86rf230_local *lp = ctx->lp;
817 const u8 *buf = lp->irq.buf;
818 const u8 irq = buf[1];
819 int rc;
820
821 if (irq & IRQ_TRX_END) {
822 rc = at86rf230_irq_trx_end(lp);
823 if (rc)
824 at86rf230_async_error(lp, ctx, rc);
825 } else {
826 enable_irq(lp->spi->irq);
827 dev_err(&lp->spi->dev, "not supported irq %02x received\n",
828 irq);
829 }
830}
831
832static irqreturn_t at86rf230_isr(int irq, void *data)
833{
834 struct at86rf230_local *lp = data;
835 struct at86rf230_state_change *ctx = &lp->irq;
836 u8 *buf = ctx->buf;
837 int rc;
838
839 disable_irq_nosync(lp->spi->irq);
840
841 buf[0] = (RG_IRQ_STATUS & CMD_REG_MASK) | CMD_REG;
842 ctx->trx.len = 2;
843 ctx->msg.complete = at86rf230_irq_status;
844 rc = spi_async(lp->spi, &ctx->msg);
845 if (rc) {
846 at86rf230_async_error(lp, ctx, rc);
847 return IRQ_NONE;
848 }
849
850 return IRQ_HANDLED;
851}
852
853static void
854at86rf230_write_frame_complete(void *context)
855{
856 struct at86rf230_state_change *ctx = context;
857 struct at86rf230_local *lp = ctx->lp;
858 u8 *buf = ctx->buf;
859 int rc;
860
861 buf[0] = (RG_TRX_STATE & CMD_REG_MASK) | CMD_REG | CMD_WRITE;
862 buf[1] = STATE_BUSY_TX;
863 ctx->trx.len = 2;
864 ctx->msg.complete = NULL;
865 rc = spi_async(lp->spi, &ctx->msg);
866 if (rc)
867 at86rf230_async_error(lp, ctx, rc);
868}
869
870static void
871at86rf230_write_frame(void *context)
872{
873 struct at86rf230_state_change *ctx = context;
874 struct at86rf230_local *lp = ctx->lp;
875 struct sk_buff *skb = lp->tx_skb;
876 u8 *buf = lp->tx.buf;
877 int rc;
878
879 spin_lock(&lp->lock);
880 lp->is_tx = 1;
881 spin_unlock(&lp->lock);
882
883 buf[0] = CMD_FB | CMD_WRITE;
884 buf[1] = skb->len + 2;
885 memcpy(buf + 2, skb->data, skb->len);
886 lp->tx.trx.len = skb->len + 2;
887 lp->tx.msg.complete = at86rf230_write_frame_complete;
888 rc = spi_async(lp->spi, &lp->tx.msg);
889 if (rc)
890 at86rf230_async_error(lp, ctx, rc);
891}
892
893static void
894at86rf230_xmit_tx_on(void *context)
895{
896 struct at86rf230_state_change *ctx = context;
897 struct at86rf230_local *lp = ctx->lp;
898 int rc;
492 899
493 spi_message_init(&msg); 900 rc = at86rf230_async_state_change(lp, ctx, STATE_TX_ARET_ON,
494 spi_message_add_tail(&xfer_head1, &msg); 901 at86rf230_write_frame);
495 spi_message_add_tail(&xfer_buf, &msg); 902 if (rc)
903 at86rf230_async_error(lp, ctx, rc);
904}
905
906static int
907at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb)
908{
909 struct at86rf230_local *lp = dev->priv;
910 struct at86rf230_state_change *ctx = &lp->tx;
496 911
497 status = spi_sync(lp->spi, &msg); 912 void (*tx_complete)(void *context) = at86rf230_write_frame;
913 int rc;
498 914
499 if (msg.status) 915 lp->tx_skb = skb;
500 status = msg.status;
501 916
502 dev_vdbg(&lp->spi->dev, "status = %d\n", status); 917 /* In ARET mode we need to go into STATE_TX_ARET_ON after we
503 dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); 918 * are in STATE_TX_ON. The pfad differs here, so we change
504 dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); 919 * the complete handler.
920 */
921 if (lp->tx_aret)
922 tx_complete = at86rf230_xmit_tx_on;
505 923
506 if (status) { 924 rc = at86rf230_async_state_change(lp, ctx, STATE_TX_ON,
507 if (lqi && (*len > lp->buf[1])) 925 tx_complete);
508 *lqi = data[lp->buf[1]]; 926 if (rc) {
927 at86rf230_async_error(lp, ctx, rc);
928 return rc;
929 }
930 rc = wait_for_completion_interruptible_timeout(&lp->tx_complete,
931 msecs_to_jiffies(lp->data->t_tx_timeout));
932 if (!rc) {
933 at86rf230_async_error(lp, ctx, rc);
934 return -ETIMEDOUT;
509 } 935 }
510 mutex_unlock(&lp->bmux);
511 936
512 return status; 937 /* Interfame spacing time, which is phy depend.
938 * TODO
939 * Move this handling in MAC 802.15.4 layer.
940 * This is currently a workaround to avoid fragmenation issues.
941 */
942 if (skb->len > 18)
943 usleep_range(lp->data->t_lifs, lp->data->t_lifs + 10);
944 else
945 usleep_range(lp->data->t_sifs, lp->data->t_sifs + 10);
946
947 return 0;
513} 948}
514 949
515static int 950static int
@@ -652,92 +1087,6 @@ at86rf230_channel(struct ieee802154_dev *dev, int page, int channel)
652} 1087}
653 1088
654static int 1089static int
655at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb)
656{
657 struct at86rf230_local *lp = dev->priv;
658 int rc;
659 unsigned long flags;
660
661 spin_lock_irqsave(&lp->lock, flags);
662 if (lp->irq_busy) {
663 spin_unlock_irqrestore(&lp->lock, flags);
664 return -EBUSY;
665 }
666 spin_unlock_irqrestore(&lp->lock, flags);
667
668 might_sleep();
669
670 rc = at86rf230_state(dev, STATE_FORCE_TX_ON);
671 if (rc)
672 goto err;
673
674 spin_lock_irqsave(&lp->lock, flags);
675 lp->is_tx = 1;
676 reinit_completion(&lp->tx_complete);
677 spin_unlock_irqrestore(&lp->lock, flags);
678
679 rc = at86rf230_write_fbuf(lp, skb->data, skb->len);
680 if (rc)
681 goto err_rx;
682
683 if (lp->tx_aret) {
684 rc = at86rf230_write_subreg(lp, SR_TRX_CMD, STATE_TX_ARET_ON);
685 if (rc)
686 goto err_rx;
687 }
688
689 rc = at86rf230_write_subreg(lp, SR_TRX_CMD, STATE_BUSY_TX);
690 if (rc)
691 goto err_rx;
692
693 rc = wait_for_completion_interruptible(&lp->tx_complete);
694 if (rc < 0)
695 goto err_rx;
696
697 return at86rf230_start(dev);
698err_rx:
699 at86rf230_start(dev);
700err:
701 pr_err("error: %d\n", rc);
702
703 spin_lock_irqsave(&lp->lock, flags);
704 lp->is_tx = 0;
705 spin_unlock_irqrestore(&lp->lock, flags);
706
707 return rc;
708}
709
710static int at86rf230_rx(struct at86rf230_local *lp)
711{
712 u8 len = 128, lqi = 0;
713 struct sk_buff *skb;
714
715 skb = alloc_skb(len, GFP_KERNEL);
716
717 if (!skb)
718 return -ENOMEM;
719
720 if (at86rf230_read_fbuf(lp, skb_put(skb, len), &len, &lqi))
721 goto err;
722
723 if (len < 2)
724 goto err;
725
726 skb_trim(skb, len - 2); /* We do not put CRC into the frame */
727
728 ieee802154_rx_irqsafe(lp->dev, skb, lqi);
729
730 dev_dbg(&lp->spi->dev, "READ_FBUF: %d %x\n", len, lqi);
731
732 return 0;
733err:
734 pr_debug("received frame is too small\n");
735
736 kfree_skb(skb);
737 return -EINVAL;
738}
739
740static int
741at86rf230_set_hw_addr_filt(struct ieee802154_dev *dev, 1090at86rf230_set_hw_addr_filt(struct ieee802154_dev *dev,
742 struct ieee802154_hw_addr_filt *filt, 1091 struct ieee802154_hw_addr_filt *filt,
743 unsigned long changed) 1092 unsigned long changed)
@@ -898,87 +1247,38 @@ static struct ieee802154_ops at86rf230_ops = {
898}; 1247};
899 1248
900static struct at86rf2xx_chip_data at86rf233_data = { 1249static struct at86rf2xx_chip_data at86rf233_data = {
1250 .t_frame = 4096,
1251 .t_p_ack = 545,
1252 .t_sifs = 192,
1253 .t_lifs = 480,
1254 .t_tx_timeout = 2000,
901 .rssi_base_val = -91, 1255 .rssi_base_val = -91,
902 .set_channel = at86rf23x_set_channel, 1256 .set_channel = at86rf23x_set_channel,
903 .get_desense_steps = at86rf23x_get_desens_steps 1257 .get_desense_steps = at86rf23x_get_desens_steps
904}; 1258};
905 1259
906static struct at86rf2xx_chip_data at86rf231_data = { 1260static struct at86rf2xx_chip_data at86rf231_data = {
1261 .t_frame = 4096,
1262 .t_p_ack = 545,
1263 .t_sifs = 192,
1264 .t_lifs = 480,
1265 .t_tx_timeout = 2000,
907 .rssi_base_val = -91, 1266 .rssi_base_val = -91,
908 .set_channel = at86rf23x_set_channel, 1267 .set_channel = at86rf23x_set_channel,
909 .get_desense_steps = at86rf23x_get_desens_steps 1268 .get_desense_steps = at86rf23x_get_desens_steps
910}; 1269};
911 1270
912static struct at86rf2xx_chip_data at86rf212_data = { 1271static struct at86rf2xx_chip_data at86rf212_data = {
1272 .t_frame = 4096,
1273 .t_p_ack = 545,
1274 .t_sifs = 192,
1275 .t_lifs = 480,
1276 .t_tx_timeout = 2000,
913 .rssi_base_val = -100, 1277 .rssi_base_val = -100,
914 .set_channel = at86rf212_set_channel, 1278 .set_channel = at86rf212_set_channel,
915 .get_desense_steps = at86rf212_get_desens_steps 1279 .get_desense_steps = at86rf212_get_desens_steps
916}; 1280};
917 1281
918static void at86rf230_irqwork(struct work_struct *work)
919{
920 struct at86rf230_local *lp =
921 container_of(work, struct at86rf230_local, irqwork);
922 unsigned int status;
923 int rc;
924 unsigned long flags;
925
926 rc = at86rf230_read_subreg(lp, RG_IRQ_STATUS, 0xff, 0, &status);
927
928 status &= ~IRQ_PLL_LOCK; /* ignore */
929 status &= ~IRQ_RX_START; /* ignore */
930 status &= ~IRQ_AMI; /* ignore */
931 status &= ~IRQ_TRX_UR; /* FIXME: possibly handle ???*/
932
933 if (status & IRQ_TRX_END) {
934 status &= ~IRQ_TRX_END;
935 spin_lock_irqsave(&lp->lock, flags);
936 if (lp->is_tx) {
937 lp->is_tx = 0;
938 spin_unlock_irqrestore(&lp->lock, flags);
939 complete(&lp->tx_complete);
940 } else {
941 spin_unlock_irqrestore(&lp->lock, flags);
942 at86rf230_rx(lp);
943 }
944 }
945
946 spin_lock_irqsave(&lp->lock, flags);
947 lp->irq_busy = 0;
948 spin_unlock_irqrestore(&lp->lock, flags);
949}
950
951static void at86rf230_irqwork_level(struct work_struct *work)
952{
953 struct at86rf230_local *lp =
954 container_of(work, struct at86rf230_local, irqwork);
955
956 at86rf230_irqwork(work);
957
958 enable_irq(lp->spi->irq);
959}
960
961static irqreturn_t at86rf230_isr(int irq, void *data)
962{
963 struct at86rf230_local *lp = data;
964 unsigned long flags;
965
966 spin_lock_irqsave(&lp->lock, flags);
967 lp->irq_busy = 1;
968 spin_unlock_irqrestore(&lp->lock, flags);
969
970 schedule_work(&lp->irqwork);
971
972 return IRQ_HANDLED;
973}
974
975static irqreturn_t at86rf230_isr_level(int irq, void *data)
976{
977 disable_irq_nosync(irq);
978
979 return at86rf230_isr(irq, data);
980}
981
982static int at86rf230_hw_init(struct at86rf230_local *lp) 1282static int at86rf230_hw_init(struct at86rf230_local *lp)
983{ 1283{
984 int rc, irq_pol, irq_type; 1284 int rc, irq_pol, irq_type;
@@ -1128,14 +1428,30 @@ at86rf230_detect_device(struct at86rf230_local *lp)
1128 return rc; 1428 return rc;
1129} 1429}
1130 1430
1431static void
1432at86rf230_setup_spi_messages(struct at86rf230_local *lp)
1433{
1434 lp->irq.lp = lp;
1435 spi_message_init(&lp->irq.msg);
1436 lp->irq.msg.context = &lp->irq;
1437 lp->irq.trx.tx_buf = lp->irq.buf;
1438 lp->irq.trx.rx_buf = lp->irq.buf;
1439 spi_message_add_tail(&lp->irq.trx, &lp->irq.msg);
1440
1441 lp->tx.lp = lp;
1442 spi_message_init(&lp->tx.msg);
1443 lp->tx.msg.context = &lp->tx;
1444 lp->tx.trx.tx_buf = lp->tx.buf;
1445 lp->tx.trx.rx_buf = lp->tx.buf;
1446 spi_message_add_tail(&lp->tx.trx, &lp->tx.msg);
1447}
1448
1131static int at86rf230_probe(struct spi_device *spi) 1449static int at86rf230_probe(struct spi_device *spi)
1132{ 1450{
1133 struct at86rf230_platform_data *pdata; 1451 struct at86rf230_platform_data *pdata;
1134 struct ieee802154_dev *dev; 1452 struct ieee802154_dev *dev;
1135 struct at86rf230_local *lp; 1453 struct at86rf230_local *lp;
1136 unsigned int status; 1454 unsigned int status;
1137 irq_handler_t irq_handler;
1138 work_func_t irq_worker;
1139 int rc, irq_type; 1455 int rc, irq_type;
1140 1456
1141 if (!spi->irq) { 1457 if (!spi->irq) {
@@ -1189,23 +1505,12 @@ static int at86rf230_probe(struct spi_device *spi)
1189 goto free_dev; 1505 goto free_dev;
1190 } 1506 }
1191 1507
1508 at86rf230_setup_spi_messages(lp);
1509
1192 rc = at86rf230_detect_device(lp); 1510 rc = at86rf230_detect_device(lp);
1193 if (rc < 0) 1511 if (rc < 0)
1194 goto free_dev; 1512 goto free_dev;
1195 1513
1196 irq_type = irq_get_trigger_type(spi->irq);
1197 if (!irq_type)
1198 irq_type = IRQF_TRIGGER_RISING;
1199 if (irq_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) {
1200 irq_worker = at86rf230_irqwork;
1201 irq_handler = at86rf230_isr;
1202 } else {
1203 irq_worker = at86rf230_irqwork_level;
1204 irq_handler = at86rf230_isr_level;
1205 }
1206
1207 mutex_init(&lp->bmux);
1208 INIT_WORK(&lp->irqwork, irq_worker);
1209 spin_lock_init(&lp->lock); 1514 spin_lock_init(&lp->lock);
1210 init_completion(&lp->tx_complete); 1515 init_completion(&lp->tx_complete);
1211 1516
@@ -1213,28 +1518,28 @@ static int at86rf230_probe(struct spi_device *spi)
1213 1518
1214 rc = at86rf230_hw_init(lp); 1519 rc = at86rf230_hw_init(lp);
1215 if (rc) 1520 if (rc)
1216 goto err_hw_init; 1521 goto free_dev;
1217 1522
1218 /* Read irq status register to reset irq line */ 1523 /* Read irq status register to reset irq line */
1219 rc = at86rf230_read_subreg(lp, RG_IRQ_STATUS, 0xff, 0, &status); 1524 rc = at86rf230_read_subreg(lp, RG_IRQ_STATUS, 0xff, 0, &status);
1220 if (rc) 1525 if (rc)
1221 goto err_hw_init; 1526 goto free_dev;
1222 1527
1223 rc = devm_request_irq(&spi->dev, spi->irq, irq_handler, 1528 irq_type = irq_get_trigger_type(spi->irq);
1224 IRQF_SHARED | irq_type, 1529 if (!irq_type)
1225 dev_name(&spi->dev), lp); 1530 irq_type = IRQF_TRIGGER_RISING;
1531
1532 rc = devm_request_irq(&spi->dev, spi->irq, at86rf230_isr,
1533 IRQF_SHARED | irq_type, dev_name(&spi->dev), lp);
1226 if (rc) 1534 if (rc)
1227 goto err_hw_init; 1535 goto free_dev;
1228 1536
1229 rc = ieee802154_register_device(lp->dev); 1537 rc = ieee802154_register_device(lp->dev);
1230 if (rc) 1538 if (rc)
1231 goto err_hw_init; 1539 goto free_dev;
1232 1540
1233 return rc; 1541 return rc;
1234 1542
1235err_hw_init:
1236 flush_work(&lp->irqwork);
1237 mutex_destroy(&lp->bmux);
1238free_dev: 1543free_dev:
1239 ieee802154_free_device(lp->dev); 1544 ieee802154_free_device(lp->dev);
1240 1545
@@ -1248,8 +1553,6 @@ static int at86rf230_remove(struct spi_device *spi)
1248 /* mask all at86rf230 irq's */ 1553 /* mask all at86rf230 irq's */
1249 at86rf230_write_subreg(lp, SR_IRQ_MASK, 0); 1554 at86rf230_write_subreg(lp, SR_IRQ_MASK, 0);
1250 ieee802154_unregister_device(lp->dev); 1555 ieee802154_unregister_device(lp->dev);
1251 flush_work(&lp->irqwork);
1252 mutex_destroy(&lp->bmux);
1253 ieee802154_free_device(lp->dev); 1556 ieee802154_free_device(lp->dev);
1254 dev_dbg(&spi->dev, "unregistered at86rf230\n"); 1557 dev_dbg(&spi->dev, "unregistered at86rf230\n");
1255 1558