diff options
Diffstat (limited to 'drivers/net/enc28j60.c')
| -rw-r--r-- | drivers/net/enc28j60.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c index e1b441effbbe..c414554ac321 100644 --- a/drivers/net/enc28j60.c +++ b/drivers/net/enc28j60.c | |||
| @@ -568,6 +568,17 @@ static u16 erxrdpt_workaround(u16 next_packet_ptr, u16 start, u16 end) | |||
| 568 | return erxrdpt; | 568 | return erxrdpt; |
| 569 | } | 569 | } |
| 570 | 570 | ||
| 571 | /* | ||
| 572 | * Calculate wrap around when reading beyond the end of the RX buffer | ||
| 573 | */ | ||
| 574 | static u16 rx_packet_start(u16 ptr) | ||
| 575 | { | ||
| 576 | if (ptr + RSV_SIZE > RXEND_INIT) | ||
| 577 | return (ptr + RSV_SIZE) - (RXEND_INIT - RXSTART_INIT + 1); | ||
| 578 | else | ||
| 579 | return ptr + RSV_SIZE; | ||
| 580 | } | ||
| 581 | |||
| 571 | static void nolock_rxfifo_init(struct enc28j60_net *priv, u16 start, u16 end) | 582 | static void nolock_rxfifo_init(struct enc28j60_net *priv, u16 start, u16 end) |
| 572 | { | 583 | { |
| 573 | u16 erxrdpt; | 584 | u16 erxrdpt; |
| @@ -938,8 +949,9 @@ static void enc28j60_hw_rx(struct net_device *ndev) | |||
| 938 | skb->dev = ndev; | 949 | skb->dev = ndev; |
| 939 | skb_reserve(skb, NET_IP_ALIGN); | 950 | skb_reserve(skb, NET_IP_ALIGN); |
| 940 | /* copy the packet from the receive buffer */ | 951 | /* copy the packet from the receive buffer */ |
| 941 | enc28j60_mem_read(priv, priv->next_pk_ptr + sizeof(rsv), | 952 | enc28j60_mem_read(priv, |
| 942 | len, skb_put(skb, len)); | 953 | rx_packet_start(priv->next_pk_ptr), |
| 954 | len, skb_put(skb, len)); | ||
| 943 | if (netif_msg_pktdata(priv)) | 955 | if (netif_msg_pktdata(priv)) |
| 944 | dump_packet(__func__, skb->len, skb->data); | 956 | dump_packet(__func__, skb->len, skb->data); |
| 945 | skb->protocol = eth_type_trans(skb, ndev); | 957 | skb->protocol = eth_type_trans(skb, ndev); |
