Beispiel #1
0
static int xgene_enet_tx_completion(struct xgene_enet_desc_ring *cp_ring,
                                    struct xgene_enet_raw_desc *raw_desc)
{
    struct sk_buff *skb;
    struct device *dev;
    u16 skb_index;
    u8 status;
    int ret = 0;

    skb_index = GET_VAL(USERINFO, le64_to_cpu(raw_desc->m0));
    skb = cp_ring->cp_skb[skb_index];

    dev = ndev_to_dev(cp_ring->ndev);
    dma_unmap_single(dev, GET_VAL(DATAADDR, le64_to_cpu(raw_desc->m1)),
                     GET_VAL(BUFDATALEN, le64_to_cpu(raw_desc->m1)),
                     DMA_TO_DEVICE);

    /* Checking for error */
    status = GET_VAL(LERR, le64_to_cpu(raw_desc->m0));
    if (unlikely(status > 2)) {
        xgene_enet_parse_error(cp_ring, netdev_priv(cp_ring->ndev),
                               status);
        ret = -EIO;
    }

    if (likely(skb)) {
        dev_kfree_skb_any(skb);
    } else {
        netdev_err(cp_ring->ndev, "completion skb is NULL\n");
        ret = -EIO;
    }

    return ret;
}
Beispiel #2
0
static int xgene_enet_tx_completion(struct xgene_enet_desc_ring *cp_ring,
				    struct xgene_enet_raw_desc *raw_desc)
{
	struct sk_buff *skb;
	struct device *dev;
	skb_frag_t *frag;
	dma_addr_t *frag_dma_addr;
	u16 skb_index;
	u8 status;
	int i, ret = 0;

	skb_index = GET_VAL(USERINFO, le64_to_cpu(raw_desc->m0));
	skb = cp_ring->cp_skb[skb_index];
	frag_dma_addr = &cp_ring->frag_dma_addr[skb_index * MAX_SKB_FRAGS];

	dev = ndev_to_dev(cp_ring->ndev);
	dma_unmap_single(dev, GET_VAL(DATAADDR, le64_to_cpu(raw_desc->m1)),
			 skb_headlen(skb),
			 DMA_TO_DEVICE);

	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
		frag = &skb_shinfo(skb)->frags[i];
		dma_unmap_page(dev, frag_dma_addr[i], skb_frag_size(frag),
			       DMA_TO_DEVICE);
	}

	/* Checking for error */
	status = GET_VAL(LERR, le64_to_cpu(raw_desc->m0));
	if (unlikely(status > 2)) {
		xgene_enet_parse_error(cp_ring, netdev_priv(cp_ring->ndev),
				       status);
		ret = -EIO;
	}

	if (likely(skb)) {
		dev_kfree_skb_any(skb);
	} else {
		netdev_err(cp_ring->ndev, "completion skb is NULL\n");
		ret = -EIO;
	}

	return ret;
}