Author: avos
Date: Thu May 26 16:48:20 2016
New Revision: 300755
URL: https://svnweb.freebsd.org/changeset/base/300755

Log:
  bwi: switch to ieee80211_add_channel_list_2ghz().
  
  - Use device's channel list instead of default one (from
  ieee80211_init_channels()); adds 12 - 14 2GHz channels.
  - Add ic_getradiocaps() method.

Modified:
  head/sys/dev/bwi/if_bwi.c

Modified: head/sys/dev/bwi/if_bwi.c
==============================================================================
--- head/sys/dev/bwi/if_bwi.c   Thu May 26 16:39:11 2016        (r300754)
+++ head/sys/dev/bwi/if_bwi.c   Thu May 26 16:48:20 2016        (r300755)
@@ -110,6 +110,8 @@ static int  bwi_raw_xmit(struct ieee80211
                        const struct ieee80211_bpf_params *);
 static void    bwi_watchdog(void *);
 static void    bwi_scan_start(struct ieee80211com *);
+static void    bwi_getradiocaps(struct ieee80211com *, int, int *,
+                   struct ieee80211_channel[]);
 static void    bwi_set_channel(struct ieee80211com *);
 static void    bwi_scan_end(struct ieee80211com *);
 static int     bwi_newstate(struct ieee80211vap *, enum ieee80211_state, int);
@@ -303,6 +305,9 @@ static const struct {
        [108]   = { 7, 3 }
 };
 
+static const uint8_t bwi_chan_2ghz[] =
+       { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
+
 #ifdef BWI_DEBUG
 #ifdef BWI_DEBUG_VERBOSE
 static uint32_t bwi_debug = BWI_DBG_ATTACH | BWI_DBG_INIT | BWI_DBG_TXPOWER;
@@ -356,7 +361,6 @@ bwi_attach(struct bwi_softc *sc)
        device_t dev = sc->sc_dev;
        struct bwi_mac *mac;
        struct bwi_phy *phy;
-       uint8_t bands[IEEE80211_MODE_BYTES];
        int i, error;
 
        BWI_LOCK_INIT(sc);
@@ -453,15 +457,12 @@ bwi_attach(struct bwi_softc *sc)
        /*
         * Setup ratesets, phytype, channels and get MAC address
         */
-       memset(bands, 0, sizeof(bands));
        if (phy->phy_mode == IEEE80211_MODE_11B ||
            phy->phy_mode == IEEE80211_MODE_11G) {
-               setbit(bands, IEEE80211_MODE_11B);
                if (phy->phy_mode == IEEE80211_MODE_11B) {
                        ic->ic_phytype = IEEE80211_T_DS;
                } else {
                        ic->ic_phytype = IEEE80211_T_OFDM;
-                       setbit(bands, IEEE80211_MODE_11G);
                }
 
                bwi_get_eaddr(sc, BWI_SPROM_11BG_EADDR, ic->ic_macaddr);
@@ -475,7 +476,6 @@ bwi_attach(struct bwi_softc *sc)
                }
        } else if (phy->phy_mode == IEEE80211_MODE_11A) {
                /* TODO:11A */
-               setbit(bands, IEEE80211_MODE_11A);
                error = ENXIO;
                goto fail;
        } else {
@@ -487,7 +487,8 @@ bwi_attach(struct bwi_softc *sc)
                                   BWI_SPROM_CARD_INFO_LOCALE);
        DPRINTF(sc, BWI_DBG_ATTACH, "locale: %d\n", sc->sc_locale);
        /* XXX use locale */
-       ieee80211_init_channels(ic, NULL, bands);
+       bwi_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans,
+           ic->ic_channels);
 
        ic->ic_softc = sc;
        ic->ic_name = device_get_nameunit(dev);
@@ -509,6 +510,7 @@ bwi_attach(struct bwi_softc *sc)
        ic->ic_updateslot = bwi_updateslot;
        ic->ic_scan_start = bwi_scan_start;
        ic->ic_scan_end = bwi_scan_end;
+       ic->ic_getradiocaps = bwi_getradiocaps;
        ic->ic_set_channel = bwi_set_channel;
        ic->ic_transmit = bwi_transmit;
        ic->ic_parent = bwi_parent;
@@ -1676,6 +1678,43 @@ bwi_scan_start(struct ieee80211com *ic)
 }
 
 static void
+bwi_getradiocaps(struct ieee80211com *ic,
+    int maxchans, int *nchans, struct ieee80211_channel chans[])
+{
+       struct bwi_softc *sc = ic->ic_softc;
+       struct bwi_mac *mac;
+       struct bwi_phy *phy;
+       uint8_t bands[IEEE80211_MODE_BYTES];
+
+       /*
+        * XXX First MAC is known to exist
+        * TODO2
+        */
+       mac = &sc->sc_mac[0];
+       phy = &mac->mac_phy;
+
+       memset(bands, 0, sizeof(bands));
+       switch (phy->phy_mode) {
+       case IEEE80211_MODE_11G:
+               setbit(bands, IEEE80211_MODE_11G);
+               /* FALLTHROUGH */
+       case IEEE80211_MODE_11B:
+               setbit(bands, IEEE80211_MODE_11B);
+               break;
+       case IEEE80211_MODE_11A:
+               /* TODO:11A */
+               setbit(bands, IEEE80211_MODE_11A);
+               device_printf(sc->sc_dev, "no 11a support\n");
+               return;
+       default:
+               panic("unknown phymode %d\n", phy->phy_mode);
+       }
+
+       ieee80211_add_channel_list_2ghz(chans, maxchans, nchans,
+           bwi_chan_2ghz, nitems(bwi_chan_2ghz), bands, 0);
+}
+
+static void
 bwi_set_channel(struct ieee80211com *ic)
 {
        struct bwi_softc *sc = ic->ic_softc;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to