Subject: Re: Cardbus support for Realtek 8139C/8169?
To: None <jonathan@dsg.stanford.edu>
From: Masanori Kanaoka <kanaoka@ann.hi-ho.ne.jp>
List: tech-kern
Date: 01/07/2005 00:31:30
----Security_Multipart0(Fri_Jan__7_00_31_30_2005_711)--
Content-Type: Multipart/Mixed;
 boundary="--Next_Part(Fri_Jan__7_00_31_30_2005_463)--"
Content-Transfer-Encoding: 7bit

----Next_Part(Fri_Jan__7_00_31_30_2005_463)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hi,

       From: "Jonathan Stone" <jonathan@dsg.stanford.edu>
    Subject: Re: Cardbus support for Realtek 8139C/8169?
      Date : Fri, 29 Oct 2004 10:08:21 -0700
 Message-ID: <E1CNaEf-0002zU-00@smeg.dsg.stanford.edu>

$ rtl81x9.c is already taken for the 8129/8139/8193C backend driver.
$ Perhaps rtl8169.c?

I tried to write a patch for bus_dma* resources problem and attached it.
If there is no objection, I'll commit it on next sunday.

Changes are below:
---
sys/dev/ic/rtl8169.c:
 - re_attach(): Use bus_dma* directly instead of calling re_alloc().
 - re_attach(): Free bus_dma* resources if attach fails.
 - re_detach(): Free bus_dma* resources.
 - re_newbuf(): Remove unnecessary error check.
 - Use aprint_*.
 - Change some cosmetic.

sys/dev/ic/rtl81x9reg.h:
 - Define RTK_NTXSEGS.

sys/dev/ic/rtl81x9var.h:
 - Add new members to struct rtk_list_data for bus_dma*. 
---

Best Regards!
---
 Masanori Kanaoka        kanaoka AT ann.hi-ho.ne.jp


----Next_Part(Fri_Jan__7_00_31_30_2005_463)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="re-20050106.diff"

Index: rtl8169.c
===================================================================
RCS file: /ftp/cvs/src/sys/dev/ic/rtl8169.c,v
retrieving revision 1.3
diff -u -r1.3 rtl8169.c
--- rtl8169.c	26 Dec 2004 07:27:41 -0000	1.3
+++ rtl8169.c	6 Jan 2005 14:34:53 -0000
@@ -154,52 +154,38 @@
 #include <dev/ic/rtl8169var.h>
 
 
-/*
- * In FreeBSD and OpenBSD's derivative, re_detach is disabled
- * by  #if 0/#endif.  On NetBSD,  we support cardbus attachments,
- * which require if_detach. So re-enable re_detach().  jonathan, 2004-10-08.
- */
-
-int	re_detach(struct rtk_softc *);
-
-static int re_encap		(struct rtk_softc *, struct mbuf *, int *);
-
-static int re_allocmem		(struct rtk_softc *);
-static int re_newbuf		(struct rtk_softc *, int, struct mbuf *);
-static int re_rx_list_init	(struct rtk_softc *);
-static int re_tx_list_init	(struct rtk_softc *);
-static void re_rxeof		(struct rtk_softc *);
-static void re_txeof		(struct rtk_softc *);
-static void re_tick		(void *);
-static void re_start		(struct ifnet *);
-static int re_ioctl		(struct ifnet *, u_long, caddr_t);
-static int re_init		(struct ifnet *);
-static void re_stop		(struct ifnet *, int);
-static void re_watchdog		(struct ifnet *);
-#if 0
-static int re_suspend		(device_t);
-static int re_resume		(device_t);
-static void re_shutdown		(device_t);
-#endif
-
-static void re_shutdown		(void *);
-static int  re_enable		(struct rtk_softc *);
-static void re_disable		(struct rtk_softc *);
-static void re_power		(int, void *);
+static int re_encap(struct rtk_softc *, struct mbuf *, int *);
 
-static int re_ifmedia_upd	(struct ifnet *);
-static void re_ifmedia_sts	(struct ifnet *, struct ifmediareq *);
+static int re_newbuf(struct rtk_softc *, int, struct mbuf *);
+static int re_rx_list_init(struct rtk_softc *);
+static int re_tx_list_init(struct rtk_softc *);
+static void re_rxeof(struct rtk_softc *);
+static void re_txeof(struct rtk_softc *);
+static void re_tick(void *);
+static void re_start(struct ifnet *);
+static int re_ioctl(struct ifnet *, u_long, caddr_t);
+static int re_init(struct ifnet *);
+static void re_stop(struct ifnet *, int);
+static void re_watchdog(struct ifnet *);
+
+static void re_shutdown(void *);
+static int re_enable(struct rtk_softc *);
+static void re_disable(struct rtk_softc *);
+static void re_power(int, void *);
+
+static int re_ifmedia_upd(struct ifnet *);
+static void re_ifmedia_sts(struct ifnet *, struct ifmediareq *);
+
+static int re_gmii_readreg(struct device *, int, int);
+static void re_gmii_writereg(struct device *, int, int, int);
+
+static int re_miibus_readreg(struct device *, int, int);
+static void re_miibus_writereg(struct device *, int, int, int);
+static void re_miibus_statchg(struct device *);
 
-static int re_gmii_readreg	(struct device *, int, int);
-static void re_gmii_writereg	(struct device *, int, int, int);
+static void re_reset(struct rtk_softc *);
 
-static int re_miibus_readreg	(struct device *, int, int);
-static void re_miibus_writereg	(struct device *, int, int, int);
-static void re_miibus_statchg	(struct device *);
-
-static void re_reset		(struct rtk_softc *);
-
-static int re_diag		(struct rtk_softc *);
+static int re_diag(struct rtk_softc *);
 
 #ifdef RE_USEIOSPACE
 #define RTK_RES			SYS_RES_IOPORT
@@ -225,13 +211,13 @@
 	int			i;
 
 	if (phy != 7)
-		return(0);
+		return 0;
 
 	/* Let the rgephy driver read the GMEDIASTAT register */
 
 	if (reg == RTK_GMEDIASTAT) {
 		rval = CSR_READ_1(sc, RTK_GMEDIASTAT);
-		return(rval);
+		return rval;
 	}
 
 	CSR_WRITE_4(sc, RTK_PHYAR, reg << 16);
@@ -245,11 +231,11 @@
 	}
 
 	if (i == RTK_TIMEOUT) {
-		printf ("%s: PHY read failed\n", sc->sc_dev.dv_xname);
-		return (0);
+		aprint_error("%s: PHY read failed\n", sc->sc_dev.dv_xname);
+		return 0;
 	}
 
-	return (rval & RTK_PHYAR_PHYDATA);
+	return rval & RTK_PHYAR_PHYDATA;
 }
 
 static void
@@ -271,8 +257,8 @@
 	}
 
 	if (i == RTK_TIMEOUT) {
-		printf ("%s: PHY write reg %x <- %x failed\n",
-			sc->sc_dev.dv_xname, reg, data);
+		aprint_error("%s: PHY write reg %x <- %x failed\n",
+		    sc->sc_dev.dv_xname, reg, data);
 		return;
 	}
 
@@ -292,15 +278,15 @@
 	if (sc->rtk_type == RTK_8169) {
 		rval = re_gmii_readreg(dev, phy, reg);
 		splx(s);
-		return (rval);
+		return rval;
 	}
 
 	/* Pretend the internal PHY is only at address 0 */
 	if (phy) {
 		splx(s);
-		return(0);
+		return 0;
 	}
-	switch(reg) {
+	switch (reg) {
 	case MII_BMCR:
 		re8139_reg = RTK_BMCR;
 		break;
@@ -319,7 +305,7 @@
 	case MII_PHYIDR1:
 	case MII_PHYIDR2:
 		splx(s);
-		return(0);
+		return 0;
 	/*
 	 * Allow the rlphy driver to read the media status
 	 * register. If we have a link partner which does not
@@ -329,15 +315,15 @@
 	case RTK_MEDIASTAT:
 		rval = CSR_READ_1(sc, RTK_MEDIASTAT);
 		splx(s);
-		return(rval);
+		return rval;
 	default:
-		printf("%s: bad phy register\n", sc->sc_dev.dv_xname);
+		aprint_error("%s: bad phy register\n", sc->sc_dev.dv_xname);
 		splx(s);
-		return(0);
+		return 0;
 	}
 	rval = CSR_READ_2(sc, re8139_reg);
 	splx(s);
-	return(rval);
+	return rval;
 }
 
 static void
@@ -360,7 +346,7 @@
 		splx(s);
 		return;
 	}
-	switch(reg) {
+	switch (reg) {
 	case MII_BMCR:
 		re8139_reg = RTK_BMCR;
 		break;
@@ -382,7 +368,7 @@
 		return;
 		break;
 	default:
-		printf("%s: bad phy register\n", sc->sc_dev.dv_xname);
+		aprint_error("%s: bad phy register\n", sc->sc_dev.dv_xname);
 		splx(s);
 		return;
 	}
@@ -411,14 +397,15 @@
 			break;
 	}
 	if (i == RTK_TIMEOUT)
-		printf("%s: reset never completed!\n", sc->sc_dev.dv_xname);
+		aprint_error("%s: reset never completed!\n",
+		    sc->sc_dev.dv_xname);
 
 	/*
 	 * NB: Realtek-supplied Linux driver does this only for
 	 * MCFG_METHOD_2, which corresponds to sc->sc_rev == 2.
 	 */
-	if (1) /*XXX check softc flag for 8169s version */
-	  CSR_WRITE_1(sc, 0x82, 1);
+	if (1) /* XXX check softc flag for 8169s version */
+		CSR_WRITE_1(sc, 0x82, 1);
 
 	return;
 }
@@ -461,7 +448,7 @@
 
 	MGETHDR(m0, M_DONTWAIT, MT_DATA);
 	if (m0 == NULL)
-		return(ENOBUFS);
+		return ENOBUFS;
 
 	/*
 	 * Initialize the NIC in test mode. This sets the chip up
@@ -475,15 +462,15 @@
 	ifp->if_flags |= IFF_PROMISC;
 	sc->rtk_testmode = 1;
 	re_init(ifp);
-	re_stop(ifp,1);
+	re_stop(ifp, 1);
 	DELAY(100000);
 	re_init(ifp);
 
 	/* Put some data in the mbuf */
 
 	eh = mtod(m0, struct ether_header *);
-	bcopy ((char *)&dst, eh->ether_dhost, ETHER_ADDR_LEN);
-	bcopy ((char *)&src, eh->ether_shost, ETHER_ADDR_LEN);
+	bcopy((char *)&dst, eh->ether_dhost, ETHER_ADDR_LEN);
+	bcopy((char *)&src, eh->ether_shost, ETHER_ADDR_LEN);
 	eh->ether_type = htons(ETHERTYPE_IP);
 	m0->m_pkthdr.len = m0->m_len = ETHER_MIN_LEN - ETHER_CRC_LEN;
 
@@ -509,7 +496,7 @@
 		DELAY(10);
 	}
 	if (i == RTK_TIMEOUT) {
-		printf("%s: diagnostic failed, failed to receive packet "
+		aprint_error("%s: diagnostic failed, failed to receive packet "
 		    "in loopback mode\n", sc->sc_dev.dv_xname);
 		error = EIO;
 		goto done;
@@ -538,7 +525,7 @@
 	rxstat = le32toh(cur_rx->rtk_cmdstat);
 
 	if (total_len != ETHER_MIN_LEN) {
-		printf("%s: diagnostic failed, received short packet\n",
+		aprint_error("%s: diagnostic failed, received short packet\n",
 		    sc->sc_dev.dv_xname);
 		error = EIO;
 		goto done;
@@ -549,20 +536,21 @@
 	if (bcmp((char *)&eh->ether_dhost, (char *)&dst, ETHER_ADDR_LEN) ||
 	    bcmp((char *)&eh->ether_shost, (char *)&src, ETHER_ADDR_LEN) ||
 	    ntohs(eh->ether_type) != ETHERTYPE_IP) {
-		printf("%s: WARNING, DMA FAILURE!\n", sc->sc_dev.dv_xname);
-		printf("%s: expected TX data: %s",
+		aprint_error("%s: WARNING, DMA FAILURE!\n",
+		    sc->sc_dev.dv_xname);
+		aprint_error("%s: expected TX data: %s",
 		    sc->sc_dev.dv_xname, ether_sprintf(dst));
-		printf("/%s/0x%x\n", ether_sprintf(src), ETHERTYPE_IP);
-		printf("%s: received RX data: %s",
+		aprint_error("/%s/0x%x\n", ether_sprintf(src), ETHERTYPE_IP);
+		aprint_error("%s: received RX data: %s",
 		    sc->sc_dev.dv_xname,
 		    ether_sprintf(eh->ether_dhost));
-		printf("/%s/0x%x\n", ether_sprintf(eh->ether_shost),
+		aprint_error("/%s/0x%x\n", ether_sprintf(eh->ether_shost),
 		    ntohs(eh->ether_type));
-		printf("%s: You may have a defective 32-bit NIC plugged "
+		aprint_error("%s: You may have a defective 32-bit NIC plugged "
 		    "into a 64-bit PCI slot.\n", sc->sc_dev.dv_xname);
-		printf("%s: Please re-install the NIC in a 32-bit slot "
+		aprint_error("%s: Please re-install the NIC in a 32-bit slot "
 		    "for proper operation.\n", sc->sc_dev.dv_xname);
-		printf("%s: Read the re(4) man page for more details.\n",
+		aprint_error("%s: Read the re(4) man page for more details.\n",
 		    sc->sc_dev.dv_xname);
 		error = EIO;
 	}
@@ -572,89 +560,13 @@
 
 	sc->rtk_testmode = 0;
 	ifp->if_flags &= ~IFF_PROMISC;
-	re_stop(ifp,1);
+	re_stop(ifp, 1);
 	if (m0 != NULL)
 		m_freem(m0);
 
-	return (error);
+	return error;
 }
 
-static int
-re_allocmem(struct rtk_softc *sc)
-{
-	int			error;
-	int			nseg, rseg;
-	int			i;
-
-	nseg = 32;
-
-	/* Allocate DMA'able memory for the TX ring */
-
-	error = bus_dmamap_create(sc->sc_dmat, RTK_TX_LIST_SZ, 1,
-	    RTK_TX_LIST_SZ, 0, BUS_DMA_ALLOCNOW,
-	    &sc->rtk_ldata.rtk_tx_list_map);
-        error = bus_dmamem_alloc(sc->sc_dmat, RTK_TX_LIST_SZ,
-	    RTK_ETHER_ALIGN, 0, 
-	    &sc->rtk_ldata.rtk_tx_listseg, 1, &rseg, BUS_DMA_NOWAIT);
-        if (error)
-                return (ENOMEM);
-
-	/* Load the map for the TX ring. */
-	error = bus_dmamem_map(sc->sc_dmat, &sc->rtk_ldata.rtk_tx_listseg,
-	    1, RTK_TX_LIST_SZ,
-	    (caddr_t *)&sc->rtk_ldata.rtk_tx_list, BUS_DMA_NOWAIT);
-	memset(sc->rtk_ldata.rtk_tx_list, 0, RTK_TX_LIST_SZ);
-
-	error = bus_dmamap_load(sc->sc_dmat, sc->rtk_ldata.rtk_tx_list_map,
-	    sc->rtk_ldata.rtk_tx_list, RTK_TX_LIST_SZ, NULL, BUS_DMA_NOWAIT);
-
-	/* Create DMA maps for TX buffers */
-
-	for (i = 0; i < RTK_TX_DESC_CNT; i++) {
-		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES * nseg, nseg,
-		    MCLBYTES, 0, BUS_DMA_ALLOCNOW,
-		    &sc->rtk_ldata.rtk_tx_dmamap[i]);
-		if (error) {
-			printf("%s: can't create DMA map for TX\n",
-			    sc->sc_dev.dv_xname);
-			return(ENOMEM);
-		}
-	}
-
-	/* Allocate DMA'able memory for the RX ring */
-
-	error = bus_dmamap_create(sc->sc_dmat, RTK_RX_LIST_SZ, 1,
-	    RTK_RX_LIST_SZ, 0, BUS_DMA_ALLOCNOW,
-	    &sc->rtk_ldata.rtk_rx_list_map);
-        error = bus_dmamem_alloc(sc->sc_dmat, RTK_RX_LIST_SZ, RTK_RING_ALIGN,
-	    0, &sc->rtk_ldata.rtk_rx_listseg, 1, &rseg, BUS_DMA_NOWAIT);
-        if (error)
-                return (ENOMEM);
-
-	/* Load the map for the RX ring. */
-	error = bus_dmamem_map(sc->sc_dmat, &sc->rtk_ldata.rtk_rx_listseg,
-	    1, RTK_RX_LIST_SZ,
-	    (caddr_t *)&sc->rtk_ldata.rtk_rx_list, BUS_DMA_NOWAIT);
-	memset(sc->rtk_ldata.rtk_rx_list, 0, RTK_TX_LIST_SZ);
-
-	error = bus_dmamap_load(sc->sc_dmat, sc->rtk_ldata.rtk_rx_list_map,
-	     sc->rtk_ldata.rtk_rx_list, RTK_RX_LIST_SZ, NULL, BUS_DMA_NOWAIT);
-
-	/* Create DMA maps for RX buffers */
-
-	for (i = 0; i < RTK_RX_DESC_CNT; i++) {
-		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES * nseg, nseg,
-		    MCLBYTES, 0, BUS_DMA_ALLOCNOW,
-		    &sc->rtk_ldata.rtk_rx_dmamap[i]);
-		if (error) {
-			printf("%s: can't create DMA map for RX\n",
-			    sc->sc_dev.dv_xname);
-			return(ENOMEM);
-		}
-	}
-
-	return(0);
-}
 
 /*
  * Attach the interface. Allocate softc structures, do ifmedia
@@ -668,6 +580,7 @@
 	struct ifnet		*ifp;
 	int			error = 0, i, addr_len;
 
+
 	/* XXX JRS: bus-attach-independent code begins approximately here */
 
 	/* Reset the adapter. */
@@ -687,8 +600,8 @@
 		} else
 			sc->sc_rev = 1;
 #if defined(DEBUG) || 1
-		printf("re_attach: MAC chip hwrev 0x%x softc %d\n",
-		       hwrev, sc->sc_rev);
+		aprint_normal("re_attach: MAC chip hwrev 0x%x softc %d\n",
+		    hwrev, sc->sc_rev);
 #endif
 
 		/* Set RX length mask */
@@ -704,10 +617,11 @@
 			DELAY(100);
 		}
 		if (i == RTK_TIMEOUT)
-			printf ("%s: eeprom autoload timed out\n", sc->sc_dev.dv_xname);
+			aprint_error("%s: eeprom autoload timed out\n",
+			    sc->sc_dev.dv_xname);
 
-			for (i = 0; i < ETHER_ADDR_LEN; i++)
-				eaddr[i] = CSR_READ_1(sc, RTK_IDR0 + i);
+		for (i = 0; i < ETHER_ADDR_LEN; i++)
+			eaddr[i] = CSR_READ_1(sc, RTK_IDR0 + i);
 	} else {
 
 		/* Set RX length mask */
@@ -732,12 +646,101 @@
 	aprint_normal("%s: Ethernet address %s\n",
 	    sc->sc_dev.dv_xname, ether_sprintf(eaddr));
 
-	error = re_allocmem(sc);
 
-	if (error) {
-		printf("%s: attach aborted, re_allocmem() failure\n",
-		    sc->sc_dev.dv_xname);
-		goto fail;
+	/* Allocate DMA'able memory for the TX ring */
+	if ((error = bus_dmamem_alloc(sc->sc_dmat, RTK_TX_LIST_SZ, 
+		    RTK_ETHER_ALIGN, 0, &sc->rtk_ldata.rtk_tx_listseg, 
+		    1, &sc->rtk_ldata.rtk_tx_listnseg, BUS_DMA_NOWAIT)) != 0) {
+		aprint_error("%s: can't allocate tx listseg, error = %d\n",
+		    sc->sc_dev.dv_xname, error);
+		goto fail_0;
+	}
+
+	/* Load the map for the TX ring. */
+	if ((error = bus_dmamem_map(sc->sc_dmat, &sc->rtk_ldata.rtk_tx_listseg,
+		    sc->rtk_ldata.rtk_tx_listnseg, RTK_TX_LIST_SZ, 
+		    (caddr_t *)&sc->rtk_ldata.rtk_tx_list,
+		    BUS_DMA_NOWAIT)) != 0) {
+		aprint_error("%s: can't map tx list, error = %d\n",
+		    sc->sc_dev.dv_xname, error);
+	  	goto fail_1;
+	}
+	memset(sc->rtk_ldata.rtk_tx_list, 0, RTK_TX_LIST_SZ);
+
+	if ((error = bus_dmamap_create(sc->sc_dmat, RTK_TX_LIST_SZ, 1, 
+		    RTK_TX_LIST_SZ, 0, BUS_DMA_ALLOCNOW, 
+		    &sc->rtk_ldata.rtk_tx_list_map)) != 0) {
+		aprint_error("%s: can't create tx list map, error = %d\n",
+		    sc->sc_dev.dv_xname, error);
+		goto fail_2;
+	}
+
+
+	if ((error = bus_dmamap_load(sc->sc_dmat, 
+		    sc->rtk_ldata.rtk_tx_list_map, sc->rtk_ldata.rtk_tx_list, 
+		    RTK_TX_LIST_SZ, NULL, BUS_DMA_NOWAIT)) != 0) {
+		aprint_error("%s: can't load tx list, error = %d\n",
+		    sc->sc_dev.dv_xname, error);
+		goto fail_3;
+	}
+
+	/* Create DMA maps for TX buffers */
+	for (i = 0; i < RTK_TX_DESC_CNT; i++) {
+		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES * RTK_NTXSEGS,
+		    RTK_NTXSEGS, MCLBYTES, 0, BUS_DMA_ALLOCNOW,
+		    &sc->rtk_ldata.rtk_tx_dmamap[i]);
+		if (error) {
+			aprint_error("%s: can't create DMA map for TX\n",
+			    sc->sc_dev.dv_xname);
+			goto fail_4;
+		}
+	}
+
+	/* Allocate DMA'able memory for the RX ring */
+        if ((error = bus_dmamem_alloc(sc->sc_dmat, RTK_RX_LIST_SZ,
+		    RTK_RING_ALIGN, 0, &sc->rtk_ldata.rtk_rx_listseg, 1,
+		    &sc->rtk_ldata.rtk_rx_listnseg, BUS_DMA_NOWAIT)) != 0) {
+		aprint_error("%s: can't allocate rx listseg, error = %d\n",
+		    sc->sc_dev.dv_xname, error);
+		goto fail_4;
+	}
+
+	/* Load the map for the RX ring. */
+	if ((error = bus_dmamem_map(sc->sc_dmat, &sc->rtk_ldata.rtk_rx_listseg,
+		    sc->rtk_ldata.rtk_rx_listnseg, RTK_RX_LIST_SZ,
+		    (caddr_t *)&sc->rtk_ldata.rtk_rx_list,
+		    BUS_DMA_NOWAIT)) != 0) {
+		aprint_error("%s: can't map rx list, error = %d\n",
+		    sc->sc_dev.dv_xname, error);
+		goto fail_5;
+	}
+	memset(sc->rtk_ldata.rtk_rx_list, 0, RTK_TX_LIST_SZ);
+
+	if ((error = bus_dmamap_create(sc->sc_dmat, RTK_RX_LIST_SZ, 1,
+		    RTK_RX_LIST_SZ, 0, BUS_DMA_ALLOCNOW,
+		    &sc->rtk_ldata.rtk_rx_list_map)) != 0) {
+		aprint_error("%s: can't create rx list map, error = %d\n",
+		    sc->sc_dev.dv_xname, error);
+		goto fail_6;
+	}
+
+	if ((error = bus_dmamap_load(sc->sc_dmat,
+		    sc->rtk_ldata.rtk_rx_list_map, sc->rtk_ldata.rtk_rx_list,
+		    RTK_RX_LIST_SZ, NULL, BUS_DMA_NOWAIT)) != 0) {
+		aprint_error("%s: can't load rx list, error = %d\n",
+		    sc->sc_dev.dv_xname, error);
+		goto fail_7;
+	}
+
+	/* Create DMA maps for RX buffers */
+	for (i = 0; i < RTK_RX_DESC_CNT; i++) {
+		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
+		    0, BUS_DMA_ALLOCNOW, &sc->rtk_ldata.rtk_rx_dmamap[i]);
+		if (error) {
+			aprint_error("%s: can't create DMA map for RX\n",
+			    sc->sc_dev.dv_xname);
+			goto fail_8;
+		}
 	}
 
 	ifp = &sc->ethercom.ec_if;
@@ -789,11 +792,12 @@
 	error = re_diag(sc);
 
 	if (error) {
-		printf("%s: attach aborted due to hardware diag failure\n",
+		aprint_error(
+		    "%s: attach aborted due to hardware diag failure\n",
 		    sc->sc_dev.dv_xname);
 		ether_ifdetach(ifp);
 		if_detach(ifp);
-		goto fail;
+		goto fail_8;
 	}
 
 	/*
@@ -805,7 +809,7 @@
 	 */
 	sc->sc_sdhook = shutdownhook_establish(re_shutdown, sc);
 	if (sc->sc_sdhook == NULL)
-		printf("%s: WARNING: unable to establish shutdown hook\n",
+		aprint_error("%s: WARNING: unable to establish shutdown hook\n",
 		    sc->sc_dev.dv_xname);
 	/*
 	 * Add a suspend hook to make sure we come back up after a
@@ -813,111 +817,52 @@
 	 */
 	sc->sc_powerhook = powerhook_establish(re_power, sc);
 	if (sc->sc_powerhook == NULL)
-		printf("%s: WARNING: unable to establish power hook\n",
+		aprint_error("%s: WARNING: unable to establish power hook\n",
 		    sc->sc_dev.dv_xname);
 
 	sc->sc_flags |= RTK_ATTACHED;
 
-fail:
-#if 0
-	if (error)
-		re_detach(sc);
-#endif
 	return;
-}
-
-#ifdef __FreeBSD__
-/*
- * Shutdown hardware and free up resources. This can be called any
- * time after the mutex has been initialized. It is called in both
- * the error case in attach and the normal detach case so it needs
- * to be careful about only freeing resources that have actually been
- * allocated.
- */
-static int
-re_detach(struct device *self, int flags)
-{
-	struct rtk_softc	*sc;
-	struct ifnet		*ifp;
-	int			i;
-
-	sc = device_get_softc(dev);
-	KASSERT(mtx_initialized(&sc->rtk_mtx), ("rl mutex not initialized"));
-	RTK_LOCK(sc);
-	ifp = &sc->ethercom.ec_if;
-
-	/* These should only be active if attach succeeded */
-	if (device_is_attached(dev)) {
-		re_stop(ifp, 0);
-		/*
-		 * Force off the IFF_UP flag here, in case someone
-		 * still had a BPF descriptor attached to this
-		 * interface. If they do, ether_ifattach() will cause
-		 * the BPF code to try and clear the promisc mode
-		 * flag, which will bubble down to re_ioctl(),
-		 * which will try to call re_init() again. This will
-		 * turn the NIC back on and restart the MII ticker,
-		 * which will panic the system when the kernel tries
-		 * to invoke the re_tick() function that isn't there
-		 * anymore.
-		 */
-		ifp->if_flags &= ~IFF_UP;
-		ether_ifdetach(ifp);
-	}
-	if (sc->rtk_miibus)
-		device_delete_child(dev, sc->rtk_miibus);
-	bus_generic_detach(dev);
-
-	if (sc->rtk_intrhand)
-		bus_teardown_intr(dev, sc->rtk_irq, sc->rtk_intrhand);
-	if (sc->rtk_irq)
-		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rtk_irq);
-	if (sc->rtk_res)
-		bus_release_resource(dev, RTK_RES, RTK_RID, sc->rtk_res);
 
+fail_8:
+	/* Destroy DMA maps for RX buffers. */
+	for (i = 0; i < RTK_RX_DESC_CNT; i++)
+		if (sc->rtk_ldata.rtk_rx_dmamap[i] != NULL)
+			bus_dmamap_destroy(sc->sc_dmat,
+			    sc->rtk_ldata.rtk_rx_dmamap[i]);
 
-	/* Unload and free the RX DMA ring memory and map */
-
+	/* Free DMA'able memory for the RX ring. */
 	bus_dmamap_unload(sc->sc_dmat, sc->rtk_ldata.rtk_rx_list_map);
+fail_7:
+	bus_dmamap_destroy(sc->sc_dmat, sc->rtk_ldata.rtk_rx_list_map);
+fail_6:
+	bus_dmamem_unmap(sc->sc_dmat,
+	    (caddr_t)sc->rtk_ldata.rtk_rx_list, RTK_RX_LIST_SZ);
+fail_5:
 	bus_dmamem_free(sc->sc_dmat,
-	    sc->rtk_ldata.rtk_rx_list,
-	    sc->rtk_ldata.rtk_rx_list_map);
-
-	/* Unload and free the TX DMA ring memory and map */
-
-	bus_dmamap_unload(sc->sc_dmat, sc->rtk_ldata.rtk_tx_list_map);
-	bus_dmamem_free(sc->sc_dmat, sc->rtk_ldata.rtk_tx_list,
-	    sc->rtk_ldata.rtk_tx_list_map);
-
-	/* Destroy all the RX and TX buffer maps */
+	    &sc->rtk_ldata.rtk_rx_listseg, sc->rtk_ldata.rtk_rx_listnseg);
 
+fail_4:
+	/* Destroy DMA maps for TX buffers. */
 	for (i = 0; i < RTK_TX_DESC_CNT; i++)
-		bus_dmamap_destroy(sc->sc_dmat,
-		    sc->rtk_ldata.rtk_tx_dmamap[i]);
-	for (i = 0; i < RTK_RX_DESC_CNT; i++)
-		bus_dmamap_destroy(sc->sc_dmat,
-		    sc->rtk_ldata.rtk_rx_dmamap[i]);
-
-	/* Unload and free the stats buffer and map */
-
-	if (sc->rtk_ldata.rtk_stag) {
-		bus_dmamap_unload(sc->rtk_ldata.rtk_stag,
-		    sc->rtk_ldata.rtk_rx_list_map);
-		bus_dmamem_free(sc->rtk_ldata.rtk_stag,
-		    sc->rtk_ldata.rtk_stats,
-		    sc->rtk_ldata.rtk_smap);
-		bus_dma_tag_destroy(sc->rtk_ldata.rtk_stag);
-	}
-
-	if (sc->rtk_parent_tag)
-		bus_dma_tag_destroy(sc->rtk_parent_tag);
-
-	RTK_UNLOCK(sc);
-	mtx_destroy(&sc->rtk_mtx);
+		if (sc->rtk_ldata.rtk_tx_dmamap[i] != NULL)
+			bus_dmamap_destroy(sc->sc_dmat,
+			    sc->rtk_ldata.rtk_tx_dmamap[i]);
 
-	return(0);
+	/* Free DMA'able memory for the TX ring. */
+	bus_dmamap_unload(sc->sc_dmat, sc->rtk_ldata.rtk_tx_list_map);
+fail_3:
+	bus_dmamap_destroy(sc->sc_dmat, sc->rtk_ldata.rtk_tx_list_map);
+fail_2:
+	bus_dmamem_unmap(sc->sc_dmat,
+	    (caddr_t)sc->rtk_ldata.rtk_tx_list, RTK_TX_LIST_SZ);
+fail_1:
+	bus_dmamem_free(sc->sc_dmat,
+	    &sc->rtk_ldata.rtk_tx_listseg, sc->rtk_ldata.rtk_tx_listnseg);
+fail_0:
+	return;
 }
-#endif	/* __FreeBSD__ */
+
 
 /*
  * re_activate:
@@ -941,7 +886,7 @@
 	}
 	splx(s);
 
-	return (error);
+	return error;
 }
 
 /*
@@ -952,12 +897,13 @@
 re_detach(struct rtk_softc *sc)
 {
 	struct ifnet *ifp = &sc->ethercom.ec_if;
+	int i;
 
 	/*
 	 * Succeed now if there isn't any work to do.
 	 */
 	if ((sc->sc_flags & RTK_ATTACHED) == 0)
-		return (0);
+		return 0;
 
 	/* Unhook our tick handler. */
 	callout_stop(&sc->rtk_tick_ch);
@@ -972,23 +918,40 @@
 	if_detach(ifp);
 
 	/* XXX undo re_allocmem() */
-#if 0 /* bogus cut-and-paste from rtl81x9.c */
-	for (i = 0; i < RTK_TX_LIST_CNT; i++) {
-		txd = &sc->rtk_tx_descs[i];
-		if (txd->txd_dmamap != NULL)
-			bus_dmamap_destroy(sc->sc_dmat, txd->txd_dmamap);
-	}
-	bus_dmamap_destroy(sc->sc_dmat, sc->recv_dmamap);
-	bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->rtk_rx_buf,
-	    RTK_RXBUFLEN + 16);
-	/* XXX TX ring, Tx buffer, Rx ring, Rx buffer */
-	bus_dmamem_free(sc->sc_dmat, &sc->sc_dmaseg, sc->sc_dmanseg);
-#endif
 
+	/* Destroy DMA maps for RX buffers. */
+	for (i = 0; i < RTK_RX_DESC_CNT; i++)
+		if (sc->rtk_ldata.rtk_rx_dmamap[i] != NULL)
+			bus_dmamap_destroy(sc->sc_dmat,
+			    sc->rtk_ldata.rtk_rx_dmamap[i]);
+
+	/* Free DMA'able memory for the RX ring. */
+	bus_dmamap_unload(sc->sc_dmat, sc->rtk_ldata.rtk_rx_list_map);
+	bus_dmamap_destroy(sc->sc_dmat, sc->rtk_ldata.rtk_rx_list_map);
+	bus_dmamem_unmap(sc->sc_dmat,
+	    (caddr_t)sc->rtk_ldata.rtk_rx_list, RTK_RX_LIST_SZ);
+	bus_dmamem_free(sc->sc_dmat,
+	    &sc->rtk_ldata.rtk_rx_listseg, sc->rtk_ldata.rtk_rx_listnseg);
+
+	/* Destroy DMA maps for TX buffers. */
+	for (i = 0; i < RTK_TX_DESC_CNT; i++)
+		if (sc->rtk_ldata.rtk_tx_dmamap[i] != NULL)
+			bus_dmamap_destroy(sc->sc_dmat,
+			    sc->rtk_ldata.rtk_tx_dmamap[i]);
+
+	/* Free DMA'able memory for the TX ring. */
+	bus_dmamap_unload(sc->sc_dmat, sc->rtk_ldata.rtk_tx_list_map);
+	bus_dmamap_destroy(sc->sc_dmat, sc->rtk_ldata.rtk_tx_list_map);
+	bus_dmamem_unmap(sc->sc_dmat,
+	    (caddr_t)sc->rtk_ldata.rtk_tx_list, RTK_TX_LIST_SZ);
+	bus_dmamem_free(sc->sc_dmat,
+	    &sc->rtk_ldata.rtk_tx_listseg, sc->rtk_ldata.rtk_tx_listnseg);
+
+	
 	shutdownhook_disestablish(sc->sc_sdhook);
 	powerhook_disestablish(sc->sc_powerhook);
 
-	return(0);
+	return 0;
 }
 
 /*
@@ -1000,13 +963,13 @@
 {
 	if (RTK_IS_ENABLED(sc) == 0 && sc->sc_enable != NULL) {
 		if ((*sc->sc_enable)(sc) != 0) {
-			printf("%s: device enable failed\n",
+			aprint_error("%s: device enable failed\n",
 			    sc->sc_dev.dv_xname);
-			return (EIO);
+			return EIO;
 		}
 		sc->sc_flags |= RTK_ENABLED;
 	}
-	return (0);
+	return 0;
 }
 
 /*
@@ -1070,13 +1033,13 @@
 	if (m == NULL) {
 		MGETHDR(n, M_DONTWAIT, MT_DATA);
 		if (n == NULL)
-			return(ENOBUFS);
+			return ENOBUFS;
 		m = n;
 
 		MCLGET(m, M_DONTWAIT);
-		if (! (m->m_flags & M_EXT)) {
+		if (!(m->m_flags & M_EXT)) {
 			m_freem(m);
-			return(ENOBUFS);
+			return ENOBUFS;
 		}
 	} else
 		m->m_data = m->m_ext.ext_buf;
@@ -1090,10 +1053,8 @@
 	m_adj(m, RTK_ETHER_ALIGN);
 
 	map = sc->rtk_ldata.rtk_rx_dmamap[idx];
-        error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m, BUS_DMA_NOWAIT);
+	error = bus_dmamap_load_mbuf(sc->sc_dmat, map, m, BUS_DMA_NOWAIT);
 
-	if (map->dm_nsegs > 1)
-		goto out;
 	if (error)
 		goto out;
 
@@ -1112,11 +1073,12 @@
 	d->rtk_cmdstat |= htole32(RTK_TDESC_CMD_EOF);
 
 
-	sc->rtk_ldata.rtk_rx_list[idx].rtk_cmdstat |= htole32(RTK_RDESC_CMD_OWN);
+	sc->rtk_ldata.rtk_rx_list[idx].rtk_cmdstat |=
+	    htole32(RTK_RDESC_CMD_OWN);
 	sc->rtk_ldata.rtk_rx_mbuf[idx] = m;
 
-        bus_dmamap_sync(sc->sc_dmat, sc->rtk_ldata.rtk_rx_dmamap[idx], 0,
-            sc->rtk_ldata.rtk_rx_dmamap[idx]->dm_mapsize,
+	bus_dmamap_sync(sc->sc_dmat, sc->rtk_ldata.rtk_rx_dmamap[idx], 0,
+	    sc->rtk_ldata.rtk_rx_dmamap[idx]->dm_mapsize,
 	    BUS_DMASYNC_PREREAD);
 
 	return 0;
@@ -1140,7 +1102,7 @@
 	sc->rtk_ldata.rtk_tx_considx = 0;
 	sc->rtk_ldata.rtk_tx_free = RTK_TX_DESC_CNT;
 
-	return(0);
+	return 0;
 }
 
 static int
@@ -1154,7 +1116,7 @@
 
 	for (i = 0; i < RTK_RX_DESC_CNT; i++) {
 		if (re_newbuf(sc, i, NULL) == ENOBUFS)
-			return(ENOBUFS);
+			return ENOBUFS;
 	}
 
 	/* Flush the RX descriptors */
@@ -1167,7 +1129,7 @@
 	sc->rtk_ldata.rtk_rx_prodidx = 0;
 	sc->rtk_head = sc->rtk_tail = NULL;
 
-	return(0);
+	return 0;
 }
 
 /*
@@ -1313,7 +1275,7 @@
 			if (rxstat & RTK_RDESC_STAT_PROTOID)
 				m->m_pkthdr.csum_flags |= M_CSUM_IPv4;;
 			if (rxstat & RTK_RDESC_STAT_IPSUMBAD)
-                                m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
+				m->m_pkthdr.csum_flags |= M_CSUM_IPv4_BAD;
 		}
 
 		/* Check TCP/UDP checksum */
@@ -1511,11 +1473,6 @@
 	u_int16_t		status;
 	int			handled = 0;
 
-#if 0
-	if (sc->suspended) {
-		return 0;
-	}
-#endif
 	ifp = &sc->ethercom.ec_if;
 
 	if (!(ifp->if_flags & IFF_UP))
@@ -1568,9 +1525,9 @@
 		}
 	}
 
-    if (ifp->if_flags & IFF_UP) /* kludge for interrupt during re_init() */
-	if (ifp->if_snd.ifq_head != NULL)
-		(*ifp->if_start)(ifp);
+	if (ifp->if_flags & IFF_UP) /* kludge for interrupt during re_init() */
+		if (ifp->if_snd.ifq_head != NULL)
+			(*ifp->if_start)(ifp);
 
 #ifdef DEVICE_POLLING
 done:
@@ -1589,7 +1546,7 @@
 	u_int32_t		cmdstat, rtk_flags;
 
 	if (sc->rtk_ldata.rtk_tx_free <= 4)
-		return(EFBIG);
+		return EFBIG;
 
 	/*
 	 * Set up checksum offload. Note: checksum offload bits must
@@ -1612,7 +1569,7 @@
 	    m_head, BUS_DMA_NOWAIT);
 
 	if (error) {
-		printf("%s: can't map mbuf (error %d)\n",
+		aprint_error("%s: can't map mbuf (error %d)\n",
 		    sc->sc_dev.dv_xname, error);
 		return ENOBUFS;
 	}
@@ -1733,7 +1690,7 @@
 	bus_dmamap_sync(sc->sc_dmat,
 	    sc->rtk_ldata.rtk_tx_list_map,
 	    0, sc->rtk_ldata.rtk_tx_list_map->dm_mapsize,
-	    BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD);
+	    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
 
 	sc->rtk_ldata.rtk_tx_prodidx = idx;
 
@@ -1799,17 +1756,17 @@
 	 * For 8169S/8110S rev 2 and above, do not set bit 14.
 	 */
 	if (sc->rtk_type == RTK_8169 && sc->sc_rev == 1)
-	       reg |= (0x1 << 14) | RTK_CPLUSCMD_PCI_MRW;;
+		reg |= (0x1 << 14) | RTK_CPLUSCMD_PCI_MRW;;
 
- if (1)  {/* not for 8169S ? */
-  reg |= RTK_CPLUSCMD_VLANSTRIP|
-	    (ifp->if_capenable &
-	    (IFCAP_CSUM_IPv4 |IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4) ?
-	    RTK_CPLUSCMD_RXCSUM_ENB : 0);
-    }
+	if (1)  {/* not for 8169S ? */
+		reg |= RTK_CPLUSCMD_VLANSTRIP |
+		    (ifp->if_capenable &
+		    (IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4) ?
+		    RTK_CPLUSCMD_RXCSUM_ENB : 0);
+	}
  
 	CSR_WRITE_2(sc, RTK_CPLUS_CMD,
-		    reg | RTK_CPLUSCMD_RXENB| RTK_CPLUSCMD_TXENB);
+	    reg | RTK_CPLUSCMD_RXENB | RTK_CPLUSCMD_TXENB);
 
 	/* XXX: from Realtek-supplied Linux driver. Wholly undocumented. */
 	if (sc->rtk_type == RTK_8169)
@@ -1839,7 +1796,7 @@
 	/*
 	 * Enable transmit and receive.
 	 */
-	CSR_WRITE_1(sc, RTK_COMMAND, RTK_CMD_TX_ENB|RTK_CMD_RX_ENB);
+	CSR_WRITE_1(sc, RTK_COMMAND, RTK_CMD_TX_ENB | RTK_CMD_RX_ENB);
 
 	/*
 	 * Set the initial TX and RX configuration.
@@ -1847,7 +1804,7 @@
 	if (sc->rtk_testmode) {
 		if (sc->rtk_type == RTK_8169)
 			CSR_WRITE_4(sc, RTK_TXCFG,
-			    RTK_TXCFG_CONFIG|RTK_LOOPTEST_ON);
+			    RTK_TXCFG_CONFIG | RTK_LOOPTEST_ON);
 		else
 			CSR_WRITE_4(sc, RTK_TXCFG,
 			    RTK_TXCFG_CONFIG|RTK_LOOPTEST_ON_CPLUS);
@@ -1947,7 +1904,7 @@
 
 	mii_mediachg(&sc->mii);
 
-	CSR_WRITE_1(sc, RTK_CFG1, RTK_CFG1_DRVLOAD|RTK_CFG1_FULLDUPLEX);
+	CSR_WRITE_1(sc, RTK_CFG1, RTK_CFG1_DRVLOAD | RTK_CFG1_FULLDUPLEX);
 
 	ifp->if_flags |= IFF_RUNNING;
 	ifp->if_flags &= ~IFF_OACTIVE;
@@ -1956,9 +1913,10 @@
 
 out:
 	if (error) {
-		ifp->if_flags &= ~(IFF_RUNNING|IFF_OACTIVE);
+		ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 		ifp->if_timer = 0;
-		printf("%s: interface not running\n", sc->sc_dev.dv_xname);
+		aprint_error("%s: interface not running\n",
+		    sc->sc_dev.dv_xname);
 	}
 	  
 	return error;
@@ -1975,7 +1933,7 @@
 
 	sc = ifp->if_softc;
 
-	return (mii_mediachg(&sc->mii));
+	return mii_mediachg(&sc->mii);
 }
 
 /*
@@ -2004,7 +1962,7 @@
 
 	s = splnet();
 
-	switch(command) {
+	switch (command) {
 	case SIOCSIFMTU:
 		if (ifr->ifr_mtu > RTK_JUMBO_MTU)
 			error = EINVAL;
@@ -2026,7 +1984,7 @@
 
 	splx(s);
 
-	return(error);
+	return error;
 }
 
 static void
@@ -2037,7 +1995,7 @@
 
 	sc = ifp->if_softc;
 	s = splnet();
-	printf("%s: watchdog timeout\n", sc->sc_dev.dv_xname);
+	aprint_error("%s: watchdog timeout\n", sc->sc_dev.dv_xname);
 	ifp->if_oerrors++;
 
 	re_txeof(sc);
@@ -2098,90 +2056,7 @@
 		re_disable(sc);
 
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
-	ifp->if_timer = 0;	
-
-	return;
-}
-
-
-
-#if 0
-/*
- * Device suspend routine.  Stop the interface and save some PCI
- * settings in case the BIOS doesn't restore them properly on
- * resume.
- */
-static int
-re_suspend(device_t dev)
-{
-	register int		i;
-	struct rtk_softc	*sc;
-
-	sc = device_get_softc(dev);
-
-	re_stop(sc);
-
-	for (i = 0; i < 5; i++)
-		sc->saved_maps[i] = pci_read_config(dev, PCIR_MAPS + i * 4, 4);
-	sc->saved_biosaddr = pci_read_config(dev, PCIR_BIOS, 4);
-	sc->saved_intline = pci_read_config(dev, PCIR_INTLINE, 1);
-	sc->saved_cachelnsz = pci_read_config(dev, PCIR_CACHELNSZ, 1);
-	sc->saved_lattimer = pci_read_config(dev, PCIR_LATTIMER, 1);
-
-	sc->suspended = 1;
-
-	return (0);
-}
-
-/*
- * Device resume routine.  Restore some PCI settings in case the BIOS
- * doesn't, re-enable busmastering, and restart the interface if
- * appropriate.
- */
-static int
-re_resume(device_t dev)
-{
-	register int		i;
-	struct rtk_softc	*sc;
-	struct ifnet		*ifp;
-
-	sc = device_get_softc(dev);
-	ifp = &sc->ethercom.ec_if;
-
-	/* better way to do this? */
-	for (i = 0; i < 5; i++)
-		pci_write_config(dev, PCIR_MAPS + i * 4, sc->saved_maps[i], 4);
-	pci_write_config(dev, PCIR_BIOS, sc->saved_biosaddr, 4);
-	pci_write_config(dev, PCIR_INTLINE, sc->saved_intline, 1);
-	pci_write_config(dev, PCIR_CACHELNSZ, sc->saved_cachelnsz, 1);
-	pci_write_config(dev, PCIR_LATTIMER, sc->saved_lattimer, 1);
-
-	/* reenable busmastering */
-	pci_enable_busmaster(dev);
-	pci_enable_io(dev, RTK_RES);
-
-	/* reinitialize interface if necessary */
-	if (ifp->if_flags & IFF_UP)
-		re_init(sc);
-
-	sc->suspended = 0;
-
-	return (0);
-}
-
-/*
- * Stop all chip I/O so that the kernel's probe routines don't
- * get confused by errant DMAs when rebooting.
- */
-static void
-re_shutdown(device_t dev)
-{
-	struct rtk_softc	*sc;
-
-	sc = device_get_softc(dev);
-
-	re_stop(sc);
+	ifp->if_timer = 0;
 
 	return;
 }
-#endif	/* 0 */
Index: rtl81x9reg.h
===================================================================
RCS file: /ftp/cvs/src/sys/dev/ic/rtl81x9reg.h,v
retrieving revision 1.8
diff -u -r1.8 rtl81x9reg.h
--- rtl81x9reg.h	2 Nov 2003 11:07:45 -0000	1.8
+++ rtl81x9reg.h	6 Jan 2005 14:42:19 -0000
@@ -567,3 +567,5 @@
 
 #define RTK_JUMBO_FRAMELEN	9018
 #define RTK_JUMBO_MTU		(RTK_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN)
+
+#define RTK_NTXSEGS		32
Index: rtl81x9var.h
===================================================================
RCS file: /ftp/cvs/src/sys/dev/ic/rtl81x9var.h,v
retrieving revision 1.14
diff -u -r1.14 rtl81x9var.h
--- rtl81x9var.h	25 Dec 2004 17:24:01 -0000	1.14
+++ rtl81x9var.h	6 Jan 2005 13:55:43 -0000
@@ -94,9 +94,11 @@
 	bus_dmamap_t		rtk_rx_list_map;
 	struct rtk_desc		*rtk_rx_list;
 	bus_dma_segment_t 	rtk_rx_listseg;
+	int			rtk_rx_listnseg;
 	bus_dmamap_t		rtk_tx_list_map;
 	struct rtk_desc		*rtk_tx_list;
 	bus_dma_segment_t 	rtk_tx_listseg;
