diff options
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
| -rw-r--r-- | drivers/net/ethernet/broadcom/tg3.c | 18 | 
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 062ac333fde..ceeab8e852e 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c @@ -879,8 +879,13 @@ static inline unsigned int tg3_has_work(struct tg3_napi *tnapi)  		if (sblk->status & SD_STATUS_LINK_CHG)  			work_exists = 1;  	} -	/* check for RX/TX work to do */ -	if (sblk->idx[0].tx_consumer != tnapi->tx_cons || + +	/* check for TX work to do */ +	if (sblk->idx[0].tx_consumer != tnapi->tx_cons) +		work_exists = 1; + +	/* check for RX work to do */ +	if (tnapi->rx_rcb_prod_idx &&  	    *(tnapi->rx_rcb_prod_idx) != tnapi->rx_rcb_ptr)  		work_exists = 1; @@ -6124,6 +6129,9 @@ static int tg3_poll_work(struct tg3_napi *tnapi, int work_done, int budget)  			return work_done;  	} +	if (!tnapi->rx_rcb_prod_idx) +		return work_done; +  	/* run RX thread, within the bounds set by NAPI.  	 * All RX "locking" is done by ensuring outside  	 * code synchronizes with tg3->napi.poll() @@ -7567,6 +7575,12 @@ static int tg3_alloc_consistent(struct tg3 *tp)  		 */  		switch (i) {  		default: +			if (tg3_flag(tp, ENABLE_RSS)) { +				tnapi->rx_rcb_prod_idx = NULL; +				break; +			} +			/* Fall through */ +		case 1:  			tnapi->rx_rcb_prod_idx = &sblk->idx[0].rx_producer;  			break;  		case 2:  |