lkml.org 
[lkml]   [2015]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 126/146] staging: vt6655: vnt_tx_packet fix dma_idx selection.
    Date
    3.19.8-ckt2 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Malcolm Priestley <tvboxspy@gmail.com>

    commit c312530589ed9524fc7cc921105dc9b67ea32d6a upstream.

    There is still a problem that dma_idx is causing packets to
    go onto the wrong tx path.

    Protect dma_idx fully with the present first lock and
    use pTDInfo->byFlags TD_FLAGS_NETIF_SKB to set MACvTransmit.

    Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/staging/vt6655/device_main.c | 16 +++++++++-------
    1 file changed, 9 insertions(+), 7 deletions(-)

    diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
    index 4d29c05..7d9f563 100644
    --- a/drivers/staging/vt6655/device_main.c
    +++ b/drivers/staging/vt6655/device_main.c
    @@ -1205,12 +1205,14 @@ static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
    {
    struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
    PSTxDesc head_td;
    - u32 dma_idx = TYPE_AC0DMA;
    + u32 dma_idx;
    unsigned long flags;

    spin_lock_irqsave(&priv->lock, flags);

    - if (!ieee80211_is_data(hdr->frame_control))
    + if (ieee80211_is_data(hdr->frame_control))
    + dma_idx = TYPE_AC0DMA;
    + else
    dma_idx = TYPE_TXDMA0;

    if (AVAIL_TD(priv, dma_idx) < 1) {
    @@ -1224,6 +1226,9 @@ static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)

    head_td->pTDInfo->skb = skb;

    + if (dma_idx == TYPE_AC0DMA)
    + head_td->pTDInfo->byFlags = TD_FLAGS_NETIF_SKB;
    +
    priv->iTDUsed[dma_idx]++;

    /* Take ownership */
    @@ -1252,13 +1257,10 @@ static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)

    head_td->buff_addr = cpu_to_le32(head_td->pTDInfo->skb_dma);

    - if (dma_idx == TYPE_AC0DMA) {
    - head_td->pTDInfo->byFlags = TD_FLAGS_NETIF_SKB;
    -
    + if (head_td->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)
    MACvTransmitAC0(priv->PortOffset);
    - } else {
    + else
    MACvTransmit0(priv->PortOffset);
    - }

    spin_unlock_irqrestore(&priv->lock, flags);

    --
    1.9.1


    \
     
     \ /
      Last update: 2015-06-18 01:21    [W:4.364 / U:0.376 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site