linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] Fix DNV HSUART RX DMA timeout interrupt issue
@ 2016-05-13  8:15 Chuah Kim Tatt
  2016-05-13  8:15 ` [PATCH 1/2] dmaengine: hsu: Export hsu_dma_get_status() Chuah Kim Tatt
  2016-05-13  8:15 ` [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV Chuah Kim Tatt
  0 siblings, 2 replies; 9+ messages in thread
From: Chuah Kim Tatt @ 2016-05-13  8:15 UTC (permalink / raw)
  To: gregkh, vinod.koul
  Cc: heikki.krogerus, andriy.shevchenko, mika.westerberg,
	kim.tatt.chuah, linux-kernel, jui.nee.tan

From: "Chuah, Kim Tatt" <kim.tatt.chuah@intel.com>

These patches fix a DNV HSUART DMA issue with timeout interrupts which causes:
  - RX to be padded with zeros up to 4kB when <4kB should be received
  - RX to be truncated at 4kB when >4kB should be received.
These patches have been tested on Intel Denverton platform.


Chuah, Kim Tatt (2):
  dmaengine: hsu: Export hsu_dma_get_status()
  serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV

 drivers/dma/hsu/hsu.c              | 90 +++++++++++++++++++++++++++++---------
 drivers/dma/hsu/pci.c              | 11 ++++-
 drivers/tty/serial/8250/8250_mid.c | 24 +++++++---
 include/linux/dma/hsu.h            | 14 ++++--
 4 files changed, 108 insertions(+), 31 deletions(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] dmaengine: hsu: Export hsu_dma_get_status()
  2016-05-13  8:15 [PATCH 0/2] Fix DNV HSUART RX DMA timeout interrupt issue Chuah Kim Tatt
@ 2016-05-13  8:15 ` Chuah Kim Tatt
  2016-05-13 11:19   ` Andy Shevchenko
  2016-05-13  8:15 ` [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV Chuah Kim Tatt
  1 sibling, 1 reply; 9+ messages in thread
From: Chuah Kim Tatt @ 2016-05-13  8:15 UTC (permalink / raw)
  To: gregkh, vinod.koul
  Cc: heikki.krogerus, andriy.shevchenko, mika.westerberg,
	kim.tatt.chuah, linux-kernel, jui.nee.tan

From: "Chuah, Kim Tatt" <kim.tatt.chuah@intel.com>

To allow other code to safely read DMA Channel Status Register (where
the register attribute for Channel Error, Descriptor Time Out &
Descriptor Done fields are read-clear), export hsu_dma_get_status().
hsu_dma_irq() is renamed to hsu_dma_do_irq() and requires Status
Register value to be passed in.

Signed-off-by: Chuah, Kim Tatt <kim.tatt.chuah@intel.com>
---
 drivers/dma/hsu/hsu.c              | 90 +++++++++++++++++++++++++++++---------
 drivers/dma/hsu/pci.c              | 11 ++++-
 drivers/tty/serial/8250/8250_mid.c | 22 +++++++---
 include/linux/dma/hsu.h            | 14 ++++--
 4 files changed, 106 insertions(+), 31 deletions(-)

diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c
index f8c5cd5..c5f21ef 100644
--- a/drivers/dma/hsu/hsu.c
+++ b/drivers/dma/hsu/hsu.c
@@ -126,28 +126,33 @@ static void hsu_dma_start_transfer(struct hsu_dma_chan *hsuc)
 	hsu_dma_start_channel(hsuc);
 }
 
-static u32 hsu_dma_chan_get_sr(struct hsu_dma_chan *hsuc)
-{
-	unsigned long flags;
-	u32 sr;
-
-	spin_lock_irqsave(&hsuc->vchan.lock, flags);
-	sr = hsu_chan_readl(hsuc, HSU_CH_SR);
-	spin_unlock_irqrestore(&hsuc->vchan.lock, flags);
-
-	return sr & ~(HSU_CH_SR_DESCE_ANY | HSU_CH_SR_CDESC_ANY);
-}
-
-irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short nr)
+/*
+ *      hsu_dma_get_status() - get DMA channel status
+ *      @chip: HSUART DMA chip
+ *      @nr: DMA channel number
+ *      @status: pointer for DMA Channel Status Register value
+ *
+ *      Description:
+ *      The function reads and clears the DMA Channel Status Register, checks
+ *      if it was a timeout interrupt and returns a corresponding value.
+ *
+ *      Caller should provide a valid pointer for the DMA Channel Status
+ *      Register value that will be returned in @status.
+ *
+ *      Return:
+ *      1 for DMA timeout status, 0 for other DMA status, or error code for
+ *      invalid parameters or no interrupt pending.
+ */
+int hsu_dma_get_status(struct hsu_dma_chip *chip, unsigned short nr,
+		       u32 *status)
 {
 	struct hsu_dma_chan *hsuc;
-	struct hsu_dma_desc *desc;
 	unsigned long flags;
 	u32 sr;
 
 	/* Sanity check */
 	if (nr >= chip->hsu->nr_channels)
-		return IRQ_NONE;
+		return -EINVAL;
 
 	hsuc = &chip->hsu->chan[nr];
 
@@ -155,22 +160,65 @@ irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short nr)
 	 * No matter what situation, need read clear the IRQ status
 	 * There is a bug, see Errata 5, HSD 2900918
 	 */
-	sr = hsu_dma_chan_get_sr(hsuc);
+	spin_lock_irqsave(&hsuc->vchan.lock, flags);
+	sr = hsu_chan_readl(hsuc, HSU_CH_SR);
+	spin_unlock_irqrestore(&hsuc->vchan.lock, flags);
+
+	/* Check if any interrupt is pending */
+	sr &= ~(HSU_CH_SR_DESCE_ANY | HSU_CH_SR_CDESC_ANY);
 	if (!sr)
-		return IRQ_NONE;
+		return -EIO;
 
 	/* Timeout IRQ, need wait some time, see Errata 2 */
 	if (sr & HSU_CH_SR_DESCTO_ANY)
 		udelay(2);
 
+	/*
+	 * At this point, at least one of Descriptor Time Out, Channel Error
+	 * or Descriptor Done bits must be set. Clear the Descriptor Time Out
+	 * bits and if sr is still non-zero, it must be channel error or
+	 * descriptor done which are higher priority than timeout and handled
+	 * in hsu_dma_do_irq(). Else, it must be a timeout.
+	 */
 	sr &= ~HSU_CH_SR_DESCTO_ANY;
-	if (!sr)
-		return IRQ_HANDLED;
+
+	*status = sr;
+
+	return sr ? 0 : 1;
+}
+EXPORT_SYMBOL_GPL(hsu_dma_get_status);
+
+/*
+ *      hsu_dma_do_irq() - DMA interrupt handler
+ *      @chip: HSUART DMA chip
+ *      @nr: DMA channel number
+ *      @status: Channel Status Register value
+ *
+ *      Description:
+ *      This function handles Channel Error and Descriptor Done interrupts.
+ *      This function should be called after determining that the DMA interrupt
+ *      is not a normal timeout interrupt, ie. hsu_dma_get_status() returned 0.
+ *
+ *      Return:
+ *      IRQ_NONE for invalid channel number, IRQ_HANDLED otherwise.
+ */
+irqreturn_t hsu_dma_do_irq(struct hsu_dma_chip *chip, unsigned short nr,
+			   u32 status)
+{
+	struct hsu_dma_chan *hsuc;
+	struct hsu_dma_desc *desc;
+	unsigned long flags;
+
+	/* Sanity check */
+	if (nr >= chip->hsu->nr_channels)
+		return IRQ_NONE;
+
+	hsuc = &chip->hsu->chan[nr];
 
 	spin_lock_irqsave(&hsuc->vchan.lock, flags);
 	desc = hsuc->desc;
 	if (desc) {
-		if (sr & HSU_CH_SR_CHE) {
+		if (status & HSU_CH_SR_CHE) {
 			desc->status = DMA_ERROR;
 		} else if (desc->active < desc->nents) {
 			hsu_dma_start_channel(hsuc);
@@ -184,7 +232,7 @@ irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short nr)
 
 	return IRQ_HANDLED;
 }
-EXPORT_SYMBOL_GPL(hsu_dma_irq);
+EXPORT_SYMBOL_GPL(hsu_dma_do_irq);
 
 static struct hsu_dma_desc *hsu_dma_alloc_desc(unsigned int nents)
 {
diff --git a/drivers/dma/hsu/pci.c b/drivers/dma/hsu/pci.c
index e2db76b..9916058 100644
--- a/drivers/dma/hsu/pci.c
+++ b/drivers/dma/hsu/pci.c
@@ -27,13 +27,20 @@ static irqreturn_t hsu_pci_irq(int irq, void *dev)
 {
 	struct hsu_dma_chip *chip = dev;
 	u32 dmaisr;
+	u32 status;
 	unsigned short i;
 	irqreturn_t ret = IRQ_NONE;
+	int err;
 
 	dmaisr = readl(chip->regs + HSU_PCI_DMAISR);
 	for (i = 0; i < chip->hsu->nr_channels; i++) {
-		if (dmaisr & 0x1)
-			ret |= hsu_dma_irq(chip, i);
+		if (dmaisr & 0x1) {
+			err = hsu_dma_get_status(chip, i, &status);
+			if (err > 0)
+				ret |= IRQ_HANDLED;
+			else if (err == 0)
+				ret |= hsu_dma_do_irq(chip, i, status);
+		}
 		dmaisr >>= 1;
 	}
 
diff --git a/drivers/tty/serial/8250/8250_mid.c b/drivers/tty/serial/8250/8250_mid.c
index 86379a7..b218ff5 100644
--- a/drivers/tty/serial/8250/8250_mid.c
+++ b/drivers/tty/serial/8250/8250_mid.c
@@ -97,12 +97,24 @@ static int dnv_handle_irq(struct uart_port *p)
 {
 	struct mid8250 *mid = p->private_data;
 	unsigned int fisr = serial_port_in(p, INTEL_MID_UART_DNV_FISR);
+	u32 status;
 	int ret = IRQ_NONE;
-
-	if (fisr & BIT(2))
-		ret |= hsu_dma_irq(&mid->dma_chip, 1);
-	if (fisr & BIT(1))
-		ret |= hsu_dma_irq(&mid->dma_chip, 0);
+	int err;
+
+	if (fisr & BIT(2)) {
+		err = hsu_dma_get_status(&mid->dma_chip, 1, &status);
+		if (err > 0)
+			ret |= IRQ_HANDLED;
+		else if (err == 0)
+			ret |= hsu_dma_do_irq(&mid->dma_chip, 1, status);
+	}
+	if (fisr & BIT(1)) {
+		err = hsu_dma_get_status(&mid->dma_chip, 0, &status);
+		if (err > 0)
+			ret |= IRQ_HANDLED;
+		else if (err == 0)
+			ret |= hsu_dma_do_irq(&mid->dma_chip, 0, status);
+	}
 	if (fisr & BIT(0))
 		ret |= serial8250_handle_irq(p, serial_port_in(p, UART_IIR));
 	return ret;
diff --git a/include/linux/dma/hsu.h b/include/linux/dma/hsu.h
index 79df69d..aaff68e 100644
--- a/include/linux/dma/hsu.h
+++ b/include/linux/dma/hsu.h
@@ -39,14 +39,22 @@ struct hsu_dma_chip {
 
 #if IS_ENABLED(CONFIG_HSU_DMA)
 /* Export to the internal users */
-irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short nr);
+int hsu_dma_get_status(struct hsu_dma_chip *chip, unsigned short nr,
+		       u32 *status);
+irqreturn_t hsu_dma_do_irq(struct hsu_dma_chip *chip, unsigned short nr,
+			   u32 status);
 
 /* Export to the platform drivers */
 int hsu_dma_probe(struct hsu_dma_chip *chip);
 int hsu_dma_remove(struct hsu_dma_chip *chip);
 #else
-static inline irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip,
-				      unsigned short nr)
+static inline int hsu_dma_get_status(struct hsu_dma_chip *chip,
+				     unsigned short nr, u32 *status)
+{
+	return 0;
+}
+static inline irqreturn_t hsu_dma_do_irq(struct hsu_dma_chip *chip,
+					 unsigned short nr, u32 status)
 {
 	return IRQ_NONE;
 }
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV
  2016-05-13  8:15 [PATCH 0/2] Fix DNV HSUART RX DMA timeout interrupt issue Chuah Kim Tatt
  2016-05-13  8:15 ` [PATCH 1/2] dmaengine: hsu: Export hsu_dma_get_status() Chuah Kim Tatt
@ 2016-05-13  8:15 ` Chuah Kim Tatt
  2016-05-13 10:15   ` kbuild test robot
  1 sibling, 1 reply; 9+ messages in thread
From: Chuah Kim Tatt @ 2016-05-13  8:15 UTC (permalink / raw)
  To: gregkh, vinod.koul
  Cc: heikki.krogerus, andriy.shevchenko, mika.westerberg,
	kim.tatt.chuah, linux-kernel, jui.nee.tan

From: "Chuah, Kim Tatt" <kim.tatt.chuah@intel.com>

In DNV, when RX DMA is used and number of bytes received is less than
transfer size, only RX DMA timeout interrupt is sent. When this happens,
read the RX buffer.

Signed-off-by: Chuah, Kim Tatt <kim.tatt.chuah@intel.com>
---
 drivers/tty/serial/8250/8250_mid.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_mid.c b/drivers/tty/serial/8250/8250_mid.c
index b218ff5..339de9c 100644
--- a/drivers/tty/serial/8250/8250_mid.c
+++ b/drivers/tty/serial/8250/8250_mid.c
@@ -96,6 +96,7 @@ static int tng_setup(struct mid8250 *mid, struct uart_port *p)
 static int dnv_handle_irq(struct uart_port *p)
 {
 	struct mid8250 *mid = p->private_data;
+	struct uart_8250_port *up = up_to_u8250p(p);
 	unsigned int fisr = serial_port_in(p, INTEL_MID_UART_DNV_FISR);
 	u32 status;
 	int ret = IRQ_NONE;
@@ -103,9 +104,10 @@ static int dnv_handle_irq(struct uart_port *p)
 
 	if (fisr & BIT(2)) {
 		err = hsu_dma_get_status(&mid->dma_chip, 1, &status);
-		if (err > 0)
+		if (err > 0) {
+			serial8250_rx_dma_flush(up);
 			ret |= IRQ_HANDLED;
-		else if (err == 0)
+		} else if (err == 0)
 			ret |= hsu_dma_do_irq(&mid->dma_chip, 1, status);
 	}
 	if (fisr & BIT(1)) {
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV
  2016-05-13  8:15 ` [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV Chuah Kim Tatt
@ 2016-05-13 10:15   ` kbuild test robot
  2016-05-13 11:27     ` Andy Shevchenko
  0 siblings, 1 reply; 9+ messages in thread
From: kbuild test robot @ 2016-05-13 10:15 UTC (permalink / raw)
  To: Chuah Kim Tatt
  Cc: kbuild-all, gregkh, vinod.koul, heikki.krogerus,
	andriy.shevchenko, mika.westerberg, kim.tatt.chuah, linux-kernel,
	jui.nee.tan

[-- Attachment #1: Type: text/plain, Size: 1036 bytes --]

Hi,

[auto build test ERROR on next-20160513]
[cannot apply to tty/tty-testing usb/usb-testing v4.6-rc7 v4.6-rc6 v4.6-rc5 v4.6-rc7]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Chuah-Kim-Tatt/Fix-DNV-HSUART-RX-DMA-timeout-interrupt-issue/20160513-162046
config: i386-randconfig-s0-201619 (attached as .config)
compiler: gcc-6 (Debian 6.1.1-1) 6.1.1 20160430
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

Note: the linux-review/Chuah-Kim-Tatt/Fix-DNV-HSUART-RX-DMA-timeout-interrupt-issue/20160513-162046 HEAD 0354112aa9821bec8d278ad06b3d543724f5291d builds fine.
      It only hurts bisectibility.

All errors (new ones prefixed by >>):

>> ERROR: "serial8250_rx_dma_flush" [drivers/tty/serial/8250/8250_mid.ko] undefined!

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 35864 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] dmaengine: hsu: Export hsu_dma_get_status()
  2016-05-13  8:15 ` [PATCH 1/2] dmaengine: hsu: Export hsu_dma_get_status() Chuah Kim Tatt
@ 2016-05-13 11:19   ` Andy Shevchenko
  0 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2016-05-13 11:19 UTC (permalink / raw)
  To: Chuah Kim Tatt, gregkh, vinod.koul
  Cc: heikki.krogerus, mika.westerberg, linux-kernel, jui.nee.tan

On Fri, 2016-05-13 at 16:15 +0800, Chuah Kim Tatt wrote:
> From: "Chuah, Kim Tatt" <kim.tatt.chuah@intel.com>
> 
> To allow other code to safely read DMA Channel Status Register (where
> the register attribute for Channel Error, Descriptor Time Out &
> Descriptor Done fields are read-clear), export hsu_dma_get_status().
> hsu_dma_irq() is renamed to hsu_dma_do_irq() and requires Status
> Register value to be passed in.
> 

Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> Signed-off-by: Chuah, Kim Tatt <kim.tatt.chuah@intel.com>
> ---
>  drivers/dma/hsu/hsu.c              | 90
> +++++++++++++++++++++++++++++---------
>  drivers/dma/hsu/pci.c              | 11 ++++-
>  drivers/tty/serial/8250/8250_mid.c | 22 +++++++---
>  include/linux/dma/hsu.h            | 14 ++++--
>  4 files changed, 106 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c
> index f8c5cd5..c5f21ef 100644
> --- a/drivers/dma/hsu/hsu.c
> +++ b/drivers/dma/hsu/hsu.c
> @@ -126,28 +126,33 @@ static void hsu_dma_start_transfer(struct
> hsu_dma_chan *hsuc)
>  	hsu_dma_start_channel(hsuc);
>  }
>  
> -static u32 hsu_dma_chan_get_sr(struct hsu_dma_chan *hsuc)
> -{
> -	unsigned long flags;
> -	u32 sr;
> -
> -	spin_lock_irqsave(&hsuc->vchan.lock, flags);
> -	sr = hsu_chan_readl(hsuc, HSU_CH_SR);
> -	spin_unlock_irqrestore(&hsuc->vchan.lock, flags);
> -
> -	return sr & ~(HSU_CH_SR_DESCE_ANY | HSU_CH_SR_CDESC_ANY);
> -}
> -
> -irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short nr)
> +/*
> + *      hsu_dma_get_status() - get DMA channel status
> + *      @chip: HSUART DMA chip
> + *      @nr: DMA channel number
> + *      @status: pointer for DMA Channel Status Register value
> + *
> + *      Description:
> + *      The function reads and clears the DMA Channel Status
> Register, checks
> + *      if it was a timeout interrupt and returns a corresponding
> value.
> + *
> + *      Caller should provide a valid pointer for the DMA Channel
> Status
> + *      Register value that will be returned in @status.
> + *
> + *      Return:
> + *      1 for DMA timeout status, 0 for other DMA status, or error
> code for
> + *      invalid parameters or no interrupt pending.
> + */
> +int hsu_dma_get_status(struct hsu_dma_chip *chip, unsigned short nr,
> +		       u32 *status)
>  {
>  	struct hsu_dma_chan *hsuc;
> -	struct hsu_dma_desc *desc;
>  	unsigned long flags;
>  	u32 sr;
>  
>  	/* Sanity check */
>  	if (nr >= chip->hsu->nr_channels)
> -		return IRQ_NONE;
> +		return -EINVAL;
>  
>  	hsuc = &chip->hsu->chan[nr];
>  
> @@ -155,22 +160,65 @@ irqreturn_t hsu_dma_irq(struct hsu_dma_chip
> *chip, unsigned short nr)
>  	 * No matter what situation, need read clear the IRQ status
>  	 * There is a bug, see Errata 5, HSD 2900918
>  	 */
> -	sr = hsu_dma_chan_get_sr(hsuc);
> +	spin_lock_irqsave(&hsuc->vchan.lock, flags);
> +	sr = hsu_chan_readl(hsuc, HSU_CH_SR);
> +	spin_unlock_irqrestore(&hsuc->vchan.lock, flags);
> +
> +	/* Check if any interrupt is pending */
> +	sr &= ~(HSU_CH_SR_DESCE_ANY | HSU_CH_SR_CDESC_ANY);
>  	if (!sr)
> -		return IRQ_NONE;
> +		return -EIO;
>  
>  	/* Timeout IRQ, need wait some time, see Errata 2 */
>  	if (sr & HSU_CH_SR_DESCTO_ANY)
>  		udelay(2);
>  
> +	/*
> +	 * At this point, at least one of Descriptor Time Out,
> Channel Error
> +	 * or Descriptor Done bits must be set. Clear the Descriptor
> Time Out
> +	 * bits and if sr is still non-zero, it must be channel error
> or
> +	 * descriptor done which are higher priority than timeout and
> handled
> +	 * in hsu_dma_do_irq(). Else, it must be a timeout.
> +	 */
>  	sr &= ~HSU_CH_SR_DESCTO_ANY;
> -	if (!sr)
> -		return IRQ_HANDLED;
> +
> +	*status = sr;
> +
> +	return sr ? 0 : 1;
> +}
> +EXPORT_SYMBOL_GPL(hsu_dma_get_status);
> +
> +/*
> + *      hsu_dma_do_irq() - DMA interrupt handler
> + *      @chip: HSUART DMA chip
> + *      @nr: DMA channel number
> + *      @status: Channel Status Register value
> + *
> + *      Description:
> + *      This function handles Channel Error and Descriptor Done
> interrupts.
> + *      This function should be called after determining that the DMA
> interrupt
> + *      is not a normal timeout interrupt, ie. hsu_dma_get_status()
> returned 0.
> + *
> + *      Return:
> + *      IRQ_NONE for invalid channel number, IRQ_HANDLED otherwise.
> + */
> +irqreturn_t hsu_dma_do_irq(struct hsu_dma_chip *chip, unsigned short
> nr,
> +			   u32 status)
> +{
> +	struct hsu_dma_chan *hsuc;
> +	struct hsu_dma_desc *desc;
> +	unsigned long flags;
> +
> +	/* Sanity check */
> +	if (nr >= chip->hsu->nr_channels)
> +		return IRQ_NONE;
> +
> +	hsuc = &chip->hsu->chan[nr];
>  
>  	spin_lock_irqsave(&hsuc->vchan.lock, flags);
>  	desc = hsuc->desc;
>  	if (desc) {
> -		if (sr & HSU_CH_SR_CHE) {
> +		if (status & HSU_CH_SR_CHE) {
>  			desc->status = DMA_ERROR;
>  		} else if (desc->active < desc->nents) {
>  			hsu_dma_start_channel(hsuc);
> @@ -184,7 +232,7 @@ irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip,
> unsigned short nr)
>  
>  	return IRQ_HANDLED;
>  }
> -EXPORT_SYMBOL_GPL(hsu_dma_irq);
> +EXPORT_SYMBOL_GPL(hsu_dma_do_irq);
>  
>  static struct hsu_dma_desc *hsu_dma_alloc_desc(unsigned int nents)
>  {
> diff --git a/drivers/dma/hsu/pci.c b/drivers/dma/hsu/pci.c
> index e2db76b..9916058 100644
> --- a/drivers/dma/hsu/pci.c
> +++ b/drivers/dma/hsu/pci.c
> @@ -27,13 +27,20 @@ static irqreturn_t hsu_pci_irq(int irq, void *dev)
>  {
>  	struct hsu_dma_chip *chip = dev;
>  	u32 dmaisr;
> +	u32 status;
>  	unsigned short i;
>  	irqreturn_t ret = IRQ_NONE;
> +	int err;
>  
>  	dmaisr = readl(chip->regs + HSU_PCI_DMAISR);
>  	for (i = 0; i < chip->hsu->nr_channels; i++) {
> -		if (dmaisr & 0x1)
> -			ret |= hsu_dma_irq(chip, i);
> +		if (dmaisr & 0x1) {
> +			err = hsu_dma_get_status(chip, i, &status);
> +			if (err > 0)
> +				ret |= IRQ_HANDLED;
> +			else if (err == 0)
> +				ret |= hsu_dma_do_irq(chip, i,
> status);
> +		}
>  		dmaisr >>= 1;
>  	}
>  
> diff --git a/drivers/tty/serial/8250/8250_mid.c
> b/drivers/tty/serial/8250/8250_mid.c
> index 86379a7..b218ff5 100644
> --- a/drivers/tty/serial/8250/8250_mid.c
> +++ b/drivers/tty/serial/8250/8250_mid.c
> @@ -97,12 +97,24 @@ static int dnv_handle_irq(struct uart_port *p)
>  {
>  	struct mid8250 *mid = p->private_data;
>  	unsigned int fisr = serial_port_in(p,
> INTEL_MID_UART_DNV_FISR);
> +	u32 status;
>  	int ret = IRQ_NONE;
> -
> -	if (fisr & BIT(2))
> -		ret |= hsu_dma_irq(&mid->dma_chip, 1);
> -	if (fisr & BIT(1))
> -		ret |= hsu_dma_irq(&mid->dma_chip, 0);
> +	int err;
> +
> +	if (fisr & BIT(2)) {
> +		err = hsu_dma_get_status(&mid->dma_chip, 1, &status);
> +		if (err > 0)
> +			ret |= IRQ_HANDLED;
> +		else if (err == 0)
> +			ret |= hsu_dma_do_irq(&mid->dma_chip, 1,
> status);
> +	}
> +	if (fisr & BIT(1)) {
> +		err = hsu_dma_get_status(&mid->dma_chip, 0, &status);
> +		if (err > 0)
> +			ret |= IRQ_HANDLED;
> +		else if (err == 0)
> +			ret |= hsu_dma_do_irq(&mid->dma_chip, 0,
> status);
> +	}
>  	if (fisr & BIT(0))
>  		ret |= serial8250_handle_irq(p, serial_port_in(p,
> UART_IIR));
>  	return ret;
> diff --git a/include/linux/dma/hsu.h b/include/linux/dma/hsu.h
> index 79df69d..aaff68e 100644
> --- a/include/linux/dma/hsu.h
> +++ b/include/linux/dma/hsu.h
> @@ -39,14 +39,22 @@ struct hsu_dma_chip {
>  
>  #if IS_ENABLED(CONFIG_HSU_DMA)
>  /* Export to the internal users */
> -irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short
> nr);
> +int hsu_dma_get_status(struct hsu_dma_chip *chip, unsigned short nr,
> +		       u32 *status);
> +irqreturn_t hsu_dma_do_irq(struct hsu_dma_chip *chip, unsigned short
> nr,
> +			   u32 status);
>  
>  /* Export to the platform drivers */
>  int hsu_dma_probe(struct hsu_dma_chip *chip);
>  int hsu_dma_remove(struct hsu_dma_chip *chip);
>  #else
> -static inline irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip,
> -				      unsigned short nr)
> +static inline int hsu_dma_get_status(struct hsu_dma_chip *chip,
> +				     unsigned short nr, u32 *status)
> +{
> +	return 0;
> +}
> +static inline irqreturn_t hsu_dma_do_irq(struct hsu_dma_chip *chip,
> +					 unsigned short nr, u32
> status)
>  {
>  	return IRQ_NONE;
>  }

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV
  2016-05-13 10:15   ` kbuild test robot
@ 2016-05-13 11:27     ` Andy Shevchenko
  2016-05-16  5:29       ` Chuah, Kim Tatt
  2016-05-17 18:14       ` Peter Hurley
  0 siblings, 2 replies; 9+ messages in thread
From: Andy Shevchenko @ 2016-05-13 11:27 UTC (permalink / raw)
  To: kbuild test robot, Chuah Kim Tatt, Peter Hurley
  Cc: kbuild-all, gregkh, vinod.koul, heikki.krogerus, mika.westerberg,
	linux-kernel, jui.nee.tan

On Fri, 2016-05-13 at 18:15 +0800, kbuild test robot wrote:
> Hi,
> 
> [auto build test ERROR on next-20160513]
> [cannot apply to tty/tty-testing usb/usb-testing v4.6-rc7 v4.6-rc6
> v4.6-rc5 v4.6-rc7]
> [if your patch is applied to the wrong git tree, please drop us a note
> to help improving the system]
> 
> url:    https://github.com/0day-ci/linux/commits/Chuah-Kim-Tatt/Fix-DN
> V-HSUART-RX-DMA-timeout-interrupt-issue/20160513-162046
> config: i386-randconfig-s0-201619 (attached as .config)
> compiler: gcc-6 (Debian 6.1.1-1) 6.1.1 20160430
> reproduce:
>         # save the attached .config to linux build tree
>         make ARCH=i386 
> 
> Note: the linux-review/Chuah-Kim-Tatt/Fix-DNV-HSUART-RX-DMA-timeout-
> interrupt-issue/20160513-162046 HEAD
> 0354112aa9821bec8d278ad06b3d543724f5291d builds fine.
>       It only hurts bisectibility.
> 
> All errors (new ones prefixed by >>):

Peter, what happened to your DMA series in the linux-next? Did I miss
any discussion related?

> 
> > 
> > > 
> > > ERROR: "serial8250_rx_dma_flush"
> > > [drivers/tty/serial/8250/8250_mid.ko] undefined!
> ---
> 0-DAY kernel test infrastructure                Open Source Technology
> Center
> https://lists.01.org/pipermail/kbuild-all                   Intel
> Corporation

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV
  2016-05-13 11:27     ` Andy Shevchenko
@ 2016-05-16  5:29       ` Chuah, Kim Tatt
  2016-05-20 12:40         ` Andy Shevchenko
  2016-05-17 18:14       ` Peter Hurley
  1 sibling, 1 reply; 9+ messages in thread
From: Chuah, Kim Tatt @ 2016-05-16  5:29 UTC (permalink / raw)
  To: Andy Shevchenko, lkp, Peter Hurley
  Cc: kbuild-all, gregkh, Koul, Vinod, heikki.krogerus,
	mika.westerberg, linux-kernel, Tan, Jui Nee



>-----Original Message-----
>From: Andy Shevchenko [mailto:andriy.shevchenko@linux.intel.com]
>Sent: Friday, May 13, 2016 7:28 PM
>To: lkp <lkp@intel.com>; Chuah, Kim Tatt <kim.tatt.chuah@intel.com>; Peter
>Hurley <peter@hurleysoftware.com>
>Cc: kbuild-all@01.org; gregkh@linuxfoundation.org; Koul, Vinod
><vinod.koul@intel.com>; heikki.krogerus@linux.intel.com;
>mika.westerberg@linux.intel.com; linux-kernel@vger.kernel.org; Tan, Jui Nee
><jui.nee.tan@intel.com>
>Subject: Re: [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for
>DNV
>
>On Fri, 2016-05-13 at 18:15 +0800, kbuild test robot wrote:
>> Hi,
>>
>> [auto build test ERROR on next-20160513] [cannot apply to
>> tty/tty-testing usb/usb-testing v4.6-rc7 v4.6-rc6
>> v4.6-rc5 v4.6-rc7]
>> [if your patch is applied to the wrong git tree, please drop us a note
>> to help improving the system]
>>
>> url:    https://github.com/0day-ci/linux/commits/Chuah-Kim-Tatt/Fix-DN
>> V-HSUART-RX-DMA-timeout-interrupt-issue/20160513-162046
>> config: i386-randconfig-s0-201619 (attached as .config)
>> compiler: gcc-6 (Debian 6.1.1-1) 6.1.1 20160430
>> reproduce:
>>         # save the attached .config to linux build tree
>>         make ARCH=i386
>>
>> Note: the linux-review/Chuah-Kim-Tatt/Fix-DNV-HSUART-RX-DMA-timeout-
>> interrupt-issue/20160513-162046 HEAD
>> 0354112aa9821bec8d278ad06b3d543724f5291d builds fine.
>>       It only hurts bisectibility.
>>
>> All errors (new ones prefixed by >>):
>
>Peter, what happened to your DMA series in the linux-next? Did I miss any
>discussion related?
>
Hi Andy,
The error occurs when CONFIG_8250_MID is set to "m", because serial8250_rx_dma_flush() was not exported. Please advise.
>>
>> >
>> > >
>> > > ERROR: "serial8250_rx_dma_flush"
>> > > [drivers/tty/serial/8250/8250_mid.ko] undefined!
>> ---
>> 0-DAY kernel test infrastructure                Open Source Technology
>> Center https://lists.01.org/pipermail/kbuild-all
>> Intel Corporation
>
>--
>Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>Intel Finland Oy

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV
  2016-05-13 11:27     ` Andy Shevchenko
  2016-05-16  5:29       ` Chuah, Kim Tatt
@ 2016-05-17 18:14       ` Peter Hurley
  1 sibling, 0 replies; 9+ messages in thread
From: Peter Hurley @ 2016-05-17 18:14 UTC (permalink / raw)
  To: Andy Shevchenko, kbuild test robot, Chuah Kim Tatt
  Cc: kbuild-all, gregkh, vinod.koul, heikki.krogerus, mika.westerberg,
	linux-kernel, jui.nee.tan

On 05/13/2016 04:27 AM, Andy Shevchenko wrote:
> On Fri, 2016-05-13 at 18:15 +0800, kbuild test robot wrote:
>> Hi,
>>
>> [auto build test ERROR on next-20160513]
>> [cannot apply to tty/tty-testing usb/usb-testing v4.6-rc7 v4.6-rc6
>> v4.6-rc5 v4.6-rc7]
>> [if your patch is applied to the wrong git tree, please drop us a note
>> to help improving the system]
>>
>> url:    https://github.com/0day-ci/linux/commits/Chuah-Kim-Tatt/Fix-DN
>> V-HSUART-RX-DMA-timeout-interrupt-issue/20160513-162046
>> config: i386-randconfig-s0-201619 (attached as .config)
>> compiler: gcc-6 (Debian 6.1.1-1) 6.1.1 20160430
>> reproduce:
>>         # save the attached .config to linux build tree
>>         make ARCH=i386 
>>
>> Note: the linux-review/Chuah-Kim-Tatt/Fix-DNV-HSUART-RX-DMA-timeout-
>> interrupt-issue/20160513-162046 HEAD
>> 0354112aa9821bec8d278ad06b3d543724f5291d builds fine.
>>       It only hurts bisectibility.
>>
>> All errors (new ones prefixed by >>):
> 
> Peter, what happened to your DMA series in the linux-next? Did I miss
> any discussion related?

Sorry, I don't understand. What is the problem?

And where is this patch coming from? I didn't see it on linux-serial.

Regards,
Peter Hurley


>>>>
>>>> ERROR: "serial8250_rx_dma_flush"
>>>> [drivers/tty/serial/8250/8250_mid.ko] undefined!
>> ---
>> 0-DAY kernel test infrastructure                Open Source Technology
>> Center
>> https://lists.01.org/pipermail/kbuild-all                   Intel
>> Corporation
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV
  2016-05-16  5:29       ` Chuah, Kim Tatt
@ 2016-05-20 12:40         ` Andy Shevchenko
  0 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2016-05-20 12:40 UTC (permalink / raw)
  To: Chuah, Kim Tatt, lkp, Peter Hurley
  Cc: kbuild-all, gregkh, Koul, Vinod, heikki.krogerus,
	mika.westerberg, linux-kernel, Tan, Jui Nee

On Mon, 2016-05-16 at 05:29 +0000, Chuah, Kim Tatt wrote:
> > On Fri, 2016-05-13 at 18:15 +0800, kbuild test robot wrote:

> > Peter, what happened to your DMA series in the linux-next? Did I
> > miss any
> > discussion related?
> > 
> Hi Andy,
> The error occurs when CONFIG_8250_MID is set to "m", because
> serial8250_rx_dma_flush() was not exported. Please advise.

Peter, this is a problem ^^^.

Kim, I suggest you to add an additional patch that exports a symbol and
send a new version of the patchset with Cc to Peter and linux-serial@
(besides the list of recipients you already have).

> > > > > ERROR: "serial8250_rx_dma_flush"
> > > > > [drivers/tty/serial/8250/8250_mid.ko] undefined!

-- 
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-05-20 12:39 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-13  8:15 [PATCH 0/2] Fix DNV HSUART RX DMA timeout interrupt issue Chuah Kim Tatt
2016-05-13  8:15 ` [PATCH 1/2] dmaengine: hsu: Export hsu_dma_get_status() Chuah Kim Tatt
2016-05-13 11:19   ` Andy Shevchenko
2016-05-13  8:15 ` [PATCH 2/2] serial: 8250_mid: Read RX buffer on RX DMA timeout for DNV Chuah Kim Tatt
2016-05-13 10:15   ` kbuild test robot
2016-05-13 11:27     ` Andy Shevchenko
2016-05-16  5:29       ` Chuah, Kim Tatt
2016-05-20 12:40         ` Andy Shevchenko
2016-05-17 18:14       ` Peter Hurley

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).