@@ -791,6 +791,37 @@ mrf24j40_csma_params(struct ieee802154_hw *hw, u8 min_be, u8 max_be,
791
791
return regmap_update_bits (devrec -> regmap_short , REG_TXMCR , 0x1f , val );
792
792
}
793
793
794
+ static int mrf24j40_set_cca_mode (struct ieee802154_hw * hw ,
795
+ const struct wpan_phy_cca * cca )
796
+ {
797
+ struct mrf24j40 * devrec = hw -> priv ;
798
+ u8 val ;
799
+
800
+ /* mapping 802.15.4 to driver spec */
801
+ switch (cca -> mode ) {
802
+ case NL802154_CCA_ENERGY :
803
+ val = 2 ;
804
+ break ;
805
+ case NL802154_CCA_CARRIER :
806
+ val = 1 ;
807
+ break ;
808
+ case NL802154_CCA_ENERGY_CARRIER :
809
+ switch (cca -> opt ) {
810
+ case NL802154_CCA_OPT_ENERGY_CARRIER_AND :
811
+ val = 3 ;
812
+ break ;
813
+ default :
814
+ return - EINVAL ;
815
+ }
816
+ break ;
817
+ default :
818
+ return - EINVAL ;
819
+ }
820
+
821
+ return regmap_update_bits (devrec -> regmap_short , REG_BBREG2 , 0xc0 ,
822
+ val << 6 );
823
+ }
824
+
794
825
static const struct ieee802154_ops mrf24j40_ops = {
795
826
.owner = THIS_MODULE ,
796
827
.xmit_async = mrf24j40_tx ,
@@ -800,6 +831,7 @@ static const struct ieee802154_ops mrf24j40_ops = {
800
831
.set_channel = mrf24j40_set_channel ,
801
832
.set_hw_addr_filt = mrf24j40_filter ,
802
833
.set_csma_params = mrf24j40_csma_params ,
834
+ .set_cca_mode = mrf24j40_set_cca_mode ,
803
835
};
804
836
805
837
static void mrf24j40_intstat_complete (void * context )
@@ -1003,6 +1035,12 @@ static void mrf24j40_phy_setup(struct mrf24j40 *devrec)
1003
1035
*/
1004
1036
devrec -> hw -> phy -> supported .min_maxbe = 5 ;
1005
1037
devrec -> hw -> phy -> supported .max_maxbe = 5 ;
1038
+
1039
+ devrec -> hw -> phy -> cca .mode = NL802154_CCA_CARRIER ;;
1040
+ devrec -> hw -> phy -> supported .cca_modes = BIT (NL802154_CCA_ENERGY ) |
1041
+ BIT (NL802154_CCA_CARRIER ) |
1042
+ BIT (NL802154_CCA_ENERGY_CARRIER );
1043
+ devrec -> hw -> phy -> supported .cca_opts = BIT (NL802154_CCA_OPT_ENERGY_CARRIER_AND );
1006
1044
}
1007
1045
1008
1046
static int mrf24j40_probe (struct spi_device * spi )
@@ -1028,6 +1066,8 @@ static int mrf24j40_probe(struct spi_device *spi)
1028
1066
devrec -> hw -> flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT |
1029
1067
IEEE802154_HW_CSMA_PARAMS ;
1030
1068
1069
+ devrec -> hw -> phy -> flags = WPAN_PHY_FLAG_CCA_MODE ;
1070
+
1031
1071
mrf24j40_setup_tx_spi_messages (devrec );
1032
1072
mrf24j40_setup_rx_spi_messages (devrec );
1033
1073
mrf24j40_setup_irq_spi_messages (devrec );
0 commit comments