|
|
@@ -191,10 +191,7 @@ static int igb_disable_sriov(struct pci_dev *dev);
|
|
|
static int igb_pci_disable_sriov(struct pci_dev *dev);
|
|
|
#endif
|
|
|
|
|
|
-#ifdef CONFIG_PM
|
|
|
-#ifdef CONFIG_PM_SLEEP
|
|
|
static int igb_suspend(struct device *);
|
|
|
-#endif
|
|
|
static int igb_resume(struct device *);
|
|
|
static int igb_runtime_suspend(struct device *dev);
|
|
|
static int igb_runtime_resume(struct device *dev);
|
|
|
@@ -204,7 +201,6 @@ static const struct dev_pm_ops igb_pm_ops = {
|
|
|
SET_RUNTIME_PM_OPS(igb_runtime_suspend, igb_runtime_resume,
|
|
|
igb_runtime_idle)
|
|
|
};
|
|
|
-#endif
|
|
|
static void igb_shutdown(struct pci_dev *);
|
|
|
static int igb_pci_sriov_configure(struct pci_dev *dev, int num_vfs);
|
|
|
#ifdef CONFIG_IGB_DCA
|
|
|
@@ -1822,7 +1818,7 @@ void igb_down(struct igb_adapter *adapter)
|
|
|
|
|
|
/* record the stats before reset*/
|
|
|
spin_lock(&adapter->stats64_lock);
|
|
|
- igb_update_stats(adapter, &adapter->stats64);
|
|
|
+ igb_update_stats(adapter);
|
|
|
spin_unlock(&adapter->stats64_lock);
|
|
|
|
|
|
adapter->link_speed = 0;
|
|
|
@@ -4690,7 +4686,7 @@ no_wait:
|
|
|
}
|
|
|
|
|
|
spin_lock(&adapter->stats64_lock);
|
|
|
- igb_update_stats(adapter, &adapter->stats64);
|
|
|
+ igb_update_stats(adapter);
|
|
|
spin_unlock(&adapter->stats64_lock);
|
|
|
|
|
|
for (i = 0; i < adapter->num_tx_queues; i++) {
|
|
|
@@ -4726,6 +4722,7 @@ no_wait:
|
|
|
|
|
|
igb_spoof_check(adapter);
|
|
|
igb_ptp_rx_hang(adapter);
|
|
|
+ igb_ptp_tx_hang(adapter);
|
|
|
|
|
|
/* Check LVMMC register on i350/i354 only */
|
|
|
if ((adapter->hw.mac.type == e1000_i350) ||
|
|
|
@@ -5201,9 +5198,9 @@ static inline int igb_maybe_stop_tx(struct igb_ring *tx_ring, const u16 size)
|
|
|
return __igb_maybe_stop_tx(tx_ring, size);
|
|
|
}
|
|
|
|
|
|
-static void igb_tx_map(struct igb_ring *tx_ring,
|
|
|
- struct igb_tx_buffer *first,
|
|
|
- const u8 hdr_len)
|
|
|
+static int igb_tx_map(struct igb_ring *tx_ring,
|
|
|
+ struct igb_tx_buffer *first,
|
|
|
+ const u8 hdr_len)
|
|
|
{
|
|
|
struct sk_buff *skb = first->skb;
|
|
|
struct igb_tx_buffer *tx_buffer;
|
|
|
@@ -5314,7 +5311,7 @@ static void igb_tx_map(struct igb_ring *tx_ring,
|
|
|
*/
|
|
|
mmiowb();
|
|
|
}
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
dma_error:
|
|
|
dev_err(tx_ring->dev, "TX DMA map failed\n");
|
|
|
@@ -5345,6 +5342,8 @@ dma_error:
|
|
|
tx_buffer->skb = NULL;
|
|
|
|
|
|
tx_ring->next_to_use = i;
|
|
|
+
|
|
|
+ return -1;
|
|
|
}
|
|
|
|
|
|
netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
|
|
|
@@ -5390,6 +5389,8 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
|
|
|
adapter->ptp_tx_start = jiffies;
|
|
|
if (adapter->hw.mac.type == e1000_82576)
|
|
|
schedule_work(&adapter->ptp_tx_work);
|
|
|
+ } else {
|
|
|
+ adapter->tx_hwtstamp_skipped++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -5410,13 +5411,24 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
|
|
|
else if (!tso)
|
|
|
igb_tx_csum(tx_ring, first);
|
|
|
|
|
|
- igb_tx_map(tx_ring, first, hdr_len);
|
|
|
+ if (igb_tx_map(tx_ring, first, hdr_len))
|
|
|
+ goto cleanup_tx_tstamp;
|
|
|
|
|
|
return NETDEV_TX_OK;
|
|
|
|
|
|
out_drop:
|
|
|
dev_kfree_skb_any(first->skb);
|
|
|
first->skb = NULL;
|
|
|
+cleanup_tx_tstamp:
|
|
|
+ if (unlikely(tx_flags & IGB_TX_FLAGS_TSTAMP)) {
|
|
|
+ struct igb_adapter *adapter = netdev_priv(tx_ring->netdev);
|
|
|
+
|
|
|
+ dev_kfree_skb_any(adapter->ptp_tx_skb);
|
|
|
+ adapter->ptp_tx_skb = NULL;
|
|
|
+ if (adapter->hw.mac.type == e1000_82576)
|
|
|
+ cancel_work_sync(&adapter->ptp_tx_work);
|
|
|
+ clear_bit_unlock(__IGB_PTP_TX_IN_PROGRESS, &adapter->state);
|
|
|
+ }
|
|
|
|
|
|
return NETDEV_TX_OK;
|
|
|
}
|
|
|
@@ -5487,7 +5499,7 @@ static void igb_get_stats64(struct net_device *netdev,
|
|
|
struct igb_adapter *adapter = netdev_priv(netdev);
|
|
|
|
|
|
spin_lock(&adapter->stats64_lock);
|
|
|
- igb_update_stats(adapter, &adapter->stats64);
|
|
|
+ igb_update_stats(adapter);
|
|
|
memcpy(stats, &adapter->stats64, sizeof(*stats));
|
|
|
spin_unlock(&adapter->stats64_lock);
|
|
|
}
|
|
|
@@ -5536,9 +5548,9 @@ static int igb_change_mtu(struct net_device *netdev, int new_mtu)
|
|
|
* igb_update_stats - Update the board statistics counters
|
|
|
* @adapter: board private structure
|
|
|
**/
|
|
|
-void igb_update_stats(struct igb_adapter *adapter,
|
|
|
- struct rtnl_link_stats64 *net_stats)
|
|
|
+void igb_update_stats(struct igb_adapter *adapter)
|
|
|
{
|
|
|
+ struct rtnl_link_stats64 *net_stats = &adapter->stats64;
|
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
|
struct pci_dev *pdev = adapter->pdev;
|
|
|
u32 reg, mpc;
|
|
|
@@ -8015,9 +8027,7 @@ static void igb_deliver_wake_packet(struct net_device *netdev)
|
|
|
netif_rx(skb);
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_PM
|
|
|
-#ifdef CONFIG_PM_SLEEP
|
|
|
-static int igb_suspend(struct device *dev)
|
|
|
+static int __maybe_unused igb_suspend(struct device *dev)
|
|
|
{
|
|
|
int retval;
|
|
|
bool wake;
|
|
|
@@ -8036,9 +8046,8 @@ static int igb_suspend(struct device *dev)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
-#endif /* CONFIG_PM_SLEEP */
|
|
|
|
|
|
-static int igb_resume(struct device *dev)
|
|
|
+static int __maybe_unused igb_resume(struct device *dev)
|
|
|
{
|
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
struct net_device *netdev = pci_get_drvdata(pdev);
|
|
|
@@ -8092,7 +8101,7 @@ static int igb_resume(struct device *dev)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static int igb_runtime_idle(struct device *dev)
|
|
|
+static int __maybe_unused igb_runtime_idle(struct device *dev)
|
|
|
{
|
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
struct net_device *netdev = pci_get_drvdata(pdev);
|
|
|
@@ -8104,7 +8113,7 @@ static int igb_runtime_idle(struct device *dev)
|
|
|
return -EBUSY;
|
|
|
}
|
|
|
|
|
|
-static int igb_runtime_suspend(struct device *dev)
|
|
|
+static int __maybe_unused igb_runtime_suspend(struct device *dev)
|
|
|
{
|
|
|
struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
int retval;
|
|
|
@@ -8124,11 +8133,10 @@ static int igb_runtime_suspend(struct device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int igb_runtime_resume(struct device *dev)
|
|
|
+static int __maybe_unused igb_runtime_resume(struct device *dev)
|
|
|
{
|
|
|
return igb_resume(dev);
|
|
|
}
|
|
|
-#endif /* CONFIG_PM */
|
|
|
|
|
|
static void igb_shutdown(struct pci_dev *pdev)
|
|
|
{
|