Skip to content

Commit

Permalink
net: qca_spi: Add available buffer space verification
Browse files Browse the repository at this point in the history
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: Stefan Wahren <stefan.wahren@i2se.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Stefan Wahren authored and David S. Miller committed Nov 9, 2018
1 parent 5025425 commit 026b907
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
1 change: 1 addition & 0 deletions drivers/net/ethernet/qualcomm/qca_debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 15 additions & 1 deletion drivers/net/ethernet/qualcomm/qca_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
Expand Down
1 change: 1 addition & 0 deletions drivers/net/ethernet/qualcomm/qca_spi.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ struct qcaspi_stats {
u64 ring_full;
u64 spi_err;
u64 write_verify_failed;
u64 buf_avail_err;
};

struct qcaspi {
Expand Down

0 comments on commit 026b907

Please sign in to comment.