mrf24j40: fix security-enabled processing on inbound frames
authorAlexandre Macabies <web+oss@zopieux.com>
Tue, 12 Apr 2016 16:53:01 +0000 (18:53 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 13 Apr 2016 08:36:02 +0000 (10:36 +0200)
When receiving a security-enabled IEEE 802.15.4 frame, the MRF24J40
triggers a SECIF interrupt that needs to be handled for RX processing
to keep functioning properly.

This patch enables the SECIF interrupt and makes the MRF ignores all
hardware processing of security-enabled frames, that is handled by the
ieee802154 stack instead.

Signed-off-by: Alexander Aring <aar@pengutronix.de>
Signed-off-by: Alexandre Macabies <web+oss@zopieux.com>
Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com>
Acked-by: Alan Ott <alan@signal11.us>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/net/ieee802154/mrf24j40.c

index 764a2bd..adc67be 100644 (file)
 #define REG_INTSTAT    0x31  /* Interrupt Status */
 #define BIT_TXNIF      BIT(0)
 #define BIT_RXIF       BIT(3)
+#define BIT_SECIF      BIT(4)
+#define BIT_SECIGNORE  BIT(7)
 
 #define REG_INTCON     0x32  /* Interrupt Control */
 #define BIT_TXNIE      BIT(0)
 #define BIT_RXIE       BIT(3)
+#define BIT_SECIE      BIT(4)
 
 #define REG_GPIO       0x33  /* GPIO */
 #define REG_TRISGPIO   0x34  /* GPIO direction */
@@ -616,7 +619,7 @@ static int mrf24j40_start(struct ieee802154_hw *hw)
 
        /* Clear TXNIE and RXIE. Enable interrupts */
        return regmap_update_bits(devrec->regmap_short, REG_INTCON,
-                                 BIT_TXNIE | BIT_RXIE, 0);
+                                 BIT_TXNIE | BIT_RXIE | BIT_SECIE, 0);
 }
 
 static void mrf24j40_stop(struct ieee802154_hw *hw)
@@ -1025,6 +1028,11 @@ static void mrf24j40_intstat_complete(void *context)
 
        enable_irq(devrec->spi->irq);
 
+       /* Ignore Rx security decryption */
+       if (intstat & BIT_SECIF)
+               regmap_write_async(devrec->regmap_short, REG_SECCON0,
+                                  BIT_SECIGNORE);
+
        /* Check for TX complete */
        if (intstat & BIT_TXNIF)
                ieee802154_xmit_complete(devrec->hw, devrec->tx_skb, false);