forked from mirrors/linux
		
	tsnep: Fix TX queue stop/wake for multiple queues
netif_stop_queue() and netif_wake_queue() act on TX queue 0. This is ok as long as only a single TX queue is supported. But support for multiple TX queues was introduced with762031375dand I missed to adapt stop and wake of TX queues. Use netif_stop_subqueue() and netif_tx_wake_queue() to act on specific TX queue. Fixes:762031375d("tsnep: Support multiple TX/RX queue pairs") Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com> Link: https://lore.kernel.org/r/20230124191440.56887-1-gerhard@engleder-embedded.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									6c4ca03bd8
								
							
						
					
					
						commit
						3d53aaef43
					
				
					 1 changed files with 9 additions and 6 deletions
				
			
		| 
						 | 
					@ -450,7 +450,7 @@ static netdev_tx_t tsnep_xmit_frame_ring(struct sk_buff *skb,
 | 
				
			||||||
		/* ring full, shall not happen because queue is stopped if full
 | 
							/* ring full, shall not happen because queue is stopped if full
 | 
				
			||||||
		 * below
 | 
							 * below
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		netif_stop_queue(tx->adapter->netdev);
 | 
							netif_stop_subqueue(tx->adapter->netdev, tx->queue_index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spin_unlock_irqrestore(&tx->lock, flags);
 | 
							spin_unlock_irqrestore(&tx->lock, flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -493,7 +493,7 @@ static netdev_tx_t tsnep_xmit_frame_ring(struct sk_buff *skb,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (tsnep_tx_desc_available(tx) < (MAX_SKB_FRAGS + 1)) {
 | 
						if (tsnep_tx_desc_available(tx) < (MAX_SKB_FRAGS + 1)) {
 | 
				
			||||||
		/* ring can get full with next frame */
 | 
							/* ring can get full with next frame */
 | 
				
			||||||
		netif_stop_queue(tx->adapter->netdev);
 | 
							netif_stop_subqueue(tx->adapter->netdev, tx->queue_index);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_unlock_irqrestore(&tx->lock, flags);
 | 
						spin_unlock_irqrestore(&tx->lock, flags);
 | 
				
			||||||
| 
						 | 
					@ -503,11 +503,14 @@ static netdev_tx_t tsnep_xmit_frame_ring(struct sk_buff *skb,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool tsnep_tx_poll(struct tsnep_tx *tx, int napi_budget)
 | 
					static bool tsnep_tx_poll(struct tsnep_tx *tx, int napi_budget)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						struct tsnep_tx_entry *entry;
 | 
				
			||||||
 | 
						struct netdev_queue *nq;
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	int budget = 128;
 | 
						int budget = 128;
 | 
				
			||||||
	struct tsnep_tx_entry *entry;
 | 
					 | 
				
			||||||
	int count;
 | 
					 | 
				
			||||||
	int length;
 | 
						int length;
 | 
				
			||||||
 | 
						int count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nq = netdev_get_tx_queue(tx->adapter->netdev, tx->queue_index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_lock_irqsave(&tx->lock, flags);
 | 
						spin_lock_irqsave(&tx->lock, flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -564,8 +567,8 @@ static bool tsnep_tx_poll(struct tsnep_tx *tx, int napi_budget)
 | 
				
			||||||
	} while (likely(budget));
 | 
						} while (likely(budget));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((tsnep_tx_desc_available(tx) >= ((MAX_SKB_FRAGS + 1) * 2)) &&
 | 
						if ((tsnep_tx_desc_available(tx) >= ((MAX_SKB_FRAGS + 1) * 2)) &&
 | 
				
			||||||
	    netif_queue_stopped(tx->adapter->netdev)) {
 | 
						    netif_tx_queue_stopped(nq)) {
 | 
				
			||||||
		netif_wake_queue(tx->adapter->netdev);
 | 
							netif_tx_wake_queue(nq);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_unlock_irqrestore(&tx->lock, flags);
 | 
						spin_unlock_irqrestore(&tx->lock, flags);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue