Skip to content

Commit 84fae2f

Browse files
lategoodbyejfvogel
authored andcommitted
net: vertexcom: mse102x: Fix RX error handling
[ Upstream commit ee512922ddd7d64afe2b28830a88f19063217649 ] In case the CMD_RTS got corrupted by interferences, the MSE102x doesn't allow a retransmission of the command. Instead the Ethernet frame must be shifted out of the SPI FIFO. Since the actual length is unknown, assume the maximum possible value. Fixes: 2f207cb ("net: vertexcom: Add MSE102x SPI support") Signed-off-by: Stefan Wahren <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit 1e15804c047252b915d773de5acdd7245f2c16a2) Signed-off-by: Jack Vogel <[email protected]>
1 parent ed5f07e commit 84fae2f

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

drivers/net/ethernet/vertexcom/mse102x.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, struct sk_buff *txp,
263263
}
264264

265265
static int mse102x_rx_frame_spi(struct mse102x_net *mse, u8 *buff,
266-
unsigned int frame_len)
266+
unsigned int frame_len, bool drop)
267267
{
268268
struct mse102x_net_spi *mses = to_mse102x_spi(mse);
269269
struct spi_transfer *xfer = &mses->spi_xfer;
@@ -281,6 +281,9 @@ static int mse102x_rx_frame_spi(struct mse102x_net *mse, u8 *buff,
281281
netdev_err(mse->ndev, "%s: spi_sync() failed: %d\n",
282282
__func__, ret);
283283
mse->stats.xfer_err++;
284+
} else if (drop) {
285+
netdev_dbg(mse->ndev, "%s: Drop frame\n", __func__);
286+
ret = -EINVAL;
284287
} else if (*sof != cpu_to_be16(DET_SOF)) {
285288
netdev_dbg(mse->ndev, "%s: SPI start of frame is invalid (0x%04x)\n",
286289
__func__, *sof);
@@ -308,6 +311,7 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse)
308311
struct sk_buff *skb;
309312
unsigned int rxalign;
310313
unsigned int rxlen;
314+
bool drop = false;
311315
__be16 rx = 0;
312316
u16 cmd_resp;
313317
u8 *rxpkt;
@@ -330,7 +334,8 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse)
330334
net_dbg_ratelimited("%s: Unexpected response (0x%04x)\n",
331335
__func__, cmd_resp);
332336
mse->stats.invalid_rts++;
333-
return;
337+
drop = true;
338+
goto drop;
334339
}
335340

336341
net_dbg_ratelimited("%s: Unexpected response to first CMD\n",
@@ -342,9 +347,16 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse)
342347
net_dbg_ratelimited("%s: Invalid frame length: %d\n", __func__,
343348
rxlen);
344349
mse->stats.invalid_len++;
345-
return;
350+
drop = true;
346351
}
347352

353+
/* In case of a invalid CMD_RTS, the frame must be consumed anyway.
354+
* So assume the maximum possible frame length.
355+
*/
356+
drop:
357+
if (drop)
358+
rxlen = VLAN_ETH_FRAME_LEN;
359+
348360
rxalign = ALIGN(rxlen + DET_SOF_LEN + DET_DFT_LEN, 4);
349361
skb = netdev_alloc_skb_ip_align(mse->ndev, rxalign);
350362
if (!skb)
@@ -355,7 +367,7 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse)
355367
* They are copied, but ignored.
356368
*/
357369
rxpkt = skb_put(skb, rxlen) - DET_SOF_LEN;
358-
if (mse102x_rx_frame_spi(mse, rxpkt, rxlen)) {
370+
if (mse102x_rx_frame_spi(mse, rxpkt, rxlen, drop)) {
359371
mse->ndev->stats.rx_errors++;
360372
dev_kfree_skb(skb);
361373
return;

0 commit comments

Comments
 (0)