From 0643e8fc568ea8a8865bb218f8099651645451f6 Mon Sep 17 00:00:00 2001 From: Baruch Siach Date: Tue, 2 Dec 2008 05:07:01 +0000 Subject: [PATCH] --- yaml --- r: 119755 b: refs/heads/master c: 5176da7e5318669220e4d2fa856223054a3efc9f h: refs/heads/master i: 119753: 3d32757c14de3b2c6e0ee44dfa8fedb01be1e1e4 119751: a16a9187618d7132475dc6e69b8069056979ab75 v: v3 --- [refs] | 2 +- trunk/drivers/net/enc28j60.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index c3fd227da035..d23c5afb8099 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bd0914104c61a852baf469b2d807322e5d0459b4 +refs/heads/master: 5176da7e5318669220e4d2fa856223054a3efc9f diff --git a/trunk/drivers/net/enc28j60.c b/trunk/drivers/net/enc28j60.c index e1b441effbbe..c414554ac321 100644 --- a/trunk/drivers/net/enc28j60.c +++ b/trunk/drivers/net/enc28j60.c @@ -568,6 +568,17 @@ static u16 erxrdpt_workaround(u16 next_packet_ptr, u16 start, u16 end) return erxrdpt; } +/* + * Calculate wrap around 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 + RSV_SIZE; +} + 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_device *ndev) 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);