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

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

Signed-off-by: default avatarKrzysztof Hałasa <khc@pm.waw.pl>
parent a6a9fb85
...@@ -456,7 +456,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys, ...@@ -456,7 +456,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys,
debug_desc(phys, desc); debug_desc(phys, desc);
BUG_ON(phys & 0x1F); BUG_ON(phys & 0x1F);
qmgr_put_entry(queue, phys); 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) ...@@ -512,8 +513,8 @@ static int eth_poll(struct napi_struct *napi, int budget)
#endif #endif
napi_complete(napi); napi_complete(napi);
qmgr_enable_irq(rxq); qmgr_enable_irq(rxq);
if (!qmgr_stat_empty(rxq) && if (!qmgr_stat_nearly_empty(rxq) &&
napi_reschedule(napi)) { napi_reschedule(napi)) { /* really empty in fact */
#if DEBUG_RX #if DEBUG_RX
printk(KERN_DEBUG "%s: eth_poll" printk(KERN_DEBUG "%s: eth_poll"
" napi_reschedule successed\n", " napi_reschedule successed\n",
...@@ -630,7 +631,8 @@ static void eth_txdone_irq(void *unused) ...@@ -630,7 +631,8 @@ static void eth_txdone_irq(void *unused)
port->tx_buff_tab[n_desc] = NULL; 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); queue_put_desc(port->plat->txreadyq, phys, desc);
if (start) { if (start) {
#if DEBUG_TX #if DEBUG_TX
...@@ -708,13 +710,14 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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); queue_put_desc(TX_QUEUE(port->id), tx_desc_phys(port, n), desc);
dev->trans_start = jiffies; dev->trans_start = jiffies;
if (qmgr_stat_empty(txreadyq)) { if (qmgr_stat_nearly_empty(txreadyq)) { /* really empty in fact */
#if DEBUG_TX #if DEBUG_TX
printk(KERN_DEBUG "%s: eth_xmit queue full\n", dev->name); printk(KERN_DEBUG "%s: eth_xmit queue full\n", dev->name);
#endif #endif
netif_stop_queue(dev); netif_stop_queue(dev);
/* we could miss TX ready interrupt */ /* we could miss TX ready interrupt */
if (!qmgr_stat_empty(txreadyq)) { /* really empty in fact */
if (!qmgr_stat_nearly_empty(txreadyq)) {
#if DEBUG_TX #if DEBUG_TX
printk(KERN_DEBUG "%s: eth_xmit ready again\n", printk(KERN_DEBUG "%s: eth_xmit ready again\n",
dev->name); dev->name);
......
...@@ -579,7 +579,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys, ...@@ -579,7 +579,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys,
debug_desc(phys, desc); debug_desc(phys, desc);
BUG_ON(phys & 0x1F); BUG_ON(phys & 0x1F);
qmgr_put_entry(queue, phys); 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) ...@@ -789,7 +790,8 @@ static void hss_hdlc_txdone_irq(void *pdev)
free_buffer_irq(port->tx_buff_tab[n_desc]); free_buffer_irq(port->tx_buff_tab[n_desc]);
port->tx_buff_tab[n_desc] = NULL; 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, queue_put_desc(port->plat->txreadyq,
tx_desc_phys(port, n_desc), desc); tx_desc_phys(port, n_desc), desc);
if (start) { if (start) {
...@@ -867,13 +869,13 @@ static int hss_hdlc_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -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); queue_put_desc(queue_ids[port->id].tx, tx_desc_phys(port, n), desc);
dev->trans_start = jiffies; dev->trans_start = jiffies;
if (qmgr_stat_empty(txreadyq)) { if (qmgr_stat_nearly_empty(txreadyq)) { /* really empty in fact */
#if DEBUG_TX #if DEBUG_TX
printk(KERN_DEBUG "%s: hss_hdlc_xmit queue full\n", dev->name); printk(KERN_DEBUG "%s: hss_hdlc_xmit queue full\n", dev->name);
#endif #endif
netif_stop_queue(dev); netif_stop_queue(dev);
/* we could miss TX ready interrupt */ /* we could miss TX ready interrupt */
if (!qmgr_stat_empty(txreadyq)) { if (!qmgr_stat_nearly_empty(txreadyq)) {
#if DEBUG_TX #if DEBUG_TX
printk(KERN_DEBUG "%s: hss_hdlc_xmit ready again\n", printk(KERN_DEBUG "%s: hss_hdlc_xmit ready again\n",
dev->name); dev->name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment