[PATCH] e1000: Fix collision distance
Fixed the collision distance for 82543 controllers and newer. Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: John Ronciak <john.ronciak@intel.com> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
This commit is contained in:
parent
47028635d1
commit
0fadb0597d
@ -1933,14 +1933,19 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw)
|
||||
void
|
||||
e1000_config_collision_dist(struct e1000_hw *hw)
|
||||
{
|
||||
uint32_t tctl;
|
||||
uint32_t tctl, coll_dist;
|
||||
|
||||
DEBUGFUNC("e1000_config_collision_dist");
|
||||
|
||||
if (hw->mac_type < e1000_82543)
|
||||
coll_dist = E1000_COLLISION_DISTANCE_82542;
|
||||
else
|
||||
coll_dist = E1000_COLLISION_DISTANCE;
|
||||
|
||||
tctl = E1000_READ_REG(hw, TCTL);
|
||||
|
||||
tctl &= ~E1000_TCTL_COLD;
|
||||
tctl |= E1000_COLLISION_DISTANCE << E1000_COLD_SHIFT;
|
||||
tctl |= coll_dist << E1000_COLD_SHIFT;
|
||||
|
||||
E1000_WRITE_REG(hw, TCTL, tctl);
|
||||
E1000_WRITE_FLUSH(hw);
|
||||
|
@ -2078,7 +2078,10 @@ struct e1000_host_command_info {
|
||||
/* Collision related configuration parameters */
|
||||
#define E1000_COLLISION_THRESHOLD 15
|
||||
#define E1000_CT_SHIFT 4
|
||||
#define E1000_COLLISION_DISTANCE 64
|
||||
/* Collision distance is a 0-based value that applies to
|
||||
* half-duplex-capable hardware only. */
|
||||
#define E1000_COLLISION_DISTANCE 63
|
||||
#define E1000_COLLISION_DISTANCE_82542 64
|
||||
#define E1000_FDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE
|
||||
#define E1000_HDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE
|
||||
#define E1000_COLD_SHIFT 12
|
||||
|
@ -1342,6 +1342,7 @@ e1000_configure_tx(struct e1000_adapter *adapter)
|
||||
uint64_t tdba;
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
uint32_t tdlen, tctl, tipg, tarc;
|
||||
uint32_t ipgr1, ipgr2;
|
||||
|
||||
/* Setup the HW Tx Head and Tail descriptor pointers */
|
||||
|
||||
@ -1375,22 +1376,26 @@ e1000_configure_tx(struct e1000_adapter *adapter)
|
||||
|
||||
/* Set the default values for the Tx Inter Packet Gap timer */
|
||||
|
||||
if (hw->media_type == e1000_media_type_fiber ||
|
||||
hw->media_type == e1000_media_type_internal_serdes)
|
||||
tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
|
||||
else
|
||||
tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
|
||||
|
||||
switch (hw->mac_type) {
|
||||
case e1000_82542_rev2_0:
|
||||
case e1000_82542_rev2_1:
|
||||
tipg = DEFAULT_82542_TIPG_IPGT;
|
||||
tipg |= DEFAULT_82542_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
|
||||
tipg |= DEFAULT_82542_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
|
||||
ipgr1 = DEFAULT_82542_TIPG_IPGR1;
|
||||
ipgr2 = DEFAULT_82542_TIPG_IPGR2;
|
||||
break;
|
||||
default:
|
||||
if (hw->media_type == e1000_media_type_fiber ||
|
||||
hw->media_type == e1000_media_type_internal_serdes)
|
||||
tipg = DEFAULT_82543_TIPG_IPGT_FIBER;
|
||||
else
|
||||
tipg = DEFAULT_82543_TIPG_IPGT_COPPER;
|
||||
tipg |= DEFAULT_82543_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT;
|
||||
tipg |= DEFAULT_82543_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT;
|
||||
ipgr1 = DEFAULT_82543_TIPG_IPGR1;
|
||||
ipgr2 = DEFAULT_82543_TIPG_IPGR2;
|
||||
break;
|
||||
}
|
||||
tipg |= ipgr1 << E1000_TIPG_IPGR1_SHIFT;
|
||||
tipg |= ipgr2 << E1000_TIPG_IPGR2_SHIFT;
|
||||
E1000_WRITE_REG(hw, TIPG, tipg);
|
||||
|
||||
/* Set the Tx Interrupt Delay register */
|
||||
@ -1600,7 +1605,10 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
|
||||
E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF |
|
||||
(adapter->hw.mc_filter_type << E1000_RCTL_MO_SHIFT);
|
||||
|
||||
if(adapter->hw.tbi_compatibility_on == 1)
|
||||
if (adapter->hw.mac_type > e1000_82543)
|
||||
rctl |= E1000_RCTL_SECRC;
|
||||
|
||||
if (adapter->hw.tbi_compatibility_on == 1)
|
||||
rctl |= E1000_RCTL_SBP;
|
||||
else
|
||||
rctl &= ~E1000_RCTL_SBP;
|
||||
|
Loading…
Reference in New Issue
Block a user