+	int			rtk_tx_listnseg;
 };
 struct rtk_tx_desc {
 	SIMPLEQ_ENTRY(rtk_tx_desc) txd_q;

----Next_Part(Fri_Jan__7_00_31_30_2005_463)----

----Security_Multipart0(Fri_Jan__7_00_31_30_2005_711)--
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (NetBSD)

iQEVAwUAQd1Z0qZTiBfoL27MAQLBvggApzdVW8BAcwYDSmi4oLQRKo0HxaIhmic0
x5bRrxpisJsoMHepVHW2SRIX/gZWMJb4kEgHQBSQVtzsjc1xPrctS8i2/GkBLGHU
wqszi2TQHp83nBr8ihkcTFnwRMrFKrEB4fLaJyb0TdFdlCvKqX1Rsve6HRt9AlwD
k0xcBj+honaDzhp9zh9bPqC/7y+KL1al8UJI7FBOy06ueq7m0uSDKHSHvX/6Jiyr
Gqi1aoagEFtqUpgC5Pya5XK9HEk7dWkEb7AzmYk9xjbLBUEmn8wfAVHECUXDzuGx
ECh4twFHoKKTrNzIOjeu/Go/BgvFzfSDmq/vvcrNB6OuzEDHV2Qk0g==
=cZxn
-----END PGP SIGNATURE-----

----Security_Multipart0(Fri_Jan__7_00_31_30_2005_711)----