Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src-draft/trunk]: src/sys/dev/pci Refactor vap_create, vap_delete and iwn ne...



details:   https://anonhg.NetBSD.org/src-all/rev/b2d711f18cb5
branches:  trunk
changeset: 369391:b2d711f18cb5
user:      Nathanial Sloss <nat%netbsd.org@localhost>
date:      Sun Aug 07 20:10:43 2022 +1000

description:
Refactor vap_create, vap_delete and iwn newstate.

Make these functions in line with other drivers.
Also in this dont allow overriding of ifp->if_start and friends.

diffstat:

 sys/dev/pci/if_iwn.c    |  51 +++++++++++++++++++++++-------------------------
 sys/dev/pci/if_iwnvar.h |   2 -
 2 files changed, 24 insertions(+), 29 deletions(-)

diffs (123 lines):

diff -r 055aad2b5d77 -r b2d711f18cb5 sys/dev/pci/if_iwn.c
--- a/sys/dev/pci/if_iwn.c      Fri Aug 05 23:32:36 2022 +1000
+++ b/sys/dev/pci/if_iwn.c      Sun Aug 07 20:10:43 2022 +1000
@@ -438,6 +438,15 @@
 #define DPRINTFN(n, x)
 #endif
 
+/*
+ * We ovveride the VAP's newstate method, so need to save the old
+ * function pointer for each VAP.
+ */
+struct iwn_vap {
+       struct ieee80211vap vap;
+       int (*newstate)(struct ieee80211vap *, enum ieee80211_state, int);
+};
+
 CFATTACH_DECL_NEW(iwn, sizeof(struct iwn_softc), iwn_match, iwn_attach,
        iwn_detach, NULL);
 
@@ -834,16 +843,12 @@
 static void
 iwn_vap_delete(struct ieee80211vap *vap)
 {
-       struct ifnet *ifp = vap->iv_ifp;
-       struct iwn_softc *sc __unused =vap->iv_ic->ic_softc;
+       struct iwn_vap *my_vap = (struct iwn_vap *)vap;
 
        DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
 
-       iwn_stop(ifp, 0);
-       ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
-       bpf_detach(ifp);
-       if_detach(ifp);
-       kmem_free(vap, sizeof(struct ieee80211vap));
+       ieee80211_vap_detach(vap);
+       kmem_free(my_vap, sizeof(*my_vap));
 }
 
 static int
@@ -989,9 +994,7 @@
     const uint8_t bssid[IEEE80211_ADDR_LEN],
     const uint8_t macaddr[IEEE80211_ADDR_LEN])
 {
-       struct iwn_softc *sc = ic->ic_softc;
-       struct ieee80211vap *vap;
-       struct ifnet *ifp;
+       struct iwn_vap *vap;
 
        DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
 
@@ -1001,33 +1004,27 @@
 
        /* Allocate the vap and setup. */
        vap = kmem_zalloc(sizeof(struct ieee80211vap), KM_SLEEP);
-       if (ieee80211_vap_setup(ic, vap, name, unit, opmode,
+       if (ieee80211_vap_setup(ic, &vap->vap, name, unit, opmode,
            flags | IEEE80211_CLONE_NOBEACONS, bssid) != 0) {
                kmem_free(vap, sizeof(struct ieee80211vap));
                return NULL;
        }
 
        /* Local setup */
-       vap->iv_reset = iwn_reset;
-
-       ifp = vap->iv_ifp;
-       //ifp->if_init = iwn_init;
-       //ifp->if_ioctl = iwn_ioctl;
-       ifp->if_start = iwn_start;
-       // ifp->if_watchdog = i_watchdog;  NNN
-       ifp->if_extflags |= IFEF_MPSAFE;
+       vap->vap.iv_reset = iwn_reset;
 
        /* Finish setup */
-       ieee80211_vap_attach(vap, iwn_media_change,
+       ieee80211_vap_attach(&vap->vap, iwn_media_change,
            ieee80211_media_status, macaddr);
 
        /* Override state transition machine. */
        /* NNN --- many possible newstate machines ... issue! */
-       sc->sc_newstate = vap->iv_newstate;
-       vap->iv_newstate = iwn_newstate;
-
-       ieee80211_init(ifp);
-       return vap;
+       vap->newstate = vap->vap.iv_newstate;
+       vap->vap.iv_newstate = iwn_newstate;
+
+       ic->ic_opmode = opmode;
+
+       return &vap->vap;
 }
 
 static int
@@ -2231,6 +2228,7 @@
 static int
 iwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
 {
+       struct iwn_vap *my_vap = (struct iwn_vap*)vap;
        struct ieee80211com *ic = vap->iv_ic;
        struct iwn_softc *sc = ic->ic_softc;
        struct ifnet *ifp = vap->iv_ifp;
@@ -2338,8 +2336,7 @@
                break;
        }
 
-       error = (*sc->sc_newstate)(vap, nstate, arg);
-       return error;
+       return (*my_vap->newstate)(vap, nstate, arg);
 }
 
 static void __unused
diff -r 055aad2b5d77 -r b2d711f18cb5 sys/dev/pci/if_iwnvar.h
--- a/sys/dev/pci/if_iwnvar.h   Fri Aug 05 23:32:36 2022 +1000
+++ b/sys/dev/pci/if_iwnvar.h   Sun Aug 07 20:10:43 2022 +1000
@@ -201,8 +201,6 @@
 
        struct ethercom         sc_ec;
        struct ieee80211com     sc_ic;
-       int                     (*sc_newstate)(struct ieee80211vap *,
-                                   enum ieee80211_state, int);
 
        struct ieee80211_amrr   amrr;
        uint8_t                 fixed_ridx;



Home | Main Index | Thread Index | Old Index