|
@@ -76,7 +76,7 @@ char ixgbe_default_device_descr[] =
|
|
|
static char ixgbe_default_device_descr[] =
|
|
|
"Intel(R) 10 Gigabit Network Connection";
|
|
|
#endif
|
|
|
-#define DRV_VERSION "5.0.0-k"
|
|
|
+#define DRV_VERSION "5.1.0-k"
|
|
|
const char ixgbe_driver_version[] = DRV_VERSION;
|
|
|
static const char ixgbe_copyright[] =
|
|
|
"Copyright (c) 1999-2016 Intel Corporation.";
|
|
@@ -7635,6 +7635,7 @@ static void ixgbe_service_task(struct work_struct *work)
|
|
|
if (test_bit(__IXGBE_PTP_RUNNING, &adapter->state)) {
|
|
|
ixgbe_ptp_overflow_check(adapter);
|
|
|
ixgbe_ptp_rx_hang(adapter);
|
|
|
+ ixgbe_ptp_tx_hang(adapter);
|
|
|
}
|
|
|
|
|
|
ixgbe_service_event_complete(adapter);
|
|
@@ -7875,9 +7876,9 @@ static inline int ixgbe_maybe_stop_tx(struct ixgbe_ring *tx_ring, u16 size)
|
|
|
#define IXGBE_TXD_CMD (IXGBE_TXD_CMD_EOP | \
|
|
|
IXGBE_TXD_CMD_RS)
|
|
|
|
|
|
-static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
|
|
|
- struct ixgbe_tx_buffer *first,
|
|
|
- const u8 hdr_len)
|
|
|
+static int ixgbe_tx_map(struct ixgbe_ring *tx_ring,
|
|
|
+ struct ixgbe_tx_buffer *first,
|
|
|
+ const u8 hdr_len)
|
|
|
{
|
|
|
struct sk_buff *skb = first->skb;
|
|
|
struct ixgbe_tx_buffer *tx_buffer;
|
|
@@ -8004,7 +8005,7 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
|
|
|
mmiowb();
|
|
|
}
|
|
|
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
dma_error:
|
|
|
dev_err(tx_ring->dev, "TX DMA map failed\n");
|
|
|
tx_buffer = &tx_ring->tx_buffer_info[i];
|
|
@@ -8034,6 +8035,8 @@ dma_error:
|
|
|
first->skb = NULL;
|
|
|
|
|
|
tx_ring->next_to_use = i;
|
|
|
+
|
|
|
+ return -1;
|
|
|
}
|
|
|
|
|
|
static void ixgbe_atr(struct ixgbe_ring *ring,
|
|
@@ -8335,16 +8338,19 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
|
|
|
protocol = vlan_get_protocol(skb);
|
|
|
|
|
|
if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) &&
|
|
|
- adapter->ptp_clock &&
|
|
|
- !test_and_set_bit_lock(__IXGBE_PTP_TX_IN_PROGRESS,
|
|
|
- &adapter->state)) {
|
|
|
- skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
|
|
- tx_flags |= IXGBE_TX_FLAGS_TSTAMP;
|
|
|
-
|
|
|
- /* schedule check for Tx timestamp */
|
|
|
- adapter->ptp_tx_skb = skb_get(skb);
|
|
|
- adapter->ptp_tx_start = jiffies;
|
|
|
- schedule_work(&adapter->ptp_tx_work);
|
|
|
+ adapter->ptp_clock) {
|
|
|
+ if (!test_and_set_bit_lock(__IXGBE_PTP_TX_IN_PROGRESS,
|
|
|
+ &adapter->state)) {
|
|
|
+ skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
|
|
+ tx_flags |= IXGBE_TX_FLAGS_TSTAMP;
|
|
|
+
|
|
|
+ /* schedule check for Tx timestamp */
|
|
|
+ adapter->ptp_tx_skb = skb_get(skb);
|
|
|
+ adapter->ptp_tx_start = jiffies;
|
|
|
+ schedule_work(&adapter->ptp_tx_work);
|
|
|
+ } else {
|
|
|
+ adapter->tx_hwtstamp_skipped++;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
skb_tx_timestamp(skb);
|
|
@@ -8407,13 +8413,21 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
|
|
|
#ifdef IXGBE_FCOE
|
|
|
xmit_fcoe:
|
|
|
#endif /* IXGBE_FCOE */
|
|
|
- ixgbe_tx_map(tx_ring, first, hdr_len);
|
|
|
+ if (ixgbe_tx_map(tx_ring, first, hdr_len))
|
|
|
+ goto cleanup_tx_timestamp;
|
|
|
|
|
|
return NETDEV_TX_OK;
|
|
|
|
|
|
out_drop:
|
|
|
dev_kfree_skb_any(first->skb);
|
|
|
first->skb = NULL;
|
|
|
+cleanup_tx_timestamp:
|
|
|
+ if (unlikely(tx_flags & IXGBE_TX_FLAGS_TSTAMP)) {
|
|
|
+ dev_kfree_skb_any(adapter->ptp_tx_skb);
|
|
|
+ adapter->ptp_tx_skb = NULL;
|
|
|
+ cancel_work_sync(&adapter->ptp_tx_work);
|
|
|
+ clear_bit_unlock(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state);
|
|
|
+ }
|
|
|
|
|
|
return NETDEV_TX_OK;
|
|
|
}
|
|
@@ -10358,11 +10372,11 @@ skip_sriov:
|
|
|
"hardware.\n");
|
|
|
}
|
|
|
strcpy(netdev->name, "eth%d");
|
|
|
+ pci_set_drvdata(pdev, adapter);
|
|
|
err = register_netdev(netdev);
|
|
|
if (err)
|
|
|
goto err_register;
|
|
|
|
|
|
- pci_set_drvdata(pdev, adapter);
|
|
|
|
|
|
/* power down the optics for 82599 SFP+ fiber */
|
|
|
if (hw->mac.ops.disable_tx_laser)
|