summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/pci/if_txp.c59
-rw-r--r--sys/dev/pci/if_txpreg.h23
2 files changed, 71 insertions, 11 deletions
diff --git a/sys/dev/pci/if_txp.c b/sys/dev/pci/if_txp.c
index e9628c3cb7a..19cd7e04c5d 100644
--- a/sys/dev/pci/if_txp.c
+++ b/sys/dev/pci/if_txp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_txp.c,v 1.7 2001/04/09 04:09:17 jason Exp $ */
+/* $OpenBSD: if_txp.c,v 1.8 2001/04/09 05:36:16 jason Exp $ */
/*
* Copyright (c) 2001
@@ -112,6 +112,8 @@ int txp_response __P((struct txp_softc *, u_int32_t, u_int16_t,
void txp_ifmedia_sts __P((struct ifnet *, struct ifmediareq *));
int txp_ifmedia_upd __P((struct ifnet *));
+int txp_miibus_readreg __P((struct device *, int, int));
+void txp_miibus_writereg __P((struct device *, int, int, int));
struct cfattach txp_ca = {
sizeof(struct txp_softc), txp_probe, txp_attach,
@@ -232,6 +234,12 @@ txp_attach(parent, self, aux)
txp_command(sc, TXP_CMD_XCVR_SELECT, TXP_XCVR_AUTO, 0, 0,
NULL, NULL, NULL, 0);
+#if 0
+ sc->sc_mii.mii_ifp = ifp;
+ sc->sc_mii.mii_readreg = txp_miibus_readreg;
+ sc->sc_mii.mii_writereg = txp_miibus_writereg;
+ mii_phy_probe(self, &sc->sc_mii, 0xffffffff);
+#endif
ifp->if_softc = sc;
ifp->if_mtu = ETHERMTU;
@@ -904,6 +912,11 @@ txp_command(sc, id, in1, in2, in3, out1, out2, out3, wait)
if (out3 != NULL)
*out3 = rsp->rsp_par3;
+ idx += sizeof(struct txp_rsp_desc);
+ if (idx == sc->sc_rspring.size)
+ idx = 0;
+ sc->sc_rspring.lastwrite = hv->hv_resp_read_idx = idx;
+
return (0);
}
@@ -1035,6 +1048,7 @@ txp_ifmedia_sts(ifp, ifmr)
struct ifmediareq *ifmr;
{
struct txp_softc *sc = ifp->if_softc;
+ u_int16_t p1;
switch (sc->sc_xcvr) {
case TXP_XCVR_10_HDX:
@@ -1057,6 +1071,45 @@ txp_ifmedia_sts(ifp, ifmr)
break;
}
- /* XXX determine real speed/duplex/link status */
- ifmr->ifm_status &= ~IFM_AVALID;
+ /* XXX determine real speed/duplex status */
+
+ if (txp_command(sc, TXP_CMD_MEDIA_STATUS_READ, 0, 0, 0,
+ &p1, NULL, NULL, 1))
+ ifmr->ifm_status &= ~IFM_AVALID;
+ else {
+ ifmr->ifm_status |= IFM_AVALID;
+ if ((p1 & TXP_MEDIA_NOLINK) == 0)
+ ifmr->ifm_status |= IFM_ACTIVE;
+ }
+}
+
+void
+txp_miibus_writereg(self, phy, reg, val)
+ struct device *self;
+ int phy, reg, val;
+{
+ struct txp_softc *sc = (struct txp_softc *)self;
+
+ if (phy != 0)
+ return;
+
+ txp_command(sc, TXP_CMD_PHY_MGMT_WRITE, val, reg, 0,
+ NULL, NULL, NULL, 0);
+}
+
+int
+txp_miibus_readreg(self, phy, reg)
+ struct device *self;
+ int phy, reg;
+{
+ struct txp_softc *sc = (struct txp_softc *)self;
+ u_int16_t dat;
+
+ if (phy != 0)
+ return (0);
+
+ if (txp_command(sc, TXP_CMD_PHY_MGMT_READ, 0, reg, 0,
+ &dat, NULL, NULL, 1))
+ return (0);
+ return (dat);
}
diff --git a/sys/dev/pci/if_txpreg.h b/sys/dev/pci/if_txpreg.h
index e08c578b472..23d072d9a9a 100644
--- a/sys/dev/pci/if_txpreg.h
+++ b/sys/dev/pci/if_txpreg.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_txpreg.h,v 1.8 2001/04/09 04:09:18 jason Exp $ */
+/* $OpenBSD: if_txpreg.h,v 1.9 2001/04/09 05:36:17 jason Exp $ */
/*
* Copyright (c) 2001 Aaron Campbell <aaron@monkey.org>.
@@ -126,8 +126,8 @@
#define TXP_CMD_MEDIA_STATUS_WRITE 0x1c
#define TXP_CMD_NETWORK_DIAGS_READ 0x1d
#define TXP_CMD_NETWORK_DIAGS_WRITE 0x1e
-#define TXP_CMD_POWER_MGMT_EVENT_READ 0x1f
-#define TXP_CMD_POWER_MGMT_EVENT_WRITE 0x20
+#define TXP_CMD_PHY_MGMT_READ 0x1f
+#define TXP_CMD_PHY_MGMT_WRITE 0x20
#define TXP_CMD_VARIABLE_PARAMETER_READ 0x21
#define TXP_CMD_VARIABLE_PARAMETER_WRITE 0x22
#define TXP_CMD_GOTO_SLEEP 0x23
@@ -352,6 +352,12 @@ struct txp_tcpseg_desc {
#define TXP_XCVR_100_FDX 3
#define TXP_XCVR_AUTO 4
+#define TXP_MEDIA_CRC 0x0004 /* crc strip disable */
+#define TXP_MEDIA_CD 0x0010 /* collision detection */
+#define TXP_MEDIA_CS 0x0020 /* carrier sense */
+#define TXP_MEDIA_POL 0x0400 /* polarity reversed */
+#define TXP_MEDIA_NOLINK 0x0800 /* 0 = link, 1 = no link */
+
/*
* boot record (pointers to rings)
*/
@@ -439,18 +445,19 @@ struct txp_rsp_ring {
};
struct txp_softc {
- struct device sc_dev;
- struct arpcom sc_arpcom;
+ struct device sc_dev; /* base device */
+ struct arpcom sc_arpcom; /* ethernet common */
struct txp_hostvar *sc_hostvar;
struct txp_boot_record *sc_boot;
- bus_space_handle_t sc_bh;
- bus_space_tag_t sc_bt;
- bus_dma_tag_t sc_dmat;
+ bus_space_handle_t sc_bh; /* bus handle (regs) */
+ bus_space_tag_t sc_bt; /* bus tag (regs) */
+ bus_dma_tag_t sc_dmat; /* dma tag */
struct txp_cmd_ring sc_cmdring;
struct txp_rsp_ring sc_rspring;
void * sc_ih;
struct timeout sc_tick_tmo;
struct ifmedia sc_ifmedia;
+ mii_data_t sc_mii; /* mii bus */
u_int16_t sc_xcvr;
struct txp_dma_alloc sc_boot_dma, sc_host_dma, sc_zero_dma;
struct txp_dma_alloc sc_rxhiring_dma, sc_rxloring_dma;