Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 026b907d authored by Stefan Wahren's avatar Stefan Wahren Committed by David S. Miller
Browse files

net: qca_spi: Add available buffer space verification



Interferences on the SPI line could distort the response of
available buffer space. So at least we should check that the
response doesn't exceed the maximum available buffer space.
In error case increase a new error counter and retry it later.
This behavior avoids buffer errors in the QCA7000, which
results in an unnecessary chip reset including packet loss.

Signed-off-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 50254256
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ static const char qcaspi_gstrings_stats[][ETH_GSTRING_LEN] = {
	"Transmit ring full",
	"SPI errors",
	"Write verify errors",
	"Buffer available errors",
};

#ifdef CONFIG_DEBUG_FS
+15 −1
Original line number Diff line number Diff line
@@ -289,6 +289,14 @@ qcaspi_transmit(struct qcaspi *qca)

	qcaspi_read_register(qca, SPI_REG_WRBUF_SPC_AVA, &available);

	if (available > QCASPI_HW_BUF_LEN) {
		/* This could only happen by interferences on the SPI line.
		 * So retry later ...
		 */
		qca->stats.buf_avail_err++;
		return -1;
	}

	while (qca->txr.skb[qca->txr.head]) {
		pkt_len = qca->txr.skb[qca->txr.head]->len + QCASPI_HW_PKT_LEN;

@@ -355,7 +363,13 @@ qcaspi_receive(struct qcaspi *qca)
	netdev_dbg(net_dev, "qcaspi_receive: SPI_REG_RDBUF_BYTE_AVA: Value: %08x\n",
		   available);

	if (available == 0) {
	if (available > QCASPI_HW_BUF_LEN) {
		/* This could only happen by interferences on the SPI line.
		 * So retry later ...
		 */
		qca->stats.buf_avail_err++;
		return -1;
	} else if (available == 0) {
		netdev_dbg(net_dev, "qcaspi_receive called without any data being available!\n");
		return -1;
	}
+1 −0
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ struct qcaspi_stats {
	u64 ring_full;
	u64 spi_err;
	u64 write_verify_failed;
	u64 buf_avail_err;
};

struct qcaspi {