Loading drivers/net/ethernet/intel/e1000/e1000_main.c +6 −6 Original line number Diff line number Diff line Loading @@ -1078,18 +1078,18 @@ static int __devinit e1000_probe(struct pci_dev *pdev, netdev->priv_flags |= IFF_SUPP_NOFCS; netdev->features |= netdev->hw_features; netdev->hw_features |= NETIF_F_RXCSUM; netdev->hw_features |= NETIF_F_RXALL; netdev->hw_features |= NETIF_F_RXFCS; netdev->hw_features |= (NETIF_F_RXCSUM | NETIF_F_RXALL | NETIF_F_RXFCS); if (pci_using_dac) { netdev->features |= NETIF_F_HIGHDMA; netdev->vlan_features |= NETIF_F_HIGHDMA; } netdev->vlan_features |= NETIF_F_TSO; netdev->vlan_features |= NETIF_F_HW_CSUM; netdev->vlan_features |= NETIF_F_SG; netdev->vlan_features |= (NETIF_F_TSO | NETIF_F_HW_CSUM | NETIF_F_SG); netdev->priv_flags |= IFF_UNICAST_FLT; Loading drivers/net/ethernet/intel/igb/e1000_regs.h +1 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ /* TX Rate Limit Registers */ #define E1000_RTTDQSEL 0x3604 /* Tx Desc Plane Queue Select - WO */ #define E1000_RTTBCNRM 0x3690 /* Tx BCN Rate-scheduler MMW */ #define E1000_RTTBCNRC 0x36B0 /* Tx BCN Rate-Scheduler Config - WO */ /* Split and Replication RX Control - RW */ Loading drivers/net/ethernet/intel/igb/igb.h +19 −6 Original line number Diff line number Diff line Loading @@ -65,19 +65,30 @@ struct igb_adapter; #define MAX_Q_VECTORS 8 /* Transmit and receive queues */ #define IGB_MAX_RX_QUEUES ((adapter->vfs_allocated_count ? 2 : \ (hw->mac.type > e1000_82575 ? 8 : 4))) #define IGB_MAX_RX_QUEUES_I210 4 #define IGB_MAX_RX_QUEUES 8 #define IGB_MAX_RX_QUEUES_82575 4 #define IGB_MAX_RX_QUEUES_I211 2 #define IGB_MAX_TX_QUEUES 16 #define IGB_MAX_TX_QUEUES_I210 4 #define IGB_MAX_TX_QUEUES_I211 2 #define IGB_MAX_TX_QUEUES 8 #define IGB_MAX_VF_MC_ENTRIES 30 #define IGB_MAX_VF_FUNCTIONS 8 #define IGB_MAX_VFTA_ENTRIES 128 #define IGB_82576_VF_DEV_ID 0x10CA #define IGB_I350_VF_DEV_ID 0x1520 /* NVM version defines */ #define IGB_MAJOR_MASK 0xF000 #define IGB_MINOR_MASK 0x0FF0 #define IGB_BUILD_MASK 0x000F #define IGB_COMB_VER_MASK 0x00FF #define IGB_MAJOR_SHIFT 12 #define IGB_MINOR_SHIFT 4 #define IGB_COMB_VER_SHFT 8 #define IGB_NVM_VER_INVALID 0xFFFF #define IGB_ETRACK_SHIFT 16 #define NVM_ETRACK_WORD 0x0042 #define NVM_COMB_VER_OFF 0x0083 #define NVM_COMB_VER_PTR 0x003d struct vf_data_storage { unsigned char vf_mac_addresses[ETH_ALEN]; u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES]; Loading Loading @@ -371,6 +382,7 @@ struct igb_adapter { spinlock_t tmreg_lock; struct cyclecounter cc; struct timecounter tc; char fw_version[32]; }; #define IGB_FLAG_HAS_MSI (1 << 0) Loading Loading @@ -420,6 +432,7 @@ extern void igb_update_stats(struct igb_adapter *, struct rtnl_link_stats64 *); extern bool igb_has_link(struct igb_adapter *adapter); extern void igb_set_ethtool_ops(struct net_device *); extern void igb_power_up_link(struct igb_adapter *); extern void igb_set_fw_version(struct igb_adapter *); #ifdef CONFIG_IGB_PTP extern void igb_ptp_init(struct igb_adapter *adapter); extern void igb_ptp_remove(struct igb_adapter *adapter); Loading drivers/net/ethernet/intel/igb/igb_ethtool.c +42 −10 Original line number Diff line number Diff line Loading @@ -710,6 +710,7 @@ static int igb_set_eeprom(struct net_device *netdev, if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG))) hw->nvm.ops.update(hw); igb_set_fw_version(adapter); kfree(eeprom_buff); return ret_val; } Loading @@ -718,20 +719,16 @@ static void igb_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) { struct igb_adapter *adapter = netdev_priv(netdev); u16 eeprom_data; strlcpy(drvinfo->driver, igb_driver_name, sizeof(drvinfo->driver)); strlcpy(drvinfo->version, igb_driver_version, sizeof(drvinfo->version)); /* EEPROM image version # is reported as firmware version # for * 82575 controllers */ adapter->hw.nvm.ops.read(&adapter->hw, 5, 1, &eeprom_data); snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "%d.%d-%d", (eeprom_data & 0xF000) >> 12, (eeprom_data & 0x0FF0) >> 4, eeprom_data & 0x000F); /* * EEPROM image version # is reported as firmware version # for * 82575 controllers */ strlcpy(drvinfo->fw_version, adapter->fw_version, sizeof(drvinfo->fw_version)); strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), sizeof(drvinfo->bus_info)); drvinfo->n_stats = IGB_STATS_LEN; Loading Loading @@ -2271,6 +2268,38 @@ static void igb_ethtool_complete(struct net_device *netdev) pm_runtime_put(&adapter->pdev->dev); } #ifdef CONFIG_IGB_PTP static int igb_ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) { struct igb_adapter *adapter = netdev_priv(dev); info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | SOF_TIMESTAMPING_RX_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE; if (adapter->ptp_clock) info->phc_index = ptp_clock_index(adapter->ptp_clock); else info->phc_index = -1; info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON); info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | (1 << HWTSTAMP_FILTER_ALL) | (1 << HWTSTAMP_FILTER_SOME) | (1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC) | (1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) | (1 << HWTSTAMP_FILTER_PTP_V2_EVENT); return 0; } #endif static const struct ethtool_ops igb_ethtool_ops = { .get_settings = igb_get_settings, .set_settings = igb_set_settings, Loading Loading @@ -2299,6 +2328,9 @@ static const struct ethtool_ops igb_ethtool_ops = { .set_coalesce = igb_set_coalesce, .begin = igb_ethtool_begin, .complete = igb_ethtool_complete, #ifdef CONFIG_IGB_PTP .get_ts_info = igb_ethtool_get_ts_info, #endif }; void igb_set_ethtool_ops(struct net_device *netdev) Loading drivers/net/ethernet/intel/igb/igb_main.c +126 −30 Original line number Diff line number Diff line Loading @@ -59,9 +59,9 @@ #endif #include "igb.h" #define MAJ 3 #define MIN 4 #define BUILD 7 #define MAJ 4 #define MIN 0 #define BUILD 1 #define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \ __stringify(BUILD) "-k" char igb_driver_name[] = "igb"; Loading Loading @@ -1048,11 +1048,6 @@ static int igb_set_interrupt_capability(struct igb_adapter *adapter) if (!(adapter->flags & IGB_FLAG_QUEUE_PAIRS)) numvecs += adapter->num_tx_queues; /* i210 and i211 can only have 4 MSIX vectors for rx/tx queues. */ if ((adapter->hw.mac.type == e1000_i210) || (adapter->hw.mac.type == e1000_i211)) numvecs = 4; /* store the number of vectors reserved for queues */ adapter->num_q_vectors = numvecs; Loading Loading @@ -1820,6 +1815,69 @@ static const struct net_device_ops igb_netdev_ops = { .ndo_set_features = igb_set_features, }; /** * igb_set_fw_version - Configure version string for ethtool * @adapter: adapter struct * **/ void igb_set_fw_version(struct igb_adapter *adapter) { struct e1000_hw *hw = &adapter->hw; u16 eeprom_verh, eeprom_verl, comb_verh, comb_verl, comb_offset; u16 major, build, patch, fw_version; u32 etrack_id; hw->nvm.ops.read(hw, 5, 1, &fw_version); if (adapter->hw.mac.type != e1000_i211) { hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verh); hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verl); etrack_id = (eeprom_verh << IGB_ETRACK_SHIFT) | eeprom_verl; /* combo image version needs to be found */ hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset); if ((comb_offset != 0x0) && (comb_offset != IGB_NVM_VER_INVALID)) { hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset + 1), 1, &comb_verh); hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset), 1, &comb_verl); /* Only display Option Rom if it exists and is valid */ if ((comb_verh && comb_verl) && ((comb_verh != IGB_NVM_VER_INVALID) && (comb_verl != IGB_NVM_VER_INVALID))) { major = comb_verl >> IGB_COMB_VER_SHFT; build = (comb_verl << IGB_COMB_VER_SHFT) | (comb_verh >> IGB_COMB_VER_SHFT); patch = comb_verh & IGB_COMB_VER_MASK; snprintf(adapter->fw_version, sizeof(adapter->fw_version), "%d.%d%d, 0x%08x, %d.%d.%d", (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT, (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT, (fw_version & IGB_BUILD_MASK), etrack_id, major, build, patch); goto out; } } snprintf(adapter->fw_version, sizeof(adapter->fw_version), "%d.%d%d, 0x%08x", (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT, (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT, (fw_version & IGB_BUILD_MASK), etrack_id); } else { snprintf(adapter->fw_version, sizeof(adapter->fw_version), "%d.%d%d", (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT, (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT, (fw_version & IGB_BUILD_MASK)); } out: return; } /** * igb_probe - Device Initialization Routine * @pdev: PCI device information struct Loading Loading @@ -2030,6 +2088,9 @@ static int __devinit igb_probe(struct pci_dev *pdev, goto err_eeprom; } /* get firmware version for ethtool -i */ igb_set_fw_version(adapter); setup_timer(&adapter->watchdog_timer, igb_watchdog, (unsigned long) adapter); setup_timer(&adapter->phy_info_timer, igb_update_phy_info, Loading Loading @@ -2338,6 +2399,7 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter) struct e1000_hw *hw = &adapter->hw; struct net_device *netdev = adapter->netdev; struct pci_dev *pdev = adapter->pdev; u32 max_rss_queues; pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word); Loading Loading @@ -2370,40 +2432,69 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter) } else adapter->vfs_allocated_count = max_vfs; break; case e1000_i210: case e1000_i211: adapter->vfs_allocated_count = 0; break; default: break; } #endif /* CONFIG_PCI_IOV */ /* Determine the maximum number of RSS queues supported. */ switch (hw->mac.type) { case e1000_i211: max_rss_queues = IGB_MAX_RX_QUEUES_I211; break; case e1000_82575: case e1000_i210: adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I210, num_online_cpus()); max_rss_queues = IGB_MAX_RX_QUEUES_82575; break; case e1000_i211: adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I211, num_online_cpus()); case e1000_i350: /* I350 cannot do RSS and SR-IOV at the same time */ if (!!adapter->vfs_allocated_count) { max_rss_queues = 1; break; } /* fall through */ case e1000_82576: if (!!adapter->vfs_allocated_count) { max_rss_queues = 2; break; } /* fall through */ case e1000_82580: default: adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus()); max_rss_queues = IGB_MAX_RX_QUEUES; break; } /* i350 cannot do RSS and SR-IOV at the same time */ if (hw->mac.type == e1000_i350 && adapter->vfs_allocated_count) adapter->rss_queues = 1; adapter->rss_queues = min_t(u32, max_rss_queues, num_online_cpus()); /* Determine if we need to pair queues. */ switch (hw->mac.type) { case e1000_82575: case e1000_i211: /* Device supports enough interrupts without queue pairing. */ break; case e1000_82576: /* * If VFs are going to be allocated with RSS queues then we * should pair the queues in order to conserve interrupts due * to limited supply. */ if ((adapter->rss_queues > 1) && (adapter->vfs_allocated_count > 6)) adapter->flags |= IGB_FLAG_QUEUE_PAIRS; /* fall through */ case e1000_82580: case e1000_i350: case e1000_i210: default: /* * if rss_queues > 4 or vfs are going to be allocated with rss_queues * then we should combine the queues into a queue pair in order to * conserve interrupts due to limited supply * If rss_queues > half of max_rss_queues, pair the queues in * order to conserve interrupts due to limited supply. */ if ((adapter->rss_queues > 4) || ((adapter->rss_queues > 1) && (adapter->vfs_allocated_count > 6))) if (adapter->rss_queues > (max_rss_queues / 2)) adapter->flags |= IGB_FLAG_QUEUE_PAIRS; break; } /* Setup and initialize a copy of the hw vlan table array */ adapter->shadow_vfta = kzalloc(sizeof(u32) * Loading Loading @@ -6997,6 +7088,11 @@ static void igb_set_vf_rate_limit(struct e1000_hw *hw, int vf, int tx_rate, } wr32(E1000_RTTDQSEL, vf); /* vf X uses queue X */ /* * Set global transmit compensation time to the MMW_SIZE in RTTBCNRM * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported. */ wr32(E1000_RTTBCNRM, 0x14); wr32(E1000_RTTBCNRC, bcnrc_val); } Loading Loading
drivers/net/ethernet/intel/e1000/e1000_main.c +6 −6 Original line number Diff line number Diff line Loading @@ -1078,18 +1078,18 @@ static int __devinit e1000_probe(struct pci_dev *pdev, netdev->priv_flags |= IFF_SUPP_NOFCS; netdev->features |= netdev->hw_features; netdev->hw_features |= NETIF_F_RXCSUM; netdev->hw_features |= NETIF_F_RXALL; netdev->hw_features |= NETIF_F_RXFCS; netdev->hw_features |= (NETIF_F_RXCSUM | NETIF_F_RXALL | NETIF_F_RXFCS); if (pci_using_dac) { netdev->features |= NETIF_F_HIGHDMA; netdev->vlan_features |= NETIF_F_HIGHDMA; } netdev->vlan_features |= NETIF_F_TSO; netdev->vlan_features |= NETIF_F_HW_CSUM; netdev->vlan_features |= NETIF_F_SG; netdev->vlan_features |= (NETIF_F_TSO | NETIF_F_HW_CSUM | NETIF_F_SG); netdev->priv_flags |= IFF_UNICAST_FLT; Loading
drivers/net/ethernet/intel/igb/e1000_regs.h +1 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,7 @@ /* TX Rate Limit Registers */ #define E1000_RTTDQSEL 0x3604 /* Tx Desc Plane Queue Select - WO */ #define E1000_RTTBCNRM 0x3690 /* Tx BCN Rate-scheduler MMW */ #define E1000_RTTBCNRC 0x36B0 /* Tx BCN Rate-Scheduler Config - WO */ /* Split and Replication RX Control - RW */ Loading
drivers/net/ethernet/intel/igb/igb.h +19 −6 Original line number Diff line number Diff line Loading @@ -65,19 +65,30 @@ struct igb_adapter; #define MAX_Q_VECTORS 8 /* Transmit and receive queues */ #define IGB_MAX_RX_QUEUES ((adapter->vfs_allocated_count ? 2 : \ (hw->mac.type > e1000_82575 ? 8 : 4))) #define IGB_MAX_RX_QUEUES_I210 4 #define IGB_MAX_RX_QUEUES 8 #define IGB_MAX_RX_QUEUES_82575 4 #define IGB_MAX_RX_QUEUES_I211 2 #define IGB_MAX_TX_QUEUES 16 #define IGB_MAX_TX_QUEUES_I210 4 #define IGB_MAX_TX_QUEUES_I211 2 #define IGB_MAX_TX_QUEUES 8 #define IGB_MAX_VF_MC_ENTRIES 30 #define IGB_MAX_VF_FUNCTIONS 8 #define IGB_MAX_VFTA_ENTRIES 128 #define IGB_82576_VF_DEV_ID 0x10CA #define IGB_I350_VF_DEV_ID 0x1520 /* NVM version defines */ #define IGB_MAJOR_MASK 0xF000 #define IGB_MINOR_MASK 0x0FF0 #define IGB_BUILD_MASK 0x000F #define IGB_COMB_VER_MASK 0x00FF #define IGB_MAJOR_SHIFT 12 #define IGB_MINOR_SHIFT 4 #define IGB_COMB_VER_SHFT 8 #define IGB_NVM_VER_INVALID 0xFFFF #define IGB_ETRACK_SHIFT 16 #define NVM_ETRACK_WORD 0x0042 #define NVM_COMB_VER_OFF 0x0083 #define NVM_COMB_VER_PTR 0x003d struct vf_data_storage { unsigned char vf_mac_addresses[ETH_ALEN]; u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES]; Loading Loading @@ -371,6 +382,7 @@ struct igb_adapter { spinlock_t tmreg_lock; struct cyclecounter cc; struct timecounter tc; char fw_version[32]; }; #define IGB_FLAG_HAS_MSI (1 << 0) Loading Loading @@ -420,6 +432,7 @@ extern void igb_update_stats(struct igb_adapter *, struct rtnl_link_stats64 *); extern bool igb_has_link(struct igb_adapter *adapter); extern void igb_set_ethtool_ops(struct net_device *); extern void igb_power_up_link(struct igb_adapter *); extern void igb_set_fw_version(struct igb_adapter *); #ifdef CONFIG_IGB_PTP extern void igb_ptp_init(struct igb_adapter *adapter); extern void igb_ptp_remove(struct igb_adapter *adapter); Loading
drivers/net/ethernet/intel/igb/igb_ethtool.c +42 −10 Original line number Diff line number Diff line Loading @@ -710,6 +710,7 @@ static int igb_set_eeprom(struct net_device *netdev, if ((ret_val == 0) && ((first_word <= NVM_CHECKSUM_REG))) hw->nvm.ops.update(hw); igb_set_fw_version(adapter); kfree(eeprom_buff); return ret_val; } Loading @@ -718,20 +719,16 @@ static void igb_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) { struct igb_adapter *adapter = netdev_priv(netdev); u16 eeprom_data; strlcpy(drvinfo->driver, igb_driver_name, sizeof(drvinfo->driver)); strlcpy(drvinfo->version, igb_driver_version, sizeof(drvinfo->version)); /* EEPROM image version # is reported as firmware version # for * 82575 controllers */ adapter->hw.nvm.ops.read(&adapter->hw, 5, 1, &eeprom_data); snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "%d.%d-%d", (eeprom_data & 0xF000) >> 12, (eeprom_data & 0x0FF0) >> 4, eeprom_data & 0x000F); /* * EEPROM image version # is reported as firmware version # for * 82575 controllers */ strlcpy(drvinfo->fw_version, adapter->fw_version, sizeof(drvinfo->fw_version)); strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), sizeof(drvinfo->bus_info)); drvinfo->n_stats = IGB_STATS_LEN; Loading Loading @@ -2271,6 +2268,38 @@ static void igb_ethtool_complete(struct net_device *netdev) pm_runtime_put(&adapter->pdev->dev); } #ifdef CONFIG_IGB_PTP static int igb_ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) { struct igb_adapter *adapter = netdev_priv(dev); info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | SOF_TIMESTAMPING_RX_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE; if (adapter->ptp_clock) info->phc_index = ptp_clock_index(adapter->ptp_clock); else info->phc_index = -1; info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON); info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | (1 << HWTSTAMP_FILTER_ALL) | (1 << HWTSTAMP_FILTER_SOME) | (1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC) | (1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) | (1 << HWTSTAMP_FILTER_PTP_V2_EVENT); return 0; } #endif static const struct ethtool_ops igb_ethtool_ops = { .get_settings = igb_get_settings, .set_settings = igb_set_settings, Loading Loading @@ -2299,6 +2328,9 @@ static const struct ethtool_ops igb_ethtool_ops = { .set_coalesce = igb_set_coalesce, .begin = igb_ethtool_begin, .complete = igb_ethtool_complete, #ifdef CONFIG_IGB_PTP .get_ts_info = igb_ethtool_get_ts_info, #endif }; void igb_set_ethtool_ops(struct net_device *netdev) Loading
drivers/net/ethernet/intel/igb/igb_main.c +126 −30 Original line number Diff line number Diff line Loading @@ -59,9 +59,9 @@ #endif #include "igb.h" #define MAJ 3 #define MIN 4 #define BUILD 7 #define MAJ 4 #define MIN 0 #define BUILD 1 #define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \ __stringify(BUILD) "-k" char igb_driver_name[] = "igb"; Loading Loading @@ -1048,11 +1048,6 @@ static int igb_set_interrupt_capability(struct igb_adapter *adapter) if (!(adapter->flags & IGB_FLAG_QUEUE_PAIRS)) numvecs += adapter->num_tx_queues; /* i210 and i211 can only have 4 MSIX vectors for rx/tx queues. */ if ((adapter->hw.mac.type == e1000_i210) || (adapter->hw.mac.type == e1000_i211)) numvecs = 4; /* store the number of vectors reserved for queues */ adapter->num_q_vectors = numvecs; Loading Loading @@ -1820,6 +1815,69 @@ static const struct net_device_ops igb_netdev_ops = { .ndo_set_features = igb_set_features, }; /** * igb_set_fw_version - Configure version string for ethtool * @adapter: adapter struct * **/ void igb_set_fw_version(struct igb_adapter *adapter) { struct e1000_hw *hw = &adapter->hw; u16 eeprom_verh, eeprom_verl, comb_verh, comb_verl, comb_offset; u16 major, build, patch, fw_version; u32 etrack_id; hw->nvm.ops.read(hw, 5, 1, &fw_version); if (adapter->hw.mac.type != e1000_i211) { hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verh); hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verl); etrack_id = (eeprom_verh << IGB_ETRACK_SHIFT) | eeprom_verl; /* combo image version needs to be found */ hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset); if ((comb_offset != 0x0) && (comb_offset != IGB_NVM_VER_INVALID)) { hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset + 1), 1, &comb_verh); hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset), 1, &comb_verl); /* Only display Option Rom if it exists and is valid */ if ((comb_verh && comb_verl) && ((comb_verh != IGB_NVM_VER_INVALID) && (comb_verl != IGB_NVM_VER_INVALID))) { major = comb_verl >> IGB_COMB_VER_SHFT; build = (comb_verl << IGB_COMB_VER_SHFT) | (comb_verh >> IGB_COMB_VER_SHFT); patch = comb_verh & IGB_COMB_VER_MASK; snprintf(adapter->fw_version, sizeof(adapter->fw_version), "%d.%d%d, 0x%08x, %d.%d.%d", (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT, (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT, (fw_version & IGB_BUILD_MASK), etrack_id, major, build, patch); goto out; } } snprintf(adapter->fw_version, sizeof(adapter->fw_version), "%d.%d%d, 0x%08x", (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT, (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT, (fw_version & IGB_BUILD_MASK), etrack_id); } else { snprintf(adapter->fw_version, sizeof(adapter->fw_version), "%d.%d%d", (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT, (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT, (fw_version & IGB_BUILD_MASK)); } out: return; } /** * igb_probe - Device Initialization Routine * @pdev: PCI device information struct Loading Loading @@ -2030,6 +2088,9 @@ static int __devinit igb_probe(struct pci_dev *pdev, goto err_eeprom; } /* get firmware version for ethtool -i */ igb_set_fw_version(adapter); setup_timer(&adapter->watchdog_timer, igb_watchdog, (unsigned long) adapter); setup_timer(&adapter->phy_info_timer, igb_update_phy_info, Loading Loading @@ -2338,6 +2399,7 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter) struct e1000_hw *hw = &adapter->hw; struct net_device *netdev = adapter->netdev; struct pci_dev *pdev = adapter->pdev; u32 max_rss_queues; pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word); Loading Loading @@ -2370,40 +2432,69 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter) } else adapter->vfs_allocated_count = max_vfs; break; case e1000_i210: case e1000_i211: adapter->vfs_allocated_count = 0; break; default: break; } #endif /* CONFIG_PCI_IOV */ /* Determine the maximum number of RSS queues supported. */ switch (hw->mac.type) { case e1000_i211: max_rss_queues = IGB_MAX_RX_QUEUES_I211; break; case e1000_82575: case e1000_i210: adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I210, num_online_cpus()); max_rss_queues = IGB_MAX_RX_QUEUES_82575; break; case e1000_i211: adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I211, num_online_cpus()); case e1000_i350: /* I350 cannot do RSS and SR-IOV at the same time */ if (!!adapter->vfs_allocated_count) { max_rss_queues = 1; break; } /* fall through */ case e1000_82576: if (!!adapter->vfs_allocated_count) { max_rss_queues = 2; break; } /* fall through */ case e1000_82580: default: adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus()); max_rss_queues = IGB_MAX_RX_QUEUES; break; } /* i350 cannot do RSS and SR-IOV at the same time */ if (hw->mac.type == e1000_i350 && adapter->vfs_allocated_count) adapter->rss_queues = 1; adapter->rss_queues = min_t(u32, max_rss_queues, num_online_cpus()); /* Determine if we need to pair queues. */ switch (hw->mac.type) { case e1000_82575: case e1000_i211: /* Device supports enough interrupts without queue pairing. */ break; case e1000_82576: /* * If VFs are going to be allocated with RSS queues then we * should pair the queues in order to conserve interrupts due * to limited supply. */ if ((adapter->rss_queues > 1) && (adapter->vfs_allocated_count > 6)) adapter->flags |= IGB_FLAG_QUEUE_PAIRS; /* fall through */ case e1000_82580: case e1000_i350: case e1000_i210: default: /* * if rss_queues > 4 or vfs are going to be allocated with rss_queues * then we should combine the queues into a queue pair in order to * conserve interrupts due to limited supply * If rss_queues > half of max_rss_queues, pair the queues in * order to conserve interrupts due to limited supply. */ if ((adapter->rss_queues > 4) || ((adapter->rss_queues > 1) && (adapter->vfs_allocated_count > 6))) if (adapter->rss_queues > (max_rss_queues / 2)) adapter->flags |= IGB_FLAG_QUEUE_PAIRS; break; } /* Setup and initialize a copy of the hw vlan table array */ adapter->shadow_vfta = kzalloc(sizeof(u32) * Loading Loading @@ -6997,6 +7088,11 @@ static void igb_set_vf_rate_limit(struct e1000_hw *hw, int vf, int tx_rate, } wr32(E1000_RTTDQSEL, vf); /* vf X uses queue X */ /* * Set global transmit compensation time to the MMW_SIZE in RTTBCNRM * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported. */ wr32(E1000_RTTBCNRM, 0x14); wr32(E1000_RTTBCNRC, bcnrc_val); } Loading