Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26fcfa95 authored by Olof Johansson's avatar Olof Johansson Committed by David S. Miller
Browse files

pasemi_mac: RX performance tweaks



Various RX performance tweaks, do some explicit prefetching of packet
data, etc.

Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 73344863
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -471,6 +471,7 @@ static int pasemi_mac_clean_rx(struct pasemi_mac *mac, int limit)
		rmb();

		dp = &RX_DESC(mac, n);
		prefetchw(dp);
		macrx = dp->macrx;

		if (!(macrx & XCT_MACRX_O))
@@ -492,8 +493,10 @@ static int pasemi_mac_clean_rx(struct pasemi_mac *mac, int limit)
			if (info->dma == dma)
				break;
		}
		prefetchw(info);

		skb = info->skb;
		prefetchw(skb);
		info->dma = 0;

		pci_unmap_single(mac->dma_pdev, dma, skb->len,
@@ -516,9 +519,7 @@ static int pasemi_mac_clean_rx(struct pasemi_mac *mac, int limit)

		skb_put(skb, len);

		skb->protocol = eth_type_trans(skb, mac->netdev);

		if ((macrx & XCT_MACRX_HTY_M) == XCT_MACRX_HTY_IPV4_OK) {
		if (likely((macrx & XCT_MACRX_HTY_M) == XCT_MACRX_HTY_IPV4_OK)) {
			skb->ip_summed = CHECKSUM_COMPLETE;
			skb->csum = (macrx & XCT_MACRX_CSUM_M) >>
					   XCT_MACRX_CSUM_S;
@@ -528,6 +529,7 @@ static int pasemi_mac_clean_rx(struct pasemi_mac *mac, int limit)
		mac->stats.rx_bytes += len;
		mac->stats.rx_packets++;

		skb->protocol = eth_type_trans(skb, mac->netdev);
		netif_receive_skb(skb);

		dp->ptr = 0;
@@ -559,7 +561,7 @@ static int pasemi_mac_clean_tx(struct pasemi_mac *mac)

	for (i = start; i < mac->tx->next_to_use; i++) {
		dp = &TX_DESC(mac, i);
		if (!dp || (dp->mactx & XCT_MACTX_O))
		if (unlikely(dp->mactx & XCT_MACTX_O))
			break;

		count++;
@@ -948,7 +950,7 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
	struct pasemi_mac_txring *txring;
	struct pasemi_mac_buffer *info;
	struct pas_dma_xct_descr *dp;
	u64 dflags;
	u64 dflags, mactx, ptr;
	dma_addr_t map;
	int flags;

@@ -976,6 +978,9 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
	if (dma_mapping_error(map))
		return NETDEV_TX_BUSY;

	mactx = dflags | XCT_MACTX_LLEN(skb->len);
	ptr   = XCT_PTR_LEN(skb->len) | XCT_PTR_ADDR(map);

	txring = mac->tx;

	spin_lock_irqsave(&txring->lock, flags);
@@ -996,12 +1001,11 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
		}
	}


	dp = &TX_DESC(mac, txring->next_to_use);
	info = &TX_DESC_INFO(mac, txring->next_to_use);

	dp->mactx = dflags | XCT_MACTX_LLEN(skb->len);
	dp->ptr   = XCT_PTR_LEN(skb->len) | XCT_PTR_ADDR(map);
	dp->mactx = mactx;
	dp->ptr   = ptr;
	info->dma = map;
	info->skb = skb;