Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sparc64/dev sun4v: vnet - reception of ethernet fra...
details: https://anonhg.NetBSD.org/src/rev/c77e3a2dd0b8
branches: trunk
changeset: 1019477:c77e3a2dd0b8
user: palle <palle%NetBSD.org@localhost>
date: Thu Mar 11 19:34:11 2021 +0000
description:
sun4v: vnet - reception of ethernet frames seems to work now (WIP and code is still full of debug code)
diffstat:
sys/arch/sparc64/dev/vnet.c | 385 +++++++++++++++++++++++++++++++++++++++----
1 files changed, 343 insertions(+), 42 deletions(-)
diffs (truncated from 1007 to 300 lines):
diff -r 0349c13737ad -r c77e3a2dd0b8 sys/arch/sparc64/dev/vnet.c
--- a/sys/arch/sparc64/dev/vnet.c Thu Mar 11 18:49:18 2021 +0000
+++ b/sys/arch/sparc64/dev/vnet.c Thu Mar 11 19:34:11 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vnet.c,v 1.2 2021/03/04 20:59:39 palle Exp $ */
+/* $NetBSD: vnet.c,v 1.3 2021/03/11 19:34:11 palle Exp $ */
/* $OpenBSD: vnet.c,v 1.62 2020/07/10 13:26:36 patrick Exp $ */
/*
* Copyright (c) 2009, 2015 Mark Kettenis
@@ -34,6 +34,8 @@
#if 0
FIXME openbsd
#include <sys/timeout.h>
+#else
+#include <sys/callout.h>
#endif
#include <machine/autoconf.h>
@@ -56,6 +58,9 @@
#include <sparc64/dev/ldcvar.h>
#include <sparc64/dev/viovar.h>
+#if 1
+#define VNET_DEBUG
+#endif
#ifdef VNET_DEBUG
#define DPRINTF(x) printf x
#else
@@ -169,6 +174,8 @@
#if 0
FIXME openbsd
struct timeout sc_handshake_to;
+#else
+ struct callout sc_handshake_co;
#endif
uint8_t sc_xfer_mode;
@@ -230,7 +237,7 @@
void vnet_start(struct ifnet *);
void vnet_start_desc(struct ifnet *);
-int vnet_ioctl (struct ifnet *, u_long, void *);
+int vnet_ioctl(struct ifnet *, u_long, void *);
void vnet_watchdog(struct ifnet *);
int vnet_media_change(struct ifnet *);
@@ -240,13 +247,14 @@
void vnet_setmulti(struct vnet_softc *, int);
-void vnet_init(struct ifnet *);
-void vnet_stop(struct ifnet *);
+int vnet_init(struct ifnet *);
+void vnet_stop(struct ifnet *, int);
int vnet_match(device_t parent, cfdata_t match, void *aux)
{
struct cbus_attach_args *ca = aux;
+
if (strcmp(ca->ca_name, "network") == 0)
return (1);
@@ -308,6 +316,9 @@
#if 0
FIXME openbsd
timeout_set(&sc->sc_handshake_to, vnet_handshake, sc);
+#else
+ callout_init(&sc->sc_handshake_co, 0);
+/* netbsd callout do silmilar function...*/
#endif
sc->sc_peer_state = VIO_DP_STOPPED;
@@ -358,9 +369,13 @@
ifp = &sc->sc_ethercom.ec_if;
ifp->if_softc = sc;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+#if 0
ifp->if_link_state = LINK_STATE_DOWN;
+#endif
+ ifp->if_init = vnet_init;
ifp->if_ioctl = vnet_ioctl;
ifp->if_start = vnet_start;
+ ifp->if_stop = vnet_stop;
ifp->if_watchdog = vnet_watchdog;
strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
#if 0
@@ -374,6 +389,7 @@
ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_AUTO, 0, NULL);
ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_AUTO);
+#if 0
int error = if_initialize(ifp);
if (error != 0) {
printf(", if_initialize() failed\n");
@@ -381,7 +397,10 @@
}
ether_ifattach(ifp, sc->sc_macaddr);
if_register(ifp);
-
+#else
+ if_attach(ifp);
+ ether_ifattach(ifp, sc->sc_macaddr);
+#endif
printf("\n");
return;
free_txqueue:
@@ -424,7 +443,9 @@
int
vnet_rx_intr(void *arg)
{
+#if 0
DPRINTF(("%s: entry\n", __func__));
+#endif
struct vnet_softc *sc = arg;
struct ldc_conn *lc = &sc->sc_lc;
@@ -433,34 +454,47 @@
int err;
err = hv_ldc_rx_get_state(lc->lc_id, &rx_head, &rx_tail, &rx_state);
- if (err == H_EINVAL)
+ if (err == H_EINVAL) {
+ printf("hv_ldc_rx_get_state failed\n");
return (0);
+ }
if (err != H_EOK) {
printf("hv_ldc_rx_get_state %d\n", err);
return (0);
}
+#if 0
+ DPRINTF(("%s: rx_state %" PRId64 " head %" PRId64 " tail %" PRId64 "\n",
+ __func__, rx_state, rx_head, rx_tail));
+#endif
if (rx_state != lc->lc_rx_state) {
+#if 0
+ DPRINTF(("%s: rx_state %" PRId64 " != lc__rx_state %" PRId64 "\n",
+ __func__, rx_state, lc->lc_rx_state));
+#endif
switch (rx_state) {
case LDC_CHANNEL_DOWN:
- DPRINTF(("%s: Rx link down\n", __func__));
lc->lc_tx_seqid = 0;
lc->lc_state = 0;
lc->lc_reset(lc);
if (rx_head == rx_tail)
break;
/* Discard and ack pending I/O. */
- DPRINTF(("setting rx qhead to %lld\n", rx_tail));
+ DPRINTF(("setting rx qhead to %" PRId64 "\n", rx_tail));
err = hv_ldc_rx_set_qhead(lc->lc_id, rx_tail);
if (err == H_EOK)
break;
printf("%s: hv_ldc_rx_set_qhead %d\n", __func__, err);
break;
case LDC_CHANNEL_UP:
+#if 0
DPRINTF(("%s: Rx link up\n", __func__));
+#endif
#if 0
FIXME openbsd
timeout_add_msec(&sc->sc_handshake_to, 500);
+#else
+ callout_reset(&sc->sc_handshake_co, hz / 2, vnet_handshake, sc);
#endif
break;
case LDC_CHANNEL_RESET:
@@ -471,37 +505,73 @@
#if 0
FIXME openbsd
timeout_add_msec(&sc->sc_handshake_to, 500);
+#else
+ callout_reset(&sc->sc_handshake_co, hz / 2, vnet_handshake, sc);
#endif
- if (rx_head == rx_tail)
+ if (rx_head == rx_tail) {
+#if 0
+ DPRINTF(("%s: rx_head == rx_head\n", __func__));
+#endif
break;
+ }
/* Discard and ack pending I/O. */
- DPRINTF(("setting rx qhead to %lld\n", rx_tail));
+ DPRINTF(("setting rx qhead to %" PRId64 "\n", rx_tail));
err = hv_ldc_rx_set_qhead(lc->lc_id, rx_tail);
if (err == H_EOK)
break;
printf("%s: hv_ldc_rx_set_qhead %d\n", __func__, err);
break;
+ default:
+ DPRINTF(("%s: unhandled rx_state %" PRIx64 "\n", __func__, rx_state));
+ break;
}
lc->lc_rx_state = rx_state;
+#if 0
+ DPRINTF(("%s: setting rx_state %" PRId64 " = lc__rx_state %" PRId64 "\n",
+ __func__, rx_state, lc->lc_rx_state));
+#endif
return (1);
+ } else {
+#if 0
+ DPRINTF(("%s: rx_state %" PRId64 " == lc__rx_state %" PRId64 "\n",
+ __func__, rx_state, lc->lc_rx_state));
+#endif
}
if (rx_head == rx_tail)
+ {
+ DPRINTF(("%s: head eq tail\n", __func__));
return (0);
-
+ }
lp = (struct ldc_pkt *)(uintptr_t)(lc->lc_rxq->lq_va + rx_head);
+#if 0
+ DPRINTF(("%s: lp->type %" PRId8 "\n", __func__, lp->type));
+ DPRINTF(("%s: lp->stype %" PRId8 "\n", __func__, lp->stype));
+ DPRINTF(("%s: lp->ctrl %" PRId8 "\n", __func__, lp->ctrl));
+ DPRINTF(("%s: lp->env %" PRId8 "\n", __func__, lp->env));
+ DPRINTF(("%s: lp->seqid %" PRId32 "\n", __func__, lp->seqid));
+ DPRINTF(("%s: lp->major %" PRId16 "\n", __func__, lp->major));
+ DPRINTF(("%s: lp->minor %" PRId16 "\n", __func__, lp->minor));
+#endif
switch (lp->type) {
case LDC_CTRL:
+#if 0
+ DPRINTF(("%s: LDC_CTRL\n", __func__));
+#endif
ldc_rx_ctrl(lc, lp);
break;
case LDC_DATA:
+#if 0
+ DPRINTF(("%s: LDC_DATA\n", __func__));
+#endif
ldc_rx_data(lc, lp);
break;
default:
- DPRINTF(("%0x02/%0x02/%0x02\n", lp->type, lp->stype,
- lp->ctrl));
+ DPRINTF(("%s: unhandled type %0x02/%0x02/%0x02\n",
+ __func__, lp->type, lp->stype, lp->ctrl));
+ Debugger();
ldc_reset(lc);
break;
}
@@ -514,14 +584,17 @@
err = hv_ldc_rx_set_qhead(lc->lc_id, rx_head);
if (err != H_EOK)
printf("%s: hv_ldc_rx_set_qhead %d\n", __func__, err);
-
+#if 0
DPRINTF(("%s: exit\n", __func__));
+#endif
return (1);
}
void
vnet_handshake(void *arg)
{
+ DPRINTF(("%s: entry\n", __func__));
+
struct vnet_softc *sc = arg;
ldc_send_vers(&sc->sc_lc);
@@ -530,19 +603,27 @@
void
vio_rx_data(struct ldc_conn *lc, struct ldc_pkt *lp)
{
+#if 0
+ DPRINTF(("%s: entry\n", __func__));
+#endif
+
struct vio_msg *vm = (struct vio_msg *)lp;
switch (vm->type) {
case VIO_TYPE_CTRL:
if ((lp->env & LDC_FRAG_START) == 0 &&
- (lp->env & LDC_FRAG_STOP) == 0)
+ (lp->env & LDC_FRAG_STOP) == 0) {
+ DPRINTF(("%s: FRAG_START==0 and FRAG_STOP==0\n", __func__));
return;
+ }
vnet_rx_vio_ctrl(lc->lc_sc, vm);
break;
case VIO_TYPE_DATA:
- if((lp->env & LDC_FRAG_START) == 0)
+ if((lp->env & LDC_FRAG_START) == 0) {
+ DPRINTF(("%s: FRAG_START==0\n", __func__));
return;
+ }
vnet_rx_vio_data(lc->lc_sc, vm);
break;
@@ -556,6 +637,9 @@
void
vnet_rx_vio_ctrl(struct vnet_softc *sc, struct vio_msg *vm)
{
Home |
Main Index |
Thread Index |
Old Index