Merge remote-tracking branch 'stable/linux-3.0.y' into develop-3.0-jb
[firefly-linux-kernel-4.4.55.git] / drivers / usb / serial / option.c
index ce024577400e47196d01d1af1b29801cd29c8af9..e9c5474b8e4a620f26651aebd51a584ee848b727 100644 (file)
@@ -321,6 +321,7 @@ static void option_instat_callback(struct urb *urb);
 #define ZTE_PRODUCT_CDMA_TECH                  0xfffe
 #define ZTE_PRODUCT_AC8710                     0xfff1
 #define ZTE_PRODUCT_AC2726                     0xfff5
+#define ZTE_PRODUCT_AC100                      0x0094
 #define ZTE_PRODUCT_AC8710T                    0xffff
 #define ZTE_PRODUCT_MC2718                     0xffe8
 #define ZTE_PRODUCT_AD3812                     0xffeb
@@ -409,6 +410,11 @@ static void option_instat_callback(struct urb *urb);
 #define CINTERION_PRODUCT_EU3_P                        0x0052
 #define CINTERION_PRODUCT_PH8                  0x0053
 
+/* Thinkwill products */
+#define THINKWILL_VENDOR_ID    0x19f5
+#define THINKWILL_PRODUCT_ID   0x9909
+#define        THINKWILL_MI900_PRODUCT_ID      0x9013
+
 /* Olivetti products */
 #define OLIVETTI_VENDOR_ID                     0x0b3c
 #define OLIVETTI_PRODUCT_OLICARD100            0xc000
@@ -427,6 +433,13 @@ static void option_instat_callback(struct urb *urb);
 #define SAMSUNG_VENDOR_ID                       0x04e8
 #define SAMSUNG_PRODUCT_GT_B3730                0x6889
 
+/* leadcore LC1808*/
+#define LEADCORE_VENDOR_ID     0x1ab7
+#define LEADCORE_PRODUCT_LC1808        0x2200
+/*展讯模组*/
+#define SC8800G_VENDOR_ID      0x067b
+#define SC8800G_PRODUCT_ID     0x2303
+
 /* YUGA products  www.yuga-info.com gavin.kx@qq.com */
 #define YUGA_VENDOR_ID                         0x257A
 #define YUGA_PRODUCT_CEM600                    0x1601
@@ -568,6 +581,10 @@ static const struct option_blacklist_info zte_mf626_blacklist = {
 
 static const struct usb_device_id option_ids[] = {
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+       { USB_DEVICE(THINKWILL_VENDOR_ID,THINKWILL_PRODUCT_ID)},
+
+       { USB_DEVICE(THINKWILL_VENDOR_ID,THINKWILL_MI900_PRODUCT_ID)},
+
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
@@ -597,6 +614,7 @@ static const struct usb_device_id option_ids[] = {
        { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) },
        { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GKE) },
        { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) },
+       { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600)},
        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
@@ -1114,6 +1132,11 @@ static const struct usb_device_id option_ids[] = {
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xFFED, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xFFFE, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xFFEB, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xF006, 0xff, 0xff, 0xff) },
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_AC100)},
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff),
         .driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist },
@@ -1173,6 +1196,41 @@ static const struct usb_device_id option_ids[] = {
        { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, /* HC28 enumerates with Siemens or Cinterion VID depending on FW revision */
        { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
 
+       { USB_DEVICE(LEADCORE_VENDOR_ID, LEADCORE_PRODUCT_LC1808) },  //zzc
+       { USB_DEVICE(SC8800G_VENDOR_ID,SC8800G_PRODUCT_ID)},
+       { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) },
+       { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */
+
+// cmy:
+       { USB_DEVICE(0x0685, 0x6000) },
+       { USB_DEVICE(0x1E89, 0x1E16) },
+       { USB_DEVICE(0x7693, 0x0001) },
+       { USB_DEVICE(0x1D09, 0x4308) },
+       { USB_DEVICE(0x1234, 0x0033) },
+       { USB_DEVICE(0xFEED, 0x0001) },
+       { USB_DEVICE(ALCATEL_VENDOR_ID, 0x0017) },
+       { USB_DEVICE(0x1C9E, 0x9E00) },
+       { USB_DEVICE(0x1C9E, 0xF000) },
+       { USB_DEVICE(0x19D2, 0x1303) },
+       { USB_DEVICE(0x19F5, 0x9013) }, // MW100
+       { USB_DEVICE(0x21F5, 0x2008) },
+       { USB_DEVICE(0x12D1, 0x1D09) },
+       { USB_DEVICE(0x04CC, 0x2259) },
+       { USB_DEVICE(0x04CC, 0x226E) },
+       { USB_DEVICE(0x04CC, 0x225A) },
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0015) },
+       { USB_DEVICE(ALCATEL_VENDOR_ID, 0x00b7) },
+       { USB_DEVICE(ZTE_VENDOR_ID, 0xFFFF) },
+       { USB_DEVICE(LEADCORE_VENDOR_ID, 0x5700) },
+       { USB_DEVICE(LEADCORE_VENDOR_ID, 0x6341) },
+       { USB_DEVICE(0x230d, 0x000d) },
+       { USB_DEVICE(0x0E8D, 0x00A2) },
+       { USB_DEVICE(0x1E89, 0x1A20) },
+       { USB_DEVICE(0x12D1, 0x1C05) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0007, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff) },
+       { USB_DEVICE(0x20A6, 0x1105) },
+
        { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) },
        { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */
        { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */
@@ -1397,11 +1455,13 @@ static void option_instat_callback(struct urb *urb)
        struct usb_serial_port *port =  urb->context;
        struct usb_wwan_port_private *portdata =
                                        usb_get_serial_port_data(port);
+       static int err_times = 0;
 
        dbg("%s", __func__);
        dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
 
        if (status == 0) {
+               err_times = 0;
                struct usb_ctrlrequest *req_pkt =
                                (struct usb_ctrlrequest *)urb->transfer_buffer;
 
@@ -1435,9 +1495,17 @@ static void option_instat_callback(struct urb *urb)
                        dbg("%s: type %x req %x", __func__,
                                req_pkt->bRequestType, req_pkt->bRequest);
                }
-       } else
-               err("%s: error %d", __func__, status);
-
+       }
+       else{
+               if(status == -EPROTO && err_times++ >10){
+                       err_times = 0;
+                       printk("%s,recieve -71 error more than 10 times,so reset usb\n",__FUNCTION__);
+                       usb_queue_reset_device(port->serial->interface);
+                       return;
+               }else           
+                       err("%s : error %d",__func__, status);
+       }
+       
        /* Resubmit urb so we continue receiving IRQ data */
        if (status != -ESHUTDOWN && status != -ENOENT) {
                err = usb_submit_urb(urb, GFP_ATOMIC);