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

Reply via email to