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)----