1
1
/*
2
2
* Analog Devices ADF7242 Low-Power IEEE 802.15.4 Transceiver
3
3
*
4
- * Copyright 2009-2015 Analog Devices Inc.
4
+ * Copyright 2009-2017 Analog Devices Inc.
5
5
*
6
6
* Licensed under the GPL-2 or later.
7
7
*
@@ -344,12 +344,18 @@ static int adf7242_wait_status(struct adf7242_local *lp, unsigned int status,
344
344
return ret ;
345
345
}
346
346
347
- static int adf7242_wait_ready (struct adf7242_local * lp , int line )
347
+ static int adf7242_wait_rc_ready (struct adf7242_local * lp , int line )
348
348
{
349
349
return adf7242_wait_status (lp , STAT_RC_READY | STAT_SPI_READY ,
350
350
STAT_RC_READY | STAT_SPI_READY , line );
351
351
}
352
352
353
+ static int adf7242_wait_spi_ready (struct adf7242_local * lp , int line )
354
+ {
355
+ return adf7242_wait_status (lp , STAT_SPI_READY ,
356
+ STAT_SPI_READY , line );
357
+ }
358
+
353
359
static int adf7242_write_fbuf (struct adf7242_local * lp , u8 * data , u8 len )
354
360
{
355
361
u8 * buf = lp -> buf ;
@@ -369,7 +375,7 @@ static int adf7242_write_fbuf(struct adf7242_local *lp, u8 *data, u8 len)
369
375
spi_message_add_tail (& xfer_head , & msg );
370
376
spi_message_add_tail (& xfer_buf , & msg );
371
377
372
- adf7242_wait_ready (lp , __LINE__ );
378
+ adf7242_wait_spi_ready (lp , __LINE__ );
373
379
374
380
mutex_lock (& lp -> bmux );
375
381
buf [0 ] = CMD_SPI_PKT_WR ;
@@ -401,7 +407,7 @@ static int adf7242_read_fbuf(struct adf7242_local *lp,
401
407
spi_message_add_tail (& xfer_head , & msg );
402
408
spi_message_add_tail (& xfer_buf , & msg );
403
409
404
- adf7242_wait_ready (lp , __LINE__ );
410
+ adf7242_wait_spi_ready (lp , __LINE__ );
405
411
406
412
mutex_lock (& lp -> bmux );
407
413
if (packet_read ) {
@@ -432,7 +438,7 @@ static int adf7242_read_reg(struct adf7242_local *lp, u16 addr, u8 *data)
432
438
.rx_buf = lp -> buf_read_rx ,
433
439
};
434
440
435
- adf7242_wait_ready (lp , __LINE__ );
441
+ adf7242_wait_spi_ready (lp , __LINE__ );
436
442
437
443
mutex_lock (& lp -> bmux );
438
444
lp -> buf_read_tx [0 ] = CMD_SPI_MEM_RD (addr );
@@ -462,7 +468,7 @@ static int adf7242_write_reg(struct adf7242_local *lp, u16 addr, u8 data)
462
468
{
463
469
int status ;
464
470
465
- adf7242_wait_ready (lp , __LINE__ );
471
+ adf7242_wait_spi_ready (lp , __LINE__ );
466
472
467
473
mutex_lock (& lp -> bmux );
468
474
lp -> buf_reg_tx [0 ] = CMD_SPI_MEM_WR (addr );
@@ -484,7 +490,7 @@ static int adf7242_cmd(struct adf7242_local *lp, unsigned int cmd)
484
490
dev_vdbg (& lp -> spi -> dev , "%s : CMD=0x%X\n" , __func__ , cmd );
485
491
486
492
if (cmd != CMD_RC_PC_RESET_NO_WAIT )
487
- adf7242_wait_ready (lp , __LINE__ );
493
+ adf7242_wait_rc_ready (lp , __LINE__ );
488
494
489
495
mutex_lock (& lp -> bmux );
490
496
lp -> buf_cmd = cmd ;
@@ -557,6 +563,22 @@ static int adf7242_verify_firmware(struct adf7242_local *lp,
557
563
return 0 ;
558
564
}
559
565
566
+ static void adf7242_clear_irqstat (struct adf7242_local * lp )
567
+ {
568
+ adf7242_write_reg (lp , REG_IRQ1_SRC1 , IRQ_CCA_COMPLETE | IRQ_SFD_RX |
569
+ IRQ_SFD_TX | IRQ_RX_PKT_RCVD | IRQ_TX_PKT_SENT |
570
+ IRQ_FRAME_VALID | IRQ_ADDRESS_VALID | IRQ_CSMA_CA );
571
+ }
572
+
573
+ static int adf7242_cmd_rx (struct adf7242_local * lp )
574
+ {
575
+ /* Wait until the ACK is sent */
576
+ adf7242_wait_status (lp , RC_STATUS_PHY_RDY , RC_STATUS_MASK , __LINE__ );
577
+ adf7242_clear_irqstat (lp );
578
+
579
+ return adf7242_cmd (lp , CMD_RC_RX );
580
+ }
581
+
560
582
static int adf7242_set_txpower (struct ieee802154_hw * hw , int mbm )
561
583
{
562
584
struct adf7242_local * lp = hw -> priv ;
@@ -660,7 +682,7 @@ static int adf7242_start(struct ieee802154_hw *hw)
660
682
struct adf7242_local * lp = hw -> priv ;
661
683
662
684
adf7242_cmd (lp , CMD_RC_PHY_RDY );
663
- adf7242_write_reg (lp , REG_IRQ1_SRC1 , 0xFF );
685
+ adf7242_clear_irqstat (lp );
664
686
enable_irq (lp -> spi -> irq );
665
687
set_bit (FLAG_START , & lp -> flags );
666
688
@@ -671,10 +693,10 @@ static void adf7242_stop(struct ieee802154_hw *hw)
671
693
{
672
694
struct adf7242_local * lp = hw -> priv ;
673
695
696
+ disable_irq (lp -> spi -> irq );
674
697
adf7242_cmd (lp , CMD_RC_IDLE );
675
698
clear_bit (FLAG_START , & lp -> flags );
676
- disable_irq (lp -> spi -> irq );
677
- adf7242_write_reg (lp , REG_IRQ1_SRC1 , 0xFF );
699
+ adf7242_clear_irqstat (lp );
678
700
}
679
701
680
702
static int adf7242_channel (struct ieee802154_hw * hw , u8 page , u8 channel )
@@ -789,9 +811,12 @@ static int adf7242_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
789
811
struct adf7242_local * lp = hw -> priv ;
790
812
int ret ;
791
813
814
+ /* ensure existing instances of the IRQ handler have completed */
815
+ disable_irq (lp -> spi -> irq );
792
816
set_bit (FLAG_XMIT , & lp -> flags );
793
817
reinit_completion (& lp -> tx_complete );
794
818
adf7242_cmd (lp , CMD_RC_PHY_RDY );
819
+ adf7242_clear_irqstat (lp );
795
820
796
821
ret = adf7242_write_fbuf (lp , skb -> data , skb -> len );
797
822
if (ret )
@@ -800,6 +825,7 @@ static int adf7242_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
800
825
ret = adf7242_cmd (lp , CMD_RC_CSMACA );
801
826
if (ret )
802
827
goto err ;
828
+ enable_irq (lp -> spi -> irq );
803
829
804
830
ret = wait_for_completion_interruptible_timeout (& lp -> tx_complete ,
805
831
HZ / 10 );
@@ -822,7 +848,7 @@ static int adf7242_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
822
848
823
849
err :
824
850
clear_bit (FLAG_XMIT , & lp -> flags );
825
- adf7242_cmd (lp , CMD_RC_RX );
851
+ adf7242_cmd_rx (lp );
826
852
827
853
return ret ;
828
854
}
@@ -846,22 +872,22 @@ static int adf7242_rx(struct adf7242_local *lp)
846
872
847
873
skb = dev_alloc_skb (len );
848
874
if (!skb ) {
849
- adf7242_cmd (lp , CMD_RC_RX );
875
+ adf7242_cmd_rx (lp );
850
876
return - ENOMEM ;
851
877
}
852
878
853
879
data = skb_put (skb , len );
854
880
ret = adf7242_read_fbuf (lp , data , len , true);
855
881
if (ret < 0 ) {
856
882
kfree_skb (skb );
857
- adf7242_cmd (lp , CMD_RC_RX );
883
+ adf7242_cmd_rx (lp );
858
884
return ret ;
859
885
}
860
886
861
887
lqi = data [len - 2 ];
862
888
lp -> rssi = data [len - 1 ];
863
889
864
- adf7242_cmd (lp , CMD_RC_RX );
890
+ ret = adf7242_cmd_rx (lp );
865
891
866
892
skb_trim (skb , len - 2 ); /* Don't put RSSI/LQI or CRC into the frame */
867
893
@@ -870,7 +896,7 @@ static int adf7242_rx(struct adf7242_local *lp)
870
896
dev_dbg (& lp -> spi -> dev , "%s: ret=%d len=%d lqi=%d rssi=%d\n" ,
871
897
__func__ , ret , (int )len , (int )lqi , lp -> rssi );
872
898
873
- return 0 ;
899
+ return ret ;
874
900
}
875
901
876
902
static const struct ieee802154_ops adf7242_ops = {
@@ -888,7 +914,7 @@ static const struct ieee802154_ops adf7242_ops = {
888
914
.set_cca_ed_level = adf7242_set_cca_ed_level ,
889
915
};
890
916
891
- static void adf7242_debug (u8 irq1 )
917
+ static void adf7242_debug (struct adf7242_local * lp , u8 irq1 )
892
918
{
893
919
#ifdef DEBUG
894
920
u8 stat ;
@@ -906,9 +932,12 @@ static void adf7242_debug(u8 irq1)
906
932
irq1 & IRQ_FRAME_VALID ? "IRQ_FRAME_VALID\n" : "" ,
907
933
irq1 & IRQ_ADDRESS_VALID ? "IRQ_ADDRESS_VALID\n" : "" );
908
934
909
- dev_dbg (& lp -> spi -> dev , "%s STATUS = %X:\n%s\n%s%s%s%s%s\n" ,
935
+ dev_dbg (& lp -> spi -> dev , "%s STATUS = %X:\n%s\n%s\n%s\n%s\n%s %s%s%s%s\n" ,
910
936
__func__ , stat ,
937
+ stat & STAT_SPI_READY ? "SPI_READY" : "SPI_BUSY" ,
938
+ stat & STAT_IRQ_STATUS ? "IRQ_PENDING" : "IRQ_CLEAR" ,
911
939
stat & STAT_RC_READY ? "RC_READY" : "RC_BUSY" ,
940
+ stat & STAT_CCA_RESULT ? "CHAN_IDLE" : "CHAN_BUSY" ,
912
941
(stat & 0xf ) == RC_STATUS_IDLE ? "RC_STATUS_IDLE" : "" ,
913
942
(stat & 0xf ) == RC_STATUS_MEAS ? "RC_STATUS_MEAS" : "" ,
914
943
(stat & 0xf ) == RC_STATUS_PHY_RDY ? "RC_STATUS_PHY_RDY" : "" ,
@@ -923,20 +952,20 @@ static irqreturn_t adf7242_isr(int irq, void *data)
923
952
unsigned int xmit ;
924
953
u8 irq1 ;
925
954
926
- adf7242_wait_status (lp , RC_STATUS_PHY_RDY , RC_STATUS_MASK , __LINE__ );
927
-
928
955
adf7242_read_reg (lp , REG_IRQ1_SRC1 , & irq1 );
929
- adf7242_write_reg (lp , REG_IRQ1_SRC1 , irq1 );
930
956
931
957
if (!(irq1 & (IRQ_RX_PKT_RCVD | IRQ_CSMA_CA )))
932
958
dev_err (& lp -> spi -> dev , "%s :ERROR IRQ1 = 0x%X\n" ,
933
959
__func__ , irq1 );
934
960
935
- adf7242_debug (irq1 );
961
+ adf7242_debug (lp , irq1 );
936
962
937
963
xmit = test_bit (FLAG_XMIT , & lp -> flags );
938
964
939
965
if (xmit && (irq1 & IRQ_CSMA_CA )) {
966
+ adf7242_wait_status (lp , RC_STATUS_PHY_RDY ,
967
+ RC_STATUS_MASK , __LINE__ );
968
+
940
969
if (ADF7242_REPORT_CSMA_CA_STAT ) {
941
970
u8 astat ;
942
971
@@ -957,6 +986,7 @@ static irqreturn_t adf7242_isr(int irq, void *data)
957
986
lp -> tx_stat = SUCCESS ;
958
987
}
959
988
complete (& lp -> tx_complete );
989
+ adf7242_clear_irqstat (lp );
960
990
} else if (!xmit && (irq1 & IRQ_RX_PKT_RCVD ) &&
961
991
(irq1 & IRQ_FRAME_VALID )) {
962
992
adf7242_rx (lp );
@@ -965,16 +995,19 @@ static irqreturn_t adf7242_isr(int irq, void *data)
965
995
dev_dbg (& lp -> spi -> dev , "%s:%d : ERROR IRQ1 = 0x%X\n" ,
966
996
__func__ , __LINE__ , irq1 );
967
997
adf7242_cmd (lp , CMD_RC_PHY_RDY );
968
- adf7242_write_reg (lp , REG_IRQ1_SRC1 , 0xFF );
969
- adf7242_cmd (lp , CMD_RC_RX );
998
+ adf7242_cmd_rx (lp );
970
999
} else {
971
1000
/* This can only be xmit without IRQ, likely a RX packet.
972
1001
* we get an TX IRQ shortly - do nothing or let the xmit
973
1002
* timeout handle this
974
1003
*/
1004
+
975
1005
dev_dbg (& lp -> spi -> dev , "%s:%d : ERROR IRQ1 = 0x%X, xmit %d\n" ,
976
1006
__func__ , __LINE__ , irq1 , xmit );
1007
+ adf7242_wait_status (lp , RC_STATUS_PHY_RDY ,
1008
+ RC_STATUS_MASK , __LINE__ );
977
1009
complete (& lp -> tx_complete );
1010
+ adf7242_clear_irqstat (lp );
978
1011
}
979
1012
980
1013
return IRQ_HANDLED ;
@@ -994,7 +1027,7 @@ static int adf7242_soft_reset(struct adf7242_local *lp, int line)
994
1027
adf7242_set_promiscuous_mode (lp -> hw , lp -> promiscuous );
995
1028
adf7242_set_csma_params (lp -> hw , lp -> min_be , lp -> max_be ,
996
1029
lp -> max_cca_retries );
997
- adf7242_write_reg (lp , REG_IRQ1_SRC1 , 0xFF );
1030
+ adf7242_clear_irqstat (lp );
998
1031
999
1032
if (test_bit (FLAG_START , & lp -> flags )) {
1000
1033
enable_irq (lp -> spi -> irq );
@@ -1060,7 +1093,7 @@ static int adf7242_hw_init(struct adf7242_local *lp)
1060
1093
adf7242_write_reg (lp , REG_IRQ1_EN0 , 0 );
1061
1094
adf7242_write_reg (lp , REG_IRQ1_EN1 , IRQ_RX_PKT_RCVD | IRQ_CSMA_CA );
1062
1095
1063
- adf7242_write_reg (lp , REG_IRQ1_SRC1 , 0xFF );
1096
+ adf7242_clear_irqstat (lp );
1064
1097
adf7242_write_reg (lp , REG_IRQ1_SRC0 , 0xFF );
1065
1098
1066
1099
adf7242_cmd (lp , CMD_RC_IDLE );
@@ -1086,8 +1119,11 @@ static int adf7242_stats_show(struct seq_file *file, void *offset)
1086
1119
irq1 & IRQ_FRAME_VALID ? "IRQ_FRAME_VALID\n" : "" ,
1087
1120
irq1 & IRQ_ADDRESS_VALID ? "IRQ_ADDRESS_VALID\n" : "" );
1088
1121
1089
- seq_printf (file , "STATUS = %X:\n%s\n%s%s%s%s%s\n" , stat ,
1122
+ seq_printf (file , "STATUS = %X:\n%s\n%s\n%s\n%s\n%s%s%s%s%s\n" , stat ,
1123
+ stat & STAT_SPI_READY ? "SPI_READY" : "SPI_BUSY" ,
1124
+ stat & STAT_IRQ_STATUS ? "IRQ_PENDING" : "IRQ_CLEAR" ,
1090
1125
stat & STAT_RC_READY ? "RC_READY" : "RC_BUSY" ,
1126
+ stat & STAT_CCA_RESULT ? "CHAN_IDLE" : "CHAN_BUSY" ,
1091
1127
(stat & 0xf ) == RC_STATUS_IDLE ? "RC_STATUS_IDLE" : "" ,
1092
1128
(stat & 0xf ) == RC_STATUS_MEAS ? "RC_STATUS_MEAS" : "" ,
1093
1129
(stat & 0xf ) == RC_STATUS_PHY_RDY ? "RC_STATUS_PHY_RDY" : "" ,
@@ -1257,12 +1293,14 @@ static int adf7242_remove(struct spi_device *spi)
1257
1293
1258
1294
static const struct of_device_id adf7242_of_match [] = {
1259
1295
{ .compatible = "adi,adf7242" , },
1296
+ { .compatible = "adi,adf7241" , },
1260
1297
{ },
1261
1298
};
1262
1299
MODULE_DEVICE_TABLE (of , adf7242_of_match );
1263
1300
1264
1301
static const struct spi_device_id adf7242_device_id [] = {
1265
1302
{ .name = "adf7242" , },
1303
+ { .name = "adf7241" , },
1266
1304
{ },
1267
1305
};
1268
1306
MODULE_DEVICE_TABLE (spi , adf7242_device_id );
0 commit comments