static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) { struct ixgbe_adapter *adapter = netdev_priv(netdev); int ret; adapter->dcb_set_bitmap &= ~BIT_BCN; /* no set for BCN */ if (!adapter->dcb_set_bitmap) return 1; while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) msleep(1); if (netif_running(netdev)) ixgbe_down(adapter); ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, adapter->ring_feature[RING_F_DCB].indices); if (ret) { clear_bit(__IXGBE_RESETTING, &adapter->state); return ret; } if (netif_running(netdev)) ixgbe_up(adapter); adapter->dcb_set_bitmap = 0x00; clear_bit(__IXGBE_RESETTING, &adapter->state); return ret; }
static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) { struct ixgbe_adapter *adapter = netdev_priv(netdev); int ret; if (!adapter->dcb_set_bitmap) return DCB_NO_HW_CHG; if (adapter->dcb_set_bitmap & BIT_RESETLINK) { while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) msleep(1); if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) { if (netif_running(netdev)) netdev->netdev_ops->ndo_stop(netdev); ixgbe_clear_interrupt_scheme(adapter); } else { if (netif_running(netdev)) ixgbe_down(adapter); } } ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, adapter->ring_feature[RING_F_DCB].indices); if (ret) { if (adapter->dcb_set_bitmap & BIT_RESETLINK) clear_bit(__IXGBE_RESETTING, &adapter->state); return DCB_NO_HW_CHG; } if (adapter->dcb_cfg.pfc_mode_enable) { if ((adapter->hw.mac.type != ixgbe_mac_82598EB) && (adapter->hw.fc.current_mode != ixgbe_fc_pfc)) adapter->last_lfc_mode = adapter->hw.fc.current_mode; adapter->hw.fc.requested_mode = ixgbe_fc_pfc; } else { if (adapter->hw.mac.type != ixgbe_mac_82598EB) adapter->hw.fc.requested_mode = adapter->last_lfc_mode; else adapter->hw.fc.requested_mode = ixgbe_fc_none; } if (adapter->dcb_set_bitmap & BIT_RESETLINK) { if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) { ixgbe_init_interrupt_scheme(adapter); if (netif_running(netdev)) netdev->netdev_ops->ndo_open(netdev); } else { if (netif_running(netdev)) ixgbe_up(adapter); } ret = DCB_HW_CHG_RST; } else if (adapter->dcb_set_bitmap & BIT_PFC) { if (adapter->hw.mac.type == ixgbe_mac_82598EB) ixgbe_dcb_config_pfc_82598(&adapter->hw, &adapter->dcb_cfg); else if (adapter->hw.mac.type == ixgbe_mac_82599EB) ixgbe_dcb_config_pfc_82599(&adapter->hw, &adapter->dcb_cfg); ret = DCB_HW_CHG; } if (adapter->dcb_cfg.pfc_mode_enable) adapter->hw.fc.current_mode = ixgbe_fc_pfc; if (adapter->dcb_set_bitmap & BIT_RESETLINK) clear_bit(__IXGBE_RESETTING, &adapter->state); adapter->dcb_set_bitmap = 0x00; return ret; }
static int ixgbe_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring) { struct ixgbe_adapter *adapter = netdev_priv(netdev); struct ixgbe_ring *temp_ring; int i, err; u32 new_rx_count, new_tx_count; if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) return -EINVAL; new_rx_count = max(ring->rx_pending, (u32)IXGBE_MIN_RXD); new_rx_count = min(new_rx_count, (u32)IXGBE_MAX_RXD); new_rx_count = ALIGN(new_rx_count, IXGBE_REQ_RX_DESCRIPTOR_MULTIPLE); new_tx_count = max(ring->tx_pending, (u32)IXGBE_MIN_TXD); new_tx_count = min(new_tx_count, (u32)IXGBE_MAX_TXD); new_tx_count = ALIGN(new_tx_count, IXGBE_REQ_TX_DESCRIPTOR_MULTIPLE); if ((new_tx_count == adapter->tx_ring->count) && (new_rx_count == adapter->rx_ring->count)) { /* nothing to do */ return 0; } if (adapter->num_tx_queues > adapter->num_rx_queues) temp_ring = vmalloc(adapter->num_tx_queues * sizeof(struct ixgbe_ring)); else temp_ring = vmalloc(adapter->num_rx_queues * sizeof(struct ixgbe_ring)); if (!temp_ring) return -ENOMEM; while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) msleep(1); if (netif_running(netdev)) ixgbe_down(adapter); /* * We can't just free everything and then setup again, * because the ISRs in MSI-X mode get passed pointers * to the tx and rx ring structs. */ if (new_tx_count != adapter->tx_ring->count) { memcpy(temp_ring, adapter->tx_ring, adapter->num_tx_queues * sizeof(struct ixgbe_ring)); for (i = 0; i < adapter->num_tx_queues; i++) { temp_ring[i].count = new_tx_count; err = ixgbe_setup_tx_resources(adapter, &temp_ring[i]); if (err) { while (i) { i--; ixgbe_free_tx_resources(adapter, &temp_ring[i]); } goto err_setup; } } for (i = 0; i < adapter->num_tx_queues; i++) ixgbe_free_tx_resources(adapter, &adapter->tx_ring[i]); memcpy(adapter->tx_ring, temp_ring, adapter->num_tx_queues * sizeof(struct ixgbe_ring)); adapter->tx_ring_count = new_tx_count; } if (new_rx_count != adapter->rx_ring->count) { memcpy(temp_ring, adapter->rx_ring, adapter->num_rx_queues * sizeof(struct ixgbe_ring)); for (i = 0; i < adapter->num_rx_queues; i++) { temp_ring[i].count = new_rx_count; err = ixgbe_setup_rx_resources(adapter, &temp_ring[i]); if (err) { while (i) { i--; ixgbe_free_rx_resources(adapter, &temp_ring[i]); } goto err_setup; } } for (i = 0; i < adapter->num_rx_queues; i++) ixgbe_free_rx_resources(adapter, &adapter->rx_ring[i]); memcpy(adapter->rx_ring, temp_ring, adapter->num_rx_queues * sizeof(struct ixgbe_ring)); adapter->rx_ring_count = new_rx_count; } /* success! */ err = 0; err_setup: if (netif_running(netdev)) ixgbe_up(adapter); clear_bit(__IXGBE_RESETTING, &adapter->state); return err; }
static int ixgbe_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring) { struct ixgbe_adapter *adapter = netdev_priv(netdev); struct ixgbe_ring *temp_tx_ring, *temp_rx_ring; int i, err; u32 new_rx_count, new_tx_count; bool need_update = false; if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) return -EINVAL; new_rx_count = max(ring->rx_pending, (u32)IXGBE_MIN_RXD); new_rx_count = min(new_rx_count, (u32)IXGBE_MAX_RXD); new_rx_count = ALIGN(new_rx_count, IXGBE_REQ_RX_DESCRIPTOR_MULTIPLE); new_tx_count = max(ring->tx_pending, (u32)IXGBE_MIN_TXD); new_tx_count = min(new_tx_count, (u32)IXGBE_MAX_TXD); new_tx_count = ALIGN(new_tx_count, IXGBE_REQ_TX_DESCRIPTOR_MULTIPLE); if ((new_tx_count == adapter->tx_ring->count) && (new_rx_count == adapter->rx_ring->count)) { /* nothing to do */ return 0; } while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) msleep(1); temp_tx_ring = kcalloc(adapter->num_tx_queues, sizeof(struct ixgbe_ring), GFP_KERNEL); if (!temp_tx_ring) { err = -ENOMEM; goto err_setup; } if (new_tx_count != adapter->tx_ring_count) { memcpy(temp_tx_ring, adapter->tx_ring, adapter->num_tx_queues * sizeof(struct ixgbe_ring)); for (i = 0; i < adapter->num_tx_queues; i++) { temp_tx_ring[i].count = new_tx_count; err = ixgbe_setup_tx_resources(adapter, &temp_tx_ring[i]); if (err) { while (i) { i--; ixgbe_free_tx_resources(adapter, &temp_tx_ring[i]); } goto err_setup; } temp_tx_ring[i].v_idx = adapter->tx_ring[i].v_idx; } need_update = true; } temp_rx_ring = kcalloc(adapter->num_rx_queues, sizeof(struct ixgbe_ring), GFP_KERNEL); if ((!temp_rx_ring) && (need_update)) { for (i = 0; i < adapter->num_tx_queues; i++) ixgbe_free_tx_resources(adapter, &temp_tx_ring[i]); kfree(temp_tx_ring); err = -ENOMEM; goto err_setup; } if (new_rx_count != adapter->rx_ring_count) { memcpy(temp_rx_ring, adapter->rx_ring, adapter->num_rx_queues * sizeof(struct ixgbe_ring)); for (i = 0; i < adapter->num_rx_queues; i++) { temp_rx_ring[i].count = new_rx_count; err = ixgbe_setup_rx_resources(adapter, &temp_rx_ring[i]); if (err) { while (i) { i--; ixgbe_free_rx_resources(adapter, &temp_rx_ring[i]); } goto err_setup; } temp_rx_ring[i].v_idx = adapter->rx_ring[i].v_idx; } need_update = true; } /* if rings need to be updated, here's the place to do it in one shot */ if (need_update) { if (netif_running(netdev)) ixgbe_down(adapter); /* tx */ if (new_tx_count != adapter->tx_ring_count) { kfree(adapter->tx_ring); adapter->tx_ring = temp_tx_ring; temp_tx_ring = NULL; adapter->tx_ring_count = new_tx_count; } /* rx */ if (new_rx_count != adapter->rx_ring_count) { kfree(adapter->rx_ring); adapter->rx_ring = temp_rx_ring; temp_rx_ring = NULL; adapter->rx_ring_count = new_rx_count; } } /* success! */ err = 0; if (netif_running(netdev)) ixgbe_up(adapter); err_setup: clear_bit(__IXGBE_RESETTING, &adapter->state); return err; }
static int ixgbe_dcb_set_all(struct sk_buff *skb, struct genl_info *info) { struct net_device *netdev = NULL; struct ixgbe_adapter *adapter = NULL; int ret = -ENOMEM; u8 value; u8 retval = 0; if (!info->attrs[DCB_A_IFNAME] || !info->attrs[DCB_A_SET_ALL]) 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); if (!(adapter->flags & IXGBE_FLAG_DCA_CAPABLE)) { ret = -EINVAL; goto err_out; } value = nla_get_u8(info->attrs[DCB_A_SET_ALL]); if ((value & 1) != value) { DPRINTK(DRV, ERR, "Value is not 1 or 0, it is %d.\n", value); } else { if (!adapter->dcb_set_bitmap) { retval = 1; goto out; } while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) msleep(1); ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, adapter->ring_feature[RING_F_DCB].indices); if (ret) { clear_bit(__IXGBE_RESETTING, &adapter->state); goto err_out; } ixgbe_down(adapter); ixgbe_up(adapter); adapter->dcb_set_bitmap = 0x00; clear_bit(__IXGBE_RESETTING, &adapter->state); } out: ret = ixgbe_nl_reply(retval, DCB_C_SET_ALL, DCB_A_SET_ALL, info); if (ret) goto err_out; err_out: dev_put(netdev); err: return ret; }
static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) { struct ixgbe_adapter *adapter = netdev_priv(netdev); bool do_reset; int ret; if (!adapter->dcb_set_bitmap) return DCB_NO_HW_CHG; ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, adapter->ring_feature[RING_F_DCB].indices); if (ret) return DCB_NO_HW_CHG; /* Only take down the adapter if the configuration change * requires a reset. */ do_reset = adapter->dcb_set_bitmap & (BIT_RESETLINK | BIT_APP_UPCHG); if (do_reset) { while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) msleep(1); if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) { if (netif_running(netdev)) #ifdef HAVE_NET_DEVICE_OPS netdev->netdev_ops->ndo_stop(netdev); #else netdev->stop(netdev); #endif ixgbe_clear_interrupt_scheme(adapter); } else { if (netif_running(netdev)) ixgbe_down(adapter); } } if (adapter->dcb_cfg.pfc_mode_enable) { switch (adapter->hw.mac.type) { case ixgbe_mac_82599EB: case ixgbe_mac_X540: if (adapter->hw.fc.current_mode != ixgbe_fc_pfc) adapter->last_lfc_mode = adapter->hw.fc.current_mode; break; default: break; } adapter->hw.fc.requested_mode = ixgbe_fc_pfc; } else { switch (adapter->hw.mac.type) { case ixgbe_mac_82598EB: adapter->hw.fc.requested_mode = ixgbe_fc_none; break; case ixgbe_mac_82599EB: case ixgbe_mac_X540: adapter->hw.fc.requested_mode = adapter->last_lfc_mode; break; default: break; } } if (do_reset) { if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) { ixgbe_init_interrupt_scheme(adapter); if (netif_running(netdev)) #ifdef HAVE_NET_DEVICE_OPS netdev->netdev_ops->ndo_open(netdev); #else netdev->open(netdev); #endif } else { if (netif_running(netdev)) ixgbe_up(adapter); } ret = DCB_HW_CHG_RST; } else if (adapter->dcb_set_bitmap & BIT_PFC) { if (adapter->hw.mac.type == ixgbe_mac_82598EB) ixgbe_dcb_config_pfc_82598(&adapter->hw, &adapter->dcb_cfg); else if (adapter->hw.mac.type == ixgbe_mac_82599EB) ixgbe_dcb_config_pfc_82599(&adapter->hw, &adapter->dcb_cfg); ret = DCB_HW_CHG; } if (adapter->dcb_cfg.pfc_mode_enable) adapter->hw.fc.current_mode = ixgbe_fc_pfc; if (do_reset) clear_bit(__IXGBE_RESETTING, &adapter->state); adapter->dcb_set_bitmap = 0x00; return ret; }