Module Name: src Committed By: palle Date: Thu Mar 11 19:34:11 UTC 2021
Modified Files: src/sys/arch/sparc64/dev: vnet.c Log Message: sun4v: vnet - reception of ethernet frames seems to work now (WIP and code is still full of debug code) To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/sparc64/dev/vnet.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sparc64/dev/vnet.c diff -u src/sys/arch/sparc64/dev/vnet.c:1.2 src/sys/arch/sparc64/dev/vnet.c:1.3 --- src/sys/arch/sparc64/dev/vnet.c:1.2 Thu Mar 4 20:59:39 2021 +++ src/sys/arch/sparc64/dev/vnet.c Thu Mar 11 19:34:11 2021 @@ -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 @@ FIXME openbsd #if 0 FIXME openbsd #include <sys/timeout.h> +#else +#include <sys/callout.h> #endif #include <machine/autoconf.h> @@ -56,6 +58,9 @@ FIXME openbsd #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 @@ struct vnet_softc { #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_send_dring_data(struct vnet_so 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_link_state(struct vnet_softc * 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 @@ FIXME openbsd #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 @@ FIXME openbsd 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 @@ FIXME openbsd 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 @@ FIXME openbsd } 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 @@ vnet_tx_intr(void *arg) 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 @@ vnet_rx_intr(void *arg) 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 @@ FIXME openbsd #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 @@ FIXME openbsd 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 @@ vnet_handshake(void *arg) 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 @@ vio_rx_data(struct ldc_conn *lc, struct void vnet_rx_vio_ctrl(struct vnet_softc *sc, struct vio_msg *vm) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vio_msg_tag *tag = (struct vio_msg_tag *)&vm->type; switch (tag->stype_env) { @@ -572,7 +656,8 @@ vnet_rx_vio_ctrl(struct vnet_softc *sc, vnet_rx_vio_rdx(sc, tag); break; default: - DPRINTF(("CTRL/0x%02x/0x%04x\n", tag->stype, tag->stype_env)); + printf("%s: CTRL/0x%02x/0x%04x FIXME\n", + __func__, tag->stype, tag->stype_env); break; } } @@ -580,15 +665,21 @@ vnet_rx_vio_ctrl(struct vnet_softc *sc, void vnet_rx_vio_ver_info(struct vnet_softc *sc, struct vio_msg_tag *tag) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vio_ver_info *vi = (struct vio_ver_info *)tag; switch (vi->tag.stype) { case VIO_SUBTYPE_INFO: +#if 0 DPRINTF(("CTRL/INFO/VER_INFO\n")); +#endif /* Make sure we're talking to a virtual network device. */ if (vi->dev_class != VDEV_NETWORK && vi->dev_class != VDEV_NETWORK_SWITCH) { + DPRINTF(("Class is not network or network switch\n")); /* Huh, we're not talking to a network device? */ printf("Not a network device\n"); vi->tag.stype = VIO_SUBTYPE_NACK; @@ -597,6 +688,8 @@ vnet_rx_vio_ver_info(struct vnet_softc * } if (vi->major != VNET_MAJOR) { + DPRINTF(("Major mismatch %" PRId8 " vs %" PRId8 "\n", + vi->major, VNET_MAJOR)); vi->tag.stype = VIO_SUBTYPE_NACK; vi->major = VNET_MAJOR; vi->minor = VNET_MINOR; @@ -612,7 +705,9 @@ vnet_rx_vio_ver_info(struct vnet_softc * break; case VIO_SUBTYPE_ACK: +#if 0 DPRINTF(("CTRL/ACK/VER_INFO\n")); +#endif if (!ISSET(sc->sc_vio_state, VIO_SND_VER_INFO)) { ldc_reset(&sc->sc_lc); break; @@ -633,12 +728,18 @@ vnet_rx_vio_ver_info(struct vnet_softc * void vnet_rx_vio_attr_info(struct vnet_softc *sc, struct vio_msg_tag *tag) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vnet_attr_info *ai = (struct vnet_attr_info *)tag; switch (ai->tag.stype) { case VIO_SUBTYPE_INFO: +#if 0 DPRINTF(("CTRL/INFO/ATTR_INFO\n")); +#endif sc->sc_xfer_mode = ai->xfer_mode; + DPRINTF(("sc_xfer_mode %d\n", sc->sc_xfer_mode)); ai->tag.stype = VIO_SUBTYPE_ACK; ai->tag.sid = sc->sc_local_sid; @@ -647,7 +748,9 @@ vnet_rx_vio_attr_info(struct vnet_softc break; case VIO_SUBTYPE_ACK: +#if 0 DPRINTF(("CTRL/ACK/ATTR_INFO\n")); +#endif if (!ISSET(sc->sc_vio_state, VIO_SND_ATTR_INFO)) { ldc_reset(&sc->sc_lc); break; @@ -672,11 +775,16 @@ vnet_rx_vio_attr_info(struct vnet_softc void vnet_rx_vio_dring_reg(struct vnet_softc *sc, struct vio_msg_tag *tag) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vio_dring_reg *dr = (struct vio_dring_reg *)tag; switch (dr->tag.stype) { case VIO_SUBTYPE_INFO: +#if 0 DPRINTF(("CTRL/INFO/DRING_REG\n")); +#endif sc->sc_peer_dring_nentries = dr->num_descriptors; sc->sc_peer_desc_size = dr->descriptor_size; @@ -689,7 +797,9 @@ vnet_rx_vio_dring_reg(struct vnet_softc break; case VIO_SUBTYPE_ACK: +#if 0 DPRINTF(("CTRL/ACK/DRING_REG\n")); +#endif if (!ISSET(sc->sc_vio_state, VIO_SND_DRING_REG)) { ldc_reset(&sc->sc_lc); break; @@ -715,6 +825,9 @@ void vnet_rx_vio_rdx(struct vnet_softc *sc, struct vio_msg_tag *tag) { #if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif +#if 0 FIXME openbsd struct ifnet *ifp = &sc->sc_ac.ac_if; #else @@ -723,7 +836,9 @@ FIXME openbsd switch(tag->stype) { case VIO_SUBTYPE_INFO: +#if 0 DPRINTF(("CTRL/INFO/RDX\n")); +#endif tag->stype = VIO_SUBTYPE_ACK; tag->sid = sc->sc_local_sid; @@ -732,7 +847,9 @@ FIXME openbsd break; case VIO_SUBTYPE_ACK: +#if 0 DPRINTF(("CTRL/ACK/RDX\n")); +#endif if (!ISSET(sc->sc_vio_state, VIO_SND_RDX)) { ldc_reset(&sc->sc_lc); break; @@ -778,6 +895,9 @@ FIXME openbsd void vnet_rx_vio_data(struct vnet_softc *sc, struct vio_msg *vm) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vio_msg_tag *tag = (struct vio_msg_tag *)&vm->type; if (!ISSET(sc->sc_vio_state, VIO_RCV_RDX) || @@ -805,6 +925,9 @@ vnet_rx_vio_data(struct vnet_softc *sc, void vnet_rx_vio_desc_data(struct vnet_softc *sc, struct vio_msg_tag *tag) { + + DPRINTF(("%s: entry\n", __func__)); + struct vnet_desc_msg *dm = (struct vnet_desc_msg *)tag; struct ldc_conn *lc = &sc->sc_lc; struct ldc_map *map = sc->sc_lm; @@ -932,6 +1055,10 @@ FIXME openbsd void vnet_rx_vio_dring_data(struct vnet_softc *sc, struct vio_msg_tag *tag) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif + struct vio_dring_msg *dm = (struct vio_dring_msg *)tag; struct ldc_conn *lc = &sc->sc_lc; #if 0 @@ -940,7 +1067,9 @@ FIXME openbsd #else struct ifnet *ifp = &sc->sc_ethercom.ec_if; #endif +#if 1 struct mbuf *m = NULL; +#endif paddr_t pa; psize_t nbytes; int err; @@ -948,6 +1077,9 @@ FIXME openbsd switch(tag->stype) { case VIO_SUBTYPE_INFO: { +#if 0 + DPRINTF(("%s: VIO_SUBTYPE_INFO\n", __func__)); +#endif struct vnet_desc desc; uint64_t cookie; paddr_t desc_pa; @@ -988,13 +1120,54 @@ FIXME openbsd if (!m) break; #else - MCLGET(NULL, M_DONTWAIT); +#if 1 +#if 0 + DPRINTF(("%s: before MGETHDR\n", __func__)); +#endif + MGETHDR(m, M_DONTWAIT, MT_DATA); +#if 0 + DPRINTF(("%s: after MGETHDR\n", __func__)); +#endif + if (m == NULL) { + DPRINTF(("%s: MGETHDR failed\n", __func__)); + if_statinc(ifp, if_ierrors); + goto skip; + } +#if 0 + DPRINTF(("%s: before MCLGET\n", __func__)); +#endif + MCLGET(m, M_DONTWAIT); if ((m->m_flags & M_EXT) == 0) break; -#endif +#if 0 + DPRINTF(("%s: after MCLGET\n", __func__)); +#endif +#endif +#endif +#if 1 m->m_len = m->m_pkthdr.len = desc.nbytes; +#endif nbytes = roundup(desc.nbytes + VNET_ETHER_ALIGN, 8); - +#if 1 + DPRINTF(("%s: nbytes %" PRId64 " desc.nbytes %" PRId32 "\n", + __func__, nbytes, desc.nbytes)); + uint8_t buf[ETHER_MAX_LEN]; + pmap_extract(pmap_kernel(), (vaddr_t)buf, &pa); + err = hv_ldc_copy(lc->lc_id, LDC_COPY_IN, + desc.cookie[0].addr, pa, nbytes, &nbytes); + if (err != H_EOK) { + //m_freem(m); + goto skip; + } + for (int i = 0; i < desc.nbytes; i++) { + if (i % 16 == 0) { + printf("\n"); + } + printf("%02x ", buf[i]); + } + printf("\n"); +#endif +#if 1 pmap_extract(pmap_kernel(), (vaddr_t)m->m_data, &pa); err = hv_ldc_copy(lc->lc_id, LDC_COPY_IN, desc.cookie[0].addr, pa, nbytes, &nbytes); @@ -1007,9 +1180,16 @@ FIXME openbsd #if 0 FIXME openbsd ml_enqueue(&ml, m); -#else +#else +#if 0 + DPRINTF(("%s: before if_percpuq_enqueue\n", __func__)); +#endif if_percpuq_enqueue(ifp->if_percpuq, m); +#if 0 + DPRINTF(("%s: after if_percpuq_enqueue\n", __func__)); +#endif #endif +#endif skip: desc.hdr.dstate = VIO_DESC_DONE; @@ -1027,7 +1207,7 @@ FIXME openbsd FIXME openbd if_input(ifp, &ml); #else - printf("vnet_rx_vio_dring_data() ignoring if_input - FIXME\n"); +// FIXME??? printf("vnet_rx_vio_dring_data() ignoring if_input - FIXME\n"); #endif if (ack_end_idx == -1) { @@ -1044,6 +1224,9 @@ FIXME openbd case VIO_SUBTYPE_ACK: { +#if 0 + DPRINTF(("%s: VIO_SUBTYPE_ACK\n", __func__)); +#endif struct ldc_map *map = sc->sc_lm; u_int cons, count; @@ -1111,11 +1294,16 @@ FIXME openbsd void vnet_ldc_reset(struct ldc_conn *lc) { + + DPRINTF(("%s: entry\n", __func__)); + struct vnet_softc *sc = lc->lc_sc; int i; #if 0 FIXME openbsd timeout_del(&sc->sc_handshake_to); +#else + callout_stop(&sc->sc_handshake_co); #endif sc->sc_tx_prod = sc->sc_tx_cons = 0; sc->sc_peer_state = VIO_DP_STOPPED; @@ -1139,10 +1327,16 @@ FIXME openbsd void vnet_ldc_start(struct ldc_conn *lc) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif + struct vnet_softc *sc = lc->lc_sc; #if 0 FIXME openbsd timeout_del(&sc->sc_handshake_to); +#else + callout_stop(&sc->sc_handshake_co); #endif vnet_send_ver_info(sc, VNET_MAJOR, VNET_MINOR); } @@ -1150,6 +1344,9 @@ FIXME openbsd void vnet_sendmsg(struct vnet_softc *sc, void *msg, size_t len) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct ldc_conn *lc = &sc->sc_lc; int err; @@ -1161,6 +1358,9 @@ vnet_sendmsg(struct vnet_softc *sc, void void vnet_send_ver_info(struct vnet_softc *sc, uint16_t major, uint16_t minor) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vio_ver_info vi; bzero(&vi, sizeof(vi)); @@ -1179,6 +1379,9 @@ vnet_send_ver_info(struct vnet_softc *sc void vnet_send_attr_info(struct vnet_softc *sc) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vnet_attr_info ai; int i; @@ -1204,6 +1407,10 @@ vnet_send_attr_info(struct vnet_softc *s void vnet_send_dring_reg(struct vnet_softc *sc) { +#if 1 + DPRINTF(("%s: entry\n", __func__)); +#endif + struct vio_dring_reg dr; bzero(&dr, sizeof(dr)); @@ -1226,6 +1433,9 @@ vnet_send_dring_reg(struct vnet_softc *s void vio_send_rdx(struct vnet_softc *sc) { +#if 1 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vio_msg_tag tag; tag.type = VIO_TYPE_CTRL; @@ -1240,6 +1450,9 @@ vio_send_rdx(struct vnet_softc *sc) void vnet_send_dring_data(struct vnet_softc *sc, uint32_t start_idx) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vio_dring_msg dm; u_int peer_state; @@ -1262,6 +1475,9 @@ vnet_send_dring_data(struct vnet_softc * void vnet_start(struct ifnet *ifp) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vnet_softc *sc = ifp->if_softc; struct ldc_conn *lc = &sc->sc_lc; struct ldc_map *map = sc->sc_lm; @@ -1271,22 +1487,35 @@ vnet_start(struct ifnet *ifp) uint64_t tx_head, tx_tail, tx_state; u_int start, prod, count; int err; - #if 0 FIXME openbsd if (!(ifp->if_flags & IFF_RUNNING) || ifq_is_oactive(&ifp->if_snd)) + return; #else - if (!(ifp->if_flags & IFF_RUNNING) || (ifp->if_flags & IFF_OACTIVE)) -#endif + if (!(ifp->if_flags & IFF_RUNNING)) + { + DPRINTF(("%s: not in RUNNING state\n", __func__)); + return; + } + if (ifp->if_flags & IFF_OACTIVE) + { + DPRINTF(("%s: already active\n", __func__)); return; + } +#endif #if 0 FIXME openbsd if (ifq_empty(&ifp->if_snd)) #else if (IFQ_IS_EMPTY(&ifp->if_snd)) -#endif +#endif + { +#if 0 + DPRINTF(("%s: queue is empty\n", __func__)); +#endif return; + } /* * We cannot transmit packets until a VIO connection has been @@ -1294,15 +1523,22 @@ FIXME openbsd */ if (!ISSET(sc->sc_vio_state, VIO_RCV_RDX) || !ISSET(sc->sc_vio_state, VIO_ACK_RDX)) + { +#if 0 + DPRINTF(("%s: vio connection not established yet\n", __func__)); +#endif return; + } /* * Make sure there is room in the LDC transmit queue to send a * DRING_DATA message. */ err = hv_ldc_tx_get_state(lc->lc_id, &tx_head, &tx_tail, &tx_state); - if (err != H_EOK) + if (err != H_EOK) { + DPRINTF(("%s: no room in ldc transmit queue\n", __func__)); return; + } tx_tail += sizeof(struct ldc_pkt); tx_tail &= ((lc->lc_txq->lq_nentries * sizeof(struct ldc_pkt)) - 1); if (tx_tail == tx_head) { @@ -1311,11 +1547,15 @@ FIXME openbsd ifq_set_oactive(&ifp->if_snd); #else ifp->if_flags |= IFF_OACTIVE; -#endif - return; +#endif + { + DPRINTF(("%s: tail equals head\n", __func__)); + return; + } } if (sc->sc_xfer_mode == VIO_DESC_MODE) { + DPRINTF(("%s: vio_desc_mode\n", __func__)); vnet_start_desc(ifp); return; } @@ -1363,7 +1603,9 @@ FIXME openbsd * packet before we commit it to the wire. */ if (ifp->if_bpf) + { bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT); + } #endif pmap_extract(pmap_kernel(), (vaddr_t)buf, &pa); @@ -1408,11 +1650,17 @@ FIXME openbsd vnet_send_dring_data(sc, start); ifp->if_timer = 5; } +#if 0 + DPRINTF(("%s: exit\n", __func__)); +#endif } void vnet_start_desc(struct ifnet *ifp) { + + DPRINTF(("%s: entry\n", __func__)); + struct vnet_softc *sc = ifp->if_softc; struct ldc_map *map = sc->sc_lm; struct vnet_desc_msg dm; @@ -1516,7 +1764,9 @@ FIXME openbsd int vnet_ioctl(struct ifnet *ifp, u_long cmd, void* data) { - +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct vnet_softc *sc = ifp->if_softc; struct ifreq *ifr = (struct ifreq *)data; int s, error = 0; @@ -1534,7 +1784,7 @@ vnet_ioctl(struct ifnet *ifp, u_long cmd vnet_init(ifp); } else { if (ifp->if_flags & IFF_RUNNING) - vnet_stop(ifp); + vnet_stop(ifp, 0); } break; @@ -1568,6 +1818,9 @@ vnet_ioctl(struct ifnet *ifp, u_long cmd void vnet_watchdog(struct ifnet *ifp) { + + DPRINTF(("%s: entry\n", __func__)); + struct vnet_softc *sc = ifp->if_softc; printf("%s: watchdog timeout\n", sc->sc_dv.dv_xname); @@ -1576,13 +1829,18 @@ vnet_watchdog(struct ifnet *ifp) int vnet_media_change(struct ifnet *ifp) { - printf("vnet_media_change()\n"); + + DPRINTF(("%s: entry\n", __func__)); + return (0); } void vnet_media_status(struct ifnet *ifp, struct ifmediareq *imr) { + + DPRINTF(("%s: entry\n", __func__)); + imr->ifm_active = IFM_ETHER | IFM_AUTO; imr->ifm_status = IFM_AVALID; #if 0 @@ -1599,6 +1857,10 @@ void vnet_link_state(struct vnet_softc *sc) { #if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif + +#if 0 FIXME openbsd struct ifnet *ifp = &sc->sc_ac.ac_if; #else @@ -1640,6 +1902,9 @@ FIXME openbsd void vnet_setmulti(struct vnet_softc *sc, int set) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif struct ethercom *ec = &sc->sc_ethercom; struct ether_multi *enm; struct ether_multistep step; @@ -1690,23 +1955,25 @@ FIXME openbsd } -void +int vnet_init(struct ifnet *ifp) { - +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif + struct vnet_softc *sc = ifp->if_softc; struct ldc_conn *lc = &sc->sc_lc; int err; vaddr_t va; paddr_t pa; - #if OPENBSD_BUSDMA sc->sc_lm = ldc_map_alloc(sc->sc_dmatag, 2048); #else sc->sc_lm = ldc_map_alloc(2048); #endif if (sc->sc_lm == NULL) - return; + return ENOMEM; #if OPENBSD_BUSDMA err = hv_ldc_set_map_table(lc->lc_id, @@ -1720,23 +1987,35 @@ vnet_init(struct ifnet *ifp) #endif if (err != H_EOK) { printf("hv_ldc_set_map_table %d\n", err); - return; + return EINVAL; } sc->sc_vd = vnet_dring_alloc(sc->sc_dmatag, VNET_NUM_SOFT_DESC); if (sc->sc_vd == NULL) - return; + return ENOMEM; sc->sc_vsd = malloc(VNET_NUM_SOFT_DESC * sizeof(*sc->sc_vsd), M_DEVBUF, M_NOWAIT|M_ZERO); if (sc->sc_vsd == NULL) - return; + return ENOMEM; +#if OPENBSD_BUSDMA sc->sc_lm->lm_slot[0].entry = sc->sc_vd->vd_map->dm_segs[0].ds_addr; +#else + va = (vaddr_t)sc->sc_vd->vd_desc; + pa = 0; + if (pmap_extract(pmap_kernel(), va, &pa) == FALSE) + panic("pmap_extract failed %lx\n", va); + sc->sc_lm->lm_slot[0].entry = pa; +#endif sc->sc_lm->lm_slot[0].entry &= LDC_MTE_RA_MASK; sc->sc_lm->lm_slot[0].entry |= LDC_MTE_CPR | LDC_MTE_CPW; sc->sc_lm->lm_next = 1; sc->sc_lm->lm_count = 1; - + + va = lc->lc_txq->lq_va; + pa = 0; + if (pmap_extract(pmap_kernel(), va, &pa) == FALSE) + panic("pmap_extract failed %lx\n", va); #if OPENBSD_BUSDMA err = hv_ldc_tx_qconf(lc->lc_id, lc->lc_txq->lq_map->dm_segs[0].ds_addr, lc->lc_txq->lq_nentries); @@ -1745,6 +2024,11 @@ vnet_init(struct ifnet *ifp) #endif if (err != H_EOK) printf("hv_ldc_tx_qconf %d\n", err); + + va = (vaddr_t)lc->lc_rxq->lq_va; + pa = 0; + if (pmap_extract(pmap_kernel(), va, &pa) == FALSE) + panic("pmap_extract failed %lx\n", va); #if OPENBSD_BUSDMA err = hv_ldc_rx_qconf(lc->lc_id, @@ -1761,16 +2045,26 @@ vnet_init(struct ifnet *ifp) ldc_send_vers(lc); ifp->if_flags |= IFF_RUNNING; - + +#if 0 + DPRINTF(("%s: exit\n", __func__)); +#endif + return 0; } void -vnet_stop(struct ifnet *ifp) +vnet_stop(struct ifnet *ifp, int disable) { + + DPRINTF(("%s: entry\n", __func__)); + struct vnet_softc *sc = ifp->if_softc; struct ldc_conn *lc = &sc->sc_lc; + /* FIXME */ + printf("vnet_stop() disable %d\n", disable); + ifp->if_flags &= ~IFF_RUNNING; #if 0 FIXME openbsd @@ -1818,6 +2112,10 @@ FIXME openbsd struct vnet_dring * vnet_dring_alloc(bus_dma_tag_t t, int nentries) { +#if 0 + DPRINTF(("%s: entry\n", __func__)); +#endif + struct vnet_dring *vd; bus_size_t size; vaddr_t va; @@ -1872,6 +2170,9 @@ destroy: void vnet_dring_free(bus_dma_tag_t t, struct vnet_dring *vd) { + + DPRINTF(("%s: entry\n", __func__)); + bus_size_t size; size = vd->vd_nentries * sizeof(struct vnet_desc);