mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
Merge branch '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue
Jeff Kirsher says: ==================== 1GbE Intel Wired LAN Driver Updates 2018-01-24 This series contains updates to igb and e1000e only. Corinna Vinschen implements the ability to set the VF MAC to 00:00:00:00:00:00 via RTM_SETLINK on the PF, to prevent receiving "invlaid argument" when libvirt attempts to restore the MAC address back to its original state of 00:00:00:00:00:00. Zhang Shengju adds a new function igb_get_max_rss_queues() to get the maxium number of RSS queues and to reduce code duplication. Matt fixes an issue with e1000e where when setting HTHREST, we should only be setting bit 8. Also added a dev_info() message to alert when C-states have been disabled, to help in debugging. Jesus adds code comments to clarify the idlescope configuration constraints. Lyude Paul fixes a kernel crash on hotplug of igb, by checking to ensure that we are in the process of dismantling the netdev on hotplug events. Markus Elfring removes a duplicate message for a memory allocation failure. Daniel Hua fixes an issue where transmit timestamps will stop being put into the socket when link is repeatedly up/down due to TSYNCTXCTL's TXTT bit (Transmit timestamp valid bit) not clearing in the timeout logic of ptp_tx_work(), which in turn causes no new timestamp to be loaded to the TXSTMP register. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
98fe9cd782
@ -3303,9 +3303,11 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
|
||||
if (adapter->flags & FLAG_IS_ICH) {
|
||||
u32 rxdctl = er32(RXDCTL(0));
|
||||
|
||||
ew32(RXDCTL(0), rxdctl | 0x3);
|
||||
ew32(RXDCTL(0), rxdctl | 0x3 | BIT(8));
|
||||
}
|
||||
|
||||
dev_info(&adapter->pdev->dev,
|
||||
"Some CPU C-states have been disabled in order to enable jumbo frames\n");
|
||||
pm_qos_update_request(&adapter->pm_qos_req, lat);
|
||||
} else {
|
||||
pm_qos_update_request(&adapter->pm_qos_req,
|
||||
|
@ -690,6 +690,7 @@ void igb_ptp_rx_pktstamp(struct igb_q_vector *q_vector, void *va,
|
||||
int igb_ptp_set_ts_config(struct net_device *netdev, struct ifreq *ifr);
|
||||
int igb_ptp_get_ts_config(struct net_device *netdev, struct ifreq *ifr);
|
||||
void igb_set_flag_queue_pairs(struct igb_adapter *, const u32);
|
||||
unsigned int igb_get_max_rss_queues(struct igb_adapter *);
|
||||
#ifdef CONFIG_IGB_HWMON
|
||||
void igb_sysfs_exit(struct igb_adapter *adapter);
|
||||
int igb_sysfs_init(struct igb_adapter *adapter);
|
||||
|
@ -3338,37 +3338,7 @@ static int igb_set_rxfh(struct net_device *netdev, const u32 *indir,
|
||||
|
||||
static unsigned int igb_max_channels(struct igb_adapter *adapter)
|
||||
{
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
unsigned int max_combined = 0;
|
||||
|
||||
switch (hw->mac.type) {
|
||||
case e1000_i211:
|
||||
max_combined = IGB_MAX_RX_QUEUES_I211;
|
||||
break;
|
||||
case e1000_82575:
|
||||
case e1000_i210:
|
||||
max_combined = IGB_MAX_RX_QUEUES_82575;
|
||||
break;
|
||||
case e1000_i350:
|
||||
if (!!adapter->vfs_allocated_count) {
|
||||
max_combined = 1;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case e1000_82576:
|
||||
if (!!adapter->vfs_allocated_count) {
|
||||
max_combined = 2;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
case e1000_82580:
|
||||
case e1000_i354:
|
||||
default:
|
||||
max_combined = IGB_MAX_RX_QUEUES;
|
||||
break;
|
||||
}
|
||||
|
||||
return max_combined;
|
||||
return igb_get_max_rss_queues(adapter);
|
||||
}
|
||||
|
||||
static void igb_get_channels(struct net_device *netdev,
|
||||
|
@ -1744,6 +1744,20 @@ static void igb_configure_cbs(struct igb_adapter *adapter, int queue,
|
||||
* value = idleSlope * 61034
|
||||
* ----------------- (E6)
|
||||
* 1000000
|
||||
*
|
||||
* NOTE: For i210, given the above, we can see that idleslope
|
||||
* is represented in 16.38431 kbps units by the value at
|
||||
* the TQAVCC register (1Gbps / 61034), which reduces
|
||||
* the granularity for idleslope increments.
|
||||
* For instance, if you want to configure a 2576kbps
|
||||
* idleslope, the value to be written on the register
|
||||
* would have to be 157.23. If rounded down, you end
|
||||
* up with less bandwidth available than originally
|
||||
* required (~2572 kbps). If rounded up, you end up
|
||||
* with a higher bandwidth (~2589 kbps). Below the
|
||||
* approach we take is to always round up the
|
||||
* calculated value, so the resulting bandwidth might
|
||||
* be slightly higher for some configurations.
|
||||
*/
|
||||
value = DIV_ROUND_UP_ULL(idleslope * 61034ULL, 1000000);
|
||||
|
||||
@ -3200,8 +3214,6 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
|
||||
/* if allocation failed then we do not support SR-IOV */
|
||||
if (!adapter->vf_data) {
|
||||
adapter->vfs_allocated_count = 0;
|
||||
dev_err(&pdev->dev,
|
||||
"Unable to allocate memory for VF Data Storage\n");
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
@ -3373,10 +3385,10 @@ static void igb_probe_vfs(struct igb_adapter *adapter)
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
}
|
||||
|
||||
static void igb_init_queue_configuration(struct igb_adapter *adapter)
|
||||
unsigned int igb_get_max_rss_queues(struct igb_adapter *adapter)
|
||||
{
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
u32 max_rss_queues;
|
||||
unsigned int max_rss_queues;
|
||||
|
||||
/* Determine the maximum number of RSS queues supported. */
|
||||
switch (hw->mac.type) {
|
||||
@ -3407,6 +3419,14 @@ static void igb_init_queue_configuration(struct igb_adapter *adapter)
|
||||
break;
|
||||
}
|
||||
|
||||
return max_rss_queues;
|
||||
}
|
||||
|
||||
static void igb_init_queue_configuration(struct igb_adapter *adapter)
|
||||
{
|
||||
u32 max_rss_queues;
|
||||
|
||||
max_rss_queues = igb_get_max_rss_queues(adapter);
|
||||
adapter->rss_queues = min_t(u32, max_rss_queues, num_online_cpus());
|
||||
|
||||
igb_set_flag_queue_pairs(adapter, max_rss_queues);
|
||||
@ -3676,7 +3696,7 @@ static int __igb_close(struct net_device *netdev, bool suspending)
|
||||
|
||||
int igb_close(struct net_device *netdev)
|
||||
{
|
||||
if (netif_device_present(netdev))
|
||||
if (netif_device_present(netdev) || netdev->dismantle)
|
||||
return __igb_close(netdev, false);
|
||||
return 0;
|
||||
}
|
||||
@ -8718,7 +8738,8 @@ static void igb_rar_set_index(struct igb_adapter *adapter, u32 index)
|
||||
|
||||
/* Indicate to hardware the Address is Valid. */
|
||||
if (adapter->mac_table[index].state & IGB_MAC_STATE_IN_USE) {
|
||||
rar_high |= E1000_RAH_AV;
|
||||
if (is_valid_ether_addr(addr))
|
||||
rar_high |= E1000_RAH_AV;
|
||||
|
||||
if (hw->mac.type == e1000_82575)
|
||||
rar_high |= E1000_RAH_POOL_1 *
|
||||
@ -8756,17 +8777,36 @@ static int igb_set_vf_mac(struct igb_adapter *adapter,
|
||||
static int igb_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
|
||||
{
|
||||
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||
if (!is_valid_ether_addr(mac) || (vf >= adapter->vfs_allocated_count))
|
||||
|
||||
if (vf >= adapter->vfs_allocated_count)
|
||||
return -EINVAL;
|
||||
|
||||
/* Setting the VF MAC to 0 reverts the IGB_VF_FLAG_PF_SET_MAC
|
||||
* flag and allows to overwrite the MAC via VF netdev. This
|
||||
* is necessary to allow libvirt a way to restore the original
|
||||
* MAC after unbinding vfio-pci and reloading igbvf after shutting
|
||||
* down a VM.
|
||||
*/
|
||||
if (is_zero_ether_addr(mac)) {
|
||||
adapter->vf_data[vf].flags &= ~IGB_VF_FLAG_PF_SET_MAC;
|
||||
dev_info(&adapter->pdev->dev,
|
||||
"remove administratively set MAC on VF %d\n",
|
||||
vf);
|
||||
} else if (is_valid_ether_addr(mac)) {
|
||||
adapter->vf_data[vf].flags |= IGB_VF_FLAG_PF_SET_MAC;
|
||||
dev_info(&adapter->pdev->dev, "setting MAC %pM on VF %d\n",
|
||||
mac, vf);
|
||||
dev_info(&adapter->pdev->dev,
|
||||
"Reload the VF driver to make this change effective.");
|
||||
/* Generate additional warning if PF is down */
|
||||
if (test_bit(__IGB_DOWN, &adapter->state)) {
|
||||
dev_warn(&adapter->pdev->dev,
|
||||
"The VF MAC address has been set, but the PF device is not up.\n");
|
||||
dev_warn(&adapter->pdev->dev,
|
||||
"Bring the PF device up before attempting to use the VF device.\n");
|
||||
}
|
||||
} else {
|
||||
return -EINVAL;
|
||||
adapter->vf_data[vf].flags |= IGB_VF_FLAG_PF_SET_MAC;
|
||||
dev_info(&adapter->pdev->dev, "setting MAC %pM on VF %d\n", mac, vf);
|
||||
dev_info(&adapter->pdev->dev,
|
||||
"Reload the VF driver to make this change effective.");
|
||||
if (test_bit(__IGB_DOWN, &adapter->state)) {
|
||||
dev_warn(&adapter->pdev->dev,
|
||||
"The VF MAC address has been set, but the PF device is not up.\n");
|
||||
dev_warn(&adapter->pdev->dev,
|
||||
"Bring the PF device up before attempting to use the VF device.\n");
|
||||
}
|
||||
return igb_set_vf_mac(adapter, vf, mac);
|
||||
}
|
||||
|
@ -643,6 +643,10 @@ static void igb_ptp_tx_work(struct work_struct *work)
|
||||
adapter->ptp_tx_skb = NULL;
|
||||
clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state);
|
||||
adapter->tx_hwtstamp_timeouts++;
|
||||
/* Clear the tx valid bit in TSYNCTXCTL register to enable
|
||||
* interrupt
|
||||
*/
|
||||
rd32(E1000_TXSTMPH);
|
||||
dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang\n");
|
||||
return;
|
||||
}
|
||||
@ -717,6 +721,7 @@ void igb_ptp_rx_hang(struct igb_adapter *adapter)
|
||||
*/
|
||||
void igb_ptp_tx_hang(struct igb_adapter *adapter)
|
||||
{
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
bool timeout = time_is_before_jiffies(adapter->ptp_tx_start +
|
||||
IGB_PTP_TX_TIMEOUT);
|
||||
|
||||
@ -736,6 +741,10 @@ void igb_ptp_tx_hang(struct igb_adapter *adapter)
|
||||
adapter->ptp_tx_skb = NULL;
|
||||
clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state);
|
||||
adapter->tx_hwtstamp_timeouts++;
|
||||
/* Clear the tx valid bit in TSYNCTXCTL register to enable
|
||||
* interrupt
|
||||
*/
|
||||
rd32(E1000_TXSTMPH);
|
||||
dev_warn(&adapter->pdev->dev, "clearing Tx timestamp hang\n");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user