aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethoc.c
diff options
context:
space:
mode:
authorThomas Chou <thomas@wytron.com.tw>2009-10-04 19:33:19 -0400
committerDavid S. Miller <davem@davemloft.net>2009-10-07 06:50:12 -0400
commit050f91dcd9a45a14449dded5180f633692b588d2 (patch)
tree93b1b4c4bcd43b70a08e68fd1b9ae313a5fd559e /drivers/net/ethoc.c
parent3ee19a85bb428b8363699dff9e1c4041c107d46a (diff)
ethoc: align received packet to make IP header at word boundary
The packet buffer is allocated at 4 bytes boundary, but the IP header length and version bits is located at byte 14. These bit fields access as 32 bits word and caused exception on processors that do not support unaligned access. The patch adds 2 bytes offset to make the bit fields word aligned. Signed-off-by: Thomas Chou <thomas@wytron.com.tw> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethoc.c')
-rw-r--r--drivers/net/ethoc.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c
index f92747fc5f8b..0c6c7f47ace4 100644
--- a/drivers/net/ethoc.c
+++ b/drivers/net/ethoc.c
@@ -399,6 +399,10 @@ static int ethoc_rx(struct net_device *dev, int limit)
399 if (ethoc_update_rx_stats(priv, &bd) == 0) { 399 if (ethoc_update_rx_stats(priv, &bd) == 0) {
400 int size = bd.stat >> 16; 400 int size = bd.stat >> 16;
401 struct sk_buff *skb = netdev_alloc_skb(dev, size); 401 struct sk_buff *skb = netdev_alloc_skb(dev, size);
402
403 size -= 4; /* strip the CRC */
404 skb_reserve(skb, 2); /* align TCP/IP header */
405
402 if (likely(skb)) { 406 if (likely(skb)) {
403 void *src = phys_to_virt(bd.addr); 407 void *src = phys_to_virt(bd.addr);
404 memcpy_fromio(skb_put(skb, size), src, size); 408 memcpy_fromio(skb_put(skb, size), src, size);