Messages in this thread Patch in this message | | | Date | Wed, 26 Jul 2000 17:14:50 -0400 | From | Paul Gortmaker <> | Subject | Re: weired NE2K ether problem - help! |
| |
Jun Sun wrote:
> > BTW, I believe I have already found one bug in ne2k-pci.c. The bug > is in ne2k_pci_block_input() and ne2k_pci_block_output(). The code > checks if ONLY_16BIT_IO is set or not. If not, it will try to read/write > using 32bit mode, into/from the buffer (skb->data). However, > skb->data is NOT aligned along 4-byte boundary (See related sbk_reserve(2) > calls in 8390.c). This causes bus error on my MIPS board. > > What should be the right fix? I currently use a separate buffer, which is > aligned along 4-byte boundary, to copy into/from skb->data to do the IO. > Obviously, this is not good. > > I also tried to change from skb_reserve(2) skb_reserve(4). That seems > to causes some other problem. (OK, I admit I am quite ignorant about > ether driver.)
The reserve of 2 is because src addr(6) + dst addr(6) + type code(2)=14. Adding 2 makes it an even 16 to the start of of the IP header.
In your case you may need to test with something like this.
Paul.
--- drivers/net/8390.c~ Sat Jul 22 12:59:17 2000 +++ drivers/net/8390.c Wed Jul 26 16:59:38 2000 @@ -739,7 +739,7 @@ { struct sk_buff *skb; - skb = dev_alloc_skb(pkt_len+2); + skb = dev_alloc_skb(pkt_len+4); if (skb == NULL) { if (ei_debug > 1) @@ -750,7 +750,8 @@ } else { - skb_reserve(skb,2); /* IP headers on 16 byte boundaries */ + unsigned long offset = (((unsigned long)(skb->data) + 3) & ~3UL) - (unsigned long)(skb->data); + skb_reserve(skb,offset); skb->dev = dev; skb_put(skb, pkt_len); /* Make room */ ei_block_input(dev, pkt_len, skb, current_offset + sizeof(rx_frame));
__________________________________________________ Do You Yahoo!? Talk to your friends online with Yahoo! Messenger. http://im.yahoo.com - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |