mirror of
https://gitee.com/open-loongarch/linux-6.12.git
synced 2026-10-25 12:37:11 +08:00
Add EC200U_CN, EC200A_CN, EC200N_CN 4g module support.
Signed-off-by: maoxiaochuan <maoxiaochuan@loongson.cn>
This commit is contained in:
@@ -277,9 +277,12 @@ static void option_instat_callback(struct urb *urb);
|
|||||||
#define QUECTEL_PRODUCT_RM500Q 0x0800
|
#define QUECTEL_PRODUCT_RM500Q 0x0800
|
||||||
#define QUECTEL_PRODUCT_RM520N 0x0801
|
#define QUECTEL_PRODUCT_RM520N 0x0801
|
||||||
#define QUECTEL_PRODUCT_EC200U 0x0901
|
#define QUECTEL_PRODUCT_EC200U 0x0901
|
||||||
|
#define QUECTEL_PRODUCT_EC200U_CN 0x0901
|
||||||
#define QUECTEL_PRODUCT_EG912Y 0x6001
|
#define QUECTEL_PRODUCT_EG912Y 0x6001
|
||||||
#define QUECTEL_PRODUCT_EC200S_CN 0x6002
|
#define QUECTEL_PRODUCT_EC200S_CN 0x6002
|
||||||
#define QUECTEL_PRODUCT_EC200A 0x6005
|
#define QUECTEL_PRODUCT_EC200A 0x6005
|
||||||
|
#define QUECTEL_PRODUCT_EC200A_CN 0x6005
|
||||||
|
#define QUECTEL_PRODUCT_EC200N_CN 0x6005
|
||||||
#define QUECTEL_PRODUCT_EG916Q 0x6007
|
#define QUECTEL_PRODUCT_EG916Q 0x6007
|
||||||
#define QUECTEL_PRODUCT_EM061K_LWW 0x6008
|
#define QUECTEL_PRODUCT_EM061K_LWW 0x6008
|
||||||
#define QUECTEL_PRODUCT_EM061K_LCN 0x6009
|
#define QUECTEL_PRODUCT_EM061K_LCN 0x6009
|
||||||
@@ -1277,6 +1280,10 @@ static const struct usb_device_id option_ids[] = {
|
|||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0xff, 0x30) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0xff, 0x30) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0, 0) },
|
||||||
|
|
||||||
|
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U_CN) },
|
||||||
|
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200A_CN) },
|
||||||
|
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200N_CN) },
|
||||||
|
|
||||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
|
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
|
||||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
|
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
|
||||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003),
|
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003),
|
||||||
@@ -2418,6 +2425,7 @@ static struct usb_serial_driver option_1port_device = {
|
|||||||
.suspend = usb_wwan_suspend,
|
.suspend = usb_wwan_suspend,
|
||||||
.resume = usb_wwan_resume,
|
.resume = usb_wwan_resume,
|
||||||
#endif
|
#endif
|
||||||
|
.reset_resume = usb_wwan_resume,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct usb_serial_driver * const serial_drivers[] = {
|
static struct usb_serial_driver * const serial_drivers[] = {
|
||||||
@@ -2460,6 +2468,37 @@ static int option_probe(struct usb_serial *serial,
|
|||||||
if (device_flags & NUMEP2 && iface_desc->bNumEndpoints != 2)
|
if (device_flags & NUMEP2 && iface_desc->bNumEndpoints != 2)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
#if 1 //Added by Quectel
|
||||||
|
//Quectel UC20's interface 4 can be used as USB Network device
|
||||||
|
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6)
|
||||||
|
&& serial->dev->descriptor.idProduct == cpu_to_le16(0x9003)
|
||||||
|
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
//Quectel EC20(MDM9215)'s interface 4 can be used as USB Network device
|
||||||
|
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6)
|
||||||
|
&& serial->dev->descriptor.idProduct == cpu_to_le16(0x9215)
|
||||||
|
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {
|
||||||
|
__u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);
|
||||||
|
struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;
|
||||||
|
|
||||||
|
if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) {
|
||||||
|
//ECM, RNDIS, NCM, MBIM, ACM, UAC, ADB
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((idProduct&0xF000) == 0x0000) {
|
||||||
|
//MDM interface 4 is QMI
|
||||||
|
if (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3
|
||||||
|
&& intf->bInterfaceSubClass == 0xFF && intf->bInterfaceProtocol == 0xFF)
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Store the device flags so we can use them during attach. */
|
/* Store the device flags so we can use them during attach. */
|
||||||
usb_set_serial_data(serial, (void *)device_flags);
|
usb_set_serial_data(serial, (void *)device_flags);
|
||||||
|
|
||||||
|
|||||||
@@ -436,6 +436,22 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
|
|||||||
if (intfdata->use_zlp && dir == USB_DIR_OUT)
|
if (intfdata->use_zlp && dir == USB_DIR_OUT)
|
||||||
urb->transfer_flags |= URB_ZERO_PACKET;
|
urb->transfer_flags |= URB_ZERO_PACKET;
|
||||||
|
|
||||||
|
#if 1 //Added by Quectel for Zero Packet
|
||||||
|
if (dir == USB_DIR_OUT) {
|
||||||
|
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6)
|
||||||
|
&& serial->dev->descriptor.idProduct == cpu_to_le16(0x9090))
|
||||||
|
urb->transfer_flags |= URB_ZERO_PACKET;
|
||||||
|
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6)
|
||||||
|
&& serial->dev->descriptor.idProduct == cpu_to_le16(0x9003))
|
||||||
|
urb->transfer_flags |= URB_ZERO_PACKET;
|
||||||
|
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6)
|
||||||
|
&& serial->dev->descriptor.idProduct == cpu_to_le16(0x9215))
|
||||||
|
urb->transfer_flags |= URB_ZERO_PACKET;
|
||||||
|
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C))
|
||||||
|
urb->transfer_flags |= URB_ZERO_PACKET;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return urb;
|
return urb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user