Hello,
these days I'm working on porting AT91sam9260 macb etherbet driver to the
RTnet.
I've got it to send packets via rt_dev_send, but I have a problem with
receiving packets in rt socket( e.g. PF_PACKET).In fact I can get packet in
driver's tx_buffer but in uper layers it is invisible.
The function rt_dev_receive() gives me an -9 error (EBADF), but with same
socket I can send messages.
Has anyone know what can be reasons of this ?
I'm repeating, I can't receive packet via socket, but I can get packet in
tx_buffer and rtskb->data and I don't know where it is going after
rtnetif_rx(rtskb).
Here is macb_rt
static int macb_rx_frame(struct macb_private *bp, unsigned int first_frag,
unsigned int last_frag)
{
unsigned int len;
unsigned int frag;
unsigned int offset = 0;
struct rtskb *skb;
printk("Enter macb_rx_frame\n");
len = MACB_BFEXT(RX_FRMLEN, bp->rx_ring[last_frag].ctrl);
dev_dbg(&bp->pdev->dev, "macb_rx_frame frags %u - %u (len %u)\n",
first_frag, last_frag, len);
skb = dev_alloc_rtskb(len + RX_OFFSET,&bp->skb_pool);
if (!skb) {
bp->stats.rx_dropped++;
for (frag = first_frag; ; frag = NEXT_RX(frag)) {
bp->rx_ring[frag].addr &= ~MACB_BIT(RX_USED);
if (frag == last_frag)
break;
}
wmb();
return 1;
}
rtskb_reserve(skb, RX_OFFSET);
skb->rtdev = bp->rtdev;
skb->ip_summed = CHECKSUM_NONE;
rtskb_put(skb, len);
for (frag = first_frag; ; frag = NEXT_RX(frag)) {
unsigned int frag_len = RX_BUFFER_SIZE;
if (offset + frag_len > len) {
BUG_ON(frag != last_frag);
frag_len = len - offset;
}
printk("rx_buffers+RX_BUFFER_SIZE * frag\n");
// hexdump(bp->rx_buffers + (RX_BUFFER_SIZE * frag),frag_len);
printk("before memcpy(skb->data + offset,bp->rx_buffers +
(RX_BUFFER_SIZE * frag),frag_len)\n");
// hexdump(skb->data + offset,frag_len);
memcpy(skb->data + offset,
bp->rx_buffers + (RX_BUFFER_SIZE * frag),
frag_len);
offset += RX_BUFFER_SIZE;
bp->rx_ring[frag].addr &= ~MACB_BIT(RX_USED);
wmb();
if (frag == last_frag)
break;
}
skb->protocol = rt_eth_type_trans(skb, bp->rtdev);
rtnetif_rx(skb);
bp->stats.rx_packets++;
bp->stats.rx_bytes += len;
//bp->rtdev->last_rx = jiffies;
printk("received skb of length %u, csum: %08x\n",
skb->len, skb->csum);
dev_dbg(&bp->pdev->dev, "received skb of length %u, csum: %08x\n",
skb->len, skb->csum);
return 0;
}
Regards to all community
Sinisa Denic
Software and system engineer
tel: +381(0)112016323
fax: +381(0)112016380
ABS Control Systems
bul.Zorana Djindjica 8a
Belgrade,Serbia
-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell. From the desktop to the data center, Linux is going
mainstream. Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
RTnet-users mailing list
RTnet-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rtnet-users