- add siisata.c in Makefile.

- use DEVTOV() to highlight vtophys() issue.
- VIA NICs do not stretch less than 60 octet frames.
This commit is contained in:
nisimura 2008-04-07 13:25:31 +00:00
parent 7ce7cf535a
commit ac96fb2beb
6 changed files with 38 additions and 23 deletions

View File

@ -1,11 +1,11 @@
# $NetBSD: Makefile,v 1.8 2008/04/07 11:13:14 nisimura Exp $ # $NetBSD: Makefile,v 1.9 2008/04/07 13:25:31 nisimura Exp $
S= ${.CURDIR}/../../../.. S= ${.CURDIR}/../../../..
PROG= netboot PROG= netboot
SRCS= entry.S main.c pci.c devopen.c dev_net.c nif.c \ SRCS= entry.S main.c pci.c devopen.c dev_net.c nif.c \
fxp.c tlp.c pcn.c sip.c nvt.c rge.c vge.c wm.c \ fxp.c tlp.c pcn.c sip.c nvt.c rge.c vge.c wm.c \
atawd.c pciide.c printf.c atawd.c pciide.c siisata.c printf.c
CLEANFILES+= vers.c vers.o ${PROG} ${PROG}.bin CLEANFILES+= vers.c vers.o ${PROG} ${PROG}.bin
CFLAGS+= -Wall -Wno-main -ffreestanding -msoft-float -mmultiple CFLAGS+= -Wall -Wno-main -ffreestanding -msoft-float -mmultiple
CPPFLAGS+= -D_STANDALONE -DSUPPORT_DHCP CPPFLAGS+= -D_STANDALONE -DSUPPORT_DHCP

View File

