Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fs_enet: Align receive buffers.

At least some hardware driven by this driver needs receive buffers
to be aligned on a 16-byte boundary. This usually happens by chance,
but it breaks if slab debugging is enabled.

Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by

Scott Wood and committed by
David S. Miller
0d0d9c15 c6565331

+21 -3
+19 -2
drivers/net/fs_enet/fs_enet-main.c
··· 70 70 (*fep->ops->set_multicast_list)(dev); 71 71 } 72 72 73 + static void skb_align(struct sk_buff *skb, int align) 74 + { 75 + int off = ((unsigned long)skb->data) & (align - 1); 76 + 77 + if (off) 78 + skb_reserve(skb, align - off); 79 + } 80 + 73 81 /* NAPI receive function */ 74 82 static int fs_enet_rx_napi(struct napi_struct *napi, int budget) 75 83 { ··· 167 159 skb = skbn; 168 160 skbn = skbt; 169 161 } 170 - } else 162 + } else { 171 163 skbn = dev_alloc_skb(ENET_RX_FRSIZE); 164 + 165 + if (skbn) 166 + skb_align(skbn, ENET_RX_ALIGN); 167 + } 172 168 173 169 if (skbn != NULL) { 174 170 skb_put(skb, pkt_len); /* Make room */ ··· 302 290 skb = skbn; 303 291 skbn = skbt; 304 292 } 305 - } else 293 + } else { 306 294 skbn = dev_alloc_skb(ENET_RX_FRSIZE); 295 + 296 + if (skbn) 297 + skb_align(skbn, ENET_RX_ALIGN); 298 + } 307 299 308 300 if (skbn != NULL) { 309 301 skb_put(skb, pkt_len); /* Make room */ ··· 518 502 dev->name); 519 503 break; 520 504 } 505 + skb_align(skb, ENET_RX_ALIGN); 521 506 fep->rx_skbuff[i] = skb; 522 507 CBDW_BUFADDR(bdp, 523 508 dma_map_single(fep->dev, skb->data,
+2 -1
drivers/net/fs_enet/fs_enet.h
··· 82 82 /* Must be a multiple of 32 (to cover both FEC & FCC) */ 83 83 #define PKT_MAXBLR_SIZE ((PKT_MAXBUF_SIZE + 31) & ~31) 84 84 /* This is needed so that invalidate_xxx wont invalidate too much */ 85 - #define ENET_RX_FRSIZE L1_CACHE_ALIGN(PKT_MAXBUF_SIZE) 85 + #define ENET_RX_ALIGN 16 86 + #define ENET_RX_FRSIZE L1_CACHE_ALIGN(PKT_MAXBUF_SIZE + ENET_RX_ALIGN - 1) 86 87 87 88 struct fs_enet_mii_bus { 88 89 struct list_head list;