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; }
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; }
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; }