]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
staging: vt6656: use NULLFUCTION stack on mac80211
authorMalcolm Priestley <tvboxspy@gmail.com>
Wed, 8 Jan 2020 21:41:20 +0000 (21:41 +0000)
committerKhalid Elmously <khalid.elmously@canonical.com>
Fri, 6 Mar 2020 07:13:20 +0000 (02:13 -0500)
BugLink: https://bugs.launchpad.net/bugs/1864904
commit d579c43c82f093e63639151625b2139166c730fd upstream.

It appears that the drivers does not go into power save correctly the
NULL data packets are not being transmitted because it not enabled
in mac80211.

The driver needs to capture ieee80211_is_nullfunc headers and
copy the duration_id to it's own duration data header.

Cc: stable <stable@vger.kernel.org>
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Link: https://lore.kernel.org/r/610971ae-555b-a6c3-61b3-444a0c1e35b4@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/staging/vt6656/main_usb.c
drivers/staging/vt6656/rxtx.c

index a7998c3dd3be090656ada02ee48ff8ab65b759e7..a9ce40fe2a5c80a9deeebf2875cd4e1b497284ea 100644 (file)
@@ -990,6 +990,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
        ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS);
        ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS);
        ieee80211_hw_set(priv->hw, SUPPORTS_PS);
+       ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK);
 
        priv->hw->max_signal = 100;
 
index f15990491ce47869bf9d0422467e3a8fa3f2e555..f78f31ce64437f81056ed2529b6e68b02388c5f4 100644 (file)
@@ -288,11 +288,9 @@ static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context,
                          PK_TYPE_11B, &buf->b);
 
        /* Get Duration and TimeStamp */
-       if (ieee80211_is_pspoll(hdr->frame_control)) {
-               __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15));
-
-               buf->duration_a = dur;
-               buf->duration_b = dur;
+       if (ieee80211_is_nullfunc(hdr->frame_control)) {
+               buf->duration_a = hdr->duration_id;
+               buf->duration_b = hdr->duration_id;
        } else {
                buf->duration_a = vnt_get_duration_le(priv,
                                                tx_context->pkt_type, need_ack);
@@ -381,10 +379,8 @@ static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context,
                          tx_context->pkt_type, &buf->ab);
 
        /* Get Duration and TimeStampOff */
-       if (ieee80211_is_pspoll(hdr->frame_control)) {
-               __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15));
-
-               buf->duration = dur;
+       if (ieee80211_is_nullfunc(hdr->frame_control)) {
+               buf->duration = hdr->duration_id;
        } else {
                buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type,
                                                    need_ack);