Example #1
0
static int ixgbe_set_pauseparam(struct net_device *netdev,
                                struct ethtool_pauseparam *pause)
{
	struct ixgbe_adapter *adapter = netdev_priv(netdev);
	struct ixgbe_hw *hw = &adapter->hw;

	if ((pause->autoneg == AUTONEG_ENABLE) ||
	    (pause->rx_pause && pause->tx_pause))
		hw->fc.type = ixgbe_fc_full;
	else if (pause->rx_pause && !pause->tx_pause)
		hw->fc.type = ixgbe_fc_rx_pause;
	else if (!pause->rx_pause && pause->tx_pause)
		hw->fc.type = ixgbe_fc_tx_pause;
	else if (!pause->rx_pause && !pause->tx_pause)
		hw->fc.type = ixgbe_fc_none;
	else
		return -EINVAL;

	hw->fc.original_type = hw->fc.type;

	if (netif_running(netdev))
		ixgbe_reinit_locked(adapter);
	else
		ixgbe_reset(adapter);

	return 0;
}
Example #2
0
static int ixgbe_set_rx_csum(struct net_device *netdev, u32 data)
{
	struct ixgbe_adapter *adapter = netdev_priv(netdev);
	if (data)
		adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED;
	else
		adapter->flags &= ~IXGBE_FLAG_RX_CSUM_ENABLED;

	if (netif_running(netdev))
		ixgbe_reinit_locked(adapter);
	else
		ixgbe_reset(adapter);

	return 0;
}
Example #3
0
static int ixgbe_dcb_sstate(struct sk_buff *skb, struct genl_info *info)
{
	struct net_device *netdev = NULL;
	struct ixgbe_adapter *adapter = NULL;
	int ret = -EINVAL;
	u8 value;

	if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_STATE])
		goto err;

	netdev = dev_get_by_name(&init_net,
				 nla_data(info->attrs[DCB_A_IFNAME]));
	if (!netdev)
		goto err;

	ret = ixgbe_dcb_check_adapter(netdev);
	if (ret)
		goto err_out;
	else
		adapter = netdev_priv(netdev);

	value = nla_get_u8(info->attrs[DCB_A_STATE]);
	if ((value & 1) != value) {
		DPRINTK(DRV, ERR, "Value is not 1 or 0, it is %d.\n", value);
	} else {
		switch (value) {
		case 0:
			if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
				if (netdev->flags & IFF_UP)
#ifdef HAVE_NET_DEVICE_OPS
					netdev->netdev_ops->ndo_stop(netdev);
#else
					netdev->stop(netdev);
#endif
				ixgbe_clear_interrupt_scheme(adapter);

				adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
				if (adapter->flags & IXGBE_FLAG_RSS_CAPABLE)
					adapter->flags |=
					                 IXGBE_FLAG_RSS_ENABLED;
				ixgbe_init_interrupt_scheme(adapter);
				ixgbe_reset(adapter);
				if (netdev->flags & IFF_UP)
#ifdef HAVE_NET_DEVICE_OPS
					netdev->netdev_ops->ndo_open(netdev);
#else
					netdev->open(netdev);
#endif
				break;
			} else {
				/* Nothing to do, already off */
				goto out;
			}
		case 1:
			if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
				/* Nothing to do, already on */
				goto out;
			} else if (!(adapter->flags & IXGBE_FLAG_DCB_CAPABLE)) {
				DPRINTK(DRV, ERR, "Enable failed.  Make sure "
				        "the driver can enable MSI-X.\n");
				ret = -EINVAL;
				goto err_out;
			} else {
				if (netdev->flags & IFF_UP)
#ifdef HAVE_NET_DEVICE_OPS
					netdev->netdev_ops->ndo_stop(netdev);
#else
					netdev->stop(netdev);
#endif
				ixgbe_clear_interrupt_scheme(adapter);

				adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
				adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
				adapter->dcb_cfg.support.capabilities =
				 (IXGBE_DCB_PG_SUPPORT | IXGBE_DCB_PFC_SUPPORT |
				  IXGBE_DCB_GSP_SUPPORT);
				if (adapter->hw.mac.type == ixgbe_mac_82599EB) {
					DPRINTK(DRV, INFO, "DCB enabled, "
					        "disabling Flow Director\n");
					adapter->flags &=
					          ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
					adapter->flags &=
					       ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
					adapter->dcb_cfg.support.capabilities |=
					                IXGBE_DCB_UP2TC_SUPPORT;
				}
				adapter->ring_feature[RING_F_DCB].indices = 8;
				ixgbe_init_interrupt_scheme(adapter);
				ixgbe_reset(adapter);
				if (netdev->flags & IFF_UP)
#ifdef HAVE_NET_DEVICE_OPS
					netdev->netdev_ops->ndo_open(netdev);
#else
					netdev->open(netdev);
#endif
				break;
			}
		}
	}

out:
	ret = ixgbe_nl_reply(0, DCB_C_SSTATE, DCB_A_STATE, info);
	if (ret)
		goto err_out;

err_out:
	dev_put(netdev);
err:
	return ret;
}