From nobody@FreeBSD.org  Sat May 28 11:07:31 2011
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 965B5106566B
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 28 May 2011 11:07:31 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 862A18FC0C
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 28 May 2011 11:07:31 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id p4SB7UNZ012250
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 28 May 2011 11:07:30 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id p4SB7U7D012249;
	Sat, 28 May 2011 11:07:30 GMT
	(envelope-from nobody)
Message-Id: <201105281107.p4SB7U7D012249@red.freebsd.org>
Date: Sat, 28 May 2011 11:07:30 GMT
From: cumay <164837122@qq.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: fxp.ich.patch
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         157378
>Category:       i386
>Synopsis:       fxp.ich.patch
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-i386
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat May 28 11:10:09 UTC 2011
>Closed-Date:    Sat May 28 11:42:26 UTC 2011
>Last-Modified:  Sun May 29 23:36:39 UTC 2011
>Originator:     cumay
>Release:        freebsd 4.11
>Organization:
no
>Environment:
freebsd 4.11
>Description:
I got a patch fxp.ich.patch whitch can fix this problem .but it can't be used for freebsd 4.11.  badlly expecting freebsd team can modify fxp.ich.patch for freebsd 4.11.

I like 4.11 very much. 
Thanks for your great help.
>How-To-Repeat:
I got a patch fxp.ich.patch whitch can fix this problem .but it can't be used for freebsd 4.11.  badlly expecting freebsd team can modify fxp.ich.patch for freebsd 4.11.

I like 4.11 very much. 
Thanks for your great help.
>Fix:


Patch attached with submission follows:

Index: sys/dev/fxp/if_fxpvar.h
===================================================================
--- sys/dev/fxp/if_fxpvar.h	(revision 194231)
+++ sys/dev/fxp/if_fxpvar.h	(working copy)
@@ -142,6 +142,13 @@
 	bus_dma_tag_t rx_tag;
 };
 
+struct fxp_ident {
+	uint16_t	devid;
+	int16_t		revid;		/* -1 matches anything */
+	uint8_t		ich;
+	char 		*name;
+};
+
 /*
  * NOTE: Elements are ordered for optimal cacheline behavior, and NOT
  *	 for functional grouping.
@@ -151,8 +158,10 @@
 	struct resource	*fxp_res[2];	/* I/O and IRQ resources */
 	struct resource_spec *fxp_spec;	/* the resource spec we used */
 	void *ih;			/* interrupt handler cookie */
+	struct fxp_ident *ident;
 	struct mtx sc_mtx;
-	bus_dma_tag_t fxp_mtag;		/* bus DMA tag for mbufs */
+	bus_dma_tag_t fxp_txmtag;	/* bus DMA tag for Tx mbufs */
+	bus_dma_tag_t fxp_rxmtag;	/* bus DMA tag for Rx mbufs */
 	bus_dma_tag_t fxp_stag;		/* bus DMA tag for stats */
 	bus_dmamap_t fxp_smap;		/* bus DMA map for stats */
 	bus_dma_tag_t cbl_tag;		/* DMA tag for the TxCB list */
@@ -164,7 +173,6 @@
 	int maxtxseg;			/* maximum # of TX segments */
 	int maxsegsize;			/* maximum size of a TX segment */
 	int tx_queued;			/* # of active TxCB's */
-	int need_mcsetup;		/* multicast filter needs programming */
 	struct fxp_stats *fxp_stats;	/* Pointer to interface stats */
 	uint32_t stats_addr;		/* DMA address of the stats structure */
 	int rx_idle_secs;		/* # of seconds RX has been idle */
@@ -184,6 +192,7 @@
 	int cu_resume_bug;
 	int revision;
 	int flags;
+	int if_flags;
 	uint8_t rfa_size;
 	uint32_t tx_cmd;
 };
@@ -194,7 +203,6 @@
 #define FXP_FLAG_EXT_TXCB	0x0008	/* enable use of extended TXCB */
 #define FXP_FLAG_SERIAL_MEDIA	0x0010	/* 10Mbps serial interface */
 #define FXP_FLAG_LONG_PKT_EN	0x0020	/* enable long packet reception */
-#define FXP_FLAG_ALL_MCAST	0x0040	/* accept all multicast frames */
 #define FXP_FLAG_CU_RESUME_BUG	0x0080	/* requires workaround for CU_RESUME */
 #define FXP_FLAG_UCODE		0x0100	/* ucode is loaded */
 #define FXP_FLAG_DEFERRED_RNR	0x0200	/* DEVICE_POLLING deferred RNR */
@@ -203,6 +211,7 @@
 #define FXP_FLAG_82559_RXCSUM	0x1000	/* 82559 compatible RX checksum */
 #define FXP_FLAG_WOLCAP		0x2000	/* WOL capability */
 #define FXP_FLAG_WOL		0x4000	/* WOL active */
+#define FXP_FLAG_RXBUG		0x8000	/* Rx lock-up bug */
 
 /* Macros to ease CSR access. */
 #define	CSR_READ_1(sc, reg)		bus_read_1(sc->fxp_res[0], reg)
Index: sys/dev/fxp/if_fxp.c
===================================================================
--- sys/dev/fxp/if_fxp.c	(revision 194231)
+++ sys/dev/fxp/if_fxp.c	(working copy)
@@ -140,12 +140,6 @@
 	0x5	/* 21 */
 };
 
-struct fxp_ident {
-	uint16_t	devid;
-	int16_t		revid;		/* -1 matches anything */
-	char 		*name;
-};
-
 /*
  * Claim various Intel PCI device identifiers for this driver.  The
  * sub-vendor and sub-device field are extensively used to identify
@@ -153,52 +147,52 @@
  * them.
  */
 static struct fxp_ident fxp_ident_table[] = {
-    { 0x1029,	-1,	"Intel 82559 PCI/CardBus Pro/100" },
-    { 0x1030,	-1,	"Intel 82559 Pro/100 Ethernet" },
-    { 0x1031,	-1,	"Intel 82801CAM (ICH3) Pro/100 VE Ethernet" },
-    { 0x1032,	-1,	"Intel 82801CAM (ICH3) Pro/100 VE Ethernet" },
-    { 0x1033,	-1,	"Intel 82801CAM (ICH3) Pro/100 VM Ethernet" },
-    { 0x1034,	-1,	"Intel 82801CAM (ICH3) Pro/100 VM Ethernet" },
-    { 0x1035,	-1,	"Intel 82801CAM (ICH3) Pro/100 Ethernet" },
-    { 0x1036,	-1,	"Intel 82801CAM (ICH3) Pro/100 Ethernet" },
-    { 0x1037,	-1,	"Intel 82801CAM (ICH3) Pro/100 Ethernet" },
-    { 0x1038,	-1,	"Intel 82801CAM (ICH3) Pro/100 VM Ethernet" },
-    { 0x1039,	-1,	"Intel 82801DB (ICH4) Pro/100 VE Ethernet" },
-    { 0x103A,	-1,	"Intel 82801DB (ICH4) Pro/100 Ethernet" },
-    { 0x103B,	-1,	"Intel 82801DB (ICH4) Pro/100 VM Ethernet" },
-    { 0x103C,	-1,	"Intel 82801DB (ICH4) Pro/100 Ethernet" },
-    { 0x103D,	-1,	"Intel 82801DB (ICH4) Pro/100 VE Ethernet" },
-    { 0x103E,	-1,	"Intel 82801DB (ICH4) Pro/100 VM Ethernet" },
-    { 0x1050,	-1,	"Intel 82801BA (D865) Pro/100 VE Ethernet" },
-    { 0x1051,	-1,	"Intel 82562ET (ICH5/ICH5R) Pro/100 VE Ethernet" },
-    { 0x1059,	-1,	"Intel 82551QM Pro/100 M Mobile Connection" },
-    { 0x1064,	-1,	"Intel 82562EZ (ICH6)" },
-    { 0x1065,	-1,	"Intel 82562ET/EZ/GT/GZ PRO/100 VE Ethernet" },
-    { 0x1068,	-1,	"Intel 82801FBM (ICH6-M) Pro/100 VE Ethernet" },
-    { 0x1069,	-1,	"Intel 82562EM/EX/GX Pro/100 Ethernet" },
-    { 0x1091,	-1,	"Intel 82562GX Pro/100 Ethernet" },
-    { 0x1092,	-1,	"Intel Pro/100 VE Network Connection" },
-    { 0x1093,	-1,	"Intel Pro/100 VM Network Connection" },
-    { 0x1094,	-1,	"Intel Pro/100 946GZ (ICH7) Network Connection" },
-    { 0x1209,	-1,	"Intel 82559ER Embedded 10/100 Ethernet" },
-    { 0x1229,	0x01,	"Intel 82557 Pro/100 Ethernet" },
-    { 0x1229,	0x02,	"Intel 82557 Pro/100 Ethernet" },
-    { 0x1229,	0x03,	"Intel 82557 Pro/100 Ethernet" },
-    { 0x1229,	0x04,	"Intel 82558 Pro/100 Ethernet" },
-    { 0x1229,	0x05,	"Intel 82558 Pro/100 Ethernet" },
-    { 0x1229,	0x06,	"Intel 82559 Pro/100 Ethernet" },
-    { 0x1229,	0x07,	"Intel 82559 Pro/100 Ethernet" },
-    { 0x1229,	0x08,	"Intel 82559 Pro/100 Ethernet" },
-    { 0x1229,	0x09,	"Intel 82559ER Pro/100 Ethernet" },
-    { 0x1229,	0x0c,	"Intel 82550 Pro/100 Ethernet" },
-    { 0x1229,	0x0d,	"Intel 82550 Pro/100 Ethernet" },
-    { 0x1229,	0x0e,	"Intel 82550 Pro/100 Ethernet" },
-    { 0x1229,	0x0f,	"Intel 82551 Pro/100 Ethernet" },
-    { 0x1229,	0x10,	"Intel 82551 Pro/100 Ethernet" },
-    { 0x1229,	-1,	"Intel 82557/8/9 Pro/100 Ethernet" },
-    { 0x2449,	-1,	"Intel 82801BA/CAM (ICH2/3) Pro/100 Ethernet" },
-    { 0x27dc,	-1,	"Intel 82801GB (ICH7) 10/100 Ethernet" },
-    { 0,	-1,	NULL },
+    { 0x1029,	-1,	0, "Intel 82559 PCI/CardBus Pro/100" },
+    { 0x1030,	-1,	0, "Intel 82559 Pro/100 Ethernet" },
+    { 0x1031,	-1,	3, "Intel 82801CAM (ICH3) Pro/100 VE Ethernet" },
+    { 0x1032,	-1,	3, "Intel 82801CAM (ICH3) Pro/100 VE Ethernet" },
+    { 0x1033,	-1,	3, "Intel 82801CAM (ICH3) Pro/100 VM Ethernet" },
+    { 0x1034,	-1,	3, "Intel 82801CAM (ICH3) Pro/100 VM Ethernet" },
+    { 0x1035,	-1,	3, "Intel 82801CAM (ICH3) Pro/100 Ethernet" },
+    { 0x1036,	-1,	3, "Intel 82801CAM (ICH3) Pro/100 Ethernet" },
+    { 0x1037,	-1,	3, "Intel 82801CAM (ICH3) Pro/100 Ethernet" },
+    { 0x1038,	-1,	3, "Intel 82801CAM (ICH3) Pro/100 VM Ethernet" },
+    { 0x1039,	-1,	4, "Intel 82801DB (ICH4) Pro/100 VE Ethernet" },
+    { 0x103A,	-1,	4, "Intel 82801DB (ICH4) Pro/100 Ethernet" },
+    { 0x103B,	-1,	4, "Intel 82801DB (ICH4) Pro/100 VM Ethernet" },
+    { 0x103C,	-1,	4, "Intel 82801DB (ICH4) Pro/100 Ethernet" },
+    { 0x103D,	-1,	4, "Intel 82801DB (ICH4) Pro/100 VE Ethernet" },
+    { 0x103E,	-1,	4, "Intel 82801DB (ICH4) Pro/100 VM Ethernet" },
+    { 0x1050,	-1,	5, "Intel 82801BA (D865) Pro/100 VE Ethernet" },
+    { 0x1051,	-1,	5, "Intel 82562ET (ICH5/ICH5R) Pro/100 VE Ethernet" },
+    { 0x1059,	-1,	0, "Intel 82551QM Pro/100 M Mobile Connection" },
+    { 0x1064,	-1,	6, "Intel 82562EZ (ICH6)" },
+    { 0x1065,	-1,	6, "Intel 82562ET/EZ/GT/GZ PRO/100 VE Ethernet" },
+    { 0x1068,	-1,	6, "Intel 82801FBM (ICH6-M) Pro/100 VE Ethernet" },
+    { 0x1069,	-1,	6, "Intel 82562EM/EX/GX Pro/100 Ethernet" },
+    { 0x1091,	-1,	7, "Intel 82562GX Pro/100 Ethernet" },
+    { 0x1092,	-1,	7, "Intel Pro/100 VE Network Connection" },
+    { 0x1093,	-1,	7, "Intel Pro/100 VM Network Connection" },
+    { 0x1094,	-1,	7, "Intel Pro/100 946GZ (ICH7) Network Connection" },
+    { 0x1209,	-1,	0, "Intel 82559ER Embedded 10/100 Ethernet" },
+    { 0x1229,	0x01,	0, "Intel 82557 Pro/100 Ethernet" },
+    { 0x1229,	0x02,	0, "Intel 82557 Pro/100 Ethernet" },
+    { 0x1229,	0x03,	0, "Intel 82557 Pro/100 Ethernet" },
+    { 0x1229,	0x04,	0, "Intel 82558 Pro/100 Ethernet" },
+    { 0x1229,	0x05,	0, "Intel 82558 Pro/100 Ethernet" },
+    { 0x1229,	0x06,	0, "Intel 82559 Pro/100 Ethernet" },
+    { 0x1229,	0x07,	0, "Intel 82559 Pro/100 Ethernet" },
+    { 0x1229,	0x08,	0, "Intel 82559 Pro/100 Ethernet" },
+    { 0x1229,	0x09,	0, "Intel 82559ER Pro/100 Ethernet" },
+    { 0x1229,	0x0c,	0, "Intel 82550 Pro/100 Ethernet" },
+    { 0x1229,	0x0d,	0, "Intel 82550 Pro/100 Ethernet" },
+    { 0x1229,	0x0e,	0, "Intel 82550 Pro/100 Ethernet" },
+    { 0x1229,	0x0f,	0, "Intel 82551 Pro/100 Ethernet" },
+    { 0x1229,	0x10,	0, "Intel 82551 Pro/100 Ethernet" },
+    { 0x1229,	-1,	0, "Intel 82557/8/9 Pro/100 Ethernet" },
+    { 0x2449,	-1,	2, "Intel 82801BA/CAM (ICH2/3) Pro/100 Ethernet" },
+    { 0x27dc,	-1,	7, "Intel 82801GB (ICH7) 10/100 Ethernet" },
+    { 0,	-1,	0, NULL },
 };
 
 #ifdef FXP_IP_CSUM_WAR
@@ -214,6 +208,7 @@
 static int		fxp_suspend(device_t dev);
 static int		fxp_resume(device_t dev);
 
+static struct fxp_ident	*fxp_find_ident(device_t dev);
 static void		fxp_intr(void *xsc);
 static void		fxp_rxcsum(struct fxp_softc *sc, struct ifnet *ifp,
 			    struct mbuf *m, uint16_t status, int pos);
@@ -360,11 +355,8 @@
 		device_printf(sc->dev, "DMA timeout\n");
 }
 
-/*
- * Return identification string if this device is ours.
- */
-static int
-fxp_probe(device_t dev)
+static struct fxp_ident *
+fxp_find_ident(device_t dev)
 {
 	uint16_t devid;
 	uint8_t revid;
@@ -376,11 +368,26 @@
 		for (ident = fxp_ident_table; ident->name != NULL; ident++) {
 			if (ident->devid == devid &&
 			    (ident->revid == revid || ident->revid == -1)) {
-				device_set_desc(dev, ident->name);
-				return (BUS_PROBE_DEFAULT);
+				return (ident);
 			}
 		}
 	}
+	return (NULL);
+}
+
+/*
+ * Return identification string if this device is ours.
+ */
+static int
+fxp_probe(device_t dev)
+{
+	struct fxp_ident *ident;
+
+	ident = fxp_find_ident(dev);
+	if (ident != NULL) {
+		device_set_desc(dev, ident->name);
+		return (BUS_PROBE_DEFAULT);
+	}
 	return (ENXIO);
 }
 
@@ -466,10 +473,14 @@
 	}
 
 	/*
-	 * Reset to a stable state.
+	 * Put CU/RU idle state and prepare full reset.
 	 */
 	CSR_WRITE_4(sc, FXP_CSR_PORT, FXP_PORT_SELECTIVE_RESET);
 	DELAY(10);
+	/* Full reset and disable interrupts. */
+	CSR_WRITE_4(sc, FXP_CSR_PORT, FXP_PORT_SOFTWARE_RESET);
+	DELAY(10);
+	CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, FXP_SCB_INTR_DISABLE);
 
 	/*
 	 * Find out how large of an SEEPROM we have.
@@ -479,11 +490,17 @@
 	/*
 	 * Find out the chip revision; lump all 82557 revs together.
 	 */
-	fxp_read_eeprom(sc, &data, 5, 1);
-	if ((data >> 8) == 1)
-		sc->revision = FXP_REV_82557;
-	else
-		sc->revision = pci_get_revid(dev);
+	sc->ident = fxp_find_ident(dev);
+	if (sc->ident->ich > 0) {
+		/* Assume ICH controllers are 82559. */
+		sc->revision = FXP_REV_82559_A0;
+	} else {
+		fxp_read_eeprom(sc, &data, 5, 1);
+		if ((data >> 8) == 1)
+			sc->revision = FXP_REV_82557;
+		else
+			sc->revision = pci_get_revid(dev);
+	}
 
 	/*
 	 * Check availability of WOL. 82559ER does not support WOL.
@@ -496,6 +513,13 @@
 			sc->flags |= FXP_FLAG_WOLCAP;
 	}
 
+	/* Receiver lock-up workaround detection. */
+	fxp_read_eeprom(sc, &data, 3, 1);
+	if ((data & 0x03) != 0x03) {
+		sc->flags |= FXP_FLAG_RXBUG;
+		device_printf(dev, "Enabling Rx lock-up workaround\n");
+	}
+
 	/*
 	 * Determine whether we must use the 503 serial interface.
 	 */
@@ -549,9 +573,8 @@
 	 *
 	 * See Intel 82801BA/82801BAM Specification Update, Errata #30.
 	 */
-	i = pci_get_device(dev);
-	if (i == 0x2449 || (i > 0x1030 && i < 0x1039) ||
-	    sc->revision >= FXP_REV_82559_A0) {
+	if ((sc->ident->ich >= 2 && sc->ident->ich <= 3) ||
+	    (sc->ident->ich == 0 && sc->revision >= FXP_REV_82559_A0)) {
 		fxp_read_eeprom(sc, &data, 10, 1);
 		if (data & 0x02) {			/* STB enable */
 			uint16_t cksum;
@@ -642,29 +665,40 @@
 	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
 	    sc->maxsegsize * sc->maxtxseg + sizeof(struct ether_vlan_header),
 	    sc->maxtxseg, sc->maxsegsize, 0,
-	    busdma_lock_mutex, &Giant, &sc->fxp_mtag);
+	    busdma_lock_mutex, &Giant, &sc->fxp_txmtag);
 	if (error) {
-		device_printf(dev, "could not allocate dma tag\n");
+		device_printf(dev, "could not create TX DMA tag\n");
 		goto fail;
 	}
 
+	error = bus_dma_tag_create(bus_get_dma_tag(dev), 2, 0,
+	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
+	    MCLBYTES, 1, MCLBYTES, 0,
+	    busdma_lock_mutex, &Giant, &sc->fxp_rxmtag);
+	if (error) {
+		device_printf(dev, "could not create RX DMA tag\n");
+		goto fail;
+	}
+
 	error = bus_dma_tag_create(bus_get_dma_tag(dev), 4, 0,
 	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
 	    sizeof(struct fxp_stats), 1, sizeof(struct fxp_stats), 0,
 	    busdma_lock_mutex, &Giant, &sc->fxp_stag);
 	if (error) {
-		device_printf(dev, "could not allocate dma tag\n");
+		device_printf(dev, "could not create stats DMA tag\n");
 		goto fail;
 	}
 
 	error = bus_dmamem_alloc(sc->fxp_stag, (void **)&sc->fxp_stats,
 	    BUS_DMA_NOWAIT | BUS_DMA_ZERO, &sc->fxp_smap);
-	if (error)
+	if (error) {
+		device_printf(dev, "could not allocate stats DMA memory\n");
 		goto fail;
+	}
 	error = bus_dmamap_load(sc->fxp_stag, sc->fxp_smap, sc->fxp_stats,
 	    sizeof(struct fxp_stats), fxp_dma_map_addr, &sc->stats_addr, 0);
 	if (error) {
-		device_printf(dev, "could not map the stats buffer\n");
+		device_printf(dev, "could not load the stats DMA buffer\n");
 		goto fail;
 	}
 
@@ -673,20 +707,22 @@
 	    FXP_TXCB_SZ, 1, FXP_TXCB_SZ, 0,
 	    busdma_lock_mutex, &Giant, &sc->cbl_tag);
 	if (error) {
-		device_printf(dev, "could not allocate dma tag\n");
+		device_printf(dev, "could not create TxCB DMA tag\n");
 		goto fail;
 	}
 
 	error = bus_dmamem_alloc(sc->cbl_tag, (void **)&sc->fxp_desc.cbl_list,
 	    BUS_DMA_NOWAIT | BUS_DMA_ZERO, &sc->cbl_map);
-	if (error)
+	if (error) {
+		device_printf(dev, "could not allocate TxCB DMA memory\n");
 		goto fail;
+	}
 
 	error = bus_dmamap_load(sc->cbl_tag, sc->cbl_map,
 	    sc->fxp_desc.cbl_list, FXP_TXCB_SZ, fxp_dma_map_addr,
 	    &sc->fxp_desc.cbl_addr, 0);
 	if (error) {
-		device_printf(dev, "could not map DMA memory\n");
+		device_printf(dev, "could not load TxCB DMA buffer\n");
 		goto fail;
 	}
 
@@ -695,18 +731,23 @@
 	    sizeof(struct fxp_cb_mcs), 1, sizeof(struct fxp_cb_mcs), 0,
 	    busdma_lock_mutex, &Giant, &sc->mcs_tag);
 	if (error) {
-		device_printf(dev, "could not allocate dma tag\n");
+		device_printf(dev,
+		    "could not create multicast setup DMA tag\n");
 		goto fail;
 	}
 
 	error = bus_dmamem_alloc(sc->mcs_tag, (void **)&sc->mcsp,
-	    BUS_DMA_NOWAIT, &sc->mcs_map);
-	if (error)
+	    BUS_DMA_NOWAIT | BUS_DMA_ZERO, &sc->mcs_map);
+	if (error) {
+		device_printf(dev,
+		    "could not allocate multicast setup DMA memory\n");
 		goto fail;
+	}
 	error = bus_dmamap_load(sc->mcs_tag, sc->mcs_map, sc->mcsp,
 	    sizeof(struct fxp_cb_mcs), fxp_dma_map_addr, &sc->mcs_addr, 0);
 	if (error) {
-		device_printf(dev, "can't map the multicast setup command\n");
+		device_printf(dev,
+		    "can't load the multicast setup DMA buffer\n");
 		goto fail;
 	}
 
@@ -718,13 +759,13 @@
 	tcbp = sc->fxp_desc.cbl_list;
 	for (i = 0; i < FXP_NTXCB; i++) {
 		txp[i].tx_cb = tcbp + i;
-		error = bus_dmamap_create(sc->fxp_mtag, 0, &txp[i].tx_map);
+		error = bus_dmamap_create(sc->fxp_txmtag, 0, &txp[i].tx_map);
 		if (error) {
 			device_printf(dev, "can't create DMA map for TX\n");
 			goto fail;
 		}
 	}
-	error = bus_dmamap_create(sc->fxp_mtag, 0, &sc->spare_map);
+	error = bus_dmamap_create(sc->fxp_rxmtag, 0, &sc->spare_map);
 	if (error) {
 		device_printf(dev, "can't create spare DMA map\n");
 		goto fail;
@@ -736,7 +777,7 @@
 	sc->fxp_desc.rx_head = sc->fxp_desc.rx_tail = NULL;
 	for (i = 0; i < FXP_NRFABUFS; i++) {
 		rxp = &sc->fxp_desc.rx_list[i];
-		error = bus_dmamap_create(sc->fxp_mtag, 0, &rxp->rx_map);
+		error = bus_dmamap_create(sc->fxp_rxmtag, 0, &rxp->rx_map);
 		if (error) {
 			device_printf(dev, "can't create DMA map for RX\n");
 			goto fail;
@@ -910,29 +951,32 @@
 		bus_dmamem_free(sc->mcs_tag, sc->mcsp, sc->mcs_map);
 	}
 	bus_release_resources(sc->dev, sc->fxp_spec, sc->fxp_res);
-	if (sc->fxp_mtag) {
+	if (sc->fxp_rxmtag) {
 		for (i = 0; i < FXP_NRFABUFS; i++) {
 			rxp = &sc->fxp_desc.rx_list[i];
 			if (rxp->rx_mbuf != NULL) {
-				bus_dmamap_sync(sc->fxp_mtag, rxp->rx_map,
+				bus_dmamap_sync(sc->fxp_rxmtag, rxp->rx_map,
 				    BUS_DMASYNC_POSTREAD);
-				bus_dmamap_unload(sc->fxp_mtag, rxp->rx_map);
+				bus_dmamap_unload(sc->fxp_rxmtag, rxp->rx_map);
 				m_freem(rxp->rx_mbuf);
 			}
-			bus_dmamap_destroy(sc->fxp_mtag, rxp->rx_map);
+			bus_dmamap_destroy(sc->fxp_rxmtag, rxp->rx_map);
 		}
-		bus_dmamap_destroy(sc->fxp_mtag, sc->spare_map);
+		bus_dmamap_destroy(sc->fxp_rxmtag, sc->spare_map);
+		bus_dma_tag_destroy(sc->fxp_rxmtag);
+	}
+	if (sc->fxp_txmtag) {
 		for (i = 0; i < FXP_NTXCB; i++) {
 			txp = &sc->fxp_desc.tx_list[i];
 			if (txp->tx_mbuf != NULL) {
-				bus_dmamap_sync(sc->fxp_mtag, txp->tx_map,
+				bus_dmamap_sync(sc->fxp_txmtag, txp->tx_map,
 				    BUS_DMASYNC_POSTWRITE);
-				bus_dmamap_unload(sc->fxp_mtag, txp->tx_map);
+				bus_dmamap_unload(sc->fxp_txmtag, txp->tx_map);
 				m_freem(txp->tx_mbuf);
 			}
-			bus_dmamap_destroy(sc->fxp_mtag, txp->tx_map);
+			bus_dmamap_destroy(sc->fxp_txmtag, txp->tx_map);
 		}
-		bus_dma_tag_destroy(sc->fxp_mtag);
+		bus_dma_tag_destroy(sc->fxp_txmtag);
 	}
 	if (sc->fxp_stag)
 		bus_dma_tag_destroy(sc->fxp_stag);
@@ -960,7 +1004,6 @@
 #endif
 
 	FXP_LOCK(sc);
-	sc->suspended = 1;	/* Do same thing as we do for suspend */
 	/*
 	 * Stop DMA and drop transmit queue, but disable interrupts first.
 	 */
@@ -970,6 +1013,14 @@
 	callout_drain(&sc->stat_ch);
 
 	/*
+	 * Force off IFF_UP flag, otherwise active BPF listeners
+	 * can call fxp_ioctl to clear promiscuous mode and fxp_init
+	 * will rearm fxp_tick which in turn will panic the system
+	 * when kernel tries to call fxp_tick which is not present
+	 * anymore.
+	 */
+	sc->ifp->if_flags &= ~IFF_UP;
+	/*
 	 * Close down routes etc.
 	 */
 	ether_ifdetach(sc->ifp);
@@ -1279,12 +1330,8 @@
 
 	FXP_LOCK_ASSERT(sc, MA_OWNED);
 
-	/*
-	 * See if we need to suspend xmit until the multicast filter
-	 * has been reprogrammed (which can only be done at the head
-	 * of the command chain).
-	 */
-	if (sc->need_mcsetup)
+	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
+	    IFF_DRV_RUNNING)
 		return;
 
 	if (sc->tx_queued > FXP_NTXCB_HIWAT)
@@ -1324,7 +1371,8 @@
 	 * going again if suspended.
 	 */
 	if (txqueued > 0) {
-		bus_dmamap_sync(sc->cbl_tag, sc->cbl_map, BUS_DMASYNC_PREWRITE);
+		bus_dmamap_sync(sc->cbl_tag, sc->cbl_map,
+		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 		fxp_scb_wait(sc);
 		fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_RESUME);
 		/*
@@ -1498,7 +1546,7 @@
 		*m_head = m;
 	}
 
-	error = bus_dmamap_load_mbuf_sg(sc->fxp_mtag, txp->tx_map, *m_head,
+	error = bus_dmamap_load_mbuf_sg(sc->fxp_txmtag, txp->tx_map, *m_head,
 	    segs, &nseg, 0);
 	if (error == EFBIG) {
 		m = m_collapse(*m_head, M_DONTWAIT, sc->maxtxseg);
@@ -1508,7 +1556,7 @@
 			return (ENOMEM);
 		}
 		*m_head = m;
-		error = bus_dmamap_load_mbuf_sg(sc->fxp_mtag, txp->tx_map,
+		error = bus_dmamap_load_mbuf_sg(sc->fxp_txmtag, txp->tx_map,
 	    	    *m_head, segs, &nseg, 0);
 		if (error != 0) {
 			m_freem(*m_head);
@@ -1524,7 +1572,7 @@
 	}
 
 	KASSERT(nseg <= sc->maxtxseg, ("too many DMA segments"));
-	bus_dmamap_sync(sc->fxp_mtag, txp->tx_map, BUS_DMASYNC_PREWRITE);
+	bus_dmamap_sync(sc->fxp_txmtag, txp->tx_map, BUS_DMASYNC_PREWRITE);
 
 	cbp = txp->tx_cb;
 	for (i = 0; i < nseg; i++) {
@@ -1694,7 +1742,8 @@
 		 * First ACK all the interrupts in this pass.
 		 */
 		CSR_WRITE_1(sc, FXP_CSR_SCB_STATACK, statack);
-		fxp_intr_body(sc, ifp, statack, -1);
+		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+			fxp_intr_body(sc, ifp, statack, -1);
 	}
 	FXP_UNLOCK(sc);
 }
@@ -1706,14 +1755,15 @@
 	struct fxp_tx *txp;
 
 	ifp = sc->ifp;
-	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map, BUS_DMASYNC_PREREAD);
+	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map,
+	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 	for (txp = sc->fxp_desc.tx_first; sc->tx_queued &&
 	    (le16toh(txp->tx_cb->cb_status) & FXP_CB_STATUS_C) != 0;
 	    txp = txp->tx_next) {
 		if (txp->tx_mbuf != NULL) {
-			bus_dmamap_sync(sc->fxp_mtag, txp->tx_map,
+			bus_dmamap_sync(sc->fxp_txmtag, txp->tx_map,
 			    BUS_DMASYNC_POSTWRITE);
-			bus_dmamap_unload(sc->fxp_mtag, txp->tx_map);
+			bus_dmamap_unload(sc->fxp_txmtag, txp->tx_map);
 			m_freem(txp->tx_mbuf);
 			txp->tx_mbuf = NULL;
 			/* clear this to reset csum offload bits */
@@ -1723,12 +1773,10 @@
 		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 	}
 	sc->fxp_desc.tx_first = txp;
-	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map, BUS_DMASYNC_PREWRITE);
-	if (sc->tx_queued == 0) {
+	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map,
+	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+	if (sc->tx_queued == 0)
 		sc->watchdog_timer = 0;
-		if (sc->need_mcsetup)
-			fxp_mc_setup(sc);
-	}
 }
 
 static void
@@ -1878,7 +1926,7 @@
 		m = rxp->rx_mbuf;
 		rfa = (struct fxp_rfa *)(m->m_ext.ext_buf +
 		    RFA_ALIGNMENT_FUDGE);
-		bus_dmamap_sync(sc->fxp_mtag, rxp->rx_map,
+		bus_dmamap_sync(sc->fxp_rxmtag, rxp->rx_map,
 		    BUS_DMASYNC_POSTREAD);
 
 #ifdef DEVICE_POLLING /* loop at most count times if count >=0 */
@@ -1952,6 +2000,8 @@
 			(*ifp->if_input)(ifp, m);
 			FXP_LOCK(sc);
 			rx_npkts++;
+			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+				return (rx_npkts);
 		} else {
 			/* Reuse RFA and loaded DMA map. */
 			ifp->if_iqdrops++;
@@ -1993,7 +2043,7 @@
 	if (sp->rx_good) {
 		ifp->if_ipackets += le32toh(sp->rx_good);
 		sc->rx_idle_secs = 0;
-	} else {
+	} else if (sc->flags & FXP_FLAG_RXBUG) {
 		/*
 		 * Receiver's been idle for another second.
 		 */
@@ -2035,7 +2085,9 @@
 	 */
 	if (sc->rx_idle_secs > FXP_MAX_RX_IDLE) {
 		sc->rx_idle_secs = 0;
-		fxp_mc_setup(sc);
+		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+			fxp_init_body(sc);
+		return;
 	}
 	/*
 	 * If there is no pending command, start another stats
@@ -2113,9 +2165,10 @@
 	if (txp != NULL) {
 		for (i = 0; i < FXP_NTXCB; i++) {
  			if (txp[i].tx_mbuf != NULL) {
-				bus_dmamap_sync(sc->fxp_mtag, txp[i].tx_map,
+				bus_dmamap_sync(sc->fxp_txmtag, txp[i].tx_map,
 				    BUS_DMASYNC_POSTWRITE);
-				bus_dmamap_unload(sc->fxp_mtag, txp[i].tx_map);
+				bus_dmamap_unload(sc->fxp_txmtag,
+				    txp[i].tx_map);
 				m_freem(txp[i].tx_mbuf);
 				txp[i].tx_mbuf = NULL;
 				/* clear this to reset csum offload bits */
@@ -2123,7 +2176,8 @@
 			}
 		}
 	}
-	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map, BUS_DMASYNC_PREWRITE);
+	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map,
+	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 	sc->tx_queued = 0;
 }
 
@@ -2175,7 +2229,6 @@
 	struct fxp_cb_ias *cb_ias;
 	struct fxp_cb_tx *tcbp;
 	struct fxp_tx *txp;
-	struct fxp_cb_mcs *mcsp;
 	int i, prm;
 
 	FXP_LOCK_ASSERT(sc, MA_OWNED);
@@ -2213,30 +2266,19 @@
 
 	/*
 	 * Attempt to load microcode if requested.
+	 * For ICH based controllers do not load microcode.
 	 */
-	if (ifp->if_flags & IFF_LINK0 && (sc->flags & FXP_FLAG_UCODE) == 0)
-		fxp_load_ucode(sc);
+	if (sc->ident->ich == 0) {
+		if (ifp->if_flags & IFF_LINK0 &&
+		    (sc->flags & FXP_FLAG_UCODE) == 0)
+			fxp_load_ucode(sc);
+	}
 
 	/*
-	 * Initialize the multicast address list.
+	 * Set IFF_ALLMULTI status. It's needed in configure action
+	 * command.
 	 */
