Commit 94ab1ea9 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 2016-04-06

This series contains updates to e1000, e1000e, igb and Kconfig.

Alex fixes igb where we were casting the MAC address as __beXX and then
passing it into le32_to_cpu, when we could simply cast as __lexx to
maintain consistency since it is already little endian.  Then enabled
bulk free in transmit cleanup for igb.

John Holland enables igb to pickup the MAC address from a device tree
blob when CONFIG_OF has been enabled.

Doron Shikmoni fixes a bug in the output of "ethtool -m ethX" where
the data byte appeared duplicated.

Stefan fixes up e1000 and e1000e ethtool offline tests which were calling
dev_close() which causes IFF_UP to be cleared which removes teh interface
routes and some addresses, so use ndo_stop() instead.

Jiri Benc cleans up some old links in the Kconfig for Intel drivers where
we referred to a URL which is no longer valid.  I am so glad Jiri has the
time in his day to spend clicking on and testing all the URL links in the
the kernel.

Arika Chen reverts the addition of a 'rtnl_unlock()' which had a unmatched
'rtnl_lock()' call before it.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents de6099e2 d99e366f
...@@ -25,16 +25,13 @@ config E100 ...@@ -25,16 +25,13 @@ config E100
on the adapter. Look for a label that has a barcode and a number on the adapter. Look for a label that has a barcode and a number
in the format 123456-001 (six digits hyphen three digits). in the format 123456-001 (six digits hyphen three digits).
Use the above information and the Adapter & Driver ID Guide at: Use the above information and the Adapter & Driver ID Guide that
can be located at:
<http://support.intel.com/support/network/adapter/pro100/21397.htm> <http://support.intel.com>
to identify the adapter. to identify the adapter.
For the latest Intel PRO/100 network driver for Linux, see:
<http://www.intel.com/p/en_US/support/highlights/network/pro100plus>
More specific information on configuring the driver is in More specific information on configuring the driver is in
<file:Documentation/networking/e100.txt>. <file:Documentation/networking/e100.txt>.
...@@ -47,12 +44,7 @@ config E1000 ...@@ -47,12 +44,7 @@ config E1000
---help--- ---help---
This driver supports Intel(R) PRO/1000 gigabit ethernet family of This driver supports Intel(R) PRO/1000 gigabit ethernet family of
adapters. For more information on how to identify your adapter, go adapters. For more information on how to identify your adapter, go
to the Adapter & Driver ID Guide at: to the Adapter & Driver ID Guide that can be located at:
<http://support.intel.com/support/network/adapter/pro100/21397.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
...@@ -71,12 +63,8 @@ config E1000E ...@@ -71,12 +63,8 @@ config E1000E
This driver supports the PCI-Express Intel(R) PRO/1000 gigabit This driver supports the PCI-Express Intel(R) PRO/1000 gigabit
ethernet family of adapters. For PCI or PCI-X e1000 adapters, ethernet family of adapters. For PCI or PCI-X e1000 adapters,
use the regular e1000 driver For more information on how to use the regular e1000 driver For more information on how to
identify your adapter, go to the Adapter & Driver ID Guide at: identify your adapter, go to the Adapter & Driver ID Guide that
can be located at:
<http://support.intel.com/support/network/adapter/pro100/21397.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
...@@ -101,12 +89,7 @@ config IGB ...@@ -101,12 +89,7 @@ config IGB
---help--- ---help---
This driver supports Intel(R) 82575/82576 gigabit ethernet family of This driver supports Intel(R) 82575/82576 gigabit ethernet family of
adapters. For more information on how to identify your adapter, go adapters. For more information on how to identify your adapter, go
to the Adapter & Driver ID Guide at: to the Adapter & Driver ID Guide that can be located at:
<http://support.intel.com/support/network/adapter/pro100/21397.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
...@@ -142,12 +125,7 @@ config IGBVF ...@@ -142,12 +125,7 @@ config IGBVF
---help--- ---help---
This driver supports Intel(R) 82576 virtual functions. For more This driver supports Intel(R) 82576 virtual functions. For more
information on how to identify your adapter, go to the Adapter & information on how to identify your adapter, go to the Adapter &
Driver ID Guide at: Driver ID Guide that can be located at:
<http://support.intel.com/support/network/adapter/pro100/21397.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
...@@ -164,12 +142,7 @@ config IXGB ...@@ -164,12 +142,7 @@ config IXGB
This driver supports Intel(R) PRO/10GbE family of adapters for This driver supports Intel(R) PRO/10GbE family of adapters for
PCI-X type cards. For PCI-E type cards, use the "ixgbe" driver PCI-X type cards. For PCI-E type cards, use the "ixgbe" driver
instead. For more information on how to identify your adapter, go instead. For more information on how to identify your adapter, go
to the Adapter & Driver ID Guide at: to the Adapter & Driver ID Guide that can be located at:
<http://support.intel.com/support/network/adapter/pro100/21397.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
...@@ -187,12 +160,7 @@ config IXGBE ...@@ -187,12 +160,7 @@ config IXGBE
---help--- ---help---
This driver supports Intel(R) 10GbE PCI Express family of This driver supports Intel(R) 10GbE PCI Express family of
adapters. For more information on how to identify your adapter, go adapters. For more information on how to identify your adapter, go
to the Adapter & Driver ID Guide at: to the Adapter & Driver ID Guide that can be located at:
<http://support.intel.com/support/network/adapter/pro100/21397.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
...@@ -243,12 +211,7 @@ config IXGBEVF ...@@ -243,12 +211,7 @@ config IXGBEVF
---help--- ---help---
This driver supports Intel(R) PCI Express virtual functions for the This driver supports Intel(R) PCI Express virtual functions for the
Intel(R) ixgbe driver. For more information on how to identify your Intel(R) ixgbe driver. For more information on how to identify your
adapter, go to the Adapter & Driver ID Guide at: adapter, go to the Adapter & Driver ID Guide that can be located at:
<http://support.intel.com/support/network/sb/CS-008441.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
...@@ -266,12 +229,7 @@ config I40E ...@@ -266,12 +229,7 @@ config I40E
---help--- ---help---
This driver supports Intel(R) Ethernet Controller XL710 Family of This driver supports Intel(R) Ethernet Controller XL710 Family of
devices. For more information on how to identify your adapter, go devices. For more information on how to identify your adapter, go
to the Adapter & Driver ID Guide at: to the Adapter & Driver ID Guide that can be located at:
<http://support.intel.com/support/network/adapter/pro100/21397.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
...@@ -326,12 +284,7 @@ config I40EVF ...@@ -326,12 +284,7 @@ config I40EVF
---help--- ---help---
This driver supports Intel(R) XL710 and X710 virtual functions. This driver supports Intel(R) XL710 and X710 virtual functions.
For more information on how to identify your adapter, go to the For more information on how to identify your adapter, go to the
Adapter & Driver ID Guide at: Adapter & Driver ID Guide that can be located at:
<http://support.intel.com/support/network/sb/CS-008441.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
...@@ -347,12 +300,7 @@ config FM10K ...@@ -347,12 +300,7 @@ config FM10K
---help--- ---help---
This driver supports Intel(R) FM10000 Ethernet Switch Host This driver supports Intel(R) FM10000 Ethernet Switch Host
Interface. For more information on how to identify your adapter, Interface. For more information on how to identify your adapter,
go to the Adapter & Driver ID Guide at: go to the Adapter & Driver ID Guide that can be located at:
<http://support.intel.com/support/network/sb/CS-008441.htm>
For general information and support, go to the Intel support
website at:
<http://support.intel.com> <http://support.intel.com>
......
...@@ -358,6 +358,8 @@ struct net_device *e1000_get_hw_dev(struct e1000_hw *hw); ...@@ -358,6 +358,8 @@ struct net_device *e1000_get_hw_dev(struct e1000_hw *hw);
extern char e1000_driver_name[]; extern char e1000_driver_name[];
extern const char e1000_driver_version[]; extern const char e1000_driver_version[];
int e1000_open(struct net_device *netdev);
int e1000_close(struct net_device *netdev);
int e1000_up(struct e1000_adapter *adapter); int e1000_up(struct e1000_adapter *adapter);
void e1000_down(struct e1000_adapter *adapter); void e1000_down(struct e1000_adapter *adapter);
void e1000_reinit_locked(struct e1000_adapter *adapter); void e1000_reinit_locked(struct e1000_adapter *adapter);
......
...@@ -1553,7 +1553,7 @@ static void e1000_diag_test(struct net_device *netdev, ...@@ -1553,7 +1553,7 @@ static void e1000_diag_test(struct net_device *netdev,
if (if_running) if (if_running)
/* indicate we're in test mode */ /* indicate we're in test mode */
dev_close(netdev); e1000_close(netdev);
else else
e1000_reset(adapter); e1000_reset(adapter);
...@@ -1582,7 +1582,7 @@ static void e1000_diag_test(struct net_device *netdev, ...@@ -1582,7 +1582,7 @@ static void e1000_diag_test(struct net_device *netdev,
e1000_reset(adapter); e1000_reset(adapter);
clear_bit(__E1000_TESTING, &adapter->flags); clear_bit(__E1000_TESTING, &adapter->flags);
if (if_running) if (if_running)
dev_open(netdev); e1000_open(netdev);
} else { } else {
e_info(hw, "online testing starting\n"); e_info(hw, "online testing starting\n");
/* Online tests */ /* Online tests */
......
...@@ -114,8 +114,8 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent); ...@@ -114,8 +114,8 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
static void e1000_remove(struct pci_dev *pdev); static void e1000_remove(struct pci_dev *pdev);
static int e1000_alloc_queues(struct e1000_adapter *adapter); static int e1000_alloc_queues(struct e1000_adapter *adapter);
static int e1000_sw_init(struct e1000_adapter *adapter); static int e1000_sw_init(struct e1000_adapter *adapter);
static int e1000_open(struct net_device *netdev); int e1000_open(struct net_device *netdev);
static int e1000_close(struct net_device *netdev); int e1000_close(struct net_device *netdev);
static void e1000_configure_tx(struct e1000_adapter *adapter); static void e1000_configure_tx(struct e1000_adapter *adapter);
static void e1000_configure_rx(struct e1000_adapter *adapter); static void e1000_configure_rx(struct e1000_adapter *adapter);
static void e1000_setup_rctl(struct e1000_adapter *adapter); static void e1000_setup_rctl(struct e1000_adapter *adapter);
...@@ -1360,7 +1360,7 @@ static int e1000_alloc_queues(struct e1000_adapter *adapter) ...@@ -1360,7 +1360,7 @@ static int e1000_alloc_queues(struct e1000_adapter *adapter)
* handler is registered with the OS, the watchdog task is started, * handler is registered with the OS, the watchdog task is started,
* and the stack is notified that the interface is ready. * and the stack is notified that the interface is ready.
**/ **/
static int e1000_open(struct net_device *netdev) int e1000_open(struct net_device *netdev)
{ {
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;
...@@ -1437,7 +1437,7 @@ static int e1000_open(struct net_device *netdev) ...@@ -1437,7 +1437,7 @@ static int e1000_open(struct net_device *netdev)
* needs to be disabled. A global MAC reset is issued to stop the * needs to be disabled. A global MAC reset is issued to stop the
* hardware, and all transmit and receive resources are freed. * hardware, and all transmit and receive resources are freed.
**/ **/
static int e1000_close(struct net_device *netdev) int e1000_close(struct net_device *netdev)
{ {
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;
......
...@@ -480,6 +480,8 @@ extern const char e1000e_driver_version[]; ...@@ -480,6 +480,8 @@ extern const char e1000e_driver_version[];
void e1000e_check_options(struct e1000_adapter *adapter); void e1000e_check_options(struct e1000_adapter *adapter);
void e1000e_set_ethtool_ops(struct net_device *netdev); void e1000e_set_ethtool_ops(struct net_device *netdev);
int e1000e_open(struct net_device *netdev);
int e1000e_close(struct net_device *netdev);
void e1000e_up(struct e1000_adapter *adapter); void e1000e_up(struct e1000_adapter *adapter);
void e1000e_down(struct e1000_adapter *adapter, bool reset); void e1000e_down(struct e1000_adapter *adapter, bool reset);
void e1000e_reinit_locked(struct e1000_adapter *adapter); void e1000e_reinit_locked(struct e1000_adapter *adapter);
......
...@@ -1816,7 +1816,7 @@ static void e1000_diag_test(struct net_device *netdev, ...@@ -1816,7 +1816,7 @@ static void e1000_diag_test(struct net_device *netdev,
if (if_running) if (if_running)
/* indicate we're in test mode */ /* indicate we're in test mode */
dev_close(netdev); e1000e_close(netdev);
if (e1000_reg_test(adapter, &data[0])) if (e1000_reg_test(adapter, &data[0]))
eth_test->flags |= ETH_TEST_FL_FAILED; eth_test->flags |= ETH_TEST_FL_FAILED;
...@@ -1849,7 +1849,7 @@ static void e1000_diag_test(struct net_device *netdev, ...@@ -1849,7 +1849,7 @@ static void e1000_diag_test(struct net_device *netdev,
clear_bit(__E1000_TESTING, &adapter->state); clear_bit(__E1000_TESTING, &adapter->state);
if (if_running) if (if_running)
dev_open(netdev); e1000e_open(netdev);
} else { } else {
/* Online tests */ /* Online tests */
......
...@@ -4495,7 +4495,7 @@ static int e1000_test_msi(struct e1000_adapter *adapter) ...@@ -4495,7 +4495,7 @@ static int e1000_test_msi(struct e1000_adapter *adapter)
} }
/** /**
* e1000_open - Called when a network interface is made active * e1000e_open - Called when a network interface is made active
* @netdev: network interface device structure * @netdev: network interface device structure
* *
* Returns 0 on success, negative value on failure * Returns 0 on success, negative value on failure
...@@ -4506,7 +4506,7 @@ static int e1000_test_msi(struct e1000_adapter *adapter) ...@@ -4506,7 +4506,7 @@ static int e1000_test_msi(struct e1000_adapter *adapter)
* handler is registered with the OS, the watchdog timer is started, * handler is registered with the OS, the watchdog timer is started,
* and the stack is notified that the interface is ready. * and the stack is notified that the interface is ready.
**/ **/
static int e1000_open(struct net_device *netdev) int e1000e_open(struct net_device *netdev)
{ {
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;
...@@ -4604,7 +4604,7 @@ static int e1000_open(struct net_device *netdev) ...@@ -4604,7 +4604,7 @@ static int e1000_open(struct net_device *netdev)
} }
/** /**
* e1000_close - Disables a network interface * e1000e_close - Disables a network interface
* @netdev: network interface device structure * @netdev: network interface device structure
* *
* Returns 0, this is not allowed to fail * Returns 0, this is not allowed to fail
...@@ -4614,7 +4614,7 @@ static int e1000_open(struct net_device *netdev) ...@@ -4614,7 +4614,7 @@ static int e1000_open(struct net_device *netdev)
* needs to be disabled. A global MAC reset is issued to stop the * needs to be disabled. A global MAC reset is issued to stop the
* hardware, and all transmit and receive resources are freed. * hardware, and all transmit and receive resources are freed.
**/ **/
static int e1000_close(struct net_device *netdev) int e1000e_close(struct net_device *netdev)
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
...@@ -6920,8 +6920,8 @@ static int e1000_set_features(struct net_device *netdev, ...@@ -6920,8 +6920,8 @@ static int e1000_set_features(struct net_device *netdev,
} }
static const struct net_device_ops e1000e_netdev_ops = { static const struct net_device_ops e1000e_netdev_ops = {
.ndo_open = e1000_open, .ndo_open = e1000e_open,
.ndo_stop = e1000_close, .ndo_stop = e1000e_close,
.ndo_start_xmit = e1000_xmit_frame, .ndo_start_xmit = e1000_xmit_frame,
.ndo_get_stats64 = e1000e_get_stats64, .ndo_get_stats64 = e1000e_get_stats64,
.ndo_set_rx_mode = e1000e_set_rx_mode, .ndo_set_rx_mode = e1000e_set_rx_mode,
......
...@@ -2831,7 +2831,8 @@ static int igb_get_module_eeprom(struct net_device *netdev, ...@@ -2831,7 +2831,8 @@ static int igb_get_module_eeprom(struct net_device *netdev,
/* Read EEPROM block, SFF-8079/SFF-8472, word at a time */ /* Read EEPROM block, SFF-8079/SFF-8472, word at a time */
for (i = 0; i < last_word - first_word + 1; i++) { for (i = 0; i < last_word - first_word + 1; i++) {
status = igb_read_phy_reg_i2c(hw, first_word + i, &dataword[i]); status = igb_read_phy_reg_i2c(hw, (first_word + i) * 2,
&dataword[i]);
if (status) { if (status) {
/* Error occurred while reading module */ /* Error occurred while reading module */
kfree(dataword); kfree(dataword);
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <linux/aer.h> #include <linux/aer.h>
#include <linux/prefetch.h> #include <linux/prefetch.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/etherdevice.h>
#ifdef CONFIG_IGB_DCA #ifdef CONFIG_IGB_DCA
#include <linux/dca.h> #include <linux/dca.h>
#endif #endif
...@@ -150,7 +151,7 @@ static void igb_update_dca(struct igb_q_vector *); ...@@ -150,7 +151,7 @@ static void igb_update_dca(struct igb_q_vector *);
static void igb_setup_dca(struct igb_adapter *); static void igb_setup_dca(struct igb_adapter *);
#endif /* CONFIG_IGB_DCA */ #endif /* CONFIG_IGB_DCA */
static int igb_poll(struct napi_struct *, int); static int igb_poll(struct napi_struct *, int);
static bool igb_clean_tx_irq(struct igb_q_vector *); static bool igb_clean_tx_irq(struct igb_q_vector *, int);
static int igb_clean_rx_irq(struct igb_q_vector *, int); static int igb_clean_rx_irq(struct igb_q_vector *, int);
static int igb_ioctl(struct net_device *, struct ifreq *, int cmd); static int igb_ioctl(struct net_device *, struct ifreq *, int cmd);
static void igb_tx_timeout(struct net_device *); static void igb_tx_timeout(struct net_device *);
...@@ -2442,9 +2443,11 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2442,9 +2443,11 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
break; break;
} }
if (eth_platform_get_mac_address(&pdev->dev, hw->mac.addr)) {
/* copy the MAC address out of the NVM */ /* copy the MAC address out of the NVM */
if (hw->mac.ops.read_mac_addr(hw)) if (hw->mac.ops.read_mac_addr(hw))
dev_err(&pdev->dev, "NVM Read Error\n"); dev_err(&pdev->dev, "NVM Read Error\n");
}
memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len); memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);
...@@ -6522,13 +6525,14 @@ static int igb_poll(struct napi_struct *napi, int budget) ...@@ -6522,13 +6525,14 @@ static int igb_poll(struct napi_struct *napi, int budget)
igb_update_dca(q_vector); igb_update_dca(q_vector);
#endif #endif
if (q_vector->tx.ring) if (q_vector->tx.ring)
clean_complete = igb_clean_tx_irq(q_vector); clean_complete = igb_clean_tx_irq(q_vector, budget);
if (q_vector->rx.ring) { if (q_vector->rx.ring) {
int cleaned = igb_clean_rx_irq(q_vector, budget); int cleaned = igb_clean_rx_irq(q_vector, budget);
work_done += cleaned; work_done += cleaned;
clean_complete &= (cleaned < budget); if (cleaned >= budget)
clean_complete = false;
} }
/* If all work not completed, return budget and keep polling */ /* If all work not completed, return budget and keep polling */
...@@ -6545,10 +6549,11 @@ static int igb_poll(struct napi_struct *napi, int budget) ...@@ -6545,10 +6549,11 @@ static int igb_poll(struct napi_struct *napi, int budget)
/** /**
* igb_clean_tx_irq - Reclaim resources after transmit completes * igb_clean_tx_irq - Reclaim resources after transmit completes
* @q_vector: pointer to q_vector containing needed info * @q_vector: pointer to q_vector containing needed info
* @napi_budget: Used to determine if we are in netpoll
* *
* returns true if ring is completely cleaned * returns true if ring is completely cleaned
**/ **/
static bool igb_clean_tx_irq(struct igb_q_vector *q_vector) static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget)
{ {
struct igb_adapter *adapter = q_vector->adapter; struct igb_adapter *adapter = q_vector->adapter;
struct igb_ring *tx_ring = q_vector->tx.ring; struct igb_ring *tx_ring = q_vector->tx.ring;
...@@ -6587,7 +6592,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector) ...@@ -6587,7 +6592,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector)
total_packets += tx_buffer->gso_segs; total_packets += tx_buffer->gso_segs;
/* free the skb */ /* free the skb */
dev_consume_skb_any(tx_buffer->skb); napi_consume_skb(tx_buffer->skb, napi_budget);
/* unmap skb header data */ /* unmap skb header data */
dma_unmap_single(tx_ring->dev, dma_unmap_single(tx_ring->dev,
...@@ -7574,7 +7579,6 @@ static int igb_resume(struct device *dev) ...@@ -7574,7 +7579,6 @@ static int igb_resume(struct device *dev)
if (igb_init_interrupt_scheme(adapter, true)) { 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");
rtnl_unlock();
return -ENOMEM; return -ENOMEM;
} }
...@@ -7845,11 +7849,13 @@ static void igb_rar_set_qsel(struct igb_adapter *adapter, u8 *addr, u32 index, ...@@ -7845,11 +7849,13 @@ static void igb_rar_set_qsel(struct igb_adapter *adapter, u8 *addr, u32 index,
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 rar_low, rar_high; u32 rar_low, rar_high;
/* HW expects these in little endian so we reverse the byte order /* HW expects these to be in network order when they are plugged
* from network order (big endian) to CPU endian * into the registers which are little endian. In order to guarantee
* that ordering we need to do an leXX_to_cpup here in order to be
* ready for the byteswap that occurs with writel
*/ */
rar_low = le32_to_cpup((__be32 *)(addr)); rar_low = le32_to_cpup((__le32 *)(addr));
rar_high = le16_to_cpup((__be16 *)(addr + 4)); rar_high = le16_to_cpup((__le16 *)(addr + 4));
/* Indicate to hardware the Address is Valid. */ /* Indicate to hardware the Address is Valid. */
rar_high |= E1000_RAH_AV; rar_high |= E1000_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