|  | @@ -590,17 +590,22 @@ jme_disable_rx_engine(struct jme_adapter *jme)
 | 
		
	
		
			
			| 590 | 590 |  }
 | 
		
	
		
			
			| 591 | 591 |  
 | 
		
	
		
			
			| 592 | 592 |  static void
 | 
		
	
		
			
			| 593 |  | -jme_refill_rx_ring(struct jme_adapter *jme)
 | 
		
	
		
			
			|  | 593 | +jme_refill_rx_ring(struct jme_adapter *jme, int curhole)
 | 
		
	
		
			
			| 594 | 594 |  {
 | 
		
	
		
			
			| 595 | 595 |  	struct jme_ring *rxring = &jme->rxring;
 | 
		
	
		
			
			| 596 | 596 |  	int i = rxring->next_to_fill;
 | 
		
	
		
			
			| 597 | 597 |  	struct io_buffer **bufinf = rxring->bufinf;
 | 
		
	
		
			
			| 598 | 598 |  	int mask = jme->rx_ring_mask;
 | 
		
	
		
			
			|  | 599 | +	int limit = jme->rx_ring_size;
 | 
		
	
		
			
			| 599 | 600 |  
 | 
		
	
		
			
			| 600 |  | -	while (!bufinf[i]) {
 | 
		
	
		
			
			| 601 |  | -		if (jme_make_new_rx_buf(bufinf + i))
 | 
		
	
		
			
			| 602 |  | -			break;
 | 
		
	
		
			
			| 603 |  | -		jme_set_clean_rxdesc(jme, i);
 | 
		
	
		
			
			|  | 601 | +	while (limit--) {
 | 
		
	
		
			
			|  | 602 | +		if (!bufinf[i]) {
 | 
		
	
		
			
			|  | 603 | +			if (jme_make_new_rx_buf(bufinf + i))
 | 
		
	
		
			
			|  | 604 | +				break;
 | 
		
	
		
			
			|  | 605 | +			jme_set_clean_rxdesc(jme, i);
 | 
		
	
		
			
			|  | 606 | +		}
 | 
		
	
		
			
			|  | 607 | +		if (i == curhole)
 | 
		
	
		
			
			|  | 608 | +			limit = 0;
 | 
		
	
		
			
			| 604 | 609 |  		i = (i + 1) & mask;
 | 
		
	
		
			
			| 605 | 610 |  	}
 | 
		
	
		
			
			| 606 | 611 |  	rxring->next_to_fill = i;
 | 
		
	
	
		
			
			|  | @@ -622,7 +627,7 @@ jme_alloc_and_feed_iob(struct jme_adapter *jme, int idx)
 | 
		
	
		
			
			| 622 | 627 |  	netdev_rx(netdev, rxbi);
 | 
		
	
		
			
			| 623 | 628 |  
 | 
		
	
		
			
			| 624 | 629 |  	rxring->bufinf[idx] = NULL;
 | 
		
	
		
			
			| 625 |  | -	jme_refill_rx_ring(jme);
 | 
		
	
		
			
			|  | 630 | +	jme_refill_rx_ring(jme, idx);
 | 
		
	
		
			
			| 626 | 631 |  }
 | 
		
	
		
			
			| 627 | 632 |  
 | 
		
	
		
			
			| 628 | 633 |  static void
 | 
		
	
	
		
			
			|  | @@ -636,7 +641,8 @@ jme_process_receive(struct jme_adapter *jme)
 | 
		
	
		
			
			| 636 | 641 |  
 | 
		
	
		
			
			| 637 | 642 |  	i = rxring->next_to_clean;
 | 
		
	
		
			
			| 638 | 643 |  	rxdesc += i;
 | 
		
	
		
			
			| 639 |  | -	while (!(rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) &&
 | 
		
	
		
			
			|  | 644 | +	while (rxring->bufinf[i] &&
 | 
		
	
		
			
			|  | 645 | +		!(rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) &&
 | 
		
	
		
			
			| 640 | 646 |  		(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL) &&
 | 
		
	
		
			
			| 641 | 647 |  		limit--) {
 | 
		
	
		
			
			| 642 | 648 |  
 |