-	if (fxp_mc_addrs(sc)) {
-		mcsp = sc->mcsp;
-		mcsp->cb_status = 0;
-		mcsp->cb_command =
-		    htole16(FXP_CB_COMMAND_MCAS | FXP_CB_COMMAND_EL);
-		mcsp->link_addr = 0xffffffff;
-		/*
-	 	 * Start the multicast setup command.
-		 */
-		fxp_scb_wait(sc);
-		bus_dmamap_sync(sc->mcs_tag, sc->mcs_map,
-		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
-		CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->mcs_addr);
-		fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_START);
-		/* ...and wait for it to complete. */
-		fxp_dma_wait(sc, &mcsp->cb_status, sc->mcs_tag, sc->mcs_map);
-	}
+	fxp_mc_addrs(sc);
 
 	/*
 	 * We temporarily use memory that contains the TxCB list to
@@ -2310,7 +2352,7 @@
 	cbp->force_fdx =	0;	/* (don't) force full duplex */
 	cbp->fdx_pin_en =	1;	/* (enable) FDX# pin */
 	cbp->multi_ia =		0;	/* (don't) accept multiple IAs */
-	cbp->mc_all =		sc->flags & FXP_FLAG_ALL_MCAST ? 1 : 0;
+	cbp->mc_all =		ifp->if_flags & IFF_ALLMULTI ? 1 : 0;
 	cbp->gamla_rx =		sc->flags & FXP_FLAG_EXT_RFA ? 1 : 0;
 	cbp->vlan_strip_en =	((sc->flags & FXP_FLAG_EXT_RFA) != 0 &&
 	    (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) ? 1 : 0;
@@ -2366,11 +2408,17 @@
 	fxp_scb_wait(sc);
 	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map,
 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+	CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->fxp_desc.cbl_addr);
 	fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_START);
 	/* ...and wait for it to complete. */
 	fxp_dma_wait(sc, &cb_ias->cb_status, sc->cbl_tag, sc->cbl_map);
 
 	/*
+	 * Initialize the multicast address list.
+	 */
+	fxp_mc_setup(sc);
+
+	/*
 	 * Initialize transmit control block (TxCB) list.
 	 */
 	txp = sc->fxp_desc.tx_list;
@@ -2395,11 +2443,13 @@
 	 * unit. It will execute the NOP and then suspend.
 	 */
 	tcbp->cb_command = htole16(FXP_CB_COMMAND_NOP | FXP_CB_COMMAND_S);
-	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map, BUS_DMASYNC_PREWRITE);
+	bus_dmamap_sync(sc->cbl_tag, sc->cbl_map,
+	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 	sc->fxp_desc.tx_first = sc->fxp_desc.tx_last = txp;
 	sc->tx_queued = 1;
 
 	fxp_scb_wait(sc);
+	CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->fxp_desc.cbl_addr);
 	fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_START);
 
 	/*
@@ -2545,7 +2595,7 @@
 	le32enc(&rfa->rbd_addr, 0xffffffff);
 
 	/* Map the RFA into DMA memory. */
