]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/ieee802154/at86rf230.c
ieee802154: support 100kbps QPSK/EU in at86rf230
[karo-tx-linux.git] / drivers / net / ieee802154 / at86rf230.c
index 9afb4b9d7c93d72faf6111e08d21cf7c396b1bc8..04a995dad593d0d3fcea6447d8a7d62121acdacb 100644 (file)
@@ -106,7 +106,8 @@ static inline int is_rf212(struct at86rf230_local *local)
 #define        SR_OQPSK_DATA_RATE      0x0c, 0x03, 0
 #define        SR_SUB_MODE             0x0c, 0x04, 2
 #define        SR_BPSK_QPSK            0x0c, 0x08, 3
-#define        SR_RESERVED_0c_4        0x0c, 0x70, 4
+#define        SR_OQPSK_SUB1_RC_EN     0x0c, 0x10, 4
+#define        SR_RESERVED_0c_5        0x0c, 0x60, 5
 #define        SR_RX_SAFE_MODE         0x0c, 0x80, 7
 #define        RG_ANT_DIV      (0x0d)
 #define        SR_ANT_CTRL             0x0d, 0x03, 0
@@ -594,6 +595,13 @@ at86rf212_set_channel(struct at86rf230_local *lp, int page, int channel)
        if (rc < 0)
                return rc;
 
+       if (page == 0)
+               rc = at86rf230_write_subreg(lp, SR_BPSK_QPSK, 0);
+       else
+               rc = at86rf230_write_subreg(lp, SR_BPSK_QPSK, 1);
+       if (rc < 0)
+               return rc;
+
        return at86rf230_write_subreg(lp, SR_CHANNEL, channel);
 }
 
@@ -620,6 +628,7 @@ at86rf230_channel(struct ieee802154_dev *dev, int page, int channel)
 
        msleep(1); /* Wait for PLL */
        dev->phy->current_channel = channel;
+       dev->phy->current_page = page;
 
        return 0;
 }
@@ -1064,10 +1073,12 @@ static int at86rf230_probe(struct spi_device *spi)
 
        spi_set_drvdata(spi, lp);
 
-       if (is_rf212(lp))
+       if (is_rf212(lp)) {
                dev->phy->channels_supported[0] = 0x00007FF;
-       else
+               dev->phy->channels_supported[2] = 0x00007FF;
+       } else {
                dev->phy->channels_supported[0] = 0x7FFF800;
+       }
 
        rc = at86rf230_hw_init(lp);
        if (rc)