diff options
Diffstat (limited to 'drivers/net/ethernet/pensando/ionic/ionic_ethtool.c')
| -rw-r--r-- | drivers/net/ethernet/pensando/ionic/ionic_ethtool.c | 59 | 
1 files changed, 22 insertions, 37 deletions
| diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c index f7e3ce3de04d..095561924bdc 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c @@ -103,15 +103,18 @@ static void ionic_get_regs(struct net_device *netdev, struct ethtool_regs *regs,  			   void *p)  {  	struct ionic_lif *lif = netdev_priv(netdev); +	unsigned int offset;  	unsigned int size;  	regs->version = IONIC_DEV_CMD_REG_VERSION; +	offset = 0;  	size = IONIC_DEV_INFO_REG_COUNT * sizeof(u32); -	memcpy_fromio(p, lif->ionic->idev.dev_info_regs->words, size); +	memcpy_fromio(p + offset, lif->ionic->idev.dev_info_regs->words, size); +	offset += size;  	size = IONIC_DEV_CMD_REG_COUNT * sizeof(u32); -	memcpy_fromio(p, lif->ionic->idev.dev_cmd_regs->words, size); +	memcpy_fromio(p + offset, lif->ionic->idev.dev_cmd_regs->words, size);  }  static int ionic_get_link_ksettings(struct net_device *netdev, @@ -468,12 +471,18 @@ static void ionic_get_ringparam(struct net_device *netdev,  	ring->rx_pending = lif->nrxq_descs;  } +static void ionic_set_ringsize(struct ionic_lif *lif, void *arg) +{ +	struct ethtool_ringparam *ring = arg; + +	lif->ntxq_descs = ring->tx_pending; +	lif->nrxq_descs = ring->rx_pending; +} +  static int ionic_set_ringparam(struct net_device *netdev,  			       struct ethtool_ringparam *ring)  {  	struct ionic_lif *lif = netdev_priv(netdev); -	bool running; -	int err;  	if (ring->rx_mini_pending || ring->rx_jumbo_pending) {  		netdev_info(netdev, "Changing jumbo or mini descriptors not supported\n"); @@ -491,22 +500,7 @@ static int ionic_set_ringparam(struct net_device *netdev,  	    ring->rx_pending == lif->nrxq_descs)  		return 0; -	err = ionic_wait_for_bit(lif, IONIC_LIF_F_QUEUE_RESET); -	if (err) -		return err; - -	running = test_bit(IONIC_LIF_F_UP, lif->state); -	if (running) -		ionic_stop(netdev); - -	lif->ntxq_descs = ring->tx_pending; -	lif->nrxq_descs = ring->rx_pending; - -	if (running) -		ionic_open(netdev); -	clear_bit(IONIC_LIF_F_QUEUE_RESET, lif->state); - -	return 0; +	return ionic_reset_queues(lif, ionic_set_ringsize, ring);  }  static void ionic_get_channels(struct net_device *netdev, @@ -521,12 +515,17 @@ static void ionic_get_channels(struct net_device *netdev,  	ch->combined_count = lif->nxqs;  } +static void ionic_set_queuecount(struct ionic_lif *lif, void *arg) +{ +	struct ethtool_channels *ch = arg; + +	lif->nxqs = ch->combined_count; +} +  static int ionic_set_channels(struct net_device *netdev,  			      struct ethtool_channels *ch)  {  	struct ionic_lif *lif = netdev_priv(netdev); -	bool running; -	int err;  	if (!ch->combined_count || ch->other_count ||  	    ch->rx_count || ch->tx_count) @@ -535,21 +534,7 @@ static int ionic_set_channels(struct net_device *netdev,  	if (ch->combined_count == lif->nxqs)  		return 0; -	err = ionic_wait_for_bit(lif, IONIC_LIF_F_QUEUE_RESET); -	if (err) -		return err; - -	running = test_bit(IONIC_LIF_F_UP, lif->state); -	if (running) -		ionic_stop(netdev); - -	lif->nxqs = ch->combined_count; - -	if (running) -		ionic_open(netdev); -	clear_bit(IONIC_LIF_F_QUEUE_RESET, lif->state); - -	return 0; +	return ionic_reset_queues(lif, ionic_set_queuecount, ch);  }  static u32 ionic_get_priv_flags(struct net_device *netdev) |