@ -1,4 +1,4 @@
/* $Id: atawd.c,v 1.1 2008/04/07 11:13:14 nisimura Exp $ */ /* $NetBSD: atawd.c,v 1.2 2008/04/07 13:25:31 nisimura Exp $ */
#include <sys/types.h> #include <sys/types.h>
#include <sys/param.h> #include <sys/param.h>
@ -32,9 +32,11 @@ struct atacdv {
void * xxx ## _init(unsigned, unsigned) void * xxx ## _init(unsigned, unsigned)
ATAC_DECL(pciide); ATAC_DECL(pciide);
ATAC_DECL(siisata);
static struct atacdv vatacdv[] = { static struct atacdv vatacdv[] = {
{ pciide_init, 01 }, { pciide_init, 01 },
{ siisata_init, 0xf },
}; };
static int natacdv = sizeof(vatacdv)/sizeof(vatacdv[0]); static int natacdv = sizeof(vatacdv)/sizeof(vatacdv[0]);
struct atacdv *atac; struct atacdv *atac;
@ -170,13 +172,13 @@ atatc_probe(void *atac)
memset(wd, 0, sizeof(struct wd_softc)); memset(wd, 0, sizeof(struct wd_softc));
wd->sc_unit = ndisk; wd->sc_unit = ndisk;
wd->sc_channel = &l->channel[i]; wd->sc_channel = &l->channel[i];
disk[ndisk] = (void *)wd;
error = wd_get_params(wd); error = wd_get_params(wd);
if (error != 0) if (error != 0)
continue; continue;
error = wdgetdisklabel(wd); error = wdgetdisklabel(wd);
if (error != 0) if (error != 0)
continue; continue;
disk[ndisk] = (void *)wd;
ndisk += 1; ndisk += 1;
} }
} }
@ -323,7 +325,7 @@ atac_wait_for_ready(struct atac_channel *chp)
} }
return ENXIO; return ENXIO;
} }
static int static int
atac_read_block(struct wd_softc *wd, struct atac_command *cmd) atac_read_block(struct wd_softc *wd, struct atac_command *cmd)
{ {

View File

@ -1,4 +1,4 @@
/* $NetBSD: nvt.c,v 1.9 2007/12/09 09:55:58 nisimura Exp $ */ /* $NetBSD: nvt.c,v 1.10 2008/04/07 13:25:31 nisimura Exp $ */
/*- /*-
* Copyright (c) 2007 The NetBSD Foundation, Inc. * Copyright (c) 2007 The NetBSD Foundation, Inc.
@ -218,11 +218,11 @@ nvt_init(unsigned tag, void *data)
rxd[0].xd0 = htole32(R0_OWN); rxd[0].xd0 = htole32(R0_OWN);
rxd[0].xd1 = htole32(FRAMESIZE << 16); rxd[0].xd1 = htole32(FRAMESIZE << 16);
rxd[0].xd2 = htole32(VTOPHYS(l->rxstore[0])); rxd[0].xd2 = htole32(VTOPHYS(l->rxstore[0]));
rxd[0].xd3 = htole32(&rxd[1]); rxd[0].xd3 = htole32(VTOPHYS(&rxd[1]));
rxd[1].xd0 = htole32(R0_OWN); rxd[1].xd0 = htole32(R0_OWN);
rxd[1].xd1 = htole32(VTOPHYS(l->rxstore[1])); rxd[1].xd1 = htole32(VTOPHYS(l->rxstore[1]));
rxd[1].xd2 = htole32(FRAMESIZE << 16); rxd[1].xd2 = htole32(FRAMESIZE << 16);
rxd[1].xd3 = htole32(&rxd[0]); rxd[1].xd3 = htole32(VTOPHYS(&rxd[0]));
wbinv(l, sizeof(struct local)); wbinv(l, sizeof(struct local));
l->rx = 0; l->rx = 0;
@ -249,6 +249,9 @@ nvt_send(void *dev, char *buf, unsigned len)
struct desc *txd; struct desc *txd;
unsigned loop; unsigned loop;
len = (len & T_FLMASK);
if (len < 60)
len = 60; /* needs to stretch to ETHER_MIN_LEN - 4 */
wbinv(buf, len); wbinv(buf, len);
txd = &l->txd; txd = &l->txd;
txd->xd3 = htole32(txd); txd->xd3 = htole32(txd);

View File

@ -1,4 +1,4 @@
/* $NetBSD: pciide.c,v 1.2 2008/04/07 12:33:57 nisimura Exp $ */ /* $NetBSD: pciide.c,v 1.3 2008/04/07 13:25:31 nisimura Exp $ */
#include <sys/param.h> #include <sys/param.h>
#include <sys/disklabel.h> #include <sys/disklabel.h>
@ -9,6 +9,11 @@
#include <lib/libsa/stand.h> #include <lib/libsa/stand.h>
#include "globals.h" #include "globals.h"
/*
* - no vtophys() translation, vaddr_t == paddr_t.
*/
#define DEVTOV(pa) (uint32_t)(pa)
/* /*
* cmdide * cmdide
* iteide * iteide
@ -48,10 +53,10 @@ pciide_init(unsigned tag, unsigned data)
for (ch = 0; ch < 2; ch += 1) { for (ch = 0; ch < 2; ch += 1) {
cp = &l->channel[ch]; cp = &l->channel[ch];
if (PCIIDE_INTERFACE_PCI(ch) & val) { if (PCIIDE_INTERFACE_PCI(ch) & val) {
cp->c_cmdbase = (void *)pcicfgread(tag, cp->c_cmdbase = (void *)DEVTOV(pcicfgread(tag,
PCIIDE_REG_CMD_BASE(ch)); PCIIDE_REG_CMD_BASE(ch)));
cp->c_ctlbase = (void *)pcicfgread(tag, cp->c_ctlbase = (void *)DEVTOV(pcicfgread(tag,
PCIIDE_REG_CTL_BASE(ch)); PCIIDE_REG_CTL_BASE(ch)));
cp->c_data = (u_int16_t *)(cp->c_cmdbase + wd_data); cp->c_data = (u_int16_t *)(cp->c_cmdbase + wd_data);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
cp->c_cmdreg[i] = cp->c_cmdbase + i; cp->c_cmdreg[i] = cp->c_cmdbase + i;
@ -60,10 +65,10 @@ pciide_init(unsigned tag, unsigned data)
} }
else { else {
tag = 0; /* !!! */ tag = 0; /* !!! */
cp->c_cmdbase = (void *)(pcicfgread(tag, 0x10) + cp->c_cmdbase = (void *)DEVTOV(pcicfgread(tag, 0x10)
PCIIDE_COMPAT_CMD_BASE(ch)); + PCIIDE_COMPAT_CMD_BASE(ch));
cp->c_ctlbase = (void *)(pcicfgread(tag, 0x10) + cp->c_ctlbase = (void *)DEVTOV(pcicfgread(tag, 0x10)
PCIIDE_COMPAT_CTL_BASE(ch)); + PCIIDE_COMPAT_CTL_BASE(ch));
cp->c_data = (u_int16_t *)(cp->c_cmdbase + wd_data); cp->c_data = (u_int16_t *)(cp->c_cmdbase + wd_data);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
cp->c_cmdreg[i] = cp->c_cmdbase + i; cp->c_cmdreg[i] = cp->c_cmdbase + i;

View File

@ -1,4 +1,4 @@
/* $NetBSD: siisata.c,v 1.1 2008/04/07 12:33:57 nisimura Exp $ */ /* $NetBSD: siisata.c,v 1.2 2008/04/07 13:25:31 nisimura Exp $ */
#include <sys/param.h> #include <sys/param.h>
#include <sys/disklabel.h> #include <sys/disklabel.h>
@ -9,6 +9,11 @@
#include <lib/libsa/stand.h> #include <lib/libsa/stand.h>
#include "globals.h" #include "globals.h"
/*
* - no vtophys() translation, vaddr_t == paddr_t.
*/
#define DEVTOV(pa) (uint32_t)(pa)
void *siisata_init(unsigned, unsigned); void *siisata_init(unsigned, unsigned);
#define PCIIDE_REG_CMD_BASE(chan) (0x10 + (8 * (chan))) #define PCIIDE_REG_CMD_BASE(chan) (0x10 + (8 * (chan)))
@ -62,8 +67,8 @@ map3112chan(unsigned tag, int ch, struct atac_channel *cp)
{ {
int i; int i;
cp->c_cmdbase = (void *)pcicfgread(tag, PCIIDE_REG_CMD_BASE(ch)); cp->c_cmdbase = (void*)DEVTOV(pcicfgread(tag, PCIIDE_REG_CMD_BASE(ch)));
cp->c_ctlbase = (void *)pcicfgread(tag, PCIIDE_REG_CTL_BASE(ch)); cp->c_ctlbase = (void*)DEVTOV(pcicfgread(tag, PCIIDE_REG_CTL_BASE(ch)));
cp->c_data = (u_int16_t *)(cp->c_cmdbase + wd_data); cp->c_data = (u_int16_t *)(cp->c_cmdbase + wd_data);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
cp->c_cmdreg[i] = cp->c_cmdbase + i; cp->c_cmdreg[i] = cp->c_cmdbase + i;
@ -86,7 +91,7 @@ map3114chan(unsigned tag, int ch, struct atac_channel *cp)
int i; int i;
uint8_t *ba5; uint8_t *ba5;
ba5 = (uint8_t *)pcicfgread(tag, 0x24); /* PCI_BAR5 */ ba5 = (uint8_t *)DEVTOV(pcicfgread(tag, 0x24)); /* PCI_BAR5 */
cp->c_cmdbase = ba5 + regmap[ch].IDE_TF0; cp->c_cmdbase = ba5 + regmap[ch].IDE_TF0;
cp->c_ctlbase = ba5 + regmap[ch].IDE_TF8; cp->c_ctlbase = ba5 + regmap[ch].IDE_TF8;
cp->c_data = (u_int16_t *)(cp->c_cmdbase + wd_data); cp->c_data = (u_int16_t *)(cp->c_cmdbase + wd_data);

View File

@ -1,4 +1,4 @@
/* $NetBSD: vge.c,v 1.10 2007/12/09 09:55:58 nisimura Exp $ */ /* $NetBSD: vge.c,v 1.11 2008/04/07 13:25:31 nisimura Exp $ */
/*- /*-
* Copyright (c) 2007 The NetBSD Foundation, Inc. * Copyright (c) 2007 The NetBSD Foundation, Inc.
@ -320,10 +320,10 @@ vge_send(void *dev, char *buf, unsigned len)
struct tdesc *txd; struct tdesc *txd;
unsigned loop; unsigned loop;
wbinv(buf, len);
len = (len & T_FLMASK); len = (len & T_FLMASK);
if (len < 60) if (len < 60)
len = 60; /* needs to stretch to ETHER_MIN_LEN - 4 */ len = 60; /* needs to stretch to ETHER_MIN_LEN - 4 */
wbinv(buf, len);
txd = &l->txd; txd = &l->txd;
txd->tf[0].lo = htole32(VTOPHYS(buf)); txd->tf[0].lo = htole32(VTOPHYS(buf));
txd->tf[0].hi = htole32(len << 16); txd->tf[0].hi = htole32(len << 16);