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

Commit 4e4a4f14 authored by David Daney's avatar David Daney Committed by David S. Miller
Browse files

netdev: octeon_mgmt: Try not to drop TX packets when stopping the queue.



Stop the queue when we add the packet that will fill it instead of dropping the packet

Signed-off-by: default avatarDavid Daney <ddaney@caviumnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b635e069
Loading
Loading
Loading
Loading
+11 −5
Original line number Original line Diff line number Diff line
@@ -955,6 +955,7 @@ static int octeon_mgmt_xmit(struct sk_buff *skb, struct net_device *netdev)
	int port = p->port;
	int port = p->port;
	union mgmt_port_ring_entry re;
	union mgmt_port_ring_entry re;
	unsigned long flags;
	unsigned long flags;
	int rv = NETDEV_TX_BUSY;


	re.d64 = 0;
	re.d64 = 0;
	re.s.len = skb->len;
	re.s.len = skb->len;
@@ -964,15 +965,18 @@ static int octeon_mgmt_xmit(struct sk_buff *skb, struct net_device *netdev)


	spin_lock_irqsave(&p->tx_list.lock, flags);
	spin_lock_irqsave(&p->tx_list.lock, flags);


	if (unlikely(p->tx_current_fill >= ring_max_fill(OCTEON_MGMT_TX_RING_SIZE) - 1)) {
		spin_unlock_irqrestore(&p->tx_list.lock, flags);
		netif_stop_queue(netdev);
		spin_lock_irqsave(&p->tx_list.lock, flags);
	}

	if (unlikely(p->tx_current_fill >=
	if (unlikely(p->tx_current_fill >=
		     ring_max_fill(OCTEON_MGMT_TX_RING_SIZE))) {
		     ring_max_fill(OCTEON_MGMT_TX_RING_SIZE))) {
		spin_unlock_irqrestore(&p->tx_list.lock, flags);
		spin_unlock_irqrestore(&p->tx_list.lock, flags);

		dma_unmap_single(p->dev, re.s.addr, re.s.len,
		dma_unmap_single(p->dev, re.s.addr, re.s.len,
				 DMA_TO_DEVICE);
				 DMA_TO_DEVICE);

		goto out;
		netif_stop_queue(netdev);
		return NETDEV_TX_BUSY;
	}
	}


	__skb_queue_tail(&p->tx_list, skb);
	__skb_queue_tail(&p->tx_list, skb);
@@ -995,8 +999,10 @@ static int octeon_mgmt_xmit(struct sk_buff *skb, struct net_device *netdev)
	cvmx_write_csr(CVMX_MIXX_ORING2(port), 1);
	cvmx_write_csr(CVMX_MIXX_ORING2(port), 1);


	netdev->trans_start = jiffies;
	netdev->trans_start = jiffies;
	rv = NETDEV_TX_OK;
out:
	octeon_mgmt_update_tx_stats(netdev);
	octeon_mgmt_update_tx_stats(netdev);
	return NETDEV_TX_OK;
	return rv;
}
}


#ifdef CONFIG_NET_POLL_CONTROLLER
#ifdef CONFIG_NET_POLL_CONTROLLER