|
@@ -1,7 +1,7 @@
|
|
|
/*******************************************************************************
|
|
|
|
|
|
Intel 10 Gigabit PCI Express Linux driver
|
|
|
- Copyright(c) 1999 - 2013 Intel Corporation.
|
|
|
+ Copyright(c) 1999 - 2014 Intel Corporation.
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it
|
|
|
under the terms and conditions of the GNU General Public License,
|
|
@@ -67,7 +67,7 @@ static char ixgbe_default_device_descr[] =
|
|
|
#define DRV_VERSION "3.19.1-k"
|
|
|
const char ixgbe_driver_version[] = DRV_VERSION;
|
|
|
static const char ixgbe_copyright[] =
|
|
|
- "Copyright (c) 1999-2013 Intel Corporation.";
|
|
|
+ "Copyright (c) 1999-2014 Intel Corporation.";
|
|
|
|
|
|
static const struct ixgbe_info *ixgbe_info_tbl[] = {
|
|
|
[board_82598] = &ixgbe_82598_info,
|
|
@@ -151,6 +151,8 @@ MODULE_DESCRIPTION("Intel(R) 10 Gigabit PCI Express Network Driver");
|
|
|
MODULE_LICENSE("GPL");
|
|
|
MODULE_VERSION(DRV_VERSION);
|
|
|
|
|
|
+static bool ixgbe_check_cfg_remove(struct ixgbe_hw *hw, struct pci_dev *pdev);
|
|
|
+
|
|
|
static int ixgbe_read_pci_cfg_word_parent(struct ixgbe_adapter *adapter,
|
|
|
u32 reg, u16 *value)
|
|
|
{
|
|
@@ -169,6 +171,9 @@ static int ixgbe_read_pci_cfg_word_parent(struct ixgbe_adapter *adapter,
|
|
|
return -1;
|
|
|
|
|
|
pcie_capability_read_word(parent_dev, reg, value);
|
|
|
+ if (*value == IXGBE_FAILED_READ_CFG_WORD &&
|
|
|
+ ixgbe_check_cfg_remove(&adapter->hw, parent_dev))
|
|
|
+ return -1;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -313,6 +318,48 @@ void ixgbe_check_remove(struct ixgbe_hw *hw, u32 reg)
|
|
|
ixgbe_remove_adapter(hw);
|
|
|
}
|
|
|
|
|
|
+static bool ixgbe_check_cfg_remove(struct ixgbe_hw *hw, struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ u16 value;
|
|
|
+
|
|
|
+ pci_read_config_word(pdev, PCI_VENDOR_ID, &value);
|
|
|
+ if (value == IXGBE_FAILED_READ_CFG_WORD) {
|
|
|
+ ixgbe_remove_adapter(hw);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+u16 ixgbe_read_pci_cfg_word(struct ixgbe_hw *hw, u32 reg)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = hw->back;
|
|
|
+ u16 value;
|
|
|
+
|
|
|
+ if (ixgbe_removed(hw->hw_addr))
|
|
|
+ return IXGBE_FAILED_READ_CFG_WORD;
|
|
|
+ pci_read_config_word(adapter->pdev, reg, &value);
|
|
|
+ if (value == IXGBE_FAILED_READ_CFG_WORD &&
|
|
|
+ ixgbe_check_cfg_remove(hw, adapter->pdev))
|
|
|
+ return IXGBE_FAILED_READ_CFG_WORD;
|
|
|
+ return value;
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_PCI_IOV
|
|
|
+static u32 ixgbe_read_pci_cfg_dword(struct ixgbe_hw *hw, u32 reg)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = hw->back;
|
|
|
+ u32 value;
|
|
|
+
|
|
|
+ if (ixgbe_removed(hw->hw_addr))
|
|
|
+ return IXGBE_FAILED_READ_CFG_DWORD;
|
|
|
+ pci_read_config_dword(adapter->pdev, reg, &value);
|
|
|
+ if (value == IXGBE_FAILED_READ_CFG_DWORD &&
|
|
|
+ ixgbe_check_cfg_remove(hw, adapter->pdev))
|
|
|
+ return IXGBE_FAILED_READ_CFG_DWORD;
|
|
|
+ return value;
|
|
|
+}
|
|
|
+#endif /* CONFIG_PCI_IOV */
|
|
|
+
|
|
|
static void ixgbe_service_event_complete(struct ixgbe_adapter *adapter)
|
|
|
{
|
|
|
BUG_ON(!test_bit(__IXGBE_SERVICE_SCHED, &adapter->state));
|
|
@@ -5508,6 +5555,7 @@ static int ixgbe_resume(struct pci_dev *pdev)
|
|
|
struct net_device *netdev = adapter->netdev;
|
|
|
u32 err;
|
|
|
|
|
|
+ adapter->hw.hw_addr = adapter->io_addr;
|
|
|
pci_set_power_state(pdev, PCI_D0);
|
|
|
pci_restore_state(pdev);
|
|
|
/*
|
|
@@ -7149,7 +7197,9 @@ static int ixgbe_ioctl(struct net_device *netdev, struct ifreq *req, int cmd)
|
|
|
|
|
|
switch (cmd) {
|
|
|
case SIOCSHWTSTAMP:
|
|
|
- return ixgbe_ptp_hwtstamp_ioctl(adapter, req, cmd);
|
|
|
+ return ixgbe_ptp_set_ts_config(adapter, req);
|
|
|
+ case SIOCGHWTSTAMP:
|
|
|
+ return ixgbe_ptp_get_ts_config(adapter, req);
|
|
|
default:
|
|
|
return mdio_mii_ioctl(&adapter->hw.phy.mdio, if_mii(req), cmd);
|
|
|
}
|
|
@@ -8338,6 +8388,7 @@ static pci_ers_result_t ixgbe_io_error_detected(struct pci_dev *pdev,
|
|
|
struct net_device *netdev = adapter->netdev;
|
|
|
|
|
|
#ifdef CONFIG_PCI_IOV
|
|
|
+ struct ixgbe_hw *hw = &adapter->hw;
|
|
|
struct pci_dev *bdev, *vfdev;
|
|
|
u32 dw0, dw1, dw2, dw3;
|
|
|
int vf, pos;
|
|
@@ -8358,10 +8409,12 @@ static pci_ers_result_t ixgbe_io_error_detected(struct pci_dev *pdev,
|
|
|
if (!pos)
|
|
|
goto skip_bad_vf_detection;
|
|
|
|
|
|
- pci_read_config_dword(bdev, pos + PCI_ERR_HEADER_LOG, &dw0);
|
|
|
- pci_read_config_dword(bdev, pos + PCI_ERR_HEADER_LOG + 4, &dw1);
|
|
|
- pci_read_config_dword(bdev, pos + PCI_ERR_HEADER_LOG + 8, &dw2);
|
|
|
- pci_read_config_dword(bdev, pos + PCI_ERR_HEADER_LOG + 12, &dw3);
|
|
|
+ dw0 = ixgbe_read_pci_cfg_dword(hw, pos + PCI_ERR_HEADER_LOG);
|
|
|
+ dw1 = ixgbe_read_pci_cfg_dword(hw, pos + PCI_ERR_HEADER_LOG + 4);
|
|
|
+ dw2 = ixgbe_read_pci_cfg_dword(hw, pos + PCI_ERR_HEADER_LOG + 8);
|
|
|
+ dw3 = ixgbe_read_pci_cfg_dword(hw, pos + PCI_ERR_HEADER_LOG + 12);
|
|
|
+ if (ixgbe_removed(hw->hw_addr))
|
|
|
+ goto skip_bad_vf_detection;
|
|
|
|
|
|
req_id = dw1 >> 16;
|
|
|
/* On the 82599 if bit 7 of the requestor ID is set then it's a VF */
|
|
@@ -8453,6 +8506,7 @@ static pci_ers_result_t ixgbe_io_slot_reset(struct pci_dev *pdev)
|
|
|
e_err(probe, "Cannot re-enable PCI device after reset.\n");
|
|
|
result = PCI_ERS_RESULT_DISCONNECT;
|
|
|
} else {
|
|
|
+ adapter->hw.hw_addr = adapter->io_addr;
|
|
|
pci_set_master(pdev);
|
|
|
pci_restore_state(pdev);
|
|
|
pci_save_state(pdev);
|