From 09a493cb3159d48ff7266b56e6875e37cdf0646d Mon Sep 17 00:00:00 2001 From: harti Date: Thu, 7 Aug 2003 14:30:58 +0000 Subject: Make open channels persist across ifconfig down and up. All channels that are not currently closing when the interface is configured down will be brough up as soon as the interface is configured up. --- sys/dev/patm/if_patm.c | 20 ++++++++++++++------ sys/dev/patm/if_patm_ioctl.c | 37 ++++++++++++++++++++++--------------- sys/dev/patm/if_patmvar.h | 4 ++++ 3 files changed, 40 insertions(+), 21 deletions(-) (limited to 'sys/dev/patm') diff --git a/sys/dev/patm/if_patm.c b/sys/dev/patm/if_patm.c index cc2db4a..6d97061 100644 --- a/sys/dev/patm/if_patm.c +++ b/sys/dev/patm/if_patm.c @@ -211,6 +211,10 @@ patm_initialize(struct patm_softc *sc) IDT_CFG_TXUIE | IDT_CFG_TXSFI | IDT_CFG_PHYIE; patm_nor_write(sc, IDT_NOR_CFG, cfg); + for (i = 0; i < sc->mmap->max_conn; i++) + if (sc->vccs[i] != NULL) + patm_load_vc(sc, sc->vccs[i], 1); + ATMEV_SEND_IFSTATE_CHANGED(&sc->ifatm, sc->utopia.carrier == UTP_CARR_OK); } @@ -284,17 +288,21 @@ patm_stop(struct patm_softc *sc) /* freeing partial receive chains and reset vcc state */ for (i = 0; i < sc->mmap->max_conn; i++) { if (sc->vccs[i] != NULL) { - if (sc->vccs[i]->chain != NULL) + if (sc->vccs[i]->chain != NULL) { m_freem(sc->vccs[i]->chain); + sc->vccs[i]->chain = NULL; + sc->vccs[i]->last = NULL; + } - if (sc->vccs[i]->vcc.flags & ATMIO_FLAG_NG) { + if (sc->vccs[i]->vflags & (PATM_VCC_RX_CLOSING | + PATM_VCC_TX_CLOSING)) { uma_zfree(sc->vcc_zone, sc->vccs[i]); sc->vccs[i] = NULL; } else { - /* keep HARP and NG */ - sc->vccs[i]->chain = NULL; - sc->vccs[i]->last = NULL; - sc->vccs[i]->vflags = 0; + /* keep */ + sc->vccs[i]->vflags &= ~PATM_VCC_OPEN; + sc->vccs[i]->cps = 0; + sc->vccs[i]->scd = NULL; } } } diff --git a/sys/dev/patm/if_patm_ioctl.c b/sys/dev/patm/if_patm_ioctl.c index bbabf97..d5e7c152 100644 --- a/sys/dev/patm/if_patm_ioctl.c +++ b/sys/dev/patm/if_patm_ioctl.c @@ -171,24 +171,10 @@ patm_open_vcc(struct patm_softc *sc, struct atmio_openvcc *arg) /* ok - go ahead */ sc->vccs[cid] = vcc; - - patm_debug(sc, VCC, "Open VCC: opening"); - if (!(vcc->vcc.flags & ATMIO_FLAG_NOTX)) - patm_tx_vcc_open(sc, vcc); - if (!(vcc->vcc.flags & ATMIO_FLAG_NORX)) - patm_rx_vcc_open(sc, vcc); - - /* inform management about non-NG and NG-PVCs */ - if (!(vcc->vcc.flags & ATMIO_FLAG_NG) || - (vcc->vcc.flags & ATMIO_FLAG_PVC)) - ATMEV_SEND_VCC_CHANGED(&sc->ifatm, vcc->vcc.vpi, - vcc->vcc.vci, 1); - - patm_debug(sc, VCC, "Open VCC: now open"); + patm_load_vc(sc, vcc, 0); /* don't free below */ vcc = NULL; - sc->vccs_open++; /* done */ @@ -199,6 +185,27 @@ patm_open_vcc(struct patm_softc *sc, struct atmio_openvcc *arg) return (error); } +void +patm_load_vc(struct patm_softc *sc, struct patm_vcc *vcc, int reload) +{ + + patm_debug(sc, VCC, "Open VCC: opening"); + if (!(vcc->vcc.flags & ATMIO_FLAG_NOTX)) + patm_tx_vcc_open(sc, vcc); + if (!(vcc->vcc.flags & ATMIO_FLAG_NORX)) + patm_rx_vcc_open(sc, vcc); + + if (!reload) { + /* inform management about non-NG and NG-PVCs */ + if (!(vcc->vcc.flags & ATMIO_FLAG_NG) || + (vcc->vcc.flags & ATMIO_FLAG_PVC)) + ATMEV_SEND_VCC_CHANGED(&sc->ifatm, vcc->vcc.vpi, + vcc->vcc.vci, 1); + } + + patm_debug(sc, VCC, "Open VCC: now open"); +} + /* * Try to close the given VCC */ diff --git a/sys/dev/patm/if_patmvar.h b/sys/dev/patm/if_patmvar.h index 5a350ed..f26cf17 100644 --- a/sys/dev/patm/if_patmvar.h +++ b/sys/dev/patm/if_patmvar.h @@ -196,6 +196,7 @@ struct patm_vcc { uint32_t opackets; /* packets sent */ uint64_t ibytes; /* bytes received */ uint64_t obytes; /* bytes sent */ + struct mbuf *chain; /* currently received chain */ struct mbuf *last; /* end of chain */ u_int cid; /* index */ @@ -382,6 +383,9 @@ void patm_intr(void *); /* check RSQ */ void patm_intr_rsq(struct patm_softc *sc); +/* enable the vcc */ +void patm_load_vc(struct patm_softc *sc, struct patm_vcc *vcc, int reload); + /* close the given vcc for transmission */ void patm_tx_vcc_close(struct patm_softc *, struct patm_vcc *); -- cgit v1.1