Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev No functional change:
details: https://anonhg.NetBSD.org/src/rev/5c8f6c8f76cc
branches: trunk
changeset: 968380:5c8f6c8f76cc
user: msaitoh <msaitoh%NetBSD.org@localhost>
date: Tue Jan 14 09:49:26 2020 +0000
description:
No functional change:
- Move some definitions from if_stgereg.h to if_stge.c again because those are
not chip (registers or descriptors) definitions.
- Use proplib to pass information that loading DSP code is required when
PHY reset.
diffstat:
sys/dev/mii/ipgphy.c | 36 ++++++---
sys/dev/pci/if_stge.c | 171 ++++++++++++++++++++++++++++++++++++++++++++++-
sys/dev/pci/if_stgereg.h | 163 +--------------------------------------------
3 files changed, 192 insertions(+), 178 deletions(-)
diffs (truncated from 492 to 300 lines):
diff -r de4f0029503e -r 5c8f6c8f76cc sys/dev/mii/ipgphy.c
--- a/sys/dev/mii/ipgphy.c Tue Jan 14 09:30:34 2020 +0000
+++ b/sys/dev/mii/ipgphy.c Tue Jan 14 09:49:26 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ipgphy.c,v 1.8 2019/11/27 10:19:20 msaitoh Exp $ */
+/* $NetBSD: ipgphy.c,v 1.9 2020/01/14 09:49:26 msaitoh Exp $ */
/* $OpenBSD: ipgphy.c,v 1.19 2015/07/19 06:28:12 yuo Exp $ */
/*-
@@ -33,7 +33,7 @@
* Driver for the IC Plus IP1000A/IP1001 10/100/1000 PHY.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipgphy.c,v 1.8 2019/11/27 10:19:20 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipgphy.c,v 1.9 2020/01/14 09:49:26 msaitoh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -41,6 +41,7 @@
#include <sys/device.h>
#include <sys/socket.h>
#include <sys/errno.h>
+#include <prop/proplib.h>
#include <net/if.h>
#include <net/if_media.h>
@@ -51,12 +52,15 @@
#include <dev/mii/ipgphyreg.h>
-#include <dev/pci/if_stgereg.h>
-
static int ipgphy_match(device_t, cfdata_t, void *);
static void ipgphy_attach(device_t, device_t, void *);
-CFATTACH_DECL_NEW(ipgphy, sizeof(struct mii_softc),
+struct ipgphy_softc {
+ struct mii_softc sc_mii;
+ bool need_loaddspcode;
+};
+
+CFATTACH_DECL_NEW(ipgphy, sizeof(struct ipgphy_softc),
ipgphy_match, ipgphy_attach, mii_phy_detach, mii_phy_activate);
static int ipgphy_service(struct mii_softc *, struct mii_data *, int);
@@ -89,10 +93,12 @@
static void
ipgphy_attach(device_t parent, device_t self, void *aux)
{
- struct mii_softc *sc = device_private(self);
+ struct ipgphy_softc *isc = device_private(self);
+ struct mii_softc *sc = &isc->sc_mii;
struct mii_attach_args *ma = aux;
struct mii_data *mii = ma->mii_data;
const struct mii_phydesc *mpd;
+ prop_dictionary_t dict;
mpd = mii_phy_match(ma, ipgphys);
aprint_naive(": Media interface\n");
@@ -107,8 +113,13 @@
sc->mii_funcs = &ipgphy_funcs;
sc->mii_pdata = mii;
sc->mii_flags = ma->mii_flags;
+ sc->mii_flags |= MIIF_NOISOLATE;
- sc->mii_flags |= MIIF_NOISOLATE;
+ if (device_is_a(parent, "stge")) {
+ dict = device_properties(parent);
+ prop_dictionary_get_bool(dict, "need_loaddspcode",
+ &isc->need_loaddspcode);
+ }
PHY_RESET(sc);
@@ -342,6 +353,7 @@
static void
ipgphy_load_dspcode(struct mii_softc *sc)
{
+
PHY_WRITE(sc, 31, 0x0001);
PHY_WRITE(sc, 27, 0x01e0);
PHY_WRITE(sc, 31, 0x0002);
@@ -356,7 +368,7 @@
static void
ipgphy_reset(struct mii_softc *sc)
{
- struct ifnet *ifp = sc->mii_pdata->mii_ifp;
+ struct ipgphy_softc *isc = device_private(sc->mii_dev);
uint16_t reg;
mii_phy_reset(sc);
@@ -366,10 +378,6 @@
reg &= ~(BMCR_AUTOEN | BMCR_FDX);
PHY_WRITE(sc, MII_BMCR, reg);
- if (sc->mii_mpd_model == MII_MODEL_xxICPLUS_IP1000A &&
- strcmp(ifp->if_xname, "stge") == 0) {
- struct stge_softc *stge_sc = ifp->if_softc;
- if (stge_sc->sc_rev >= 0x40 && stge_sc->sc_rev <= 0x4e)
- ipgphy_load_dspcode(sc);
- }
+ if (isc->need_loaddspcode)
+ ipgphy_load_dspcode(sc);
}
diff -r de4f0029503e -r 5c8f6c8f76cc sys/dev/pci/if_stge.c
--- a/sys/dev/pci/if_stge.c Tue Jan 14 09:30:34 2020 +0000
+++ b/sys/dev/pci/if_stge.c Tue Jan 14 09:49:26 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_stge.c,v 1.76 2020/01/09 10:54:16 msaitoh Exp $ */
+/* $NetBSD: if_stge.c,v 1.77 2020/01/14 09:49:26 msaitoh Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_stge.c,v 1.76 2020/01/09 10:54:16 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_stge.c,v 1.77 2020/01/14 09:49:26 msaitoh Exp $");
#include <sys/param.h>
@@ -76,6 +76,167 @@
#define STGE_VLAN_UNTAG 1
/* #define STGE_VLAN_CFI 1 */
+/*
+ * Transmit descriptor list size.
+ */
+#define STGE_NTXDESC 256
+#define STGE_NTXDESC_MASK (STGE_NTXDESC - 1)
+#define STGE_NEXTTX(x) (((x) + 1) & STGE_NTXDESC_MASK)
+
+/*
+ * Receive descriptor list size.
+ */
+#define STGE_NRXDESC 256
+#define STGE_NRXDESC_MASK (STGE_NRXDESC - 1)
+#define STGE_NEXTRX(x) (((x) + 1) & STGE_NRXDESC_MASK)
+
+/*
+ * Only interrupt every N frames. Must be a power-of-two.
+ */
+#define STGE_TXINTR_SPACING 16
+#define STGE_TXINTR_SPACING_MASK (STGE_TXINTR_SPACING - 1)
+
+/*
+ * Control structures are DMA'd to the TC9021 chip. We allocate them in
+ * a single clump that maps to a single DMA segment to make several things
+ * easier.
+ */
+struct stge_control_data {
+ /*
+ * The transmit descriptors.
+ */
+ struct stge_tfd scd_txdescs[STGE_NTXDESC];
+
+ /*
+ * The receive descriptors.
+ */
+ struct stge_rfd scd_rxdescs[STGE_NRXDESC];
+};
+
+#define STGE_CDOFF(x) offsetof(struct stge_control_data, x)
+#define STGE_CDTXOFF(x) STGE_CDOFF(scd_txdescs[(x)])
+#define STGE_CDRXOFF(x) STGE_CDOFF(scd_rxdescs[(x)])
+
+/*
+ * Software state for transmit and receive jobs.
+ */
+struct stge_descsoft {
+ struct mbuf *ds_mbuf; /* head of our mbuf chain */
+ bus_dmamap_t ds_dmamap; /* our DMA map */
+};
+
+/*
+ * Software state per device.
+ */
+struct stge_softc {
+ device_t sc_dev; /* generic device information */
+ bus_space_tag_t sc_st; /* bus space tag */
+ bus_space_handle_t sc_sh; /* bus space handle */
+ bus_dma_tag_t sc_dmat; /* bus DMA tag */
+ struct ethercom sc_ethercom; /* ethernet common data */
+ int sc_rev; /* silicon revision */
+
+ void *sc_ih; /* interrupt cookie */
+
+ struct mii_data sc_mii; /* MII/media information */
+
+ callout_t sc_tick_ch; /* tick callout */
+
+ bus_dmamap_t sc_cddmamap; /* control data DMA map */
+#define sc_cddma sc_cddmamap->dm_segs[0].ds_addr
+
+ /*
+ * Software state for transmit and receive descriptors.
+ */
+ struct stge_descsoft sc_txsoft[STGE_NTXDESC];
+ struct stge_descsoft sc_rxsoft[STGE_NRXDESC];
+
+ /*
+ * Control data structures.
+ */
+ struct stge_control_data *sc_control_data;
+#define sc_txdescs sc_control_data->scd_txdescs
+#define sc_rxdescs sc_control_data->scd_rxdescs
+
+#ifdef STGE_EVENT_COUNTERS
+ /*
+ * Event counters.
+ */
+ struct evcnt sc_ev_txstall; /* Tx stalled */
+ struct evcnt sc_ev_txdmaintr; /* Tx DMA interrupts */
+ struct evcnt sc_ev_txindintr; /* Tx Indicate interrupts */
+ struct evcnt sc_ev_rxintr; /* Rx interrupts */
+
+ struct evcnt sc_ev_txseg1; /* Tx packets w/ 1 segment */
+ struct evcnt sc_ev_txseg2; /* Tx packets w/ 2 segments */
+ struct evcnt sc_ev_txseg3; /* Tx packets w/ 3 segments */
+ struct evcnt sc_ev_txseg4; /* Tx packets w/ 4 segments */
+ struct evcnt sc_ev_txseg5; /* Tx packets w/ 5 segments */
+ struct evcnt sc_ev_txsegmore; /* Tx packets w/ more than 5 segments */
+ struct evcnt sc_ev_txcopy; /* Tx packets that we had to copy */
+
+ struct evcnt sc_ev_rxipsum; /* IP checksums checked in-bound */
+ struct evcnt sc_ev_rxtcpsum; /* TCP checksums checked in-bound */
+ struct evcnt sc_ev_rxudpsum; /* UDP checksums checked in-bound */
+
+ struct evcnt sc_ev_txipsum; /* IP checksums comp. out-bound */
+ struct evcnt sc_ev_txtcpsum; /* TCP checksums comp. out-bound */
+ struct evcnt sc_ev_txudpsum; /* UDP checksums comp. out-bound */
+#endif /* STGE_EVENT_COUNTERS */
+
+ int sc_txpending; /* number of Tx requests pending */
+ int sc_txdirty; /* first dirty Tx descriptor */
+ int sc_txlast; /* last used Tx descriptor */
+
+ int sc_rxptr; /* next ready Rx descriptor/descsoft */
+ int sc_rxdiscard;
+ int sc_rxlen;
+ struct mbuf *sc_rxhead;
+ struct mbuf *sc_rxtail;
+ struct mbuf **sc_rxtailp;
+
+ int sc_txthresh; /* Tx threshold */
+ uint32_t sc_usefiber:1; /* if we're fiber */
+ uint32_t sc_stge1023:1; /* are we a 1023 */
+ uint32_t sc_DMACtrl; /* prototype DMACtrl register */
+ uint32_t sc_MACCtrl; /* prototype MacCtrl register */
+ uint16_t sc_IntEnable; /* prototype IntEnable register */
+ uint16_t sc_ReceiveMode; /* prototype ReceiveMode register */
+ uint8_t sc_PhyCtrl; /* prototype PhyCtrl register */
+};
+
+#define STGE_RXCHAIN_RESET(sc) \
+do { \
+ (sc)->sc_rxtailp = &(sc)->sc_rxhead; \
+ *(sc)->sc_rxtailp = NULL; \
+ (sc)->sc_rxlen = 0; \
+} while (/*CONSTCOND*/0)
+
+#define STGE_RXCHAIN_LINK(sc, m) \
+do { \
+ *(sc)->sc_rxtailp = (sc)->sc_rxtail = (m); \
+ (sc)->sc_rxtailp = &(m)->m_next; \
+} while (/*CONSTCOND*/0)
+
+/*
+ * Register access macros
+ */
+#define CSR_WRITE_4(_sc, reg, val) \
+ bus_space_write_4((_sc)->sc_st, (_sc)->sc_sh, (reg), (val))
+#define CSR_WRITE_2(_sc, reg, val) \
+ bus_space_write_2((_sc)->sc_st, (_sc)->sc_sh, (reg), (val))
+#define CSR_WRITE_1(_sc, reg, val) \
+ bus_space_write_1((_sc)->sc_st, (_sc)->sc_sh, (reg), (val))
+
+#define CSR_READ_4(_sc, reg) \
+ bus_space_read_4((_sc)->sc_st, (_sc)->sc_sh, (reg))
+#define CSR_READ_2(_sc, reg) \
+ bus_space_read_2((_sc)->sc_st, (_sc)->sc_sh, (reg))
+#define CSR_READ_1(_sc, reg) \
+ bus_space_read_1((_sc)->sc_st, (_sc)->sc_sh, (reg))
+
+#define STGE_TIMEOUT 1000
+
#ifdef STGE_EVENT_COUNTERS
#define STGE_EVCNT_INCR(ev) (ev)->ev_count++
#else
@@ -238,6 +399,7 @@
bus_space_tag_t iot, memt;
bus_space_handle_t ioh, memh;
bus_dma_segment_t seg;
+ prop_dictionary_t dict;
prop_data_t data;
int ioh_valid, memh_valid;
int i, rseg, error;
@@ -434,6 +596,11 @@
sc->sc_stge1023 = 1;
Home |
Main Index |
Thread Index |
Old Index