diff options
Diffstat (limited to 'drivers/net/ethernet/ti/cpsw_ethtool.c')
| -rw-r--r-- | drivers/net/ethernet/ti/cpsw_ethtool.c | 42 | 
1 files changed, 19 insertions, 23 deletions
diff --git a/drivers/net/ethernet/ti/cpsw_ethtool.c b/drivers/net/ethernet/ti/cpsw_ethtool.c index a4a7ec0d2531..f60dc1dfc443 100644 --- a/drivers/net/ethernet/ti/cpsw_ethtool.c +++ b/drivers/net/ethernet/ti/cpsw_ethtool.c @@ -458,21 +458,22 @@ int cpsw_nway_reset(struct net_device *ndev)  static void cpsw_suspend_data_pass(struct net_device *ndev)  {  	struct cpsw_common *cpsw = ndev_to_cpsw(ndev); -	struct cpsw_slave *slave;  	int i;  	/* Disable NAPI scheduling */  	cpsw_intr_disable(cpsw);  	/* Stop all transmit queues for every network device. -	 * Disable re-using rx descriptors with dormant_on.  	 */ -	for (i = cpsw->data.slaves, slave = cpsw->slaves; i; i--, slave++) { -		if (!(slave->ndev && netif_running(slave->ndev))) +	for (i = 0; i < cpsw->data.slaves; i++) { +		ndev = cpsw->slaves[i].ndev; +		if (!(ndev && netif_running(ndev)))  			continue; -		netif_tx_stop_all_queues(slave->ndev); -		netif_dormant_on(slave->ndev); +		netif_tx_stop_all_queues(ndev); + +		/* Barrier, so that stop_queue visible to other cpus */ +		smp_mb__after_atomic();  	}  	/* Handle rest of tx packets and stop cpdma channels */ @@ -483,14 +484,8 @@ static int cpsw_resume_data_pass(struct net_device *ndev)  {  	struct cpsw_priv *priv = netdev_priv(ndev);  	struct cpsw_common *cpsw = priv->cpsw; -	struct cpsw_slave *slave;  	int i, ret; -	/* Allow rx packets handling */ -	for (i = cpsw->data.slaves, slave = cpsw->slaves; i; i--, slave++) -		if (slave->ndev && netif_running(slave->ndev)) -			netif_dormant_off(slave->ndev); -  	/* After this receive is started */  	if (cpsw->usage_count) {  		ret = cpsw_fill_rx_channels(priv); @@ -502,9 +497,11 @@ static int cpsw_resume_data_pass(struct net_device *ndev)  	}  	/* Resume transmit for every affected interface */ -	for (i = cpsw->data.slaves, slave = cpsw->slaves; i; i--, slave++) -		if (slave->ndev && netif_running(slave->ndev)) -			netif_tx_start_all_queues(slave->ndev); +	for (i = 0; i < cpsw->data.slaves; i++) { +		ndev = cpsw->slaves[i].ndev; +		if (ndev && netif_running(ndev)) +			netif_tx_start_all_queues(ndev); +	}  	return 0;  } @@ -587,7 +584,7 @@ int cpsw_set_channels_common(struct net_device *ndev,  {  	struct cpsw_priv *priv = netdev_priv(ndev);  	struct cpsw_common *cpsw = priv->cpsw; -	struct cpsw_slave *slave; +	struct net_device *sl_ndev;  	int i, ret;  	ret = cpsw_check_ch_settings(cpsw, chs); @@ -604,20 +601,19 @@ int cpsw_set_channels_common(struct net_device *ndev,  	if (ret)  		goto err; -	for (i = cpsw->data.slaves, slave = cpsw->slaves; i; i--, slave++) { -		if (!(slave->ndev && netif_running(slave->ndev))) +	for (i = 0; i < cpsw->data.slaves; i++) { +		sl_ndev = cpsw->slaves[i].ndev; +		if (!(sl_ndev && netif_running(sl_ndev)))  			continue;  		/* Inform stack about new count of queues */ -		ret = netif_set_real_num_tx_queues(slave->ndev, -						   cpsw->tx_ch_num); +		ret = netif_set_real_num_tx_queues(sl_ndev, cpsw->tx_ch_num);  		if (ret) {  			dev_err(priv->dev, "cannot set real number of tx queues\n");  			goto err;  		} -		ret = netif_set_real_num_rx_queues(slave->ndev, -						   cpsw->rx_ch_num); +		ret = netif_set_real_num_rx_queues(sl_ndev, cpsw->rx_ch_num);  		if (ret) {  			dev_err(priv->dev, "cannot set real number of rx queues\n");  			goto err; @@ -643,7 +639,7 @@ void cpsw_get_ringparam(struct net_device *ndev,  	struct cpsw_common *cpsw = priv->cpsw;  	/* not supported */ -	ering->tx_max_pending = 0; +	ering->tx_max_pending = cpsw->descs_pool_size - CPSW_MAX_QUEUES;  	ering->tx_pending = cpdma_get_num_tx_descs(cpsw->dma);  	ering->rx_max_pending = cpsw->descs_pool_size - CPSW_MAX_QUEUES;  	ering->rx_pending = cpdma_get_num_rx_descs(cpsw->dma);  | 

