Re: [PATCH] pl2303: restore the old baud rate encoding for HXD (and newer) chips

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 31.10.2013 13:03, schrieb Mika Westerberg:
> On Thu, Oct 31, 2013 at 01:09:55PM +0200, Mika Westerberg wrote:
>> On Wed, Oct 30, 2013 at 11:14:34PM +0100, Frank Schäfer wrote:
>>> Hmm... try to replace the whole pl2303.c from 3.12 with the one from 3.11.
>>> If it makes no difference, it's not a pl2303 issue.
>> I did that and the 3.11 pl2303.c works (whereas 3.12 doesn't).
>>
>> Can you tell me why do we even want to use this "divisor" based calculation
>> if we can do the same with direct method?
>>
>> I mean why the driver can't do this:
>>
>>  1) Try direct method for *all* chips.
>>  2) If it succeeds, use that value. Then we don't get any difference
>>     between actual and set baud rate.
>>  3) If it fails, then and only then use "divisor" based method.
>>
>> I would expect that the above cures my problem and possibly others who
>> might have affected by this regression.
> Something like the patch below.
>
> diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
> index bedf8e47713b..85f3fa4afc81 100644
> --- a/drivers/usb/serial/pl2303.c
> +++ b/drivers/usb/serial/pl2303.c
> @@ -461,11 +461,11 @@ static void pl2303_encode_baudrate(struct tty_struct *tty,
>  					enum pl2303_type type,
>  					u8 buf[4])
>  {
> -	int baud;
> +	int baud_req, baud;
>  
> -	baud = tty_get_baud_rate(tty);
> -	dev_dbg(&port->dev, "baud requested = %d\n", baud);
> -	if (!baud)
> +	baud_req = tty_get_baud_rate(tty);
> +	dev_dbg(&port->dev, "baud requested = %d\n", baud_req);
> +	if (!baud_req)
>  		return;
>  	/*
>  	 * There are two methods for setting/encoding the baud rate
> @@ -480,10 +480,10 @@ static void pl2303_encode_baudrate(struct tty_struct *tty,
>  	 * the device likely uses the same baud rate generator for both methods
>  	 * so that there is likley no difference.
>  	 */
> -	if (type == type_0 || type == type_1 || type == HX_CLONE)
> -		baud = pl2303_baudrate_encode_direct(baud, type, buf);
> -	else
> -		baud = pl2303_baudrate_encode_divisor(baud, type, buf);
> +	baud = pl2303_baudrate_encode_direct(baud_req, type, buf);
> +	if (baud != baud_req)
> +		baud = pl2303_baudrate_encode_divisor(baud_req, type, buf);
> +
That doesn't work.
The direct encoding always succeeds.
But if an unsupported baud rate is set, original chips silently run at
9600 baud and the Chinese clones produce data corruption. :/

Frank

>  	/* Save resulting baud rate */
>  	tty_encode_baud_rate(tty, baud, baud);
>  	dev_dbg(&port->dev, "baud set = %d\n", baud);

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux