Hi!
Am Freitag, 4. Februar 2005 08:28 schrieben Sie:
> On Wednesday 26 January 2005 1:30 pm, you wrote:
> > Am Mittwoch, 26. Januar 2005 21:39 schrieben Sie:
> > > And it's _demonstrably false_ that IP packets are always aligned on
> > > such boundaries. Remember, lots of other ARM platforms (v4 and v5)
> > > are already working fine. Yours seems to be the exception.
> >
> > Perhaps because its a ARM9TDMI without MMU [sic!]?
>
> That shouldn't matter either. Even though your CPU has a 32 bit memory
> interface. Though I suspect the issue is lurking somewhere in that
> vicinity. For example, maybe you're mis-handling unaligned access
> traps that the other ARM processors won't need to issue?
Part of my .config:
# CONFIG_ALIGNMENT_TRAP is not set
It's deactivated because we dont have Coprocessor Register 15.
> > The I found out the the packet is dropped because the IP-Header checksum
> > could not be verified. The IP-Header checksum could only be successfully
> > verified when the packet is aligned.
> >
> > After aligning the packet i get 0% packet loss in ping.
>
> So, _why_ does the checksum not compute correctly on your system,
> while it does on other ARM platforms?
>
> Given that you found this problem affecting at least two different
> network drivers -- ones that work on other ARM boards!! -- it seems
> likely to me that the problem is specific to your hardware, or to
> your board support package.
We also had these alignment problems with the pure ethernet interfaces.
The driver is part of uClinux patch and called:
CONFIG_P2001_ETH=y
> Remember, <asm/checksum.h> only says that it's "best" to have the
> packet aligned on a 32 bit boundary ... it's NOT mandatory. And
> in <linux/skbuff.h> it's pointed out that sometimes it's more
> important to have the DMA transfer be aligned than the checksum;
> one example would be on Intel's PXA 255 ARM/XScale processor,
> where the DMA engine insists on 16 byte buffer alignment.
>
>
> That said, if you can come up with a better patch, I'd consider it.
> On some systems it seems like it'd affect performance.
>
> (Even though it clearly just papers over some more basic problem on
> your system. Which for now I'll assume is broken handling of kernel
> mode unaligned accesses!)
>
> Three problems raised with what you sent:
> (a) #ifdef ARM is clearly wrong
I just kicked it out
> ; and as Sergey said, (b) the right value is NET_IP_ALIGN as defined
> in <linux/skbuff.h>,
Yeah thats much better
> plus (c) you need to increase the size of the
> buffer specified in alloc_skb() to account for this wasted space.
Of course.
Regards
Thomas
--
Wo k�men wir hin, wenn alle sagten, wo k�men wir hin,
und niemand ginge, um einmal zu schauen, wohin man k�me,
wenn man ginge.
�Kurt Marti�
--- drivers/usb/gadget/ether.c_ori 2005-01-26 18:22:17.000000000 +0100
+++ drivers/usb/gadget/ether.c 2005-01-26 19:39:41.000000000 +0100
@@ -1762,10 +1762,16 @@ rx_submit (struct eth_dev *dev, struct u
#endif
size -= size % dev->out_ep->maxpacket;
- if ((skb = alloc_skb (size, gfp_flags)) == 0) {
+ if ((skb = alloc_skb (size + NET_IP_ALIGN, gfp_flags)) == 0) {
DEBUG (dev, "no rx skb\n");
goto enomem;
}
+
+ /* IP-Packets should be align to 32-Bit
+ * The 14Byte long ethernet-header disturbs
+ * this when skb is align to 32-Bit.
+ */
+ skb_reserve(skb, NET_IP_ALIGN);
req->buf = skb->data;
req->length = size;