Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932749AbeAKNTt (ORCPT + 1 other); Thu, 11 Jan 2018 08:19:49 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:48014 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932534AbeAKNTr (ORCPT ); Thu, 11 Jan 2018 08:19:47 -0500 Date: Thu, 11 Jan 2018 14:19:47 +0100 From: Greg KH To: Nuno =?iso-8859-1?Q?Gon=E7alves?= Cc: ed.blake@sondrel.com, linux-kernel@vger.kernel.org Subject: Re: 8250_dw bug Message-ID: <20180111131947.GA16628@kroah.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.9.2 (2017-12-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: On Thu, Jan 11, 2018 at 01:47:31PM +0100, Nuno Gon?alves wrote: > Dear Ed and Greg, > > There is a small bug on de9e33bdfa22e607a88494ff21e9196d00bf4550, at > least on 32bit devices. > > Line 274 if (rate >= i * min_rate && rate <= i * max_rate) > > This will overflow when min_rate/max_rate is large and can not be > achieved in the hardware. > > Eg. > > stty -F /dev/ttyS2 raw 3500000 (not achievable on my board). > > target_rate=56000000 (for 3500000baud) > min_rate=55125000 > max_rate=56875000 > rate=24000000 (clk_round_rate for my board) > > Since my board can only do 1500000baud, this loop will keep > incrementing i until i=77*56875000 will overflow, and there are > unexpected results. > > I suggest this patch: > > --- a/drivers/tty/serial/8250/8250_dw.c > +++ b/drivers/tty/serial/8250/8250_dw.c > @@ -267,7 +267,13 @@ static void dw8250_set_termios(struct uart_port > *p, struct ktermios *termios, > > for (i = 1; i <= UART_DIV_MAX; i++) { > rate = clk_round_rate(d->clk, i * target_rate); > - if (rate >= i * min_rate && rate <= i * max_rate) > + > + if (rate < i * min_rate) { > + i = UART_DIV_MAX; > + break; > + } > + > + if (rate <= i * max_rate) > break; > } > if (i <= UART_DIV_MAX) { > > > Let me know if you want me to submit the formal patch. Why wouldn't you submit a "formal patch", that way we could apply it if it is correct :) also cc: the linux-serial mailing list when you do so, thanks. greg k-h