static int bnxt_set_channels(struct net_device *dev, struct ethtool_channels *channel) { struct bnxt *bp = netdev_priv(dev); int max_rx_rings, max_tx_rings, tcs; u32 rc = 0; if (channel->other_count || channel->combined_count || !channel->rx_count || !channel->tx_count) return -EINVAL; bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings); tcs = netdev_get_num_tc(dev); if (tcs > 1) max_tx_rings /= tcs; if (channel->rx_count > max_rx_rings || channel->tx_count > max_tx_rings) return -EINVAL; if (netif_running(dev)) { if (BNXT_PF(bp)) { /* TODO CHIMP_FW: Send message to all VF's * before PF unload */ } rc = bnxt_close_nic(bp, true, false); if (rc) { netdev_err(bp->dev, "Set channel failure rc :%x\n", rc); return rc; } } bp->rx_nr_rings = channel->rx_count; bp->tx_nr_rings_per_tc = channel->tx_count; bp->tx_nr_rings = bp->tx_nr_rings_per_tc; if (tcs > 1) bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tcs; bp->cp_nr_rings = max_t(int, bp->tx_nr_rings, bp->rx_nr_rings); bp->num_stat_ctxs = bp->cp_nr_rings; if (netif_running(dev)) { rc = bnxt_open_nic(bp, true, false); if ((!rc) && BNXT_PF(bp)) { /* TODO CHIMP_FW: Send message to all VF's * to renable */ } } return rc; }
static int bnxt_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data) { struct bnxt *bp = netdev_priv(dev); u8 index, dir_op; u16 type, ext, ordinal, attr; if (!BNXT_PF(bp)) { netdev_err(dev, "NVM write not supported from a virtual function\n"); return -EINVAL; } type = eeprom->magic >> 16; if (type == 0xffff) { /* special value for directory operations */ index = eeprom->magic & 0xff; dir_op = eeprom->magic >> 8; if (index == 0) return -EINVAL; switch (dir_op) { case 0x0e: /* erase */ if (eeprom->offset != ~eeprom->magic) return -EINVAL; return bnxt_erase_nvram_directory(dev, index - 1); default: return -EINVAL; } }
static int bnxt_flash_device(struct net_device *dev, struct ethtool_flash *flash) { if (!BNXT_PF((struct bnxt *)netdev_priv(dev))) { netdev_err(dev, "flashdev not supported from a virtual function\n"); return -EINVAL; } if (flash->region == ETHTOOL_FLASH_ALL_REGIONS) return bnxt_flash_package_from_file(dev, flash->data); return bnxt_flash_firmware_from_file(dev, flash->region, flash->data); }
static int bnxt_set_channels(struct net_device *dev, struct ethtool_channels *channel) { struct bnxt *bp = netdev_priv(dev); int max_rx_rings, max_tx_rings, tcs; u32 rc = 0; bool sh = false; if (channel->other_count) return -EINVAL; if (!channel->combined_count && (!channel->rx_count || !channel->tx_count)) return -EINVAL; if (channel->combined_count && (channel->rx_count || channel->tx_count)) return -EINVAL; if (channel->combined_count) sh = true; bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, sh); tcs = netdev_get_num_tc(dev); if (tcs > 1) max_tx_rings /= tcs; if (sh && (channel->combined_count > max_rx_rings || channel->combined_count > max_tx_rings)) return -ENOMEM; if (!sh && (channel->rx_count > max_rx_rings || channel->tx_count > max_tx_rings)) return -ENOMEM; if (netif_running(dev)) { if (BNXT_PF(bp)) { /* TODO CHIMP_FW: Send message to all VF's * before PF unload */ } rc = bnxt_close_nic(bp, true, false); if (rc) { netdev_err(bp->dev, "Set channel failure rc :%x\n", rc); return rc; } } if (sh) { bp->flags |= BNXT_FLAG_SHARED_RINGS; bp->rx_nr_rings = channel->combined_count; bp->tx_nr_rings_per_tc = channel->combined_count; } else { bp->flags &= ~BNXT_FLAG_SHARED_RINGS; bp->rx_nr_rings = channel->rx_count; bp->tx_nr_rings_per_tc = channel->tx_count; } bp->tx_nr_rings = bp->tx_nr_rings_per_tc; if (tcs > 1) bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tcs; bp->cp_nr_rings = sh ? max_t(int, bp->tx_nr_rings, bp->rx_nr_rings) : bp->tx_nr_rings + bp->rx_nr_rings; bp->num_stat_ctxs = bp->cp_nr_rings; /* After changing number of rx channels, update NTUPLE feature. */ netdev_update_features(dev); if (netif_running(dev)) { rc = bnxt_open_nic(bp, true, false); if ((!rc) && BNXT_PF(bp)) { /* TODO CHIMP_FW: Send message to all VF's * to renable */ } } return rc; }