svn commit: r205869 - in head/sys: conf dev/e1000 modules/em

Jack F Vogel jfv at FreeBSD.org
Mon Mar 29 23:36:35 UTC 2010


Author: jfv
Date: Mon Mar 29 23:36:34 2010
New Revision: 205869
URL: http://svn.freebsd.org/changeset/base/205869

Log:
  Update to igb and em:
  
  em revision 7.0.0:
  	- Using driver devclass, seperate legacy (pre-pcie) code
  	  into a seperate source file. This will at least help
  	  protect against regression issues. It compiles along
  	  with em, and is transparent to end use, devices in each
  	  appear to be 'emX'. When using em in a modular form this
  	  also allows the legacy stuff to be defined out.
  	- Add tx and rx rings as in igb, in the 82574 this becomes
  	  actual multiqueue for the first time (2 queues) while in
  	  other PCIE adapters its just make code cleaner.
  	- Add RX mbuf handling logic that matches igb, this will
  	  eliminate packet drops due to temporary mbuf shortage.
  
  igb revision 1.9.3:
  	- Following the ixgbe code, use a new approach in what
  	  was called 'get_buf', the routine now has been made
  	  independent of rxeof, it now does the update to the
  	  engine TDT register, this design allows temporary
  	  mbuf resources to become non-critical, not requiring
  	  a packet to be discarded, instead it just returns and
  	  does not increment the tail pointer.
  	- With the above change it was also unnecessary to keep
  	  'spare' maps around, since we do not have the discard
  	  issue.
  	- Performance tweaks and improvements to the code also.
  
  MFC in a week

Added:
  head/sys/dev/e1000/if_lem.c   (contents, props changed)
  head/sys/dev/e1000/if_lem.h   (contents, props changed)
Modified:
  head/sys/conf/files
  head/sys/dev/e1000/e1000_80003es2lan.c
  head/sys/dev/e1000/e1000_82571.c
  head/sys/dev/e1000/e1000_82575.c
  head/sys/dev/e1000/e1000_82575.h
  head/sys/dev/e1000/e1000_defines.h
  head/sys/dev/e1000/e1000_hw.h
  head/sys/dev/e1000/e1000_ich8lan.c
  head/sys/dev/e1000/e1000_ich8lan.h
  head/sys/dev/e1000/e1000_mac.c
  head/sys/dev/e1000/e1000_manage.c
  head/sys/dev/e1000/e1000_phy.c
  head/sys/dev/e1000/e1000_regs.h
  head/sys/dev/e1000/if_em.c
  head/sys/dev/e1000/if_em.h
  head/sys/dev/e1000/if_igb.c
  head/sys/dev/e1000/if_igb.h
  head/sys/modules/em/Makefile

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/conf/files	Mon Mar 29 23:36:34 2010	(r205869)
@@ -912,6 +912,8 @@ dev/eisa/eisa_if.m		standard
 dev/eisa/eisaconf.c		optional eisa
 dev/e1000/if_em.c		optional em inet \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
+dev/e1000/if_lem.c		optional em inet \
+	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/if_igb.c		optional igb inet \
 	compile-with "${NORMAL_C} -I$S/dev/e1000"
 dev/e1000/e1000_80003es2lan.c	optional em | igb \

Modified: head/sys/dev/e1000/e1000_80003es2lan.c
==============================================================================
--- head/sys/dev/e1000/e1000_80003es2lan.c	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_80003es2lan.c	Mon Mar 29 23:36:34 2010	(r205869)
@@ -231,7 +231,9 @@ static s32 e1000_init_mac_params_80003es
 	mac->rar_entry_count = E1000_RAR_ENTRIES;
 	/* Set if part includes ASF firmware */
 	mac->asf_firmware_present = TRUE;
-	/* Set if manageability features are enabled. */
+	/* FWSM register */
+	mac->has_fwsm = TRUE;
+	/* ARC supported; valid only if manageability features are enabled. */
 	mac->arc_subsystem_valid =
 	        (E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK)
 	                ? TRUE : FALSE;

Modified: head/sys/dev/e1000/e1000_82571.c
==============================================================================
--- head/sys/dev/e1000/e1000_82571.c	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_82571.c	Mon Mar 29 23:36:34 2010	(r205869)
@@ -313,10 +313,6 @@ static s32 e1000_init_mac_params_82571(s
 	mac->rar_entry_count = E1000_RAR_ENTRIES;
 	/* Set if part includes ASF firmware */
 	mac->asf_firmware_present = TRUE;
-	/* Set if manageability features are enabled. */
-	mac->arc_subsystem_valid =
-	        (E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK)
-	                ? TRUE : FALSE;
 	/* Adaptive IFS supported */
 	mac->adaptive_ifs = TRUE;
 
@@ -357,6 +353,16 @@ static s32 e1000_init_mac_params_82571(s
 		mac->ops.set_lan_id = e1000_set_lan_id_single_port;
 		mac->ops.check_mng_mode = e1000_check_mng_mode_generic;
 		mac->ops.led_on = e1000_led_on_generic;
+
+		/* FWSM register */
+		mac->has_fwsm = TRUE;
+		/*
+		 * ARC supported; valid only if manageability features are
+		 * enabled.
+		 */
+		mac->arc_subsystem_valid =
+			(E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK)
+			? TRUE : FALSE;
 		break;
 	case e1000_82574:
 	case e1000_82583:
@@ -367,6 +373,9 @@ static s32 e1000_init_mac_params_82571(s
 	default:
 		mac->ops.check_mng_mode = e1000_check_mng_mode_generic;
 		mac->ops.led_on = e1000_led_on_generic;
+
+		/* FWSM register */
+		mac->has_fwsm = TRUE;
 		break;
 	}
 
@@ -1076,9 +1085,10 @@ static s32 e1000_init_hw_82571(struct e1
 	/* ...for both queues. */
 	switch (mac->type) {
 	case e1000_82573:
+		e1000_enable_tx_pkt_filtering_generic(hw);
+		/* fall through */
 	case e1000_82574:
 	case e1000_82583:
-		e1000_enable_tx_pkt_filtering_generic(hw);
 		reg_data = E1000_READ_REG(hw, E1000_GCR);
 		reg_data |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX;
 		E1000_WRITE_REG(hw, E1000_GCR, reg_data);
@@ -1364,7 +1374,7 @@ static s32 e1000_setup_link_82571(struct
 static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw)
 {
 	u32 ctrl;
-	s32  ret_val;
+	s32 ret_val;
 
 	DEBUGFUNC("e1000_setup_copper_link_82571");
 

Modified: head/sys/dev/e1000/e1000_82575.c
==============================================================================
--- head/sys/dev/e1000/e1000_82575.c	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_82575.c	Mon Mar 29 23:36:34 2010	(r205869)
@@ -289,7 +289,9 @@ static s32 e1000_init_mac_params_82575(s
 		mac->rar_entry_count = E1000_RAR_ENTRIES_82580;
 	/* Set if part includes ASF firmware */
 	mac->asf_firmware_present = TRUE;
-	/* Set if manageability features are enabled. */
+	/* FWSM register */
+	mac->has_fwsm = TRUE;
+	/* ARC supported; valid only if manageability features are enabled. */
 	mac->arc_subsystem_valid =
 	        (E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK)
 	                ? TRUE : FALSE;
@@ -1435,13 +1437,12 @@ static void e1000_config_collision_dist_
 static void e1000_power_down_phy_copper_82575(struct e1000_hw *hw)
 {
 	struct e1000_phy_info *phy = &hw->phy;
-	struct e1000_mac_info *mac = &hw->mac;
 
 	if (!(phy->ops.check_reset_block))
 		return;
 
 	/* If the management interface is not enabled, then power down */
-	if (!(mac->ops.check_mng_mode(hw) || phy->ops.check_reset_block(hw)))
+	if (!(e1000_enable_mng_pass_thru(hw) || phy->ops.check_reset_block(hw)))
 		e1000_power_down_phy_copper(hw);
 
 	return;
@@ -1646,14 +1647,23 @@ out:
  **/
 void e1000_vmdq_set_loopback_pf(struct e1000_hw *hw, bool enable)
 {
-	u32 dtxswc = E1000_READ_REG(hw, E1000_DTXSWC);
+	u32 dtxswc;
+
+	switch (hw->mac.type) {
+	case e1000_82576:
+		dtxswc = E1000_READ_REG(hw, E1000_DTXSWC);
+		if (enable)
+			dtxswc |= E1000_DTXSWC_VMDQ_LOOPBACK_EN;
+		else
+			dtxswc &= ~E1000_DTXSWC_VMDQ_LOOPBACK_EN;
+		E1000_WRITE_REG(hw, E1000_DTXSWC, dtxswc);
+		break;
+	default:
+		/* Currently no other hardware supports loopback */
+		break;
+	}
 
-	if (enable)
-		dtxswc |= E1000_DTXSWC_VMDQ_LOOPBACK_EN;
-	else
-		dtxswc &= ~E1000_DTXSWC_VMDQ_LOOPBACK_EN;
 
-	E1000_WRITE_REG(hw, E1000_DTXSWC, dtxswc);
 }
 
 /**

Modified: head/sys/dev/e1000/e1000_82575.h
==============================================================================
--- head/sys/dev/e1000/e1000_82575.h	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_82575.h	Mon Mar 29 23:36:34 2010	(r205869)
@@ -49,8 +49,8 @@
  * For 82576, there are an additional set of RARs that begin at an offset
  * separate from the first set of RARs.
  */
-#define E1000_RAR_ENTRIES_82575   16
-#define E1000_RAR_ENTRIES_82576   24
+#define E1000_RAR_ENTRIES_82575        16
+#define E1000_RAR_ENTRIES_82576        24
 #define E1000_RAR_ENTRIES_82580        24
 #define E1000_SW_SYNCH_MB              0x00000100
 #define E1000_STAT_DEV_RST_SET         0x00100000
@@ -425,6 +425,7 @@ struct e1000_adv_tx_context_desc {
 #define E1000_VMOLR_STRVLAN    0x40000000 /* Vlan stripping enable */
 #define E1000_VMOLR_STRCRC     0x80000000 /* CRC stripping enable */
 
+
 #define E1000_VLVF_ARRAY_SIZE     32
 #define E1000_VLVF_VLANID_MASK    0x00000FFF
 #define E1000_VLVF_POOLSEL_SHIFT  12

Modified: head/sys/dev/e1000/e1000_defines.h
==============================================================================
--- head/sys/dev/e1000/e1000_defines.h	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_defines.h	Mon Mar 29 23:36:34 2010	(r205869)
@@ -314,6 +314,11 @@
 #define E1000_MANC_SMB_DATA_OUT_SHIFT  28 /* SMBus Data Out Shift */
 #define E1000_MANC_SMB_CLK_OUT_SHIFT   29 /* SMBus Clock Out Shift */
 
+#define E1000_MANC2H_PORT_623    0x00000020 /* Port 0x26f */
+#define E1000_MANC2H_PORT_664    0x00000040 /* Port 0x298 */
+#define E1000_MDEF_PORT_623      0x00000800 /* Port 0x26f */
+#define E1000_MDEF_PORT_664      0x00000400 /* Port 0x298 */
+
 /* Receive Control */
 #define E1000_RCTL_RST            0x00000001    /* Software reset */
 #define E1000_RCTL_EN             0x00000002    /* enable */
@@ -418,6 +423,8 @@
                                                * PHYRST_N pin */
 #define E1000_CTRL_EXT_LINK_EN 0x00010000 /* enable link status from external
                                            * LINK_0 and LINK_1 pins */
+#define E1000_CTRL_LANPHYPC_OVERRIDE 0x00010000 /* SW control of LANPHYPC */
+#define E1000_CTRL_LANPHYPC_VALUE    0x00020000 /* SW value of LANPHYPC */
 #define E1000_CTRL_SWDPIN0  0x00040000  /* SWDPIN 0 value */
 #define E1000_CTRL_SWDPIN1  0x00080000  /* SWDPIN 1 value */
 #define E1000_CTRL_SWDPIN2  0x00100000  /* SWDPIN 2 value */
@@ -953,6 +960,8 @@
 #define E1000_EICS_OTHER        E1000_EICR_OTHER   /* Interrupt Cause Active */
 
 #define E1000_EITR_ITR_INT_MASK 0x0000FFFF
+/* E1000_EITR_CNT_IGNR is only for 82576 and newer */
+#define E1000_EITR_CNT_IGNR	0x80000000 /* Don't reset counters on write */
 
 /* Transmit Descriptor Control */
 #define E1000_TXDCTL_PTHRESH 0x0000003F /* TXDCTL Prefetch Threshold */
@@ -1380,6 +1389,9 @@
 #define PCI_HEADER_TYPE_MULTIFUNC    0x80
 #define PCIE_LINK_WIDTH_MASK         0x3F0
 #define PCIE_LINK_WIDTH_SHIFT        4
+#define PCIE_LINK_SPEED_MASK         0x0F
+#define PCIE_LINK_SPEED_2500         0x01
+#define PCIE_LINK_SPEED_5000         0x02
 #define PCIE_DEVICE_CONTROL2_16ms    0x0005
 
 #ifndef ETH_ADDR_LEN
@@ -1410,7 +1422,7 @@
 #define BME1000_E_PHY_ID_R2  0x01410CB1
 #define I82577_E_PHY_ID 0x01540050
 #define I82578_E_PHY_ID 0x004DD040
-#define I82580_I_PHY_ID 0x015403A0
+#define I82580_I_PHY_ID      0x015403A0
 #define IGP04E1000_E_PHY_ID  0x02A80391
 #define M88_VENDOR           0x0141
 
@@ -1507,6 +1519,7 @@
 #define M88E1000_EPSCR_TX_CLK_25      0x0070 /* 25  MHz TX_CLK */
 #define M88E1000_EPSCR_TX_CLK_0       0x0000 /* NO  TX_CLK */
 
+
 /* M88EC018 Rev 2 specific DownShift settings */
 #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK  0x0E00
 #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X    0x0000

Modified: head/sys/dev/e1000/e1000_hw.h
==============================================================================
--- head/sys/dev/e1000/e1000_hw.h	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_hw.h	Mon Mar 29 23:36:34 2010	(r205869)
@@ -122,6 +122,7 @@ struct e1000_hw;
 #define E1000_DEV_ID_ICH10_R_BM_V             0x10CE
 #define E1000_DEV_ID_ICH10_D_BM_LM            0x10DE
 #define E1000_DEV_ID_ICH10_D_BM_LF            0x10DF
+
 #define E1000_DEV_ID_PCH_M_HV_LM              0x10EA
 #define E1000_DEV_ID_PCH_M_HV_LC              0x10EB
 #define E1000_DEV_ID_PCH_D_HV_DM              0x10EF
@@ -682,6 +683,7 @@ struct e1000_mac_info {
 	u8  forced_speed_duplex;
 
 	bool adaptive_ifs;
+	bool has_fwsm;
 	bool arc_subsystem_valid;
 	bool asf_firmware_present;
 	bool autoneg;

Modified: head/sys/dev/e1000/e1000_ich8lan.c
==============================================================================
--- head/sys/dev/e1000/e1000_ich8lan.c	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_ich8lan.c	Mon Mar 29 23:36:34 2010	(r205869)
@@ -177,6 +177,7 @@ union ich8_hws_flash_regacc {
 static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
 {
 	struct e1000_phy_info *phy = &hw->phy;
+	u32 ctrl;
 	s32 ret_val = E1000_SUCCESS;
 
 	DEBUGFUNC("e1000_init_phy_params_pchlan");
@@ -199,6 +200,35 @@ static s32 e1000_init_phy_params_pchlan(
 	phy->ops.power_down           = e1000_power_down_phy_copper_ich8lan;
 	phy->autoneg_mask             = AUTONEG_ADVERTISE_SPEED_DEFAULT;
 
+	if ((hw->mac.type == e1000_pchlan) &&
+	    (!(E1000_READ_REG(hw, E1000_FWSM) & E1000_ICH_FWSM_FW_VALID))) {
+
+		/*
+		 * The MAC-PHY interconnect may still be in SMBus mode
+		 * after Sx->S0.  Toggle the LANPHYPC Value bit to force
+		 * the interconnect to PCIe mode, but only if there is no
+		 * firmware present otherwise firmware will have done it.
+		 */
+		ctrl = E1000_READ_REG(hw, E1000_CTRL);
+		ctrl |=  E1000_CTRL_LANPHYPC_OVERRIDE;
+		ctrl &= ~E1000_CTRL_LANPHYPC_VALUE;
+		E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
+		usec_delay(10);
+		ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE;
+		E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
+		msec_delay(50);
+	}
+
+	/*
+	 * Reset the PHY before any acccess to it.  Doing so, ensures that
+	 * the PHY is in a known good state before we read/write PHY registers.
+	 * The generic reset is sufficient here, because we haven't determined
+	 * the PHY type yet.
+	 */
+	ret_val = e1000_phy_hw_reset_generic(hw);
+	if (ret_val)
+		goto out;
+
 	phy->id = e1000_phy_unknown;
 	ret_val = e1000_get_phy_id(hw);
 	if (ret_val)
@@ -225,6 +255,7 @@ static s32 e1000_init_phy_params_pchlan(
 		phy->ops.get_cable_length = e1000_get_cable_length_82577;
 		phy->ops.get_info = e1000_get_phy_info_82577;
 		phy->ops.commit = e1000_phy_sw_reset_generic;
+		break;
 	case e1000_phy_82578:
 		phy->ops.check_polarity = e1000_check_polarity_m88;
 		phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88;
@@ -431,8 +462,10 @@ static s32 e1000_init_mac_params_ich8lan
 		mac->rar_entry_count--;
 	/* Set if part includes ASF firmware */
 	mac->asf_firmware_present = TRUE;
-	/* Set if manageability features are enabled. */
-	mac->arc_subsystem_valid = TRUE;
+	/* FWSM register */
+	mac->has_fwsm = TRUE;
+	/* ARC subsystem not supported */
+	mac->arc_subsystem_valid = FALSE;
 	/* Adaptive IFS supported */
 	mac->adaptive_ifs = TRUE;
 
@@ -764,6 +797,9 @@ static s32 e1000_check_reset_block_ich8l
 
 	DEBUGFUNC("e1000_check_reset_block_ich8lan");
 
+	if (hw->phy.reset_disable)
+		return E1000_BLK_PHY_RESET;
+
 	fwsm = E1000_READ_REG(hw, E1000_FWSM);
 
 	return (fwsm & E1000_ICH_FWSM_RSPCIPHY) ? E1000_SUCCESS
@@ -2684,6 +2720,7 @@ static s32 e1000_reset_hw_ich8lan(struct
 			DEBUGOUT("Auto Read Done did not complete\n");
 		}
 	}
+	/* Dummy read to clear the phy wakeup bit after lcd reset */
 	if (hw->mac.type == e1000_pchlan)
 		hw->phy.ops.read_reg(hw, BM_WUC, &reg);
 
@@ -2857,6 +2894,14 @@ static void e1000_initialize_hw_bits_ich
 		E1000_WRITE_REG(hw, E1000_STATUS, reg);
 	}
 
+	/*
+	 * work-around descriptor data corruption issue during nfs v2 udp
+	 * traffic, just disable the nfs filtering capability
+	 */
+	reg = E1000_READ_REG(hw, E1000_RFCTL);
+	reg |= (E1000_RFCTL_NFSW_DIS | E1000_RFCTL_NFSR_DIS);
+	E1000_WRITE_REG(hw, E1000_RFCTL, reg);
+
 	return;
 }
 

Modified: head/sys/dev/e1000/e1000_ich8lan.h
==============================================================================
--- head/sys/dev/e1000/e1000_ich8lan.h	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_ich8lan.h	Mon Mar 29 23:36:34 2010	(r205869)
@@ -167,6 +167,9 @@
 #define HV_KMRN_MODE_CTRL	PHY_REG(769, 16)
 #define HV_KMRN_MDIO_SLOW	0x0400
 
+/* PHY Power Management Control */
+#define HV_PM_CTRL		PHY_REG(770, 17)
+
 #define SW_FLAG_TIMEOUT    1000 /* SW Semaphore flag timeout in milliseconds */
 
 /*
@@ -192,7 +195,6 @@
 #define E1000_RXDEXT_LINKSEC_ERROR_REPLAY_ERROR 0x40000000
 #define E1000_RXDEXT_LINKSEC_ERROR_BAD_SIG      0x60000000
 
-
 void e1000_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw,
                                                  bool state);
 void e1000_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw);

Modified: head/sys/dev/e1000/e1000_mac.c
==============================================================================
--- head/sys/dev/e1000/e1000_mac.c	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_mac.c	Mon Mar 29 23:36:34 2010	(r205869)
@@ -225,17 +225,30 @@ s32 e1000_get_bus_info_pcie_generic(stru
 	DEBUGFUNC("e1000_get_bus_info_pcie_generic");
 
 	bus->type = e1000_bus_type_pci_express;
-	bus->speed = e1000_bus_speed_2500;
 
 	ret_val = e1000_read_pcie_cap_reg(hw,
 	                                  PCIE_LINK_STATUS,
 	                                  &pcie_link_status);
-	if (ret_val)
+	if (ret_val) {
 		bus->width = e1000_bus_width_unknown;
-	else
+		bus->speed = e1000_bus_speed_unknown;
+	} else {
+		switch (pcie_link_status & PCIE_LINK_SPEED_MASK) {
+		case PCIE_LINK_SPEED_2500:
+			bus->speed = e1000_bus_speed_2500;
+			break;
+		case PCIE_LINK_SPEED_5000:
+			bus->speed = e1000_bus_speed_5000;
+			break;
+		default:
+			bus->speed = e1000_bus_speed_unknown;
+			break;
+		}
+		
 		bus->width = (enum e1000_bus_width)((pcie_link_status &
 		                                PCIE_LINK_WIDTH_MASK) >>
 		                               PCIE_LINK_WIDTH_SHIFT);
+	}
 
 	mac->ops.set_lan_id(hw);
 

Modified: head/sys/dev/e1000/e1000_manage.c
==============================================================================
--- head/sys/dev/e1000/e1000_manage.c	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_manage.c	Mon Mar 29 23:36:34 2010	(r205869)
@@ -78,6 +78,12 @@ s32 e1000_mng_enable_host_if_generic(str
 
 	DEBUGFUNC("e1000_mng_enable_host_if_generic");
 
+	if (!(hw->mac.arc_subsystem_valid)) {
+		DEBUGOUT("ARC subsystem not valid.\n");
+		ret_val = -E1000_ERR_HOST_INTERFACE_COMMAND;
+		goto out;
+	}
+
 	/* Check that the host interface is enabled. */
 	hicr = E1000_READ_REG(hw, E1000_HICR);
 	if ((hicr & E1000_HICR_EN) == 0) {
@@ -365,7 +371,7 @@ bool e1000_enable_mng_pass_thru(struct e
 	if (!(manc & E1000_MANC_RCV_TCO_EN))
 		goto out;
 
-	if (hw->mac.arc_subsystem_valid) {
+	if (hw->mac.has_fwsm) {
 		fwsm = E1000_READ_REG(hw, E1000_FWSM);
 		factps = E1000_READ_REG(hw, E1000_FACTPS);
 
@@ -375,12 +381,23 @@ bool e1000_enable_mng_pass_thru(struct e
 			ret_val = TRUE;
 			goto out;
 		}
-	} else {
-		if ((manc & E1000_MANC_SMBUS_EN) &&
-		    !(manc & E1000_MANC_ASF_EN)) {
+	} else if ((hw->mac.type == e1000_82574) ||
+		   (hw->mac.type == e1000_82583)) {
+		u16 data;
+
+		factps = E1000_READ_REG(hw, E1000_FACTPS);
+		e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &data);
+
+		if (!(factps & E1000_FACTPS_MNGCG) &&
+		    ((data & E1000_NVM_INIT_CTRL2_MNGM) ==
+		     (e1000_mng_mode_pt << 13))) {
 			ret_val = TRUE;
 			goto out;
 		}
+	} else if ((manc & E1000_MANC_SMBUS_EN) &&
+		    !(manc & E1000_MANC_ASF_EN)) {
+			ret_val = TRUE;
+			goto out;
 	}
 
 out:

Modified: head/sys/dev/e1000/e1000_phy.c
==============================================================================
--- head/sys/dev/e1000/e1000_phy.c	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_phy.c	Mon Mar 29 23:36:34 2010	(r205869)
@@ -3402,9 +3402,7 @@ s32 e1000_check_polarity_82577(struct e1
  *  e1000_phy_force_speed_duplex_82577 - Force speed/duplex for I82577 PHY
  *  @hw: pointer to the HW structure
  *
- *  Calls the PHY setup function to force speed and duplex.  Clears the
- *  auto-crossover to force MDI manually.  Waits for link and returns
- *  successful if link up is successful, else -E1000_ERR_PHY (-2).
+ *  Calls the PHY setup function to force speed and duplex.
  **/
 s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw)
 {
@@ -3425,23 +3423,6 @@ s32 e1000_phy_force_speed_duplex_82577(s
 	if (ret_val)
 		goto out;
 
-	/*
-	 * Clear Auto-Crossover to force MDI manually.  82577 requires MDI
-	 * forced whenever speed and duplex are forced.
-	 */
-	ret_val = phy->ops.read_reg(hw, I82577_PHY_CTRL_2, &phy_data);
-	if (ret_val)
-		goto out;
-
-	phy_data &= ~I82577_PHY_CTRL2_AUTO_MDIX;
-	phy_data &= ~I82577_PHY_CTRL2_FORCE_MDI_MDIX;
-
-	ret_val = phy->ops.write_reg(hw, I82577_PHY_CTRL_2, phy_data);
-	if (ret_val)
-		goto out;
-
-	DEBUGOUT1("I82577_PHY_CTRL_2: %X\n", phy_data);
-
 	usec_delay(1);
 
 	if (phy->autoneg_wait_to_complete) {

Modified: head/sys/dev/e1000/e1000_regs.h
==============================================================================
--- head/sys/dev/e1000/e1000_regs.h	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/e1000_regs.h	Mon Mar 29 23:36:34 2010	(r205869)
@@ -65,7 +65,7 @@
 #define E1000_IAM      0x000E0  /* Interrupt Acknowledge Auto Mask */
 #define E1000_IVAR     0x000E4  /* Interrupt Vector Allocation Register - RW */
 #define E1000_SVCR     0x000F0
-#define E1000_SVT       0x000F4
+#define E1000_SVT      0x000F4
 #define E1000_RCTL     0x00100  /* Rx Control - RW */
 #define E1000_FCTTV    0x00170  /* Flow Control Transmit Timer Value - RW */
 #define E1000_TXCW     0x00178  /* Tx Configuration Word - RW */
@@ -282,6 +282,17 @@
 #define E1000_ICRXOC   0x04124  /* Interrupt Cause Receiver Overrun Count */
 #define E1000_CRC_OFFSET 0x05F50  /* CRC Offset register */
 
+/* Virtualization statistical counters */
+#define E1000_PFVFGPRC(_n)   (0x010010 + (0x100 * (_n)))
+#define E1000_PFVFGPTC(_n)   (0x010014 + (0x100 * (_n)))
+#define E1000_PFVFGORC(_n)   (0x010018 + (0x100 * (_n)))
+#define E1000_PFVFGOTC(_n)   (0x010034 + (0x100 * (_n)))
+#define E1000_PFVFMPRC(_n)   (0x010038 + (0x100 * (_n)))
+#define E1000_PFVFGPRLBC(_n) (0x010040 + (0x100 * (_n)))
+#define E1000_PFVFGPTLBC(_n) (0x010044 + (0x100 * (_n)))
+#define E1000_PFVFGORLBC(_n) (0x010048 + (0x100 * (_n)))
+#define E1000_PFVFGOTLBC(_n) (0x010050 + (0x100 * (_n)))
+
 #define E1000_LSECTXUT        0x04300  /* LinkSec Tx Untagged Packet Count - OutPktsUntagged */
 #define E1000_LSECTXPKTE      0x04304  /* LinkSec Encrypted Tx Packets Count - OutPktsEncrypted */
 #define E1000_LSECTXPKTP      0x04308  /* LinkSec Protected Tx Packet Count - OutPktsProtected */
@@ -386,6 +397,7 @@
 #define E1000_KMRNCTRLSTA 0x00034 /* MAC-PHY interface - RW */
 #define E1000_MDPHYA      0x0003C /* PHY address - RW */
 #define E1000_MANC2H      0x05860 /* Management Control To Host - RW */
+#define E1000_MDEF(_n)    (0x05890 + (4 * (_n))) /* Mngmt Decision Filters */
 #define E1000_SW_FW_SYNC  0x05B5C /* Software-Firmware Synchronization - RW */
 #define E1000_CCMCTL      0x05B48 /* CCM Control Register */
 #define E1000_GIOCTL      0x05B44 /* GIO Analog Control Register */

Modified: head/sys/dev/e1000/if_em.c
==============================================================================
--- head/sys/dev/e1000/if_em.c	Mon Mar 29 23:00:45 2010	(r205868)
+++ head/sys/dev/e1000/if_em.c	Mon Mar 29 23:36:34 2010	(r205869)
@@ -35,7 +35,6 @@
 #ifdef HAVE_KERNEL_OPTION_HEADERS
 #include "opt_device_polling.h"
 #include "opt_inet.h"
-#include "opt_altq.h"
 #endif
 
 #include <sys/param.h>
@@ -55,9 +54,7 @@
 #include <sys/sockio.h>
 #include <sys/sysctl.h>
 #include <sys/taskqueue.h>
-#if __FreeBSD_version >= 700029
 #include <sys/eventhandler.h>
-#endif
 #include <machine/bus.h>
 #include <machine/resource.h>
 
@@ -95,7 +92,7 @@ int	em_display_debug_stats = 0;
 /*********************************************************************
  *  Driver version:
  *********************************************************************/
-char em_driver_version[] = "6.9.25";
+char em_driver_version[] = "7.0.0";
 
 
 /*********************************************************************
@@ -111,51 +108,6 @@ char em_driver_version[] = "6.9.25";
 static em_vendor_info_t em_vendor_info_array[] =
 {
 	/* Intel(R) PRO/1000 Network Connection */
-	{ 0x8086, E1000_DEV_ID_82540EM,		PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82540EM_LOM,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82540EP,		PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82540EP_LOM,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82540EP_LP,	PCI_ANY_ID, PCI_ANY_ID, 0},
-
-	{ 0x8086, E1000_DEV_ID_82541EI,		PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82541ER,		PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82541ER_LOM,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82541EI_MOBILE,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82541GI,		PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82541GI_LF,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82541GI_MOBILE,	PCI_ANY_ID, PCI_ANY_ID, 0},
-
-	{ 0x8086, E1000_DEV_ID_82542,		PCI_ANY_ID, PCI_ANY_ID, 0},
-
-	{ 0x8086, E1000_DEV_ID_82543GC_FIBER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82543GC_COPPER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-
-	{ 0x8086, E1000_DEV_ID_82544EI_COPPER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82544EI_FIBER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82544GC_COPPER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82544GC_LOM,	PCI_ANY_ID, PCI_ANY_ID, 0},
-
-	{ 0x8086, E1000_DEV_ID_82545EM_COPPER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82545EM_FIBER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82545GM_COPPER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82545GM_FIBER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82545GM_SERDES,	PCI_ANY_ID, PCI_ANY_ID, 0},
-
-	{ 0x8086, E1000_DEV_ID_82546EB_COPPER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82546EB_FIBER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82546EB_QUAD_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82546GB_COPPER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82546GB_FIBER,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82546GB_SERDES,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82546GB_PCIE,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82546GB_QUAD_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3,
-						PCI_ANY_ID, PCI_ANY_ID, 0},
-
-	{ 0x8086, E1000_DEV_ID_82547EI,		PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82547EI_MOBILE,	PCI_ANY_ID, PCI_ANY_ID, 0},
-	{ 0x8086, E1000_DEV_ID_82547GI,		PCI_ANY_ID, PCI_ANY_ID, 0},
-
 	{ 0x8086, E1000_DEV_ID_82571EB_COPPER,	PCI_ANY_ID, PCI_ANY_ID, 0},
 	{ 0x8086, E1000_DEV_ID_82571EB_FIBER,	PCI_ANY_ID, PCI_ANY_ID, 0},
 	{ 0x8086, E1000_DEV_ID_82571EB_SERDES,	PCI_ANY_ID, PCI_ANY_ID, 0},
@@ -238,10 +190,11 @@ static int	em_shutdown(device_t);
 static int	em_suspend(device_t);
 static int	em_resume(device_t);
 static void	em_start(struct ifnet *);
-static void	em_start_locked(struct ifnet *ifp);
+static void	em_start_locked(struct ifnet *, struct tx_ring *);
 #if __FreeBSD_version >= 800000
 static int	em_mq_start(struct ifnet *, struct mbuf *);
-static int	em_mq_start_locked(struct ifnet *, struct mbuf *);
+static int	em_mq_start_locked(struct ifnet *,
+		    struct tx_ring *, struct mbuf *);
 static void	em_qflush(struct ifnet *);
 #endif
 static int	em_ioctl(struct ifnet *, u_long, caddr_t);
@@ -252,55 +205,49 @@ static void	em_media_status(struct ifnet
 static int	em_media_change(struct ifnet *);
 static void	em_identify_hardware(struct adapter *);
 static int	em_allocate_pci_resources(struct adapter *);
-static int	em_allocate_legacy(struct adapter *adapter);
-static int	em_allocate_msix(struct adapter *adapter);
+static int	em_allocate_legacy(struct adapter *);
+static int	em_allocate_msix(struct adapter *);
+static int	em_allocate_queues(struct adapter *);
 static int	em_setup_msix(struct adapter *);
 static void	em_free_pci_resources(struct adapter *);
 static void	em_local_timer(void *);
-static int	em_hardware_init(struct adapter *);
+static void	em_reset(struct adapter *);
 static void	em_setup_interface(device_t, struct adapter *);
+
 static void	em_setup_transmit_structures(struct adapter *);
 static void	em_initialize_transmit_unit(struct adapter *);
+static int	em_allocate_transmit_buffers(struct tx_ring *);
+static void	em_free_transmit_structures(struct adapter *);
+static void	em_free_transmit_buffers(struct tx_ring *);
+
 static int	em_setup_receive_structures(struct adapter *);
+static int	em_allocate_receive_buffers(struct rx_ring *);
 static void	em_initialize_receive_unit(struct adapter *);
+static void	em_free_receive_structures(struct adapter *);
+static void	em_free_receive_buffers(struct rx_ring *);
+
 static void	em_enable_intr(struct adapter *);
 static void	em_disable_intr(struct adapter *);
-static void	em_free_transmit_structures(struct adapter *);
-static void	em_free_receive_structures(struct adapter *);
 static void	em_update_stats_counters(struct adapter *);
-static void	em_txeof(struct adapter *);
-static void	em_tx_purge(struct adapter *);
-static int	em_allocate_receive_structures(struct adapter *);
-static int	em_allocate_transmit_structures(struct adapter *);
-static int	em_rxeof(struct adapter *, int);
+static bool	em_txeof(struct tx_ring *);
+static int	em_rxeof(struct rx_ring *, int);
 #ifndef __NO_STRICT_ALIGNMENT
-static int	em_fixup_rx(struct adapter *);
+static int	em_fixup_rx(struct rx_ring *);
 #endif
-static void	em_receive_checksum(struct adapter *, struct e1000_rx_desc *,
-		    struct mbuf *);
-static void	em_transmit_checksum_setup(struct adapter *, struct mbuf *,
-		    u32 *, u32 *);
-#if __FreeBSD_version >= 700000
-static bool	em_tso_setup(struct adapter *, struct mbuf *,
+static void	em_receive_checksum(struct e1000_rx_desc *, struct mbuf *);
+static void	em_transmit_checksum_setup(struct tx_ring *, struct mbuf *,
 		    u32 *, u32 *);
-#endif /* FreeBSD_version >= 700000 */
+static bool	em_tso_setup(struct tx_ring *, struct mbuf *, u32 *, u32 *);
 static void	em_set_promisc(struct adapter *);
 static void	em_disable_promisc(struct adapter *);
 static void	em_set_multi(struct adapter *);
 static void	em_print_hw_stats(struct adapter *);
 static void	em_update_link_status(struct adapter *);
-static int	em_get_buf(struct adapter *, int);
-#if __FreeBSD_version >= 700029
+static void	em_refresh_mbufs(struct rx_ring *, int);
 static void	em_register_vlan(void *, struct ifnet *, u16);
 static void	em_unregister_vlan(void *, struct ifnet *, u16);
 static void	em_setup_vlan_hw_support(struct adapter *);
-#endif
-static int	em_xmit(struct adapter *, struct mbuf **);
-static void	em_smartspeed(struct adapter *);
-static int	em_82547_fifo_workaround(struct adapter *, int);
-static void	em_82547_update_fifo_head(struct adapter *, int);
-static int	em_82547_tx_fifo_reset(struct adapter *);
-static void	em_82547_move_tail(void *);
+static int	em_xmit(struct tx_ring *, struct mbuf **);
 static int	em_dma_malloc(struct adapter *, bus_size_t,
 		    struct em_dma_alloc *, int);
 static void	em_dma_free(struct adapter *, struct em_dma_alloc *);
@@ -309,8 +256,6 @@ static void	em_print_nvm_info(struct ada
 static int 	em_is_valid_ether_addr(u8 *);
 static int	em_sysctl_stats(SYSCTL_HANDLER_ARGS);
 static int	em_sysctl_debug_info(SYSCTL_HANDLER_ARGS);
-static u32	em_fill_descriptors (bus_addr_t address, u32 length,
-		    PDESC_ARRAY desc_array);
 static int	em_sysctl_int_delay(SYSCTL_HANDLER_ARGS);
 static void	em_add_int_delay_sysctl(struct adapter *, const char *,
 		    const char *, struct em_int_delay_info *, int, int);
@@ -323,27 +268,18 @@ static void	em_get_wakeup(device_t);
 static void     em_enable_wakeup(device_t);
 static int	em_enable_phy_wakeup(struct adapter *);
 
-#ifdef EM_LEGACY_IRQ
-static void	em_intr(void *);
-#else /* FAST IRQ */
-#if __FreeBSD_version < 700000
-static void	em_irq_fast(void *);
-#else
 static int	em_irq_fast(void *);
-#endif
 
 /* MSIX handlers */
 static void	em_msix_tx(void *);
 static void	em_msix_rx(void *);
 static void	em_msix_link(void *);
-static void	em_handle_rx(void *context, int pending);
 static void	em_handle_tx(void *context, int pending);
-
-static void	em_handle_rxtx(void *context, int pending);
+static void	em_handle_rx(void *context, int pending);
 static void	em_handle_link(void *context, int pending);
+
 static void	em_add_rx_process_limit(struct adapter *, const char *,
 		    const char *, int *, int);
-#endif /* ~EM_LEGACY_IRQ */
 
 #ifdef DEVICE_POLLING
 static poll_handler_t em_poll;
@@ -368,7 +304,7 @@ static driver_t em_driver = {
 	"em", em_methods, sizeof(struct adapter),
 };
 
-static devclass_t em_devclass;
+devclass_t em_devclass;
 DRIVER_MODULE(em, pci, em_driver, em_devclass, 0, 0);
 MODULE_DEPEND(em, pci, 1, 1, 1);
 MODULE_DEPEND(em, ether, 1, 1, 1);
@@ -388,31 +324,35 @@ MODULE_DEPEND(em, ether, 1, 1, 1);
 
 static int em_tx_int_delay_dflt = EM_TICKS_TO_USECS(EM_TIDV);
 static int em_rx_int_delay_dflt = EM_TICKS_TO_USECS(EM_RDTR);
-static int em_tx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_TADV);
-static int em_rx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_RADV);
-static int em_rxd = EM_DEFAULT_RXD;
-static int em_txd = EM_DEFAULT_TXD;
-static int em_smart_pwr_down = FALSE;
-/* Controls whether promiscuous also shows bad packets */
-static int em_debug_sbp = FALSE;
-/* Local switch for MSI/MSIX */
-static int em_enable_msi = TRUE;
-
 TUNABLE_INT("hw.em.tx_int_delay", &em_tx_int_delay_dflt);
 TUNABLE_INT("hw.em.rx_int_delay", &em_rx_int_delay_dflt);
+
+static int em_tx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_TADV);
+static int em_rx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_RADV);
 TUNABLE_INT("hw.em.tx_abs_int_delay", &em_tx_abs_int_delay_dflt);
 TUNABLE_INT("hw.em.rx_abs_int_delay", &em_rx_abs_int_delay_dflt);
+
+static int em_rxd = EM_DEFAULT_RXD;
+static int em_txd = EM_DEFAULT_TXD;
 TUNABLE_INT("hw.em.rxd", &em_rxd);
 TUNABLE_INT("hw.em.txd", &em_txd);
+
+static int em_smart_pwr_down = FALSE;
 TUNABLE_INT("hw.em.smart_pwr_down", &em_smart_pwr_down);
+
+/* Controls whether promiscuous also shows bad packets */
+static int em_debug_sbp = FALSE;
 TUNABLE_INT("hw.em.sbp", &em_debug_sbp);
-TUNABLE_INT("hw.em.enable_msi", &em_enable_msi);
 
-#ifndef EM_LEGACY_IRQ
+/* Local controls for MSI/MSIX */
+static int em_enable_msix = TRUE;
+static int em_msix_queues = 2; /* for 82574, can be 1 or 2 */
+TUNABLE_INT("hw.em.enable_msix", &em_enable_msix);
+TUNABLE_INT("hw.em.msix_queues", &em_msix_queues);
+
 /* How many packets rxeof tries to clean at a time */
 static int em_rx_process_limit = 100;
 TUNABLE_INT("hw.em.rx_process_limit", &em_rx_process_limit);
-#endif
 
 /* Flow control setting - default to FULL */
 static int em_fc_setting = e1000_fc_full;
@@ -494,7 +434,6 @@ static int
 em_attach(device_t dev)
 {
 	struct adapter	*adapter;
-	int		tsize, rsize;
 	int		error = 0;
 
 	INIT_DEBUGOUT("em_attach: begin");
@@ -502,8 +441,6 @@ em_attach(device_t dev)
 	adapter = device_get_softc(dev);
 	adapter->dev = adapter->osdep.dev = dev;
 	EM_CORE_LOCK_INIT(adapter, device_get_nameunit(dev));
-	EM_TX_LOCK_INIT(adapter, device_get_nameunit(dev));
-	EM_RX_LOCK_INIT(adapter, device_get_nameunit(dev));
 
 	/* SYSCTL stuff */
 	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
@@ -517,7 +454,6 @@ em_attach(device_t dev)
 	    em_sysctl_stats, "I", "Statistics");
 
 	callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0);
-	callout_init_mtx(&adapter->tx_fifo_timer, &adapter->tx_mtx, 0);
 
 	/* Determine hardware and mac info */
 	em_identify_hardware(adapter);
@@ -571,25 +507,21 @@ em_attach(device_t dev)
 	em_add_int_delay_sysctl(adapter, "tx_int_delay",
 	    "transmit interrupt delay in usecs", &adapter->tx_int_delay,
 	    E1000_REGISTER(&adapter->hw, E1000_TIDV), em_tx_int_delay_dflt);
-	if (adapter->hw.mac.type >= e1000_82540) {
-		em_add_int_delay_sysctl(adapter, "rx_abs_int_delay",
-		    "receive interrupt delay limit in usecs",
-		    &adapter->rx_abs_int_delay,
-		    E1000_REGISTER(&adapter->hw, E1000_RADV),
-		    em_rx_abs_int_delay_dflt);
-		em_add_int_delay_sysctl(adapter, "tx_abs_int_delay",
-		    "transmit interrupt delay limit in usecs",
-		    &adapter->tx_abs_int_delay,
-		    E1000_REGISTER(&adapter->hw, E1000_TADV),
-		    em_tx_abs_int_delay_dflt);
-	}
+	em_add_int_delay_sysctl(adapter, "rx_abs_int_delay",
+	    "receive interrupt delay limit in usecs",
+	    &adapter->rx_abs_int_delay,
+	    E1000_REGISTER(&adapter->hw, E1000_RADV),
+	    em_rx_abs_int_delay_dflt);
+	em_add_int_delay_sysctl(adapter, "tx_abs_int_delay",
+	    "transmit interrupt delay limit in usecs",
+	    &adapter->tx_abs_int_delay,
+	    E1000_REGISTER(&adapter->hw, E1000_TADV),
+	    em_tx_abs_int_delay_dflt);
 
-#ifndef EM_LEGACY_IRQ
 	/* Sysctls for limiting the amount of work done in the taskqueue */
 	em_add_rx_process_limit(adapter, "rx_processing_limit",
 	    "max number of rx packets to process", &adapter->rx_process_limit,
 	    em_rx_process_limit);
-#endif
 
 	/*
 	 * Validate number of transmit and receive descriptors. It
@@ -597,18 +529,15 @@ em_attach(device_t dev)
 	 * of E1000_DBA_ALIGN.
 	 */
 	if (((em_txd * sizeof(struct e1000_tx_desc)) % EM_DBA_ALIGN) != 0 ||
-	    (adapter->hw.mac.type >= e1000_82544 && em_txd > EM_MAX_TXD) ||
-	    (adapter->hw.mac.type < e1000_82544 && em_txd > EM_MAX_TXD_82543) ||
-	    (em_txd < EM_MIN_TXD)) {
+	    (em_txd > EM_MAX_TXD) || (em_txd < EM_MIN_TXD)) {
 		device_printf(dev, "Using %d TX descriptors instead of %d!\n",
 		    EM_DEFAULT_TXD, em_txd);
 		adapter->num_tx_desc = EM_DEFAULT_TXD;
 	} else
 		adapter->num_tx_desc = em_txd;
+
 	if (((em_rxd * sizeof(struct e1000_rx_desc)) % EM_DBA_ALIGN) != 0 ||
-	    (adapter->hw.mac.type >= e1000_82544 && em_rxd > EM_MAX_RXD) ||
-	    (adapter->hw.mac.type < e1000_82544 && em_rxd > EM_MAX_RXD_82543) ||
-	    (em_rxd < EM_MIN_RXD)) {
+	    (em_rxd > EM_MAX_RXD) || (em_rxd < EM_MIN_RXD)) {
 		device_printf(dev, "Using %d RX descriptors instead of %d!\n",
 		    EM_DEFAULT_RXD, em_rxd);
 		adapter->num_rx_desc = EM_DEFAULT_RXD;
@@ -618,10 +547,6 @@ em_attach(device_t dev)
 	adapter->hw.mac.autoneg = DO_AUTO_NEG;
 	adapter->hw.phy.autoneg_wait_to_complete = FALSE;
 	adapter->hw.phy.autoneg_advertised = AUTONEG_ADV_DEFAULT;
-	adapter->rx_buffer_len = 2048;
-
-	e1000_init_script_state_82541(&adapter->hw, TRUE);
-	e1000_set_tbi_compatibility_82543(&adapter->hw, TRUE);
 
 	/* Copper options */
 	if (adapter->hw.phy.media_type == e1000_media_type_copper) {
@@ -643,29 +568,13 @@ em_attach(device_t dev)
 	 */
 	adapter->hw.mac.report_tx_early = 1;
 
-	tsize = roundup2(adapter->num_tx_desc * sizeof(struct e1000_tx_desc),
-	    EM_DBA_ALIGN);
-
-	/* Allocate Transmit Descriptor ring */
-	if (em_dma_malloc(adapter, tsize, &adapter->txdma, BUS_DMA_NOWAIT)) {
-		device_printf(dev, "Unable to allocate tx_desc memory\n");
-		error = ENOMEM;
-		goto err_tx_desc;
-	}
-	adapter->tx_desc_base = 
-	    (struct e1000_tx_desc *)adapter->txdma.dma_vaddr;
-
-	rsize = roundup2(adapter->num_rx_desc * sizeof(struct e1000_rx_desc),
-	    EM_DBA_ALIGN);
-
-	/* Allocate Receive Descriptor ring */
-	if (em_dma_malloc(adapter, rsize, &adapter->rxdma, BUS_DMA_NOWAIT)) {
-		device_printf(dev, "Unable to allocate rx_desc memory\n");
+	/* 
+	** Get queue/ring memory
+	*/
+	if (em_allocate_queues(adapter)) {
 		error = ENOMEM;
-		goto err_rx_desc;
+		goto err_pci;
 	}
-	adapter->rx_desc_base =
-	    (struct e1000_rx_desc *)adapter->rxdma.dma_vaddr;
 
 	/*
 	** Start from a known state, this is
@@ -685,7 +594,7 @@ em_attach(device_t dev)
 			device_printf(dev,
 			    "The EEPROM Checksum Is Not Valid\n");
 			error = EIO;
-			goto err_hw_init;
+			goto err_late;
 		}
 	}
 
@@ -694,45 +603,24 @@ em_attach(device_t dev)
 		device_printf(dev, "EEPROM read error while reading MAC"
 		    " address\n");
 		error = EIO;
-		goto err_hw_init;
+		goto err_late;
 	}
 
 	if (!em_is_valid_ether_addr(adapter->hw.mac.addr)) {
 		device_printf(dev, "Invalid MAC address\n");
 		error = EIO;
-		goto err_hw_init;
-	}
-
-	/* Initialize the hardware */
-	if (em_hardware_init(adapter)) {
-		device_printf(dev, "Unable to initialize the hardware\n");
-		error = EIO;
-		goto err_hw_init;
-	}
-
-	/* Allocate transmit descriptors and buffers */
-	if (em_allocate_transmit_structures(adapter)) {
-		device_printf(dev, "Could not setup transmit structures\n");
-		error = ENOMEM;
-		goto err_tx_struct;
-	}
-
-	/* Allocate receive descriptors and buffers */
-	if (em_allocate_receive_structures(adapter)) {
-		device_printf(dev, "Could not setup receive structures\n");
-		error = ENOMEM;
-		goto err_rx_struct;
+		goto err_late;
 	}
 
 	/*
 	**  Do interrupt configuration
 	*/
-	if (adapter->msi > 1) /* Do MSI/X */
+	if (adapter->msix > 1) /* Do MSIX */
 		error = em_allocate_msix(adapter);
 	else  /* MSI or Legacy */
 		error = em_allocate_legacy(adapter);
 	if (error)
-		goto err_rx_struct;
+		goto err_late;
 
 	/*
 	 * Get Wake-on-Lan and Management info for later use
@@ -742,6 +630,8 @@ em_attach(device_t dev)
 	/* Setup OS specific network interface */
 	em_setup_interface(dev, adapter);
 
+	em_reset(adapter);
+
 	/* Initialize statistics */
 	em_update_stats_counters(adapter);
 
@@ -753,20 +643,11 @@ em_attach(device_t dev)
 		device_printf(dev,
 		    "PHY reset is blocked due to SOL/IDER session.\n");
 
-	/* Do we need workaround for 82544 PCI-X adapter? */
-	if (adapter->hw.bus.type == e1000_bus_type_pcix &&
-	    adapter->hw.mac.type == e1000_82544)
-		adapter->pcix_82544 = TRUE;
-	else
-		adapter->pcix_82544 = FALSE;
-
-#if __FreeBSD_version >= 700029

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-head mailing list