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 582c0a3d5773d86bbb776146d65eb866d1015392..ede3ce4912f92162b9411167fb8cab5ea248c479 100644 (file)
@@ -25,6 +25,7 @@
 #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 */
@@ -92,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)
 
@@ -350,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);
@@ -372,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");
@@ -479,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: ");
@@ -649,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 */
 
@@ -721,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");
 
@@ -733,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;
@@ -757,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");