Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/ic support 8bit mode, needed for ci20
details: https://anonhg.NetBSD.org/src/rev/0127c61bd2a2
branches: trunk
changeset: 806830:0127c61bd2a2
user: macallan <macallan%NetBSD.org@localhost>
date: Tue Mar 10 18:01:04 2015 +0000
description:
support 8bit mode, needed for ci20
diffstat:
sys/dev/ic/dm9000.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 81 insertions(+), 4 deletions(-)
diffs (124 lines):
diff -r 393537235f60 -r 0127c61bd2a2 sys/dev/ic/dm9000.c
--- a/sys/dev/ic/dm9000.c Tue Mar 10 13:28:47 2015 +0000
+++ b/sys/dev/ic/dm9000.c Tue Mar 10 18:01:04 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: dm9000.c,v 1.5 2014/11/26 22:50:22 skrll Exp $ */
+/* $NetBSD: dm9000.c,v 1.6 2015/03/10 18:01:04 macallan Exp $ */
/*
* Copyright (c) 2009 Paul Fleischer
@@ -200,7 +200,9 @@
/* Read/write packet data from/to DM9000 IC in various transfer sizes */
int dme_pkt_read_2(struct dme_softc *sc, struct ifnet *ifp, struct mbuf **outBuf);
int dme_pkt_write_2(struct dme_softc *sc, struct mbuf *bufChain);
-/* TODO: Implement 8 and 32 bit read/write functions */
+int dme_pkt_read_1(struct dme_softc *sc, struct ifnet *ifp, struct mbuf **outBuf);
+int dme_pkt_write_1(struct dme_softc *sc, struct mbuf *bufChain);
+/* TODO: Implement 32 bit read/write functions */
uint16_t
dme_phy_read(struct dme_softc *sc, int reg)
@@ -494,8 +496,6 @@
io_mode = (dme_read(sc, DM9000_ISR) &
DM9000_IOMODE_MASK) >> DM9000_IOMODE_SHIFT;
- if (io_mode != DM9000_MODE_16BIT )
- panic("DM9000: Only 16-bit mode is supported!\n");
DPRINTF(("DM9000 Operation Mode: "));
switch( io_mode) {
@@ -508,10 +508,13 @@
case DM9000_MODE_32BIT:
DPRINTF(("32-bit mode"));
sc->sc_data_width = 4;
+ panic("32bit mode is unsupported\n");
break;
case DM9000_MODE_8BIT:
DPRINTF(("8-bit mode"));
sc->sc_data_width = 1;
+ sc->sc_pkt_write = dme_pkt_write_1;
+ sc->sc_pkt_read = dme_pkt_read_1;
break;
default:
DPRINTF(("Invalid mode"));
@@ -1105,6 +1108,80 @@
return rx_status;
}
+int
+dme_pkt_write_1(struct dme_softc *sc, struct mbuf *bufChain)
+{
+ int length = 0, i;
+ struct mbuf *buf;
+ uint8_t *write_ptr;
+
+ /* We expect that the DM9000 has been setup to accept writes before
+ this function is called. */
+
+ for (buf = bufChain; buf != NULL; buf = buf->m_next) {
+ int to_write = buf->m_len;
+
+ length += to_write;
+
+ write_ptr = buf->m_data;
+ for(i = 0; i < to_write; i++) {
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh,
+ sc->dme_data, *write_ptr);
+ write_ptr++;
+ }
+ } /* for(...) */
+
+ return length;
+}
+
+int
+dme_pkt_read_1(struct dme_softc *sc, struct ifnet *ifp, struct mbuf **outBuf)
+{
+ uint8_t rx_status;
+ struct mbuf *m;
+ uint8_t *buf;
+ uint16_t frame_length;
+ uint16_t i, reg;
+ uint8_t data;
+
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, sc->dme_data);
+ reg |= bus_space_read_1(sc->sc_iot, sc->sc_ioh, sc->dme_data) << 8;
+ rx_status = reg & 0xFF;
+
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, sc->dme_data);
+ reg |= bus_space_read_1(sc->sc_iot, sc->sc_ioh, sc->dme_data) << 8;
+ frame_length = reg;
+ if (frame_length > ETHER_MAX_LEN) {
+ printf("Got frame of length: %d\n", frame_length);
+ printf("ETHER_MAX_LEN is: %d\n", ETHER_MAX_LEN);
+ panic("Something is rotten");
+ }
+ RX_DPRINTF(("dme_receive: "
+ "rx_statux: 0x%x, frame_length: %d\n",
+ rx_status, frame_length));
+
+
+ m = dme_alloc_receive_buffer(ifp, frame_length);
+
+ buf = mtod(m, uint8_t*);
+
+ RX_DPRINTF(("dme_receive: "));
+
+ for(i=0; i< frame_length; i+=1 ) {
+ data = bus_space_read_1(sc->sc_iot,
+ sc->sc_ioh, sc->dme_data);
+ *buf = data;
+ buf++;
+ RX_DATA_DPRINTF(("%02X ", data));
+ }
+
+ RX_DATA_DPRINTF(("\n"));
+ RX_DPRINTF(("Read %d bytes\n", i));
+
+ *outBuf = m;
+ return rx_status;
+}
+
struct mbuf*
dme_alloc_receive_buffer(struct ifnet *ifp, unsigned int frame_length)
{
Home |
Main Index |
Thread Index |
Old Index