Module Name: src Committed By: christos Date: Mon Jan 28 23:46:33 UTC 2013
Modified Files: src/sys/dev/usb: if_urtwn.c if_urtwnreg.h Log Message: make monitor mode work. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/dev/usb/if_urtwn.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/usb/if_urtwnreg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/if_urtwn.c diff -u src/sys/dev/usb/if_urtwn.c:1.18 src/sys/dev/usb/if_urtwn.c:1.19 --- src/sys/dev/usb/if_urtwn.c:1.18 Tue Jan 22 07:40:43 2013 +++ src/sys/dev/usb/if_urtwn.c Mon Jan 28 18:46:33 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: if_urtwn.c,v 1.18 2013/01/22 12:40:43 jmcneill Exp $ */ +/* $NetBSD: if_urtwn.c,v 1.19 2013/01/28 23:46:33 christos Exp $ */ /* $OpenBSD: if_urtwn.c,v 1.20 2011/11/26 06:39:33 ckuethe Exp $ */ /*- @@ -22,7 +22,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.18 2013/01/22 12:40:43 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.19 2013/01/28 23:46:33 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -1696,9 +1696,22 @@ urtwn_newstate_cb(struct urtwn_softc *sc urtwn_set_chan(sc, ic->ic_curchan, IEEE80211_HTINFO_2NDCHAN_NONE); + /* Set media status to 'No Link'. */ + urtwn_set_nettype0_msr(sc, R92C_CR_NETTYPE_NOLINK); + /* Enable Rx of data frames. */ urtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff); + /* Allow Rx from any BSSID. */ + urtwn_write_4(sc, R92C_RCR, + urtwn_read_4(sc, R92C_RCR) & + ~(R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN)); + + /* Accept Rx data/control/management frames */ + urtwn_write_4(sc, R92C_RCR, + urtwn_read_4(sc, R92C_RCR) | + R92C_RCR_ADF | R92C_RCR_ACF | R92C_RCR_AMF); + /* Turn link LED on. */ urtwn_set_led(sc, URTWN_LED_LINK, 1); break; @@ -1918,6 +1931,10 @@ urtwn_rx_frame(struct urtwn_softc *sc, u ifp->if_ierrors++; return; } + /* + * XXX: This will drop most control packets. Do we really + * want this in IEEE80211_M_MONITOR mode? + */ if (__predict_false(pktlen < (int)sizeof(*wh))) { DPRINTFN(DBG_RX, ("%s: %s: packet too short %d\n", device_xname(sc->sc_dev), __func__, pktlen)); @@ -1974,7 +1991,7 @@ urtwn_rx_frame(struct urtwn_softc *sc, u if (__predict_false(sc->sc_drvbpf != NULL)) { struct urtwn_rx_radiotap_header *tap = &sc->sc_rxtap; - tap->wr_flags = IEEE80211_RADIOTAP_F_FCS; + tap->wr_flags = 0; if (!(rxdw3 & R92C_RXDW3_HT)) { switch (rate) { /* CCK. */ @@ -2064,6 +2081,7 @@ urtwn_rxeof(usbd_xfer_handle xfer, usbd_ if (__predict_false(pktlen == 0)) { DPRINTFN(DBG_RX, ("%s: %s: pktlen is 0 byte\n", device_xname(sc->sc_dev), __func__)); + break; } infosz = MS(rxdw0, R92C_RXDW0_INFOSZ) * 8; @@ -2165,6 +2183,8 @@ urtwn_tx(struct urtwn_softc *sc, struct if (wh->i_fc[1] & IEEE80211_FC1_WEP) tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; + /* XXX: set tap->wt_rate? */ + bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m); } @@ -3655,8 +3675,6 @@ urtwn_init(struct ifnet *ifp) } urtwn_write_4(sc, R92C_CR, reg); - urtwn_rxfilter_init(sc); - /* Set response rate */ reg = urtwn_read_4(sc, R92C_RRSR); reg = RW(reg, R92C_RRSR_RATE_BITMAP, R92C_RRSR_RATE_CCK_ONLY_1M); @@ -3721,9 +3739,13 @@ urtwn_init(struct ifnet *ifp) SET(sc->sc_flags, URTWN_FLAG_FWREADY); /* Initialize MAC/BB/RF blocks. */ - urtwn_mac_init(sc); - urtwn_write_4(sc, R92C_RCR, - urtwn_read_4(sc, R92C_RCR) & ~R92C_RCR_ADF); + /* + * XXX: urtwn_mac_init() sets R92C_RCR[0:15] = R92C_RCR_APM | + * R92C_RCR_AM | R92C_RCR_AB | R92C_RCR_AICV | R92C_RCR_AMF. + * XXX: This setting should be removed from rtl8192cu_mac[]. + */ + urtwn_mac_init(sc); // sets R92C_RCR[0:15] + urtwn_rxfilter_init(sc); // reset R92C_RCR urtwn_bb_init(sc); urtwn_rf_init(sc); Index: src/sys/dev/usb/if_urtwnreg.h diff -u src/sys/dev/usb/if_urtwnreg.h:1.2 src/sys/dev/usb/if_urtwnreg.h:1.3 --- src/sys/dev/usb/if_urtwnreg.h:1.2 Sun Jan 20 15:21:57 2013 +++ src/sys/dev/usb/if_urtwnreg.h Mon Jan 28 18:46:33 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: if_urtwnreg.h,v 1.2 2013/01/20 20:21:57 christos Exp $ */ +/* $NetBSD: if_urtwnreg.h,v 1.3 2013/01/28 23:46:33 christos Exp $ */ /* $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $ */ /*- @@ -190,23 +190,48 @@ /* WMAC Configuration. */ #define R92C_APSD_CTRL 0x600 #define R92C_BWOPMODE 0x603 +#define R92C_TCR 0x604 #define R92C_RCR 0x608 +#define R92C_RX_PKT_LIMIT 0x60c +#define R92C_RX_DLK_TIME 0x60d #define R92C_RX_DRVINFO_SZ 0x60f #define R92C_MACID 0x610 #define R92C_BSSID 0x618 #define R92C_MAR 0x620 +#define R92C_MBIDCAMCFG 0x628 +#define R92C_USTIME_EDCA 0x638 #define R92C_MAC_SPEC_SIFS 0x63a #define R92C_R2T_SIFS 0x63c #define R92C_T2T_SIFS 0x63e #define R92C_ACKTO 0x640 +#define R92C_CTS2TO 0x641 +#define R92C_EIFS 0x642 +#define R92C_NAV_CTRL 0x650 +#define R92C_BACAMCMD 0x654 +#define R92C_BACAMCONTENT 0x658 +#define R92C_LBDLY 0x660 +#define R92C_FWDLY 0x661 +#define R92C_RXERR_RPT 0x664 +#define R92C_WMAC_TRXPTCL_CTL 0x668 #define R92C_CAMCMD 0x670 #define R92C_CAMWRITE 0x674 #define R92C_CAMREAD 0x678 #define R92C_CAMDBG 0x67c #define R92C_SECCFG 0x680 +#define R92C_WOW_CTRL 0x690 +#define R92C_PSSTATUS 0x691 +#define R92C_PS_RX_INFO 0x692 +#define R92C_LPNAV_CTRL 0x694 +#define R92C_WKFMCAM_CMD 0x698 +#define R92C_WKFMCAM_RWD 0x69c #define R92C_RXFLTMAP0 0x6a0 #define R92C_RXFLTMAP1 0x6a2 #define R92C_RXFLTMAP2 0x6a4 +#define R92C_BCN_PSR_RPT 0x6a8 +#define R92C_CALB32K_CTRL 0x6ac +#define R92C_PKT_MON_CTRL 0x6b4 +#define R92C_BT_COEX_TABLE 0x6c0 +#define R92C_WMAC_RESP_TXINFO 0x6d8 /* Bits for R92C_SYS_ISO_CTRL. */ #define R92C_SYS_ISO_CTRL_MD2PP 0x0001 @@ -468,28 +493,28 @@ #define R92C_BWOPMODE_20MHZ 0x04 /* Bits for R92C_RCR. */ -#define R92C_RCR_AAP 0x00000001 -#define R92C_RCR_APM 0x00000002 -#define R92C_RCR_AM 0x00000004 -#define R92C_RCR_AB 0x00000008 -#define R92C_RCR_ADD3 0x00000010 -#define R92C_RCR_APWRMGT 0x00000020 -#define R92C_RCR_CBSSID_DATA 0x00000040 -#define R92C_RCR_CBSSID_BCN 0x00000080 -#define R92C_RCR_ACRC32 0x00000100 -#define R92C_RCR_AICV 0x00000200 -#define R92C_RCR_ADF 0x00000800 -#define R92C_RCR_ACF 0x00001000 -#define R92C_RCR_AMF 0x00002000 -#define R92C_RCR_HTC_LOC_CTRL 0x00004000 +#define R92C_RCR_AAP 0x00000001 // Accept all unicast packet +#define R92C_RCR_APM 0x00000002 // Accept physical match packet +#define R92C_RCR_AM 0x00000004 // Accept multicast packet +#define R92C_RCR_AB 0x00000008 // Accept broadcast packet +#define R92C_RCR_ADD3 0x00000010 // Accept address 3 match packet +#define R92C_RCR_APWRMGT 0x00000020 // Accept power management packet +#define R92C_RCR_CBSSID_DATA 0x00000040 // Accept BSSID match packet (Data) +#define R92C_RCR_CBSSID_BCN 0x00000080 // Accept BSSID match packet (Rx beacon, probe rsp) +#define R92C_RCR_ACRC32 0x00000100 // Accept CRC32 error packet +#define R92C_RCR_AICV 0x00000200 // Accept ICV error packet +#define R92C_RCR_ADF 0x00000800 // Accept data type frame +#define R92C_RCR_ACF 0x00001000 // Accept control type frame +#define R92C_RCR_AMF 0x00002000 // Accept management type frame +#define R92C_RCR_HTC_LOC_CTRL 0x00004000 // MFC<--HTC=1 MFC-->HTC=0 #define R92C_RCR_MFBEN 0x00400000 #define R92C_RCR_LSIGEN 0x00800000 -#define R92C_RCR_ENMBID 0x01000000 -#define R92C_RCR_APP_BA_SSN 0x08000000 +#define R92C_RCR_ENMBID 0x01000000 // Enable Multiple BssId. +#define R92C_RCR_APP_BA_SSN 0x08000000 // Accept BA SSN #define R92C_RCR_APP_PHYSTS 0x10000000 #define R92C_RCR_APP_ICV 0x20000000 #define R92C_RCR_APP_MIC 0x40000000 -#define R92C_RCR_APPFCS 0x80000000 +#define R92C_RCR_APPFCS 0x80000000 // WMAC append FCS after payload /* Bits for R92C_CAMCMD. */ #define R92C_CAMCMD_ADDR_M 0x0000ffff @@ -660,11 +685,11 @@ #define R92C_OFDM0_AGCCORE1_GAIN_M 0x0000007f #define R92C_OFDM0_AGCCORE1_GAIN_S 0 - /* * USB registers. */ #define R92C_USB_INFO 0xfe17 +#define R92C_TEST_USB_TXQS 0xfe48 #define R92C_USB_SPECIAL_OPTION 0xfe55 #define R92C_USB_HCPWM 0xfe57 #define R92C_USB_HRPWM 0xfe58 @@ -675,7 +700,7 @@ #define R92C_USB_PID 0xfe62 #define R92C_USB_OPTIONAL 0xfe64 #define R92C_USB_EP 0xfe65 -#define R92C_USB_PHY 0xfe68 +#define R92C_USB_PHY 0xfe68 /* XXX: linux-3.7.4(rtlwifi/rtl8192ce/reg.h) has 0xfe66 */ #define R92C_USB_MAC_ADDR 0xfe70 #define R92C_USB_STRING 0xfe80 @@ -1011,4 +1036,3 @@ struct r92c_tx_desc { uint16_t txdsum; uint16_t pad; } __packed __aligned(4); -