lkml.org 
[lkml]   [2011]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH ref0] net: add Faraday FTMAC100 10/100 Ethernet driver
    From
    Date
    Le jeudi 24 février 2011 à 17:29 +0800, Po-Yu Chuang a écrit :
    > From: Po-Yu Chuang <ratbert@faraday-tech.com>
    >


    > +
    > +static bool ftmac100_rx_packet(struct ftmac100 *priv, int *processed)
    > +{
    > + struct net_device *netdev = priv->netdev;
    > + struct ftmac100_rxdes *rxdes;
    > + struct sk_buff *skb;
    > + struct page *page;
    > + dma_addr_t map;
    > + int length;
    > +
    > + rxdes = ftmac100_rx_locate_first_segment(priv);
    > + if (!rxdes)
    > + return false;
    > +
    > + if (unlikely(ftmac100_rx_packet_error(priv, rxdes))) {
    > + ftmac100_rx_drop_packet(priv);
    > + return true;
    > + }
    > +
    > + /*
    > + * It is impossible to get multi-segment packets
    > + * because we always provide big enough receive buffers.
    > + */
    > + if (unlikely(!ftmac100_rxdes_last_segment(rxdes)))
    > + BUG();
    > +
    > + /* start processing */
    > + skb = netdev_alloc_skb_ip_align(netdev, ETH_HLEN);

    Oh I see... You should allocate a bigger head (say... 128 bytes)

    And copy in it up to 128 bytes of first part... this to avoid upper
    stack to reallocate skb head (because IP/TCP processing need to get
    their headers in skb head)

    > + if (unlikely(!skb)) {
    > + if (net_ratelimit())
    > + netdev_err(netdev, "rx skb alloc failed\n");
    > +
    > + ftmac100_rx_drop_packet(priv);
    > + return true;
    > + }
    > +
    > + if (unlikely(ftmac100_rxdes_multicast(rxdes)))
    > + netdev->stats.multicast++;
    > +
    > + map = ftmac100_rxdes_get_dma_addr(rxdes);
    > + dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
    > +
    > + length = ftmac100_rxdes_frame_length(rxdes);
    > + page = ftmac100_rxdes_get_page(rxdes);
    > + skb_fill_page_desc(skb, 0, page, 0, length);
    > + skb->len += length;
    > + skb->data_len += length;
    > + skb->truesize += length;
    > + __pskb_pull_tail(skb, ETH_HLEN);
    > +
    > + ftmac100_alloc_rx_page(priv, rxdes);
    > +
    > + ftmac100_rx_pointer_advance(priv);
    > +
    > + skb->protocol = eth_type_trans(skb, netdev);
    > +
    > + netdev->stats.rx_packets++;
    > + netdev->stats.rx_bytes += skb->len;
    > +
    > + /* push packet to protocol stack */
    > + netif_receive_skb(skb);
    > +
    > + (*processed)++;
    > + return true;
    > +}
    > +

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2011-02-24 18:41    [W:0.027 / U:0.092 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site