Commit 1d9c5a04 authored by David S. Miller's avatar David S. Miller

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next

Jeff Kirsher says:

====================
This series contains updates to igb and ixgbe.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 8caaf7b6 6699938b
...@@ -60,8 +60,8 @@ ...@@ -60,8 +60,8 @@
#include "igb.h" #include "igb.h"
#define MAJ 4 #define MAJ 4
#define MIN 0 #define MIN 1
#define BUILD 17 #define BUILD 2
#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \ #define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
__stringify(BUILD) "-k" __stringify(BUILD) "-k"
char igb_driver_name[] = "igb"; char igb_driver_name[] = "igb";
...@@ -122,6 +122,7 @@ static void igb_remove(struct pci_dev *pdev); ...@@ -122,6 +122,7 @@ static void igb_remove(struct pci_dev *pdev);
static int igb_sw_init(struct igb_adapter *); static int igb_sw_init(struct igb_adapter *);
static int igb_open(struct net_device *); static int igb_open(struct net_device *);
static int igb_close(struct net_device *); static int igb_close(struct net_device *);
static void igb_configure(struct igb_adapter *);
static void igb_configure_tx(struct igb_adapter *); static void igb_configure_tx(struct igb_adapter *);
static void igb_configure_rx(struct igb_adapter *); static void igb_configure_rx(struct igb_adapter *);
static void igb_clean_all_tx_rings(struct igb_adapter *); static void igb_clean_all_tx_rings(struct igb_adapter *);
...@@ -831,17 +832,18 @@ static int igb_request_msix(struct igb_adapter *adapter) ...@@ -831,17 +832,18 @@ static int igb_request_msix(struct igb_adapter *adapter)
{ {
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
int i, err = 0, vector = 0; int i, err = 0, vector = 0, free_vector = 0;
err = request_irq(adapter->msix_entries[vector].vector, err = request_irq(adapter->msix_entries[vector].vector,
igb_msix_other, 0, netdev->name, adapter); igb_msix_other, 0, netdev->name, adapter);
if (err) if (err)
goto out; goto err_out;
vector++;
for (i = 0; i < adapter->num_q_vectors; i++) { for (i = 0; i < adapter->num_q_vectors; i++) {
struct igb_q_vector *q_vector = adapter->q_vector[i]; struct igb_q_vector *q_vector = adapter->q_vector[i];
vector++;
q_vector->itr_register = hw->hw_addr + E1000_EITR(vector); q_vector->itr_register = hw->hw_addr + E1000_EITR(vector);
if (q_vector->rx.ring && q_vector->tx.ring) if (q_vector->rx.ring && q_vector->tx.ring)
...@@ -860,13 +862,22 @@ static int igb_request_msix(struct igb_adapter *adapter) ...@@ -860,13 +862,22 @@ static int igb_request_msix(struct igb_adapter *adapter)
igb_msix_ring, 0, q_vector->name, igb_msix_ring, 0, q_vector->name,
q_vector); q_vector);
if (err) if (err)
goto out; goto err_free;
vector++;
} }
igb_configure_msix(adapter); igb_configure_msix(adapter);
return 0; return 0;
out:
err_free:
/* free already assigned IRQs */
free_irq(adapter->msix_entries[free_vector++].vector, adapter);
vector--;
for (i = 0; i < vector; i++) {
free_irq(adapter->msix_entries[free_vector++].vector,
adapter->q_vector[i]);
}
err_out:
return err; return err;
} }
...@@ -948,11 +959,14 @@ static void igb_clear_interrupt_scheme(struct igb_adapter *adapter) ...@@ -948,11 +959,14 @@ static void igb_clear_interrupt_scheme(struct igb_adapter *adapter)
* Attempt to configure interrupts using the best available * Attempt to configure interrupts using the best available
* capabilities of the hardware and kernel. * capabilities of the hardware and kernel.
**/ **/
static void igb_set_interrupt_capability(struct igb_adapter *adapter) static void igb_set_interrupt_capability(struct igb_adapter *adapter, bool msix)
{ {
int err; int err;
int numvecs, i; int numvecs, i;
if (!msix)
goto msi_only;
/* Number of supported queues. */ /* Number of supported queues. */
adapter->num_rx_queues = adapter->rss_queues; adapter->num_rx_queues = adapter->rss_queues;
if (adapter->vfs_allocated_count) if (adapter->vfs_allocated_count)
...@@ -1199,12 +1213,12 @@ static int igb_alloc_q_vectors(struct igb_adapter *adapter) ...@@ -1199,12 +1213,12 @@ static int igb_alloc_q_vectors(struct igb_adapter *adapter)
* *
* This function initializes the interrupts and allocates all of the queues. * This function initializes the interrupts and allocates all of the queues.
**/ **/
static int igb_init_interrupt_scheme(struct igb_adapter *adapter) static int igb_init_interrupt_scheme(struct igb_adapter *adapter, bool msix)
{ {
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
int err; int err;
igb_set_interrupt_capability(adapter); igb_set_interrupt_capability(adapter, msix);
err = igb_alloc_q_vectors(adapter); err = igb_alloc_q_vectors(adapter);
if (err) { if (err) {
...@@ -1240,20 +1254,15 @@ static int igb_request_irq(struct igb_adapter *adapter) ...@@ -1240,20 +1254,15 @@ static int igb_request_irq(struct igb_adapter *adapter)
/* fall back to MSI */ /* fall back to MSI */
igb_free_all_tx_resources(adapter); igb_free_all_tx_resources(adapter);
igb_free_all_rx_resources(adapter); igb_free_all_rx_resources(adapter);
igb_clear_interrupt_scheme(adapter); igb_clear_interrupt_scheme(adapter);
if (!pci_enable_msi(pdev)) err = igb_init_interrupt_scheme(adapter, false);
adapter->flags |= IGB_FLAG_HAS_MSI; if (err)
adapter->num_tx_queues = 1;
adapter->num_rx_queues = 1;
adapter->num_q_vectors = 1;
err = igb_alloc_q_vectors(adapter);
if (err) {
dev_err(&pdev->dev,
"Unable to allocate memory for vectors\n");
goto request_done; goto request_done;
}
igb_setup_all_tx_resources(adapter); igb_setup_all_tx_resources(adapter);
igb_setup_all_rx_resources(adapter); igb_setup_all_rx_resources(adapter);
igb_configure(adapter);
} }
igb_assign_vector(adapter->q_vector[0], 0); igb_assign_vector(adapter->q_vector[0], 0);
...@@ -2444,7 +2453,7 @@ static int igb_sw_init(struct igb_adapter *adapter) ...@@ -2444,7 +2453,7 @@ static int igb_sw_init(struct igb_adapter *adapter)
GFP_ATOMIC); GFP_ATOMIC);
/* This call may decrease the number of queues */ /* This call may decrease the number of queues */
if (igb_init_interrupt_scheme(adapter)) { if (igb_init_interrupt_scheme(adapter, true)) {
dev_err(&pdev->dev, "Unable to allocate memory for queues\n"); dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
return -ENOMEM; return -ENOMEM;
} }
...@@ -6818,7 +6827,7 @@ static int igb_resume(struct device *dev) ...@@ -6818,7 +6827,7 @@ static int igb_resume(struct device *dev)
pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3hot, 0);
pci_enable_wake(pdev, PCI_D3cold, 0); pci_enable_wake(pdev, PCI_D3cold, 0);
if (igb_init_interrupt_scheme(adapter)) { if (igb_init_interrupt_scheme(adapter, true)) {
dev_err(&pdev->dev, "Unable to allocate memory for queues\n"); dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -1078,7 +1078,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw) ...@@ -1078,7 +1078,7 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr); hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr);
/* Add the SAN MAC address to the RAR only if it's a valid address */ /* Add the SAN MAC address to the RAR only if it's a valid address */
if (ixgbe_validate_mac_addr(hw->mac.san_addr) == 0) { if (is_valid_ether_addr(hw->mac.san_addr)) {
hw->mac.ops.set_rar(hw, hw->mac.num_rar_entries - 1, hw->mac.ops.set_rar(hw, hw->mac.num_rar_entries - 1,
hw->mac.san_addr, 0, IXGBE_RAH_AV); hw->mac.san_addr, 0, IXGBE_RAH_AV);
......
...@@ -1782,29 +1782,6 @@ s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw) ...@@ -1782,29 +1782,6 @@ s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw)
return status; return status;
} }
/**
* ixgbe_validate_mac_addr - Validate MAC address
* @mac_addr: pointer to MAC address.
*
* Tests a MAC address to ensure it is a valid Individual Address
**/
s32 ixgbe_validate_mac_addr(u8 *mac_addr)
{
s32 status = 0;
/* Make sure it is not a multicast address */
if (IXGBE_IS_MULTICAST(mac_addr))
status = IXGBE_ERR_INVALID_MAC_ADDR;
/* Not a broadcast address */
else if (IXGBE_IS_BROADCAST(mac_addr))
status = IXGBE_ERR_INVALID_MAC_ADDR;
/* Reject the zero address */
else if (is_zero_ether_addr(mac_addr))
status = IXGBE_ERR_INVALID_MAC_ADDR;
return status;
}
/** /**
* ixgbe_set_rar_generic - Set Rx address register * ixgbe_set_rar_generic - Set Rx address register
* @hw: pointer to hardware structure * @hw: pointer to hardware structure
...@@ -1909,8 +1886,7 @@ s32 ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw) ...@@ -1909,8 +1886,7 @@ s32 ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw)
* to the permanent address. * to the permanent address.
* Otherwise, use the permanent address from the eeprom. * Otherwise, use the permanent address from the eeprom.
*/ */
if (ixgbe_validate_mac_addr(hw->mac.addr) == if (!is_valid_ether_addr(hw->mac.addr)) {
IXGBE_ERR_INVALID_MAC_ADDR) {
/* Get the MAC address from the RAR0 for later reference */ /* Get the MAC address from the RAR0 for later reference */
hw->mac.ops.get_mac_addr(hw, hw->mac.addr); hw->mac.ops.get_mac_addr(hw, hw->mac.addr);
......
...@@ -81,7 +81,6 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw); ...@@ -81,7 +81,6 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw);
s32 ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw); s32 ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw);
void ixgbe_fc_autoneg(struct ixgbe_hw *hw); void ixgbe_fc_autoneg(struct ixgbe_hw *hw);
s32 ixgbe_validate_mac_addr(u8 *mac_addr);
s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask); s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask);
void ixgbe_release_swfw_sync(struct ixgbe_hw *hw, u16 mask); void ixgbe_release_swfw_sync(struct ixgbe_hw *hw, u16 mask);
s32 ixgbe_get_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr); s32 ixgbe_get_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr);
......
...@@ -4467,6 +4467,7 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter) ...@@ -4467,6 +4467,7 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter)
struct ixgbe_hw *hw = &adapter->hw; struct ixgbe_hw *hw = &adapter->hw;
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
unsigned int rss; unsigned int rss;
u32 fwsm;
#ifdef CONFIG_IXGBE_DCB #ifdef CONFIG_IXGBE_DCB
int j; int j;
struct tc_configuration *tc; struct tc_configuration *tc;
...@@ -4490,6 +4491,8 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter) ...@@ -4490,6 +4491,8 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter)
adapter->max_q_vectors = MAX_Q_VECTORS_82598; adapter->max_q_vectors = MAX_Q_VECTORS_82598;
break; break;
case ixgbe_mac_X540: case ixgbe_mac_X540:
fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
if (fwsm & IXGBE_FWSM_TS_ENABLED)
adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE; adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE;
case ixgbe_mac_82599EB: case ixgbe_mac_82599EB:
adapter->max_q_vectors = MAX_Q_VECTORS_82599; adapter->max_q_vectors = MAX_Q_VECTORS_82599;
...@@ -7444,7 +7447,7 @@ static int ixgbe_probe(struct pci_dev *pdev, ...@@ -7444,7 +7447,7 @@ static int ixgbe_probe(struct pci_dev *pdev,
memcpy(netdev->dev_addr, hw->mac.perm_addr, netdev->addr_len); memcpy(netdev->dev_addr, hw->mac.perm_addr, netdev->addr_len);
memcpy(netdev->perm_addr, hw->mac.perm_addr, netdev->addr_len); memcpy(netdev->perm_addr, hw->mac.perm_addr, netdev->addr_len);
if (ixgbe_validate_mac_addr(netdev->perm_addr)) { if (!is_valid_ether_addr(netdev->perm_addr)) {
e_dev_err("invalid MAC address\n"); e_dev_err("invalid MAC address\n");
err = -EIO; err = -EIO;
goto err_sw_init; goto err_sw_init;
......
...@@ -1834,15 +1834,6 @@ enum { ...@@ -1834,15 +1834,6 @@ enum {
/* Number of 100 microseconds we wait for PCI Express master disable */ /* Number of 100 microseconds we wait for PCI Express master disable */
#define IXGBE_PCI_MASTER_DISABLE_TIMEOUT 800 #define IXGBE_PCI_MASTER_DISABLE_TIMEOUT 800
/* Check whether address is multicast. This is little-endian specific check.*/
#define IXGBE_IS_MULTICAST(Address) \
(bool)(((u8 *)(Address))[0] & ((u8)0x01))
/* Check whether an address is broadcast. */
#define IXGBE_IS_BROADCAST(Address) \
((((u8 *)(Address))[0] == ((u8)0xff)) && \
(((u8 *)(Address))[1] == ((u8)0xff)))
/* RAH */ /* RAH */
#define IXGBE_RAH_VIND_MASK 0x003C0000 #define IXGBE_RAH_VIND_MASK 0x003C0000
#define IXGBE_RAH_VIND_SHIFT 18 #define IXGBE_RAH_VIND_SHIFT 18
...@@ -1963,6 +1954,8 @@ enum { ...@@ -1963,6 +1954,8 @@ enum {
#define IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP 0x01000000 #define IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP 0x01000000
#define IXGBE_MRQC_L3L4TXSWEN 0x00008000 #define IXGBE_MRQC_L3L4TXSWEN 0x00008000
#define IXGBE_FWSM_TS_ENABLED 0x1
/* Queue Drop Enable */ /* Queue Drop Enable */
#define IXGBE_QDE_ENABLE 0x00000001 #define IXGBE_QDE_ENABLE 0x00000001
#define IXGBE_QDE_IDX_MASK 0x00007F00 #define IXGBE_QDE_IDX_MASK 0x00007F00
......
...@@ -152,7 +152,7 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw) ...@@ -152,7 +152,7 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr); hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr);
/* Add the SAN MAC address to the RAR only if it's a valid address */ /* Add the SAN MAC address to the RAR only if it's a valid address */
if (ixgbe_validate_mac_addr(hw->mac.san_addr) == 0) { if (is_valid_ether_addr(hw->mac.san_addr)) {
hw->mac.ops.set_rar(hw, hw->mac.num_rar_entries - 1, hw->mac.ops.set_rar(hw, hw->mac.num_rar_entries - 1,
hw->mac.san_addr, 0, IXGBE_RAH_AV); hw->mac.san_addr, 0, IXGBE_RAH_AV);
......
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