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

Commit 6a68afe3 authored by Krzysztof Hałasa's avatar Krzysztof Hałasa
Browse files

IXP4xx: Ethernet and WAN drivers now support "high" hardware queues.



Signed-off-by: default avatarKrzysztof Hałasa <khc@pm.waw.pl>
parent a6a9fb85
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -456,7 +456,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys,
	debug_desc(phys, desc);
	BUG_ON(phys & 0x1F);
	qmgr_put_entry(queue, phys);
	BUG_ON(qmgr_stat_overflow(queue));
	/* Don't check for queue overflow here, we've allocated sufficient
	   length and queues >= 32 don't support this check anyway. */
}


@@ -512,8 +513,8 @@ static int eth_poll(struct napi_struct *napi, int budget)
#endif
			napi_complete(napi);
			qmgr_enable_irq(rxq);
			if (!qmgr_stat_empty(rxq) &&
			    napi_reschedule(napi)) {
			if (!qmgr_stat_nearly_empty(rxq) &&
			    napi_reschedule(napi)) { /* really empty in fact */
#if DEBUG_RX
				printk(KERN_DEBUG "%s: eth_poll"
				       " napi_reschedule successed\n",
@@ -630,7 +631,8 @@ static void eth_txdone_irq(void *unused)
			port->tx_buff_tab[n_desc] = NULL;
		}

		start = qmgr_stat_empty(port->plat->txreadyq);
		/* really empty in fact */
		start = qmgr_stat_nearly_empty(port->plat->txreadyq);
		queue_put_desc(port->plat->txreadyq, phys, desc);
		if (start) {
#if DEBUG_TX
@@ -708,13 +710,14 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev)
	queue_put_desc(TX_QUEUE(port->id), tx_desc_phys(port, n), desc);
	dev->trans_start = jiffies;

	if (qmgr_stat_empty(txreadyq)) {
	if (qmgr_stat_nearly_empty(txreadyq)) { /* really empty in fact */
#if DEBUG_TX
		printk(KERN_DEBUG "%s: eth_xmit queue full\n", dev->name);
#endif
		netif_stop_queue(dev);
		/* we could miss TX ready interrupt */
		if (!qmgr_stat_empty(txreadyq)) {
		/* really empty in fact */
		if (!qmgr_stat_nearly_empty(txreadyq)) {
#if DEBUG_TX
			printk(KERN_DEBUG "%s: eth_xmit ready again\n",
			       dev->name);
+6 −4
Original line number Diff line number Diff line
@@ -579,7 +579,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys,
	debug_desc(phys, desc);
	BUG_ON(phys & 0x1F);
	qmgr_put_entry(queue, phys);
	BUG_ON(qmgr_stat_overflow(queue));
	/* Don't check for queue overflow here, we've allocated sufficient
	   length and queues >= 32 don't support this check anyway. */
}


@@ -789,7 +790,8 @@ static void hss_hdlc_txdone_irq(void *pdev)
		free_buffer_irq(port->tx_buff_tab[n_desc]);
		port->tx_buff_tab[n_desc] = NULL;

		start = qmgr_stat_empty(port->plat->txreadyq);
		/* really empty in fact */
		start = qmgr_stat_nearly_empty(port->plat->txreadyq);
		queue_put_desc(port->plat->txreadyq,
			       tx_desc_phys(port, n_desc), desc);
		if (start) {
@@ -867,13 +869,13 @@ static int hss_hdlc_xmit(struct sk_buff *skb, struct net_device *dev)
	queue_put_desc(queue_ids[port->id].tx, tx_desc_phys(port, n), desc);
	dev->trans_start = jiffies;

	if (qmgr_stat_empty(txreadyq)) {
	if (qmgr_stat_nearly_empty(txreadyq)) { /* really empty in fact */
#if DEBUG_TX
		printk(KERN_DEBUG "%s: hss_hdlc_xmit queue full\n", dev->name);
#endif
		netif_stop_queue(dev);
		/* we could miss TX ready interrupt */
		if (!qmgr_stat_empty(txreadyq)) {
		if (!qmgr_stat_nearly_empty(txreadyq)) {
#if DEBUG_TX
			printk(KERN_DEBUG "%s: hss_hdlc_xmit ready again\n",
			       dev->name);