forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/drivers/net/ethernet/qualcomm/qca_spi.c
....@@ -69,6 +69,12 @@
6969 module_param(qcaspi_pluggable, int, 0);
7070 MODULE_PARM_DESC(qcaspi_pluggable, "Pluggable SPI connection (yes/no).");
7171
72
+#define QCASPI_WRITE_VERIFY_MIN 0
73
+#define QCASPI_WRITE_VERIFY_MAX 3
74
+static int wr_verify = QCASPI_WRITE_VERIFY_MIN;
75
+module_param(wr_verify, int, 0);
76
+MODULE_PARM_DESC(wr_verify, "SPI register write verify trails. Use 0-3.");
77
+
7278 #define QCASPI_TX_TIMEOUT (1 * HZ)
7379 #define QCASPI_QCA7K_REBOOT_TIME_MS 1000
7480
....@@ -77,7 +83,7 @@
7783 {
7884 *intr_cause = 0;
7985
80
- qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0);
86
+ qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0, wr_verify);
8187 qcaspi_read_register(qca, SPI_REG_INTR_CAUSE, intr_cause);
8288 netdev_dbg(qca->net_dev, "interrupts: 0x%04x\n", *intr_cause);
8389 }
....@@ -90,8 +96,8 @@
9096 SPI_INT_RDBUF_ERR |
9197 SPI_INT_WRBUF_ERR);
9298
93
- qcaspi_write_register(qca, SPI_REG_INTR_CAUSE, intr_cause);
94
- qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, intr_enable);
99
+ qcaspi_write_register(qca, SPI_REG_INTR_CAUSE, intr_cause, 0);
100
+ qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, intr_enable, wr_verify);
95101 netdev_dbg(qca->net_dev, "acking int: 0x%04x\n", intr_cause);
96102 }
97103
....@@ -239,7 +245,7 @@
239245
240246 len = skb->len;
241247
242
- qcaspi_write_register(qca, SPI_REG_BFR_SIZE, len);
248
+ qcaspi_write_register(qca, SPI_REG_BFR_SIZE, len, wr_verify);
243249 if (qca->legacy_mode)
244250 qcaspi_tx_cmd(qca, QCA7K_SPI_WRITE | QCA7K_SPI_EXTERNAL);
245251
....@@ -282,6 +288,14 @@
282288 return 0;
283289
284290 qcaspi_read_register(qca, SPI_REG_WRBUF_SPC_AVA, &available);
291
+
292
+ if (available > QCASPI_HW_BUF_LEN) {
293
+ /* This could only happen by interferences on the SPI line.
294
+ * So retry later ...
295
+ */
296
+ qca->stats.buf_avail_err++;
297
+ return -1;
298
+ }
285299
286300 while (qca->txr.skb[qca->txr.head]) {
287301 pkt_len = qca->txr.skb[qca->txr.head]->len + QCASPI_HW_PKT_LEN;
....@@ -345,15 +359,22 @@
345359
346360 /* Read the packet size. */
347361 qcaspi_read_register(qca, SPI_REG_RDBUF_BYTE_AVA, &available);
362
+
348363 netdev_dbg(net_dev, "qcaspi_receive: SPI_REG_RDBUF_BYTE_AVA: Value: %08x\n",
349364 available);
350365
351
- if (available == 0) {
366
+ if (available > QCASPI_HW_BUF_LEN + QCASPI_HW_PKT_LEN) {
367
+ /* This could only happen by interferences on the SPI line.
368
+ * So retry later ...
369
+ */
370
+ qca->stats.buf_avail_err++;
371
+ return -1;
372
+ } else if (available == 0) {
352373 netdev_dbg(net_dev, "qcaspi_receive called without any data being available!\n");
353374 return -1;
354375 }
355376
356
- qcaspi_write_register(qca, SPI_REG_BFR_SIZE, available);
377
+ qcaspi_write_register(qca, SPI_REG_BFR_SIZE, available, wr_verify);
357378
358379 if (qca->legacy_mode)
359380 qcaspi_tx_cmd(qca, QCA7K_SPI_READ | QCA7K_SPI_EXTERNAL);
....@@ -523,7 +544,7 @@
523544 netdev_dbg(qca->net_dev, "sync: resetting device.\n");
524545 qcaspi_read_register(qca, SPI_REG_SPI_CONFIG, &spi_config);
525546 spi_config |= QCASPI_SLAVE_RESET_BIT;
526
- qcaspi_write_register(qca, SPI_REG_SPI_CONFIG, spi_config);
547
+ qcaspi_write_register(qca, SPI_REG_SPI_CONFIG, spi_config, 0);
527548
528549 qca->sync = QCASPI_SYNC_RESET;
529550 qca->stats.trig_reset++;
....@@ -683,7 +704,7 @@
683704
684705 netif_stop_queue(dev);
685706
686
- qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0);
707
+ qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0, wr_verify);
687708 free_irq(qca->spi_dev->irq, qca);
688709
689710 kthread_stop(qca->spi_thread);
....@@ -764,7 +785,7 @@
764785 }
765786
766787 static void
767
-qcaspi_netdev_tx_timeout(struct net_device *dev)
788
+qcaspi_netdev_tx_timeout(struct net_device *dev, unsigned int txqueue)
768789 {
769790 struct qcaspi *qca = netdev_priv(dev);
770791
....@@ -815,8 +836,7 @@
815836
816837 kfree(qca->rx_buffer);
817838 qca->buffer_size = 0;
818
- if (qca->rx_skb)
819
- dev_kfree_skb(qca->rx_skb);
839
+ dev_kfree_skb(qca->rx_skb);
820840 }
821841
822842 static const struct net_device_ops qcaspi_netdev_ops = {
....@@ -903,6 +923,13 @@
903923 return -EINVAL;
904924 }
905925
926
+ if (wr_verify < QCASPI_WRITE_VERIFY_MIN ||
927
+ wr_verify > QCASPI_WRITE_VERIFY_MAX) {
928
+ dev_err(&spi->dev, "Invalid write verify: %d\n",
929
+ wr_verify);
930
+ return -EINVAL;
931
+ }
932
+
906933 dev_info(&spi->dev, "ver=%s, clkspeed=%d, burst_len=%d, pluggable=%d\n",
907934 QCASPI_DRV_VERSION,
908935 qcaspi_clkspeed,
....@@ -937,7 +964,7 @@
937964
938965 mac = of_get_mac_address(spi->dev.of_node);
939966
940
- if (mac)
967
+ if (!IS_ERR(mac))
941968 ether_addr_copy(qca->net_dev->dev_addr, mac);
942969
943970 if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {