Commit c7bbc43a authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'usb-serial-6.19-rc1' of...

Merge tag 'usb-serial-6.19-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial into usb-next

Johan writes:

USB serial updates for 6.19-rc1

Here are the USB serial updates for 6.19-rc1:

 - fix belkin_sa and kobil_sct TIOCMBIS and TIOCMBIC ioctls
 - match on interface number for dual-port ftdi devices with reserved
   jtag port
 - do not log reserved ftdi jtag ports on probe
 - apply ftdi_sio NDI quirk remapping 19200 bps consistently
 - drop ftdi_sio NDI quirk module parameter
 - clean up ftdi_sio quirk implementations
 - add more modem device ids

Included are also various clean ups.

All have been in linux-next with no reported issues.

* tag 'usb-serial-6.19-rc1' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial:
  USB: serial: option: move Telit 0x10c7 composition in the right place
  USB: serial: option: add Telit Cinterion FE910C04 new compositions
  USB: serial: option: add Foxconn T99W760
  USB: serial: ftdi_sio: drop NDI quirk module parameter
  USB: serial: ftdi_sio: clean up NDI speed hack
  USB: serial: ftdi_sio: enable NDI speed hack consistently
  USB: serial: ftdi_sio: rename quirk symbols
  USB: serial: ftdi_sio: clean up quirk comments
  USB: serial: ftdi_sio: rewrite 8u2232c quirk
  USB: serial: ftdi_sio: silence jtag probe
  USB: serial: ftdi_sio: match on interface number for jtag
  USB: serial: kobil_sct: drop unnecessary initialisations
  USB: serial: kobil_sct: clean up set_termios()
  USB: serial: kobil_sct: add control request helpers
  USB: serial: kobil_sct: clean up device type checks
  USB: serial: kobil_sct: clean up tiocmset()
  USB: serial: belkin_sa: clean up tiocmset()
  USB: serial: kobil_sct: fix TIOCMBIS and TIOCMBIC
  USB: serial: belkin_sa: fix TIOCMBIS and TIOCMBIC
parents 2b7a0f47 072f2c49
Loading
Loading
Loading
Loading
+19 −23
Original line number Diff line number Diff line
@@ -435,44 +435,40 @@ static int belkin_sa_tiocmset(struct tty_struct *tty,
	struct belkin_sa_private *priv = usb_get_serial_port_data(port);
	unsigned long control_state;
	unsigned long flags;
	int retval;
	int rts = 0;
	int dtr = 0;
	int retval = 0;

	spin_lock_irqsave(&priv->lock, flags);
	control_state = priv->control_state;

	if (set & TIOCM_RTS) {
	if (set & TIOCM_RTS)
		control_state |= TIOCM_RTS;
		rts = 1;
	}
	if (set & TIOCM_DTR) {
	if (set & TIOCM_DTR)
		control_state |= TIOCM_DTR;
		dtr = 1;
	}
	if (clear & TIOCM_RTS) {
	if (clear & TIOCM_RTS)
		control_state &= ~TIOCM_RTS;
		rts = 0;
	}
	if (clear & TIOCM_DTR) {
	if (clear & TIOCM_DTR)
		control_state &= ~TIOCM_DTR;
		dtr = 0;
	}

	priv->control_state = control_state;
	spin_unlock_irqrestore(&priv->lock, flags);

	retval = BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST, rts);
	if ((set | clear) & TIOCM_RTS) {
		retval = BSA_USB_CMD(BELKIN_SA_SET_RTS_REQUEST,
					!!(control_state & TIOCM_RTS));
		if (retval < 0) {
			dev_err(&port->dev, "Set RTS error %d\n", retval);
			goto exit;
		}
	}

	retval = BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST, dtr);
	if ((set | clear) & TIOCM_DTR) {
		retval = BSA_USB_CMD(BELKIN_SA_SET_DTR_REQUEST,
					!!(control_state & TIOCM_DTR));
		if (retval < 0) {
			dev_err(&port->dev, "Set DTR error %d\n", retval);
			goto exit;
		}
	}
exit:
	return retval;
}
+68 −132
Original line number Diff line number Diff line
@@ -107,26 +107,24 @@ struct ftdi_quirk {
};

static int   ftdi_jtag_probe(struct usb_serial *serial);
static int   ftdi_NDI_device_setup(struct usb_serial *serial);
static int   ftdi_stmclite_probe(struct usb_serial *serial);
static int   ftdi_8u2232c_probe(struct usb_serial *serial);
static void  ftdi_USB_UIRT_setup(struct ftdi_private *priv);
static void  ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
static void  ftdi_usb_uirt_setup(struct ftdi_private *priv);
static void  ftdi_he_tira1_setup(struct ftdi_private *priv);

static const struct ftdi_quirk ftdi_jtag_quirk = {
	.probe	= ftdi_jtag_probe,
};

static const struct ftdi_quirk ftdi_NDI_device_quirk = {
	.probe	= ftdi_NDI_device_setup,
static const struct ftdi_quirk ftdi_ndi_quirk = {
};

static const struct ftdi_quirk ftdi_USB_UIRT_quirk = {
	.port_probe = ftdi_USB_UIRT_setup,
static const struct ftdi_quirk ftdi_usb_uirt_quirk = {
	.port_probe = ftdi_usb_uirt_setup,
};

static const struct ftdi_quirk ftdi_HE_TIRA1_quirk = {
	.port_probe = ftdi_HE_TIRA1_setup,
static const struct ftdi_quirk ftdi_he_tira1_quirk = {
	.port_probe = ftdi_he_tira1_setup,
};

static const struct ftdi_quirk ftdi_stmclite_quirk = {
@@ -590,9 +588,9 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(OCT_VID, OCT_US101_PID) },
	{ USB_DEVICE(OCT_VID, OCT_DK201_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_HE_TIRA1_PID),
		.driver_info = (kernel_ulong_t)&ftdi_HE_TIRA1_quirk },
		.driver_info = (kernel_ulong_t)&ftdi_he_tira1_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID),
		.driver_info = (kernel_ulong_t)&ftdi_USB_UIRT_quirk },
		.driver_info = (kernel_ulong_t)&ftdi_usb_uirt_quirk },
	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_1) },
	{ USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
	{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
@@ -628,10 +626,8 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PEDO_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_IBS_PROD_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_TAVIR_STK500_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_TIAO_UMPA_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLXM_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_TIAO_UMPA_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_NT_ORIONLXM_PID, 1) },
	{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLX_PLUS_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_NT_ORION_IO_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONMX_PID) },
@@ -794,17 +790,17 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(FTDI_VID, FTDI_TACTRIX_OPENPORT_13U_PID) },
	{ USB_DEVICE(ELEKTOR_VID, ELEKTOR_FT323R_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
		.driver_info = (kernel_ulong_t)&ftdi_ndi_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_SPECTRA_SCU_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
		.driver_info = (kernel_ulong_t)&ftdi_ndi_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_2_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
		.driver_info = (kernel_ulong_t)&ftdi_ndi_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_FUTURE_3_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
		.driver_info = (kernel_ulong_t)&ftdi_ndi_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
		.driver_info = (kernel_ulong_t)&ftdi_ndi_quirk },
	{ USB_DEVICE(FTDI_NDI_VID, FTDI_NDI_EMGUIDE_GEMINI_PID),
		.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
		.driver_info = (kernel_ulong_t)&ftdi_ndi_quirk },
	{ USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
	{ USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) },
	{ USB_DEVICE(FTDI_VID, RTSYSTEMS_USB_VX8_PID) },
@@ -842,24 +838,17 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
	{ USB_DEVICE(FTDI_VID, CYBER_CORTEX_AV_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, CYBER_CORTEX_AV_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_TINY_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(OLIMEX_VID, OLIMEX_ARM_USB_TINY_H_PID, 1) },
	{ USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_OOCDLINK_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(FIC_VID, FIC_NEO1973_DEBUG_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_OOCDLINK_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, LMI_LM3S_DEVEL_BOARD_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, LMI_LM3S_EVAL_BOARD_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, LMI_LM3S_ICDI_BOARD_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_TURTELIZER_PID, 1) },
	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) },
	{ USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_SCU18) },
	{ USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) },
@@ -901,17 +890,14 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(ATMEL_VID, STK541_PID) },
	{ USB_DEVICE(DE_VID, STB_PID) },
	{ USB_DEVICE(DE_VID, WHT_PID) },
	{ USB_DEVICE(ADI_VID, ADI_GNICE_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(ADI_VID, ADI_GNICE_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(ADI_VID, ADI_GNICEPLUS_PID, 1) },
	{ USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
					USB_CLASS_VENDOR_SPEC,
					USB_SUBCLASS_VENDOR_SPEC, 0x00) },
	{ USB_DEVICE_INTERFACE_NUMBER(ACTEL_VID, MICROSEMI_ARROW_SF2PLUS_BOARD_PID, 2) },
	{ USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
	{ USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(MARVELL_VID, MARVELL_SHEEVAPLUG_PID, 1) },
	{ USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
	{ USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
	{ USB_DEVICE(FTDI_VID, PI_C865_PID) },
@@ -934,10 +920,8 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(PI_VID, PI_1016_PID) },
	{ USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
	{ USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
	{ USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, TI_XDS100V2_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, MARVELL_OPENRD_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, TI_XDS100V2_PID, 1) },
	{ USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) },
	{ USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) },
	{ USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) },
@@ -946,18 +930,14 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) },
	{ USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) },
	{ USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) },
	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, XVERVE_SIGNALYZER_ST_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID, 1) },
	{ USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
	{ USB_DEVICE(FTDI_VID, ACCESIO_COM4SM_PID) },
	{ USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(IONICS_VID, IONICS_PLUGCOMPUTER_PID, 1) },
	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) },
@@ -972,15 +952,12 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(FTDI_VID, FTDI_CINTERION_MC55I_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_FHE_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_DOTEC_PID) },
	{ USB_DEVICE(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(ST_VID, ST_STMCLT_2232_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(QIHARDWARE_VID, MILKYMISTONE_JTAGSERIAL_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(ST_VID, ST_STMCLT_2232_PID, 1) },
	{ USB_DEVICE(ST_VID, ST_STMCLT_4232_PID),
		.driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_RF_R106) },
	{ USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID, 1) },
	{ USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) },
	/* Crucible Devices */
	{ USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) },
@@ -1055,8 +1032,7 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(ICPDAS_VID, ICPDAS_I7561U_PID) },
	{ USB_DEVICE(ICPDAS_VID, ICPDAS_I7563U_PID) },
	{ USB_DEVICE(WICED_VID, WICED_USB20706V2_PID) },
	{ USB_DEVICE(TI_VID, TI_CC3200_LAUNCHPAD_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(TI_VID, TI_CC3200_LAUNCHPAD_PID, 1) },
	{ USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_BT_USB_PID) },
	{ USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_WL_USB_PID) },
	{ USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) },
@@ -1075,10 +1051,8 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ZED_PID) },
	{ USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ODIN_PID) },
	/* FreeCalypso USB adapters */
	{ USB_DEVICE(FTDI_VID, FTDI_FALCONIA_JTAG_BUF_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(FTDI_VID, FTDI_FALCONIA_JTAG_UNBUF_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_FALCONIA_JTAG_BUF_PID, 1) },
	{ USB_DEVICE_INTERFACE_NUMBER(FTDI_VID, FTDI_FALCONIA_JTAG_UNBUF_PID, 1) },
	/* GMC devices */
	{ USB_DEVICE(GMC_VID, GMC_Z216C_PID) },
	/* Altera USB Blaster 3 */
@@ -1270,6 +1244,7 @@ static int update_mctrl(struct usb_serial_port *port, unsigned int set,
static u32 get_ftdi_divisor(struct tty_struct *tty,
						struct usb_serial_port *port)
{
	const struct ftdi_quirk *quirk = usb_get_serial_data(port->serial);
	struct ftdi_private *priv = usb_get_serial_port_data(port);
	struct device *dev = &port->dev;
	u32 div_value = 0;
@@ -1329,16 +1304,8 @@ static u32 get_ftdi_divisor(struct tty_struct *tty,
	case FT232R:
	case FTX:
		if (baud <= 3000000) {
			u16 product_id = le16_to_cpu(
				port->serial->dev->descriptor.idProduct);
			if (((product_id == FTDI_NDI_HUC_PID)		||
			     (product_id == FTDI_NDI_SPECTRA_SCU_PID)	||
			     (product_id == FTDI_NDI_FUTURE_2_PID)	||
			     (product_id == FTDI_NDI_FUTURE_3_PID)	||
			     (product_id == FTDI_NDI_AURORA_SCU_PID))	&&
			    (baud == 19200)) {
			if (quirk == &ftdi_ndi_quirk && baud == 19200)
				baud = 1200000;
			}
			div_value = ftdi_232bm_baud_to_divisor(baud);
		} else {
			dev_dbg(dev, "%s - Baud rate too high!\n", __func__);
@@ -2235,7 +2202,9 @@ static int ftdi_port_probe(struct usb_serial_port *port)
		goto err_free;

	ftdi_set_max_packet_size(port);
	if (read_latency_timer(port) < 0)
	if (quirk == &ftdi_ndi_quirk)
		priv->latency = 1;
	else if (read_latency_timer(port) < 0)
		priv->latency = 16;
	write_latency_timer(port);

@@ -2254,20 +2223,22 @@ static int ftdi_port_probe(struct usb_serial_port *port)
	return result;
}

/* Setup for the USB-UIRT device, which requires hardwired
 * baudrate (38400 gets mapped to 312500) */
/* Called from usbserial:serial_probe */
static void ftdi_USB_UIRT_setup(struct ftdi_private *priv)
/*
 * Setup for the USB-UIRT device, which requires hardwired baudrate
 * (38400 gets mapped to 312500).
 */
static void ftdi_usb_uirt_setup(struct ftdi_private *priv)
{
	priv->flags |= ASYNC_SPD_CUST;
	priv->custom_divisor = 77;
	priv->force_baud = 38400;
}

/* Setup for the HE-TIRA1 device, which requires hardwired
 * baudrate (38400 gets mapped to 100000) and RTS-CTS enabled.  */

static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
/*
 * Setup for the HE-TIRA1 device, which requires hardwired baudrate
 * (38400 gets mapped to 100000) and RTS-CTS enabled.
 */
static void ftdi_he_tira1_setup(struct ftdi_private *priv)
{
	priv->flags |= ASYNC_SPD_CUST;
	priv->custom_divisor = 240;
@@ -2275,39 +2246,6 @@ static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv)
	priv->force_rtscts = 1;
}

/*
 * Module parameter to control latency timer for NDI FTDI-based USB devices.
 * If this value is not set in /etc/modprobe.d/ its value will be set
 * to 1ms.
 */
static int ndi_latency_timer = 1;

/* Setup for the NDI FTDI-based USB devices, which requires hardwired
 * baudrate (19200 gets mapped to 1200000).
 *
 * Called from usbserial:serial_probe.
 */
static int ftdi_NDI_device_setup(struct usb_serial *serial)
{
	struct usb_device *udev = serial->dev;
	int latency = ndi_latency_timer;

	if (latency == 0)
		latency = 1;
	if (latency > 99)
		latency = 99;

	dev_dbg(&udev->dev, "%s setting NDI device latency to %d\n", __func__, latency);
	dev_info(&udev->dev, "NDI device with a latency value of %d\n", latency);

	/* FIXME: errors are not returned */
	usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
				FTDI_SIO_SET_LATENCY_TIMER_REQUEST,
				FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,
				latency, 0, NULL, 0, WDR_TIMEOUT);
	return 0;
}

/*
 * First port on JTAG adaptors such as Olimex arm-usb-ocd or the FIC/OpenMoko
 * Neo1973 Debug Board is reserved for JTAG interface and can be accessed from
@@ -2318,26 +2256,29 @@ static int ftdi_jtag_probe(struct usb_serial *serial)
	struct usb_interface *intf = serial->interface;
	int ifnum = intf->cur_altsetting->desc.bInterfaceNumber;

	if (ifnum == 0) {
		dev_info(&intf->dev, "Ignoring interface reserved for JTAG\n");
	if (ifnum == 0)
		return -ENODEV;
	}

	return 0;
}

static int ftdi_8u2232c_probe(struct usb_serial *serial)
{
	struct usb_interface *intf = serial->interface;
	struct usb_device *udev = serial->dev;
	int ifnum = intf->cur_altsetting->desc.bInterfaceNumber;

	if (udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems"))
		return ftdi_jtag_probe(serial);
	if (ifnum == 0) {
		if (udev->manufacturer &&
				!strcmp(udev->manufacturer, "CALAO Systems"))
			return -ENODEV;

		if (udev->product &&
				(!strcmp(udev->product, "Arrow USB Blaster") ||
				 !strcmp(udev->product, "BeagleBone/XDS100V2") ||
				 !strcmp(udev->product, "SNAP Connect E10")))
		return ftdi_jtag_probe(serial);
			return -ENODEV;
	}

	return 0;
}
@@ -2354,10 +2295,8 @@ static int ftdi_stmclite_probe(struct usb_serial *serial)
	struct usb_interface *intf = serial->interface;
	int ifnum = intf->cur_altsetting->desc.bInterfaceNumber;

	if (ifnum < 2) {
		dev_info(&intf->dev, "Ignoring interface reserved for JTAG\n");
	if (ifnum < 2)
		return -ENODEV;
	}

	return 0;
}
@@ -2934,6 +2873,3 @@ module_usb_serial_driver(serial_drivers, id_table_combined);
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");

module_param(ndi_latency_timer, int, 0644);
MODULE_PARM_DESC(ndi_latency_timer, "NDI device latency timer override");
+76 −134

File changed.

Preview size limit exceeded, changes collapsed.

+19 −3
Original line number Diff line number Diff line
@@ -1433,17 +1433,31 @@ static const struct usb_device_id option_ids[] = {
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10b3, 0xff, 0xff, 0x60) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c0, 0xff),	/* Telit FE910C04 (rmnet) */
	  .driver_info = RSVD(0) | NCTRL(3) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c1, 0xff),	/* Telit FE910C04 (RNDIS) */
	  .driver_info = NCTRL(4) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c2, 0xff),	/* Telit FE910C04 (MBIM) */
	  .driver_info = NCTRL(4) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c3, 0xff),	/* Telit FE910C04 (ECM) */
	  .driver_info = NCTRL(4) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c4, 0xff),	/* Telit FE910C04 (rmnet) */
	  .driver_info = RSVD(0) | NCTRL(3) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c5, 0xff),	/* Telit FE910C04 (RNDIS) */
	  .driver_info = NCTRL(4) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c6, 0xff),	/* Telit FE910C04 (MBIM) */
	  .driver_info = NCTRL(4) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 0x30),	/* Telit FE910C04 (ECM) */
	  .driver_info = NCTRL(4) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 0x40) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c8, 0xff),	/* Telit FE910C04 (rmnet) */
	  .driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c9, 0xff),	/* Telit FE910C04 (MBIM) */
	  .driver_info = NCTRL(3) | RSVD(4) | RSVD(5) },
	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10cb, 0xff),	/* Telit FE910C04 (RNDIS) */
	  .driver_info = NCTRL(3) | RSVD(4) | RSVD(5) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d0, 0xff, 0xff, 0x30),	/* Telit FN990B (rmnet) */
	  .driver_info = NCTRL(5) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d0, 0xff, 0xff, 0x40) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d0, 0xff, 0xff, 0x60) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 0x30),	/* Telit FE910C04 (ECM) */
	  .driver_info = NCTRL(4) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10c7, 0xff, 0xff, 0x40) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d1, 0xff, 0xff, 0x30),	/* Telit FN990B (MBIM) */
	  .driver_info = NCTRL(6) },
	{ USB_DEVICE_AND_INTERFACE_INFO(TELIT_VENDOR_ID, 0x10d1, 0xff, 0xff, 0x40) },
@@ -2376,6 +2390,8 @@ static const struct usb_device_id option_ids[] = {
	  .driver_info = RSVD(3) },
	{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0f0, 0xff),			/* Foxconn T99W373 MBIM */
	  .driver_info = RSVD(3) },
	{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe123, 0xff),			/* Foxconn T99W760 MBIM */
	  .driver_info = RSVD(3) },
	{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe145, 0xff),			/* Foxconn T99W651 RNDIS */
	  .driver_info = RSVD(5) | RSVD(6) },
	{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe15f, 0xff),                     /* Foxconn T99W709 */