aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e/ich8lan.c
diff options
context:
space:
mode:
authorBruce Allan <bruce.w.allan@intel.com>2010-09-22 13:16:40 -0400
committerDavid S. Miller <davem@davemloft.net>2010-09-22 23:41:20 -0400
commita1ce647378c0262fe72757f989e961b2de6460a5 (patch)
treeafd3e62996a49b32509297ff0f38831e6336f1c7 /drivers/net/e1000e/ich8lan.c
parent831bd2e6a6c09588fdde453ecb858f050ac1b942 (diff)
e1000e: 82579 jumbo frame workaround causing CRC errors
The subject workaround was causing CRC errors due to writing the wrong register with updates of the RCTL register. It was also found that the workaround function which modifies the RCTL register was being called in the middle of a read-modify-write operation of the RCTL register, so the function call has been moved appropriately. Lastly, jumbo frames must not be allowed when CRC stripping is disabled by a module parameter because the workaround requires the CRC be stripped. Signed-off-by: Bruce Allan <bruce.w.allan@intel.com> Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/e1000e/ich8lan.c')
-rw-r--r--drivers/net/e1000e/ich8lan.c12
1 files changed, 1 insertions, 11 deletions
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c
index 89b1e1aea526..bb346ae3d9a0 100644
--- a/drivers/net/e1000e/ich8lan.c
+++ b/drivers/net/e1000e/ich8lan.c
@@ -1475,10 +1475,6 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
1475 goto out; 1475 goto out;
1476 1476
1477 /* Enable jumbo frame workaround in the PHY */ 1477 /* Enable jumbo frame workaround in the PHY */
1478 e1e_rphy(hw, PHY_REG(769, 20), &data);
1479 ret_val = e1e_wphy(hw, PHY_REG(769, 20), data & ~(1 << 14));
1480 if (ret_val)
1481 goto out;
1482 e1e_rphy(hw, PHY_REG(769, 23), &data); 1478 e1e_rphy(hw, PHY_REG(769, 23), &data);
1483 data &= ~(0x7F << 5); 1479 data &= ~(0x7F << 5);
1484 data |= (0x37 << 5); 1480 data |= (0x37 << 5);
@@ -1487,7 +1483,6 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
1487 goto out; 1483 goto out;
1488 e1e_rphy(hw, PHY_REG(769, 16), &data); 1484 e1e_rphy(hw, PHY_REG(769, 16), &data);
1489 data &= ~(1 << 13); 1485 data &= ~(1 << 13);
1490 data |= (1 << 12);
1491 ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); 1486 ret_val = e1e_wphy(hw, PHY_REG(769, 16), data);
1492 if (ret_val) 1487 if (ret_val)
1493 goto out; 1488 goto out;
@@ -1512,7 +1507,7 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
1512 1507
1513 mac_reg = er32(RCTL); 1508 mac_reg = er32(RCTL);
1514 mac_reg &= ~E1000_RCTL_SECRC; 1509 mac_reg &= ~E1000_RCTL_SECRC;
1515 ew32(FFLT_DBG, mac_reg); 1510 ew32(RCTL, mac_reg);
1516 1511
1517 ret_val = e1000e_read_kmrn_reg(hw, 1512 ret_val = e1000e_read_kmrn_reg(hw,
1518 E1000_KMRNCTRLSTA_CTRL_OFFSET, 1513 E1000_KMRNCTRLSTA_CTRL_OFFSET,
@@ -1538,17 +1533,12 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
1538 goto out; 1533 goto out;
1539 1534
1540 /* Write PHY register values back to h/w defaults */ 1535 /* Write PHY register values back to h/w defaults */
1541 e1e_rphy(hw, PHY_REG(769, 20), &data);
1542 ret_val = e1e_wphy(hw, PHY_REG(769, 20), data & ~(1 << 14));
1543 if (ret_val)
1544 goto out;
1545 e1e_rphy(hw, PHY_REG(769, 23), &data); 1536 e1e_rphy(hw, PHY_REG(769, 23), &data);
1546 data &= ~(0x7F << 5); 1537 data &= ~(0x7F << 5);
1547 ret_val = e1e_wphy(hw, PHY_REG(769, 23), data); 1538 ret_val = e1e_wphy(hw, PHY_REG(769, 23), data);
1548 if (ret_val) 1539 if (ret_val)
1549 goto out; 1540 goto out;
1550 e1e_rphy(hw, PHY_REG(769, 16), &data); 1541 e1e_rphy(hw, PHY_REG(769, 16), &data);
1551 data &= ~(1 << 12);
1552 data |= (1 << 13); 1542 data |= (1 << 13);
1553 ret_val = e1e_wphy(hw, PHY_REG(769, 16), data); 1543 ret_val = e1e_wphy(hw, PHY_REG(769, 16), data);
1554 if (ret_val) 1544 if (ret_val)