* [PATCH] enc28j60: Fix sporadic packet loss
@ 2008-12-02 12:50 Baruch Siach
2008-12-02 14:11 ` Claudio Lanconelli
0 siblings, 1 reply; 2+ messages in thread
From: Baruch Siach @ 2008-12-02 12:50 UTC (permalink / raw)
To: Claudio Lanconelli; +Cc: Shachar Shemesh, netdev
Packet data read from the RX buffer the when the RSV is at the end of the RX
buffer does not warp around. This causes packet loss, as the actual data is
never read. Fix this by calculating the right packet data location.
Thanks to Shachar Shemesh for suggesting the fix.
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
---
--- drivers/net/enc28j60.c-git 2008-12-02 14:30:10.000000000 +0200
+++ drivers/net/enc28j60.c 2008-12-02 14:41:51.000000000 +0200
@@ -568,6 +568,17 @@ static u16 erxrdpt_workaround(u16 next_p
return erxrdpt;
}
+/*
+ * Calculate wrap arround when reading beyond the end of the RX buffer
+ */
+static u16 rx_packet_start(u16 ptr)
+{
+ if (ptr + RSV_SIZE > RXEND_INIT)
+ return (ptr + RSV_SIZE) - (RXEND_INIT - RXSTART_INIT + 1);
+ else
+ return ptr;
+}
+
static void nolock_rxfifo_init(struct enc28j60_net *priv, u16 start, u16 end)
{
u16 erxrdpt;
@@ -938,8 +949,9 @@ static void enc28j60_hw_rx(struct net_de
skb->dev = ndev;
skb_reserve(skb, NET_IP_ALIGN);
/* copy the packet from the receive buffer */
- enc28j60_mem_read(priv, priv->next_pk_ptr + sizeof(rsv),
- len, skb_put(skb, len));
+ enc28j60_mem_read(priv,
+ rx_packet_start(priv->next_pk_ptr),
+ len, skb_put(skb, len));
if (netif_msg_pktdata(priv))
dump_packet(__func__, skb->len, skb->data);
skb->protocol = eth_type_trans(skb, ndev);
--
~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch@tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] enc28j60: Fix sporadic packet loss
2008-12-02 12:50 [PATCH] enc28j60: Fix sporadic packet loss Baruch Siach
@ 2008-12-02 14:11 ` Claudio Lanconelli
0 siblings, 0 replies; 2+ messages in thread
From: Claudio Lanconelli @ 2008-12-02 14:11 UTC (permalink / raw)
To: Baruch Siach; +Cc: netdev
Baruch Siach wrote:
> +/*
> + * Calculate wrap arround when reading beyond the end of the RX buffer
^
> + */
> +static u16 rx_packet_start(u16 ptr)
> +{
> + if (ptr + RSV_SIZE > RXEND_INIT)
> + return (ptr + RSV_SIZE) - (RXEND_INIT - RXSTART_INIT + 1);
> + else
> + return ptr;
> +}
should be
...
else
return ptr + RSV_SIZE;
With this change you can add the line
Acked-by: Claudio Lanconelli <lanconelli.claudio@eptar.com>
Cheers,
Claudio
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-12-02 16:53 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-02 12:50 [PATCH] enc28j60: Fix sporadic packet loss Baruch Siach
2008-12-02 14:11 ` Claudio Lanconelli
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).