mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-28 11:49:32 +00:00
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next-2.6
This commit is contained in:
commit
a45d49d105
27 changed files with 550 additions and 450 deletions
|
@ -727,8 +727,9 @@ static void igb_get_drvinfo(struct net_device *netdev,
|
|||
char firmware_version[32];
|
||||
u16 eeprom_data;
|
||||
|
||||
strncpy(drvinfo->driver, igb_driver_name, 32);
|
||||
strncpy(drvinfo->version, igb_driver_version, 32);
|
||||
strncpy(drvinfo->driver, igb_driver_name, sizeof(drvinfo->driver) - 1);
|
||||
strncpy(drvinfo->version, igb_driver_version,
|
||||
sizeof(drvinfo->version) - 1);
|
||||
|
||||
/* EEPROM image version # is reported as firmware version # for
|
||||
* 82575 controllers */
|
||||
|
@ -738,8 +739,10 @@ static void igb_get_drvinfo(struct net_device *netdev,
|
|||
(eeprom_data & 0x0FF0) >> 4,
|
||||
eeprom_data & 0x000F);
|
||||
|
||||
strncpy(drvinfo->fw_version, firmware_version, 32);
|
||||
strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
|
||||
strncpy(drvinfo->fw_version, firmware_version,
|
||||
sizeof(drvinfo->fw_version) - 1);
|
||||
strncpy(drvinfo->bus_info, pci_name(adapter->pdev),
|
||||
sizeof(drvinfo->bus_info) - 1);
|
||||
drvinfo->n_stats = IGB_STATS_LEN;
|
||||
drvinfo->testinfo_len = IGB_TEST_LEN;
|
||||
drvinfo->regdump_len = igb_get_regs_len(netdev);
|
||||
|
@ -1070,7 +1073,7 @@ static bool reg_pattern_test(struct igb_adapter *adapter, u64 *data,
|
|||
{0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF};
|
||||
for (pat = 0; pat < ARRAY_SIZE(_test); pat++) {
|
||||
wr32(reg, (_test[pat] & write));
|
||||
val = rd32(reg);
|
||||
val = rd32(reg) & mask;
|
||||
if (val != (_test[pat] & write & mask)) {
|
||||
dev_err(&adapter->pdev->dev, "pattern test reg %04X "
|
||||
"failed: got 0x%08X expected 0x%08X\n",
|
||||
|
|
|
@ -2291,7 +2291,12 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)
|
|||
switch (hw->mac.type) {
|
||||
case e1000_82576:
|
||||
case e1000_i350:
|
||||
adapter->vfs_allocated_count = (max_vfs > 7) ? 7 : max_vfs;
|
||||
if (max_vfs > 7) {
|
||||
dev_warn(&pdev->dev,
|
||||
"Maximum of 7 VFs per PF, using max\n");
|
||||
adapter->vfs_allocated_count = 7;
|
||||
} else
|
||||
adapter->vfs_allocated_count = max_vfs;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
@ -627,7 +627,6 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ixgbe_setup_mac_link_82598 - Set MAC link speed
|
||||
* @hw: pointer to hardware structure
|
||||
|
@ -698,7 +697,6 @@ static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
|
|||
/* Setup the PHY according to input speed */
|
||||
status = hw->phy.ops.setup_link_speed(hw, speed, autoneg,
|
||||
autoneg_wait_to_complete);
|
||||
|
||||
/* Set up MAC */
|
||||
ixgbe_start_mac_link_82598(hw, autoneg_wait_to_complete);
|
||||
|
||||
|
@ -770,7 +768,6 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
|||
else if (phy_status == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto no_phy_reset;
|
||||
|
||||
|
||||
hw->phy.ops.reset(hw);
|
||||
}
|
||||
|
||||
|
@ -779,12 +776,9 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
|||
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
|
||||
* access and verify no pending requests before reset
|
||||
*/
|
||||
status = ixgbe_disable_pcie_master(hw);
|
||||
if (status != 0) {
|
||||
status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
|
||||
hw_dbg(hw, "PCI-E Master disable polling has failed.\n");
|
||||
}
|
||||
ixgbe_disable_pcie_master(hw);
|
||||
|
||||
mac_reset_top:
|
||||
/*
|
||||
* Issue global reset to the MAC. This needs to be a SW reset.
|
||||
* If link reset is used, it might reset the MAC when mng is using it
|
||||
|
@ -805,6 +799,19 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
|||
hw_dbg(hw, "Reset polling failed to complete.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Double resets are required for recovery from certain error
|
||||
* conditions. Between resets, it is necessary to stall to allow time
|
||||
* for any pending HW events to complete. We use 1usec since that is
|
||||
* what is needed for ixgbe_disable_pcie_master(). The second reset
|
||||
* then clears out any effects of those events.
|
||||
*/
|
||||
if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
|
||||
hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
|
||||
udelay(1);
|
||||
goto mac_reset_top;
|
||||
}
|
||||
|
||||
msleep(50);
|
||||
|
||||
gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR);
|
||||
|
@ -824,15 +831,15 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
|||
IXGBE_WRITE_REG(hw, IXGBE_AUTOC, hw->mac.orig_autoc);
|
||||
}
|
||||
|
||||
/* Store the permanent mac address */
|
||||
hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
|
||||
|
||||
/*
|
||||
* Store MAC address from RAR0, clear receive address registers, and
|
||||
* clear the multicast table
|
||||
*/
|
||||
hw->mac.ops.init_rx_addrs(hw);
|
||||
|
||||
/* Store the permanent mac address */
|
||||
hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
|
||||
|
||||
reset_hw_out:
|
||||
if (phy_status)
|
||||
status = phy_status;
|
||||
|
@ -849,6 +856,13 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
|||
static s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
||||
{
|
||||
u32 rar_high;
|
||||
u32 rar_entries = hw->mac.num_rar_entries;
|
||||
|
||||
/* Make sure we are using a valid rar index range */
|
||||
if (rar >= rar_entries) {
|
||||
hw_dbg(hw, "RAR index %d is out of range.\n", rar);
|
||||
return IXGBE_ERR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
|
||||
rar_high &= ~IXGBE_RAH_VIND_MASK;
|
||||
|
@ -868,14 +882,17 @@ static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
|||
u32 rar_high;
|
||||
u32 rar_entries = hw->mac.num_rar_entries;
|
||||
|
||||
if (rar < rar_entries) {
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
|
||||
if (rar_high & IXGBE_RAH_VIND_MASK) {
|
||||
rar_high &= ~IXGBE_RAH_VIND_MASK;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
|
||||
}
|
||||
} else {
|
||||
|
||||
/* Make sure we are using a valid rar index range */
|
||||
if (rar >= rar_entries) {
|
||||
hw_dbg(hw, "RAR index %d is out of range.\n", rar);
|
||||
return IXGBE_ERR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
|
||||
if (rar_high & IXGBE_RAH_VIND_MASK) {
|
||||
rar_high &= ~IXGBE_RAH_VIND_MASK;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -994,13 +1011,12 @@ static s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val)
|
|||
}
|
||||
|
||||
/**
|
||||
* ixgbe_read_i2c_eeprom_82598 - Read 8 bit EEPROM word of an SFP+ module
|
||||
* over I2C interface through an intermediate phy.
|
||||
* ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface.
|
||||
* @hw: pointer to hardware structure
|
||||
* @byte_offset: EEPROM byte offset to read
|
||||
* @eeprom_data: value read
|
||||
*
|
||||
* Performs byte read operation to SFP module's EEPROM over I2C interface.
|
||||
* Performs 8 byte read operation to SFP module's EEPROM over I2C interface.
|
||||
**/
|
||||
static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
u8 *eeprom_data)
|
||||
|
@ -1179,13 +1195,14 @@ static struct ixgbe_mac_operations mac_ops_82598 = {
|
|||
.set_vmdq = &ixgbe_set_vmdq_82598,
|
||||
.clear_vmdq = &ixgbe_clear_vmdq_82598,
|
||||
.init_rx_addrs = &ixgbe_init_rx_addrs_generic,
|
||||
.update_uc_addr_list = &ixgbe_update_uc_addr_list_generic,
|
||||
.update_mc_addr_list = &ixgbe_update_mc_addr_list_generic,
|
||||
.enable_mc = &ixgbe_enable_mc_generic,
|
||||
.disable_mc = &ixgbe_disable_mc_generic,
|
||||
.clear_vfta = &ixgbe_clear_vfta_82598,
|
||||
.set_vfta = &ixgbe_set_vfta_82598,
|
||||
.fc_enable = &ixgbe_fc_enable_82598,
|
||||
.acquire_swfw_sync = &ixgbe_acquire_swfw_sync,
|
||||
.release_swfw_sync = &ixgbe_release_swfw_sync,
|
||||
};
|
||||
|
||||
static struct ixgbe_eeprom_operations eeprom_ops_82598 = {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
@ -112,7 +112,8 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
|
|||
goto setup_sfp_out;
|
||||
|
||||
/* PHY config will finish before releasing the semaphore */
|
||||
ret_val = ixgbe_acquire_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM);
|
||||
ret_val = hw->mac.ops.acquire_swfw_sync(hw,
|
||||
IXGBE_GSSR_MAC_CSR_SM);
|
||||
if (ret_val != 0) {
|
||||
ret_val = IXGBE_ERR_SWFW_SYNC;
|
||||
goto setup_sfp_out;
|
||||
|
@ -329,11 +330,14 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
|
|||
enum ixgbe_media_type media_type;
|
||||
|
||||
/* Detect if there is a copper PHY attached. */
|
||||
if (hw->phy.type == ixgbe_phy_cu_unknown ||
|
||||
hw->phy.type == ixgbe_phy_tn ||
|
||||
hw->phy.type == ixgbe_phy_aq) {
|
||||
switch (hw->phy.type) {
|
||||
case ixgbe_phy_cu_unknown:
|
||||
case ixgbe_phy_tn:
|
||||
case ixgbe_phy_aq:
|
||||
media_type = ixgbe_media_type_copper;
|
||||
goto out;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (hw->device_id) {
|
||||
|
@ -354,6 +358,9 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
|
|||
case IXGBE_DEV_ID_82599_CX4:
|
||||
media_type = ixgbe_media_type_cx4;
|
||||
break;
|
||||
case IXGBE_DEV_ID_82599_T3_LOM:
|
||||
media_type = ixgbe_media_type_copper;
|
||||
break;
|
||||
default:
|
||||
media_type = ixgbe_media_type_unknown;
|
||||
break;
|
||||
|
@ -411,14 +418,14 @@ static s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw,
|
|||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_disable_tx_laser_multispeed_fiber - Disable Tx laser
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* The base drivers may require better control over SFP+ module
|
||||
* PHY states. This includes selectively shutting down the Tx
|
||||
* laser on the PHY, effectively halting physical link.
|
||||
**/
|
||||
/**
|
||||
* ixgbe_disable_tx_laser_multispeed_fiber - Disable Tx laser
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* The base drivers may require better control over SFP+ module
|
||||
* PHY states. This includes selectively shutting down the Tx
|
||||
* laser on the PHY, effectively halting physical link.
|
||||
**/
|
||||
static void ixgbe_disable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP);
|
||||
|
@ -536,7 +543,6 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
|||
* Section 73.10.2, we may have to wait up to 500ms if KR is
|
||||
* attempted. 82599 uses the same timing for 10g SFI.
|
||||
*/
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
/* Wait for the link partner to also set speed */
|
||||
msleep(100);
|
||||
|
@ -761,7 +767,6 @@ static s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
|
|||
else
|
||||
orig_autoc = autoc;
|
||||
|
||||
|
||||
if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR ||
|
||||
link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN ||
|
||||
link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) {
|
||||
|
@ -898,12 +903,9 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|||
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
|
||||
* access and verify no pending requests before reset
|
||||
*/
|
||||
status = ixgbe_disable_pcie_master(hw);
|
||||
if (status != 0) {
|
||||
status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
|
||||
hw_dbg(hw, "PCI-E Master disable polling has failed.\n");
|
||||
}
|
||||
ixgbe_disable_pcie_master(hw);
|
||||
|
||||
mac_reset_top:
|
||||
/*
|
||||
* Issue global reset to the MAC. This needs to be a SW reset.
|
||||
* If link reset is used, it might reset the MAC when mng is using it
|
||||
|
@ -924,6 +926,19 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|||
hw_dbg(hw, "Reset polling failed to complete.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Double resets are required for recovery from certain error
|
||||
* conditions. Between resets, it is necessary to stall to allow time
|
||||
* for any pending HW events to complete. We use 1usec since that is
|
||||
* what is needed for ixgbe_disable_pcie_master(). The second reset
|
||||
* then clears out any effects of those events.
|
||||
*/
|
||||
if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
|
||||
hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
|
||||
udelay(1);
|
||||
goto mac_reset_top;
|
||||
}
|
||||
|
||||
msleep(50);
|
||||
|
||||
/*
|
||||
|
@ -951,6 +966,9 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|||
}
|
||||
}
|
||||
|
||||
/* Store the permanent mac address */
|
||||
hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
|
||||
|
||||
/*
|
||||
* Store MAC address from RAR0, clear receive address registers, and
|
||||
* clear the multicast table. Also reset num_rar_entries to 128,
|
||||
|
@ -959,9 +977,6 @@ static s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
|
|||
hw->mac.num_rar_entries = 128;
|
||||
hw->mac.ops.init_rx_addrs(hw);
|
||||
|
||||
/* Store the permanent mac address */
|
||||
hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
|
||||
|
||||
/* Store the permanent SAN mac address */
|
||||
hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr);
|
||||
|
||||
|
@ -1733,13 +1748,34 @@ static s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw)
|
|||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Determines the physical layer module found on the current adapter.
|
||||
* If PHY already detected, maintains current PHY type in hw struct,
|
||||
* otherwise executes the PHY detection routine.
|
||||
**/
|
||||
static s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
|
||||
s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
|
||||
|
||||
/* Detect PHY if not unknown - returns success if already detected. */
|
||||
status = ixgbe_identify_phy_generic(hw);
|
||||
if (status != 0)
|
||||
status = ixgbe_identify_sfp_module_generic(hw);
|
||||
if (status != 0) {
|
||||
/* 82599 10GBASE-T requires an external PHY */
|
||||
if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper)
|
||||
goto out;
|
||||
else
|
||||
status = ixgbe_identify_sfp_module_generic(hw);
|
||||
}
|
||||
|
||||
/* Set PHY type none if no PHY detected */
|
||||
if (hw->phy.type == ixgbe_phy_unknown) {
|
||||
hw->phy.type = ixgbe_phy_none;
|
||||
status = 0;
|
||||
}
|
||||
|
||||
/* Return error if SFP module has been detected but is not supported */
|
||||
if (hw->phy.type == ixgbe_phy_sfp_unsupported)
|
||||
status = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1763,11 +1799,12 @@ static u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw)
|
|||
|
||||
hw->phy.ops.identify(hw);
|
||||
|
||||
if (hw->phy.type == ixgbe_phy_tn ||
|
||||
hw->phy.type == ixgbe_phy_aq ||
|
||||
hw->phy.type == ixgbe_phy_cu_unknown) {
|
||||
switch (hw->phy.type) {
|
||||
case ixgbe_phy_tn:
|
||||
case ixgbe_phy_aq:
|
||||
case ixgbe_phy_cu_unknown:
|
||||
hw->phy.ops.read_reg(hw, MDIO_PMA_EXTABLE, MDIO_MMD_PMAPMD,
|
||||
&ext_ability);
|
||||
&ext_ability);
|
||||
if (ext_ability & MDIO_PMA_EXTABLE_10GBT)
|
||||
physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
|
||||
if (ext_ability & MDIO_PMA_EXTABLE_1000BT)
|
||||
|
@ -1775,6 +1812,8 @@ static u32 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw)
|
|||
if (ext_ability & MDIO_PMA_EXTABLE_100BTX)
|
||||
physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX;
|
||||
goto out;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (autoc & IXGBE_AUTOC_LMS_MASK) {
|
||||
|
@ -1886,6 +1925,7 @@ static s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval)
|
|||
if (secrxreg & IXGBE_SECRXSTAT_SECRX_RDY)
|
||||
break;
|
||||
else
|
||||
/* Use interrupt-safe sleep just in case */
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
|
@ -1995,7 +2035,6 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
|
|||
.set_vmdq = &ixgbe_set_vmdq_generic,
|
||||
.clear_vmdq = &ixgbe_clear_vmdq_generic,
|
||||
.init_rx_addrs = &ixgbe_init_rx_addrs_generic,
|
||||
.update_uc_addr_list = &ixgbe_update_uc_addr_list_generic,
|
||||
.update_mc_addr_list = &ixgbe_update_mc_addr_list_generic,
|
||||
.enable_mc = &ixgbe_enable_mc_generic,
|
||||
.disable_mc = &ixgbe_disable_mc_generic,
|
||||
|
@ -2006,6 +2045,9 @@ static struct ixgbe_mac_operations mac_ops_82599 = {
|
|||
.setup_sfp = &ixgbe_setup_sfp_modules_82599,
|
||||
.set_mac_anti_spoofing = &ixgbe_set_mac_anti_spoofing,
|
||||
.set_vlan_anti_spoofing = &ixgbe_set_vlan_anti_spoofing,
|
||||
.acquire_swfw_sync = &ixgbe_acquire_swfw_sync,
|
||||
.release_swfw_sync = &ixgbe_release_swfw_sync,
|
||||
|
||||
};
|
||||
|
||||
static struct ixgbe_eeprom_operations eeprom_ops_82599 = {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
@ -46,10 +46,7 @@ static void ixgbe_raise_eeprom_clk(struct ixgbe_hw *hw, u32 *eec);
|
|||
static void ixgbe_lower_eeprom_clk(struct ixgbe_hw *hw, u32 *eec);
|
||||
static void ixgbe_release_eeprom(struct ixgbe_hw *hw);
|
||||
|
||||
static void ixgbe_enable_rar(struct ixgbe_hw *hw, u32 index);
|
||||
static void ixgbe_disable_rar(struct ixgbe_hw *hw, u32 index);
|
||||
static s32 ixgbe_mta_vector(struct ixgbe_hw *hw, u8 *mc_addr);
|
||||
static void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq);
|
||||
static s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num);
|
||||
|
||||
/**
|
||||
|
@ -454,8 +451,7 @@ s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw)
|
|||
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
|
||||
* access and verify no pending requests
|
||||
*/
|
||||
if (ixgbe_disable_pcie_master(hw) != 0)
|
||||
hw_dbg(hw, "PCI-E Master disable polling has failed.\n");
|
||||
ixgbe_disable_pcie_master(hw);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -603,7 +599,6 @@ s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data)
|
|||
ixgbe_shift_out_eeprom_bits(hw, data, 16);
|
||||
ixgbe_standby_eeprom(hw);
|
||||
|
||||
msleep(hw->eeprom.semaphore_delay);
|
||||
/* Done with writing - release the EEPROM */
|
||||
ixgbe_release_eeprom(hw);
|
||||
}
|
||||
|
@ -747,10 +742,10 @@ s32 ixgbe_poll_eerd_eewr_done(struct ixgbe_hw *hw, u32 ee_reg)
|
|||
static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = 0;
|
||||
u32 eec = 0;
|
||||
u32 eec;
|
||||
u32 i;
|
||||
|
||||
if (ixgbe_acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) != 0)
|
||||
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) != 0)
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
|
||||
if (status == 0) {
|
||||
|
@ -773,18 +768,18 @@ static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
|
|||
IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
|
||||
hw_dbg(hw, "Could not acquire EEPROM grant\n");
|
||||
|
||||
ixgbe_release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
|
||||
hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
|
||||
status = IXGBE_ERR_EEPROM;
|
||||
}
|
||||
}
|
||||
|
||||
/* Setup EEPROM for Read/Write */
|
||||
if (status == 0) {
|
||||
/* Clear CS and SK */
|
||||
eec &= ~(IXGBE_EEC_CS | IXGBE_EEC_SK);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
udelay(1);
|
||||
/* Setup EEPROM for Read/Write */
|
||||
if (status == 0) {
|
||||
/* Clear CS and SK */
|
||||
eec &= ~(IXGBE_EEC_CS | IXGBE_EEC_SK);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
udelay(1);
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
@ -798,13 +793,10 @@ static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw)
|
|||
static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = IXGBE_ERR_EEPROM;
|
||||
u32 timeout;
|
||||
u32 timeout = 2000;
|
||||
u32 i;
|
||||
u32 swsm;
|
||||
|
||||
/* Set timeout value based on size of EEPROM */
|
||||
timeout = hw->eeprom.word_size + 1;
|
||||
|
||||
/* Get SMBI software semaphore between device drivers first */
|
||||
for (i = 0; i < timeout; i++) {
|
||||
/*
|
||||
|
@ -816,7 +808,7 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
|
|||
status = 0;
|
||||
break;
|
||||
}
|
||||
msleep(1);
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
/* Now get the semaphore between SW/FW through the SWESMBI bit */
|
||||
|
@ -844,11 +836,14 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
|
|||
* was not granted because we don't have access to the EEPROM
|
||||
*/
|
||||
if (i >= timeout) {
|
||||
hw_dbg(hw, "Driver can't access the Eeprom - Semaphore "
|
||||
hw_dbg(hw, "SWESMBI Software EEPROM semaphore "
|
||||
"not granted.\n");
|
||||
ixgbe_release_eeprom_semaphore(hw);
|
||||
status = IXGBE_ERR_EEPROM;
|
||||
}
|
||||
} else {
|
||||
hw_dbg(hw, "Software semaphore SMBI between device drivers "
|
||||
"not granted.\n");
|
||||
}
|
||||
|
||||
return status;
|
||||
|
@ -1081,10 +1076,13 @@ static void ixgbe_release_eeprom(struct ixgbe_hw *hw)
|
|||
IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
|
||||
|
||||
ixgbe_release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
|
||||
|
||||
/* Delay before attempt to obtain semaphore again to allow FW access */
|
||||
msleep(hw->eeprom.semaphore_delay);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_calc_eeprom_checksum - Calculates and returns the checksum
|
||||
* ixgbe_calc_eeprom_checksum_generic - Calculates and returns the checksum
|
||||
* @hw: pointer to hardware structure
|
||||
**/
|
||||
u16 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw)
|
||||
|
@ -1190,7 +1188,7 @@ s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw)
|
|||
if (status == 0) {
|
||||
checksum = hw->eeprom.ops.calc_checksum(hw);
|
||||
status = hw->eeprom.ops.write(hw, IXGBE_EEPROM_CHECKSUM,
|
||||
checksum);
|
||||
checksum);
|
||||
} else {
|
||||
hw_dbg(hw, "EEPROM read failed\n");
|
||||
}
|
||||
|
@ -1238,37 +1236,37 @@ s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
|
|||
u32 rar_low, rar_high;
|
||||
u32 rar_entries = hw->mac.num_rar_entries;
|
||||
|
||||
/* Make sure we are using a valid rar index range */
|
||||
if (index >= rar_entries) {
|
||||
hw_dbg(hw, "RAR index %d is out of range.\n", index);
|
||||
return IXGBE_ERR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
/* setup VMDq pool selection before this RAR gets enabled */
|
||||
hw->mac.ops.set_vmdq(hw, index, vmdq);
|
||||
|
||||
/* Make sure we are using a valid rar index range */
|
||||
if (index < rar_entries) {
|
||||
/*
|
||||
* HW expects these in little endian so we reverse the byte
|
||||
* order from network order (big endian) to little endian
|
||||
*/
|
||||
rar_low = ((u32)addr[0] |
|
||||
((u32)addr[1] << 8) |
|
||||
((u32)addr[2] << 16) |
|
||||
((u32)addr[3] << 24));
|
||||
/*
|
||||
* Some parts put the VMDq setting in the extra RAH bits,
|
||||
* so save everything except the lower 16 bits that hold part
|
||||
* of the address and the address valid bit.
|
||||
*/
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index));
|
||||
rar_high &= ~(0x0000FFFF | IXGBE_RAH_AV);
|
||||
rar_high |= ((u32)addr[4] | ((u32)addr[5] << 8));
|
||||
/*
|
||||
* HW expects these in little endian so we reverse the byte
|
||||
* order from network order (big endian) to little endian
|
||||
*/
|
||||
rar_low = ((u32)addr[0] |
|
||||
((u32)addr[1] << 8) |
|
||||
((u32)addr[2] << 16) |
|
||||
((u32)addr[3] << 24));
|
||||
/*
|
||||
* Some parts put the VMDq setting in the extra RAH bits,
|
||||
* so save everything except the lower 16 bits that hold part
|
||||
* of the address and the address valid bit.
|
||||
*/
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index));
|
||||
rar_high &= ~(0x0000FFFF | IXGBE_RAH_AV);
|
||||
rar_high |= ((u32)addr[4] | ((u32)addr[5] << 8));
|
||||
|
||||
if (enable_addr != 0)
|
||||
rar_high |= IXGBE_RAH_AV;
|
||||
if (enable_addr != 0)
|
||||
rar_high |= IXGBE_RAH_AV;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAL(index), rar_low);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
|
||||
} else {
|
||||
hw_dbg(hw, "RAR index %d is out of range.\n", index);
|
||||
return IXGBE_ERR_RAR_INDEX;
|
||||
}
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAL(index), rar_low);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1286,60 +1284,28 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index)
|
|||
u32 rar_entries = hw->mac.num_rar_entries;
|
||||
|
||||
/* Make sure we are using a valid rar index range */
|
||||
if (index < rar_entries) {
|
||||
/*
|
||||
* Some parts put the VMDq setting in the extra RAH bits,
|
||||
* so save everything except the lower 16 bits that hold part
|
||||
* of the address and the address valid bit.
|
||||
*/
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index));
|
||||
rar_high &= ~(0x0000FFFF | IXGBE_RAH_AV);
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAL(index), 0);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
|
||||
} else {
|
||||
if (index >= rar_entries) {
|
||||
hw_dbg(hw, "RAR index %d is out of range.\n", index);
|
||||
return IXGBE_ERR_RAR_INDEX;
|
||||
return IXGBE_ERR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some parts put the VMDq setting in the extra RAH bits,
|
||||
* so save everything except the lower 16 bits that hold part
|
||||
* of the address and the address valid bit.
|
||||
*/
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index));
|
||||
rar_high &= ~(0x0000FFFF | IXGBE_RAH_AV);
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAL(index), 0);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
|
||||
|
||||
/* clear VMDq pool/queue selection for this RAR */
|
||||
hw->mac.ops.clear_vmdq(hw, index, IXGBE_CLEAR_VMDQ_ALL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_enable_rar - Enable Rx address register
|
||||
* @hw: pointer to hardware structure
|
||||
* @index: index into the RAR table
|
||||
*
|
||||
* Enables the select receive address register.
|
||||
**/
|
||||
static void ixgbe_enable_rar(struct ixgbe_hw *hw, u32 index)
|
||||
{
|
||||
u32 rar_high;
|
||||
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index));
|
||||
rar_high |= IXGBE_RAH_AV;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_disable_rar - Disable Rx address register
|
||||
* @hw: pointer to hardware structure
|
||||
* @index: index into the RAR table
|
||||
*
|
||||
* Disables the select receive address register.
|
||||
**/
|
||||
static void ixgbe_disable_rar(struct ixgbe_hw *hw, u32 index)
|
||||
{
|
||||
u32 rar_high;
|
||||
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index));
|
||||
rar_high &= (~IXGBE_RAH_AV);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_init_rx_addrs_generic - Initializes receive address filters.
|
||||
* @hw: pointer to hardware structure
|
||||
|
@ -1386,7 +1352,6 @@ s32 ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw)
|
|||
}
|
||||
|
||||
/* Clear the MTA */
|
||||
hw->addr_ctrl.mc_addr_in_rar_count = 0;
|
||||
hw->addr_ctrl.mta_in_use = 0;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, hw->mac.mc_filter_type);
|
||||
|
||||
|
@ -1400,105 +1365,6 @@ s32 ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_add_uc_addr - Adds a secondary unicast address.
|
||||
* @hw: pointer to hardware structure
|
||||
* @addr: new address
|
||||
*
|
||||
* Adds it to unused receive address register or goes into promiscuous mode.
|
||||
**/
|
||||
static void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq)
|
||||
{
|
||||
u32 rar_entries = hw->mac.num_rar_entries;
|
||||
u32 rar;
|
||||
|
||||
hw_dbg(hw, " UC Addr = %.2X %.2X %.2X %.2X %.2X %.2X\n",
|
||||
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
|
||||
|
||||
/*
|
||||
* Place this address in the RAR if there is room,
|
||||
* else put the controller into promiscuous mode
|
||||
*/
|
||||
if (hw->addr_ctrl.rar_used_count < rar_entries) {
|
||||
rar = hw->addr_ctrl.rar_used_count -
|
||||
hw->addr_ctrl.mc_addr_in_rar_count;
|
||||
hw->mac.ops.set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV);
|
||||
hw_dbg(hw, "Added a secondary address to RAR[%d]\n", rar);
|
||||
hw->addr_ctrl.rar_used_count++;
|
||||
} else {
|
||||
hw->addr_ctrl.overflow_promisc++;
|
||||
}
|
||||
|
||||
hw_dbg(hw, "ixgbe_add_uc_addr Complete\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_update_uc_addr_list_generic - Updates MAC list of secondary addresses
|
||||
* @hw: pointer to hardware structure
|
||||
* @netdev: pointer to net device structure
|
||||
*
|
||||
* The given list replaces any existing list. Clears the secondary addrs from
|
||||
* receive address registers. Uses unused receive address registers for the
|
||||
* first secondary addresses, and falls back to promiscuous mode as needed.
|
||||
*
|
||||
* Drivers using secondary unicast addresses must set user_set_promisc when
|
||||
* manually putting the device into promiscuous mode.
|
||||
**/
|
||||
s32 ixgbe_update_uc_addr_list_generic(struct ixgbe_hw *hw,
|
||||
struct net_device *netdev)
|
||||
{
|
||||
u32 i;
|
||||
u32 old_promisc_setting = hw->addr_ctrl.overflow_promisc;
|
||||
u32 uc_addr_in_use;
|
||||
u32 fctrl;
|
||||
struct netdev_hw_addr *ha;
|
||||
|
||||
/*
|
||||
* Clear accounting of old secondary address list,
|
||||
* don't count RAR[0]
|
||||
*/
|
||||
uc_addr_in_use = hw->addr_ctrl.rar_used_count - 1;
|
||||
hw->addr_ctrl.rar_used_count -= uc_addr_in_use;
|
||||
hw->addr_ctrl.overflow_promisc = 0;
|
||||
|
||||
/* Zero out the other receive addresses */
|
||||
hw_dbg(hw, "Clearing RAR[1-%d]\n", uc_addr_in_use + 1);
|
||||
for (i = 0; i < uc_addr_in_use; i++) {
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAL(1+i), 0);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_RAH(1+i), 0);
|
||||
}
|
||||
|
||||
/* Add the new addresses */
|
||||
netdev_for_each_uc_addr(ha, netdev) {
|
||||
hw_dbg(hw, " Adding the secondary addresses:\n");
|
||||
ixgbe_add_uc_addr(hw, ha->addr, 0);
|
||||
}
|
||||
|
||||
if (hw->addr_ctrl.overflow_promisc) {
|
||||
/* enable promisc if not already in overflow or set by user */
|
||||
if (!old_promisc_setting && !hw->addr_ctrl.user_set_promisc) {
|
||||
hw_dbg(hw, " Entering address overflow promisc mode\n");
|
||||
fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
|
||||
fctrl |= IXGBE_FCTRL_UPE;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
|
||||
hw->addr_ctrl.uc_set_promisc = true;
|
||||
}
|
||||
} else {
|
||||
/* only disable if set by overflow, not by user */
|
||||
if ((old_promisc_setting && hw->addr_ctrl.uc_set_promisc) &&
|
||||
!(hw->addr_ctrl.user_set_promisc)) {
|
||||
hw_dbg(hw, " Leaving address overflow promisc mode\n");
|
||||
fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
|
||||
fctrl &= ~IXGBE_FCTRL_UPE;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
|
||||
hw->addr_ctrl.uc_set_promisc = false;
|
||||
}
|
||||
}
|
||||
|
||||
hw_dbg(hw, "ixgbe_update_uc_addr_list_generic Complete\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_mta_vector - Determines bit-vector in multicast table to set
|
||||
* @hw: pointer to hardware structure
|
||||
|
@ -1550,7 +1416,6 @@ static void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr)
|
|||
u32 vector;
|
||||
u32 vector_bit;
|
||||
u32 vector_reg;
|
||||
u32 mta_reg;
|
||||
|
||||
hw->addr_ctrl.mta_in_use++;
|
||||
|
||||
|
@ -1568,9 +1433,7 @@ static void ixgbe_set_mta(struct ixgbe_hw *hw, u8 *mc_addr)
|
|||
*/
|
||||
vector_reg = (vector >> 5) & 0x7F;
|
||||
vector_bit = vector & 0x1F;
|
||||
mta_reg = IXGBE_READ_REG(hw, IXGBE_MTA(vector_reg));
|
||||
mta_reg |= (1 << vector_bit);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MTA(vector_reg), mta_reg);
|
||||
hw->mac.mta_shadow[vector_reg] |= (1 << vector_bit);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1596,18 +1459,21 @@ s32 ixgbe_update_mc_addr_list_generic(struct ixgbe_hw *hw,
|
|||
hw->addr_ctrl.num_mc_addrs = netdev_mc_count(netdev);
|
||||
hw->addr_ctrl.mta_in_use = 0;
|
||||
|
||||
/* Clear the MTA */
|
||||
/* Clear mta_shadow */
|
||||
hw_dbg(hw, " Clearing MTA\n");
|
||||
for (i = 0; i < hw->mac.mcft_size; i++)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MTA(i), 0);
|
||||
memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow));
|
||||
|
||||
/* Add the new addresses */
|
||||
/* Update mta shadow */
|
||||
netdev_for_each_mc_addr(ha, netdev) {
|
||||
hw_dbg(hw, " Adding the multicast addresses:\n");
|
||||
ixgbe_set_mta(hw, ha->addr);
|
||||
}
|
||||
|
||||
/* Enable mta */
|
||||
for (i = 0; i < hw->mac.mcft_size; i++)
|
||||
IXGBE_WRITE_REG_ARRAY(hw, IXGBE_MTA(0), i,
|
||||
hw->mac.mta_shadow[i]);
|
||||
|
||||
if (hw->addr_ctrl.mta_in_use > 0)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL,
|
||||
IXGBE_MCSTCTRL_MFE | hw->mac.mc_filter_type);
|
||||
|
@ -1624,15 +1490,8 @@ s32 ixgbe_update_mc_addr_list_generic(struct ixgbe_hw *hw,
|
|||
**/
|
||||
s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 i;
|
||||
u32 rar_entries = hw->mac.num_rar_entries;
|
||||
struct ixgbe_addr_filter_info *a = &hw->addr_ctrl;
|
||||
|
||||
if (a->mc_addr_in_rar_count > 0)
|
||||
for (i = (rar_entries - a->mc_addr_in_rar_count);
|
||||
i < rar_entries; i++)
|
||||
ixgbe_enable_rar(hw, i);
|
||||
|
||||
if (a->mta_in_use > 0)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, IXGBE_MCSTCTRL_MFE |
|
||||
hw->mac.mc_filter_type);
|
||||
|
@ -1648,15 +1507,8 @@ s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw)
|
|||
**/
|
||||
s32 ixgbe_disable_mc_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 i;
|
||||
u32 rar_entries = hw->mac.num_rar_entries;
|
||||
struct ixgbe_addr_filter_info *a = &hw->addr_ctrl;
|
||||
|
||||
if (a->mc_addr_in_rar_count > 0)
|
||||
for (i = (rar_entries - a->mc_addr_in_rar_count);
|
||||
i < rar_entries; i++)
|
||||
ixgbe_disable_rar(hw, i);
|
||||
|
||||
if (a->mta_in_use > 0)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, hw->mac.mc_filter_type);
|
||||
|
||||
|
@ -1703,7 +1555,9 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num)
|
|||
* 2: Tx flow control is enabled (we can send pause frames but
|
||||
* we do not support receiving pause frames).
|
||||
* 3: Both Rx and Tx flow control (symmetric) are enabled.
|
||||
#ifdef CONFIG_DCB
|
||||
* 4: Priority Flow Control is enabled.
|
||||
#endif
|
||||
* other: Invalid.
|
||||
*/
|
||||
switch (hw->fc.current_mode) {
|
||||
|
@ -2159,10 +2013,16 @@ static s32 ixgbe_setup_fc(struct ixgbe_hw *hw, s32 packetbuf_num)
|
|||
**/
|
||||
s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = hw->back;
|
||||
u32 i;
|
||||
u32 reg_val;
|
||||
u32 number_of_queues;
|
||||
s32 status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
|
||||
s32 status = 0;
|
||||
u16 dev_status = 0;
|
||||
|
||||
/* Just jump out if bus mastering is already disabled */
|
||||
if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO))
|
||||
goto out;
|
||||
|
||||
/* Disable the receive unit by stopping each queue */
|
||||
number_of_queues = hw->mac.max_rx_queues;
|
||||
|
@ -2179,13 +2039,43 @@ s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
|
|||
IXGBE_WRITE_REG(hw, IXGBE_CTRL, reg_val);
|
||||
|
||||
for (i = 0; i < IXGBE_PCI_MASTER_DISABLE_TIMEOUT; i++) {
|
||||
if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO)) {
|
||||
status = 0;
|
||||
break;
|
||||
}
|
||||
if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO))
|
||||
goto check_device_status;
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
hw_dbg(hw, "GIO Master Disable bit didn't clear - requesting resets\n");
|
||||
status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
|
||||
|
||||
/*
|
||||
* Before proceeding, make sure that the PCIe block does not have
|
||||
* transactions pending.
|
||||
*/
|
||||
check_device_status:
|
||||
for (i = 0; i < IXGBE_PCI_MASTER_DISABLE_TIMEOUT; i++) {
|
||||
pci_read_config_word(adapter->pdev, IXGBE_PCI_DEVICE_STATUS,
|
||||
&dev_status);
|
||||
if (!(dev_status & IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING))
|
||||
break;
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
if (i == IXGBE_PCI_MASTER_DISABLE_TIMEOUT)
|
||||
hw_dbg(hw, "PCIe transaction pending bit also did not clear.\n");
|
||||
else
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Two consecutive resets are required via CTRL.RST per datasheet
|
||||
* 5.2.5.3.2 Master Disable. We set a flag to inform the reset routine
|
||||
* of this need. The first reset prevents new master requests from
|
||||
* being issued by our device. We then must wait 1usec for any
|
||||
* remaining completions from the PCIe bus to trickle in, and then reset
|
||||
* again to clear out any effects they may have had on our device.
|
||||
*/
|
||||
hw->mac.flags |= IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
|
||||
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -2206,6 +2096,10 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask)
|
|||
s32 timeout = 200;
|
||||
|
||||
while (timeout) {
|
||||
/*
|
||||
* SW EEPROM semaphore bit is used for access to all
|
||||
* SW_FW_SYNC/GSSR bits (not just EEPROM)
|
||||
*/
|
||||
if (ixgbe_get_eeprom_semaphore(hw))
|
||||
return IXGBE_ERR_SWFW_SYNC;
|
||||
|
||||
|
@ -2223,7 +2117,7 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask)
|
|||
}
|
||||
|
||||
if (!timeout) {
|
||||
hw_dbg(hw, "Driver can't access resource, GSSR timeout.\n");
|
||||
hw_dbg(hw, "Driver can't access resource, SW_FW_SYNC timeout.\n");
|
||||
return IXGBE_ERR_SWFW_SYNC;
|
||||
}
|
||||
|
||||
|
@ -2427,37 +2321,38 @@ s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
|||
u32 mpsar_lo, mpsar_hi;
|
||||
u32 rar_entries = hw->mac.num_rar_entries;
|
||||
|
||||
if (rar < rar_entries) {
|
||||
mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
|
||||
mpsar_hi = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar));
|
||||
|
||||
if (!mpsar_lo && !mpsar_hi)
|
||||
goto done;
|
||||
|
||||
if (vmdq == IXGBE_CLEAR_VMDQ_ALL) {
|
||||
if (mpsar_lo) {
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 0);
|
||||
mpsar_lo = 0;
|
||||
}
|
||||
if (mpsar_hi) {
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 0);
|
||||
mpsar_hi = 0;
|
||||
}
|
||||
} else if (vmdq < 32) {
|
||||
mpsar_lo &= ~(1 << vmdq);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar_lo);
|
||||
} else {
|
||||
mpsar_hi &= ~(1 << (vmdq - 32));
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar_hi);
|
||||
}
|
||||
|
||||
/* was that the last pool using this rar? */
|
||||
if (mpsar_lo == 0 && mpsar_hi == 0 && rar != 0)
|
||||
hw->mac.ops.clear_rar(hw, rar);
|
||||
} else {
|
||||
/* Make sure we are using a valid rar index range */
|
||||
if (rar >= rar_entries) {
|
||||
hw_dbg(hw, "RAR index %d is out of range.\n", rar);
|
||||
return IXGBE_ERR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
|
||||
mpsar_hi = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar));
|
||||
|
||||
if (!mpsar_lo && !mpsar_hi)
|
||||
goto done;
|
||||
|
||||
if (vmdq == IXGBE_CLEAR_VMDQ_ALL) {
|
||||
if (mpsar_lo) {
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 0);
|
||||
mpsar_lo = 0;
|
||||
}
|
||||
if (mpsar_hi) {
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 0);
|
||||
mpsar_hi = 0;
|
||||
}
|
||||
} else if (vmdq < 32) {
|
||||
mpsar_lo &= ~(1 << vmdq);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar_lo);
|
||||
} else {
|
||||
mpsar_hi &= ~(1 << (vmdq - 32));
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar_hi);
|
||||
}
|
||||
|
||||
/* was that the last pool using this rar? */
|
||||
if (mpsar_lo == 0 && mpsar_hi == 0 && rar != 0)
|
||||
hw->mac.ops.clear_rar(hw, rar);
|
||||
done:
|
||||
return 0;
|
||||
}
|
||||
|
@ -2473,18 +2368,20 @@ s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
|||
u32 mpsar;
|
||||
u32 rar_entries = hw->mac.num_rar_entries;
|
||||
|
||||
if (rar < rar_entries) {
|
||||
if (vmdq < 32) {
|
||||
mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
|
||||
mpsar |= 1 << vmdq;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar);
|
||||
} else {
|
||||
mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar));
|
||||
mpsar |= 1 << (vmdq - 32);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar);
|
||||
}
|
||||
} else {
|
||||
/* Make sure we are using a valid rar index range */
|
||||
if (rar >= rar_entries) {
|
||||
hw_dbg(hw, "RAR index %d is out of range.\n", rar);
|
||||
return IXGBE_ERR_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if (vmdq < 32) {
|
||||
mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
|
||||
mpsar |= 1 << vmdq;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar);
|
||||
} else {
|
||||
mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar));
|
||||
mpsar |= 1 << (vmdq - 32);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), mpsar);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -2497,7 +2394,6 @@ s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw)
|
|||
{
|
||||
int i;
|
||||
|
||||
|
||||
for (i = 0; i < 128; i++)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_UTA(i), 0);
|
||||
|
||||
|
@ -2726,12 +2622,21 @@ s32 ixgbe_clear_vfta_generic(struct ixgbe_hw *hw)
|
|||
* Reads the links register to determine if link is up and the current speed
|
||||
**/
|
||||
s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
|
||||
bool *link_up, bool link_up_wait_to_complete)
|
||||
bool *link_up, bool link_up_wait_to_complete)
|
||||
{
|
||||
u32 links_reg;
|
||||
u32 links_reg, links_orig;
|
||||
u32 i;
|
||||
|
||||
/* clear the old state */
|
||||
links_orig = IXGBE_READ_REG(hw, IXGBE_LINKS);
|
||||
|
||||
links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
|
||||
|
||||
if (links_orig != links_reg) {
|
||||
hw_dbg(hw, "LINKS changed from %08X to %08X\n",
|
||||
links_orig, links_reg);
|
||||
}
|
||||
|
||||
if (link_up_wait_to_complete) {
|
||||
for (i = 0; i < IXGBE_LINK_UP_TIME; i++) {
|
||||
if (links_reg & IXGBE_LINKS_UP) {
|
||||
|
@ -2754,10 +2659,13 @@ s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
|
|||
IXGBE_LINKS_SPEED_10G_82599)
|
||||
*speed = IXGBE_LINK_SPEED_10GB_FULL;
|
||||
else if ((links_reg & IXGBE_LINKS_SPEED_82599) ==
|
||||
IXGBE_LINKS_SPEED_1G_82599)
|
||||
IXGBE_LINKS_SPEED_1G_82599)
|
||||
*speed = IXGBE_LINK_SPEED_1GB_FULL;
|
||||
else
|
||||
else if ((links_reg & IXGBE_LINKS_SPEED_82599) ==
|
||||
IXGBE_LINKS_SPEED_100_82599)
|
||||
*speed = IXGBE_LINK_SPEED_100_FULL;
|
||||
else
|
||||
*speed = IXGBE_LINK_SPEED_UNKNOWN;
|
||||
|
||||
/* if link is down, zero out the current_mode */
|
||||
if (*link_up == false) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
@ -63,8 +63,6 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index);
|
|||
s32 ixgbe_init_rx_addrs_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_update_mc_addr_list_generic(struct ixgbe_hw *hw,
|
||||
struct net_device *netdev);
|
||||
s32 ixgbe_update_uc_addr_list_generic(struct ixgbe_hw *hw,
|
||||
struct net_device *netdev);
|
||||
s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_disable_mc_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_enable_rx_dma_generic(struct ixgbe_hw *hw, u32 regval);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
@ -54,7 +54,8 @@ static const char ixgbe_driver_string[] =
|
|||
|
||||
#define DRV_VERSION "3.2.9-k2"
|
||||
const char ixgbe_driver_version[] = DRV_VERSION;
|
||||
static char ixgbe_copyright[] = "Copyright (c) 1999-2010 Intel Corporation.";
|
||||
static const char ixgbe_copyright[] =
|
||||
"Copyright (c) 1999-2011 Intel Corporation.";
|
||||
|
||||
static const struct ixgbe_info *ixgbe_info_tbl[] = {
|
||||
[board_82598] = &ixgbe_82598_info,
|
||||
|
@ -2597,6 +2598,11 @@ static void ixgbe_free_irq(struct ixgbe_adapter *adapter)
|
|||
|
||||
i--;
|
||||
for (; i >= 0; i--) {
|
||||
/* free only the irqs that were actually requested */
|
||||
if (!adapter->q_vector[i]->rxr_count &&
|
||||
!adapter->q_vector[i]->txr_count)
|
||||
continue;
|
||||
|
||||
free_irq(adapter->msix_entries[i].vector,
|
||||
adapter->q_vector[i]);
|
||||
}
|
||||
|
@ -3884,7 +3890,7 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
|
|||
* If we're not hot-pluggable SFP+, we just need to configure link
|
||||
* and bring it up.
|
||||
*/
|
||||
if (hw->phy.type == ixgbe_phy_unknown)
|
||||
if (hw->phy.type == ixgbe_phy_none)
|
||||
schedule_work(&adapter->sfp_config_module_task);
|
||||
|
||||
/* enable transmits */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
@ -138,17 +138,51 @@ static enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
|
|||
**/
|
||||
s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 i;
|
||||
u16 ctrl = 0;
|
||||
s32 status = 0;
|
||||
|
||||
if (hw->phy.type == ixgbe_phy_unknown)
|
||||
status = ixgbe_identify_phy_generic(hw);
|
||||
|
||||
if (status != 0 || hw->phy.type == ixgbe_phy_none)
|
||||
goto out;
|
||||
|
||||
/* Don't reset PHY if it's shut down due to overtemp. */
|
||||
if (!hw->phy.reset_if_overtemp &&
|
||||
(IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Perform soft PHY reset to the PHY_XS.
|
||||
* This will cause a soft reset to the PHY
|
||||
*/
|
||||
return hw->phy.ops.write_reg(hw, MDIO_CTRL1, MDIO_MMD_PHYXS,
|
||||
MDIO_CTRL1_RESET);
|
||||
hw->phy.ops.write_reg(hw, MDIO_CTRL1,
|
||||
MDIO_MMD_PHYXS,
|
||||
MDIO_CTRL1_RESET);
|
||||
|
||||
/*
|
||||
* Poll for reset bit to self-clear indicating reset is complete.
|
||||
* Some PHYs could take up to 3 seconds to complete and need about
|
||||
* 1.7 usec delay after the reset is complete.
|
||||
*/
|
||||
for (i = 0; i < 30; i++) {
|
||||
msleep(100);
|
||||
hw->phy.ops.read_reg(hw, MDIO_CTRL1,
|
||||
MDIO_MMD_PHYXS, &ctrl);
|
||||
if (!(ctrl & MDIO_CTRL1_RESET)) {
|
||||
udelay(2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ctrl & MDIO_CTRL1_RESET) {
|
||||
status = IXGBE_ERR_RESET_FAILED;
|
||||
hw_dbg(hw, "PHY reset polling failed to complete.\n");
|
||||
}
|
||||
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -171,7 +205,7 @@ s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
|||
else
|
||||
gssr = IXGBE_GSSR_PHY0_SM;
|
||||
|
||||
if (ixgbe_acquire_swfw_sync(hw, gssr) != 0)
|
||||
if (hw->mac.ops.acquire_swfw_sync(hw, gssr) != 0)
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
|
||||
if (status == 0) {
|
||||
|
@ -243,7 +277,7 @@ s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
|||
}
|
||||
}
|
||||
|
||||
ixgbe_release_swfw_sync(hw, gssr);
|
||||
hw->mac.ops.release_swfw_sync(hw, gssr);
|
||||
}
|
||||
|
||||
return status;
|
||||
|
@ -269,7 +303,7 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
|||
else
|
||||
gssr = IXGBE_GSSR_PHY0_SM;
|
||||
|
||||
if (ixgbe_acquire_swfw_sync(hw, gssr) != 0)
|
||||
if (hw->mac.ops.acquire_swfw_sync(hw, gssr) != 0)
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
|
||||
if (status == 0) {
|
||||
|
@ -336,7 +370,7 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
|||
}
|
||||
}
|
||||
|
||||
ixgbe_release_swfw_sync(hw, gssr);
|
||||
hw->mac.ops.release_swfw_sync(hw, gssr);
|
||||
}
|
||||
|
||||
return status;
|
||||
|
@ -556,11 +590,10 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
|
|||
}
|
||||
|
||||
/**
|
||||
* ixgbe_identify_sfp_module_generic - Identifies SFP module and assigns
|
||||
* the PHY type.
|
||||
* ixgbe_identify_sfp_module_generic - Identifies SFP modules
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Searches for and indentifies the SFP module. Assings appropriate PHY type.
|
||||
* Searches for and identifies the SFP module and assigns appropriate PHY type.
|
||||
**/
|
||||
s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
|
@ -581,41 +614,62 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|||
goto out;
|
||||
}
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER,
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_IDENTIFIER,
|
||||
&identifier);
|
||||
|
||||
if (status == IXGBE_ERR_SFP_NOT_PRESENT || status == IXGBE_ERR_I2C) {
|
||||
status = IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
||||
if (hw->phy.type != ixgbe_phy_nl) {
|
||||
hw->phy.id = 0;
|
||||
hw->phy.type = ixgbe_phy_unknown;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
if (status == IXGBE_ERR_SWFW_SYNC ||
|
||||
status == IXGBE_ERR_I2C ||
|
||||
status == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
if (identifier == IXGBE_SFF_IDENTIFIER_SFP) {
|
||||
hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_1GBE_COMP_CODES,
|
||||
&comp_codes_1g);
|
||||
hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_10GBE_COMP_CODES,
|
||||
&comp_codes_10g);
|
||||
hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_CABLE_TECHNOLOGY,
|
||||
&cable_tech);
|
||||
/* LAN ID is needed for sfp_type determination */
|
||||
hw->mac.ops.set_lan_id(hw);
|
||||
|
||||
/* ID Module
|
||||
* =========
|
||||
* 0 SFP_DA_CU
|
||||
* 1 SFP_SR
|
||||
* 2 SFP_LR
|
||||
* 3 SFP_DA_CORE0 - 82599-specific
|
||||
* 4 SFP_DA_CORE1 - 82599-specific
|
||||
* 5 SFP_SR/LR_CORE0 - 82599-specific
|
||||
* 6 SFP_SR/LR_CORE1 - 82599-specific
|
||||
* 7 SFP_act_lmt_DA_CORE0 - 82599-specific
|
||||
* 8 SFP_act_lmt_DA_CORE1 - 82599-specific
|
||||
* 9 SFP_1g_cu_CORE0 - 82599-specific
|
||||
* 10 SFP_1g_cu_CORE1 - 82599-specific
|
||||
*/
|
||||
if (identifier != IXGBE_SFF_IDENTIFIER_SFP) {
|
||||
hw->phy.type = ixgbe_phy_sfp_unsupported;
|
||||
status = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
} else {
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_1GBE_COMP_CODES,
|
||||
&comp_codes_1g);
|
||||
|
||||
if (status == IXGBE_ERR_SWFW_SYNC ||
|
||||
status == IXGBE_ERR_I2C ||
|
||||
status == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_10GBE_COMP_CODES,
|
||||
&comp_codes_10g);
|
||||
|
||||
if (status == IXGBE_ERR_SWFW_SYNC ||
|
||||
status == IXGBE_ERR_I2C ||
|
||||
status == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto err_read_i2c_eeprom;
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_CABLE_TECHNOLOGY,
|
||||
&cable_tech);
|
||||
|
||||
if (status == IXGBE_ERR_SWFW_SYNC ||
|
||||
status == IXGBE_ERR_I2C ||
|
||||
status == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
/* ID Module
|
||||
* =========
|
||||
* 0 SFP_DA_CU
|
||||
* 1 SFP_SR
|
||||
* 2 SFP_LR
|
||||
* 3 SFP_DA_CORE0 - 82599-specific
|
||||
* 4 SFP_DA_CORE1 - 82599-specific
|
||||
* 5 SFP_SR/LR_CORE0 - 82599-specific
|
||||
* 6 SFP_SR/LR_CORE1 - 82599-specific
|
||||
* 7 SFP_act_lmt_DA_CORE0 - 82599-specific
|
||||
* 8 SFP_act_lmt_DA_CORE1 - 82599-specific
|
||||
* 9 SFP_1g_cu_CORE0 - 82599-specific
|
||||
* 10 SFP_1g_cu_CORE1 - 82599-specific
|
||||
*/
|
||||
if (hw->mac.type == ixgbe_mac_82598EB) {
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
|
||||
|
@ -647,31 +701,27 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|||
ixgbe_sfp_type_da_act_lmt_core1;
|
||||
} else {
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_unknown;
|
||||
ixgbe_sfp_type_unknown;
|
||||
}
|
||||
} else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
|
||||
} else if (comp_codes_10g &
|
||||
(IXGBE_SFF_10GBASESR_CAPABLE |
|
||||
IXGBE_SFF_10GBASELR_CAPABLE)) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core1;
|
||||
else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core1;
|
||||
else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE)
|
||||
} else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_cu_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_1g_cu_core1;
|
||||
else
|
||||
} else {
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw->phy.sfp_type != stored_sfp_type)
|
||||
|
@ -688,16 +738,33 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|||
/* Determine PHY vendor */
|
||||
if (hw->phy.type != ixgbe_phy_nl) {
|
||||
hw->phy.id = identifier;
|
||||
hw->phy.ops.read_i2c_eeprom(hw,
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_VENDOR_OUI_BYTE0,
|
||||
&oui_bytes[0]);
|
||||
hw->phy.ops.read_i2c_eeprom(hw,
|
||||
|
||||
if (status == IXGBE_ERR_SWFW_SYNC ||
|
||||
status == IXGBE_ERR_I2C ||
|
||||
status == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_VENDOR_OUI_BYTE1,
|
||||
&oui_bytes[1]);
|
||||
hw->phy.ops.read_i2c_eeprom(hw,
|
||||
|
||||
if (status == IXGBE_ERR_SWFW_SYNC ||
|
||||
status == IXGBE_ERR_I2C ||
|
||||
status == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
status = hw->phy.ops.read_i2c_eeprom(hw,
|
||||
IXGBE_SFF_VENDOR_OUI_BYTE2,
|
||||
&oui_bytes[2]);
|
||||
|
||||
if (status == IXGBE_ERR_SWFW_SYNC ||
|
||||
status == IXGBE_ERR_I2C ||
|
||||
status == IXGBE_ERR_SFP_NOT_PRESENT)
|
||||
goto err_read_i2c_eeprom;
|
||||
|
||||
vendor_oui =
|
||||
((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
|
||||
(oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
|
||||
|
@ -707,7 +774,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|||
case IXGBE_SFF_VENDOR_OUI_TYCO:
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_passive_tyco;
|
||||
ixgbe_phy_sfp_passive_tyco;
|
||||
break;
|
||||
case IXGBE_SFF_VENDOR_OUI_FTL:
|
||||
if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
||||
|
@ -724,7 +791,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|||
default:
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_passive_unknown;
|
||||
ixgbe_phy_sfp_passive_unknown;
|
||||
else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_active_unknown;
|
||||
|
@ -734,7 +801,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|||
}
|
||||
}
|
||||
|
||||
/* All passive DA cables are supported */
|
||||
/* Allow any DA cable vendor */
|
||||
if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
|
||||
IXGBE_SFF_DA_ACTIVE_CABLE)) {
|
||||
status = 0;
|
||||
|
@ -776,15 +843,24 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|||
|
||||
out:
|
||||
return status;
|
||||
|
||||
err_read_i2c_eeprom:
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
||||
if (hw->phy.type != ixgbe_phy_nl) {
|
||||
hw->phy.id = 0;
|
||||
hw->phy.type = ixgbe_phy_unknown;
|
||||
}
|
||||
return IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_get_sfp_init_sequence_offsets - Checks the MAC's EEPROM to see
|
||||
* if it supports a given SFP+ module type, if so it returns the offsets to the
|
||||
* phy init sequence block.
|
||||
* ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence
|
||||
* @hw: pointer to hardware structure
|
||||
* @list_offset: offset to the SFP ID list
|
||||
* @data_offset: offset to the SFP data block
|
||||
*
|
||||
* Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if
|
||||
* so it returns the offsets to the phy init sequence block.
|
||||
**/
|
||||
s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
||||
u16 *list_offset,
|
||||
|
@ -899,11 +975,22 @@ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
|||
u8 dev_addr, u8 *data)
|
||||
{
|
||||
s32 status = 0;
|
||||
u32 max_retry = 1;
|
||||
u32 max_retry = 10;
|
||||
u32 retry = 0;
|
||||
u16 swfw_mask = 0;
|
||||
bool nack = 1;
|
||||
|
||||
if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
|
||||
swfw_mask = IXGBE_GSSR_PHY1_SM;
|
||||
else
|
||||
swfw_mask = IXGBE_GSSR_PHY0_SM;
|
||||
|
||||
do {
|
||||
if (ixgbe_acquire_swfw_sync(hw, swfw_mask) != 0) {
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
goto read_byte_out;
|
||||
}
|
||||
|
||||
ixgbe_i2c_start(hw);
|
||||
|
||||
/* Device Address and write indication */
|
||||
|
@ -946,6 +1033,8 @@ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
|||
break;
|
||||
|
||||
fail:
|
||||
ixgbe_release_swfw_sync(hw, swfw_mask);
|
||||
msleep(100);
|
||||
ixgbe_i2c_bus_clear(hw);
|
||||
retry++;
|
||||
if (retry < max_retry)
|
||||
|
@ -955,6 +1044,9 @@ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
|||
|
||||
} while (retry < max_retry);
|
||||
|
||||
ixgbe_release_swfw_sync(hw, swfw_mask);
|
||||
|
||||
read_byte_out:
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -973,6 +1065,17 @@ s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
|||
s32 status = 0;
|
||||
u32 max_retry = 1;
|
||||
u32 retry = 0;
|
||||
u16 swfw_mask = 0;
|
||||
|
||||
if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
|
||||
swfw_mask = IXGBE_GSSR_PHY1_SM;
|
||||
else
|
||||
swfw_mask = IXGBE_GSSR_PHY0_SM;
|
||||
|
||||
if (ixgbe_acquire_swfw_sync(hw, swfw_mask) != 0) {
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
goto write_byte_out;
|
||||
}
|
||||
|
||||
do {
|
||||
ixgbe_i2c_start(hw);
|
||||
|
@ -1013,6 +1116,9 @@ s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
|||
hw_dbg(hw, "I2C byte write error.\n");
|
||||
} while (retry < max_retry);
|
||||
|
||||
ixgbe_release_swfw_sync(hw, swfw_mask);
|
||||
|
||||
write_byte_out:
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1331,6 +1437,8 @@ static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
|
|||
u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
|
||||
u32 i;
|
||||
|
||||
ixgbe_i2c_start(hw);
|
||||
|
||||
ixgbe_set_i2c_data(hw, &i2cctl, 1);
|
||||
|
||||
for (i = 0; i < 9; i++) {
|
||||
|
@ -1345,6 +1453,8 @@ static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
|
|||
udelay(IXGBE_I2C_T_LOW);
|
||||
}
|
||||
|
||||
ixgbe_i2c_start(hw);
|
||||
|
||||
/* Put the i2c bus back to default state */
|
||||
ixgbe_i2c_stop(hw);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
@ -91,7 +91,7 @@
|
|||
|
||||
/* General Receive Control */
|
||||
#define IXGBE_GRC_MNG 0x00000001 /* Manageability Enable */
|
||||
#define IXGBE_GRC_APME 0x00000002 /* Advanced Power Management Enable */
|
||||
#define IXGBE_GRC_APME 0x00000002 /* APM enabled in EEPROM */
|
||||
|
||||
#define IXGBE_VPDDIAG0 0x10204
|
||||
#define IXGBE_VPDDIAG1 0x10208
|
||||
|
@ -342,7 +342,7 @@
|
|||
/* Wake Up Control */
|
||||
#define IXGBE_WUC_PME_EN 0x00000002 /* PME Enable */
|
||||
#define IXGBE_WUC_PME_STATUS 0x00000004 /* PME Status */
|
||||
#define IXGBE_WUC_ADVD3WUC 0x00000010 /* D3Cold wake up cap. enable*/
|
||||
#define IXGBE_WUC_WKEN 0x00000010 /* Enable PE_WAKE_N pin assertion */
|
||||
|
||||
/* Wake Up Filter Control */
|
||||
#define IXGBE_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */
|
||||
|
@ -1614,6 +1614,8 @@
|
|||
#define IXGBE_ALT_SAN_MAC_ADDR_CAPS_ALTWWN 0x1 /* Alt. WWN base exists */
|
||||
|
||||
/* PCI Bus Info */
|
||||
#define IXGBE_PCI_DEVICE_STATUS 0xAA
|
||||
#define IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING 0x0020
|
||||
#define IXGBE_PCI_LINK_STATUS 0xB2
|
||||
#define IXGBE_PCI_DEVICE_CONTROL2 0xC8
|
||||
#define IXGBE_PCI_LINK_WIDTH 0x3F0
|
||||
|
@ -2242,6 +2244,7 @@ enum ixgbe_mac_type {
|
|||
|
||||
enum ixgbe_phy_type {
|
||||
ixgbe_phy_unknown = 0,
|
||||
ixgbe_phy_none,
|
||||
ixgbe_phy_tn,
|
||||
ixgbe_phy_aq,
|
||||
ixgbe_phy_cu_unknown,
|
||||
|
@ -2330,32 +2333,31 @@ enum ixgbe_bus_type {
|
|||
/* PCI bus speeds */
|
||||
enum ixgbe_bus_speed {
|
||||
ixgbe_bus_speed_unknown = 0,
|
||||
ixgbe_bus_speed_33,
|
||||
ixgbe_bus_speed_66,
|
||||
ixgbe_bus_speed_100,
|
||||
ixgbe_bus_speed_120,
|
||||
ixgbe_bus_speed_133,
|
||||
ixgbe_bus_speed_2500,
|
||||
ixgbe_bus_speed_5000,
|
||||
ixgbe_bus_speed_33 = 33,
|
||||
ixgbe_bus_speed_66 = 66,
|
||||
ixgbe_bus_speed_100 = 100,
|
||||
ixgbe_bus_speed_120 = 120,
|
||||
ixgbe_bus_speed_133 = 133,
|
||||
ixgbe_bus_speed_2500 = 2500,
|
||||
ixgbe_bus_speed_5000 = 5000,
|
||||
ixgbe_bus_speed_reserved
|
||||
};
|
||||
|
||||
/* PCI bus widths */
|
||||
enum ixgbe_bus_width {
|
||||
ixgbe_bus_width_unknown = 0,
|
||||
ixgbe_bus_width_pcie_x1,
|
||||
ixgbe_bus_width_pcie_x2,
|
||||
ixgbe_bus_width_pcie_x1 = 1,
|
||||
ixgbe_bus_width_pcie_x2 = 2,
|
||||
ixgbe_bus_width_pcie_x4 = 4,
|
||||
ixgbe_bus_width_pcie_x8 = 8,
|
||||
ixgbe_bus_width_32,
|
||||
ixgbe_bus_width_64,
|
||||
ixgbe_bus_width_32 = 32,
|
||||
ixgbe_bus_width_64 = 64,
|
||||
ixgbe_bus_width_reserved
|
||||
};
|
||||
|
||||
struct ixgbe_addr_filter_info {
|
||||
u32 num_mc_addrs;
|
||||
u32 rar_used_count;
|
||||
u32 mc_addr_in_rar_count;
|
||||
u32 mta_in_use;
|
||||
u32 overflow_promisc;
|
||||
bool uc_set_promisc;
|
||||
|
@ -2493,6 +2495,8 @@ struct ixgbe_mac_operations {
|
|||
s32 (*write_analog_reg8)(struct ixgbe_hw*, u32, u8);
|
||||
s32 (*setup_sfp)(struct ixgbe_hw *);
|
||||
s32 (*enable_rx_dma)(struct ixgbe_hw *, u32);
|
||||
s32 (*acquire_swfw_sync)(struct ixgbe_hw *, u16);
|
||||
void (*release_swfw_sync)(struct ixgbe_hw *, u16);
|
||||
|
||||
/* Link */
|
||||
void (*disable_tx_laser)(struct ixgbe_hw *);
|
||||
|
@ -2515,7 +2519,6 @@ struct ixgbe_mac_operations {
|
|||
s32 (*set_vmdq)(struct ixgbe_hw *, u32, u32);
|
||||
s32 (*clear_vmdq)(struct ixgbe_hw *, u32, u32);
|
||||
s32 (*init_rx_addrs)(struct ixgbe_hw *);
|
||||
s32 (*update_uc_addr_list)(struct ixgbe_hw *, struct net_device *);
|
||||
s32 (*update_mc_addr_list)(struct ixgbe_hw *, struct net_device *);
|
||||
s32 (*enable_mc)(struct ixgbe_hw *);
|
||||
s32 (*disable_mc)(struct ixgbe_hw *);
|
||||
|
@ -2556,6 +2559,7 @@ struct ixgbe_eeprom_info {
|
|||
u16 address_bits;
|
||||
};
|
||||
|
||||
#define IXGBE_FLAGS_DOUBLE_RESET_REQUIRED 0x01
|
||||
struct ixgbe_mac_info {
|
||||
struct ixgbe_mac_operations ops;
|
||||
enum ixgbe_mac_type type;
|
||||
|
@ -2566,6 +2570,8 @@ struct ixgbe_mac_info {
|
|||
u16 wwnn_prefix;
|
||||
/* prefix for World Wide Port Name (WWPN) */
|
||||
u16 wwpn_prefix;
|
||||
#define IXGBE_MAX_MTA 128
|
||||
u32 mta_shadow[IXGBE_MAX_MTA];
|
||||
s32 mc_filter_type;
|
||||
u32 mcft_size;
|
||||
u32 vft_size;
|
||||
|
@ -2578,6 +2584,7 @@ struct ixgbe_mac_info {
|
|||
u32 orig_autoc2;
|
||||
bool orig_link_settings_stored;
|
||||
bool autotry_restart;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
struct ixgbe_phy_info {
|
||||
|
@ -2684,7 +2691,6 @@ struct ixgbe_info {
|
|||
#define IXGBE_ERR_EEPROM_VERSION -24
|
||||
#define IXGBE_ERR_NO_SPACE -25
|
||||
#define IXGBE_ERR_OVERTEMP -26
|
||||
#define IXGBE_ERR_RAR_INDEX -27
|
||||
#define IXGBE_ERR_SFP_SETUP_NOT_COMPLETE -30
|
||||
#define IXGBE_ERR_PBA_SECTION -31
|
||||
#define IXGBE_ERR_INVALID_ARGUMENT -32
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
|
||||
Intel 10 Gigabit PCI Express Linux driver
|
||||
Copyright(c) 1999 - 2010 Intel Corporation.
|
||||
Copyright(c) 1999 - 2011 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,
|
||||
|
@ -31,7 +31,6 @@
|
|||
|
||||
#include "ixgbe.h"
|
||||
#include "ixgbe_phy.h"
|
||||
//#include "ixgbe_mbx.h"
|
||||
|
||||
#define IXGBE_X540_MAX_TX_QUEUES 128
|
||||
#define IXGBE_X540_MAX_RX_QUEUES 128
|
||||
|
@ -110,12 +109,9 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
|
|||
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
|
||||
* access and verify no pending requests before reset
|
||||
*/
|
||||
status = ixgbe_disable_pcie_master(hw);
|
||||
if (status != 0) {
|
||||
status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
|
||||
hw_dbg(hw, "PCI-E Master disable polling has failed.\n");
|
||||
}
|
||||
ixgbe_disable_pcie_master(hw);
|
||||
|
||||
mac_reset_top:
|
||||
/*
|
||||
* Issue global reset to the MAC. Needs to be SW reset if link is up.
|
||||
* If link reset is used when link is up, it might reset the PHY when
|
||||
|
@ -148,6 +144,19 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
|
|||
hw_dbg(hw, "Reset polling failed to complete.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Double resets are required for recovery from certain error
|
||||
* conditions. Between resets, it is necessary to stall to allow time
|
||||
* for any pending HW events to complete. We use 1usec since that is
|
||||
* what is needed for ixgbe_disable_pcie_master(). The second reset
|
||||
* then clears out any effects of those events.
|
||||
*/
|
||||
if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
|
||||
hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
|
||||
udelay(1);
|
||||
goto mac_reset_top;
|
||||
}
|
||||
|
||||
/* Clear PF Reset Done bit so PF/VF Mail Ops can work */
|
||||
ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
|
||||
ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
|
||||
|
@ -191,7 +200,7 @@ static s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
|
|||
* clear the multicast table. Also reset num_rar_entries to 128,
|
||||
* since we modify this value when programming the SAN MAC address.
|
||||
*/
|
||||
hw->mac.num_rar_entries = 128;
|
||||
hw->mac.num_rar_entries = IXGBE_X540_MAX_TX_QUEUES;
|
||||
hw->mac.ops.init_rx_addrs(hw);
|
||||
|
||||
/* Store the permanent mac address */
|
||||
|
@ -278,7 +287,7 @@ static s32 ixgbe_read_eerd_X540(struct ixgbe_hw *hw, u16 offset, u16 *data)
|
|||
{
|
||||
s32 status;
|
||||
|
||||
if (ixgbe_acquire_swfw_sync_X540(hw, IXGBE_GSSR_EEP_SM) == 0)
|
||||
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) == 0)
|
||||
status = ixgbe_read_eerd_generic(hw, offset, data);
|
||||
else
|
||||
status = IXGBE_ERR_SWFW_SYNC;
|
||||
|
@ -311,7 +320,7 @@ static s32 ixgbe_write_eewr_X540(struct ixgbe_hw *hw, u16 offset, u16 data)
|
|||
(data << IXGBE_EEPROM_RW_REG_DATA) |
|
||||
IXGBE_EEPROM_RW_REG_START;
|
||||
|
||||
if (ixgbe_acquire_swfw_sync_X540(hw, IXGBE_GSSR_EEP_SM) == 0) {
|
||||
if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) == 0) {
|
||||
status = ixgbe_poll_eerd_eewr_done(hw, IXGBE_NVM_POLL_WRITE);
|
||||
if (status != 0) {
|
||||
hw_dbg(hw, "Eeprom write EEWR timed out\n");
|
||||
|
@ -676,7 +685,6 @@ static struct ixgbe_mac_operations mac_ops_X540 = {
|
|||
.set_vmdq = &ixgbe_set_vmdq_generic,
|
||||
.clear_vmdq = &ixgbe_clear_vmdq_generic,
|
||||
.init_rx_addrs = &ixgbe_init_rx_addrs_generic,
|
||||
.update_uc_addr_list = &ixgbe_update_uc_addr_list_generic,
|
||||
.update_mc_addr_list = &ixgbe_update_mc_addr_list_generic,
|
||||
.enable_mc = &ixgbe_enable_mc_generic,
|
||||
.disable_mc = &ixgbe_disable_mc_generic,
|
||||
|
@ -687,6 +695,8 @@ static struct ixgbe_mac_operations mac_ops_X540 = {
|
|||
.setup_sfp = NULL,
|
||||
.set_mac_anti_spoofing = &ixgbe_set_mac_anti_spoofing,
|
||||
.set_vlan_anti_spoofing = &ixgbe_set_vlan_anti_spoofing,
|
||||
.acquire_swfw_sync = &ixgbe_acquire_swfw_sync_X540,
|
||||
.release_swfw_sync = &ixgbe_release_swfw_sync_X540,
|
||||
};
|
||||
|
||||
static struct ixgbe_eeprom_operations eeprom_ops_X540 = {
|
||||
|
@ -702,7 +712,7 @@ static struct ixgbe_phy_operations phy_ops_X540 = {
|
|||
.identify = &ixgbe_identify_phy_generic,
|
||||
.identify_sfp = &ixgbe_identify_sfp_module_generic,
|
||||
.init = NULL,
|
||||
.reset = &ixgbe_reset_phy_generic,
|
||||
.reset = NULL,
|
||||
.read_reg = &ixgbe_read_phy_reg_generic,
|
||||
.write_reg = &ixgbe_write_phy_reg_generic,
|
||||
.setup_link = &ixgbe_setup_phy_link_generic,
|
||||
|
|
|
@ -178,8 +178,6 @@ static inline bool ixgbevf_check_tx_hang(struct ixgbevf_adapter *adapter,
|
|||
tx_ring->tx_buffer_info[eop].time_stamp &&
|
||||
time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ)) {
|
||||
/* detected Tx unit hang */
|
||||
union ixgbe_adv_tx_desc *tx_desc;
|
||||
tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop);
|
||||
printk(KERN_ERR "Detected Tx Unit Hang\n"
|
||||
" Tx Queue <%d>\n"
|
||||
" TDH, TDT <%x>, <%x>\n"
|
||||
|
@ -334,7 +332,6 @@ static void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector,
|
|||
struct ixgbevf_adapter *adapter = q_vector->adapter;
|
||||
bool is_vlan = (status & IXGBE_RXD_STAT_VP);
|
||||
u16 tag = le16_to_cpu(rx_desc->wb.upper.vlan);
|
||||
int ret;
|
||||
|
||||
if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) {
|
||||
if (adapter->vlgrp && is_vlan)
|
||||
|
@ -345,9 +342,9 @@ static void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector,
|
|||
napi_gro_receive(&q_vector->napi, skb);
|
||||
} else {
|
||||
if (adapter->vlgrp && is_vlan)
|
||||
ret = vlan_hwaccel_rx(skb, adapter->vlgrp, tag);
|
||||
vlan_hwaccel_rx(skb, adapter->vlgrp, tag);
|
||||
else
|
||||
ret = netif_rx(skb);
|
||||
netif_rx(skb);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3287,8 +3284,6 @@ static const struct net_device_ops ixgbe_netdev_ops = {
|
|||
|
||||
static void ixgbevf_assign_netdev_ops(struct net_device *dev)
|
||||
{
|
||||
struct ixgbevf_adapter *adapter;
|
||||
adapter = netdev_priv(dev);
|
||||
dev->netdev_ops = &ixgbe_netdev_ops;
|
||||
ixgbevf_set_ethtool_ops(dev);
|
||||
dev->watchdog_timeo = 5 * HZ;
|
||||
|
|
Loading…
Reference in a new issue