On Wed, Dec 18, 2024 at 06:25:05PM +0100, Lode Willems wrote: > This adds support for enabling and disabling > RTS/CTS hardware flow control. > Tested using CH341A and CH340E. > > Fixes part of the following bug report: > Link: https://bugzilla.kernel.org/show_bug.cgi?id=197109 > > Signed-off-by: Lode Willems <me@xxxxxxxxxxxxxxx> > --- > > Changes in v2: > - Change the CH341_FLOW_CTL_* values to be 8 bits wide > - Set flow control setting unconditionally > - Prepare parameters and do one control request > - Drop the error message Thanks for the update. > +#define CH341_REG_FLOW_CTL 0x27 > +#define CH341_FLOW_CTL_NONE 0x00 > +#define CH341_FLOW_CTL_RTSCTS 0x01 > +static void ch341_set_flow_control(struct tty_struct *tty, > + struct usb_serial_port *port, > + const struct ktermios *old_termios) > +{ > + int r; > + u16 flow_ctl; > + > + if (C_CRTSCTS(tty)) > + flow_ctl = ((u16)CH341_FLOW_CTL_RTSCTS << 8) | CH341_FLOW_CTL_RTSCTS; > + else > + flow_ctl = ((u16)CH341_FLOW_CTL_NONE << 8) | CH341_FLOW_CTL_NONE; > + > + r = ch341_control_out(port->serial->dev, > + CH341_REQ_WRITE_REG, > + ((u16)CH341_REG_FLOW_CTL << 8) | CH341_REG_FLOW_CTL, > + flow_ctl); I dropped the unnecessary casts above (and will follow-up with a patch removing one such cast from the existing code). I also think preparing the index argument once in the call (i.e. (flow_ctl << 8) | flow_ctl)) makes the code a bit more readable. End result is here: https://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial.git/commit/?h=usb-next&id=35478bc369a67b703a079ee123c6e58290114aae Johan