Commit f44dea34 authored by David S. Miller's avatar David S. Miller

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 2017-10-10

This series contains updates to e1000e and igb.

Benjamin Poirier provides several fixes for e1000e, starting with a
correction to the return status which was always returning success even
if it was not successful.  Fixed code comments to reflect the actual
code behavior.  Fixed the conditional test for the correct return
value.  Fixed a potential race condition reported by Lennart Sorensen,
where the single flag get_link_status is used to signal two different
states.

Sasha fixes a buffer overrun for i219 devices, where the chipset had
reduced the round-trip latency for the LAN controller DMA accesses
which in some high performance cases caused a buffer overrun while
processing the DMA transactions.

Willem de Bruijn changes the default behavior of e1000e to use the
burst mode settings by default unless the user specifies the
receive interrupt delay (RxIntDelay).

Florian Fainelli updates the driver to differentiate between when
e1000e_put_txbuf() is called from normal reclamation or when a
DMA mapping failure to make the driver more "drop monitor friendly".

Christophe JAILLET fixes a potential NULL pointer dereference by
properly returning -ENOMEM on memory allocation failures.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents b88d12e4 18eb8636
...@@ -398,6 +398,7 @@ ...@@ -398,6 +398,7 @@
#define E1000_ICR_LSC 0x00000004 /* Link Status Change */ #define E1000_ICR_LSC 0x00000004 /* Link Status Change */
#define E1000_ICR_RXSEQ 0x00000008 /* Rx sequence error */ #define E1000_ICR_RXSEQ 0x00000008 /* Rx sequence error */
#define E1000_ICR_RXDMT0 0x00000010 /* Rx desc min. threshold (0) */ #define E1000_ICR_RXDMT0 0x00000010 /* Rx desc min. threshold (0) */
#define E1000_ICR_RXO 0x00000040 /* Receiver Overrun */
#define E1000_ICR_RXT0 0x00000080 /* Rx timer intr (ring 0) */ #define E1000_ICR_RXT0 0x00000080 /* Rx timer intr (ring 0) */
#define E1000_ICR_ECCER 0x00400000 /* Uncorrectable ECC Error */ #define E1000_ICR_ECCER 0x00400000 /* Uncorrectable ECC Error */
/* If this bit asserted, the driver should claim the interrupt */ /* If this bit asserted, the driver should claim the interrupt */
......
...@@ -94,10 +94,6 @@ struct e1000_info; ...@@ -94,10 +94,6 @@ struct e1000_info;
*/ */
#define E1000_CHECK_RESET_COUNT 25 #define E1000_CHECK_RESET_COUNT 25
#define DEFAULT_RDTR 0
#define DEFAULT_RADV 8
#define BURST_RDTR 0x20
#define BURST_RADV 0x20
#define PCICFG_DESC_RING_STATUS 0xe4 #define PCICFG_DESC_RING_STATUS 0xe4
#define FLUSH_DESC_REQUIRED 0x100 #define FLUSH_DESC_REQUIRED 0x100
......
...@@ -410,6 +410,9 @@ void e1000e_clear_hw_cntrs_base(struct e1000_hw *hw) ...@@ -410,6 +410,9 @@ void e1000e_clear_hw_cntrs_base(struct e1000_hw *hw)
* Checks to see of the link status of the hardware has changed. If a * Checks to see of the link status of the hardware has changed. If a
* change in link status has been detected, then we read the PHY registers * change in link status has been detected, then we read the PHY registers
* to get the current speed/duplex if link exists. * to get the current speed/duplex if link exists.
*
* Returns a negative error code (-E1000_ERR_*) or 0 (link down) or 1 (link
* up).
**/ **/
s32 e1000e_check_for_copper_link(struct e1000_hw *hw) s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
{ {
...@@ -423,7 +426,7 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw) ...@@ -423,7 +426,7 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
* Change or Rx Sequence Error interrupt. * Change or Rx Sequence Error interrupt.
*/ */
if (!mac->get_link_status) if (!mac->get_link_status)
return 0; return 1;
/* First we want to see if the MII Status Register reports /* First we want to see if the MII Status Register reports
* link. If so, then we want to get the current speed/duplex * link. If so, then we want to get the current speed/duplex
...@@ -461,10 +464,12 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw) ...@@ -461,10 +464,12 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
* different link partner. * different link partner.
*/ */
ret_val = e1000e_config_fc_after_link_up(hw); ret_val = e1000e_config_fc_after_link_up(hw);
if (ret_val) if (ret_val) {
e_dbg("Error configuring flow control\n"); e_dbg("Error configuring flow control\n");
return ret_val;
}
return ret_val; return 1;
} }
/** /**
......
...@@ -1071,7 +1071,8 @@ static bool e1000_clean_rx_irq(struct e1000_ring *rx_ring, int *work_done, ...@@ -1071,7 +1071,8 @@ static bool e1000_clean_rx_irq(struct e1000_ring *rx_ring, int *work_done,
} }
static void e1000_put_txbuf(struct e1000_ring *tx_ring, static void e1000_put_txbuf(struct e1000_ring *tx_ring,
struct e1000_buffer *buffer_info) struct e1000_buffer *buffer_info,
bool drop)
{ {
struct e1000_adapter *adapter = tx_ring->adapter; struct e1000_adapter *adapter = tx_ring->adapter;
...@@ -1085,7 +1086,10 @@ static void e1000_put_txbuf(struct e1000_ring *tx_ring, ...@@ -1085,7 +1086,10 @@ static void e1000_put_txbuf(struct e1000_ring *tx_ring,
buffer_info->dma = 0; buffer_info->dma = 0;
} }
if (buffer_info->skb) { if (buffer_info->skb) {
dev_kfree_skb_any(buffer_info->skb); if (drop)
dev_kfree_skb_any(buffer_info->skb);
else
dev_consume_skb_any(buffer_info->skb);
buffer_info->skb = NULL; buffer_info->skb = NULL;
} }
buffer_info->time_stamp = 0; buffer_info->time_stamp = 0;
...@@ -1199,7 +1203,7 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work) ...@@ -1199,7 +1203,7 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)
wmb(); /* force write prior to skb_tstamp_tx */ wmb(); /* force write prior to skb_tstamp_tx */
skb_tstamp_tx(skb, &shhwtstamps); skb_tstamp_tx(skb, &shhwtstamps);
dev_kfree_skb_any(skb); dev_consume_skb_any(skb);
} else if (time_after(jiffies, adapter->tx_hwtstamp_start } else if (time_after(jiffies, adapter->tx_hwtstamp_start
+ adapter->tx_timeout_factor * HZ)) { + adapter->tx_timeout_factor * HZ)) {
dev_kfree_skb_any(adapter->tx_hwtstamp_skb); dev_kfree_skb_any(adapter->tx_hwtstamp_skb);
...@@ -1254,7 +1258,7 @@ static bool e1000_clean_tx_irq(struct e1000_ring *tx_ring) ...@@ -1254,7 +1258,7 @@ static bool e1000_clean_tx_irq(struct e1000_ring *tx_ring)
} }
} }
e1000_put_txbuf(tx_ring, buffer_info); e1000_put_txbuf(tx_ring, buffer_info, false);
tx_desc->upper.data = 0; tx_desc->upper.data = 0;
i++; i++;
...@@ -1910,14 +1914,30 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data) ...@@ -1910,14 +1914,30 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data)
struct net_device *netdev = data; struct net_device *netdev = data;
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 icr;
bool enable = true;
icr = er32(ICR);
if (icr & E1000_ICR_RXO) {
ew32(ICR, E1000_ICR_RXO);
enable = false;
/* napi poll will re-enable Other, make sure it runs */
if (napi_schedule_prep(&adapter->napi)) {
adapter->total_rx_bytes = 0;
adapter->total_rx_packets = 0;
__napi_schedule(&adapter->napi);
}
}
if (icr & E1000_ICR_LSC) {
ew32(ICR, E1000_ICR_LSC);
hw->mac.get_link_status = true;
/* guard against interrupt when we're going down */
if (!test_bit(__E1000_DOWN, &adapter->state))
mod_timer(&adapter->watchdog_timer, jiffies + 1);
}
hw->mac.get_link_status = true; if (enable && !test_bit(__E1000_DOWN, &adapter->state))
/* guard against interrupt when we're going down */
if (!test_bit(__E1000_DOWN, &adapter->state)) {
mod_timer(&adapter->watchdog_timer, jiffies + 1);
ew32(IMS, E1000_IMS_OTHER); ew32(IMS, E1000_IMS_OTHER);
}
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -2421,7 +2441,7 @@ static void e1000_clean_tx_ring(struct e1000_ring *tx_ring) ...@@ -2421,7 +2441,7 @@ static void e1000_clean_tx_ring(struct e1000_ring *tx_ring)
for (i = 0; i < tx_ring->count; i++) { for (i = 0; i < tx_ring->count; i++) {
buffer_info = &tx_ring->buffer_info[i]; buffer_info = &tx_ring->buffer_info[i];
e1000_put_txbuf(tx_ring, buffer_info); e1000_put_txbuf(tx_ring, buffer_info, false);
} }
netdev_reset_queue(adapter->netdev); netdev_reset_queue(adapter->netdev);
...@@ -2687,7 +2707,8 @@ static int e1000e_poll(struct napi_struct *napi, int weight) ...@@ -2687,7 +2707,8 @@ static int e1000e_poll(struct napi_struct *napi, int weight)
napi_complete_done(napi, work_done); napi_complete_done(napi, work_done);
if (!test_bit(__E1000_DOWN, &adapter->state)) { if (!test_bit(__E1000_DOWN, &adapter->state)) {
if (adapter->msix_entries) if (adapter->msix_entries)
ew32(IMS, adapter->rx_ring->ims_val); ew32(IMS, adapter->rx_ring->ims_val |
E1000_IMS_OTHER);
else else
e1000_irq_enable(adapter); e1000_irq_enable(adapter);
} }
...@@ -3004,8 +3025,8 @@ static void e1000_configure_tx(struct e1000_adapter *adapter) ...@@ -3004,8 +3025,8 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
hw->mac.ops.config_collision_dist(hw); hw->mac.ops.config_collision_dist(hw);
/* SPT and CNP Si errata workaround to avoid data corruption */ /* SPT and KBL Si errata workaround to avoid data corruption */
if (hw->mac.type >= e1000_pch_spt) { if (hw->mac.type == e1000_pch_spt) {
u32 reg_val; u32 reg_val;
reg_val = er32(IOSFPC); reg_val = er32(IOSFPC);
...@@ -3013,7 +3034,9 @@ static void e1000_configure_tx(struct e1000_adapter *adapter) ...@@ -3013,7 +3034,9 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
ew32(IOSFPC, reg_val); ew32(IOSFPC, reg_val);
reg_val = er32(TARC(0)); reg_val = er32(TARC(0));
reg_val |= E1000_TARC0_CB_MULTIQ_3_REQ; /* SPT and KBL Si errata workaround to avoid Tx hang */
reg_val &= ~BIT(28);
reg_val |= BIT(29);
ew32(TARC(0), reg_val); ew32(TARC(0), reg_val);
} }
} }
...@@ -3223,14 +3246,6 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) ...@@ -3223,14 +3246,6 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
*/ */
ew32(RXDCTL(0), E1000_RXDCTL_DMA_BURST_ENABLE); ew32(RXDCTL(0), E1000_RXDCTL_DMA_BURST_ENABLE);
ew32(RXDCTL(1), E1000_RXDCTL_DMA_BURST_ENABLE); ew32(RXDCTL(1), E1000_RXDCTL_DMA_BURST_ENABLE);
/* override the delay timers for enabling bursting, only if
* the value was not set by the user via module options
*/
if (adapter->rx_int_delay == DEFAULT_RDTR)
adapter->rx_int_delay = BURST_RDTR;
if (adapter->rx_abs_int_delay == DEFAULT_RADV)
adapter->rx_abs_int_delay = BURST_RADV;
} }
/* set the Receive Delay Timer Register */ /* set the Receive Delay Timer Register */
...@@ -4204,7 +4219,7 @@ static void e1000e_trigger_lsc(struct e1000_adapter *adapter) ...@@ -4204,7 +4219,7 @@ static void e1000e_trigger_lsc(struct e1000_adapter *adapter)
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if (adapter->msix_entries) if (adapter->msix_entries)
ew32(ICS, E1000_ICS_OTHER); ew32(ICS, E1000_ICS_LSC | E1000_ICS_OTHER);
else else
ew32(ICS, E1000_ICS_LSC); ew32(ICS, E1000_ICS_LSC);
} }
...@@ -5074,14 +5089,14 @@ static bool e1000e_has_link(struct e1000_adapter *adapter) ...@@ -5074,14 +5089,14 @@ static bool e1000e_has_link(struct e1000_adapter *adapter)
/* get_link_status is set on LSC (link status) interrupt or /* get_link_status is set on LSC (link status) interrupt or
* Rx sequence error interrupt. get_link_status will stay * Rx sequence error interrupt. get_link_status will stay
* false until the check_for_link establishes link * true until the check_for_link establishes link
* for copper adapters ONLY * for copper adapters ONLY
*/ */
switch (hw->phy.media_type) { switch (hw->phy.media_type) {
case e1000_media_type_copper: case e1000_media_type_copper:
if (hw->mac.get_link_status) { if (hw->mac.get_link_status) {
ret_val = hw->mac.ops.check_for_link(hw); ret_val = hw->mac.ops.check_for_link(hw);
link_active = !hw->mac.get_link_status; link_active = ret_val > 0;
} else { } else {
link_active = true; link_active = true;
} }
...@@ -5092,14 +5107,14 @@ static bool e1000e_has_link(struct e1000_adapter *adapter) ...@@ -5092,14 +5107,14 @@ static bool e1000e_has_link(struct e1000_adapter *adapter)
break; break;
case e1000_media_type_internal_serdes: case e1000_media_type_internal_serdes:
ret_val = hw->mac.ops.check_for_link(hw); ret_val = hw->mac.ops.check_for_link(hw);
link_active = adapter->hw.mac.serdes_has_link; link_active = hw->mac.serdes_has_link;
break; break;
default: default:
case e1000_media_type_unknown: case e1000_media_type_unknown:
break; break;
} }
if ((ret_val == E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) && if ((ret_val == -E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) &&
(er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) { (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) {
/* See e1000_kmrn_lock_loss_workaround_ich8lan() */ /* See e1000_kmrn_lock_loss_workaround_ich8lan() */
e_info("Gigabit has been disabled, downgrading speed\n"); e_info("Gigabit has been disabled, downgrading speed\n");
...@@ -5614,7 +5629,7 @@ static int e1000_tx_map(struct e1000_ring *tx_ring, struct sk_buff *skb, ...@@ -5614,7 +5629,7 @@ static int e1000_tx_map(struct e1000_ring *tx_ring, struct sk_buff *skb,
i += tx_ring->count; i += tx_ring->count;
i--; i--;
buffer_info = &tx_ring->buffer_info[i]; buffer_info = &tx_ring->buffer_info[i];
e1000_put_txbuf(tx_ring, buffer_info); e1000_put_txbuf(tx_ring, buffer_info, true);
} }
return 0; return 0;
...@@ -7408,7 +7423,7 @@ static void e1000_remove(struct pci_dev *pdev) ...@@ -7408,7 +7423,7 @@ static void e1000_remove(struct pci_dev *pdev)
if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) { if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) {
cancel_work_sync(&adapter->tx_hwtstamp_work); cancel_work_sync(&adapter->tx_hwtstamp_work);
if (adapter->tx_hwtstamp_skb) { if (adapter->tx_hwtstamp_skb) {
dev_kfree_skb_any(adapter->tx_hwtstamp_skb); dev_consume_skb_any(adapter->tx_hwtstamp_skb);
adapter->tx_hwtstamp_skb = NULL; adapter->tx_hwtstamp_skb = NULL;
} }
} }
......
...@@ -73,17 +73,25 @@ E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay"); ...@@ -73,17 +73,25 @@ E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay");
/* Receive Interrupt Delay in units of 1.024 microseconds /* Receive Interrupt Delay in units of 1.024 microseconds
* hardware will likely hang if you set this to anything but zero. * hardware will likely hang if you set this to anything but zero.
* *
* Burst variant is used as default if device has FLAG2_DMA_BURST.
*
* Valid Range: 0-65535 * Valid Range: 0-65535
*/ */
E1000_PARAM(RxIntDelay, "Receive Interrupt Delay"); E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");
#define DEFAULT_RDTR 0
#define BURST_RDTR 0x20
#define MAX_RXDELAY 0xFFFF #define MAX_RXDELAY 0xFFFF
#define MIN_RXDELAY 0 #define MIN_RXDELAY 0
/* Receive Absolute Interrupt Delay in units of 1.024 microseconds /* Receive Absolute Interrupt Delay in units of 1.024 microseconds
*
* Burst variant is used as default if device has FLAG2_DMA_BURST.
* *
* Valid Range: 0-65535 * Valid Range: 0-65535
*/ */
E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay"); E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
#define DEFAULT_RADV 8
#define BURST_RADV 0x20
#define MAX_RXABSDELAY 0xFFFF #define MAX_RXABSDELAY 0xFFFF
#define MIN_RXABSDELAY 0 #define MIN_RXABSDELAY 0
...@@ -297,6 +305,9 @@ void e1000e_check_options(struct e1000_adapter *adapter) ...@@ -297,6 +305,9 @@ void e1000e_check_options(struct e1000_adapter *adapter)
.max = MAX_RXDELAY } } .max = MAX_RXDELAY } }
}; };
if (adapter->flags2 & FLAG2_DMA_BURST)
opt.def = BURST_RDTR;
if (num_RxIntDelay > bd) { if (num_RxIntDelay > bd) {
adapter->rx_int_delay = RxIntDelay[bd]; adapter->rx_int_delay = RxIntDelay[bd];
e1000_validate_option(&adapter->rx_int_delay, &opt, e1000_validate_option(&adapter->rx_int_delay, &opt,
...@@ -307,7 +318,7 @@ void e1000e_check_options(struct e1000_adapter *adapter) ...@@ -307,7 +318,7 @@ void e1000e_check_options(struct e1000_adapter *adapter)
} }
/* Receive Absolute Interrupt Delay */ /* Receive Absolute Interrupt Delay */
{ {
static const struct e1000_option opt = { static struct e1000_option opt = {
.type = range_option, .type = range_option,
.name = "Receive Absolute Interrupt Delay", .name = "Receive Absolute Interrupt Delay",
.err = "using default of " .err = "using default of "
...@@ -317,6 +328,9 @@ void e1000e_check_options(struct e1000_adapter *adapter) ...@@ -317,6 +328,9 @@ void e1000e_check_options(struct e1000_adapter *adapter)
.max = MAX_RXABSDELAY } } .max = MAX_RXABSDELAY } }
}; };
if (adapter->flags2 & FLAG2_DMA_BURST)
opt.def = BURST_RADV;
if (num_RxAbsIntDelay > bd) { if (num_RxAbsIntDelay > bd) {
adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; adapter->rx_abs_int_delay = RxAbsIntDelay[bd];
e1000_validate_option(&adapter->rx_abs_int_delay, &opt, e1000_validate_option(&adapter->rx_abs_int_delay, &opt,
......
...@@ -1744,6 +1744,7 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, ...@@ -1744,6 +1744,7 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations,
s32 ret_val = 0; s32 ret_val = 0;
u16 i, phy_status; u16 i, phy_status;
*success = false;
for (i = 0; i < iterations; i++) { for (i = 0; i < iterations; i++) {
/* Some PHYs require the MII_BMSR register to be read /* Some PHYs require the MII_BMSR register to be read
* twice due to the link bit being sticky. No harm doing * twice due to the link bit being sticky. No harm doing
...@@ -1763,16 +1764,16 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, ...@@ -1763,16 +1764,16 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations,
ret_val = e1e_rphy(hw, MII_BMSR, &phy_status); ret_val = e1e_rphy(hw, MII_BMSR, &phy_status);
if (ret_val) if (ret_val)
break; break;
if (phy_status & BMSR_LSTATUS) if (phy_status & BMSR_LSTATUS) {
*success = true;
break; break;
}
if (usec_interval >= 1000) if (usec_interval >= 1000)
msleep(usec_interval / 1000); msleep(usec_interval / 1000);
else else
udelay(usec_interval); udelay(usec_interval);
} }
*success = (i < iterations);
return ret_val; return ret_val;
} }
......
...@@ -3162,6 +3162,8 @@ static int igb_sw_init(struct igb_adapter *adapter) ...@@ -3162,6 +3162,8 @@ static int igb_sw_init(struct igb_adapter *adapter)
/* Setup and initialize a copy of the hw vlan table array */ /* Setup and initialize a copy of the hw vlan table array */
adapter->shadow_vfta = kcalloc(E1000_VLAN_FILTER_TBL_SIZE, sizeof(u32), adapter->shadow_vfta = kcalloc(E1000_VLAN_FILTER_TBL_SIZE, sizeof(u32),
GFP_ATOMIC); GFP_ATOMIC);
if (!adapter->shadow_vfta)
return -ENOMEM;
/* This call may decrease the number of queues */ /* This call may decrease the number of queues */
if (igb_init_interrupt_scheme(adapter, true)) { if (igb_init_interrupt_scheme(adapter, true)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment