]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
Use the H2C endpoint for sending firmware commands, rather than the voice
authoradrian <adrian@FreeBSD.org>
Thu, 17 Sep 2015 03:19:09 +0000 (03:19 +0000)
committeradrian <adrian@FreeBSD.org>
Thu, 17 Sep 2015 03:19:09 +0000 (03:19 +0000)
data queues.

This is similar to the openbsd and rtlwifi/r92su drivers.

Note: this driver still assumes it's a 4-endpoint device; I'll enforce
that in a follow-up commit.

sys/dev/usb/wlan/if_rsu.c
sys/dev/usb/wlan/if_rsureg.h

index 18e5b679d12325a6a4c3aaef770bce4b1ac1bbbd..34a38c1ec3794b6e81079614540dfe2a92e43a8f 100644 (file)
@@ -151,6 +151,7 @@ static device_attach_t  rsu_attach;
 static device_detach_t  rsu_detach;
 static usb_callback_t   rsu_bulk_tx_callback_be_bk;
 static usb_callback_t   rsu_bulk_tx_callback_vi_vo;
+static usb_callback_t   rsu_bulk_tx_callback_h2c;
 static usb_callback_t   rsu_bulk_rx_callback;
 static usb_error_t     rsu_do_request(struct rsu_softc *,
                            struct usb_device_request *, void *);
@@ -245,6 +246,9 @@ static uint8_t rsu_wme_ac_xfer_map[4] = {
        [WME_AC_VO] = RSU_BULK_TX_VI_VO,
 };
 
+/* XXX hard-coded */
+#define        RSU_H2C_ENDPOINT        3
+
 static const struct usb_config rsu_config[RSU_N_TRANSFER] = {
        [RSU_BULK_RX] = {
                .type = UE_BULK,
@@ -283,6 +287,19 @@ static const struct usb_config rsu_config[RSU_N_TRANSFER] = {
                .callback = rsu_bulk_tx_callback_vi_vo,
                .timeout = RSU_TX_TIMEOUT
        },
+       [RSU_BULK_TX_H2C] = {
+               .type = UE_BULK,
+               .endpoint = 0x0d,
+               .direction = UE_DIR_OUT,
+               .bufsize = RSU_TXBUFSZ,
+               .flags = {
+                       .ext_buffer = 1,
+                       .pipe_bof = 1,
+                       .short_xfer_ok = 1
+               },
+               .callback = rsu_bulk_tx_callback_h2c,
+               .timeout = RSU_TX_TIMEOUT
+       },
 };
 
 static int
@@ -891,7 +908,7 @@ rsu_read_rom(struct rsu_softc *sc)
 static int
 rsu_fw_cmd(struct rsu_softc *sc, uint8_t code, void *buf, int len)
 {
-       const uint8_t which = rsu_wme_ac_xfer_map[WME_AC_VO];
+       const uint8_t which = RSU_H2C_ENDPOINT;
        struct rsu_data *data;
        struct r92s_tx_desc *txd;
        struct r92s_fw_cmd_hdr *cmd;
@@ -1712,6 +1729,12 @@ rsu_bulk_tx_callback_vi_vo(struct usb_xfer *xfer, usb_error_t error)
        rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_VI_VO);
 }
 
+static void
+rsu_bulk_tx_callback_h2c(struct usb_xfer *xfer, usb_error_t error)
+{
+       rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_H2C);
+}
+
 static int
 rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni, 
     struct mbuf *m0, struct rsu_data *data)
index efe1a3a6c6f5bc196b5f70324c2b4874d999abce..dc5affc68af2233935e2d2e0aeb7e1371cf900a2 100644 (file)
@@ -700,6 +700,7 @@ enum {
        RSU_BULK_RX,
        RSU_BULK_TX_BE_BK,      /* = WME_AC_BE/BK */
        RSU_BULK_TX_VI_VO,      /* = WME_AC_VI/VO */
+       RSU_BULK_TX_H2C,        /* H2C */
        RSU_N_TRANSFER,
 };