On 08/06/2015 02:14 AM, Tim Kryger wrote: > On Wed, Jul 29, 2015 at 3:23 AM, Qipeng Zha <qipeng.zha@xxxxxxxxx> wrote: >> According to DesignWare 8250 spec, if auto flow control >> mode is enabled, a change in CTS does not cause an interrupt, >> so sw-assisted CTS flow control mode will not work properly. >> >> There reported an GPS firmware download failure issue, and we >> verified the root cause is, the default sw-assisted CTS flow >> control mode can not work properly since no interrupt when got >> CTS signal. >> >> This patch is to enable auto CTS mode by defaut if CRTSCTS >> is enable for DesignWare 8250 controller. >> >> Signed-off-by: Huiquan Zhong <huiquan.zhong@xxxxxxxxx> >> Signed-off-by: Qipeng Zha <qipeng.zha@xxxxxxxxx> >> >> --- >> change in V3: >> update author name format; >> change in V2: >> update ACPI enumerated device driver accordingly; >> --- >> drivers/tty/serial/8250/8250_dw.c | 5 +++++ >> drivers/tty/serial/8250/8250_pci.c | 4 ++++ >> 2 files changed, 9 insertions(+) >> >> diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c >> index 6ae5b85..f78afeb 100644 >> --- a/drivers/tty/serial/8250/8250_dw.c >> +++ b/drivers/tty/serial/8250/8250_dw.c >> @@ -258,6 +258,11 @@ static void dw8250_set_termios(struct uart_port *p, struct ktermios *termios, >> >> if (!ret) >> p->uartclk = rate; >> + >> + p->status &= ~UPSTAT_AUTOCTS; >> + if (termios->c_cflag & CRTSCTS) >> + p->status |= UPSTAT_AUTOCTS; >> + >> out: >> serial8250_do_set_termios(p, termios, old); >> } >> diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c >> index 892eb32..5aeabe4 100644 >> --- a/drivers/tty/serial/8250/8250_pci.c >> +++ b/drivers/tty/serial/8250/8250_pci.c >> @@ -1438,6 +1438,10 @@ byt_set_termios(struct uart_port *p, struct ktermios *termios, >> reg |= BYT_PRV_CLK_EN | BYT_PRV_CLK_UPDATE; >> writel(reg, p->membase + BYT_PRV_CLK); >> >> + p->status &= ~UPSTAT_AUTOCTS; >> + if (termios->c_cflag & CRTSCTS) >> + p->status |= UPSTAT_AUTOCTS; >> + >> serial8250_do_set_termios(p, termios, old); >> } >> >> -- > > This isn't right. > > The Designware UART IP may be configured without auto flow control support. > > Also, 8250s indicate if they can do automatic flow control with UART_CAP_AFE. > > This capability is unconditionally set for Bay Trail in byt_serial_setup(). > > However, dw8250_setup_port() reads out the component parameter register to > see how the IP block was configured and only sets the capability when it is > supported. I assume most, but not all, do. > > Some other 8250 based devices also support this capability. What about them? > > Why not set UPSTAT_AUTOCTS in serial8250_do_set_termios() at the same time > as UART_MCR_AFE is set to actually turn on the automatic flow control? Because it's unclear if those other 8250 based devices which declare UART_CAP_AFE generate interrupts for DCTS or not. If UART_CAP_AFE is set and interrupts are generated for DCTS, then there is no requirement to set UPSTAT_AUTOCTS because the software state will accurately reflect the hardware state. When I added UPSTAT_AUTOCTS for devices which do not generate interrupts for DCTS, I preserved the _existing driver behavior_ for UART_CAP_AFE devices. If the DW 8250 does not generate interrupts for DCTS when UART_MCR_AFE is set, then UPSTAT_AUTOCTS is required. That's as simple as checking the capability bit in dw8250_set_termios(). Regards, Peter Hurley -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html