re
i was testing the diff on our shitz here and it works.
dual-port Intel PRO/1000 on pci-express and on-boards.
added a couple more checks where it seemed to make sense.
those ports having problems before seem to work now.
cu
--
paranoic mickey (my employers have changed but, the name has remained)
--- src/sys/dev/pci/if_em_hw.c Tue Oct 20 15:37:12 2009
+++ src/sys/dev/pci/if_em_hw.c Tue Jul 13 12:58:34 2010
@@ -499,20 +499,21 @@ em_set_mac_type(struct em_hw *hw)
}
switch (hw->mac_type) {
case em_ich8lan:
case em_ich9lan:
case em_ich10lan:
hw->swfwhw_semaphore_present = TRUE;
hw->asf_firmware_present = TRUE;
break;
case em_80003es2lan:
+ case em_82575:
hw->swfw_sync_present = TRUE;
/* FALLTHROUGH */
case em_82571:
case em_82572:
case em_82573:
case em_82574:
hw->eeprom_semaphore_present = TRUE;
/* FALLTHROUGH */
case em_82541:
case em_82547:
@@ -846,20 +847,21 @@ em_initialize_hardware_bits(struct em_hw *hw)
if (reg_tctl & E1000_TCTL_MULR)
reg_tarc1 &= ~0x10000000; /* Clear bit 28 if MULR is 1b
*/
else
reg_tarc1 |= 0x10000000; /* Set bit 28 if MULR is 0b */
E1000_WRITE_REG(hw, TARC1, reg_tarc1);
break;
case em_82573:
case em_82574:
+ case em_82575:
reg_ctrl_ext = E1000_READ_REG(hw, CTRL_EXT);
reg_ctrl = E1000_READ_REG(hw, CTRL);
reg_ctrl_ext &= ~0x00800000; /* Clear bit 23 */
reg_ctrl_ext |= 0x00400000; /* Set bit 22 */
reg_ctrl &= ~0x20000000; /* Clear bit 29 */
E1000_WRITE_REG(hw, CTRL_EXT, reg_ctrl_ext);
E1000_WRITE_REG(hw, CTRL, reg_ctrl);
break;
@@ -3593,21 +3595,21 @@ em_swfw_sync_release(struct em_hw *hw, uint16_t mask)
int32_t
em_read_phy_reg(struct em_hw *hw,
uint32_t reg_addr,
uint16_t *phy_data)
{
uint32_t ret_val;
uint16_t swfw;
DEBUGFUNC("em_read_phy_reg");
- if ((hw->mac_type == em_80003es2lan) &&
+ if ((hw->mac_type == em_80003es2lan || hw->mac_type == em_82575) &&
(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
swfw = E1000_SWFW_PHY1_SM;
} else {
swfw = E1000_SWFW_PHY0_SM;
}
if (em_swfw_sync_acquire(hw, swfw))
return -E1000_ERR_SWFW_SYNC;
if ((hw->phy_type == em_phy_igp ||
hw->phy_type == em_phy_igp_3 ||
@@ -3738,21 +3740,21 @@ em_read_phy_reg_ex(struct em_hw *hw, uint32_t reg_addr
******************************************************************************/
int32_t
em_write_phy_reg(struct em_hw *hw, uint32_t reg_addr,
uint16_t phy_data)
{
uint32_t ret_val;
uint16_t swfw;
DEBUGFUNC("em_write_phy_reg");
- if ((hw->mac_type == em_80003es2lan) &&
+ if ((hw->mac_type == em_80003es2lan || hw->mac_type == em_82575) &&
(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
swfw = E1000_SWFW_PHY1_SM;
} else {
swfw = E1000_SWFW_PHY0_SM;
}
if (em_swfw_sync_acquire(hw, swfw))
return -E1000_ERR_SWFW_SYNC;
if ((hw->phy_type == em_phy_igp ||
hw->phy_type == em_phy_igp_3 ||
@@ -3864,21 +3866,21 @@ em_write_phy_reg_ex(struct em_hw *hw, uint32_t reg_add
STATIC int32_t
em_read_kmrn_reg(struct em_hw *hw,
uint32_t reg_addr,
uint16_t *data)
{
uint32_t reg_val;
uint16_t swfw;
DEBUGFUNC("em_read_kmrn_reg");
- if ((hw->mac_type == em_80003es2lan) &&
+ if ((hw->mac_type == em_80003es2lan || hw->mac_type == em_82575) &&
(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
swfw = E1000_SWFW_PHY1_SM;
} else {
swfw = E1000_SWFW_PHY0_SM;
}
if (em_swfw_sync_acquire(hw, swfw))
return -E1000_ERR_SWFW_SYNC;
/* Write register address */
reg_val = ((reg_addr << E1000_KUMCTRLSTA_OFFSET_SHIFT) &
@@ -3939,21 +3941,21 @@ em_phy_hw_reset(struct em_hw *hw)
/* In the case of the phy reset being blocked, it's not an error, we
* simply return success without performing the reset. */
ret_val = em_check_phy_reset_block(hw);
if (ret_val)
return E1000_SUCCESS;
DEBUGOUT("Resetting Phy...\n");
if (hw->mac_type > em_82543) {
- if ((hw->mac_type == em_80003es2lan) &&
+ if ((hw->mac_type == em_80003es2lan || hw->mac_type == em_82575) &&
(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
swfw = E1000_SWFW_PHY1_SM;
} else {
swfw = E1000_SWFW_PHY0_SM;
}
if (em_swfw_sync_acquire(hw, swfw)) {
DEBUGOUT("Unable to acquire swfw sync\n");
return -E1000_ERR_SWFW_SYNC;
}
/* Read the device control register and assert the E1000_CTRL_PHY_RST
@@ -5944,20 +5946,21 @@ em_rar_set(struct em_hw *hw,
* while we work. Then, we clear the Address Valid AV bit for all MAC
* addresses and undo the re-direction to manageability.
* Now, frames are coming in again, but the MAC won't accept them, so
* far so good. We now proceed to initialize RSS (if necessary) and
* configure the Rx unit. Last, we re-enable the AV bits and continue
* on our merry way.
*/
switch (hw->mac_type) {
case em_82571:
case em_82572:
+ case em_82575:
case em_80003es2lan:
if (hw->leave_av_bit_off == TRUE)
break;
default:
/* Indicate to hardware the Address is Valid. */
rar_high |= E1000_RAH_AV;
break;
}
E1000_WRITE_REG_ARRAY(hw, RA, (index << 1), rar_low);