net: vertexcom: mse102x: Return code for mse102x_rx_pkt_spi
[ Upstream commit 4ecf56f4b66011b583644bf9a62188d05dfcd78c ] The MSE102x doesn't provide any interrupt register, so the only way to handle the level interrupt is to fetch the whole packet from the MSE102x internal buffer via SPI. So in cases the interrupt handler fails to do this, it should return IRQ_NONE. This allows the core to disable the interrupt in case the issue persists and prevent an interrupt storm. Signed-off-by: Stefan Wahren <wahrenst@gmx.net> Link: https://patch.msgid.link/20250509120435.43646-6-wahrenst@gmx.net Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
84d34bd55d
commit
187829fb0c
@@ -306,7 +306,7 @@ static void mse102x_dump_packet(const char *msg, int len, const char *data)
|
|||||||
data, len, true);
|
data, len, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mse102x_rx_pkt_spi(struct mse102x_net *mse)
|
static irqreturn_t mse102x_rx_pkt_spi(struct mse102x_net *mse)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
unsigned int rxalign;
|
unsigned int rxalign;
|
||||||
@@ -327,7 +327,7 @@ static void mse102x_rx_pkt_spi(struct mse102x_net *mse)
|
|||||||
mse102x_tx_cmd_spi(mse, CMD_CTR);
|
mse102x_tx_cmd_spi(mse, CMD_CTR);
|
||||||
ret = mse102x_rx_cmd_spi(mse, (u8 *)&rx);
|
ret = mse102x_rx_cmd_spi(mse, (u8 *)&rx);
|
||||||
if (ret)
|
if (ret)
|
||||||
return;
|
return IRQ_NONE;
|
||||||
|
|
||||||
cmd_resp = be16_to_cpu(rx);
|
cmd_resp = be16_to_cpu(rx);
|
||||||
if ((cmd_resp & CMD_MASK) != CMD_RTS) {
|
if ((cmd_resp & CMD_MASK) != CMD_RTS) {
|
||||||
@@ -360,7 +360,7 @@ drop:
|
|||||||
rxalign = ALIGN(rxlen + DET_SOF_LEN + DET_DFT_LEN, 4);
|
rxalign = ALIGN(rxlen + DET_SOF_LEN + DET_DFT_LEN, 4);
|
||||||
skb = netdev_alloc_skb_ip_align(mse->ndev, rxalign);
|
skb = netdev_alloc_skb_ip_align(mse->ndev, rxalign);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return;
|
return IRQ_NONE;
|
||||||
|
|
||||||
/* 2 bytes Start of frame (before ethernet header)
|
/* 2 bytes Start of frame (before ethernet header)
|
||||||
* 2 bytes Data frame tail (after ethernet frame)
|
* 2 bytes Data frame tail (after ethernet frame)
|
||||||
@@ -370,7 +370,7 @@ drop:
|
|||||||
if (mse102x_rx_frame_spi(mse, rxpkt, rxlen, drop)) {
|
if (mse102x_rx_frame_spi(mse, rxpkt, rxlen, drop)) {
|
||||||
mse->ndev->stats.rx_errors++;
|
mse->ndev->stats.rx_errors++;
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
return;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (netif_msg_pktdata(mse))
|
if (netif_msg_pktdata(mse))
|
||||||
@@ -381,6 +381,8 @@ drop:
|
|||||||
|
|
||||||
mse->ndev->stats.rx_packets++;
|
mse->ndev->stats.rx_packets++;
|
||||||
mse->ndev->stats.rx_bytes += rxlen;
|
mse->ndev->stats.rx_bytes += rxlen;
|
||||||
|
|
||||||
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mse102x_tx_pkt_spi(struct mse102x_net *mse, struct sk_buff *txb,
|
static int mse102x_tx_pkt_spi(struct mse102x_net *mse, struct sk_buff *txb,
|
||||||
@@ -512,12 +514,13 @@ static irqreturn_t mse102x_irq(int irq, void *_mse)
|
|||||||
{
|
{
|
||||||
struct mse102x_net *mse = _mse;
|
struct mse102x_net *mse = _mse;
|
||||||
struct mse102x_net_spi *mses = to_mse102x_spi(mse);
|
struct mse102x_net_spi *mses = to_mse102x_spi(mse);
|
||||||
|
irqreturn_t ret;
|
||||||
|
|
||||||
mutex_lock(&mses->lock);
|
mutex_lock(&mses->lock);
|
||||||
mse102x_rx_pkt_spi(mse);
|
ret = mse102x_rx_pkt_spi(mse);
|
||||||
mutex_unlock(&mses->lock);
|
mutex_unlock(&mses->lock);
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mse102x_net_open(struct net_device *ndev)
|
static int mse102x_net_open(struct net_device *ndev)
|
||||||
|
Reference in New Issue
Block a user