Seems to behave better now and hostap appears to be working ...

#ifconfig wlan0 create wlandev urtwn0 wlanmode hostap
#ifconfig wlan0 list caps
drivercaps=2181c401<STA,HOSTAP,SHSLOT,SHPREAMBLE,MONITOR,WPA1,WPA2,BGSCAN>

#ifconfig wlan0 up ssid freebsdap mode 11g channel 1
#ifconfig bridge0 create up addm em0 addm wlan0

#ifconfig wlan0
wlan0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:c3:e1:16:11:32
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap>
        status: running
        ssid freebsdap channel 1 (2412 MHz 11g) bssid 00:c3:e1:16:11:32
        country US authmode OPEN privacy OFF txpower 0 scanvalid 60
        protmode CTS dtimperiod 1 -dfs
        groups: wlan

#ifconfig bridge0
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 02:df:20:d2:42:00
        nd6 options=1<PERFORMNUD>
        groups: bridge
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: wlan0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 3 priority 128 path cost 370370
        member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 1 priority 128 path cost 20000

The speed leaves a lot to be desired. Throughput for the associated host is typically about 2Mbit down and 6Mbit up. I'm assume that's indicative of a problem. Occasionally I also see the this message on the console when I'm bringing the adapter up ...

wlan0: ieee80211_new_state_locked: pending INIT -> SCAN transition lost

If I down and up the adapter again, it seems to correct itself. Not sure what that's all about. I am passing the USB adapter through to a VM inside of ESXi to test the patch, so maybe that has something to do with these quirks. I'll try to run some tests with the adapter associated to a physical AP tomorrow to get a baseline.

Thanks,

-Matthew

On 9/16/2015 11:24 AM, Adrian Chadd wrote:
The only one to look at is ath(4). I've not fixed/hacked on any other
hostap chips. :)

if_ath_beacon.c has the logic - it gets a reference when creating a
beacon frame.



-adrian


On 16 September 2015 at 09:21, Matthew Grooms <mgro...@shrew.net> wrote:
On 9/16/2015 10:58 AM, Adrian Chadd wrote:
I think the net80211 beacon create routine doesn't allocate a node
ref. Yeah, it doesn't. You have to do ieee80211_ref_node() after
calling becaon_create(), and deref it if the tx fails. The TX success
will free the node ref for you.

Got it. I'll take another look at one of the drivers that support hostap to
make sure I'm following the same pattern. Thanks again for the feedback!

-Matthew


-adrian


On 16 September 2015 at 04:27, Idwer Vollering <vid...@gmail.com> wrote:
2015-09-16 8:06 GMT+02:00 Matthew Grooms <mgro...@shrew.net>:

It looks like my screenshot got scrubbed. Here is my hopefully faithful
transcription ...

Fatal trap 9: general protection fault while in kernel mode
cpuid = 3; apic id = 03
instruction pointer = 0x20:0xffffffff80a01105
stack pointer           = 0x28:0xfffffe0092fe86f0
frame pointer         = 0x28:0xfffffe0092fe8740
code segment         = base 0x0, limit 0xfffff, type 0x1b
                                   = DPL 0, pres 1, long 1, def32 0, gran
1
processor eflags     = interrupt enabled, resume, IOPL = 0
current process      = 716 (ifconfig)
[thread pid 716 tid 100082 ]
Stopped at      __mtx_lock_flags+0x55:  movq    (%r13),%rax
db> bt
Tracing pid 716 tid 100082 td 0xffffff800512814d0
__mtx_lock_flags() at __mtx_lock_flags+0x55/frame 0xfffffe0092fe8740
ieee80211_free_node() at ieee80211_free_node()_0x38/frame
0xfffffe0092fe8780
ieee80211_node_vdetach() at ieee80211_node_vdetach()+0x2d/frame
0xfffffe0092fe87a0
ieee80211_vap_detach() at ieee80211_vap_detach()+0x35e/frame
0xfffffe0092fe87d0
urtwn_vap_delete() at urtwn_vap_delete()+0xe/frame 0xfffffe0092fe87f0
if_clone_destroyif() at if_clone_destroyif()+0x1aa/frame
0xfffffe0092fe8840
if_clone_destroy() at if_clone_destroy()0x8e/frame 0xfffffe0092fe8860
kern_ioctl() at kern_ioctl()+0x230/frame 0xfffffe0092fe88c0
sys_ioctl() at sys_ioctl()+0x153/frame 0xfffffe0092fe89a0
amd64_syscall() at amd64_syscall()+0x282/frame 0xfffffe0092fe8ab0
Xfast_syscall() at Xfast_syscall()+0xfb/frame 0xfffffe0092fe8ab0
-- syscall (54, FreeBSD ELF64, sys_ioctl), rip = 0x8011e8c8a, rsp =
0x7fffffffe2f8, rbp = 0x7fffffffe310 --
db>
Assuming dumpdev="AUTO" is set in /etc/rc.conf, you should have
entered 'dump' at the db> blinker :)

The trap details are found in /var/crash/, run kgdb: "kgdb
/boot/kernel/kernel /var/crash/vmcore.last", then run 'bt' and 'up' at
its prompt.

-Matthew
_______________________________________________
freebsd-wireless@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-wireless
To unsubscribe, send any mail to
"freebsd-wireless-unsubscr...@freebsd.org"
_______________________________________________
freebsd-wireless@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-wireless
To unsubscribe, send any mail to
"freebsd-wireless-unsubscr...@freebsd.org"
_______________________________________________
freebsd-wireless@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-wireless
To unsubscribe, send any mail to
"freebsd-wireless-unsubscr...@freebsd.org"

_______________________________________________
freebsd-wireless@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-wireless
To unsubscribe, send any mail to "freebsd-wireless-unsubscr...@freebsd.org"

Index: sys/dev/usb/wlan/if_urtwn.c
===================================================================
--- sys/dev/usb/wlan/if_urtwn.c (revision 287342)
+++ sys/dev/usb/wlan/if_urtwn.c (working copy)
@@ -181,6 +181,8 @@
 static struct mbuf *   urtwn_rxeof(struct usb_xfer *, struct urtwn_data *,
                            int *, int8_t *);
 static void            urtwn_txeof(struct usb_xfer *, struct urtwn_data *);
+int                    urtwn_txbcn(struct ieee80211vap *vap,
+                           struct ieee80211_node *);
 static int             urtwn_alloc_list(struct urtwn_softc *,
                            struct urtwn_data[], int, int);
 static int             urtwn_alloc_rx_list(struct urtwn_softc *);
@@ -436,6 +438,10 @@
                | IEEE80211_C_WPA               /* 802.11i */
                ;
 
+       if (sc->chip & URTWN_CHIP_88E)
+               ic->ic_caps |=
+                   IEEE80211_C_HOSTAP;         /* HostAp mode supported */
+
        bands = 0;
        setbit(&bands, IEEE80211_MODE_11B);
        setbit(&bands, IEEE80211_MODE_11G);
@@ -857,6 +863,39 @@
        sc->sc_txtimer = 0;
 }
 
+/*
+ * Push a beacon frame into the chip and check if it was accepted.  Beacon will
+ * be repeated by the chip every R92C_BCN_INTERVAL.
+ */
+int
+urtwn_txbcn(struct ieee80211vap *vap, struct ieee80211_node *ni)
+{
+       struct ieee80211com *ic = ni->ni_ic;
+       struct urtwn_softc *sc = ic->ic_softc;
+       struct urtwn_data *bf;
+       struct mbuf *m;
+
+       ieee80211_ref_node(ni);
+       m = ieee80211_beacon_alloc(ni, &URTWN_VAP(vap)->bo);
+
+       bf = urtwn_getbuf(sc);
+       if (bf == NULL) {
+               ieee80211_free_node(ni);
+               m_freem(m);
+               return (ENOBUFS);
+       }
+
+       if (urtwn_tx_start(sc, ni, m, bf) != 0) {
+               ieee80211_free_node(ni);
+               STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
+               return (EIO);
+       }
+
+       sc->sc_txtimer = 5;
+
+       return (0);
+}
+
 static void
 urtwn_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error)
 {
@@ -1466,6 +1505,7 @@
        struct ieee80211_node *ni;
        enum ieee80211_state ostate;
        uint32_t reg;
+       int error;
 
        ostate = vap->iv_state;
        DPRINTF("%s -> %s\n", ieee80211_state_name[ostate],
@@ -1553,23 +1593,68 @@
                }
 
                ni = ieee80211_ref_node(vap->iv_bss);
-               /* Set media status to 'Associated'. */
-               reg = urtwn_read_4(sc, R92C_CR);
-               reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_INFRA);
-               urtwn_write_4(sc, R92C_CR, reg);
 
-               /* Set BSSID. */
-               urtwn_write_4(sc, R92C_BSSID + 0, LE_READ_4(&ni->ni_bssid[0]));
-               urtwn_write_4(sc, R92C_BSSID + 4, LE_READ_2(&ni->ni_bssid[4]));
+               if (ic->ic_opmode == IEEE80211_M_STA) {
+                       /* Set BSSID. */
+                       urtwn_write_4(sc, R92C_BSSID + 0,
+                               LE_READ_4(&ni->ni_bssid[0]));
+                       urtwn_write_4(sc, R92C_BSSID + 4,
+                               LE_READ_2(&ni->ni_bssid[4]));
 
-               if (ic->ic_curmode == IEEE80211_MODE_11B)
-                       urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0);
-               else    /* 802.11b/g */
-                       urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 3);
+                       if (ic->ic_curmode == IEEE80211_MODE_11B)
+                               urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0);
+                       else    /* 802.11b/g */
+                               urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 3);
 
-               /* Enable Rx of data frames. */
-               urtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff);
+                       /* Enable Rx of data frames. */
+                       urtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff);
 
+                       /* Allow Rx from our BSSID only. */
+                       urtwn_write_4(sc, R92C_RCR, urtwn_read_4(sc, R92C_RCR) |
+                           R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN);
+
+                       /* Set media status to 'Associated'. */
+                       reg = urtwn_read_4(sc, R92C_CR);
+                       reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_INFRA);
+                       urtwn_write_4(sc, R92C_CR, reg);
+               }
+
+               if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
+                       /* Set media status to 'AP'. */
+                       reg = urtwn_read_4(sc, R92C_CR);
+                       reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_AP);
+                       urtwn_write_4(sc, R92C_CR, reg);
+
+                       /* Set BSSID. */
+                       urtwn_write_4(sc, R92C_BSSID + 0,
+                           LE_READ_4(&ni->ni_bssid[0]));
+                       urtwn_write_4(sc, R92C_BSSID + 4,
+                           LE_READ_2(&ni->ni_bssid[4]));
+
+                       /*
+                        * If 3rd or 4th bits are set to zero chip will stop
+                        * repeating beacon after first transmission for port0
+                        * and port1 respectively. This will cause STAs to
+                        * disconnect after short period of time.
+                        */
+                       reg = urtwn_read_1(sc, R92C_MBID_NUM);
+                       reg |= 0x8;
+                       reg |= 0x10;
+                       urtwn_write_1(sc, R92C_MBID_NUM, reg);
+
+                       /* Invalidate cam entries */
+                       urtwn_cam_init(sc);
+
+                       /* Set chan/bw */
+                       urtwn_set_chan(sc, ic->ic_curchan, NULL);
+
+                       /* Push beacon frame into the chip */
+                       error = urtwn_txbcn(vap, ni);
+                       if (error != 0)
+                               printf("%s: unable to push beacon into the"
+                                   " chip\n", device_get_nameunit(sc->sc_dev));
+               }
+
                /* Flush all AC queues. */
                urtwn_write_1(sc, R92C_TXPAUSE, 0);
 
@@ -1576,11 +1661,6 @@
                /* Set beacon interval. */
                urtwn_write_2(sc, R92C_BCN_INTERVAL, ni->ni_intval);
 
-               /* Allow Rx from our BSSID only. */
-               urtwn_write_4(sc, R92C_RCR,
-                   urtwn_read_4(sc, R92C_RCR) |
-                   R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN);
-
                /* Enable TSF synchronization. */
                urtwn_tsf_sync_enable(sc);
 
@@ -1754,7 +1834,7 @@
        struct ieee80211vap *vap = ni->ni_vap;
        struct usb_xfer *xfer;
        struct r92c_tx_desc *txd;
-       uint8_t raid, type;
+       uint8_t raid, type, subtype;
        uint16_t sum;
        int i, hasqos, xferlen;
        struct usb_xfer *urtwn_pipes[4] = {
@@ -1771,6 +1851,7 @@
         */
        wh = mtod(m0, struct ieee80211_frame *);
        type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
+       subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
 
        if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
                k = ieee80211_crypto_encap(ni, m0);
@@ -1819,7 +1900,7 @@
                if (sc->chip & URTWN_CHIP_88E) {
                        txd->txdw1 |= htole32(
                            SM(R88E_TXDW1_MACID, URTWN_MACID_BSS) |
-                           SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_BE) |
+                           SM(R92C_TXDW1_QSEL, R88E_TXDW1_QSEL_BE) |
                            SM(R92C_TXDW1_RAID, raid));
                        txd->txdw2 |= htole32(R88E_TXDW2_AGGBK);
                } else {
@@ -1843,9 +1924,20 @@
                /* Send data at OFDM54. */
                txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, 11));
        } else {
+               /*
+                * If beacon frame is pushed into wrong queue, the chip won't
+                * start repeating it.
+                */
+               if (subtype == IEEE80211_FC0_SUBTYPE_BEACON &&
+                   sc->chip & URTWN_CHIP_88E)
+                       txd->txdw1 |= htole32(SM(R92C_TXDW1_QSEL,
+                           R88E_TXDW1_QSEL_MGNT));
+               else
+                       txd->txdw1 |= htole32(SM(R92C_TXDW1_QSEL,
+                           R92C_TXDW1_QSEL_MGNT));
+
                txd->txdw1 |= htole32(
                    SM(R92C_TXDW1_MACID, 0) |
-                   SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_MGNT) |
                    SM(R92C_TXDW1_RAID, R92C_RAID_11B));
 
                /* Force CCK1. */
Index: sys/dev/usb/wlan/if_urtwnreg.h
===================================================================
--- sys/dev/usb/wlan/if_urtwnreg.h      (revision 287342)
+++ sys/dev/usb/wlan/if_urtwnreg.h      (working copy)
@@ -1019,7 +1019,9 @@
 #define R92C_TXDW1_QSEL_M      0x00001f00
 #define R92C_TXDW1_QSEL_S      8
 #define R92C_TXDW1_QSEL_BE     0x00
+#define R88E_TXDW1_QSEL_BE     0x03
 #define R92C_TXDW1_QSEL_MGNT   0x12
+#define R88E_TXDW1_QSEL_MGNT   0x10
 #define R92C_TXDW1_RAID_M      0x000f0000
 #define R92C_TXDW1_RAID_S      16
 #define R92C_TXDW1_CIPHER_M    0x00c00000
_______________________________________________
freebsd-wireless@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-wireless
To unsubscribe, send any mail to "freebsd-wireless-unsubscr...@freebsd.org"

Reply via email to