linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	stable@vger.kernel.org, Masahiro Yamada <masahiroy@kernel.org>
Subject: Re: [PATCH 4.19 209/247] staging/mt7621-dma: mtk-hsdma.c->hsdma-mt7621.c
Date: Mon, 1 Mar 2021 09:41:39 -0800	[thread overview]
Message-ID: <CALCv0x36mPwPwFpB8P6nc4kfu_PB=U81RoY9=q31Osx4sGtC3g@mail.gmail.com> (raw)
In-Reply-To: <20210301161041.907312533@linuxfoundation.org>

Sorry, I should have been more clear in my original email, but we
don't strictly need this in 4.19 as the check only became fatal in
5.10 (actually, before 5.10, but 5.10 is the first stable release with
it). Feel free to take or omit this from 4.19.

On Mon, Mar 1, 2021 at 8:45 AM Greg Kroah-Hartman
<gregkh@linuxfoundation.org> wrote:
>
> From: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
>
> commit 1f92798cbe7fe923479cff754dd06dd23d352e36 upstream.
>
> Also use KBUILD_MODNAME for module name.
>
> This driver is only used by RALINK MIPS MT7621 SoCs. Tested by building
> against that target using OpenWrt with Linux 5.10.10.
>
> Fixes the following error:
> error: the following would cause module name conflict:
>   drivers/dma/mediatek/mtk-hsdma.ko
>   drivers/staging/mt7621-dma/mtk-hsdma.ko
>
> Cc: stable@vger.kernel.org
> Cc: Masahiro Yamada <masahiroy@kernel.org>
> Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
> Link: https://lore.kernel.org/r/20210130034507.2115280-1-ilya.lipnitskiy@gmail.com
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> ---
>  drivers/staging/mt7621-dma/Makefile       |    2
>  drivers/staging/mt7621-dma/hsdma-mt7621.c |  771 ++++++++++++++++++++++++++++++
>  drivers/staging/mt7621-dma/mtk-hsdma.c    |  771 ------------------------------
>  3 files changed, 772 insertions(+), 772 deletions(-)
>  rename drivers/staging/mt7621-dma/{mtk-hsdma.c => hsdma-mt7621.c} (99%)
>
> --- a/drivers/staging/mt7621-dma/Makefile
> +++ b/drivers/staging/mt7621-dma/Makefile
> @@ -1,4 +1,4 @@
>  obj-$(CONFIG_DMA_RALINK) += ralink-gdma.o
> -obj-$(CONFIG_MTK_HSDMA) += mtk-hsdma.o
> +obj-$(CONFIG_MTK_HSDMA) += hsdma-mt7621.o
>
>  ccflags-y += -I$(srctree)/drivers/dma
> --- /dev/null
> +++ b/drivers/staging/mt7621-dma/hsdma-mt7621.c
> @@ -0,0 +1,771 @@
> +/*
> + *  Copyright (C) 2015, Michael Lee <igvtee@gmail.com>
> + *  MTK HSDMA support
> + *
> + *  This program is free software; you can redistribute it and/or modify it
> + *  under  the terms of the GNU General         Public License as published by the
> + *  Free Software Foundation;  either version 2 of the License, or (at your
> + *  option) any later version.
> + *
> + */
> +
> +#include <linux/dmaengine.h>
> +#include <linux/dma-mapping.h>
> +#include <linux/err.h>
> +#include <linux/init.h>
> +#include <linux/list.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/spinlock.h>
> +#include <linux/irq.h>
> +#include <linux/of_dma.h>
> +#include <linux/reset.h>
> +#include <linux/of_device.h>
> +
> +#include "virt-dma.h"
> +
> +#define HSDMA_BASE_OFFSET              0x800
> +
> +#define HSDMA_REG_TX_BASE              0x00
> +#define HSDMA_REG_TX_CNT               0x04
> +#define HSDMA_REG_TX_CTX               0x08
> +#define HSDMA_REG_TX_DTX               0x0c
> +#define HSDMA_REG_RX_BASE              0x100
> +#define HSDMA_REG_RX_CNT               0x104
> +#define HSDMA_REG_RX_CRX               0x108
> +#define HSDMA_REG_RX_DRX               0x10c
> +#define HSDMA_REG_INFO                 0x200
> +#define HSDMA_REG_GLO_CFG              0x204
> +#define HSDMA_REG_RST_CFG              0x208
> +#define HSDMA_REG_DELAY_INT            0x20c
> +#define HSDMA_REG_FREEQ_THRES          0x210
> +#define HSDMA_REG_INT_STATUS           0x220
> +#define HSDMA_REG_INT_MASK             0x228
> +#define HSDMA_REG_SCH_Q01              0x280
> +#define HSDMA_REG_SCH_Q23              0x284
> +
> +#define HSDMA_DESCS_MAX                        0xfff
> +#define HSDMA_DESCS_NUM                        8
> +#define HSDMA_DESCS_MASK               (HSDMA_DESCS_NUM - 1)
> +#define HSDMA_NEXT_DESC(x)             (((x) + 1) & HSDMA_DESCS_MASK)
> +
> +/* HSDMA_REG_INFO */
> +#define HSDMA_INFO_INDEX_MASK          0xf
> +#define HSDMA_INFO_INDEX_SHIFT         24
> +#define HSDMA_INFO_BASE_MASK           0xff
> +#define HSDMA_INFO_BASE_SHIFT          16
> +#define HSDMA_INFO_RX_MASK             0xff
> +#define HSDMA_INFO_RX_SHIFT            8
> +#define HSDMA_INFO_TX_MASK             0xff
> +#define HSDMA_INFO_TX_SHIFT            0
> +
> +/* HSDMA_REG_GLO_CFG */
> +#define HSDMA_GLO_TX_2B_OFFSET         BIT(31)
> +#define HSDMA_GLO_CLK_GATE             BIT(30)
> +#define HSDMA_GLO_BYTE_SWAP            BIT(29)
> +#define HSDMA_GLO_MULTI_DMA            BIT(10)
> +#define HSDMA_GLO_TWO_BUF              BIT(9)
> +#define HSDMA_GLO_32B_DESC             BIT(8)
> +#define HSDMA_GLO_BIG_ENDIAN           BIT(7)
> +#define HSDMA_GLO_TX_DONE              BIT(6)
> +#define HSDMA_GLO_BT_MASK              0x3
> +#define HSDMA_GLO_BT_SHIFT             4
> +#define HSDMA_GLO_RX_BUSY              BIT(3)
> +#define HSDMA_GLO_RX_DMA               BIT(2)
> +#define HSDMA_GLO_TX_BUSY              BIT(1)
> +#define HSDMA_GLO_TX_DMA               BIT(0)
> +
> +#define HSDMA_BT_SIZE_16BYTES          (0 << HSDMA_GLO_BT_SHIFT)
> +#define HSDMA_BT_SIZE_32BYTES          (1 << HSDMA_GLO_BT_SHIFT)
> +#define HSDMA_BT_SIZE_64BYTES          (2 << HSDMA_GLO_BT_SHIFT)
> +#define HSDMA_BT_SIZE_128BYTES         (3 << HSDMA_GLO_BT_SHIFT)
> +
> +#define HSDMA_GLO_DEFAULT              (HSDMA_GLO_MULTI_DMA | \
> +               HSDMA_GLO_RX_DMA | HSDMA_GLO_TX_DMA | HSDMA_BT_SIZE_32BYTES)
> +
> +/* HSDMA_REG_RST_CFG */
> +#define HSDMA_RST_RX_SHIFT             16
> +#define HSDMA_RST_TX_SHIFT             0
> +
> +/* HSDMA_REG_DELAY_INT */
> +#define HSDMA_DELAY_INT_EN             BIT(15)
> +#define HSDMA_DELAY_PEND_OFFSET                8
> +#define HSDMA_DELAY_TIME_OFFSET                0
> +#define HSDMA_DELAY_TX_OFFSET          16
> +#define HSDMA_DELAY_RX_OFFSET          0
> +
> +#define HSDMA_DELAY_INIT(x)            (HSDMA_DELAY_INT_EN | \
> +               ((x) << HSDMA_DELAY_PEND_OFFSET))
> +#define HSDMA_DELAY(x)                 ((HSDMA_DELAY_INIT(x) << \
> +               HSDMA_DELAY_TX_OFFSET) | HSDMA_DELAY_INIT(x))
> +
> +/* HSDMA_REG_INT_STATUS */
> +#define HSDMA_INT_DELAY_RX_COH         BIT(31)
> +#define HSDMA_INT_DELAY_RX_INT         BIT(30)
> +#define HSDMA_INT_DELAY_TX_COH         BIT(29)
> +#define HSDMA_INT_DELAY_TX_INT         BIT(28)
> +#define HSDMA_INT_RX_MASK              0x3
> +#define HSDMA_INT_RX_SHIFT             16
> +#define HSDMA_INT_RX_Q0                        BIT(16)
> +#define HSDMA_INT_TX_MASK              0xf
> +#define HSDMA_INT_TX_SHIFT             0
> +#define HSDMA_INT_TX_Q0                        BIT(0)
> +
> +/* tx/rx dma desc flags */
> +#define HSDMA_PLEN_MASK                        0x3fff
> +#define HSDMA_DESC_DONE                        BIT(31)
> +#define HSDMA_DESC_LS0                 BIT(30)
> +#define HSDMA_DESC_PLEN0(_x)           (((_x) & HSDMA_PLEN_MASK) << 16)
> +#define HSDMA_DESC_TAG                 BIT(15)
> +#define HSDMA_DESC_LS1                 BIT(14)
> +#define HSDMA_DESC_PLEN1(_x)           ((_x) & HSDMA_PLEN_MASK)
> +
> +/* align 4 bytes */
> +#define HSDMA_ALIGN_SIZE               3
> +/* align size 128bytes */
> +#define HSDMA_MAX_PLEN                 0x3f80
> +
> +struct hsdma_desc {
> +       u32 addr0;
> +       u32 flags;
> +       u32 addr1;
> +       u32 unused;
> +};
> +
> +struct mtk_hsdma_sg {
> +       dma_addr_t src_addr;
> +       dma_addr_t dst_addr;
> +       u32 len;
> +};
> +
> +struct mtk_hsdma_desc {
> +       struct virt_dma_desc vdesc;
> +       unsigned int num_sgs;
> +       struct mtk_hsdma_sg sg[1];
> +};
> +
> +struct mtk_hsdma_chan {
> +       struct virt_dma_chan vchan;
> +       unsigned int id;
> +       dma_addr_t desc_addr;
> +       int tx_idx;
> +       int rx_idx;
> +       struct hsdma_desc *tx_ring;
> +       struct hsdma_desc *rx_ring;
> +       struct mtk_hsdma_desc *desc;
> +       unsigned int next_sg;
> +};
> +
> +struct mtk_hsdam_engine {
> +       struct dma_device ddev;
> +       struct device_dma_parameters dma_parms;
> +       void __iomem *base;
> +       struct tasklet_struct task;
> +       volatile unsigned long chan_issued;
> +
> +       struct mtk_hsdma_chan chan[1];
> +};
> +
> +static inline struct mtk_hsdam_engine *mtk_hsdma_chan_get_dev(
> +               struct mtk_hsdma_chan *chan)
> +{
> +       return container_of(chan->vchan.chan.device, struct mtk_hsdam_engine,
> +                       ddev);
> +}
> +
> +static inline struct mtk_hsdma_chan *to_mtk_hsdma_chan(struct dma_chan *c)
> +{
> +       return container_of(c, struct mtk_hsdma_chan, vchan.chan);
> +}
> +
> +static inline struct mtk_hsdma_desc *to_mtk_hsdma_desc(
> +               struct virt_dma_desc *vdesc)
> +{
> +       return container_of(vdesc, struct mtk_hsdma_desc, vdesc);
> +}
> +
> +static inline u32 mtk_hsdma_read(struct mtk_hsdam_engine *hsdma, u32 reg)
> +{
> +       return readl(hsdma->base + reg);
> +}
> +
> +static inline void mtk_hsdma_write(struct mtk_hsdam_engine *hsdma,
> +                                  unsigned reg, u32 val)
> +{
> +       writel(val, hsdma->base + reg);
> +}
> +
> +static void mtk_hsdma_reset_chan(struct mtk_hsdam_engine *hsdma,
> +                                struct mtk_hsdma_chan *chan)
> +{
> +       chan->tx_idx = 0;
> +       chan->rx_idx = HSDMA_DESCS_NUM - 1;
> +
> +       mtk_hsdma_write(hsdma, HSDMA_REG_TX_CTX, chan->tx_idx);
> +       mtk_hsdma_write(hsdma, HSDMA_REG_RX_CRX, chan->rx_idx);
> +
> +       mtk_hsdma_write(hsdma, HSDMA_REG_RST_CFG,
> +                       0x1 << (chan->id + HSDMA_RST_TX_SHIFT));
> +       mtk_hsdma_write(hsdma, HSDMA_REG_RST_CFG,
> +                       0x1 << (chan->id + HSDMA_RST_RX_SHIFT));
> +}
> +
> +static void hsdma_dump_reg(struct mtk_hsdam_engine *hsdma)
> +{
> +       dev_dbg(hsdma->ddev.dev, "tbase %08x, tcnt %08x, " \
> +                       "tctx %08x, tdtx: %08x, rbase %08x, " \
> +                       "rcnt %08x, rctx %08x, rdtx %08x\n",
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_TX_BASE),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_TX_CNT),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_TX_CTX),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_TX_DTX),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_RX_BASE),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_RX_CNT),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_RX_CRX),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_RX_DRX));
> +
> +       dev_dbg(hsdma->ddev.dev, "info %08x, glo %08x, delay %08x, " \
> +                       "intr_stat %08x, intr_mask %08x\n",
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_INFO),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_GLO_CFG),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_DELAY_INT),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_INT_STATUS),
> +                       mtk_hsdma_read(hsdma, HSDMA_REG_INT_MASK));
> +}
> +
> +static void hsdma_dump_desc(struct mtk_hsdam_engine *hsdma,
> +                           struct mtk_hsdma_chan *chan)
> +{
> +       struct hsdma_desc *tx_desc;
> +       struct hsdma_desc *rx_desc;
> +       int i;
> +
> +       dev_dbg(hsdma->ddev.dev, "tx idx: %d, rx idx: %d\n",
> +                       chan->tx_idx, chan->rx_idx);
> +
> +       for (i = 0; i < HSDMA_DESCS_NUM; i++) {
> +               tx_desc = &chan->tx_ring[i];
> +               rx_desc = &chan->rx_ring[i];
> +
> +               dev_dbg(hsdma->ddev.dev, "%d tx addr0: %08x, flags %08x, " \
> +                               "tx addr1: %08x, rx addr0 %08x, flags %08x\n",
> +                               i, tx_desc->addr0, tx_desc->flags, \
> +                               tx_desc->addr1, rx_desc->addr0, rx_desc->flags);
> +       }
> +}
> +
> +static void mtk_hsdma_reset(struct mtk_hsdam_engine *hsdma,
> +                           struct mtk_hsdma_chan *chan)
> +{
> +       int i;
> +
> +       /* disable dma */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_GLO_CFG, 0);
> +
> +       /* disable intr */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_INT_MASK, 0);
> +
> +       /* init desc value */
> +       for (i = 0; i < HSDMA_DESCS_NUM; i++) {
> +               chan->tx_ring[i].addr0 = 0;
> +               chan->tx_ring[i].flags = HSDMA_DESC_LS0 |
> +                       HSDMA_DESC_DONE;
> +       }
> +       for (i = 0; i < HSDMA_DESCS_NUM; i++) {
> +               chan->rx_ring[i].addr0 = 0;
> +               chan->rx_ring[i].flags = 0;
> +       }
> +
> +       /* reset */
> +       mtk_hsdma_reset_chan(hsdma, chan);
> +
> +       /* enable intr */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_INT_MASK, HSDMA_INT_RX_Q0);
> +
> +       /* enable dma */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_GLO_CFG, HSDMA_GLO_DEFAULT);
> +}
> +
> +static int mtk_hsdma_terminate_all(struct dma_chan *c)
> +{
> +       struct mtk_hsdma_chan *chan = to_mtk_hsdma_chan(c);
> +       struct mtk_hsdam_engine *hsdma = mtk_hsdma_chan_get_dev(chan);
> +       unsigned long timeout;
> +       LIST_HEAD(head);
> +
> +       spin_lock_bh(&chan->vchan.lock);
> +       chan->desc = NULL;
> +       clear_bit(chan->id, &hsdma->chan_issued);
> +       vchan_get_all_descriptors(&chan->vchan, &head);
> +       spin_unlock_bh(&chan->vchan.lock);
> +
> +       vchan_dma_desc_free_list(&chan->vchan, &head);
> +
> +       /* wait dma transfer complete */
> +       timeout = jiffies + msecs_to_jiffies(2000);
> +       while (mtk_hsdma_read(hsdma, HSDMA_REG_GLO_CFG) &
> +                       (HSDMA_GLO_RX_BUSY | HSDMA_GLO_TX_BUSY)) {
> +               if (time_after_eq(jiffies, timeout)) {
> +                       hsdma_dump_desc(hsdma, chan);
> +                       mtk_hsdma_reset(hsdma, chan);
> +                       dev_err(hsdma->ddev.dev, "timeout, reset it\n");
> +                       break;
> +               }
> +               cpu_relax();
> +       }
> +
> +       return 0;
> +}
> +
> +static int mtk_hsdma_start_transfer(struct mtk_hsdam_engine *hsdma,
> +                                   struct mtk_hsdma_chan *chan)
> +{
> +       dma_addr_t src, dst;
> +       size_t len, tlen;
> +       struct hsdma_desc *tx_desc, *rx_desc;
> +       struct mtk_hsdma_sg *sg;
> +       unsigned int i;
> +       int rx_idx;
> +
> +       sg = &chan->desc->sg[0];
> +       len = sg->len;
> +       chan->desc->num_sgs = DIV_ROUND_UP(len, HSDMA_MAX_PLEN);
> +
> +       /* tx desc */
> +       src = sg->src_addr;
> +       for (i = 0; i < chan->desc->num_sgs; i++) {
> +               tx_desc = &chan->tx_ring[chan->tx_idx];
> +
> +               if (len > HSDMA_MAX_PLEN)
> +                       tlen = HSDMA_MAX_PLEN;
> +               else
> +                       tlen = len;
> +
> +               if (i & 0x1) {
> +                       tx_desc->addr1 = src;
> +                       tx_desc->flags |= HSDMA_DESC_PLEN1(tlen);
> +               } else {
> +                       tx_desc->addr0 = src;
> +                       tx_desc->flags = HSDMA_DESC_PLEN0(tlen);
> +
> +                       /* update index */
> +                       chan->tx_idx = HSDMA_NEXT_DESC(chan->tx_idx);
> +               }
> +
> +               src += tlen;
> +               len -= tlen;
> +       }
> +       if (i & 0x1)
> +               tx_desc->flags |= HSDMA_DESC_LS0;
> +       else
> +               tx_desc->flags |= HSDMA_DESC_LS1;
> +
> +       /* rx desc */
> +       rx_idx = HSDMA_NEXT_DESC(chan->rx_idx);
> +       len = sg->len;
> +       dst = sg->dst_addr;
> +       for (i = 0; i < chan->desc->num_sgs; i++) {
> +               rx_desc = &chan->rx_ring[rx_idx];
> +               if (len > HSDMA_MAX_PLEN)
> +                       tlen = HSDMA_MAX_PLEN;
> +               else
> +                       tlen = len;
> +
> +               rx_desc->addr0 = dst;
> +               rx_desc->flags = HSDMA_DESC_PLEN0(tlen);
> +
> +               dst += tlen;
> +               len -= tlen;
> +
> +               /* update index */
> +               rx_idx = HSDMA_NEXT_DESC(rx_idx);
> +       }
> +
> +       /* make sure desc and index all up to date */
> +       wmb();
> +       mtk_hsdma_write(hsdma, HSDMA_REG_TX_CTX, chan->tx_idx);
> +
> +       return 0;
> +}
> +
> +static int gdma_next_desc(struct mtk_hsdma_chan *chan)
> +{
> +       struct virt_dma_desc *vdesc;
> +
> +       vdesc = vchan_next_desc(&chan->vchan);
> +       if (!vdesc) {
> +               chan->desc = NULL;
> +               return 0;
> +       }
> +       chan->desc = to_mtk_hsdma_desc(vdesc);
> +       chan->next_sg = 0;
> +
> +       return 1;
> +}
> +
> +static void mtk_hsdma_chan_done(struct mtk_hsdam_engine *hsdma,
> +                               struct mtk_hsdma_chan *chan)
> +{
> +       struct mtk_hsdma_desc *desc;
> +       int chan_issued;
> +
> +       chan_issued = 0;
> +       spin_lock_bh(&chan->vchan.lock);
> +       desc = chan->desc;
> +       if (likely(desc)) {
> +               if (chan->next_sg == desc->num_sgs) {
> +                       list_del(&desc->vdesc.node);
> +                       vchan_cookie_complete(&desc->vdesc);
> +                       chan_issued = gdma_next_desc(chan);
> +               }
> +       } else
> +               dev_dbg(hsdma->ddev.dev, "no desc to complete\n");
> +
> +       if (chan_issued)
> +               set_bit(chan->id, &hsdma->chan_issued);
> +       spin_unlock_bh(&chan->vchan.lock);
> +}
> +
> +static irqreturn_t mtk_hsdma_irq(int irq, void *devid)
> +{
> +       struct mtk_hsdam_engine *hsdma = devid;
> +       u32 status;
> +
> +       status = mtk_hsdma_read(hsdma, HSDMA_REG_INT_STATUS);
> +       if (unlikely(!status))
> +               return IRQ_NONE;
> +
> +       if (likely(status & HSDMA_INT_RX_Q0))
> +               tasklet_schedule(&hsdma->task);
> +       else
> +               dev_dbg(hsdma->ddev.dev, "unhandle irq status %08x\n",
> +                       status);
> +       /* clean intr bits */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_INT_STATUS, status);
> +
> +       return IRQ_HANDLED;
> +}
> +
> +static void mtk_hsdma_issue_pending(struct dma_chan *c)
> +{
> +       struct mtk_hsdma_chan *chan = to_mtk_hsdma_chan(c);
> +       struct mtk_hsdam_engine *hsdma = mtk_hsdma_chan_get_dev(chan);
> +
> +       spin_lock_bh(&chan->vchan.lock);
> +       if (vchan_issue_pending(&chan->vchan) && !chan->desc) {
> +               if (gdma_next_desc(chan)) {
> +                       set_bit(chan->id, &hsdma->chan_issued);
> +                       tasklet_schedule(&hsdma->task);
> +               } else
> +                       dev_dbg(hsdma->ddev.dev, "no desc to issue\n");
> +       }
> +       spin_unlock_bh(&chan->vchan.lock);
> +}
> +
> +static struct dma_async_tx_descriptor *mtk_hsdma_prep_dma_memcpy(
> +               struct dma_chan *c, dma_addr_t dest, dma_addr_t src,
> +               size_t len, unsigned long flags)
> +{
> +       struct mtk_hsdma_chan *chan = to_mtk_hsdma_chan(c);
> +       struct mtk_hsdma_desc *desc;
> +
> +       if (len <= 0)
> +               return NULL;
> +
> +       desc = kzalloc(sizeof(struct mtk_hsdma_desc), GFP_ATOMIC);
> +       if (!desc) {
> +               dev_err(c->device->dev, "alloc memcpy decs error\n");
> +               return NULL;
> +       }
> +
> +       desc->sg[0].src_addr = src;
> +       desc->sg[0].dst_addr = dest;
> +       desc->sg[0].len = len;
> +
> +       return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags);
> +}
> +
> +static enum dma_status mtk_hsdma_tx_status(struct dma_chan *c,
> +                                          dma_cookie_t cookie,
> +                                          struct dma_tx_state *state)
> +{
> +       return dma_cookie_status(c, cookie, state);
> +}
> +
> +static void mtk_hsdma_free_chan_resources(struct dma_chan *c)
> +{
> +       vchan_free_chan_resources(to_virt_chan(c));
> +}
> +
> +static void mtk_hsdma_desc_free(struct virt_dma_desc *vdesc)
> +{
> +       kfree(container_of(vdesc, struct mtk_hsdma_desc, vdesc));
> +}
> +
> +static void mtk_hsdma_tx(struct mtk_hsdam_engine *hsdma)
> +{
> +       struct mtk_hsdma_chan *chan;
> +
> +       if (test_and_clear_bit(0, &hsdma->chan_issued)) {
> +               chan = &hsdma->chan[0];
> +               if (chan->desc)
> +                       mtk_hsdma_start_transfer(hsdma, chan);
> +               else
> +                       dev_dbg(hsdma->ddev.dev, "chan 0 no desc to issue\n");
> +       }
> +}
> +
> +static void mtk_hsdma_rx(struct mtk_hsdam_engine *hsdma)
> +{
> +       struct mtk_hsdma_chan *chan;
> +       int next_idx, drx_idx, cnt;
> +
> +       chan = &hsdma->chan[0];
> +       next_idx = HSDMA_NEXT_DESC(chan->rx_idx);
> +       drx_idx = mtk_hsdma_read(hsdma, HSDMA_REG_RX_DRX);
> +
> +       cnt = (drx_idx - next_idx) & HSDMA_DESCS_MASK;
> +       if (!cnt)
> +               return;
> +
> +       chan->next_sg += cnt;
> +       chan->rx_idx = (chan->rx_idx + cnt) & HSDMA_DESCS_MASK;
> +
> +       /* update rx crx */
> +       wmb();
> +       mtk_hsdma_write(hsdma, HSDMA_REG_RX_CRX, chan->rx_idx);
> +
> +       mtk_hsdma_chan_done(hsdma, chan);
> +}
> +
> +static void mtk_hsdma_tasklet(unsigned long arg)
> +{
> +       struct mtk_hsdam_engine *hsdma = (struct mtk_hsdam_engine *)arg;
> +
> +       mtk_hsdma_rx(hsdma);
> +       mtk_hsdma_tx(hsdma);
> +}
> +
> +static int mtk_hsdam_alloc_desc(struct mtk_hsdam_engine *hsdma,
> +                               struct mtk_hsdma_chan *chan)
> +{
> +       int i;
> +
> +       chan->tx_ring = dma_alloc_coherent(hsdma->ddev.dev,
> +                       2 * HSDMA_DESCS_NUM * sizeof(*chan->tx_ring),
> +                       &chan->desc_addr, GFP_ATOMIC | __GFP_ZERO);
> +       if (!chan->tx_ring)
> +               goto no_mem;
> +
> +       chan->rx_ring = &chan->tx_ring[HSDMA_DESCS_NUM];
> +
> +       /* init tx ring value */
> +       for (i = 0; i < HSDMA_DESCS_NUM; i++)
> +               chan->tx_ring[i].flags = HSDMA_DESC_LS0 | HSDMA_DESC_DONE;
> +
> +       return 0;
> +no_mem:
> +       return -ENOMEM;
> +}
> +
> +static void mtk_hsdam_free_desc(struct mtk_hsdam_engine *hsdma,
> +                               struct mtk_hsdma_chan *chan)
> +{
> +       if (chan->tx_ring) {
> +               dma_free_coherent(hsdma->ddev.dev,
> +                               2 * HSDMA_DESCS_NUM * sizeof(*chan->tx_ring),
> +                               chan->tx_ring, chan->desc_addr);
> +               chan->tx_ring = NULL;
> +               chan->rx_ring = NULL;
> +       }
> +}
> +
> +static int mtk_hsdma_init(struct mtk_hsdam_engine *hsdma)
> +{
> +       struct mtk_hsdma_chan *chan;
> +       int ret;
> +       u32 reg;
> +
> +       /* init desc */
> +       chan = &hsdma->chan[0];
> +       ret = mtk_hsdam_alloc_desc(hsdma, chan);
> +       if (ret)
> +               return ret;
> +
> +       /* tx */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_TX_BASE, chan->desc_addr);
> +       mtk_hsdma_write(hsdma, HSDMA_REG_TX_CNT, HSDMA_DESCS_NUM);
> +       /* rx */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_RX_BASE, chan->desc_addr +
> +                       (sizeof(struct hsdma_desc) * HSDMA_DESCS_NUM));
> +       mtk_hsdma_write(hsdma, HSDMA_REG_RX_CNT, HSDMA_DESCS_NUM);
> +       /* reset */
> +       mtk_hsdma_reset_chan(hsdma, chan);
> +
> +       /* enable rx intr */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_INT_MASK, HSDMA_INT_RX_Q0);
> +
> +       /* enable dma */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_GLO_CFG, HSDMA_GLO_DEFAULT);
> +
> +       /* hardware info */
> +       reg = mtk_hsdma_read(hsdma, HSDMA_REG_INFO);
> +       dev_info(hsdma->ddev.dev, "rx: %d, tx: %d\n",
> +                (reg >> HSDMA_INFO_RX_SHIFT) & HSDMA_INFO_RX_MASK,
> +                (reg >> HSDMA_INFO_TX_SHIFT) & HSDMA_INFO_TX_MASK);
> +
> +       hsdma_dump_reg(hsdma);
> +
> +       return ret;
> +}
> +
> +static void mtk_hsdma_uninit(struct mtk_hsdam_engine *hsdma)
> +{
> +       struct mtk_hsdma_chan *chan;
> +
> +       /* disable dma */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_GLO_CFG, 0);
> +
> +       /* disable intr */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_INT_MASK, 0);
> +
> +       /* free desc */
> +       chan = &hsdma->chan[0];
> +       mtk_hsdam_free_desc(hsdma, chan);
> +
> +       /* tx */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_TX_BASE, 0);
> +       mtk_hsdma_write(hsdma, HSDMA_REG_TX_CNT, 0);
> +       /* rx */
> +       mtk_hsdma_write(hsdma, HSDMA_REG_RX_BASE, 0);
> +       mtk_hsdma_write(hsdma, HSDMA_REG_RX_CNT, 0);
> +       /* reset */
> +       mtk_hsdma_reset_chan(hsdma, chan);
> +}
> +
> +static const struct of_device_id mtk_hsdma_of_match[] = {
> +       { .compatible = "mediatek,mt7621-hsdma" },
> +       { },
> +};
> +
> +static int mtk_hsdma_probe(struct platform_device *pdev)
> +{
> +       const struct of_device_id *match;
> +       struct mtk_hsdma_chan *chan;
> +       struct mtk_hsdam_engine *hsdma;
> +       struct dma_device *dd;
> +       struct resource *res;
> +       int ret;
> +       int irq;
> +       void __iomem *base;
> +
> +       ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
> +       if (ret)
> +               return ret;
> +
> +       match = of_match_device(mtk_hsdma_of_match, &pdev->dev);
> +       if (!match)
> +               return -EINVAL;
> +
> +       hsdma = devm_kzalloc(&pdev->dev, sizeof(*hsdma), GFP_KERNEL);
> +       if (!hsdma) {
> +               dev_err(&pdev->dev, "alloc dma device failed\n");
> +               return -EINVAL;
> +       }
> +
> +       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> +       base = devm_ioremap_resource(&pdev->dev, res);
> +       if (IS_ERR(base))
> +               return PTR_ERR(base);
> +       hsdma->base = base + HSDMA_BASE_OFFSET;
> +       tasklet_init(&hsdma->task, mtk_hsdma_tasklet, (unsigned long)hsdma);
> +
> +       irq = platform_get_irq(pdev, 0);
> +       if (irq < 0) {
> +               dev_err(&pdev->dev, "failed to get irq\n");
> +               return -EINVAL;
> +       }
> +       ret = devm_request_irq(&pdev->dev, irq, mtk_hsdma_irq,
> +                              0, dev_name(&pdev->dev), hsdma);
> +       if (ret) {
> +               dev_err(&pdev->dev, "failed to request irq\n");
> +               return ret;
> +       }
> +
> +       device_reset(&pdev->dev);
> +
> +       dd = &hsdma->ddev;
> +       dma_cap_set(DMA_MEMCPY, dd->cap_mask);
> +       dd->copy_align = HSDMA_ALIGN_SIZE;
> +       dd->device_free_chan_resources = mtk_hsdma_free_chan_resources;
> +       dd->device_prep_dma_memcpy = mtk_hsdma_prep_dma_memcpy;
> +       dd->device_terminate_all = mtk_hsdma_terminate_all;
> +       dd->device_tx_status = mtk_hsdma_tx_status;
> +       dd->device_issue_pending = mtk_hsdma_issue_pending;
> +       dd->dev = &pdev->dev;
> +       dd->dev->dma_parms = &hsdma->dma_parms;
> +       dma_set_max_seg_size(dd->dev, HSDMA_MAX_PLEN);
> +       INIT_LIST_HEAD(&dd->channels);
> +
> +       chan = &hsdma->chan[0];
> +       chan->id = 0;
> +       chan->vchan.desc_free = mtk_hsdma_desc_free;
> +       vchan_init(&chan->vchan, dd);
> +
> +       /* init hardware */
> +       ret = mtk_hsdma_init(hsdma);
> +       if (ret) {
> +               dev_err(&pdev->dev, "failed to alloc ring descs\n");
> +               return ret;
> +       }
> +
> +       ret = dma_async_device_register(dd);
> +       if (ret) {
> +               dev_err(&pdev->dev, "failed to register dma device\n");
> +               goto err_uninit_hsdma;
> +       }
> +
> +       ret = of_dma_controller_register(pdev->dev.of_node,
> +                                        of_dma_xlate_by_chan_id, hsdma);
> +       if (ret) {
> +               dev_err(&pdev->dev, "failed to register of dma controller\n");
> +               goto err_unregister;
> +       }
> +
> +       platform_set_drvdata(pdev, hsdma);
> +
> +       return 0;
> +
> +err_unregister:
> +       dma_async_device_unregister(dd);
> +err_uninit_hsdma:
> +       mtk_hsdma_uninit(hsdma);
> +       return ret;
> +}
> +
> +static int mtk_hsdma_remove(struct platform_device *pdev)
> +{
> +       struct mtk_hsdam_engine *hsdma = platform_get_drvdata(pdev);
> +
> +       mtk_hsdma_uninit(hsdma);
> +
> +       of_dma_controller_free(pdev->dev.of_node);
> +       dma_async_device_unregister(&hsdma->ddev);
> +
> +       return 0;
> +}
> +
> +static struct platform_driver mtk_hsdma_driver = {
> +       .probe = mtk_hsdma_probe,
> +       .remove = mtk_hsdma_remove,
> +       .driver = {
> +               .name = KBUILD_MODNAME,
> +               .of_match_table = mtk_hsdma_of_match,
> +       },
> +};
> +module_platform_driver(mtk_hsdma_driver);
> +
> +MODULE_AUTHOR("Michael Lee <igvtee@gmail.com>");
> +MODULE_DESCRIPTION("MTK HSDMA driver");
> +MODULE_LICENSE("GPL v2");
> --- a/drivers/staging/mt7621-dma/mtk-hsdma.c
> +++ /dev/null
> @@ -1,771 +0,0 @@
> -/*
> - *  Copyright (C) 2015, Michael Lee <igvtee@gmail.com>
> - *  MTK HSDMA support
> - *
> - *  This program is free software; you can redistribute it and/or modify it
> - *  under  the terms of the GNU General         Public License as published by the
> - *  Free Software Foundation;  either version 2 of the License, or (at your
> - *  option) any later version.
> - *
> - */
> -
> -#include <linux/dmaengine.h>
> -#include <linux/dma-mapping.h>
> -#include <linux/err.h>
> -#include <linux/init.h>
> -#include <linux/list.h>
> -#include <linux/module.h>
> -#include <linux/platform_device.h>
> -#include <linux/slab.h>
> -#include <linux/spinlock.h>
> -#include <linux/irq.h>
> -#include <linux/of_dma.h>
> -#include <linux/reset.h>
> -#include <linux/of_device.h>
> -
> -#include "virt-dma.h"
> -
> -#define HSDMA_BASE_OFFSET              0x800
> -
> -#define HSDMA_REG_TX_BASE              0x00
> -#define HSDMA_REG_TX_CNT               0x04
> -#define HSDMA_REG_TX_CTX               0x08
> -#define HSDMA_REG_TX_DTX               0x0c
> -#define HSDMA_REG_RX_BASE              0x100
> -#define HSDMA_REG_RX_CNT               0x104
> -#define HSDMA_REG_RX_CRX               0x108
> -#define HSDMA_REG_RX_DRX               0x10c
> -#define HSDMA_REG_INFO                 0x200
> -#define HSDMA_REG_GLO_CFG              0x204
> -#define HSDMA_REG_RST_CFG              0x208
> -#define HSDMA_REG_DELAY_INT            0x20c
> -#define HSDMA_REG_FREEQ_THRES          0x210
> -#define HSDMA_REG_INT_STATUS           0x220
> -#define HSDMA_REG_INT_MASK             0x228
> -#define HSDMA_REG_SCH_Q01              0x280
> -#define HSDMA_REG_SCH_Q23              0x284
> -
> -#define HSDMA_DESCS_MAX                        0xfff
> -#define HSDMA_DESCS_NUM                        8
> -#define HSDMA_DESCS_MASK               (HSDMA_DESCS_NUM - 1)
> -#define HSDMA_NEXT_DESC(x)             (((x) + 1) & HSDMA_DESCS_MASK)
> -
> -/* HSDMA_REG_INFO */
> -#define HSDMA_INFO_INDEX_MASK          0xf
> -#define HSDMA_INFO_INDEX_SHIFT         24
> -#define HSDMA_INFO_BASE_MASK           0xff
> -#define HSDMA_INFO_BASE_SHIFT          16
> -#define HSDMA_INFO_RX_MASK             0xff
> -#define HSDMA_INFO_RX_SHIFT            8
> -#define HSDMA_INFO_TX_MASK             0xff
> -#define HSDMA_INFO_TX_SHIFT            0
> -
> -/* HSDMA_REG_GLO_CFG */
> -#define HSDMA_GLO_TX_2B_OFFSET         BIT(31)
> -#define HSDMA_GLO_CLK_GATE             BIT(30)
> -#define HSDMA_GLO_BYTE_SWAP            BIT(29)
> -#define HSDMA_GLO_MULTI_DMA            BIT(10)
> -#define HSDMA_GLO_TWO_BUF              BIT(9)
> -#define HSDMA_GLO_32B_DESC             BIT(8)
> -#define HSDMA_GLO_BIG_ENDIAN           BIT(7)
> -#define HSDMA_GLO_TX_DONE              BIT(6)
> -#define HSDMA_GLO_BT_MASK              0x3
> -#define HSDMA_GLO_BT_SHIFT             4
> -#define HSDMA_GLO_RX_BUSY              BIT(3)
> -#define HSDMA_GLO_RX_DMA               BIT(2)
> -#define HSDMA_GLO_TX_BUSY              BIT(1)
> -#define HSDMA_GLO_TX_DMA               BIT(0)
> -
> -#define HSDMA_BT_SIZE_16BYTES          (0 << HSDMA_GLO_BT_SHIFT)
> -#define HSDMA_BT_SIZE_32BYTES          (1 << HSDMA_GLO_BT_SHIFT)
> -#define HSDMA_BT_SIZE_64BYTES          (2 << HSDMA_GLO_BT_SHIFT)
> -#define HSDMA_BT_SIZE_128BYTES         (3 << HSDMA_GLO_BT_SHIFT)
> -
> -#define HSDMA_GLO_DEFAULT              (HSDMA_GLO_MULTI_DMA | \
> -               HSDMA_GLO_RX_DMA | HSDMA_GLO_TX_DMA | HSDMA_BT_SIZE_32BYTES)
> -
> -/* HSDMA_REG_RST_CFG */
> -#define HSDMA_RST_RX_SHIFT             16
> -#define HSDMA_RST_TX_SHIFT             0
> -
> -/* HSDMA_REG_DELAY_INT */
> -#define HSDMA_DELAY_INT_EN             BIT(15)
> -#define HSDMA_DELAY_PEND_OFFSET                8
> -#define HSDMA_DELAY_TIME_OFFSET                0
> -#define HSDMA_DELAY_TX_OFFSET          16
> -#define HSDMA_DELAY_RX_OFFSET          0
> -
> -#define HSDMA_DELAY_INIT(x)            (HSDMA_DELAY_INT_EN | \
> -               ((x) << HSDMA_DELAY_PEND_OFFSET))
> -#define HSDMA_DELAY(x)                 ((HSDMA_DELAY_INIT(x) << \
> -               HSDMA_DELAY_TX_OFFSET) | HSDMA_DELAY_INIT(x))
> -
> -/* HSDMA_REG_INT_STATUS */
> -#define HSDMA_INT_DELAY_RX_COH         BIT(31)
> -#define HSDMA_INT_DELAY_RX_INT         BIT(30)
> -#define HSDMA_INT_DELAY_TX_COH         BIT(29)
> -#define HSDMA_INT_DELAY_TX_INT         BIT(28)
> -#define HSDMA_INT_RX_MASK              0x3
> -#define HSDMA_INT_RX_SHIFT             16
> -#define HSDMA_INT_RX_Q0                        BIT(16)
> -#define HSDMA_INT_TX_MASK              0xf
> -#define HSDMA_INT_TX_SHIFT             0
> -#define HSDMA_INT_TX_Q0                        BIT(0)
> -
> -/* tx/rx dma desc flags */
> -#define HSDMA_PLEN_MASK                        0x3fff
> -#define HSDMA_DESC_DONE                        BIT(31)
> -#define HSDMA_DESC_LS0                 BIT(30)
> -#define HSDMA_DESC_PLEN0(_x)           (((_x) & HSDMA_PLEN_MASK) << 16)
> -#define HSDMA_DESC_TAG                 BIT(15)
> -#define HSDMA_DESC_LS1                 BIT(14)
> -#define HSDMA_DESC_PLEN1(_x)           ((_x) & HSDMA_PLEN_MASK)
> -
> -/* align 4 bytes */
> -#define HSDMA_ALIGN_SIZE               3
> -/* align size 128bytes */
> -#define HSDMA_MAX_PLEN                 0x3f80
> -
> -struct hsdma_desc {
> -       u32 addr0;
> -       u32 flags;
> -       u32 addr1;
> -       u32 unused;
> -};
> -
> -struct mtk_hsdma_sg {
> -       dma_addr_t src_addr;
> -       dma_addr_t dst_addr;
> -       u32 len;
> -};
> -
> -struct mtk_hsdma_desc {
> -       struct virt_dma_desc vdesc;
> -       unsigned int num_sgs;
> -       struct mtk_hsdma_sg sg[1];
> -};
> -
> -struct mtk_hsdma_chan {
> -       struct virt_dma_chan vchan;
> -       unsigned int id;
> -       dma_addr_t desc_addr;
> -       int tx_idx;
> -       int rx_idx;
> -       struct hsdma_desc *tx_ring;
> -       struct hsdma_desc *rx_ring;
> -       struct mtk_hsdma_desc *desc;
> -       unsigned int next_sg;
> -};
> -
> -struct mtk_hsdam_engine {
> -       struct dma_device ddev;
> -       struct device_dma_parameters dma_parms;
> -       void __iomem *base;
> -       struct tasklet_struct task;
> -       volatile unsigned long chan_issued;
> -
> -       struct mtk_hsdma_chan chan[1];
> -};
> -
> -static inline struct mtk_hsdam_engine *mtk_hsdma_chan_get_dev(
> -               struct mtk_hsdma_chan *chan)
> -{
> -       return container_of(chan->vchan.chan.device, struct mtk_hsdam_engine,
> -                       ddev);
> -}
> -
> -static inline struct mtk_hsdma_chan *to_mtk_hsdma_chan(struct dma_chan *c)
> -{
> -       return container_of(c, struct mtk_hsdma_chan, vchan.chan);
> -}
> -
> -static inline struct mtk_hsdma_desc *to_mtk_hsdma_desc(
> -               struct virt_dma_desc *vdesc)
> -{
> -       return container_of(vdesc, struct mtk_hsdma_desc, vdesc);
> -}
> -
> -static inline u32 mtk_hsdma_read(struct mtk_hsdam_engine *hsdma, u32 reg)
> -{
> -       return readl(hsdma->base + reg);
> -}
> -
> -static inline void mtk_hsdma_write(struct mtk_hsdam_engine *hsdma,
> -                                  unsigned reg, u32 val)
> -{
> -       writel(val, hsdma->base + reg);
> -}
> -
> -static void mtk_hsdma_reset_chan(struct mtk_hsdam_engine *hsdma,
> -                                struct mtk_hsdma_chan *chan)
> -{
> -       chan->tx_idx = 0;
> -       chan->rx_idx = HSDMA_DESCS_NUM - 1;
> -
> -       mtk_hsdma_write(hsdma, HSDMA_REG_TX_CTX, chan->tx_idx);
> -       mtk_hsdma_write(hsdma, HSDMA_REG_RX_CRX, chan->rx_idx);
> -
> -       mtk_hsdma_write(hsdma, HSDMA_REG_RST_CFG,
> -                       0x1 << (chan->id + HSDMA_RST_TX_SHIFT));
> -       mtk_hsdma_write(hsdma, HSDMA_REG_RST_CFG,
> -                       0x1 << (chan->id + HSDMA_RST_RX_SHIFT));
> -}
> -
> -static void hsdma_dump_reg(struct mtk_hsdam_engine *hsdma)
> -{
> -       dev_dbg(hsdma->ddev.dev, "tbase %08x, tcnt %08x, " \
> -                       "tctx %08x, tdtx: %08x, rbase %08x, " \
> -                       "rcnt %08x, rctx %08x, rdtx %08x\n",
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_TX_BASE),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_TX_CNT),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_TX_CTX),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_TX_DTX),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_RX_BASE),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_RX_CNT),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_RX_CRX),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_RX_DRX));
> -
> -       dev_dbg(hsdma->ddev.dev, "info %08x, glo %08x, delay %08x, " \
> -                       "intr_stat %08x, intr_mask %08x\n",
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_INFO),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_GLO_CFG),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_DELAY_INT),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_INT_STATUS),
> -                       mtk_hsdma_read(hsdma, HSDMA_REG_INT_MASK));
> -}
> -
> -static void hsdma_dump_desc(struct mtk_hsdam_engine *hsdma,
> -                           struct mtk_hsdma_chan *chan)
> -{
> -       struct hsdma_desc *tx_desc;
> -       struct hsdma_desc *rx_desc;
> -       int i;
> -
> -       dev_dbg(hsdma->ddev.dev, "tx idx: %d, rx idx: %d\n",
> -                       chan->tx_idx, chan->rx_idx);
> -
> -       for (i = 0; i < HSDMA_DESCS_NUM; i++) {
> -               tx_desc = &chan->tx_ring[i];
> -               rx_desc = &chan->rx_ring[i];
> -
> -               dev_dbg(hsdma->ddev.dev, "%d tx addr0: %08x, flags %08x, " \
> -                               "tx addr1: %08x, rx addr0 %08x, flags %08x\n",
> -                               i, tx_desc->addr0, tx_desc->flags, \
> -                               tx_desc->addr1, rx_desc->addr0, rx_desc->flags);
> -       }
> -}
> -
> -static void mtk_hsdma_reset(struct mtk_hsdam_engine *hsdma,
> -                           struct mtk_hsdma_chan *chan)
> -{
> -       int i;
> -
> -       /* disable dma */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_GLO_CFG, 0);
> -
> -       /* disable intr */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_INT_MASK, 0);
> -
> -       /* init desc value */
> -       for (i = 0; i < HSDMA_DESCS_NUM; i++) {
> -               chan->tx_ring[i].addr0 = 0;
> -               chan->tx_ring[i].flags = HSDMA_DESC_LS0 |
> -                       HSDMA_DESC_DONE;
> -       }
> -       for (i = 0; i < HSDMA_DESCS_NUM; i++) {
> -               chan->rx_ring[i].addr0 = 0;
> -               chan->rx_ring[i].flags = 0;
> -       }
> -
> -       /* reset */
> -       mtk_hsdma_reset_chan(hsdma, chan);
> -
> -       /* enable intr */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_INT_MASK, HSDMA_INT_RX_Q0);
> -
> -       /* enable dma */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_GLO_CFG, HSDMA_GLO_DEFAULT);
> -}
> -
> -static int mtk_hsdma_terminate_all(struct dma_chan *c)
> -{
> -       struct mtk_hsdma_chan *chan = to_mtk_hsdma_chan(c);
> -       struct mtk_hsdam_engine *hsdma = mtk_hsdma_chan_get_dev(chan);
> -       unsigned long timeout;
> -       LIST_HEAD(head);
> -
> -       spin_lock_bh(&chan->vchan.lock);
> -       chan->desc = NULL;
> -       clear_bit(chan->id, &hsdma->chan_issued);
> -       vchan_get_all_descriptors(&chan->vchan, &head);
> -       spin_unlock_bh(&chan->vchan.lock);
> -
> -       vchan_dma_desc_free_list(&chan->vchan, &head);
> -
> -       /* wait dma transfer complete */
> -       timeout = jiffies + msecs_to_jiffies(2000);
> -       while (mtk_hsdma_read(hsdma, HSDMA_REG_GLO_CFG) &
> -                       (HSDMA_GLO_RX_BUSY | HSDMA_GLO_TX_BUSY)) {
> -               if (time_after_eq(jiffies, timeout)) {
> -                       hsdma_dump_desc(hsdma, chan);
> -                       mtk_hsdma_reset(hsdma, chan);
> -                       dev_err(hsdma->ddev.dev, "timeout, reset it\n");
> -                       break;
> -               }
> -               cpu_relax();
> -       }
> -
> -       return 0;
> -}
> -
> -static int mtk_hsdma_start_transfer(struct mtk_hsdam_engine *hsdma,
> -                                   struct mtk_hsdma_chan *chan)
> -{
> -       dma_addr_t src, dst;
> -       size_t len, tlen;
> -       struct hsdma_desc *tx_desc, *rx_desc;
> -       struct mtk_hsdma_sg *sg;
> -       unsigned int i;
> -       int rx_idx;
> -
> -       sg = &chan->desc->sg[0];
> -       len = sg->len;
> -       chan->desc->num_sgs = DIV_ROUND_UP(len, HSDMA_MAX_PLEN);
> -
> -       /* tx desc */
> -       src = sg->src_addr;
> -       for (i = 0; i < chan->desc->num_sgs; i++) {
> -               tx_desc = &chan->tx_ring[chan->tx_idx];
> -
> -               if (len > HSDMA_MAX_PLEN)
> -                       tlen = HSDMA_MAX_PLEN;
> -               else
> -                       tlen = len;
> -
> -               if (i & 0x1) {
> -                       tx_desc->addr1 = src;
> -                       tx_desc->flags |= HSDMA_DESC_PLEN1(tlen);
> -               } else {
> -                       tx_desc->addr0 = src;
> -                       tx_desc->flags = HSDMA_DESC_PLEN0(tlen);
> -
> -                       /* update index */
> -                       chan->tx_idx = HSDMA_NEXT_DESC(chan->tx_idx);
> -               }
> -
> -               src += tlen;
> -               len -= tlen;
> -       }
> -       if (i & 0x1)
> -               tx_desc->flags |= HSDMA_DESC_LS0;
> -       else
> -               tx_desc->flags |= HSDMA_DESC_LS1;
> -
> -       /* rx desc */
> -       rx_idx = HSDMA_NEXT_DESC(chan->rx_idx);
> -       len = sg->len;
> -       dst = sg->dst_addr;
> -       for (i = 0; i < chan->desc->num_sgs; i++) {
> -               rx_desc = &chan->rx_ring[rx_idx];
> -               if (len > HSDMA_MAX_PLEN)
> -                       tlen = HSDMA_MAX_PLEN;
> -               else
> -                       tlen = len;
> -
> -               rx_desc->addr0 = dst;
> -               rx_desc->flags = HSDMA_DESC_PLEN0(tlen);
> -
> -               dst += tlen;
> -               len -= tlen;
> -
> -               /* update index */
> -               rx_idx = HSDMA_NEXT_DESC(rx_idx);
> -       }
> -
> -       /* make sure desc and index all up to date */
> -       wmb();
> -       mtk_hsdma_write(hsdma, HSDMA_REG_TX_CTX, chan->tx_idx);
> -
> -       return 0;
> -}
> -
> -static int gdma_next_desc(struct mtk_hsdma_chan *chan)
> -{
> -       struct virt_dma_desc *vdesc;
> -
> -       vdesc = vchan_next_desc(&chan->vchan);
> -       if (!vdesc) {
> -               chan->desc = NULL;
> -               return 0;
> -       }
> -       chan->desc = to_mtk_hsdma_desc(vdesc);
> -       chan->next_sg = 0;
> -
> -       return 1;
> -}
> -
> -static void mtk_hsdma_chan_done(struct mtk_hsdam_engine *hsdma,
> -                               struct mtk_hsdma_chan *chan)
> -{
> -       struct mtk_hsdma_desc *desc;
> -       int chan_issued;
> -
> -       chan_issued = 0;
> -       spin_lock_bh(&chan->vchan.lock);
> -       desc = chan->desc;
> -       if (likely(desc)) {
> -               if (chan->next_sg == desc->num_sgs) {
> -                       list_del(&desc->vdesc.node);
> -                       vchan_cookie_complete(&desc->vdesc);
> -                       chan_issued = gdma_next_desc(chan);
> -               }
> -       } else
> -               dev_dbg(hsdma->ddev.dev, "no desc to complete\n");
> -
> -       if (chan_issued)
> -               set_bit(chan->id, &hsdma->chan_issued);
> -       spin_unlock_bh(&chan->vchan.lock);
> -}
> -
> -static irqreturn_t mtk_hsdma_irq(int irq, void *devid)
> -{
> -       struct mtk_hsdam_engine *hsdma = devid;
> -       u32 status;
> -
> -       status = mtk_hsdma_read(hsdma, HSDMA_REG_INT_STATUS);
> -       if (unlikely(!status))
> -               return IRQ_NONE;
> -
> -       if (likely(status & HSDMA_INT_RX_Q0))
> -               tasklet_schedule(&hsdma->task);
> -       else
> -               dev_dbg(hsdma->ddev.dev, "unhandle irq status %08x\n",
> -                       status);
> -       /* clean intr bits */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_INT_STATUS, status);
> -
> -       return IRQ_HANDLED;
> -}
> -
> -static void mtk_hsdma_issue_pending(struct dma_chan *c)
> -{
> -       struct mtk_hsdma_chan *chan = to_mtk_hsdma_chan(c);
> -       struct mtk_hsdam_engine *hsdma = mtk_hsdma_chan_get_dev(chan);
> -
> -       spin_lock_bh(&chan->vchan.lock);
> -       if (vchan_issue_pending(&chan->vchan) && !chan->desc) {
> -               if (gdma_next_desc(chan)) {
> -                       set_bit(chan->id, &hsdma->chan_issued);
> -                       tasklet_schedule(&hsdma->task);
> -               } else
> -                       dev_dbg(hsdma->ddev.dev, "no desc to issue\n");
> -       }
> -       spin_unlock_bh(&chan->vchan.lock);
> -}
> -
> -static struct dma_async_tx_descriptor *mtk_hsdma_prep_dma_memcpy(
> -               struct dma_chan *c, dma_addr_t dest, dma_addr_t src,
> -               size_t len, unsigned long flags)
> -{
> -       struct mtk_hsdma_chan *chan = to_mtk_hsdma_chan(c);
> -       struct mtk_hsdma_desc *desc;
> -
> -       if (len <= 0)
> -               return NULL;
> -
> -       desc = kzalloc(sizeof(struct mtk_hsdma_desc), GFP_ATOMIC);
> -       if (!desc) {
> -               dev_err(c->device->dev, "alloc memcpy decs error\n");
> -               return NULL;
> -       }
> -
> -       desc->sg[0].src_addr = src;
> -       desc->sg[0].dst_addr = dest;
> -       desc->sg[0].len = len;
> -
> -       return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags);
> -}
> -
> -static enum dma_status mtk_hsdma_tx_status(struct dma_chan *c,
> -                                          dma_cookie_t cookie,
> -                                          struct dma_tx_state *state)
> -{
> -       return dma_cookie_status(c, cookie, state);
> -}
> -
> -static void mtk_hsdma_free_chan_resources(struct dma_chan *c)
> -{
> -       vchan_free_chan_resources(to_virt_chan(c));
> -}
> -
> -static void mtk_hsdma_desc_free(struct virt_dma_desc *vdesc)
> -{
> -       kfree(container_of(vdesc, struct mtk_hsdma_desc, vdesc));
> -}
> -
> -static void mtk_hsdma_tx(struct mtk_hsdam_engine *hsdma)
> -{
> -       struct mtk_hsdma_chan *chan;
> -
> -       if (test_and_clear_bit(0, &hsdma->chan_issued)) {
> -               chan = &hsdma->chan[0];
> -               if (chan->desc)
> -                       mtk_hsdma_start_transfer(hsdma, chan);
> -               else
> -                       dev_dbg(hsdma->ddev.dev, "chan 0 no desc to issue\n");
> -       }
> -}
> -
> -static void mtk_hsdma_rx(struct mtk_hsdam_engine *hsdma)
> -{
> -       struct mtk_hsdma_chan *chan;
> -       int next_idx, drx_idx, cnt;
> -
> -       chan = &hsdma->chan[0];
> -       next_idx = HSDMA_NEXT_DESC(chan->rx_idx);
> -       drx_idx = mtk_hsdma_read(hsdma, HSDMA_REG_RX_DRX);
> -
> -       cnt = (drx_idx - next_idx) & HSDMA_DESCS_MASK;
> -       if (!cnt)
> -               return;
> -
> -       chan->next_sg += cnt;
> -       chan->rx_idx = (chan->rx_idx + cnt) & HSDMA_DESCS_MASK;
> -
> -       /* update rx crx */
> -       wmb();
> -       mtk_hsdma_write(hsdma, HSDMA_REG_RX_CRX, chan->rx_idx);
> -
> -       mtk_hsdma_chan_done(hsdma, chan);
> -}
> -
> -static void mtk_hsdma_tasklet(unsigned long arg)
> -{
> -       struct mtk_hsdam_engine *hsdma = (struct mtk_hsdam_engine *)arg;
> -
> -       mtk_hsdma_rx(hsdma);
> -       mtk_hsdma_tx(hsdma);
> -}
> -
> -static int mtk_hsdam_alloc_desc(struct mtk_hsdam_engine *hsdma,
> -                               struct mtk_hsdma_chan *chan)
> -{
> -       int i;
> -
> -       chan->tx_ring = dma_alloc_coherent(hsdma->ddev.dev,
> -                       2 * HSDMA_DESCS_NUM * sizeof(*chan->tx_ring),
> -                       &chan->desc_addr, GFP_ATOMIC | __GFP_ZERO);
> -       if (!chan->tx_ring)
> -               goto no_mem;
> -
> -       chan->rx_ring = &chan->tx_ring[HSDMA_DESCS_NUM];
> -
> -       /* init tx ring value */
> -       for (i = 0; i < HSDMA_DESCS_NUM; i++)
> -               chan->tx_ring[i].flags = HSDMA_DESC_LS0 | HSDMA_DESC_DONE;
> -
> -       return 0;
> -no_mem:
> -       return -ENOMEM;
> -}
> -
> -static void mtk_hsdam_free_desc(struct mtk_hsdam_engine *hsdma,
> -                               struct mtk_hsdma_chan *chan)
> -{
> -       if (chan->tx_ring) {
> -               dma_free_coherent(hsdma->ddev.dev,
> -                               2 * HSDMA_DESCS_NUM * sizeof(*chan->tx_ring),
> -                               chan->tx_ring, chan->desc_addr);
> -               chan->tx_ring = NULL;
> -               chan->rx_ring = NULL;
> -       }
> -}
> -
> -static int mtk_hsdma_init(struct mtk_hsdam_engine *hsdma)
> -{
> -       struct mtk_hsdma_chan *chan;
> -       int ret;
> -       u32 reg;
> -
> -       /* init desc */
> -       chan = &hsdma->chan[0];
> -       ret = mtk_hsdam_alloc_desc(hsdma, chan);
> -       if (ret)
> -               return ret;
> -
> -       /* tx */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_TX_BASE, chan->desc_addr);
> -       mtk_hsdma_write(hsdma, HSDMA_REG_TX_CNT, HSDMA_DESCS_NUM);
> -       /* rx */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_RX_BASE, chan->desc_addr +
> -                       (sizeof(struct hsdma_desc) * HSDMA_DESCS_NUM));
> -       mtk_hsdma_write(hsdma, HSDMA_REG_RX_CNT, HSDMA_DESCS_NUM);
> -       /* reset */
> -       mtk_hsdma_reset_chan(hsdma, chan);
> -
> -       /* enable rx intr */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_INT_MASK, HSDMA_INT_RX_Q0);
> -
> -       /* enable dma */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_GLO_CFG, HSDMA_GLO_DEFAULT);
> -
> -       /* hardware info */
> -       reg = mtk_hsdma_read(hsdma, HSDMA_REG_INFO);
> -       dev_info(hsdma->ddev.dev, "rx: %d, tx: %d\n",
> -                (reg >> HSDMA_INFO_RX_SHIFT) & HSDMA_INFO_RX_MASK,
> -                (reg >> HSDMA_INFO_TX_SHIFT) & HSDMA_INFO_TX_MASK);
> -
> -       hsdma_dump_reg(hsdma);
> -
> -       return ret;
> -}
> -
> -static void mtk_hsdma_uninit(struct mtk_hsdam_engine *hsdma)
> -{
> -       struct mtk_hsdma_chan *chan;
> -
> -       /* disable dma */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_GLO_CFG, 0);
> -
> -       /* disable intr */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_INT_MASK, 0);
> -
> -       /* free desc */
> -       chan = &hsdma->chan[0];
> -       mtk_hsdam_free_desc(hsdma, chan);
> -
> -       /* tx */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_TX_BASE, 0);
> -       mtk_hsdma_write(hsdma, HSDMA_REG_TX_CNT, 0);
> -       /* rx */
> -       mtk_hsdma_write(hsdma, HSDMA_REG_RX_BASE, 0);
> -       mtk_hsdma_write(hsdma, HSDMA_REG_RX_CNT, 0);
> -       /* reset */
> -       mtk_hsdma_reset_chan(hsdma, chan);
> -}
> -
> -static const struct of_device_id mtk_hsdma_of_match[] = {
> -       { .compatible = "mediatek,mt7621-hsdma" },
> -       { },
> -};
> -
> -static int mtk_hsdma_probe(struct platform_device *pdev)
> -{
> -       const struct of_device_id *match;
> -       struct mtk_hsdma_chan *chan;
> -       struct mtk_hsdam_engine *hsdma;
> -       struct dma_device *dd;
> -       struct resource *res;
> -       int ret;
> -       int irq;
> -       void __iomem *base;
> -
> -       ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
> -       if (ret)
> -               return ret;
> -
> -       match = of_match_device(mtk_hsdma_of_match, &pdev->dev);
> -       if (!match)
> -               return -EINVAL;
> -
> -       hsdma = devm_kzalloc(&pdev->dev, sizeof(*hsdma), GFP_KERNEL);
> -       if (!hsdma) {
> -               dev_err(&pdev->dev, "alloc dma device failed\n");
> -               return -EINVAL;
> -       }
> -
> -       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> -       base = devm_ioremap_resource(&pdev->dev, res);
> -       if (IS_ERR(base))
> -               return PTR_ERR(base);
> -       hsdma->base = base + HSDMA_BASE_OFFSET;
> -       tasklet_init(&hsdma->task, mtk_hsdma_tasklet, (unsigned long)hsdma);
> -
> -       irq = platform_get_irq(pdev, 0);
> -       if (irq < 0) {
> -               dev_err(&pdev->dev, "failed to get irq\n");
> -               return -EINVAL;
> -       }
> -       ret = devm_request_irq(&pdev->dev, irq, mtk_hsdma_irq,
> -                              0, dev_name(&pdev->dev), hsdma);
> -       if (ret) {
> -               dev_err(&pdev->dev, "failed to request irq\n");
> -               return ret;
> -       }
> -
> -       device_reset(&pdev->dev);
> -
> -       dd = &hsdma->ddev;
> -       dma_cap_set(DMA_MEMCPY, dd->cap_mask);
> -       dd->copy_align = HSDMA_ALIGN_SIZE;
> -       dd->device_free_chan_resources = mtk_hsdma_free_chan_resources;
> -       dd->device_prep_dma_memcpy = mtk_hsdma_prep_dma_memcpy;
> -       dd->device_terminate_all = mtk_hsdma_terminate_all;
> -       dd->device_tx_status = mtk_hsdma_tx_status;
> -       dd->device_issue_pending = mtk_hsdma_issue_pending;
> -       dd->dev = &pdev->dev;
> -       dd->dev->dma_parms = &hsdma->dma_parms;
> -       dma_set_max_seg_size(dd->dev, HSDMA_MAX_PLEN);
> -       INIT_LIST_HEAD(&dd->channels);
> -
> -       chan = &hsdma->chan[0];
> -       chan->id = 0;
> -       chan->vchan.desc_free = mtk_hsdma_desc_free;
> -       vchan_init(&chan->vchan, dd);
> -
> -       /* init hardware */
> -       ret = mtk_hsdma_init(hsdma);
> -       if (ret) {
> -               dev_err(&pdev->dev, "failed to alloc ring descs\n");
> -               return ret;
> -       }
> -
> -       ret = dma_async_device_register(dd);
> -       if (ret) {
> -               dev_err(&pdev->dev, "failed to register dma device\n");
> -               goto err_uninit_hsdma;
> -       }
> -
> -       ret = of_dma_controller_register(pdev->dev.of_node,
> -                                        of_dma_xlate_by_chan_id, hsdma);
> -       if (ret) {
> -               dev_err(&pdev->dev, "failed to register of dma controller\n");
> -               goto err_unregister;
> -       }
> -
> -       platform_set_drvdata(pdev, hsdma);
> -
> -       return 0;
> -
> -err_unregister:
> -       dma_async_device_unregister(dd);
> -err_uninit_hsdma:
> -       mtk_hsdma_uninit(hsdma);
> -       return ret;
> -}
> -
> -static int mtk_hsdma_remove(struct platform_device *pdev)
> -{
> -       struct mtk_hsdam_engine *hsdma = platform_get_drvdata(pdev);
> -
> -       mtk_hsdma_uninit(hsdma);
> -
> -       of_dma_controller_free(pdev->dev.of_node);
> -       dma_async_device_unregister(&hsdma->ddev);
> -
> -       return 0;
> -}
> -
> -static struct platform_driver mtk_hsdma_driver = {
> -       .probe = mtk_hsdma_probe,
> -       .remove = mtk_hsdma_remove,
> -       .driver = {
> -               .name = "hsdma-mt7621",
> -               .of_match_table = mtk_hsdma_of_match,
> -       },
> -};
> -module_platform_driver(mtk_hsdma_driver);
> -
> -MODULE_AUTHOR("Michael Lee <igvtee@gmail.com>");
> -MODULE_DESCRIPTION("MTK HSDMA driver");
> -MODULE_LICENSE("GPL v2");
>
>

  reply	other threads:[~2021-03-01 22:42 UTC|newest]

Thread overview: 277+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-01 16:10 [PATCH 4.19 000/247] 4.19.178-rc1 review Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 001/247] HID: make arrays usage and value to be the same Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 002/247] USB: quirks: sort quirk entries Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 003/247] usb: quirks: add quirk to start video capture on ELMO L-12F document camera reliable Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 004/247] ntfs: check for valid standard information attribute Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 005/247] arm64: tegra: Add power-domain for Tegra210 HDA Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 006/247] scripts: use pkg-config to locate libcrypto Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 007/247] scripts: set proper OpenSSL include dir also for sign-file Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 008/247] block: add helper for checking if queue is registered Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 009/247] block: split .sysfs_lock into two locks Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 010/247] block: fix race between switching elevator and removing queues Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 011/247] block: dont release queues sysfs lock during switching elevator Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 012/247] NET: usb: qmi_wwan: Adding support for Cinterion MV31 Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 013/247] cifs: Set CIFS_MOUNT_USE_PREFIX_PATH flag on setting cifs_sb->prepath Greg Kroah-Hartman
2021-04-06 11:38   ` Salvatore Bonaccorso
2021-04-06 13:41     ` Greg Kroah-Hartman
2021-04-06 14:00       ` [EXTERNAL] " Shyam Prasad
2021-04-06 15:01         ` Salvatore Bonaccorso
2021-04-08 11:41           ` Salvatore Bonaccorso
2021-04-12  8:01             ` Greg Kroah-Hartman
2021-04-18 12:41               ` Salvatore Bonaccorso
2021-04-19  5:48                 ` Shyam Prasad
2021-04-19 13:22                   ` Salvatore Bonaccorso
2021-04-19 13:43                     ` Shyam Prasad
2021-04-19 14:16                     ` Paulo Alcantara
2021-04-19 17:09                   ` Salvatore Bonaccorso
2021-04-22 15:36                     ` Shyam Prasad
2021-04-23  7:42                       ` Greg Kroah-Hartman
2021-05-08 13:22                         ` Salvatore Bonaccorso
2021-05-09 10:16                           ` Shyam Prasad
2021-05-10  7:46                             ` Greg Kroah-Hartman
2021-04-21  7:09                   ` Santiago Garcia Mantinan
2021-04-19 14:15                 ` Paulo Alcantara
2021-03-01 16:10 ` [PATCH 4.19 014/247] scripts/recordmcount.pl: support big endian for ARCH sh Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 015/247] jump_label/lockdep: Assert we hold the hotplug lock for _cpuslocked() operations Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 016/247] locking/static_key: Fix false positive warnings on concurrent dec/inc Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 017/247] vmlinux.lds.h: add DWARF v5 sections Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 018/247] kdb: Make memory allocations more robust Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 019/247] PCI: qcom: Use PHY_REFCLK_USE_PAD only for ipq8064 Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 020/247] bfq: Avoid false bfq queue merging Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 021/247] ALSA: usb-audio: Fix PCM buffer allocation in non-vmalloc mode Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 022/247] MIPS: vmlinux.lds.S: add missing PAGE_ALIGNED_DATA() section Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 023/247] random: fix the RNDRESEEDCRNG ioctl Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 024/247] ath10k: Fix error handling in case of CE pipe init failure Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 025/247] Bluetooth: btqcomsmd: Fix a resource leak in error handling paths in the probe function Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 026/247] Bluetooth: Fix initializing response id after clearing struct Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 027/247] ARM: dts: exynos: correct PMIC interrupt trigger level on Artik 5 Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 028/247] ARM: dts: exynos: correct PMIC interrupt trigger level on Monk Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 029/247] ARM: dts: exynos: correct PMIC interrupt trigger level on Rinato Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 030/247] ARM: dts: exynos: correct PMIC interrupt trigger level on Spring Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 031/247] ARM: dts: exynos: correct PMIC interrupt trigger level on Arndale Octa Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 032/247] ARM: dts: exynos: correct PMIC interrupt trigger level on Odroid XU3 family Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 033/247] arm64: dts: exynos: correct PMIC interrupt trigger level on TM2 Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 034/247] arm64: dts: exynos: correct PMIC interrupt trigger level on Espresso Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 035/247] bpf: Avoid warning when re-casting __bpf_call_base into __bpf_call_base_args Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 036/247] arm64: dts: allwinner: A64: properly connect USB PHY to port 0 Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 037/247] arm64: dts: allwinner: Drop non-removable from SoPine/LTS SD card Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 038/247] arm64: dts: allwinner: A64: Limit MMC2 bus frequency to 150 MHz Greg Kroah-Hartman
2021-03-01 16:10 ` [PATCH 4.19 039/247] cpufreq: brcmstb-avs-cpufreq: Free resources in error path Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 040/247] cpufreq: brcmstb-avs-cpufreq: Fix resource leaks in ->remove() Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 041/247] ACPICA: Fix exception code class checks Greg Kroah-Hartman
2022-03-02 15:52   ` Moore, Robert
2021-03-01 16:11 ` [PATCH 4.19 042/247] usb: gadget: u_audio: Free requests only after callback Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 043/247] Bluetooth: drop HCI device reference before return Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 044/247] Bluetooth: Put HCI device if inquiry procedure interrupts Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 045/247] memory: ti-aemif: Drop child node when jumping out loop Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 046/247] ARM: dts: Configure missing thermal interrupt for 4430 Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 047/247] usb: dwc2: Do not update data length if it is 0 on inbound transfers Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 048/247] usb: dwc2: Abort transaction after errors with unknown reason Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 049/247] usb: dwc2: Make "trimming xfer length" a debug message Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 050/247] staging: rtl8723bs: wifi_regd.c: Fix incorrect number of regulatory rules Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 051/247] ARM: dts: armada388-helios4: assign pinctrl to LEDs Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 052/247] ARM: dts: armada388-helios4: assign pinctrl to each fan Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 053/247] arm64: dts: msm8916: Fix reserved and rfsa nodes unit address Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 054/247] ARM: s3c: fix fiq for clang IAS Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 055/247] soc: aspeed: snoop: Add clock control logic Greg Kroah-Hartman
2021-03-01 22:44   ` Joel Stanley
2021-03-02  0:09     ` Yoo, Jae Hyun
2021-03-04  8:12       ` Greg Kroah-Hartman
2021-03-04  9:52         ` Joel Stanley
2021-03-01 16:11 ` [PATCH 4.19 056/247] bpf_lru_list: Read double-checked variable once without lock Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 057/247] ath9k: fix data bus crash when setting nf_override via debugfs Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 058/247] ibmvnic: Set to CLOSED state even on error Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 059/247] bnxt_en: reverse order of TX disable and carrier off Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 060/247] xen/netback: fix spurious event detection for common event case Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 061/247] mac80211: fix potential overflow when multiplying to u32 integers Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 062/247] bpf: Fix bpf_fib_lookup helper MTU check for SKB ctx Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 063/247] tcp: fix SO_RCVLOWAT related hangs under mem pressure Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 064/247] cxgb4/chtls/cxgbit: Keeping the max ofld immediate data size same in cxgb4 and ulds Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 065/247] b43: N-PHY: Fix the update of coef for the PHY revision >= 3case Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 066/247] ibmvnic: add memory barrier to protect long term buffer Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 067/247] ibmvnic: skip send_request_unmap for timeout reset Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 068/247] net: amd-xgbe: Reset the PHY rx data path when mailbox command timeout Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 069/247] net: amd-xgbe: Fix NETDEV WATCHDOG transmit queue timeout warning Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 070/247] net: amd-xgbe: Reset link when the link never comes back Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 071/247] net: amd-xgbe: Fix network fluctuations when using 1G BELFUSE SFP Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 072/247] net: mvneta: Remove per-cpu queue mapping for Armada 3700 Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 073/247] fbdev: aty: SPARC64 requires FB_ATY_CT Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 074/247] drm/gma500: Fix error return code in psb_driver_load() Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 075/247] gma500: clean up error handling in init Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 076/247] crypto: sun4i-ss - fix kmap usage Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 077/247] drm/amdgpu: Fix macro name _AMDGPU_TRACE_H_ in preprocessor if condition Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 078/247] MIPS: c-r4k: Fix section mismatch for loongson2_sc_init Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 079/247] MIPS: lantiq: Explicitly compare LTQ_EBU_PCC_ISTAT against 0 Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 080/247] media: i2c: ov5670: Fix PIXEL_RATE minimum value Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 081/247] media: camss: missing error code in msm_video_register() Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 082/247] media: vsp1: Fix an error handling path in the probe function Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 083/247] media: em28xx: Fix use-after-free in em28xx_alloc_urbs Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 084/247] media: media/pci: Fix memleak in empress_init Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 085/247] media: tm6000: Fix memleak in tm6000_start_stream Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 086/247] ASoC: cs42l56: fix up error handling in probe Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 087/247] crypto: bcm - Rename struct device_private to bcm_device_private Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 088/247] drm/amd/display: Fix 10/12 bpc setup in DCE output bit depth reduction Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 089/247] media: lmedm04: Fix misuse of comma Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 090/247] media: qm1d1c0042: fix error return code in qm1d1c0042_init() Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 091/247] media: cx25821: Fix a bug when reallocating some dma memory Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 092/247] media: pxa_camera: declare variable when DEBUG is defined Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 093/247] media: uvcvideo: Accept invalid bFormatIndex and bFrameIndex values Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 094/247] crypto: talitos - Work around SEC6 ERRATA (AES-CTR mode data size error) Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 095/247] ata: ahci_brcm: Add back regulators management Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 096/247] ASoC: cpcap: fix microphone timeslot mask Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 097/247] f2fs: fix to avoid inconsistent quota data Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 098/247] drm/amdgpu: Prevent shift wrapping in amdgpu_read_mask() Greg Kroah-Hartman
2021-03-01 16:11 ` [PATCH 4.19 099/247] Drivers: hv: vmbus: Avoid use-after-free in vmbus_onoffer_rescind() Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 100/247] btrfs: clarify error returns values in __load_free_space_cache Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 101/247] hwrng: timeriomem - Fix cooldown period calculation Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 102/247] crypto: ecdh_helper - Ensure len >= secret.len in decode_key() Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 103/247] ima: Free IMA measurement buffer on error Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 104/247] ima: Free IMA measurement buffer after kexec syscall Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 105/247] fs/jfs: fix potential integer overflow on shift of a int Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 106/247] jffs2: fix use after free in jffs2_sum_write_data() Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 107/247] capabilities: Dont allow writing ambiguous v3 file capabilities Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 108/247] clk: meson: clk-pll: fix initializing the old rate (fallback) for a PLL Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 109/247] quota: Fix memory leak when handling corrupted quota file Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 110/247] spi: cadence-quadspi: Abort read if dummy cycles required are too many Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 111/247] clk: sunxi-ng: h6: Fix CEC clock Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 112/247] HID: core: detect and skip invalid inputs to snto32() Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 113/247] dmaengine: fsldma: Fix a resource leak in the remove function Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 114/247] dmaengine: fsldma: Fix a resource leak in an error handling path of the probe function Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 115/247] dmaengine: owl-dma: Fix a resource leak in the remove function Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 116/247] dmaengine: hsu: disable spurious interrupt Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 117/247] mfd: bd9571mwv: Use devm_mfd_add_devices() Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 118/247] fdt: Properly handle "no-map" field in the memory region Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 119/247] of/fdt: Make sure no-map does not remove already reserved regions Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 120/247] power: reset: at91-sama5d2_shdwc: fix wkupdbc mask Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 121/247] rtc: s5m: select REGMAP_I2C Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 122/247] clocksource/drivers/mxs_timer: Add missing semicolon when DEBUG is defined Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 123/247] RDMA/mlx5: Use the correct obj_id upon DEVX TIR creation Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 124/247] clk: sunxi-ng: h6: Fix clock divider range on some clocks Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 125/247] regulator: axp20x: Fix reference cout leak Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 126/247] certs: Fix blacklist flag type confusion Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 127/247] spi: atmel: Put allocated master before return Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 128/247] regulator: s5m8767: Drop regulators OF node reference Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 129/247] isofs: release buffer head before return Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 130/247] auxdisplay: ht16k33: Fix refresh rate handling Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 131/247] IB/umad: Return EIO in case of when device disassociated Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 132/247] IB/umad: Return EPOLLERR " Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 133/247] KVM: PPC: Make the VMX instruction emulation routines static Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 134/247] powerpc/47x: Disable 256k page size Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 135/247] mmc: usdhi6rol0: Fix a resource leak in the error handling path of the probe Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 136/247] mmc: renesas_sdhi_internal_dmac: Fix DMA buffer alignment from 8 to 128-bytes Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 137/247] ARM: 9046/1: decompressor: Do not clear SCTLR.nTLSMD for ARMv7+ cores Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 138/247] amba: Fix resource leak for drivers without .remove Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 139/247] tracepoint: Do not fail unregistering a probe due to memory failure Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 140/247] perf tools: Fix DSO filtering when not finding a map for a sampled address Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 141/247] RDMA/rxe: Fix coding error in rxe_recv.c Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 142/247] RDMA/rxe: Correct skb on loopback path Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 143/247] spi: stm32: properly handle 0 byte transfer Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 144/247] mfd: wm831x-auxadc: Prevent use after free in wm831x_auxadc_read_irq() Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 145/247] powerpc/pseries/dlpar: handle ibm, configure-connector delay status Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 146/247] powerpc/8xx: Fix software emulation interrupt Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 147/247] clk: qcom: gcc-msm8998: Fix Alpha PLL type for all GPLLs Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 148/247] spi: pxa2xx: Fix the controller numbering for Wildcat Point Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 149/247] Input: sur40 - fix an error code in sur40_probe() Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 150/247] perf intel-pt: Fix missing CYC processing in PSB Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 151/247] perf test: Fix unaligned access in sample parsing test Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 152/247] Input: elo - fix an error code in elo_connect() Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 153/247] sparc64: only select COMPAT_BINFMT_ELF if BINFMT_ELF is set Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 154/247] misc: eeprom_93xx46: Fix module alias to enable module autoprobe Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 155/247] misc: eeprom_93xx46: Add module alias to avoid breaking support for non device tree users Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 156/247] pwm: rockchip: rockchip_pwm_probe(): Remove superfluous clk_unprepare() Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 157/247] VMCI: Use set_page_dirty_lock() when unregistering guest memory Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 158/247] PCI: Align checking of syscall user config accessors Greg Kroah-Hartman
2021-03-01 16:12 ` [PATCH 4.19 159/247] drm/msm/dsi: Correct io_start for MSM8994 (20nm PHY) Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 160/247] ext4: fix potential htree index checksum corruption Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 161/247] regmap: sdw: use _no_pm functions in regmap_read/write Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 162/247] i40e: Fix flow for IPv6 next header (extension header) Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 163/247] i40e: Add zero-initialization of AQ command structures Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 164/247] i40e: Fix overwriting flow control settings during driver loading Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 165/247] i40e: Fix VFs not created Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 166/247] Take mmap lock in cacheflush syscall Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 167/247] i40e: Fix add TC filter for IPv6 Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 168/247] net/mlx4_core: Add missed mlx4_free_cmd_mailbox() Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 169/247] vxlan: move debug check after netdev unregister Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 170/247] ocfs2: fix a use after free on error Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 171/247] mm/memory.c: fix potential pte_unmap_unlock pte error Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 172/247] mm/hugetlb: fix potential double free in hugetlb_register_node() error path Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 173/247] r8169: fix jumbo packet handling on RTL8168e Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 174/247] arm64: Add missing ISB after invalidating TLB in __primary_switch Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 175/247] i2c: brcmstb: Fix brcmstd_send_i2c_cmd condition Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 176/247] mm/rmap: fix potential pte_unmap on an not mapped pte Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 177/247] scsi: bnx2fc: Fix Kconfig warning & CNIC build errors Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 178/247] blk-settings: align max_sectors on "logical_block_size" boundary Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 179/247] ACPI: property: Fix fwnode string properties matching Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 180/247] ACPI: configfs: add missing check after configfs_register_default_group() Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 181/247] HID: wacom: Ignore attempts to overwrite the touch_max value from HID Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 182/247] Input: raydium_ts_i2c - do not send zero length Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 183/247] Input: xpad - add support for PowerA Enhanced Wired Controller for Xbox Series X|S Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 184/247] Input: joydev - prevent potential read overflow in ioctl Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 185/247] Input: i8042 - add ASUS Zenbook Flip to noselftest list Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 186/247] USB: serial: option: update interface mapping for ZTE P685M Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 187/247] usb: musb: Fix runtime PM race in musb_queue_resume_work Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 188/247] usb: dwc3: gadget: Fix setting of DEPCFG.bInterval_m1 Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 189/247] usb: dwc3: gadget: Fix dep->interval for fullspeed interrupt Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 190/247] USB: serial: ftdi_sio: fix FTX sub-integer prescaler Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 191/247] USB: serial: mos7840: fix error code in mos7840_write() Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 192/247] USB: serial: mos7720: fix error code in mos7720_write() Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 193/247] ALSA: hda/realtek: modify EAPD in the ALC886 Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 194/247] tpm_tis: Fix check_locality for correct locality acquisition Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 195/247] tpm_tis: Clean up locality release Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 196/247] KEYS: trusted: Fix migratable=1 failing Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 197/247] btrfs: abort the transaction if we fail to inc ref in btrfs_copy_root Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 198/247] btrfs: fix reloc root leak with 0 ref reloc roots on recovery Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 199/247] btrfs: fix extent buffer leak on failure to copy root Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 200/247] crypto: arm64/sha - add missing module aliases Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 201/247] crypto: sun4i-ss - checking sg length is not sufficient Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 202/247] crypto: sun4i-ss - IV register does not work on A10 and A13 Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 203/247] crypto: sun4i-ss - handle BigEndian for cipher Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 204/247] seccomp: Add missing return in non-void function Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 205/247] misc: rtsx: init of rts522a add OCP power off when no card is present Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 206/247] drivers/misc/vmw_vmci: restrict too big queue size in qp_host_alloc_queue Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 207/247] pstore: Fix typo in compression option name Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 208/247] dts64: mt7622: fix slow sd card access Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 209/247] staging/mt7621-dma: mtk-hsdma.c->hsdma-mt7621.c Greg Kroah-Hartman
2021-03-01 17:41   ` Ilya Lipnitskiy [this message]
2021-03-04  8:14     ` Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 210/247] staging: gdm724x: Fix DMA from stack Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 211/247] staging: rtl8188eu: Add Edimax EW-7811UN V2 to device table Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 212/247] media: ipu3-cio2: Fix mbus_code processing in cio2_subdev_set_fmt() Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 213/247] x86/reboot: Force all cpus to exit VMX root if VMX is supported Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 214/247] floppy: reintroduce O_NDELAY fix Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 215/247] arm64: uprobe: Return EOPNOTSUPP for AARCH32 instruction probing Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 216/247] watchdog: mei_wdt: request stop on unregister Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 217/247] mtd: spi-nor: hisi-sfc: Put child node np on error path Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 218/247] fs/affs: release old buffer head " Greg Kroah-Hartman
2021-03-01 16:13 ` [PATCH 4.19 219/247] seq_file: document how per-entry resources are managed Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 220/247] x86: fix seq_file iteration for pat/memtype.c Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 221/247] hugetlb: fix copy_huge_page_from_user contig page struct assumption Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 222/247] libnvdimm/dimm: Avoid race between probe and available_slots_show() Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 223/247] arm64: Extend workaround for erratum 1024718 to all versions of Cortex-A55 Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 224/247] module: Ignore _GLOBAL_OFFSET_TABLE_ when warning for undefined symbols Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 225/247] mmc: sdhci-esdhc-imx: fix kernel panic when remove module Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 226/247] gpio: pcf857x: Fix missing first interrupt Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 227/247] printk: fix deadlock when kernel panic Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 228/247] cpufreq: intel_pstate: Get per-CPU max freq via MSR_HWP_CAPABILITIES if available Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 229/247] f2fs: fix out-of-repair __setattr_copy() Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 230/247] sparc32: fix a user-triggerable oops in clear_user() Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 231/247] gfs2: Dont skip dlm unlock if glock has an lvb Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 232/247] dm: fix deadlock when swapping to encrypted device Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 233/247] dm era: Recover committed writeset after crash Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 234/247] dm era: Verify the data block size hasnt changed Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 235/247] dm era: Fix bitset memory leaks Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 236/247] dm era: Use correct value size in equality function of writeset tree Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 237/247] dm era: Reinitialize bitset cache before digesting a new writeset Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 238/247] dm era: only resize metadata in preresume Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 239/247] icmp: introduce helper for natd source address in network device context Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 240/247] gtp: use icmp_ndo_send helper Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 241/247] sunvnet: " Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 242/247] xfrm: interface: " Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 243/247] ipv6: icmp6: avoid indirect call for icmpv6_send() Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 244/247] ipv6: silence compilation warning for non-IPV6 builds Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 245/247] net: icmp: pass zeroed opts from icmp{,v6}_ndo_send before sending Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 246/247] dm era: Update in-core bitset after committing the metadata Greg Kroah-Hartman
2021-03-01 16:14 ` [PATCH 4.19 247/247] net: qrtr: Fix memory leak in qrtr_tun_open Greg Kroah-Hartman
2021-03-01 21:45 ` [PATCH 4.19 000/247] 4.19.178-rc1 review Shuah Khan
2021-03-02  2:35 ` Hanjun Guo
2021-03-03  7:59 ` Hanjun Guo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CALCv0x36mPwPwFpB8P6nc4kfu_PB=U81RoY9=q31Osx4sGtC3g@mail.gmail.com' \
    --to=ilya.lipnitskiy@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).