Search Linux Wireless

Re: [PATCH 4/5] ath9k: get rid of double queueing of rx frames on EDMA

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Felix,

On Sat, Mar 3, 2012 at 7:47 PM, Felix Fietkau <nbd@xxxxxxxxxxx> wrote:
> Process rx status directly instead of separating the completion test from
> the actual rx status processing.
>
> Signed-off-by: Felix Fietkau <nbd@xxxxxxxxxxx>
> ---
>  drivers/net/wireless/ath/ath9k/ar9003_mac.c |   18 +++-------
>  drivers/net/wireless/ath/ath9k/ath9k.h      |    1 -
>  drivers/net/wireless/ath/ath9k/recv.c       |   47 +++++++++++++--------------
>  3 files changed, 29 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
> index 8d1bca0..acf2ca2 100644
> --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
> +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
> @@ -440,20 +440,14 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs,
>        struct ar9003_rxs *rxsp = (struct ar9003_rxs *) buf_addr;
>        unsigned int phyerr;
>
> -       /* TODO: byte swap on big endian for ar9300_10 */
> -
> -       if (!rxs) {
> -               if ((rxsp->status11 & AR_RxDone) == 0)
> -                       return -EINPROGRESS;
> -
> -               if (MS(rxsp->ds_info, AR_DescId) != 0x168c)
> -                       return -EINVAL;
> +       if ((rxsp->status11 & AR_RxDone) == 0)
> +               return -EINPROGRESS;
>
> -               if ((rxsp->ds_info & (AR_TxRxDesc | AR_CtrlStat)) != 0)
> -                       return -EINPROGRESS;
> +       if (MS(rxsp->ds_info, AR_DescId) != 0x168c)
> +               return -EINVAL;
>
> -               return 0;
> -       }
> +       if ((rxsp->ds_info & (AR_TxRxDesc | AR_CtrlStat)) != 0)
> +               return -EINPROGRESS;
>
>        rxs->rs_status = 0;
>        rxs->rs_flags =  0;
> diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
> index c2ccba6..3d8e51c 100644
> --- a/drivers/net/wireless/ath/ath9k/ath9k.h
> +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
> @@ -299,7 +299,6 @@ struct ath_tx {
>
>  struct ath_rx_edma {
>        struct sk_buff_head rx_fifo;
> -       struct sk_buff_head rx_buffers;
>        u32 rx_fifo_hwsize;
>  };
>
> diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
> index 7e1a91a..cdba79f 100644
> --- a/drivers/net/wireless/ath/ath9k/recv.c
> +++ b/drivers/net/wireless/ath/ath9k/recv.c
> @@ -232,7 +232,6 @@ static void ath_rx_edma_cleanup(struct ath_softc *sc)
>  static void ath_rx_edma_init_queue(struct ath_rx_edma *rx_edma, int size)
>  {
>        skb_queue_head_init(&rx_edma->rx_fifo);
> -       skb_queue_head_init(&rx_edma->rx_buffers);
>        rx_edma->rx_fifo_hwsize = size;
>  }
>
> @@ -658,7 +657,9 @@ static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb, bool mybeacon)
>  }
>
>  static bool ath_edma_get_buffers(struct ath_softc *sc,
> -                                enum ath9k_rx_qtype qtype)
> +                                enum ath9k_rx_qtype qtype,
> +                                struct ath_rx_status *rs,
> +                                struct ath_buf **dest)
>  {
>        struct ath_rx_edma *rx_edma = &sc->rx.rx_edma[qtype];
>        struct ath_hw *ah = sc->sc_ah;
> @@ -677,7 +678,7 @@ static bool ath_edma_get_buffers(struct ath_softc *sc,
>        dma_sync_single_for_cpu(sc->dev, bf->bf_buf_addr,
>                                common->rx_bufsize, DMA_FROM_DEVICE);
>
> -       ret = ath9k_hw_process_rxdesc_edma(ah, NULL, skb->data);
> +       ret = ath9k_hw_process_rxdesc_edma(ah, rs, skb->data);
>        if (ret == -EINPROGRESS) {
>                /*let device gain the buffer again*/
>                dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
> @@ -690,20 +691,21 @@ static bool ath_edma_get_buffers(struct ath_softc *sc,
>                /* corrupt descriptor, skip this one and the following one */
>                list_add_tail(&bf->list, &sc->rx.rxbuf);
>                ath_rx_edma_buf_link(sc, qtype);
> -               skb = skb_peek(&rx_edma->rx_fifo);
> -               if (!skb)
> -                       return true;
>
> -               bf = SKB_CB_ATHBUF(skb);
> -               BUG_ON(!bf);
> +               skb = skb_peek(&rx_edma->rx_fifo);
> +               if (skb) {
> +                       bf = SKB_CB_ATHBUF(skb);
> +                       BUG_ON(!bf);
>
> -               __skb_unlink(skb, &rx_edma->rx_fifo);
> -               list_add_tail(&bf->list, &sc->rx.rxbuf);
> -               ath_rx_edma_buf_link(sc, qtype);
> -               return true;
> +                       __skb_unlink(skb, &rx_edma->rx_fifo);
> +                       list_add_tail(&bf->list, &sc->rx.rxbuf);
> +                       ath_rx_edma_buf_link(sc, qtype);
> +               } else {
> +                       bf = NULL;
> +               }
>        }
> -       skb_queue_tail(&rx_edma->rx_buffers, skb);
>
> +       *dest = bf;
>        return true;
>  }
>
> @@ -711,18 +713,15 @@ static struct ath_buf *ath_edma_get_next_rx_buf(struct ath_softc *sc,
>                                                struct ath_rx_status *rs,
>                                                enum ath9k_rx_qtype qtype)
>  {
> -       struct ath_rx_edma *rx_edma = &sc->rx.rx_edma[qtype];
> -       struct sk_buff *skb;
> -       struct ath_buf *bf;
> +       struct ath_buf *bf = NULL;
>
> -       while (ath_edma_get_buffers(sc, qtype));
> -       skb = __skb_dequeue(&rx_edma->rx_buffers);
> -       if (!skb)
> -               return NULL;
> +       while (ath_edma_get_buffers(sc, qtype, rs, &bf)) {
> +               if (!bf)
> +                       continue;
>
> -       bf = SKB_CB_ATHBUF(skb);
> -       ath9k_hw_process_rxdesc_edma(sc->sc_ah, rs, skb->data);
> -       return bf;
> +               return bf;
> +       }
> +       return NULL;
>  }

can we do something like this, as 'buf' is initialized to NULL

while (ath_edma_get_buffers(sc, qtype, rs, &bf))
> +               if (bf)
> +                       break;
>
> -       bf = SKB_CB_ATHBUF(skb);
> -       ath9k_hw_process_rxdesc_edma(sc->sc_ah, rs, skb->data);
> -       return bf;
> +       return bf;



>
>  static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc,
> --
> 1.7.3.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
thanks,
shafi
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux