forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
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++;
....@@ -553,8 +574,7 @@
553574 while (!kthread_should_stop()) {
554575 set_current_state(TASK_INTERRUPTIBLE);
555576 if ((qca->intr_req == qca->intr_svc) &&
556
- (qca->txr.skb[qca->txr.head] == NULL) &&
557
- (qca->sync == QCASPI_SYNC_READY))
577
+ !qca->txr.skb[qca->txr.head])
558578 schedule();
559579
560580 set_current_state(TASK_RUNNING);
....@@ -683,7 +703,7 @@
683703
684704 netif_stop_queue(dev);
685705
686
- qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0);
706
+ qcaspi_write_register(qca, SPI_REG_INTR_ENABLE, 0, wr_verify);
687707 free_irq(qca->spi_dev->irq, qca);
688708
689709 kthread_stop(qca->spi_thread);
....@@ -764,7 +784,7 @@
764784 }
765785
766786 static void
767
-qcaspi_netdev_tx_timeout(struct net_device *dev)
787
+qcaspi_netdev_tx_timeout(struct net_device *dev, unsigned int txqueue)
768788 {
769789 struct qcaspi *qca = netdev_priv(dev);
770790
....@@ -815,8 +835,7 @@
815835
816836 kfree(qca->rx_buffer);
817837 qca->buffer_size = 0;
818
- if (qca->rx_skb)
819
- dev_kfree_skb(qca->rx_skb);
838
+ dev_kfree_skb(qca->rx_skb);
820839 }
821840
822841 static const struct net_device_ops qcaspi_netdev_ops = {
....@@ -903,6 +922,13 @@
903922 return -EINVAL;
904923 }
905924
925
+ if (wr_verify < QCASPI_WRITE_VERIFY_MIN ||
926
+ wr_verify > QCASPI_WRITE_VERIFY_MAX) {
927
+ dev_err(&spi->dev, "Invalid write verify: %d\n",
928
+ wr_verify);
929
+ return -EINVAL;
930
+ }
931
+
906932 dev_info(&spi->dev, "ver=%s, clkspeed=%d, burst_len=%d, pluggable=%d\n",
907933 QCASPI_DRV_VERSION,
908934 qcaspi_clkspeed,
....@@ -937,7 +963,7 @@
937963
938964 mac = of_get_mac_address(spi->dev.of_node);
939965
940
- if (mac)
966
+ if (!IS_ERR(mac))
941967 ether_addr_copy(qca->net_dev->dev_addr, mac);
942968
943969 if (!is_valid_ether_addr(qca->net_dev->dev_addr)) {