NetBSD-Bugs archive

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

Re: kern/50187: iwn0: frequency and channel mismatch



The following reply was made to PR kern/50187; it has been noted by GNATS.

From: NONAKA Kimihiro <nonakap%gmail.com@localhost>
To: "gnats-bugs%netbsd.org@localhost" <gnats-bugs%netbsd.org@localhost>
Cc: kern-bug-people%netbsd.org@localhost, 
	"gnats-admin%netbsd.org@localhost" <gnats-admin%netbsd.org@localhost>, "netbsd-bugs%netbsd.org@localhost" <netbsd-bugs%netbsd.org@localhost>
Subject: Re: kern/50187: iwn0: frequency and channel mismatch
Date: Tue, 22 Sep 2015 20:05:47 +0900

 Hi,
 
 iwn(4) can handle 5GHz channel by this patch.
 However, channel probably needs to be set manually.
 
 Please try it.
 probably
 diff --git a/sys/dev/pci/if_iwn.c b/sys/dev/pci/if_iwn.c
 index 7f5ca3d..04a4b06 100644
 --- a/sys/dev/pci/if_iwn.c
 +++ b/sys/dev/pci/if_iwn.cprobably
 @@ -330,7 +330,8 @@ static u_int8_t    *ieee80211_add_rates(u_int8_t *,
  static u_int8_t    *ieee80211_add_xrates(u_int8_t *,
      const struct ieee80211_rateset *);
 
 -static void    iwn_fix_channel(struct ieee80211com *, struct mbuf *);
 +static void    iwn_fix_channel(struct ieee80211com *, struct mbuf *,
 +            struct iwn_rx_stat *);
 
  #ifdef IWN_DEBUG
  #define DPRINTF(x)    do { if (iwn_debug > 0) printf x; } while (0)
 @@ -1866,7 +1867,7 @@ iwn_newstate(struct ieee80211com *ic, enum
 ieee80211_state nstate, int arg)
          /* XXX Not sure if call and flags are needed. */
          ieee80211_node_table_reset(&ic->ic_scan);
          ic->ic_flags |= IEEE80211_F_SCAN | IEEE80211_F_ASCAN;
 -        sc->sc_flags |= IWN_FLAG_SCANNING;
 +        sc->sc_flags |= IWN_FLAG_SCANNING_2GHZ;
 
          /* Make the link LED blink while we're scanning. */
          iwn_set_led(sc, IWN_LED_LINK, 10, 10);
 @@ -2089,7 +2090,7 @@ iwn_rx_done(struct iwn_softc *sc, struct
 iwn_rx_desc *desc,
 
      /* XXX Added for NetBSD: scans never stop without it */
      if (ic->ic_state == IEEE80211_S_SCAN)
 -        iwn_fix_channel(ic, m);
 +        iwn_fix_channel(ic, m, stat);
 
      if (sc->sc_drvbpf != NULL) {
          struct iwn_rx_radiotap_header *tap = &sc->sc_rxtap;
 @@ -2520,6 +2521,8 @@ iwn_notif_intr(struct iwn_softc *sc)
                   * We just finished scanning 2GHz channels,
                   * start scanning 5GHz ones.
                   */
 +                sc->sc_flags &= ~IWN_FLAG_SCANNING_2GHZ;
 +                sc->sc_flags |= IWN_FLAG_SCANNING_5GHZ;
                  if (iwn_scan(sc, IEEE80211_CHAN_5GHZ) == 0)
                      break;
              }
 @@ -6506,8 +6512,10 @@ ieee80211_add_xrates(u_int8_t *frm, const
 struct ieee80211_rateset *rs)
   * XXX: Duplicated from if_iwi.c
   */
  static void
 -iwn_fix_channel(struct ieee80211com *ic, struct mbuf *m)
 +iwn_fix_channel(struct ieee80211com *ic, struct mbuf *m,
 +    struct iwn_rx_stat *stat)
  {
 +    struct iwn_softc *sc = ic->ic_ifp->if_softc;
      struct ieee80211_frame *wh;
      uint8_t subtype;
      uint8_t *frm, *efrm;
 @@ -6523,6 +6531,13 @@ iwn_fix_channel(struct ieee80211com *ic, struct mbuf *m)
          subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP)
          return;
 
 +    if (sc->sc_flags & IWN_FLAG_SCANNING_5GHZ) {
 +        int chan = le16toh(stat->chan);
 +        if (chan < __arraycount(ic->ic_channels))
 +            ic->ic_curchan = &ic->ic_channels[chan];
 +        return;
 +    }
 +
      frm = (uint8_t *)(wh + 1);
      efrm = mtod(m, uint8_t *) + m->m_len;
 
 diff --git a/sys/dev/pci/if_iwnvar.h b/sys/dev/pci/if_iwnvar.h
 index d104c62..05989bb 100644
 --- a/sys/dev/pci/if_iwnvar.h
 +++ b/sys/dev/pci/if_iwnvar.h
 @@ -221,8 +221,10 @@ struct iwn_softc {
  #define IWN_FLAG_HAS_11N    (1 << 6)
  #define IWN_FLAG_ENH_SENS    (1 << 7)probably
  /* Added for NetBSD */
 -#define IWN_FLAG_SCANNING    (1 << 8)
 -#define IWN_FLAG_HW_INITED    (1 << 9)
 +#define IWN_FLAG_HW_INITED    (1 << 8)
 +#define IWN_FLAG_SCANNING_2GHZ    (1 << 9)
 +#define IWN_FLAG_SCANNING_5GHZ    (1 << 10)
 +#define IWN_FLAG_SCANNING    (IWN_FLAG_SCANNING_2GHZ|IWN_FLAG_SCANNING_5GHZ)
 
      uint8_t         hw_type;
 


Home | Main Index | Thread Index | Old Index