|
@@ -185,7 +185,6 @@ enum rx_ctrl_state{
|
|
|
#define BM_REQUEST_TYPE (0xa1)
|
|
|
#define B_NOTIFICATION (0x20)
|
|
|
#define W_VALUE (0x0)
|
|
|
-#define W_INDEX (0x2)
|
|
|
#define W_LENGTH (0x2)
|
|
|
|
|
|
#define B_OVERRUN (0x1<<6)
|
|
@@ -1487,6 +1486,7 @@ static void tiocmget_intr_callback(struct urb *urb)
|
|
|
struct uart_icount *icount;
|
|
|
struct hso_serial_state_notification *serial_state_notification;
|
|
|
struct usb_device *usb;
|
|
|
+ int if_num;
|
|
|
|
|
|
/* Sanity checks */
|
|
|
if (!serial)
|
|
@@ -1495,15 +1495,24 @@ static void tiocmget_intr_callback(struct urb *urb)
|
|
|
handle_usb_error(status, __func__, serial->parent);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
+ /* tiocmget is only supported on HSO_PORT_MODEM */
|
|
|
tiocmget = serial->tiocmget;
|
|
|
if (!tiocmget)
|
|
|
return;
|
|
|
+ BUG_ON((serial->parent->port_spec & HSO_PORT_MASK) != HSO_PORT_MODEM);
|
|
|
+
|
|
|
usb = serial->parent->usb;
|
|
|
+ if_num = serial->parent->interface->altsetting->desc.bInterfaceNumber;
|
|
|
+
|
|
|
+ /* wIndex should be the USB interface number of the port to which the
|
|
|
+ * notification applies, which should always be the Modem port.
|
|
|
+ */
|
|
|
serial_state_notification = &tiocmget->serial_state_notification;
|
|
|
if (serial_state_notification->bmRequestType != BM_REQUEST_TYPE ||
|
|
|
serial_state_notification->bNotification != B_NOTIFICATION ||
|
|
|
le16_to_cpu(serial_state_notification->wValue) != W_VALUE ||
|
|
|
- le16_to_cpu(serial_state_notification->wIndex) != W_INDEX ||
|
|
|
+ le16_to_cpu(serial_state_notification->wIndex) != if_num ||
|
|
|
le16_to_cpu(serial_state_notification->wLength) != W_LENGTH) {
|
|
|
dev_warn(&usb->dev,
|
|
|
"hso received invalid serial state notification\n");
|