Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / drivers / net / ieee802154 / mrf24j40.c
index 3f2c7aaf28c4be64356cfc0149dfc486389ae380..ede3ce4912f92162b9411167fb8cab5ea248c479 100644 (file)
 #include <linux/spi/spi.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
+#include <linux/pinctrl/consumer.h>
 #include <net/wpan-phy.h>
 #include <net/mac802154.h>
+#include <net/ieee802154.h>
 
 /* MRF24J40 Short Address Registers */
 #define REG_RXMCR    0x00  /* Receive MAC control */
@@ -91,9 +93,8 @@ struct mrf24j40 {
 #define MRF24J40_READLONG(reg) (1 << 15 | (reg) << 5)
 #define MRF24J40_WRITELONG(reg) (1 << 15 | (reg) << 5 | 1 << 4)
 
-/* Maximum speed to run the device at. TODO: Get the real max value from
- * someone at Microchip since it isn't in the datasheet. */
-#define MAX_SPI_SPEED_HZ 1000000
+/* The datasheet indicates the theoretical maximum for SCK to be 10MHz */
+#define MAX_SPI_SPEED_HZ 10000000
 
 #define printdev(X) (&X->spi->dev)
 
@@ -349,7 +350,9 @@ static int mrf24j40_tx(struct ieee802154_dev *dev, struct sk_buff *skb)
        if (ret)
                goto err;
        val |= 0x1;
-       val &= ~0x4;
+       /* Set TXNACKREQ if the ACK bit is set in the packet. */
+       if (skb->data[0] & IEEE802154_FC_ACK_REQ)
+               val |= 0x4;
        write_short_reg(devrec, REG_TXNCON, val);
 
        INIT_COMPLETION(devrec->tx_complete);
@@ -361,6 +364,7 @@ static int mrf24j40_tx(struct ieee802154_dev *dev, struct sk_buff *skb)
        if (ret == -ERESTARTSYS)
                goto err;
        if (ret == 0) {
+               dev_warn(printdev(devrec), "Timeout waiting for TX interrupt\n");
                ret = -ETIMEDOUT;
                goto err;
        }
@@ -370,7 +374,7 @@ static int mrf24j40_tx(struct ieee802154_dev *dev, struct sk_buff *skb)
        if (ret)
                goto err;
        if (val & 0x1) {
-               dev_err(printdev(devrec), "Error Sending. Retry count exceeded\n");
+               dev_dbg(printdev(devrec), "Error Sending. Retry count exceeded\n");
                ret = -ECOMM; /* TODO: Better error code ? */
        } else
                dev_dbg(printdev(devrec), "Packet Sent\n");
@@ -477,7 +481,7 @@ static int mrf24j40_filter(struct ieee802154_dev *dev,
                int i;
                for (i = 0; i < 8; i++)
                        write_short_reg(devrec, REG_EADR0+i,
-                                       filt->ieee_addr[i]);
+                                       filt->ieee_addr[7-i]);
 
 #ifdef DEBUG
                printk(KERN_DEBUG "Set long addr to: ");
@@ -623,6 +627,7 @@ static int mrf24j40_probe(struct spi_device *spi)
        int ret = -ENOMEM;
        u8 val;
        struct mrf24j40 *devrec;
+       struct pinctrl *pinctrl;
 
        printk(KERN_INFO "mrf24j40: probe(). IRQ: %d\n", spi->irq);
 
@@ -633,6 +638,11 @@ static int mrf24j40_probe(struct spi_device *spi)
        if (!devrec->buf)
                goto err_buf;
 
+       pinctrl = devm_pinctrl_get_select_default(&spi->dev);
+       if (IS_ERR(pinctrl))
+               dev_warn(&spi->dev,
+                       "pinctrl pins are not configured from the driver");
+
        spi->mode = SPI_MODE_0; /* TODO: Is this appropriate for right here? */
        if (spi->max_speed_hz > MAX_SPI_SPEED_HZ)
                spi->max_speed_hz = MAX_SPI_SPEED_HZ;
@@ -641,7 +651,7 @@ static int mrf24j40_probe(struct spi_device *spi)
        init_completion(&devrec->tx_complete);
        INIT_WORK(&devrec->irqwork, mrf24j40_isrwork);
        devrec->spi = spi;
-       dev_set_drvdata(&spi->dev, devrec);
+       spi_set_drvdata(spi, devrec);
 
        /* Register with the 802154 subsystem */
 
@@ -713,7 +723,7 @@ err_devrec:
 
 static int mrf24j40_remove(struct spi_device *spi)
 {
-       struct mrf24j40 *devrec = dev_get_drvdata(&spi->dev);
+       struct mrf24j40 *devrec = spi_get_drvdata(spi);
 
        dev_dbg(printdev(devrec), "remove\n");
 
@@ -725,7 +735,7 @@ static int mrf24j40_remove(struct spi_device *spi)
         * complete? */
 
        /* Clean up the SPI stuff. */
-       dev_set_drvdata(&spi->dev, NULL);
+       spi_set_drvdata(spi, NULL);
        kfree(devrec->buf);
        kfree(devrec);
        return 0;
@@ -749,18 +759,7 @@ static struct spi_driver mrf24j40_driver = {
        .remove = mrf24j40_remove,
 };
 
-static int __init mrf24j40_init(void)
-{
-       return spi_register_driver(&mrf24j40_driver);
-}
-
-static void __exit mrf24j40_exit(void)
-{
-       spi_unregister_driver(&mrf24j40_driver);
-}
-
-module_init(mrf24j40_init);
-module_exit(mrf24j40_exit);
+module_spi_driver(mrf24j40_driver);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Alan Ott");