Make the Macronix driver work on FreeBSD/alpha and add to GENERIC.

Like the PNIC, we have to copy packet headers in the receive handler
because the chip will only DMA to longword aligned buffers.

Also do some mindor cleanups.
This commit is contained in:
Bill Paul 1999-04-01 02:09:37 +00:00
parent 62fb100205
commit 8919d7d4e7
4 changed files with 76 additions and 25 deletions

View File

@ -11,7 +11,7 @@
# device lines is present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $Id: GENERIC,v 1.16 1999/03/27 20:41:25 wpaul Exp $
# $Id: GENERIC,v 1.17 1999/03/31 04:04:14 wpaul Exp $
machine "alpha"
cpu "EV4"
@ -100,6 +100,7 @@ device sio1 at isa0 port "IO_COM2" irq 3 flags 0x50
device de0
device fxp0
device le0
device mx0
device pn0
device tl0
device xl0

View File

@ -11,7 +11,7 @@
# device lines is present in the ./LINT configuration file. If you are
# in doubt as to the purpose or necessity of a line, check first in LINT.
#
# $Id: GENERIC,v 1.16 1999/03/27 20:41:25 wpaul Exp $
# $Id: GENERIC,v 1.17 1999/03/31 04:04:14 wpaul Exp $
machine "alpha"
cpu "EV4"
@ -100,6 +100,7 @@ device sio1 at isa0 port "IO_COM2" irq 3 flags 0x50
device de0
device fxp0
device le0
device mx0
device pn0
device tl0
device xl0

View File

@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: if_mx.c,v 1.10 1999/01/28 00:57:53 dillon Exp $
* $Id: if_mx.c,v 1.37 1999/04/01 02:00:04 wpaul Exp $
*/
/*
@ -94,7 +94,7 @@
#ifndef lint
static const char rcsid[] =
"$Id: if_mx.c,v 1.10 1999/01/28 00:57:53 dillon Exp $";
"$Id: if_mx.c,v 1.37 1999/04/01 02:00:04 wpaul Exp $";
#endif
/*
@ -153,8 +153,8 @@ static void mx_ifmedia_sts __P((struct ifnet *, struct ifmediareq *));
static void mx_delay __P((struct mx_softc *));
static void mx_eeprom_idle __P((struct mx_softc *));
static void mx_eeprom_putbyte __P((struct mx_softc *, u_int8_t));
static void mx_eeprom_getword __P((struct mx_softc *, u_int8_t, u_int16_t *));
static void mx_eeprom_putbyte __P((struct mx_softc *, int));
static void mx_eeprom_getword __P((struct mx_softc *, int, u_int16_t *));
static void mx_read_eeprom __P((struct mx_softc *, caddr_t, int,
int, int));
@ -165,7 +165,7 @@ static void mx_mii_send __P((struct mx_softc *, u_int32_t, int));
static int mx_mii_readreg __P((struct mx_softc *, struct mx_mii_frame *));
static int mx_mii_writereg __P((struct mx_softc *, struct mx_mii_frame *));
static u_int16_t mx_phy_readreg __P((struct mx_softc *, int));
static void mx_phy_writereg __P((struct mx_softc *, u_int16_t, u_int16_t));
static void mx_phy_writereg __P((struct mx_softc *, int, int));
static void mx_autoneg_xmit __P((struct mx_softc *));
static void mx_autoneg_mii __P((struct mx_softc *, int, int));
@ -173,8 +173,8 @@ static void mx_autoneg __P((struct mx_softc *, int, int));
static void mx_setmode_mii __P((struct mx_softc *, int));
static void mx_setmode __P((struct mx_softc *, int, int));
static void mx_getmode_mii __P((struct mx_softc *));
static void mx_setcfg __P((struct mx_softc *, u_int16_t));
static u_int32_t mx_calchash __P((u_int8_t *));
static void mx_setcfg __P((struct mx_softc *, int));
static u_int32_t mx_calchash __P((caddr_t));
static void mx_setfilt __P((struct mx_softc *));
static void mx_reset __P((struct mx_softc *));
static int mx_list_rx_init __P((struct mx_softc *));
@ -240,7 +240,7 @@ static void mx_eeprom_idle(sc)
*/
static void mx_eeprom_putbyte(sc, addr)
struct mx_softc *sc;
u_int8_t addr;
int addr;
{
register int d, i;
@ -270,7 +270,7 @@ static void mx_eeprom_putbyte(sc, addr)
*/
static void mx_eeprom_getword(sc, addr, dest)
struct mx_softc *sc;
u_int8_t addr;
int addr;
u_int16_t *dest;
{
register int i;
@ -541,8 +541,8 @@ static u_int16_t mx_phy_readreg(sc, reg)
static void mx_phy_writereg(sc, reg, data)
struct mx_softc *sc;
u_int16_t reg;
u_int16_t data;
int reg;
int data;
{
struct mx_mii_frame frame;
u_int32_t cfg;
@ -565,7 +565,7 @@ static void mx_phy_writereg(sc, reg, data)
#define MX_BITS 9
static u_int32_t mx_calchash(addr)
u_int8_t *addr;
caddr_t addr;
{
u_int32_t idx, bit, data, crc;
@ -1132,7 +1132,7 @@ void mx_setfilt(sc)
}
if (ifp->if_flags & IFF_BROADCAST) {
h = mx_calchash(etherbroadcastaddr);
h = mx_calchash((caddr_t)&etherbroadcastaddr);
sp[h >> 4] |= 1 << (h & 0xF);
}
@ -1169,7 +1169,7 @@ void mx_setfilt(sc)
*/
static void mx_setcfg(sc, bmcr)
struct mx_softc *sc;
u_int16_t bmcr;
int bmcr;
{
int i, restart = 0;
@ -1297,7 +1297,7 @@ mx_attach(config_id, unit)
sc = malloc(sizeof(struct mx_softc), M_DEVBUF, M_NOWAIT);
if (sc == NULL) {
printf("mx%d: no memory for softc struct!\n", unit);
return;
goto fail;
}
bzero(sc, sizeof(struct mx_softc));
@ -1350,7 +1350,12 @@ mx_attach(config_id, unit)
printf ("mx%d: couldn't map ports\n", unit);
goto fail;
}
#ifdef __i386__
sc->mx_btag = I386_BUS_SPACE_IO;
#endif
#ifdef __alpha__
sc->mx_btag = ALPHA_BUS_SPACE_IO;
#endif
#else
if (!(command & PCIM_CMD_MEMEN)) {
printf("mx%d: failed to enable memory mapping!\n", unit);
@ -1361,7 +1366,12 @@ mx_attach(config_id, unit)
printf ("mx%d: couldn't map memory\n", unit);
goto fail;
}
#ifdef __i386__
sc->mx_btag = I386_BUS_SPACE_MEM;
#endif
#ifdef __alpha__
sc->mx_btag = ALPHA_BUS_SPACE_MEM;
#endif
sc->mx_bhandle = vbase;
#endif
@ -1373,7 +1383,6 @@ mx_attach(config_id, unit)
/* Need this info to decide on a chip type. */
revision = pci_conf_read(config_id, MX_PCI_REVID) & 0x000000FF;
pci_id = pci_conf_read(config_id, MX_PCI_VENDOR_ID) & 0x0000FFFF;
pci_id = (pci_conf_read(config_id,MX_PCI_VENDOR_ID) >> 16) & 0x0000FFFF;
if (pci_id == MX_DEVICEID_98713 && revision < MX_REVISION_98713A)
@ -1406,7 +1415,7 @@ mx_attach(config_id, unit)
if (sc->mx_ldata_ptr == NULL) {
free(sc, M_DEVBUF);
printf("mx%d: no memory for list buffers!\n", unit);
return;
goto fail;
}
sc->mx_ldata = (struct mx_list_data *)sc->mx_ldata_ptr;
@ -1644,6 +1653,9 @@ static void mx_rxeof(sc)
while(!((rxstat = sc->mx_cdata.mx_rx_head->mx_ptr->mx_status) &
MX_RXSTAT_OWN)) {
#ifdef __alpha__
struct mbuf *m0 = NULL;
#endif
cur_rx = sc->mx_cdata.mx_rx_head;
sc->mx_cdata.mx_rx_head = cur_rx->mx_nextdesc;
@ -1691,10 +1703,41 @@ static void mx_rxeof(sc)
continue;
}
#ifdef __alpha__
/*
* Deal with alignment on alpha.
*/
MGETHDR(m0, M_DONTWAIT, MT_DATA);
if (m0 == NULL) {
ifp->if_ierrors++;
cur_rx->mx_ptr->mx_status = MX_RXSTAT;
cur_rx->mx_ptr->mx_ctl =
MX_RXCTL_RLINK | (MCLBYTES - 1);
bzero((char *)mtod(cur_rx->mx_mbuf, char *), MCLBYTES);
continue;
}
m0->m_data += 2;
if (total_len <= (MHLEN - 2)) {
bcopy(mtod(m, caddr_t), mtod(m0, caddr_t), total_len); m_freem(m);
m = m0;
m->m_pkthdr.len = m->m_len = total_len;
} else {
bcopy(mtod(m, caddr_t), mtod(m0, caddr_t), (MHLEN - 2));
m->m_len = total_len - (MHLEN - 2);
m->m_data += (MHLEN - 2);
m0->m_next = m;
m0->m_len = (MHLEN - 2);
m = m0;
m->m_pkthdr.len = total_len;
}
#else
m->m_pkthdr.len = m->m_len = total_len;
#endif
ifp->if_ipackets++;
eh = mtod(m, struct ether_header *);
m->m_pkthdr.rcvif = ifp;
m->m_pkthdr.len = m->m_len = total_len;
#if NBPFILTER > 0
/*
* Handle BPF listeners. Let the BPF user see the packet, but
@ -1763,7 +1806,7 @@ static void mx_txeof(sc)
cur_tx = sc->mx_cdata.mx_tx_head;
txstat = MX_TXSTATUS(cur_tx);
if ((txstat & MX_TXSTAT_OWN) || txstat == MX_UNSENT)
if ((txstat & MX_TXSTAT_OWN) || MX_TXOWN(cur_tx) == MX_UNSENT)
break;
if (txstat & MX_TXSTAT_ERRSUM) {
@ -2390,7 +2433,7 @@ static void mx_stop(sc)
sc->mx_cdata.mx_rx_chain[i].mx_mbuf = NULL;
}
}
bzero((volatile char *)&sc->mx_ldata->mx_rx_list,
bzero((char *)&sc->mx_ldata->mx_rx_list,
sizeof(sc->mx_ldata->mx_rx_list));
/*
@ -2403,7 +2446,7 @@ static void mx_stop(sc)
}
}
bzero((volatile char *)&sc->mx_ldata->mx_tx_list,
bzero((char *)&sc->mx_ldata->mx_tx_list,
sizeof(sc->mx_ldata->mx_tx_list));
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);

View File

@ -29,7 +29,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: if_mxreg.h,v 1.12 1998/12/04 21:34:33 wpaul Exp $
* $Id: if_mxreg.h,v 1.14 1999/04/01 02:01:04 wpaul Exp $
*/
/*
@ -502,7 +502,7 @@ struct mx_softc {
#define CSR_WRITE_4(sc, reg, val) \
bus_space_write_4(sc->mx_btag, sc->mx_bhandle, reg, val)
#define CSR_WRITE_2(sc, reg, val) \
bus_space_write_2(sc->mx_btag, sc->mx_bbhandle, reg, val)
bus_space_write_2(sc->mx_btag, sc->mx_bhandle, reg, val)
#define CSR_WRITE_1(sc, reg, val) \
bus_space_write_1(sc->mx_btag, sc->mx_bhandle, reg, val)
@ -695,3 +695,9 @@ struct mx_softc {
#define PHY_BMSR_LINKSTAT 0x0004
#define PHY_BMSR_JABBER 0x0002
#define PHY_BMSR_EXTENDED 0x0001
#ifdef __alpha__
#undef vtophys
#define vtophys(va) (pmap_kextract(((vm_offset_t) (va))) \
+ 1*1024*1024*1024)
#endif