-	error = bus_dmamap_load(sc->fxp_mtag, sc->spare_map, rfa,
+	error = bus_dmamap_load(sc->fxp_rxmtag, sc->spare_map, rfa,
 	    MCLBYTES - RFA_ALIGNMENT_FUDGE, fxp_dma_map_addr,
 	    &rxp->rx_addr, 0);
 	if (error) {
@@ -2554,13 +2604,13 @@
 	}
 
 	if (rxp->rx_mbuf != NULL)
-		bus_dmamap_unload(sc->fxp_mtag, rxp->rx_map);
+		bus_dmamap_unload(sc->fxp_rxmtag, rxp->rx_map);
 	tmp_map = sc->spare_map;
 	sc->spare_map = rxp->rx_map;
 	rxp->rx_map = tmp_map;
 	rxp->rx_mbuf = m;
 
-	bus_dmamap_sync(sc->fxp_mtag, rxp->rx_map,
+	bus_dmamap_sync(sc->fxp_rxmtag, rxp->rx_map,
 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 	return (0);
 }
@@ -2582,7 +2632,7 @@
 		p_rx->rx_next = rxp;
 		le32enc(&p_rfa->link_addr, rxp->rx_addr);
 		p_rfa->rfa_control = 0;
-		bus_dmamap_sync(sc->fxp_mtag, p_rx->rx_map,
+		bus_dmamap_sync(sc->fxp_rxmtag, p_rx->rx_map,
 		    BUS_DMASYNC_PREWRITE);
 	} else {
 		rxp->rx_next = NULL;
@@ -2626,7 +2676,7 @@
 	le32enc(&rfa->link_addr, 0xffffffff);
 	le32enc(&rfa->rbd_addr, 0xffffffff);
 
-	bus_dmamap_sync(sc->fxp_mtag, rxp->rx_map,
+	bus_dmamap_sync(sc->fxp_rxmtag, rxp->rx_map,
 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 }
 
@@ -2680,11 +2730,6 @@
 	switch (command) {
 	case SIOCSIFFLAGS:
 		FXP_LOCK(sc);
-		if (ifp->if_flags & IFF_ALLMULTI)
-			sc->flags |= FXP_FLAG_ALL_MCAST;
-		else
-			sc->flags &= ~FXP_FLAG_ALL_MCAST;
-
 		/*
 		 * If interface is marked up and not running, then start it.
 		 * If it is marked down and running, stop it.
@@ -2692,35 +2737,24 @@
 		 * such as IFF_PROMISC are handled.
 		 */
 		if (ifp->if_flags & IFF_UP) {
-			fxp_init_body(sc);
+			if (((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) &&
+			    ((ifp->if_flags ^ sc->if_flags) &
+			    (IFF_PROMISC | IFF_ALLMULTI | IFF_LINK0)) != 0)
+				fxp_init_body(sc);
+			else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+				fxp_init_body(sc);
 		} else {
-			if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
 				fxp_stop(sc);
 		}
+		sc->if_flags = ifp->if_flags;
 		FXP_UNLOCK(sc);
 		break;
 
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
-		FXP_LOCK(sc);
-		if (ifp->if_flags & IFF_ALLMULTI)
-			sc->flags |= FXP_FLAG_ALL_MCAST;
-		else
-			sc->flags &= ~FXP_FLAG_ALL_MCAST;
-		/*
-		 * Multicast list has changed; set the hardware filter
-		 * accordingly.
-		 */
-		if ((sc->flags & FXP_FLAG_ALL_MCAST) == 0)
-			fxp_mc_setup(sc);
-		/*
-		 * fxp_mc_setup() can set FXP_FLAG_ALL_MCAST, so check it
-		 * again rather than else {}.
-		 */
-		if (sc->flags & FXP_FLAG_ALL_MCAST)
-			fxp_init_body(sc);
-		FXP_UNLOCK(sc);
-		error = 0;
+		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+			fxp_init(sc);
 		break;
 
 	case SIOCSIFMEDIA:
@@ -2824,13 +2858,13 @@
 	int nmcasts;
 
 	nmcasts = 0;
-	if ((sc->flags & FXP_FLAG_ALL_MCAST) == 0) {
+	if ((ifp->if_flags & IFF_ALLMULTI) == 0) {
 		IF_ADDR_LOCK(ifp);
 		TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
 			if (ifma->ifma_addr->sa_family != AF_LINK)
 				continue;
 			if (nmcasts >= MAXMCADDR) {
-				sc->flags |= FXP_FLAG_ALL_MCAST;
+				ifp->if_flags |= IFF_ALLMULTI;
 				nmcasts = 0;
 				break;
 			}
@@ -2855,87 +2889,28 @@
  * points to the TxCB ring, but the mcsetup descriptor itself is not part
  * of it. We then can do 'CU_START' on the mcsetup descriptor and have it
  * lead into the regular TxCB ring when it completes.
- *
- * This function must be called at splimp.
  */
 static void
 fxp_mc_setup(struct fxp_softc *sc)
 {
-	struct fxp_cb_mcs *mcsp = sc->mcsp;
-	struct fxp_tx *txp;
+	struct fxp_cb_mcs *mcsp;
 	int count;
 
 	FXP_LOCK_ASSERT(sc, MA_OWNED);
-	/*
-	 * If there are queued commands, we must wait until they are all
-	 * completed. If we are already waiting, then add a NOP command
-	 * with interrupt option so that we're notified when all commands
-	 * have been completed - fxp_start() ensures that no additional
-	 * TX commands will be added when need_mcsetup is true.
-	 */
-	if (sc->tx_queued) {
-		/*
-		 * need_mcsetup will be true if we are already waiting for the
-		 * NOP command to be completed (see below). In this case, bail.
-		 */
-		if (sc->need_mcsetup)
-			return;
-		sc->need_mcsetup = 1;
 
-		/*
-		 * Add a NOP command with interrupt so that we are notified
-		 * when all TX commands have been processed.
-		 */
-		txp = sc->fxp_desc.tx_last->tx_next;
-		txp->tx_mbuf = NULL;
-		txp->tx_cb->cb_status = 0;
-		txp->tx_cb->cb_command = htole16(FXP_CB_COMMAND_NOP |
-		    FXP_CB_COMMAND_S | FXP_CB_COMMAND_I);
-		/*
-		 * Advance the end of list forward.
-		 */
-		sc->fxp_desc.tx_last->tx_cb->cb_command &=
-		    htole16(~FXP_CB_COMMAND_S);
-		bus_dmamap_sync(sc->cbl_tag, sc->cbl_map, BUS_DMASYNC_PREWRITE);
-		sc->fxp_desc.tx_last = txp;
-		sc->tx_queued++;
-		/*
-		 * Issue a resume in case the CU has just suspended.
-		 */
-		fxp_scb_wait(sc);
-		fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_RESUME);
-		/*
-		 * Set a 5 second timer just in case we don't hear from the
-		 * card again.
-		 */
-		sc->watchdog_timer = 5;
-
-		return;
-	}
-	sc->need_mcsetup = 0;
-
-	/*
-	 * Initialize multicast setup descriptor.
-	 */
+	mcsp = sc->mcsp;
 	mcsp->cb_status = 0;
-	mcsp->cb_command = htole16(FXP_CB_COMMAND_MCAS |
-	    FXP_CB_COMMAND_S | FXP_CB_COMMAND_I);
-	mcsp->link_addr = htole32(sc->fxp_desc.cbl_addr);
-	txp = &sc->fxp_desc.mcs_tx;
-	txp->tx_mbuf = NULL;
-	txp->tx_cb = (struct fxp_cb_tx *)sc->mcsp;
-	txp->tx_next = sc->fxp_desc.tx_list;
-	(void) fxp_mc_addrs(sc);
-	sc->fxp_desc.tx_first = sc->fxp_desc.tx_last = txp;
-	sc->tx_queued = 1;
+	mcsp->cb_command = htole16(FXP_CB_COMMAND_MCAS | FXP_CB_COMMAND_EL);
+	mcsp->link_addr = 0xffffffff;
+	fxp_mc_addrs(sc);
 
 	/*
-	 * Wait until command unit is not active. This should never
-	 * be the case when nothing is queued, but make sure anyway.
+	 * Wait until command unit is idle. This should never be the
+	 * case when nothing is queued, but make sure anyway.
 	 */
 	count = 100;
-	while ((CSR_READ_1(sc, FXP_CSR_SCB_RUSCUS) >> 6) ==
-	    FXP_SCB_CUS_ACTIVE && --count)
+	while ((CSR_READ_1(sc, FXP_CSR_SCB_RUSCUS) >> 6) !=
+	    FXP_SCB_CUS_IDLE && --count)
 		DELAY(10);
 	if (count == 0) {
 		device_printf(sc->dev, "command queue timeout\n");
@@ -2946,12 +2921,12 @@
 	 * Start the multicast setup command.
 	 */
 	fxp_scb_wait(sc);
-	bus_dmamap_sync(sc->mcs_tag, sc->mcs_map, BUS_DMASYNC_PREWRITE);
+	bus_dmamap_sync(sc->mcs_tag, sc->mcs_map,
+	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 	CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->mcs_addr);
 	fxp_scb_cmd(sc, FXP_SCB_COMMAND_CU_START);
-
-	sc->watchdog_timer = 2;
-	return;
+	/* ...and wait for it to complete. */
+	fxp_dma_wait(sc, &mcsp->cb_status, sc->mcs_tag, sc->mcs_map);
 }
 
 static uint32_t fxp_ucode_d101a[] = D101_A_RCVBUNDLE_UCODE;


>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->closed 
State-Changed-By: remko 
State-Changed-When: Sat May 28 11:42:25 UTC 2011 
State-Changed-Why:  
Officially we do not support the 4.x range anymore. If you need 
assistance you can try the mailinglists or poke someone whether he / she 
might be able to help. That might cost some funding to get people that 
far. If that is not an option, then I am sad to say tht there are no 
alternatives. Thank you! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=157378 

Date: Sun, 29 May 2011 09:21:08 +0800
From: "=?gbk?B?zOzJ8b21wdk=?=" <164837122@qq.com>
To: "=?gbk?B?RnJlZUJTRC1nbmF0cy1zdWJtaXQ=?=" <FreeBSD-gnats-submit@FreeBSD.org>
Subject: =?gbk?B?u9i4tKO6IGkzODYvMTU3Mzc4OiBmeHAuaWNoLnBh?=
 =?gbk?B?dGNo?=

 This is a multi-part message in MIME format.
 
 ------=_NextPart_4DE19F84_DEE0A958_10A50BAA
 Content-Type: multipart/alternative;
 	boundary="----=_NextPart_4DE19F84_DEE0A958_5737EB0E";
 
 ------=_NextPart_4DE19F84_DEE0A958_5737EB0E
 Content-Type: text/plain;
 	charset="gbk"
 Content-Transfer-Encoding: base64
 
 dGhhbmtzIGZvciB5b3VyIHJlcGx5ICwgYnV0IHRoZSBpc3N1ZSBzdGlsbCBub3QgcmVzb2x2
 ZWQgYWZ0ZXIgYXBweWluZyB0aGUgcGF0Y2guIGhlcmUgaXMgdGhlIGVycm9yIG1zZzoNCklu
 IGZpbGUgaW5jbHVkZWQgZnJvbSAvdXNyL3NyYy9zeXMvZGV2L2Z4cC9pZl9meHAuYzo3NzoN
 Ci91c3Ivc3JjL3N5cy9kZXYvZnhwL2lmX2Z4cHZhci5oOjExNDogcmVkZWZpbml0aW9uIG9m
 IGBzdHJ1Y3QgZnhwX2lkZW50Jw0KL3Vzci9zcmMvc3lzL2Rldi9meHAvaWZfZnhwLmM6MTM4
 OiByZWRlZmluaXRpb24gb2YgYHN0cnVjdCBmeHBfaWRlbnQnDQovdXNyL3NyYy9zeXMvZGV2
 L2Z4cC9pZl9meHAuYzogSW4gZnVuY3Rpb24gYGZ4cF9pbml0JzoNCi91c3Ivc3JjL3N5cy9k
 ZXYvZnhwL2lmX2Z4cC5jOjE3Mjg6IGBGWFBfRkxBR19BTExfTUNBU1QnIHVuZGVjbGFyZWQg
 KGZpcnN0IHVzZSBpbiB0aGlzIGZ1bmN0aW9uKQ0KL3Vzci9zcmMvc3lzL2Rldi9meHAvaWZf
 ZnhwLmM6MTcyODogKEVhY2ggdW5kZWNsYXJlZCBpZGVudGlmaWVyIGlzIHJlcG9ydGVkIG9u
 bHkgb25jZQ0KL3Vzci9zcmMvc3lzL2Rldi9meHAvaWZfZnhwLmM6MTcyODogZm9yIGVhY2gg
 ZnVuY3Rpb24gaXQgYXBwZWFycyBpbi4pDQovdXNyL3NyYy9zeXMvZGV2L2Z4cC9pZl9meHAu
 YzogSW4gZnVuY3Rpb24gYGZ4cF9pb2N0bCc6DQovdXNyL3NyYy9zeXMvZGV2L2Z4cC9pZl9m
 eHAuYzoyMDI0OiBgRlhQX0ZMQUdfQUxMX01DQVNUJyB1bmRlY2xhcmVkIChmaXJzdCB1c2Ug
 aW4gdGhpcyBmdW5jdGlvbikNCi91c3Ivc3JjL3N5cy9kZXYvZnhwL2lmX2Z4cC5jOiBJbiBm
 dW5jdGlvbiBgZnhwX21jX2FkZHJzJzoNCi91c3Ivc3JjL3N5cy9kZXYvZnhwL2lmX2Z4cC5j
 OjIwOTc6IGBGWFBfRkxBR19BTExfTUNBU1QnIHVuZGVjbGFyZWQgKGZpcnN0IHVzZSBpbiB0
 aGlzIGZ1bmN0aW9uKQ0KKioqIEVycm9yIGNvZGUgMQ0KIFN0b3AgaW4gL3Vzci9vYmovdXNy
 L3NyYy9zeXMvTTBOMFdBTExfR0VORVJJQy4NCioqKiBFcnJvciBjb2RlIDENCiAgDQogDQpi
 c2Q0IyB1bmFtZSAtYQ0KRnJlZUJTRCBic2Q0Lm9yZyA0LjExLVNUQUJMRSBGcmVlQlNEIDQu
 MTEtU1RBQkxFICMxOiBUaHUgTWF5IDI2IDIyOjQ2OjU3IENTVCAyMDExICAgICByb290QGJz
 ZDQub3JnOi91c3Ivb2JqL3Vzci9zcmMvc3lzL0dFTkVSSUMgIGkzODYNCg0KICAgDQogIA0K
 ICAtLS0tLS0tLS0tLS0tLS0tLS0g1K3KvNPKvP4gLS0tLS0tLS0tLS0tLS0tLS0tDQogILei
 vP7IyzogIkZyZWVCU0QtZ25hdHMtc3VibWl0IjxGcmVlQlNELWduYXRzLXN1Ym1pdEBGcmVl
 QlNELm9yZz47DQogt6LLzcqxvOQ6IDIwMTHE6jXUwjI4yNUo0MfG2sH5KSDN7cnPNzoxMA0K
 IMrVvP7IyzogImN1bWF5IjwxNjQ4MzcxMjJAcXEuY29tPjsgDQogDQog1vfM4jogUmU6IGkz
 ODYvMTU3Mzc4OiBmeHAuaWNoLnBhdGNoDQoNCiAgDQpUaGFuayB5b3UgdmVyeSBtdWNoIGZv
 ciB5b3VyIHByb2JsZW0gcmVwb3J0Lg0KSXQgaGFzIHRoZSBpbnRlcm5hbCBpZGVudGlmaWNh
 dGlvbiBgaTM4Ni8xNTczNzgnLg0KVGhlIGluZGl2aWR1YWwgYXNzaWduZWQgdG8gbG9vayBh
 dCB5b3VyDQpyZXBvcnQgaXM6IGZyZWVic2QtaTM4Ni4gDQoNCllvdSBjYW4gYWNjZXNzIHRo
 ZSBzdGF0ZSBvZiB5b3VyIHByb2JsZW0gcmVwb3J0IGF0IGFueSB0aW1lDQp2aWEgdGhpcyBs
 aW5rOg0KDQpodHRwOi8vd3d3LmZyZWVic2Qub3JnL2NnaS9xdWVyeS1wci5jZ2k/cHI9MTU3
 Mzc4DQoNCj5DYXRlZ29yeTogICAgICAgaTM4Ng0KPlJlc3BvbnNpYmxlOiAgICBmcmVlYnNk
 LWkzODYNCj5TeW5vcHNpczogICAgICAgZnhwLmljaC5wYXRjaA0KPkFycml2YWwtRGF0ZTog
 ICBTYXQgTWF5IDI4IDExOjEwOjA5IFVUQyAyMDEx
 
 ------=_NextPart_4DE19F84_DEE0A958_5737EB0E
 Content-Type: text/html;
 	charset="gbk"
 Content-Transfer-Encoding: base64
 
 PERJVj50aGFua3MgZm9yIHlvdXIgcmVwbHkgLCBidXQgdGhlIGlzc3VlIHN0aWxsIG5vdCBy
 ZXNvbHZlZCBhZnRlciBhcHB5aW5nIHRoZSBwYXRjaC4gaGVyZSBpcyB0aGUgZXJyb3IgbXNn
 OjxCUj5JbiBmaWxlIGluY2x1ZGVkIGZyb20gL3Vzci9zcmMvc3lzL2Rldi9meHAvaWZfZnhw
 LmM6Nzc6PEJSPi91c3Ivc3JjL3N5cy9kZXYvZnhwL2lmX2Z4cHZhci5oOjExNDogcmVkZWZp
 bml0aW9uIG9mIGBzdHJ1Y3QgZnhwX2lkZW50JzxCUj4vdXNyL3NyYy9zeXMvZGV2L2Z4cC9p
 Zl9meHAuYzoxMzg6IHJlZGVmaW5pdGlvbiBvZiBgc3RydWN0IGZ4cF9pZGVudCc8QlI+L3Vz
 ci9zcmMvc3lzL2Rldi9meHAvaWZfZnhwLmM6IEluIGZ1bmN0aW9uIGBmeHBfaW5pdCc6PEJS
 Pi91c3Ivc3JjL3N5cy9kZXYvZnhwL2lmX2Z4cC5jOjE3Mjg6IGBGWFBfRkxBR19BTExfTUNB
 U1QnIHVuZGVjbGFyZWQgKGZpcnN0IHVzZSBpbiB0aGlzIGZ1bmN0aW9uKTxCUj4vdXNyL3Ny
 Yy9zeXMvZGV2L2Z4cC9pZl9meHAuYzoxNzI4OiAoRWFjaCB1bmRlY2xhcmVkIGlkZW50aWZp
 ZXIgaXMgcmVwb3J0ZWQgb25seSBvbmNlPEJSPi91c3Ivc3JjL3N5cy9kZXYvZnhwL2lmX2Z4
 cC5jOjE3Mjg6IGZvciBlYWNoIGZ1bmN0aW9uIGl0IGFwcGVhcnMgaW4uKTxCUj4vdXNyL3Ny
 Yy9zeXMvZGV2L2Z4cC9pZl9meHAuYzogSW4gZnVuY3Rpb24gYGZ4cF9pb2N0bCc6PEJSPi91
 c3Ivc3JjL3N5cy9kZXYvZnhwL2lmX2Z4cC5jOjIwMjQ6IGBGWFBfRkxBR19BTExfTUNBU1Qn
 IHVuZGVjbGFyZWQgKGZpcnN0IHVzZSBpbiB0aGlzIGZ1bmN0aW9uKTxCUj4vdXNyL3NyYy9z
 eXMvZGV2L2Z4cC9pZl9meHAuYzogSW4gZnVuY3Rpb24gYGZ4cF9tY19hZGRycyc6PEJSPi91
 c3Ivc3JjL3N5cy9kZXYvZnhwL2lmX2Z4cC5jOjIwOTc6IGBGWFBfRkxBR19BTExfTUNBU1Qn
 IHVuZGVjbGFyZWQgKGZpcnN0IHVzZSBpbiB0aGlzIGZ1bmN0aW9uKTxCUj4qKiogRXJyb3Ig
 Y29kZSAxPC9ESVY+DQo8RElWPlN0b3AgaW4gL3Vzci9vYmovdXNyL3NyYy9zeXMvTTBOMFdB
 TExfR0VORVJJQy48QlI+KioqIEVycm9yIGNvZGUgMTwvRElWPg0KPERJVj4mbmJzcDs8L0RJ
 Vj4NCjxESVY+PEJSPmJzZDQjIHVuYW1lIC1hPEJSPkZyZWVCU0QgYnNkNC5vcmcgNC4xMS1T
 VEFCTEUgRnJlZUJTRCA0LjExLVNUQUJMRSAjMTogVGh1IE1heSAyNiAyMjo0Njo1NyBDU1Qg
 MjAxMSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8QSBocmVmPSJtYWlsdG86cm9vdEBic2Q0
 Lm9yZzovdXNyL29iai91c3Ivc3JjL3N5cy9HRU5FUklDIj5yb290QGJzZDQub3JnOi91c3Iv
 b2JqL3Vzci9zcmMvc3lzL0dFTkVSSUM8L0E+Jm5ic3A7IGkzODY8QlI+PC9ESVY+DQo8RElW
 PjxpbmNsdWRldGFpbD4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPg0K
 PERJViBzdHlsZT0iQ09MT1I6ICMwMDAiPg0KPERJViBzdHlsZT0iUEFERElORy1CT1RUT006
 IDJweDsgUEFERElORy1MRUZUOiAwcHg7IFBBRERJTkctUklHSFQ6IDBweDsgRk9OVC1GQU1J
 TFk6IEFyaWFsIE5hcnJvdzsgRk9OVC1TSVpFOiAxMnB4OyBQQURESU5HLVRPUDogMnB4Ij4t
 LS0tLS0tLS0tLS0tLS0tLS0mbmJzcDvUrcq808q8/iZuYnNwOy0tLS0tLS0tLS0tLS0tLS0t
 LTwvRElWPg0KPERJViBzdHlsZT0iUEFERElORy1CT1RUT006IDhweDsgUEFERElORy1MRUZU
 OiA4cHg7IFBBRERJTkctUklHSFQ6IDhweDsgQkFDS0dST1VORDogI2VmZWZlZjsgRk9OVC1T
 SVpFOiAxMnB4OyBQQURESU5HLVRPUDogOHB4Ij4NCjxESVYgaWQ9bWVudV9zZW5kZXI+PEI+
 t6K8/sjLOjwvQj4mbmJzcDsiRnJlZUJTRC1nbmF0cy1zdWJtaXQiJmx0O0ZyZWVCU0QtZ25h
 dHMtc3VibWl0QEZyZWVCU0Qub3JnJmd0Ozs8L0RJVj4NCjxESVY+PEI+t6LLzcqxvOQ6PC9C
 PiZuYnNwOzIwMTHE6jXUwjI4yNUo0MfG2sH5KSDN7cnPNzoxMDwvRElWPg0KPERJVj48Qj7K
 1bz+yMs6PC9CPiZuYnNwOyJjdW1heSImbHQ7MTY0ODM3MTIyQHFxLmNvbSZndDs7IDxXQlI+
 PC9ESVY+DQo8RElWPjwvRElWPg0KPERJVj48Qj7W98ziOjwvQj4mbmJzcDtSZTogaTM4Ni8x
 NTczNzg6IGZ4cC5pY2gucGF0Y2g8L0RJVj48L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+VGhh
 bmsgeW91IHZlcnkgbXVjaCBmb3IgeW91ciBwcm9ibGVtIHJlcG9ydC48QlI+SXQgaGFzIHRo
 ZSBpbnRlcm5hbCBpZGVudGlmaWNhdGlvbiBgaTM4Ni8xNTczNzgnLjxCUj5UaGUgaW5kaXZp
 ZHVhbCBhc3NpZ25lZCB0byBsb29rIGF0IHlvdXI8QlI+cmVwb3J0IGlzOiBmcmVlYnNkLWkz
 ODYuIDxCUj48QlI+WW91IGNhbiBhY2Nlc3MgdGhlIHN0YXRlIG9mIHlvdXIgcHJvYmxlbSBy
 ZXBvcnQgYXQgYW55IHRpbWU8QlI+dmlhIHRoaXMgbGluazo8QlI+PEJSPmh0dHA6Ly93d3cu
 ZnJlZWJzZC5vcmcvY2dpL3F1ZXJ5LXByLmNnaT9wcj0xNTczNzg8QlI+PEJSPiZndDtDYXRl
 Z29yeTombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaTM4NjxCUj4mZ3Q7
 UmVzcG9uc2libGU6Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZyZWVic2QtaTM4NjxCUj4mZ3Q7U3lu
 b3BzaXM6Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGZ4cC5pY2gucGF0
 Y2g8QlI+Jmd0O0Fycml2YWwtRGF0ZTombmJzcDsmbmJzcDsgU2F0IE1heSAyOCAxMToxMDow
 OSBVVEMgMjAxMTxCUj48QlI+PC9ESVY+PC9pbmNsdWRldGFpbD48L0RJVj4=
 
 ------=_NextPart_4DE19F84_DEE0A958_5737EB0E--
 
 ------=_NextPart_4DE19F84_DEE0A958_10A50BAA
 Content-Type: application/octet-stream;
 	charset="gbk";
 	name="freebsd6.4-fxp.ich.patch"
 Content-Disposition: attachment; filename="freebsd6.4-fxp.ich.patch"
 Content-Transfer-Encoding: base64
 
 SW5kZXg6IHN5cy9kZXYvZnhwL2lmX2Z4cHZhci5oCj09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9k
 ZXYvZnhwL2lmX2Z4cHZhci5oIChyZXZpc2lvbiAxOTQwOTUpCisrKyBzeXMvZGV2L2Z4cC9p
 Zl9meHB2YXIuaCAod29ya2luZyBjb3B5KQpAQCAtMTQyLDYgKzE0MiwxMyBAQAogIGJ1c19k
 bWFfdGFnX3QgcnhfdGFnOwogfTsKIAorc3RydWN0IGZ4cF9pZGVudCB7CisgdWludDE2X3Qg
 ZGV2aWQ7CisgaW50MTZfdCAgcmV2aWQ7ICAvKiAtMSBtYXRjaGVzIGFueXRoaW5nICovCisg
 dWludDhfdCAgaWNoOworIGNoYXIgICAqbmFtZTsKK307CisKIC8qCiAgKiBOT1RFOiBFbGVt
 ZW50cyBhcmUgb3JkZXJlZCBmb3Igb3B0aW1hbCBjYWNoZWxpbmUgYmVoYXZpb3IsIGFuZCBO
 T1QKICAqICBmb3IgZnVuY3Rpb25hbCBncm91cGluZy4KQEAgLTE1MSw2ICsxNTgsNyBAQAog
 IHN0cnVjdCByZXNvdXJjZSAqZnhwX3Jlc1syXTsgLyogSS9PIGFuZCBJUlEgcmVzb3VyY2Vz
 ICovCiAgc3RydWN0IHJlc291cmNlX3NwZWMgKmZ4cF9zcGVjOyAvKiB0aGUgcmVzb3VyY2Ug
 c3BlYyB3ZSB1c2VkICovCiAgdm9pZCAqaWg7ICAgLyogaW50ZXJydXB0IGhhbmRsZXIgY29v
 a2llICovCisgc3RydWN0IGZ4cF9pZGVudCAqaWRlbnQ7CiAgc3RydWN0IG10eCBzY19tdHg7
 CiAgYnVzX2RtYV90YWdfdCBmeHBfbXRhZzsgIC8qIGJ1cyBETUEgdGFnIGZvciBtYnVmcyAq
 LwogIGJ1c19kbWFfdGFnX3QgZnhwX3N0YWc7ICAvKiBidXMgRE1BIHRhZyBmb3Igc3RhdHMg
 Ki8KSW5kZXg6IHN5cy9kZXYvZnhwL2lmX2Z4cC5jCj09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9k
 ZXYvZnhwL2lmX2Z4cC5jIChyZXZpc2lvbiAxOTQwOTUpCisrKyBzeXMvZGV2L2Z4cC9pZl9m
 eHAuYyAod29ya2luZyBjb3B5KQpAQCAtMTQwLDEyICsxNDAsNiBAQAogIDB4NSAvKiAyMSAq
 LwogfTsKIAotc3RydWN0IGZ4cF9pZGVudCB7Ci0gdWludDE2X3QgZGV2aWQ7Ci0gaW50MTZf
 dCAgcmV2aWQ7ICAvKiAtMSBtYXRjaGVzIGFueXRoaW5nICovCi0gY2hhciAgICpuYW1lOwot
 fTsKLQogLyoKICAqIENsYWltIHZhcmlvdXMgSW50ZWwgUENJIGRldmljZSBpZGVudGlmaWVy
 cyBmb3IgdGhpcyBkcml2ZXIuICBUaGUKICAqIHN1Yi12ZW5kb3IgYW5kIHN1Yi1kZXZpY2Ug
 ZmllbGQgYXJlIGV4dGVuc2l2ZWx5IHVzZWQgdG8gaWRlbnRpZnkKQEAgLTE1Myw1MiArMTQ3
 LDUyIEBACiAgKiB0aGVtLgogICovCiBzdGF0aWMgc3RydWN0IGZ4cF9pZGVudCBmeHBfaWRl
 bnRfdGFibGVbXSA9IHsKLSAgICB7IDB4MTAyOSwgLTEsICJJbnRlbCA4MjU1OSBQQ0kvQ2Fy
 ZEJ1cyBQcm8vMTAwIiB9LAotICAgIHsgMHgxMDMwLCAtMSwgIkludGVsIDgyNTU5IFByby8x
 MDAgRXRoZXJuZXQiIH0sCi0gICAgeyAweDEwMzEsIC0xLCAiSW50ZWwgODI4MDFDQU0gKElD
 SDMpIFByby8xMDAgVkUgRXRoZXJuZXQiIH0sCi0gICAgeyAweDEwMzIsIC0xLCAiSW50ZWwg
 ODI4MDFDQU0gKElDSDMpIFByby8xMDAgVkUgRXRoZXJuZXQiIH0sCi0gICAgeyAweDEwMzMs
 IC0xLCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIFByby8xMDAgVk0gRXRoZXJuZXQiIH0sCi0g
 ICAgeyAweDEwMzQsIC0xLCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIFByby8xMDAgVk0gRXRo
 ZXJuZXQiIH0sCi0gICAgeyAweDEwMzUsIC0xLCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIFBy
 by8xMDAgRXRoZXJuZXQiIH0sCi0gICAgeyAweDEwMzYsIC0xLCAiSW50ZWwgODI4MDFDQU0g
 KElDSDMpIFByby8xMDAgRXRoZXJuZXQiIH0sCi0gICAgeyAweDEwMzcsIC0xLCAiSW50ZWwg
 ODI4MDFDQU0gKElDSDMpIFByby8xMDAgRXRoZXJuZXQiIH0sCi0gICAgeyAweDEwMzgsIC0x
 LCAiSW50ZWwgODI4MDFDQU0gKElDSDMpIFByby8xMDAgVk0gRXRoZXJuZXQiIH0sCi0gICAg
 eyAweDEwMzksIC0xLCAiSW50ZWwgODI4MDFEQiAoSUNINCkgUHJvLzEwMCBWRSBFdGhlcm5l
 dCIgfSwKLSAgICB7IDB4MTAzQSwgLTEsICJJbnRlbCA4MjgwMURCIChJQ0g0KSBQcm8vMTAw
 IEV0aGVybmV0IiB9LAotICAgIHsgMHgxMDNCLCAtMSwgIkludGVsIDgyODAxREIgKElDSDQp
 IFByby8xMDAgVk0gRXRoZXJuZXQiIH0sCi0gICAgeyAweDEwM0MsIC0xLCAiSW50ZWwgODI4
 MDFEQiAoSUNINCkgUHJvLzEwMCBFdGhlcm5ldCIgfSwKLSAgICB7IDB4MTAzRCwgLTEsICJJ
 bnRlbCA4MjgwMURCIChJQ0g0KSBQcm8vMTAwIFZFIEV0aGVybmV0IiB9LAotICAgIHsgMHgx
 MDNFLCAtMSwgIkludGVsIDgyODAxREIgKElDSDQpIFByby8xMDAgVk0gRXRoZXJuZXQiIH0s
 Ci0gICAgeyAweDEwNTAsIC0xLCAiSW50ZWwgODI4MDFCQSAoRDg2NSkgUHJvLzEwMCBWRSBF
 dGhlcm5ldCIgfSwKLSAgICB7IDB4MTA1MSwgLTEsICJJbnRlbCA4MjU2MkVUIChJQ0g1L0lD
 SDVSKSBQcm8vMTAwIFZFIEV0aGVybmV0IiB9LAotICAgIHsgMHgxMDU5LCAtMSwgIkludGVs
 IDgyNTUxUU0gUHJvLzEwMCBNIE1vYmlsZSBDb25uZWN0aW9uIiB9LAotICAgIHsgMHgxMDY0
 LCAtMSwgIkludGVsIDgyNTYyRVogKElDSDYpIiB9LAotICAgIHsgMHgxMDY1LCAtMSwgIklu
 dGVsIDgyNTYyRVQvRVovR1QvR1ogUFJPLzEwMCBWRSBFdGhlcm5ldCIgfSwKLSAgICB7IDB4
 MTA2OCwgLTEsICJJbnRlbCA4MjgwMUZCTSAoSUNINi1NKSBQcm8vMTAwIFZFIEV0aGVybmV0
 IiB9LAotICAgIHsgMHgxMDY5LCAtMSwgIkludGVsIDgyNTYyRU0vRVgvR1ggUHJvLzEwMCBF
 dGhlcm5ldCIgfSwKLSAgICB7IDB4MTA5MSwgLTEsICJJbnRlbCA4MjU2MkdYIFByby8xMDAg
 RXRoZXJuZXQiIH0sCi0gICAgeyAweDEwOTIsIC0xLCAiSW50ZWwgUHJvLzEwMCBWRSBOZXR3
 b3JrIENvbm5lY3Rpb24iIH0sCi0gICAgeyAweDEwOTMsIC0xLCAiSW50ZWwgUHJvLzEwMCBW
 TSBOZXR3b3JrIENvbm5lY3Rpb24iIH0sCi0gICAgeyAweDEwOTQsIC0xLCAiSW50ZWwgUHJv
 LzEwMCA5NDZHWiAoSUNINykgTmV0d29yayBDb25uZWN0aW9uIiB9LAotICAgIHsgMHgxMjA5
 LCAtMSwgIkludGVsIDgyNTU5RVIgRW1iZWRkZWQgMTAvMTAwIEV0aGVybmV0IiB9LAotICAg
 IHsgMHgxMjI5LCAweDAxLCAiSW50ZWwgODI1NTcgUHJvLzEwMCBFdGhlcm5ldCIgfSwKLSAg
 ICB7IDB4MTIyOSwgMHgwMiwgIkludGVsIDgyNTU3IFByby8xMDAgRXRoZXJuZXQiIH0sCi0g
 ICAgeyAweDEyMjksIDB4MDMsICJJbnRlbCA4MjU1NyBQcm8vMTAwIEV0aGVybmV0IiB9LAot
 ICAgIHsgMHgxMjI5LCAweDA0LCAiSW50ZWwgODI1NTggUHJvLzEwMCBFdGhlcm5ldCIgfSwK
 LSAgICB7IDB4MTIyOSwgMHgwNSwgIkludGVsIDgyNTU4IFByby8xMDAgRXRoZXJuZXQiIH0s
 Ci0gICAgeyAweDEyMjksIDB4MDYsICJJbnRlbCA4MjU1OSBQcm8vMTAwIEV0aGVybmV0IiB9
 LAotICAgIHsgMHgxMjI5LCAweDA3LCAiSW50ZWwgODI1NTkgUHJvLzEwMCBFdGhlcm5ldCIg
 fSwKLSAgICB7IDB4MTIyOSwgMHgwOCwgIkludGVsIDgyNTU5IFByby8xMDAgRXRoZXJuZXQi
 IH0sCi0gICAgeyAweDEyMjksIDB4MDksICJJbnRlbCA4MjU1OUVSIFByby8xMDAgRXRoZXJu
 ZXQiIH0sCi0gICAgeyAweDEyMjksIDB4MGMsICJJbnRlbCA4MjU1MCBQcm8vMTAwIEV0aGVy
 bmV0IiB9LAotICAgIHsgMHgxMjI5LCAweDBkLCAiSW50ZWwgODI1NTAgUHJvLzEwMCBFdGhl
 cm5ldCIgfSwKLSAgICB7IDB4MTIyOSwgMHgwZSwgIkludGVsIDgyNTUwIFByby8xMDAgRXRo
 ZXJuZXQiIH0sCi0gICAgeyAweDEyMjksIDB4MGYsICJJbnRlbCA4MjU1MSBQcm8vMTAwIEV0
 aGVybmV0IiB9LAotICAgIHsgMHgxMjI5LCAweDEwLCAiSW50ZWwgODI1NTEgUHJvLzEwMCBF
 dGhlcm5ldCIgfSwKLSAgICB7IDB4MTIyOSwgLTEsICJJbnRlbCA4MjU1Ny84LzkgUHJvLzEw
 MCBFdGhlcm5ldCIgfSwKLSAgICB7IDB4MjQ0OSwgLTEsICJJbnRlbCA4MjgwMUJBL0NBTSAo
 SUNIMi8zKSBQcm8vMTAwIEV0aGVybmV0IiB9LAotICAgIHsgMHgyN2RjLCAtMSwgIkludGVs
 IDgyODAxR0IgKElDSDcpIDEwLzEwMCBFdGhlcm5ldCIgfSwKLSAgICB7IDAsIC0xLCBOVUxM
 IH0sCisgICAgeyAweDEwMjksIC0xLCAwLCAiSW50ZWwgODI1NTkgUENJL0NhcmRCdXMgUHJv
 LzEwMCIgfSwKKyAgICB7IDB4MTAzMCwgLTEsIDAsICJJbnRlbCA4MjU1OSBQcm8vMTAwIEV0
 aGVybmV0IiB9LAorICAgIHsgMHgxMDMxLCAtMSwgMywgIkludGVsIDgyODAxQ0FNIChJQ0gz
 KSBQcm8vMTAwIFZFIEV0aGVybmV0IiB9LAorICAgIHsgMHgxMDMyLCAtMSwgMywgIkludGVs
 IDgyODAxQ0FNIChJQ0gzKSBQcm8vMTAwIFZFIEV0aGVybmV0IiB9LAorICAgIHsgMHgxMDMz
 LCAtMSwgMywgIkludGVsIDgyODAxQ0FNIChJQ0gzKSBQcm8vMTAwIFZNIEV0aGVybmV0IiB9
 LAorICAgIHsgMHgxMDM0LCAtMSwgMywgIkludGVsIDgyODAxQ0FNIChJQ0gzKSBQcm8vMTAw
 IFZNIEV0aGVybmV0IiB9LAorICAgIHsgMHgxMDM1LCAtMSwgMywgIkludGVsIDgyODAxQ0FN
 IChJQ0gzKSBQcm8vMTAwIEV0aGVybmV0IiB9LAorICAgIHsgMHgxMDM2LCAtMSwgMywgIklu
 dGVsIDgyODAxQ0FNIChJQ0gzKSBQcm8vMTAwIEV0aGVybmV0IiB9LAorICAgIHsgMHgxMDM3
 LCAtMSwgMywgIkludGVsIDgyODAxQ0FNIChJQ0gzKSBQcm8vMTAwIEV0aGVybmV0IiB9LAor
 ICAgIHsgMHgxMDM4LCAtMSwgMywgIkludGVsIDgyODAxQ0FNIChJQ0gzKSBQcm8vMTAwIFZN
 IEV0aGVybmV0IiB9LAorICAgIHsgMHgxMDM5LCAtMSwgNCwgIkludGVsIDgyODAxREIgKElD
 SDQpIFByby8xMDAgVkUgRXRoZXJuZXQiIH0sCisgICAgeyAweDEwM0EsIC0xLCA0LCAiSW50
 ZWwgODI4MDFEQiAoSUNINCkgUHJvLzEwMCBFdGhlcm5ldCIgfSwKKyAgICB7IDB4MTAzQiwg
 LTEsIDQsICJJbnRlbCA4MjgwMURCIChJQ0g0KSBQcm8vMTAwIFZNIEV0aGVybmV0IiB9LAor
 ICAgIHsgMHgxMDNDLCAtMSwgNCwgIkludGVsIDgyODAxREIgKElDSDQpIFByby8xMDAgRXRo
 ZXJuZXQiIH0sCisgICAgeyAweDEwM0QsIC0xLCA0LCAiSW50ZWwgODI4MDFEQiAoSUNINCkg
 UHJvLzEwMCBWRSBFdGhlcm5ldCIgfSwKKyAgICB7IDB4MTAzRSwgLTEsIDQsICJJbnRlbCA4
 MjgwMURCIChJQ0g0KSBQcm8vMTAwIFZNIEV0aGVybmV0IiB9LAorICAgIHsgMHgxMDUwLCAt
 MSwgNSwgIkludGVsIDgyODAxQkEgKEQ4NjUpIFByby8xMDAgVkUgRXRoZXJuZXQiIH0sCisg
 ICAgeyAweDEwNTEsIC0xLCA1LCAiSW50ZWwgODI1NjJFVCAoSUNINS9JQ0g1UikgUHJvLzEw
 MCBWRSBFdGhlcm5ldCIgfSwKKyAgICB7IDB4MTA1OSwgLTEsIDAsICJJbnRlbCA4MjU1MVFN
 IFByby8xMDAgTSBNb2JpbGUgQ29ubmVjdGlvbiIgfSwKKyAgICB7IDB4MTA2NCwgLTEsIDYs
 ICJJbnRlbCA4MjU2MkVaIChJQ0g2KSIgfSwKKyAgICB7IDB4MTA2NSwgLTEsIDYsICJJbnRl
 bCA4MjU2MkVUL0VaL0dUL0daIFBSTy8xMDAgVkUgRXRoZXJuZXQiIH0sCisgICAgeyAweDEw
 NjgsIC0xLCA2LCAiSW50ZWwgODI4MDFGQk0gKElDSDYtTSkgUHJvLzEwMCBWRSBFdGhlcm5l
 dCIgfSwKKyAgICB7IDB4MTA2OSwgLTEsIDYsICJJbnRlbCA4MjU2MkVNL0VYL0dYIFByby8x
 MDAgRXRoZXJuZXQiIH0sCisgICAgeyAweDEwOTEsIC0xLCA3LCAiSW50ZWwgODI1NjJHWCBQ
 cm8vMTAwIEV0aGVybmV0IiB9LAorICAgIHsgMHgxMDkyLCAtMSwgNywgIkludGVsIFByby8x
 MDAgVkUgTmV0d29yayBDb25uZWN0aW9uIiB9LAorICAgIHsgMHgxMDkzLCAtMSwgNywgIklu
 dGVsIFByby8xMDAgVk0gTmV0d29yayBDb25uZWN0aW9uIiB9LAorICAgIHsgMHgxMDk0LCAt
 MSwgNywgIkludGVsIFByby8xMDAgOTQ2R1ogKElDSDcpIE5ldHdvcmsgQ29ubmVjdGlvbiIg
 fSwKKyAgICB7IDB4MTIwOSwgLTEsIDAsICJJbnRlbCA4MjU1OUVSIEVtYmVkZGVkIDEwLzEw
 MCBFdGhlcm5ldCIgfSwKKyAgICB7IDB4MTIyOSwgMHgwMSwgMCwgIkludGVsIDgyNTU3IFBy
 by8xMDAgRXRoZXJuZXQiIH0sCisgICAgeyAweDEyMjksIDB4MDIsIDAsICJJbnRlbCA4MjU1
 NyBQcm8vMTAwIEV0aGVybmV0IiB9LAorICAgIHsgMHgxMjI5LCAweDAzLCAwLCAiSW50ZWwg
 ODI1NTcgUHJvLzEwMCBFdGhlcm5ldCIgfSwKKyAgICB7IDB4MTIyOSwgMHgwNCwgMCwgIklu
 dGVsIDgyNTU4IFByby8xMDAgRXRoZXJuZXQiIH0sCisgICAgeyAweDEyMjksIDB4MDUsIDAs
 ICJJbnRlbCA4MjU1OCBQcm8vMTAwIEV0aGVybmV0IiB9LAorICAgIHsgMHgxMjI5LCAweDA2
 LCAwLCAiSW50ZWwgODI1NTkgUHJvLzEwMCBFdGhlcm5ldCIgfSwKKyAgICB7IDB4MTIyOSwg
 MHgwNywgMCwgIkludGVsIDgyNTU5IFByby8xMDAgRXRoZXJuZXQiIH0sCisgICAgeyAweDEy
 MjksIDB4MDgsIDAsICJJbnRlbCA4MjU1OSBQcm8vMTAwIEV0aGVybmV0IiB9LAorICAgIHsg
 MHgxMjI5LCAweDA5LCAwLCAiSW50ZWwgODI1NTlFUiBQcm8vMTAwIEV0aGVybmV0IiB9LAor
 ICAgIHsgMHgxMjI5LCAweDBjLCAwLCAiSW50ZWwgODI1NTAgUHJvLzEwMCBFdGhlcm5ldCIg
 fSwKKyAgICB7IDB4MTIyOSwgMHgwZCwgMCwgIkludGVsIDgyNTUwIFByby8xMDAgRXRoZXJu
 ZXQiIH0sCisgICAgeyAweDEyMjksIDB4MGUsIDAsICJJbnRlbCA4MjU1MCBQcm8vMTAwIEV0
 aGVybmV0IiB9LAorICAgIHsgMHgxMjI5LCAweDBmLCAwLCAiSW50ZWwgODI1NTEgUHJvLzEw
 MCBFdGhlcm5ldCIgfSwKKyAgICB7IDB4MTIyOSwgMHgxMCwgMCwgIkludGVsIDgyNTUxIFBy
 by8xMDAgRXRoZXJuZXQiIH0sCisgICAgeyAweDEyMjksIC0xLCAwLCAiSW50ZWwgODI1NTcv
 OC85IFByby8xMDAgRXRoZXJuZXQiIH0sCisgICAgeyAweDI0NDksIC0xLCAyLCAiSW50ZWwg
 ODI4MDFCQS9DQU0gKElDSDIvMykgUHJvLzEwMCBFdGhlcm5ldCIgfSwKKyAgICB7IDB4Mjdk
 YywgLTEsIDcsICJJbnRlbCA4MjgwMUdCIChJQ0g3KSAxMC8xMDAgRXRoZXJuZXQiIH0sCisg
 ICAgeyAwLCAtMSwgMCwgTlVMTCB9LAogfTsKIAogI2lmZGVmIEZYUF9JUF9DU1VNX1dBUgpA
 QCAtMjE0LDYgKzIwOCw3IEBACiBzdGF0aWMgaW50ICBmeHBfc3VzcGVuZChkZXZpY2VfdCBk
 ZXYpOwogc3RhdGljIGludCAgZnhwX3Jlc3VtZShkZXZpY2VfdCBkZXYpOwogCitzdGF0aWMg
 c3RydWN0IGZ4cF9pZGVudCAqZnhwX2ZpbmRfaWRlbnQoZGV2aWNlX3QgZGV2KTsKIHN0YXRp
 YyB2b2lkICBmeHBfaW50cih2b2lkICp4c2MpOwogc3RhdGljIHZvaWQgIGZ4cF9yeGNzdW0o
 c3RydWN0IGZ4cF9zb2Z0YyAqc2MsIHN0cnVjdCBpZm5ldCAqaWZwLAogICAgICAgIHN0cnVj
 dCBtYnVmICptLCB1aW50MTZfdCBzdGF0dXMsIGludCBwb3MpOwpAQCAtMzYwLDExICszNTUs
 OCBAQAogICBkZXZpY2VfcHJpbnRmKHNjLT5kZXYsICJETUEgdGltZW91dFxuIik7CiB9CiAK
 LS8qCi0gKiBSZXR1cm4gaWRlbnRpZmljYXRpb24gc3RyaW5nIGlmIHRoaXMgZGV2aWNlIGlz
 IG91cnMuCi0gKi8KLXN0YXRpYyBpbnQKLWZ4cF9wcm9iZShkZXZpY2VfdCBkZXYpCitzdGF0
 aWMgc3RydWN0IGZ4cF9pZGVudCAqCitmeHBfZmluZF9pZGVudChkZXZpY2VfdCBkZXYpCiB7
 CiAgdWludDE2X3QgZGV2aWQ7CiAgdWludDhfdCByZXZpZDsKQEAgLTM3NiwxMSArMzY4LDI2
 IEBACiAgIGZvciAoaWRlbnQgPSBmeHBfaWRlbnRfdGFibGU7IGlkZW50LT5uYW1lICE9IE5V
 TEw7IGlkZW50KyspIHsKICAgIGlmIChpZGVudC0+ZGV2aWQgPT0gZGV2aWQgJiYKICAgICAg
 ICAoaWRlbnQtPnJldmlkID09IHJldmlkIHx8IGlkZW50LT5yZXZpZCA9PSAtMSkpIHsKLSAg
 ICBkZXZpY2Vfc2V0X2Rlc2MoZGV2LCBpZGVudC0+bmFtZSk7Ci0gICAgcmV0dXJuIChCVVNf
 UFJPQkVfREVGQVVMVCk7CisgICAgcmV0dXJuIChpZGVudCk7CiAgICB9CiAgIH0KICB9Cisg
 cmV0dXJuIChOVUxMKTsKK30KKworLyoKKyAqIFJldHVybiBpZGVudGlmaWNhdGlvbiBzdHJp
 bmcgaWYgdGhpcyBkZXZpY2UgaXMgb3Vycy4KKyAqLworc3RhdGljIGludAorZnhwX3Byb2Jl
 KGRldmljZV90IGRldikKK3sKKyBzdHJ1Y3QgZnhwX2lkZW50ICppZGVudDsKKworIGlkZW50
 ID0gZnhwX2ZpbmRfaWRlbnQoZGV2KTsKKyBpZiAoaWRlbnQgIT0gTlVMTCkgeworICBkZXZp
 Y2Vfc2V0X2Rlc2MoZGV2LCBpZGVudC0+bmFtZSk7CisgIHJldHVybiAoQlVTX1BST0JFX0RF
 RkFVTFQpOworIH0KICByZXR1cm4gKEVOWElPKTsKIH0KIApAQCAtNDY2LDEwICs0NzMsMTQg
 QEAKICB9CiAKICAvKgotICAqIFJlc2V0IHRvIGEgc3RhYmxlIHN0YXRlLgorICAqIFB1dCBD
 VS9SVSBpZGxlIHN0YXRlIGFuZCBwcmVwYXJlIGZ1bGwgcmVzZXQuCiAgICovCiAgQ1NSX1dS
 SVRFXzQoc2MsIEZYUF9DU1JfUE9SVCwgRlhQX1BPUlRfU0VMRUNUSVZFX1JFU0VUKTsKICBE
 RUxBWSgxMCk7CisgLyogRnVsbCByZXNldCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLiAqLwor
 IENTUl9XUklURV80KHNjLCBGWFBfQ1NSX1BPUlQsIEZYUF9QT1JUX1NPRlRXQVJFX1JFU0VU
 KTsKKyBERUxBWSgxMCk7CisgQ1NSX1dSSVRFXzEoc2MsIEZYUF9DU1JfU0NCX0lOVFJDTlRM
 LCBGWFBfU0NCX0lOVFJfRElTQUJMRSk7CiAKICAvKgogICAqIEZpbmQgb3V0IGhvdyBsYXJn
 ZSBvZiBhbiBTRUVQUk9NIHdlIGhhdmUuCkBAIC00NzksMTEgKzQ5MCwxNyBAQAogIC8qCiAg
 ICogRmluZCBvdXQgdGhlIGNoaXAgcmV2aXNpb247IGx1bXAgYWxsIDgyNTU3IHJldnMgdG9n
 ZXRoZXIuCiAgICovCi0gZnhwX3JlYWRfZWVwcm9tKHNjLCAmZGF0YSwgNSwgMSk7Ci0gaWYg
 KChkYXRhID4+IDgpID09IDEpCi0gIHNjLT5yZXZpc2lvbiA9IEZYUF9SRVZfODI1NTc7Ci0g
 ZWxzZQotICBzYy0+cmV2aXNpb24gPSBwY2lfZ2V0X3JldmlkKGRldik7Cisgc2MtPmlkZW50
 ID0gZnhwX2ZpbmRfaWRlbnQoZGV2KTsKKyBpZiAoc2MtPmlkZW50LT5pY2ggPiAwKSB7Cisg
 IC8qIEFzc3VtZSBJQ0ggY29udHJvbGxlcnMgYXJlIDgyNTU5LiAqLworICBzYy0+cmV2aXNp
 b24gPSBGWFBfUkVWXzgyNTU5X0EwOworIH0gZWxzZSB7CisgIGZ4cF9yZWFkX2VlcHJvbShz
 YywgJmRhdGEsIDUsIDEpOworICBpZiAoKGRhdGEgPj4gOCkgPT0gMSkKKyAgIHNjLT5yZXZp
 c2lvbiA9IEZYUF9SRVZfODI1NTc7CisgIGVsc2UKKyAgIHNjLT5yZXZpc2lvbiA9IHBjaV9n
 ZXRfcmV2aWQoZGV2KTsKKyB9CiAKICAvKgogICAqIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBX
 T0wuIDgyNTU5RVIgZG9lcyBub3Qgc3VwcG9ydCBXT0wuCkBAIC01NDksOSArNTY2LDggQEAK
 ICAgKgogICAqIFNlZSBJbnRlbCA4MjgwMUJBLzgyODAxQkFNIFNwZWNpZmljYXRpb24gVXBk
 YXRlLCBFcnJhdGEgIzMwLgogICAqLwotIGkgPSBwY2lfZ2V0X2RldmljZShkZXYpOwotIGlm
 IChpID09IDB4MjQ0OSB8fCAoaSA+IDB4MTAzMCAmJiBpIDwgMHgxMDM5KSB8fAotICAgICBz
 Yy0+cmV2aXNpb24gPj0gRlhQX1JFVl84MjU1OV9BMCkgeworIGlmICgoc2MtPmlkZW50LT5p
 Y2ggPj0gMiAmJiBzYy0+aWRlbnQtPmljaCA8PSAzKSB8fAorICAgICAoc2MtPmlkZW50LT5p
 Y2ggPT0gMCAmJiBzYy0+cmV2aXNpb24gPj0gRlhQX1JFVl84MjU1OV9BMCkpIHsKICAgZnhw
 X3JlYWRfZWVwcm9tKHNjLCAmZGF0YSwgMTAsIDEpOwogICBpZiAoZGF0YSAmIDB4MDIpIHsg
 ICAvKiBTVEIgZW5hYmxlICovCiAgICB1aW50MTZfdCBja3N1bTsKQEAgLTIyMTMsOSArMjIy
 OSwxMyBAQAogCiAgLyoKICAgKiBBdHRlbXB0IHRvIGxvYWQgbWljcm9jb2RlIGlmIHJlcXVl
 c3RlZC4KKyAgKiBGb3IgSUNIIGJhc2VkIGNvbnRyb2xsZXJzIGRvIG5vdCBsb2FkIG1pY3Jv
 Y29kZS4KICAgKi8KLSBpZiAoaWZwLT5pZl9mbGFncyAmIElGRl9MSU5LMCAmJiAoc2MtPmZs
 YWdzICYgRlhQX0ZMQUdfVUNPREUpID09IDApCi0gIGZ4cF9sb2FkX3Vjb2RlKHNjKTsKKyBp
 ZiAoc2MtPmlkZW50LT5pY2ggPT0gMCkgeworICBpZiAoaWZwLT5pZl9mbGFncyAmIElGRl9M
 SU5LMCAmJgorICAgICAgKHNjLT5mbGFncyAmIEZYUF9GTEFHX1VDT0RFKSA9PSAwKQorICAg
 ZnhwX2xvYWRfdWNvZGUoc2MpOworIH0KIAogIC8qCiAgICogSW5pdGlhbGl6ZSB0aGUgbXVs
 dGljYXN0IGFkZHJlc3MgbGlzdC4KCi==
 
 ------=_NextPart_4DE19F84_DEE0A958_10A50BAA--
 
>Unformatted:
