NetBSD Problem Report #42422

From Wolfgang.Stukenbrock@nagler-company.com  Mon Dec  7 15:32:30 2009
Return-Path: <Wolfgang.Stukenbrock@nagler-company.com>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by www.NetBSD.org (Postfix) with ESMTP id A48A163C483
	for <gnats-bugs@gnats.NetBSD.org>; Mon,  7 Dec 2009 15:32:30 +0000 (UTC)
Message-Id: <20091207153226.5FCD04EAA14@s012.nagler-company.com>
Date: Mon,  7 Dec 2009 16:32:26 +0100 (CET)
From: Wolfgang.Stukenbrock@nagler-company.com
Reply-To: Wolfgang.Stukenbrock@nagler-company.com
To: gnats-bugs@gnats.NetBSD.org
Subject: NetBSD 4.x and 5.x lacks support for Intel 82575/82576 NIC's
X-Send-Pr-Version: 3.95

>Number:         42422
>Category:       kern
>Synopsis:       NetBSD 4.x and 5.x lacks support for Intel 82575/82576 NIC's
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    kern-bug-people
>State:          closed
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Mon Dec 07 15:35:00 +0000 2009
>Closed-Date:    Sat Jul 10 23:07:44 +0000 2010
>Last-Modified:  Fri Nov 19 23:45:01 +0000 2010
>Originator:     Dr. Wolfgang Stukenbrock
>Release:        NetBSD 4.0
>Organization:
Dr. Nagler & Company GmbH

>Environment:


System: NetBSD s012 4.0 NetBSD 4.0 (NSW-S012) #9: Fri Mar 13 12:31:52 CET 2009 wgstuken@s012:/usr/src/sys/arch/amd64/compile/NSW-S012 amd64
Architecture: x86_64
Machine: amd64
>Description:
	There is no support in 4.x and 5.x of NetBSD for Intel's latest 1000Tx-chips.
	Accedently Intel has retiered most of the supported chips, so there is a support problem for
	actual hardware.
	I've found a driver in FreeBSD that seems to base on Intel-Sources. In this driver there
	is a new interface type for the 82575 and 82676.
	Most code parts are still shared with to older chips, but the freeBSD-driver uses the new advanced
	recieve buffer descriptors of the chip that are required if someone is gooing to use the advanced
	features (e.g. virtualisation) of theese chips.
	As far as I see, NetBSD does not support features like that, so that it is possible to use the
	legacy interface of the 82575/82576.

	The following patches enables the 82575 found on the Intel X38ML board.

	remarks:
	- The patch supports only the 82575. Accedently I found no HW-Manual for the 82575, so I have used
	  the 82576 manual and the freeBSD-driver as reference.
	- The patch does not support Fiber, Serdes or SGMII PHY. The X38ML board has a normal GMII-Phy, so I
	  couldn't test any other. The Fiber/Serdes version may work with some small changes. The SGMII interface
	  via I2C is completly new.
	- I simply do not know what some of the timing parameter used in the NetBSD-wm-driver or the freeBSD-driver mean.
	  So someone that has advanced knowledge on that should have a look at it prior integrating it into NetBSD!
	- The support for non-EEPROM setups is taken from freeBSD. I've no chance to test it ...
	- Some registers changes their address starting with the 82575. They are still reachable vie the old addresse.
	  Due to the fact, that the first one of them are still rachable on the old addresses for comparbility reasons,
	  I have only added the new addresses in if_wmreg.h, but still use the old ones. Affected are the Queues, but
	  NetBSD uses only queue 0.
	- The 82575 cannot be initialized until the RX-Queue is enabled. Therefore I moved some parts of the setup
	  to a the end of the setup.
	  I think this oulb be a good idea for all chips, but I've no manual for the old ones.
	  In fact, the RDT register is written twice on every chip - that makes no sence ...
	  (first when allocating the memory while the Rx-queue is still disables and than again after another reset of the chip.)


	Other bugs found in the current NetBSD wm driver version:
	- while waiting for the chip, the timeout variable is not decrented!
	  If a chip will not get ready the dirver will hang - this is fixed in the patch.
	- in wm_attach some settings for the GPIO-Pins are extracted from the EEPROM and set into the CTLR register.
	  This information is lost after the next chip-reset, e.g. when configuring the interface via "ifconfig".
	  The EEPROM-Info is not applied again in the CTLR-register setup.
	  For the X38ML-board this results in not setting the Watchdog-enable-bit again.
	  I have no idea about the side effects when the bit is not set again.
	  This issue is NOT addresses in this patch! The EEPROM-information is still lost after every chip-reset!
	  (At least on the X38ML-Board with the BIOS-setup we are using, it seems to have no effect, but ...)
	  I found this by printing the CTLR register on every change for debugging purpose.

	  The patches works fine for us. We have no problems with it up to now.
>How-To-Repeat:
	not relevant.
>Fix:
	The following patches to the pcidevs-database, if_wm.c and if_wmreg.h enables support for the 82575
	found on the Intel X38ML-Serverboard. The set of pcidevs added to the pcidevs-database includes only the 82575
	version (not the 82576 ones), but all of them.
	I cannot garantie that other chips as the i82575EB (0x10a7) will work. (the two BG-versions will be recognized too ...)
	We are currently running an "upgraded" version of the wm-driver from NetBSD-4.0 - upgraded from current version
	some time ago. We have needed support for some additional chips ...
	I've verified that there is still no support for the 82575/82576 in current, but I cannot garantie that
	the line numbers matches the current version or that there are no effects that belongs to the latest changes
	in the LWP management in NetBSD 5.0 and later. Sorry.


--- pcidevs	2009/04/14 12:32:59	1.3
+++ pcidevs	2009/12/07 14:36:01
@@ -2045,6 +2045,8 @@
 product INTEL 82546GB_QUAD_COPPER 0x1099 i82546GB quad-port Gigabit Ethernet
 product INTEL 82573L		0x109a	i82573L Gigabit Ethernet
 product INTEL 82571EB_QUAD_COPPER 0x10a4 i82571EB quad-1000baseT Ethernet
+product INTEL 82575EB_COPPER	0x10a7 i82575EB dual-1000baseT Ethernet
+product INTEL 82575EB_FIBER_SERDES 0x10a9 i82575EB dual-1000baseX Ethernet (SERDES)
 product INTEL 82546GB_QUAD_COPPER_KSP3 0x10b5 i82546GB quad-port Gigabit Ethernet (KSP3)
 product INTEL 82572EI		0x10b9	i82572EI 1000baseT Ethernet
 product INTEL 80K3LAN_CPR_SPT 0x10ba	i80003 1000baseT Ethernet
@@ -2060,8 +2062,10 @@
 product INTEL 82801I_IGP_M_V	0x10cb	i82801H IGP (MV) LAN Controller
 product INTEL 82801J_D_BM_LF	0x10cd	i82801J (LF) LAN Controller
 product INTEL 82574L		0x10d3	i82574L 1000baseT Ethernet
+product INTEL 82575GB_QUAD_COPPER 0x10d6 i82575GB quad-1000baseT Ethernet
 product INTEL 82567LM_3		0x10de	i82567LM-3 LAN Controller
 product INTEL 82567LF_3		0x10df	i82567LF-3 LAN Controller
+product INTEL 82575GB_QUAD_COPPER_PM 0x10e2 i82575GB Quad-1000baseT Ethernet (PM)
 product INTEL 82801I_IGP_M_AMT	0x10f5	82801I Mobile (AMT) LAN Controller
 product INTEL 82815_DC100_HUB	0x1100	82815 Hub
 product INTEL 82815_DC100_AGP	0x1101	82815 AGP


--- pcidevs.h	2009/04/14 12:32:59	1.3
+++ pcidevs.h	2009/12/07 14:36:13
@@ -2052,6 +2052,9 @@
 #define	PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER	0x1099		/* i82546GB quad-port Gigabit Ethernet */
 #define	PCI_PRODUCT_INTEL_82573L	0x109a		/* i82573L Gigabit Ethernet */
 #define	PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER	0x10a4		/* i82571EB quad-1000baseT Ethernet */
+#define	PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER	0x10a4		/* i82571EB quad-1000baseT Ethernet */
+#define PCI_PRODUCT_INTEL_82575EB_COPPER           0x10A7
+#define PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES     0x10A9
 #define	PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3	0x10b5		/* i82546GB quad-port Gigabit Ethernet (KSP3) */
 #define	PCI_PRODUCT_INTEL_82572EI	0x10b9		/* i82572EI 1000baseT Ethernet */
 #define	PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT	0x10ba		/* i80003 1000baseT Ethernet */
@@ -2067,8 +2070,10 @@
 #define	PCI_PRODUCT_INTEL_82801H_IGP_M_V	0x10cb		/* i82801H IGP (MV) LAN Controller */
 #define	PCI_PRODUCT_INTEL_82801J_D_BM_LF	0x10cd		/* i82801J (LF) LAN Controller */
 #define	PCI_PRODUCT_INTEL_82574L	0x10d3		/* i82574L 1000baseT Ethernet */
+#define PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER      0x10D6
 #define	PCI_PRODUCT_INTEL_82567LM_3	0x10de		/* i82567LM-3 LAN Controller */
 #define	PCI_PRODUCT_INTEL_82567LF_3	0x10df		/* i82567LF-3 LAN Controller */
+#define PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM   0x10E2
 #define	PCI_PRODUCT_INTEL_82801I_IGP_M_AMT	0x10f5		/* 82801I Mobile (AMT) LAN Controller */
 #define	PCI_PRODUCT_INTEL_82815_DC100_HUB	0x1100		/* 82815 Hub */
 #define	PCI_PRODUCT_INTEL_82815_DC100_AGP	0x1101		/* 82815 AGP */


--- pcidevs_data.h	2009/04/14 12:32:59	1.3
+++ pcidevs_data.h	2009/12/07 14:36:45
@@ -7060,6 +7060,14 @@
 	    "i82571EB quad-1000baseT Ethernet",
 	},
 	{
+	    PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_COPPER,
+	    "i82575EB dual-1000baseT Ethernet",
+	},
+	{
+	    PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES,
+	    "i82575EB dual-1000baseX Ethernet (SERDES)",
+	},
+	{
 	    PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3,
 	    "i82546GB quad-port Gigabit Ethernet (KSP3)",
 	},
@@ -7120,6 +7128,10 @@
 	    "i82574L 1000baseT Ethernet",
 	},
 	{
+	    PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER,
+	    "i82575GB quad-1000baseT Ethernet",
+	},
+	{
 	    PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82567LM_3,
 	    "i82567LM-3 LAN Controller",
 	},
@@ -7128,6 +7140,10 @@
 	    "i82567LF-3 LAN Controller",
 	},
 	{
+	    PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM,
+	    "i82575GB Quad-1000baseT Ethernet (PM)",
+	},
+	{
 	    PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_AMT,
 	    "82801I Mobile (AMT) LAN Controller",
 	},
@@ -13196,4 +13212,4 @@
 	    "Video Controller",
 	},
 };
-const int pci_nproducts = 2702;
+const int pci_nproducts = 2706;


--- if_wmreg.h	2009/04/14 12:33:22	1.3
+++ if_wmreg.h	2009/12/07 14:35:40
@@ -332,9 +332,11 @@
 #define	CTRL_EXT_RO_DIS		(1U << 17) /* relaxed ordering disabled */
 #define	CTRL_EXT_LINK_MODE_MASK	0x00C00000
 #define	CTRL_EXT_LINK_MODE_GMII	0x00000000
+#define	CTRL_EXT_LINK_MODE_SGMII 0x00800000
 #define	CTRL_EXT_LINK_MODE_TBI	0x00C00000
 #define	CTRL_EXT_LINK_MODE_KMRN	0x00000000
 #define	CTRL_EXT_LINK_MODE_SERDES 0x00C00000
+#define CTRL_EXT_I2C_ENA	0x02000000  /* I2C enable */
 #define	CTRL_EXT_DRV_LOAD       0x10000000


@@ -348,6 +350,12 @@
 #define	MDIC_I		(1U << 29)	/* interrupt on MDI complete */
 #define	MDIC_E		(1U << 30)	/* MDI error */

+#define WMREG_SCTL	0x0024	/* SerDes Control - RW */
+#define SCTL_CTL_READY  (1U << 31)	/* also used for other control registers on the 82575 for the no-EEPROM case */
+#define SCTL_CTL_DATA_MASK 0x000000ff	/* also used for other control registers on the 82575 for the no-EEPROM case */
+#define SCTL_CTL_ADDR_SHIFT 8		/* also used for other control registers on the 82575 for the no-EEPROM case */
+#define SCTL_CTL_POLL_TIMEOUT 640	/* also used for other control registers on the 82575 for the no-EEPROM case */
+
 #define	WMREG_FCAL	0x0028	/* Flow Control Address Low */
 #define	FCAL_CONST	0x00c28001	/* Flow Control MAC addr low */

@@ -438,25 +446,50 @@

 #define	WMREG_OLD_RDBAL0 0x0110	/* Receive Descriptor Base Low (ring 0) */
 #define	WMREG_RDBAL	0x2800
+#define	WMREG_RDBAL_2	0x0c00	/* for 82576 ... */

 #define	WMREG_OLD_RDBAH0 0x0114	/* Receive Descriptor Base High (ring 0) */
 #define	WMREG_RDBAH	0x2804
+#define	WMREG_RDBAH_2	0x0c04	/* for 82576 ... */

 #define	WMREG_OLD_RDLEN0 0x0118	/* Receive Descriptor Length (ring 0) */
 #define	WMREG_RDLEN	0x2808
+#define	WMREG_RDLEN_2	0x0c08	/* for 82576 ... */
+
+#define WMREG_SRRCTL	0x280c	/* additional recieve control used in 82575 ... */
+#define WMREG_SRRCTL_2	0x0c0c	/* for 82576 ... */
+#define SRRCTL_BSIZEPKT_MASK				0x0000007f
+#define SRRCTL_BSIZEPKT_SHIFT		10	/* Shift _right_ */
+#define SRRCTL_BSIZEHDRSIZE_MASK			0x00000f00
+#define SRRCTL_BSIZEHDRSIZE_SHIFT	2	/* Shift _left_ */
+#define SRRCTL_DESCTYPE_LEGACY				0x00000000
+#define SRRCTL_DESCTYPE_ADV_ONEBUF			(1U << 25)
+#define SRRCTL_DESCTYPE_HDR_SPLIT			(2U << 25)
+#define SRRCTL_DESCTYPE_HDR_REPLICATION			(3U << 25)
+#define SRRCTL_DESCTYPE_HDR_REPLICATION_LARGE_PKT	(4U << 25)
+#define SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS		(5U << 25) /* 82575 only */
+#define SRRCTL_DESCTYPE_MASK				(7U << 25)
+#define SRRCTL_DROP_EN					0x80000000

 #define	WMREG_OLD_RDH0	0x0120	/* Receive Descriptor Head (ring 0) */
 #define	WMREG_RDH	0x2810
+#define	WMREG_RDH_2	0x0c10	/* for 82576 ... */

 #define	WMREG_OLD_RDT0	0x0128	/* Receive Descriptor Tail (ring 0) */
 #define	WMREG_RDT	0x2818
+#define	WMREG_RDT_2	0x0c18	/* for 82576 ... */

 #define	WMREG_RXDCTL	0x2828	/* Receive Descriptor Control */
+#define	WMREG_RXDCTL_2	0x0c28	/* for 82576 ... */
 #define	RXDCTL_PTHRESH(x) ((x) << 0)	/* prefetch threshold */
 #define	RXDCTL_HTHRESH(x) ((x) << 8)	/* host threshold */
 #define	RXDCTL_WTHRESH(x) ((x) << 16)	/* write back threshold */
 #define	RXDCTL_GRAN	(1U << 24)	/* 0 = cacheline, 1 = descriptor */

+/* flags used starting with 82575 ... */
+#define RXDCTL_QUEUE_ENABLE  0x02000000 /* Enable specific Tx Queue */
+#define RXDCTL_SWFLSH        0x04000000 /* Rx Desc. write-back flushing */
+
 #define	WMREG_OLD_RDTR1	0x0130	/* Receive Delay Timer (ring 1) */

 #define	WMREG_OLD_RDBA1_LO 0x0138 /* Receive Descriptor Base Low (ring 1) */
@@ -582,6 +615,11 @@
 #define	TXDCTL_HTHRESH(x) ((x) << 8)	/* host threshold */
 #define	TXDCTL_WTHRESH(x) ((x) << 16)	/* write back threshold */

+/* flags used starting with 82575 ... */
+#define TXDCTL_QUEUE_ENABLE  0x02000000 /* Enable specific Tx Queue */
+#define TXDCTL_SWFLSH        0x04000000 /* Tx Desc. write-back flushing */
+#define TXDCTL_PRIORITY      0x08000000
+
 #define	WMREG_TADV	0x382c	/* Transmit Absolute Interrupt Delay Timer */

 #define	WMREG_AIT	0x0458	/* Adaptive IFS Throttle */
@@ -608,6 +646,28 @@

 #define	WMREG_PBS	0x1000	/* Packet Buffer Size (ICH8 only ?) */

+#define WMREG_EICS	0x01520  /* Ext. Interrupt Cause Set - W0 */
+#define WMREG_EIMS	0x01524  /* Ext. Interrupt Mask Set/Read - RW */
+#define WMREG_EIMC	0x01528  /* Ext. Interrupt Mask Clear - WO */
+#define WMREG_EIAC	0x0152C  /* Ext. Interrupt Auto Clear - RW */
+#define WMREG_EIAM	0x01530  /* Ext. Interrupt Ack Auto Clear Mask - RW */
+
+#define WMREG_EICR	0x01580  /* Ext. Interrupt Cause Read - R/clr */
+
+#define EITR_RX_QUEUE0	0x00000001 /* Rx Queue 0 Interrupt */
+#define EITR_RX_QUEUE1	0x00000002 /* Rx Queue 1 Interrupt */
+#define EITR_RX_QUEUE2	0x00000004 /* Rx Queue 2 Interrupt */
+#define EITR_RX_QUEUE3	0x00000008 /* Rx Queue 3 Interrupt */
+#define EITR_TX_QUEUE0	0x00000100 /* Tx Queue 0 Interrupt */
+#define EITR_TX_QUEUE1	0x00000200 /* Tx Queue 1 Interrupt */
+#define EITR_TX_QUEUE2	0x00000400 /* Tx Queue 2 Interrupt */
+#define EITR_TX_QUEUE3	0x00000800 /* Tx Queue 3 Interrupt */
+#define EITR_TCP_TIMER	0x40000000 /* TCP Timer */
+#define EITR_OTHER	0x80000000 /* Interrupt Cause Active */
+
+#define WMREG_EITR(x)	(0x01680 + (0x4 * (x)))
+#define EITR_ITR_INT_MASK	0x0000ffff
+
 #define	WMREG_TXDMAC	0x3000	/* Transfer DMA Control */
 #define	TXDMAC_DPP	(1U << 0)	/* disable packet prefetch */

@@ -622,6 +682,8 @@
 #define	RXCSUM_TUOFL	(1U << 9)	/* TCP/UDP checksum offload */
 #define	RXCSUM_IPV6OFL	(1U << 10)	/* IPv6 checksum offload */

+#define WMREG_RLPML	0x5004	/* Rx Long Packet Max Length */
+
 #define	WMREG_RXERRC	0x400C	/* receive error Count - R/clr */
 #define	WMREG_COLC	0x4028	/* collision Count - R/clr */
 #define	WMREG_XONRXC	0x4048	/* XON Rx Count - R/clr */
@@ -662,6 +724,10 @@

 #define	WMREG_MANC2H	0x5860	/* Managment Control To Host - RW */

+#define WMREG_CCMCTL	0x5b48	/* CCM Control Register */
+#define WMREG_GIOCTL	0x5b44	/* GIO Analog Control Register */
+#define WMREG_SCCTL	0x5b4c	/* PCIc PLL Configuration Register */
+
 #define	WMREG_SWSM	0x5b50	/* SW Semaphore */
 #define	SWSM_SMBI	0x00000001	/* Driver Semaphore bit */
 #define	SWSM_SWESMBI	0x00000002	/* FW Semaphore bit */


--- if_wm.c	2009/04/14 12:33:48	1.3
+++ if_wm.c	2009/12/07 14:37:24
@@ -253,6 +253,7 @@
 	WM_T_ICH8,			/* ICH8 LAN */
 	WM_T_ICH9,			/* ICH9 LAN */
 	WM_T_ICH10,			/* ICH10 LAN */
+	WM_T_82575,			/* i82575 */
 } wm_chip_type;

 #define WM_LINKUP_TIMEOUT	50
@@ -561,6 +562,9 @@
 static int	wm_gmii_i82544_readreg(struct device *, int, int);
 static void	wm_gmii_i82544_writereg(struct device *, int, int, int);

+static int	wm_gmii_i82575_readreg(struct device *, int, int);
+static void	wm_gmii_i82575_writereg(struct device *, int, int, int);
+
 static int	wm_gmii_i80003_readreg(struct device *, int, int);
 static void	wm_gmii_i80003_writereg(struct device *, int, int, int);

@@ -894,6 +898,20 @@
 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801J_D_BM_LF,
 	  "i82801J (LF) LAN Controller",
 	  WM_T_ICH10,		WMP_F_1000T },
+	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82575EB_COPPER,
+	  "i82575EB dual-1000baseT Ethernet",
+	  WM_T_82575,		WMP_F_1000T },
+#if 0 /* not shure if WMP_F_1000X or WMP_F_SERDES - we do not have it - so disabled for now .. */
+	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES,
+	  "i82575EB dual-1000baseX Ethernet (SERDES)",
+	  WM_T_82575,		WMP_F_SERDES },
+#endif
+	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER,
+	  "i82575GB Quad-1000baseT Ethernet",
+	  WM_T_82575,		WMP_F_1000T },
+	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM,
+	  "i82575GB Quad-1000baseT Ethernet (PM)",
+	  WM_T_82575,		WMP_F_1000T },
 	{ 0,			0,
 	  NULL,
 	  0,			0 },
@@ -955,6 +973,26 @@
 	return (0);
 }

+static inline void _82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off, uint32_t data)
+{
+  uint32_t regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT);
+  int i;
+
+  CSR_WRITE(sc, reg, regval);
+
+  for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++)
+    {
+      delay(5);
+      if (CSR_READ(sc, reg) & SCTL_CTL_READY)
+	break;
+    }
+  if (i == SCTL_CTL_POLL_TIMEOUT)
+    {
+      aprint_error("%s: WARNING: i82575 reg 0x%08x setup did not indicate ready\n",
+	sc->sc_dev.dv_xname, reg);
+    }
+}
+
 static void
 wm_attach(struct device *parent, struct device *self, void *aux)
 {
@@ -1300,6 +1338,38 @@
 	wm_reset(sc);

 	switch (sc->sc_type) {
+	case WM_T_82575:
+		reg = CSR_READ(sc, WMREG_EECD);
+		if ((reg & EECD_EE_PRES) == 0) {
+			/* special case - for 82575 - need to do manual init ... */
+			/* remark: this is untested code - we have no board without EEPROM
+			 *         same setup as mentioned int the freeBSD driver for the i82575
+			 */
+			sc->sc_flags |= WM_F_EEPROM_INVALID; /* mark no EEPROM present ... */
+
+			/* SerDes configuration via SERDESCTRL */
+			_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0C);
+			_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78);
+			_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1B, 0x23);
+			_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15);
+
+			/* CCM configuration via CCMCTL register */
+			_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00);
+			_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00);
+
+			/* PCIe lanes configuration */
+			_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xEC);
+			_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xDF);
+			_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05);
+			_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2F, 0x81);
+
+			/* PCIe PLL Configuration */
+			_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47);
+			_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00);
+			_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00);
+
+		}
+		/* fall throught ... */
 	case WM_T_82571:
 	case WM_T_82572:
 	case WM_T_82573:
@@ -1346,6 +1416,8 @@
 		sc->sc_flags |= WM_F_EEPROM_EERDEEWR;
 	else if (sc->sc_type > WM_T_82544)
 		sc->sc_flags |= WM_F_EEPROM_HANDSHAKE;
+	else if (sc->sc_type == WM_T_82575)
+		sc->sc_flags |= WM_F_EEPROM_EERDEEWR | WM_F_SWFW_SYNC; /* XXXX just like 80003 .... just a guess ... */

 	if (sc->sc_type <= WM_T_82544)
 		sc->sc_ee_addrbits = 6;
@@ -1365,7 +1437,7 @@
 	} else if ((sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574) &&
 	    (wm_is_onboard_nvm_eeprom(sc) == 0)) {
 		sc->sc_flags |= WM_F_EEPROM_FLASH;
-	} else {
+	} else if (!(sc->sc_flags & WM_F_EEPROM_INVALID)) {
 		/* Assume everything else is SPI. */
 		reg = CSR_READ(sc, WMREG_EECD);
 		sc->sc_flags |= WM_F_EEPROM_SPI;
@@ -1382,7 +1454,7 @@
 	 * Validate the EEPROM checksum. If the checksum fails, flag this for
 	 * later, so we can fail future reads from the EEPROM.
 	 */
-	if (wm_validate_eeprom_checksum(sc)) {
+	if (!(sc->sc_flags & WM_F_EEPROM_INVALID) && wm_validate_eeprom_checksum(sc)) {
 		/*
 		 * Read twice again because some PCI-e parts fail the first
 		 * check due to the link being in sleep state.
@@ -1434,7 +1506,8 @@
 	 * of the dual port controller.
 	 */
 	if (sc->sc_type == WM_T_82546 || sc->sc_type == WM_T_82546_3
-	    || sc->sc_type ==  WM_T_82571 || sc->sc_type == WM_T_80003) {
+	    || sc->sc_type ==  WM_T_82571 || sc->sc_type == WM_T_80003
+	    || sc->sc_type ==  WM_T_82575) {
 		if ((CSR_READ(sc, WMREG_STATUS) >> STATUS_FUNCID_SHIFT) & 1)
 			enaddr[5] ^= 1;
 	}
@@ -1547,6 +1620,21 @@
 	    || sc->sc_type == WM_T_82574) {
 		/* STATUS_TBIMODE reserved/reused, can't rely on it */
 		wm_gmii_mediainit(sc);
+	} else if (sc->sc_type >= WM_T_82575) {
+		reg = CSR_READ(sc, WMREG_CTRL_EXT);
+		if ((reg & CTRL_EXT_LINK_MODE_MASK) == CTRL_EXT_LINK_MODE_SERDES) {
+			reg |= CTRL_EXT_I2C_ENA;
+aprint_error("%s: CTRL_EXT 0x%08x - WARNING - internal SERDES - still not supported ...\n", sc->sc_dev.dv_xname, reg);
+wm_reset(sc); goto fail_5;
+		} else if (reg & CTRL_EXT_LINK_MODE_SGMII) {
+			reg |= CTRL_EXT_I2C_ENA;
+aprint_error("%s: CTRL_EXT 0x%08x - WARNING - SGMII - still not supported ...\n", sc->sc_dev.dv_xname, reg);
+wm_reset(sc); goto fail_5;
+		} else {
+			reg &= ~CTRL_EXT_I2C_ENA;
+		}
+		CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
+		wm_gmii_mediainit(sc);
 	} else if (sc->sc_type < WM_T_82543 ||
 	    (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) {
 		if (wmp->wmp_flags & WMP_F_1000T)
@@ -3011,6 +3099,7 @@
 	case WM_T_82571:
 	case WM_T_82572:		
 	case WM_T_80003:		
+	case WM_T_82575:		/* XXXX not 100% shure, but set in freebsd driver  .. */
 		sc->sc_pba = PBA_32K;
 		break;
 	case WM_T_82573:
@@ -3038,7 +3127,7 @@
 		sc->sc_ctrl |= CTRL_GIO_M_DIS;
 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);

-		while (timeout) {
+		while (timeout--) {
 			if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA) == 0)
 				break;
 			delay(100);
@@ -3202,6 +3291,7 @@
 	case WM_T_ICH8:
 	case WM_T_ICH9:
 	case WM_T_ICH10:
+	case WM_T_82575:
 		if (wm_check_mng_mode(sc) != 0)
 			wm_get_hw_control(sc);
 		break;
@@ -3232,10 +3322,15 @@
 		CSR_WRITE(sc, WMREG_TIDV, 375);		/* ITR / 4 */
 		CSR_WRITE(sc, WMREG_TADV, 375);		/* should be same */

-		CSR_WRITE(sc, WMREG_TXDCTL, TXDCTL_PTHRESH(0) |
-		    TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
-		CSR_WRITE(sc, WMREG_RXDCTL, RXDCTL_PTHRESH(0) |
-		    RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
+		if (sc->sc_type < WM_T_82575) {
+			CSR_WRITE(sc, WMREG_TXDCTL, TXDCTL_PTHRESH(0) |
+			    TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
+			CSR_WRITE(sc, WMREG_RXDCTL, RXDCTL_PTHRESH(0) |
+			    RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
+		} else { /* remark: not shure if RX-part can be initialized here - better to it below ... */
+			CSR_WRITE(sc, WMREG_TXDCTL, TXDCTL_QUEUE_ENABLE | TXDCTL_PTHRESH(0) |
+			    TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
+		}
 	}
 	CSR_WRITE(sc, WMREG_TQSA_LO, 0);
 	CSR_WRITE(sc, WMREG_TQSA_HI, 0);
@@ -3269,10 +3364,25 @@
 		CSR_WRITE(sc, WMREG_RDBAH, WM_CDRXADDR_HI(sc, 0));
 		CSR_WRITE(sc, WMREG_RDBAL, WM_CDRXADDR_LO(sc, 0));
 		CSR_WRITE(sc, WMREG_RDLEN, sizeof(sc->sc_rxdescs));
-		CSR_WRITE(sc, WMREG_RDH, 0);
-		CSR_WRITE(sc, WMREG_RDT, 0);
-		CSR_WRITE(sc, WMREG_RDTR, 375 | RDTR_FPD);	/* ITR/4 */
-		CSR_WRITE(sc, WMREG_RADV, 375);		/* MUST be same */
+		if (sc->sc_type >= WM_T_82575) {
+			/* setup interupt moderation for the all used interrupt queues ... */
+			CSR_WRITE(sc, WMREG_EITR(0), 450); /* default igb_ave_latency from freebsd-driver ... - not shure if this makes any sence */
+			if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1))
+				panic("wm_init: MCLBYTES %d unsupported for 82575", MCLBYTES);
+			CSR_WRITE(sc, WMREG_SRRCTL, SRRCTL_DESCTYPE_LEGACY | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT));
+#if 1 /* values from freebsd - not shure if they are good ... */
+			CSR_WRITE(sc, WMREG_RXDCTL, RXDCTL_QUEUE_ENABLE | RXDCTL_PTHRESH(16) |
+			    RXDCTL_HTHRESH(8) | RXDCTL_WTHRESH(1));
+#else
+			CSR_WRITE(sc, WMREG_RXDCTL, RXDCTL_QUEUE_ENABLE | RXDCTL_PTHRESH(0) |
+			    RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
+#endif
+		} else { /* some registers that are no longer present, have different semantics or must be set later on 82575 and later ... */
+			CSR_WRITE(sc, WMREG_RDH, 0);
+			CSR_WRITE(sc, WMREG_RDT, 0);
+			CSR_WRITE(sc, WMREG_RDTR, 375 | RDTR_FPD);	/* ITR/4 */
+			CSR_WRITE(sc, WMREG_RADV, 375);		/* MUST be same */
+		}
 	}
 	for (i = 0; i < WM_NRXDESC; i++) {
 		rxs = &sc->sc_rxsoft[i];
@@ -3288,7 +3398,7 @@
 				wm_rxdrain(sc);
 				goto out;
 			}
-		} else
+		} else if (sc->sc_type < WM_T_82575) /* need to enable reciever prior setting RDT on 82575 and later */
 			WM_INIT_RXDESC(sc, i);
 	}
 	sc->sc_rxptr = 0;
@@ -3331,7 +3441,8 @@

 	/* Write the control registers. */
 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
-	if (sc->sc_type >= WM_T_80003 && (sc->sc_flags & WM_F_HAS_MII)) {
+	if (sc->sc_type>= WM_T_82575) { /* cannot fill in RDT - even if the EN-bit is set in RXDCTL, it is ignored until EN in RCTL is set ... */
+	} else if (sc->sc_type >= WM_T_80003 && (sc->sc_flags & WM_F_HAS_MII)) {
 		int val;
 		val = CSR_READ(sc, WMREG_CTRL_EXT);
 		val &= ~CTRL_EXT_LINK_MODE_MASK;
@@ -3424,6 +3535,7 @@
 	    TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
 	if (sc->sc_type >= WM_T_82571)
 		sc->sc_tctl |= TCTL_MULR;
+/* XXXX - order of WM_T_xxxx entries - the 82575 falls in here - this is correct here - freebsd-driver does it too ... */
 	if (sc->sc_type >= WM_T_80003)
 		sc->sc_tctl |= TCTL_RTLC;
 	CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
@@ -3443,8 +3555,12 @@
 	sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF
 	    | RCTL_MO(sc->sc_mchash_type);

+	if (sc->sc_type >= WM_T_82575) {
+		sc->sc_rctl |= RCTL_LPE;
+		CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO);
+	}
 	/* 82573 doesn't support jumbo frame */
-	if (sc->sc_type != WM_T_82573 && sc->sc_type != WM_T_82574 &&
+	else if (sc->sc_type != WM_T_82573 && sc->sc_type != WM_T_82574 &&
 	    sc->sc_type != WM_T_ICH8)
 		sc->sc_rctl |= RCTL_LPE;

@@ -3472,6 +3588,11 @@

 	/* Set the receive filter. */
 	wm_set_filter(sc);
+	if (sc->sc_type>= WM_T_82575) { /* now fill in RDT - RCTL EN-bit has been set in the last function ... */
+		CSR_WRITE(sc, WMREG_RDH, 0); /* this is read-only on 82576, but freebsd driver write it too ... */
+		for (i = 0; i < WM_NRXDESC; i++)
+			WM_INIT_RXDESC(sc, i);
+	}

 	/* Start the one second link check clock. */
 	callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
@@ -3540,6 +3661,7 @@
 	/* Stop the transmit and receive processes. */
 	CSR_WRITE(sc, WMREG_TCTL, 0);
 	CSR_WRITE(sc, WMREG_RCTL, 0);
+	sc->sc_rctl &= ~RCTL_EN; /* clear EN bit again - needed for 82575 and later */

 	/*
 	 * Clear the interrupt mask to ensure the device cannot assert its
@@ -3583,6 +3705,7 @@
 	case WM_T_ICH8:
 	case WM_T_ICH9:
 	case WM_T_ICH10:
+	case WM_T_82575:
 		for (i = 10; i > 0; i--) {
 			if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD)
 				break;
@@ -3599,7 +3722,8 @@
 	}

 	/* Phy configuration starts after EECD_AUTO_RD is set */
-	if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574)
+/* XXXX - should the 82575 go here too ? - added for security reasons ... */
+	if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82575)
 		delay(25000);
 }

@@ -3996,7 +4120,9 @@
 	bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
 	    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);

-	WM_INIT_RXDESC(sc, idx);
+	if (sc->sc_type < WM_T_82575 || (sc->sc_rctl & RCTL_EN)) { /* on 575 and later set RDT only if RX enabled... */
+		WM_INIT_RXDESC(sc, idx);
+	}

 	return (0);
 }
@@ -4463,7 +4589,7 @@
 			return;
 		}
 	}
-	if (sc->sc_type == WM_T_80003) {
+	if (sc->sc_type == WM_T_80003 || sc->sc_type == WM_T_82575) {  /* XXXXX is this OK ??? - looks good to me */
 		func = (CSR_READ(sc, WMREG_STATUS) >> STATUS_FUNCID_SHIFT) & 1;
 		if (wm_get_swfw_semaphore(sc,
 		    func ? SWFW_PHY1_SM : SWFW_PHY0_SM)) {
@@ -4508,7 +4634,7 @@
 	if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
 	    || (sc->sc_type == WM_T_ICH10))
 		wm_put_swfwhw_semaphore(sc);
-	if (sc->sc_type == WM_T_80003)
+	if (sc->sc_type == WM_T_80003 || sc->sc_type == WM_T_82575) /* XXXXX see above ... */
 		wm_put_swfw_semaphore(sc, func ? SWFW_PHY1_SM : SWFW_PHY0_SM);
 }

@@ -4525,7 +4651,9 @@
 	/* We have MII. */
 	sc->sc_flags |= WM_F_HAS_MII;

-	if (sc->sc_type >= WM_T_80003)
+	if (sc->sc_type >= WM_T_82575) /* XXXX free bsd-driver sets normal default values here - but it does it for ich-chips too ... */
+		sc->sc_tipg = TIPG_1000T_DFLT;
+	else if (sc->sc_type >= WM_T_80003)
 		sc->sc_tipg =  TIPG_1000T_80003_DFLT;
 	else
 		sc->sc_tipg = TIPG_1000T_DFLT;
@@ -4545,6 +4673,9 @@
 	if (sc->sc_type == WM_T_ICH10) {
 		sc->sc_mii.mii_readreg = wm_gmii_bm_readreg;
 		sc->sc_mii.mii_writereg = wm_gmii_bm_writereg;
+	} else if (sc->sc_type >= WM_T_82575) {
+		sc->sc_mii.mii_readreg = wm_gmii_i82575_readreg;
+		sc->sc_mii.mii_writereg = wm_gmii_i82575_writereg;
 	} else if (sc->sc_type >= WM_T_80003) {
 		sc->sc_mii.mii_readreg = wm_gmii_i80003_readreg;
 		sc->sc_mii.mii_writereg = wm_gmii_i80003_writereg;
@@ -4812,6 +4943,91 @@
 }

 /*
+ * wm_gmii_i82575_readreg:	[mii interface function]
+ *
+ *	Read a PHY register on the GMII.
+ */
+static int
+wm_gmii_i82575_readreg(struct device *self, int phy, int reg)
+{
+	struct wm_softc *sc = (void *) self;
+	uint32_t mdic = 0;
+	int i, rv;
+	int func = ((CSR_READ(sc, WMREG_STATUS) >> STATUS_FUNCID_SHIFT) & 1);
+
+	if (wm_get_swfw_semaphore(sc, func ? SWFW_PHY1_SM : SWFW_PHY0_SM)) {
+		aprint_error("%s: failed to get semaphore\n", sc->sc_dev.dv_xname);
+		return 0;
+	}
+
+	CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) |
+	    MDIC_REGADD(reg));
+
+	for (i = 0; i < 320; i++) {
+		mdic = CSR_READ(sc, WMREG_MDIC);
+		if (mdic & MDIC_READY)
+			break;
+		delay(10);
+	}
+
+	if ((mdic & MDIC_READY) == 0) {
+		log(LOG_WARNING, "%s: MDIC read timed out: phy %d reg %d\n",
+		    sc->sc_dev.dv_xname, phy, reg);
+		rv = 0;
+	} else if (mdic & MDIC_E) {
+#if 0 /* This is normal if no PHY is present. */
+		log(LOG_WARNING, "%s: MDIC read error: phy %d reg %d\n",
+		    sc->sc_dev.dv_xname, phy, reg);
+#endif
+		rv = 0;
+	} else {
+		rv = MDIC_DATA(mdic);
+		if (rv == 0xffff)
+			rv = 0;
+	}
+
+	wm_put_swfw_semaphore(sc, func ? SWFW_PHY1_SM : SWFW_PHY0_SM);
+	return (rv);
+}
+
+/*
+ * wm_gmii_i82575_writereg:	[mii interface function]
+ *
+ *	Write a PHY register on the GMII.
+ */
+static void
+wm_gmii_i82575_writereg(struct device *self, int phy, int reg, int val)
+{
+	struct wm_softc *sc = (void *) self;
+	uint32_t mdic = 0;
+	int i;
+	int func = ((CSR_READ(sc, WMREG_STATUS) >> STATUS_FUNCID_SHIFT) & 1);
+
+	if (wm_get_swfw_semaphore(sc, func ? SWFW_PHY1_SM : SWFW_PHY0_SM)) {
+		aprint_error("%s: failed to get semaphore\n", sc->sc_dev.dv_xname);
+		return;
+	}
+
+	CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) |
+	    MDIC_REGADD(reg) | MDIC_DATA(val));
+
+	for (i = 0; i < 320; i++) {
+		mdic = CSR_READ(sc, WMREG_MDIC);
+		if (mdic & MDIC_READY)
+			break;
+		delay(10);
+	}
+
+	if ((mdic & MDIC_READY) == 0)
+		log(LOG_WARNING, "%s: MDIC write timed out: phy %d reg %d\n",
+		    sc->sc_dev.dv_xname, phy, reg);
+	else if (mdic & MDIC_E)
+		log(LOG_WARNING, "%s: MDIC write error: phy %d reg %d\n",
+		    sc->sc_dev.dv_xname, phy, reg);
+	wm_put_swfw_semaphore(sc, func ? SWFW_PHY1_SM : SWFW_PHY0_SM);
+}
+
+/*
  * wm_gmii_i80003_readreg:	[mii interface function]
  *
  *	Read a PHY register on the kumeran
@@ -5511,6 +5727,7 @@
 	case WM_T_82572:
 	case WM_T_82573:
 	case WM_T_80003:
+	case WM_T_82575:
 		rv = wm_check_mng_mode_generic(sc);
 		break;
 	default:
@@ -5586,6 +5803,7 @@
 	case WM_T_ICH8:
 	case WM_T_ICH9:
 	case WM_T_ICH10:
+	case WM_T_82575:
 		reg = CSR_READ(sc, WMREG_CTRL_EXT);
 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD);
 		break;

>Release-Note:

>Audit-Trail:
From: SAITOH Masanobu <msaitoh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/42422 CVS commit: src/sys/dev/pci
Date: Tue, 29 Dec 2009 16:01:22 +0000

 Module Name:	src
 Committed By:	msaitoh
 Date:		Tue Dec 29 16:01:22 UTC 2009

 Modified Files:
 	src/sys/dev/pci: if_wm.c if_wmreg.h if_wmvar.h

 Log Message:
 - Fix an incorrect test for WM_F_EEPROM_INALID since rev. 1.183. Some old
   chips don't set EECD_EE_PRES.
 - Fix a bug that WM_F_EEPROM_SPI and WM_F_FLASH are set.
 - Add an missing decrement for a timeout reported by Wolfgang Stukenbrock
   in PR#42422.
 - Add support for i82583V.
 - PBA setting for i82574 is not 12K but 20K.
 - Enable checking the management mode on 82574.


 To generate a diff of this commit:
 cvs rdiff -u -r1.184 -r1.185 src/sys/dev/pci/if_wm.c
 cvs rdiff -u -r1.28 -r1.29 src/sys/dev/pci/if_wmreg.h
 cvs rdiff -u -r1.4 -r1.5 src/sys/dev/pci/if_wmvar.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: Stephen Borrill <sborrill@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/42422 CVS commit: [netbsd-5] src/sys/dev/pci
Date: Wed, 27 Jan 2010 22:27:51 +0000

 Module Name:	src
 Committed By:	sborrill
 Date:		Wed Jan 27 22:27:47 UTC 2010

 Modified Files:
 	src/sys/dev/pci [netbsd-5]: if_wm.c if_wmreg.h if_wmvar.h pcidevs
 	    pcidevs.h pcidevs_data.h

 Log Message:
 Pull up the following revisions(s) (requested by msaitoh in ticket #1277):
 sys/dev/pci/if_wm.c		1.184-1.194
 sys/dev/pci/if_wmreg.h		1.29-1.35
 sys/dev/pci/if_wmvar.h		1.5-1.8
 sys/dev/pci/pcidevs		1.1006,1.1009-1.1010, 1.1012-1.1013 via patch
 sys/dev/pci/pcidevs.h		regen
 sys/dev/pci/pcidevs_data.h	regen
 sys/dev/mii/igphyreg.h		1.5
 sys/dev/mii/inbmphyreg.h	1.1

 - Add support for i82583V.
 - Add some ICH9 and ICH10 devices.
 - Add support for PCH.
 - Fix the bug that ICH9 can't found a PHY. Fixes PR#42237
 - Fix an incorrect test for WM_F_EEPROM_INVALID since rev. 1.183. Some old
   chips don't set EECD_EE_PRES.
 - Fix a bug that both WM_F_EEPROM_SPI and WM_F_EEPROM_FLASH are set.
 - Add a missing decrement for a timeout reported by Wolfgang Stukenbrock
   in PR#42422.
 - PBA setting for i82574 is not 12K but 20K.
 - Enable checking the management mode on 82574.
 - Fix the length of the delay() in wm_gmii_reset(). It fixed the problem that
   sometimes the driver misunderstood PHYs in mii_attach(). It was reported
   by MATSUI Yoshihiro. We observed it on ICH9.
 - Fix the checking of jumbo frame function
 - Remove the extra macro definition for the offset 0x1a in EEPROM.
 - Add missing break in wm_reset()...
 - Fix the offset of WMREG_PBS...
 - Make wm_reset() and wm_gmii_reset() close to e1000 driver.
   At least, this change make wm_attach() stable on ICH9.
 - Reset GMII interface after wm_reset() in wm_init().
 - Rework for assigning mii_{read,write}reg(). Use PCI product ID to identify
   the PHY.
 - Add code about LPLU(Low Power Link Up) function. It seems that we have to
   do the same work for ICH9.
 - Fixes the rx stall problem on 82578 by MANY workaround code. We need more
   work for 82577.


 To generate a diff of this commit:
 cvs rdiff -u -r1.162.4.11 -r1.162.4.12 src/sys/dev/pci/if_wm.c
 cvs rdiff -u -r1.24.20.3 -r1.24.20.4 src/sys/dev/pci/if_wmreg.h
 cvs rdiff -u -r1.2.46.1 -r1.2.46.2 src/sys/dev/pci/if_wmvar.h
 cvs rdiff -u -r1.962.4.9 -r1.962.4.10 src/sys/dev/pci/pcidevs \
     src/sys/dev/pci/pcidevs_data.h
 cvs rdiff -u -r1.963.4.9 -r1.963.4.10 src/sys/dev/pci/pcidevs.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: Stephen Borrill <sborrill@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/42422 CVS commit: [netbsd-5] src/sys/dev
Date: Wed, 27 Jan 2010 23:34:56 +0000

 Module Name:	src
 Committed By:	sborrill
 Date:		Wed Jan 27 23:34:52 UTC 2010

 Modified Files:
 	src/sys/dev/mii [netbsd-5]: igphyreg.h
 	src/sys/dev/pci [netbsd-5]: if_wm.c if_wmreg.h if_wmvar.h pcidevs
 	    pcidevs.h pcidevs_data.h
 Added Files:
 	src/sys/dev/mii [netbsd-5]: inbmphyreg.h

 Log Message:
 Pull up the following revisions(s) (requested by msaitoh in ticket #1277):
 sys/dev/pci/if_wm.c		1.184-1.194
 sys/dev/pci/if_wmreg.h		1.29-1.35
 sys/dev/pci/if_wmvar.h		1.5-1.8
 sys/dev/pci/pcidevs		1.1006,1.1009-1.1010, 1.1012-1.1013 via patch
 sys/dev/pci/pcidevs.h		regen
 sys/dev/pci/pcidevs_data.h	regen
 sys/dev/mii/igphyreg.h		1.5
 sys/dev/mii/inbmphyreg.h	1.1

 - Add support for i82583V.
 - Add some ICH9 and ICH10 devices.
 - Add support for PCH.
 - Fix the bug that ICH9 can't found a PHY. Fixes PR#42237
 - Fix an incorrect test for WM_F_EEPROM_INVALID since rev. 1.183. Some old
   chips don't set EECD_EE_PRES.
 - Fix a bug that both WM_F_EEPROM_SPI and WM_F_EEPROM_FLASH are set.
 - Add a missing decrement for a timeout reported by Wolfgang Stukenbrock
   in PR#42422.
 - PBA setting for i82574 is not 12K but 20K.
 - Enable checking the management mode on 82574.
 - Fix the length of the delay() in wm_gmii_reset(). It fixed the problem that
   sometimes the driver misunderstood PHYs in mii_attach(). It was reported
   by MATSUI Yoshihiro. We observed it on ICH9.
 - Fix the checking of jumbo frame function
 - Remove the extra macro definition for the offset 0x1a in EEPROM.
 - Add missing break in wm_reset()...
 - Fix the offset of WMREG_PBS...
 - Make wm_reset() and wm_gmii_reset() close to e1000 driver.
   At least, this change make wm_attach() stable on ICH9.
 - Reset GMII interface after wm_reset() in wm_init().
 - Rework for assigning mii_{read,write}reg(). Use PCI product ID to identify
   the PHY.
 - Add code about LPLU(Low Power Link Up) function. It seems that we have to
   do the same work for ICH9.
 - Fixes the rx stall problem on 82578 by MANY workaround code. We need more
   work for 82577.


 To generate a diff of this commit:
 cvs rdiff -u -r1.4 -r1.4.86.1 src/sys/dev/mii/igphyreg.h
 cvs rdiff -u -r0 -r1.1.2.2 src/sys/dev/mii/inbmphyreg.h
 cvs rdiff -u -r1.162.4.11 -r1.162.4.12 src/sys/dev/pci/if_wm.c
 cvs rdiff -u -r1.24.20.3 -r1.24.20.4 src/sys/dev/pci/if_wmreg.h
 cvs rdiff -u -r1.2.46.1 -r1.2.46.2 src/sys/dev/pci/if_wmvar.h
 cvs rdiff -u -r1.962.4.9 -r1.962.4.10 src/sys/dev/pci/pcidevs \
     src/sys/dev/pci/pcidevs_data.h
 cvs rdiff -u -r1.963.4.9 -r1.963.4.10 src/sys/dev/pci/pcidevs.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: SAITOH Masanobu <msaitoh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/42422 CVS commit: src/sys/dev/pci
Date: Tue, 16 Feb 2010 15:17:18 +0000

 Module Name:	src
 Committed By:	msaitoh
 Date:		Tue Feb 16 15:17:18 UTC 2010

 Modified Files:
 	src/sys/dev/pci: if_wm.c if_wmreg.h if_wmvar.h

 Log Message:
 Add support for 82575, 82576 and 82580(ER).
 - Apply the patch for 82575 from Wolfgang Stukenbrock (PR#42422). We use
   only one RX ring and with the legacy mode.
 - Add support for 82576.
 - Partial support for 82580.
 - Partial support for the serdes systems.


 To generate a diff of this commit:
 cvs rdiff -u -r1.198 -r1.199 src/sys/dev/pci/if_wm.c
 cvs rdiff -u -r1.37 -r1.38 src/sys/dev/pci/if_wmreg.h
 cvs rdiff -u -r1.8 -r1.9 src/sys/dev/pci/if_wmvar.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: Wolfgang Stukenbrock <Wolfgang.Stukenbrock@nagler-company.com>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: PR/42422 CVS commit: src/sys/dev/pci
Date: Fri, 09 Jul 2010 12:47:54 +0200

 Hi saitoh,

 I would like to give you a short feedback to the changes of this old report.

 It works fine (5.0.2) on our systems with the 82575.
 I've found the time to test it on the HW now.

 Best regards

 W. Stukenbrock

 SAITOH Masanobu wrote:

 > The following reply was made to PR kern/42422; it has been noted by GNATS.
 > 
 > From: SAITOH Masanobu <msaitoh@netbsd.org>
 > To: gnats-bugs@gnats.NetBSD.org
 > Cc: 
 > Subject: PR/42422 CVS commit: src/sys/dev/pci
 > Date: Tue, 16 Feb 2010 15:17:18 +0000
 > 
 >  Module Name:	src
 >  Committed By:	msaitoh
 >  Date:		Tue Feb 16 15:17:18 UTC 2010
 >  
 >  Modified Files:
 >  	src/sys/dev/pci: if_wm.c if_wmreg.h if_wmvar.h
 >  
 >  Log Message:
 >  Add support for 82575, 82576 and 82580(ER).
 >  - Apply the patch for 82575 from Wolfgang Stukenbrock (PR#42422). We use
 >    only one RX ring and with the legacy mode.
 >  - Add support for 82576.
 >  - Partial support for 82580.
 >  - Partial support for the serdes systems.
 >  
 >  
 >  To generate a diff of this commit:
 >  cvs rdiff -u -r1.198 -r1.199 src/sys/dev/pci/if_wm.c
 >  cvs rdiff -u -r1.37 -r1.38 src/sys/dev/pci/if_wmreg.h
 >  cvs rdiff -u -r1.8 -r1.9 src/sys/dev/pci/if_wmvar.h
 >  
 >  Please note that diffs are not public domain; they are subject to the
 >  copyright notices on the relevant files.
 >  
 > 


State-Changed-From-To: open->closed
State-Changed-By: dholland@NetBSD.org
State-Changed-When: Sat, 10 Jul 2010 23:07:44 +0000
State-Changed-Why:
Confirmed working in -5. Thanks for checking and getting back to us...


From: "Jeff Rizzo" <riz@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/42422 CVS commit: [netbsd-5] src/sys/dev
Date: Fri, 19 Nov 2010 23:40:29 +0000

 Module Name:	src
 Committed By:	riz
 Date:		Fri Nov 19 23:40:29 UTC 2010

 Modified Files:
 	src/sys/dev/mii [netbsd-5]: igphy.c inbmphyreg.h
 	src/sys/dev/pci [netbsd-5]: if_wm.c if_wmreg.h if_wmvar.h pcidevs
 	    pcireg.h
 Added Files:
 	src/sys/dev/mii [netbsd-5]: igphyvar.h

 Log Message:
 Pull up revisions (requested by msaitoh in ticket #1358):
 	sys/dev/pci/if_wm.c		1.196-1.199,1.202,1.205
 	sys/dev/pci/if_wmvar.h		1.9
 	sys/dev/pci/if_wmreg.h		1.36-1.39
 	sys/dev/pci/pcireg.h		1.61-1.64
 	sys/dev/pci/pcidevs		1.1023
 	sys/dev/pci/pcidevs.h		regen
 	sys/dev/pci/pcidevs_data.h	regen
 	mii/igphy.c			1.21
 	mii/igphyvar.h			1.1
 	mii/inbmphyreg.h		1.2

 - Count Receive error, CRC error, Alignment error, Symbol error, Sequence
   error, Carrier extension error and Receive length error into ierror.
   Fixes PR#30349 reported by UMEZAWA Takeshi.
 - Add support for 82575, 82576 and 82580(ER).
   - Apply the patch for 82575 from Wolfgang Stukenbrock (PR#42422). We use
     only one RX ring and with the legacy mode.
   - Add support for 82576.
   - Partial support for 82580.
   - Partial support for the serdes systems.
 - Add two workarounds for ICH8 with igp3.
   - Workaround for 82566 Kumeran PCS lock loss.
   - WOL from S5 stops working.
 - (pcireg.h) Add PCIe config register definitions.
 - Note that the changes to count Missed packet (rx fifo overflow) and Receive
   no buffers (rx ring full) into iqdrops in rev. 1.196 of if_wm.c is not
   pulled up.


 To generate a diff of this commit:
 cvs rdiff -u -r1.16.10.1 -r1.16.10.2 src/sys/dev/mii/igphy.c
 cvs rdiff -u -r0 -r1.1.8.2 src/sys/dev/mii/igphyvar.h
 cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/dev/mii/inbmphyreg.h
 cvs rdiff -u -r1.162.4.13 -r1.162.4.14 src/sys/dev/pci/if_wm.c
 cvs rdiff -u -r1.24.20.4 -r1.24.20.5 src/sys/dev/pci/if_wmreg.h
 cvs rdiff -u -r1.2.46.3 -r1.2.46.4 src/sys/dev/pci/if_wmvar.h
 cvs rdiff -u -r1.962.4.11 -r1.962.4.12 src/sys/dev/pci/pcidevs
 cvs rdiff -u -r1.57 -r1.57.20.1 src/sys/dev/pci/pcireg.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.