瀏覽代碼

serial: pl011: Don't enable RX DMA if residue processing not supported

If the DMA engine doesn't support residue processing then the RX DMA
handling won't work terribly well if polling is enabled.  So, disable
RX DMA if residue handling isn't available.

Signed-off-by: Andrew Jackson <Andrew.Jackson@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Andrew Jackson 11 年之前
父節點
當前提交
2d3b7d6e7d
共有 1 個文件被更改,包括 15 次插入0 次删除
  1. 15 0
      drivers/tty/serial/amba-pl011.c

+ 15 - 0
drivers/tty/serial/amba-pl011.c

@@ -322,7 +322,22 @@ static void pl011_dma_probe_initcall(struct device *dev, struct uart_amba_port *
 			.src_maxburst = uap->fifosize >> 2,
 			.src_maxburst = uap->fifosize >> 2,
 			.device_fc = false,
 			.device_fc = false,
 		};
 		};
+		struct dma_slave_caps caps;
 
 
+		/*
+		 * Some DMA controllers provide information on their capabilities.
+		 * If the controller does, check for suitable residue processing
+		 * otherwise assime all is well.
+		 */
+		if (0 == dma_get_slave_caps(chan, &caps)) {
+			if (caps.residue_granularity ==
+					DMA_RESIDUE_GRANULARITY_DESCRIPTOR) {
+				dma_release_channel(chan);
+				dev_info(uap->port.dev,
+					"RX DMA disabled - no residue processing\n");
+				return;
+			}
+		}
 		dmaengine_slave_config(chan, &rx_conf);
 		dmaengine_slave_config(chan, &rx_conf);
 		uap->dmarx.chan = chan;
 		uap->dmarx.chan = chan;