Merge tag 'nfs-for-4.20-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[sfrench/cifs-2.6.git] / drivers / net / ethernet / qualcomm / qca_spi.c
index 66b775d462fd8ed111dbb18e845ad4d9af1b6d2b..d5310504f4364349bf235f8d8f82eb7a14348a70 100644 (file)
@@ -69,6 +69,12 @@ static int qcaspi_pluggable = QCASPI_PLUGGABLE_MIN;
 module_param(qcaspi_pluggable, int, 0);
 MODULE_PARM_DESC(qcaspi_pluggable, "Pluggable SPI connection (yes/no).");
 
+#define QCASPI_WRITE_VERIFY_MIN 0
+#define QCASPI_WRITE_VERIFY_MAX 3
+static int wr_verify = QCASPI_WRITE_VERIFY_MIN;
+module_param(wr_verify, int, 0);
+MODULE_PARM_DESC(wr_verify, "SPI register write verify trails. Use 0-3.");
+
 #define QCASPI_TX_TIMEOUT (1 * HZ)
 #define QCASPI_QCA7K_REBOOT_TIME_MS 1000
 
@@ -77,7 +83,7 @@ start_spi_intr_handling(struct qcaspi *qca, u16 *intr_cause)
 {
        *intr_cause = 0;
 
-       qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0);
+       qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0, wr_verify);
        qcaspi_read_register(qca, SPI_REG_INTR_CAUSE, intr_cause);
        netdev_dbg(qca->net_dev, "interrupts: 0x%04x\n", *intr_cause);
 }
@@ -90,8 +96,8 @@ end_spi_intr_handling(struct qcaspi *qca, u16 intr_cause)
                           SPI_INT_RDBUF_ERR |
                           SPI_INT_WRBUF_ERR);
 
-       qcaspi_write_register(qca, SPI_REG_INTR_CAUSE, intr_cause);
-       qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, intr_enable);
+       qcaspi_write_register(qca, SPI_REG_INTR_CAUSE, intr_cause, 0);
+       qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, intr_enable, wr_verify);
        netdev_dbg(qca->net_dev, "acking int: 0x%04x\n", intr_cause);
 }
 
@@ -239,7 +245,7 @@ qcaspi_tx_frame(struct qcaspi *qca, struct sk_buff *skb)
 
        len = skb->len;
 
-       qcaspi_write_register(qca, SPI_REG_BFR_SIZE, len);
+       qcaspi_write_register(qca, SPI_REG_BFR_SIZE, len, wr_verify);
        if (qca->legacy_mode)
                qcaspi_tx_cmd(qca, QCA7K_SPI_WRITE | QCA7K_SPI_EXTERNAL);
 
@@ -345,6 +351,7 @@ qcaspi_receive(struct qcaspi *qca)
 
        /* Read the packet size. */
        qcaspi_read_register(qca, SPI_REG_RDBUF_BYTE_AVA, &available);
+
        netdev_dbg(net_dev, "qcaspi_receive: SPI_REG_RDBUF_BYTE_AVA: Value: %08x\n",
                   available);
 
@@ -353,7 +360,7 @@ qcaspi_receive(struct qcaspi *qca)
                return -1;
        }
 
-       qcaspi_write_register(qca, SPI_REG_BFR_SIZE, available);
+       qcaspi_write_register(qca, SPI_REG_BFR_SIZE, available, wr_verify);
 
        if (qca->legacy_mode)
                qcaspi_tx_cmd(qca, QCA7K_SPI_READ | QCA7K_SPI_EXTERNAL);
@@ -524,7 +531,7 @@ qcaspi_qca7k_sync(struct qcaspi *qca, int event)
                netdev_dbg(qca->net_dev, "sync: resetting device.\n");
                qcaspi_read_register(qca, SPI_REG_SPI_CONFIG, &spi_config);
                spi_config |= QCASPI_SLAVE_RESET_BIT;
-               qcaspi_write_register(qca, SPI_REG_SPI_CONFIG, spi_config);
+               qcaspi_write_register(qca, SPI_REG_SPI_CONFIG, spi_config, 0);
 
                qca->sync = QCASPI_SYNC_RESET;
                qca->stats.trig_reset++;
@@ -684,7 +691,7 @@ qcaspi_netdev_close(struct net_device *dev)
 
        netif_stop_queue(dev);
 
-       qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0);
+       qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0, wr_verify);
        free_irq(qca->spi_dev->irq, qca);
 
        kthread_stop(qca->spi_thread);
@@ -904,6 +911,13 @@ qca_spi_probe(struct spi_device *spi)
                return -EINVAL;
        }
 
+       if (wr_verify < QCASPI_WRITE_VERIFY_MIN ||
+           wr_verify > QCASPI_WRITE_VERIFY_MAX) {
+               dev_err(&spi->dev, "Invalid write verify: %d\n",
+                       wr_verify);
+               return -EINVAL;
+       }
+
        dev_info(&spi->dev, "ver=%s, clkspeed=%d, burst_len=%d, pluggable=%d\n",
                 QCASPI_DRV_VERSION,
                 qcaspi_clkspeed,