aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/serial/sierra.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
index af667a1828b0..f791eb8887fc 100644
--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -108,6 +108,26 @@ static int sierra_calc_num_ports(struct usb_serial *serial)
108 return result; 108 return result;
109} 109}
110 110
111static int sierra_calc_interface(struct usb_serial *serial)
112{
113 int interface;
114 struct usb_interface *p_interface;
115 struct usb_host_interface *p_host_interface;
116
117 /* Get the interface structure pointer from the serial struct */
118 p_interface = serial->interface;
119
120 /* Get a pointer to the host interface structure */
121 p_host_interface = p_interface->cur_altsetting;
122
123 /* read the interface descriptor for this active altsetting
124 * to find out the interface number we are on
125 */
126 interface = p_host_interface->desc.bInterfaceNumber;
127
128 return interface;
129}
130
111static int sierra_probe(struct usb_serial *serial, 131static int sierra_probe(struct usb_serial *serial,
112 const struct usb_device_id *id) 132 const struct usb_device_id *id)
113{ 133{
@@ -123,6 +143,22 @@ static int sierra_probe(struct usb_serial *serial,
123 ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber; 143 ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
124 udev = serial->dev; 144 udev = serial->dev;
125 145
146 /* Figure out the interface number from the serial structure */
147 ifnum = sierra_calc_interface(serial);
148
149 /*
150 * If this interface supports more than 1 alternate
151 * select the 2nd one
152 */
153 if (serial->interface->num_altsetting == 2) {
154 dev_dbg(&udev->dev,
155 "Selecting alt setting for interface %d\n",
156 ifnum);
157
158 /* We know the alternate setting is 1 for the MC8785 */
159 usb_set_interface(udev, ifnum, 1);
160 }
161
126 /* Check if in installer mode */ 162 /* Check if in installer mode */
127 if (truinstall && id->driver_info == DEVICE_INSTALLER) { 163 if (truinstall && id->driver_info == DEVICE_INSTALLER) {
128 dev_dbg(&udev->dev, "%s", "FOUND TRU-INSTALL DEVICE(SW)\n"); 164 dev_dbg(&udev->dev, "%s", "FOUND TRU-INSTALL DEVICE(SW)\n");
@@ -165,14 +201,18 @@ static struct usb_device_id id_table [] = {
165 { USB_DEVICE(0x1199, 0x6815) }, /* Sierra Wireless MC8775 */ 201 { USB_DEVICE(0x1199, 0x6815) }, /* Sierra Wireless MC8775 */
166 { USB_DEVICE(0x03f0, 0x1e1d) }, /* HP hs2300 a.k.a MC8775 */ 202 { USB_DEVICE(0x03f0, 0x1e1d) }, /* HP hs2300 a.k.a MC8775 */
167 { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */ 203 { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
204 { USB_DEVICE(0x1199, 0x6821) }, /* Sierra Wireless AirCard 875U */
168 { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780*/ 205 { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780*/
169 { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781*/ 206 { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781*/
207 { USB_DEVICE(0x1199, 0x683B), .driver_info = DEVICE_1_PORT }, /* Sierra Wireless MC8785 Composite*/
170 { USB_DEVICE(0x1199, 0x6850) }, /* Sierra Wireless AirCard 880 */ 208 { USB_DEVICE(0x1199, 0x6850) }, /* Sierra Wireless AirCard 880 */
171 { USB_DEVICE(0x1199, 0x6851) }, /* Sierra Wireless AirCard 881 */ 209 { USB_DEVICE(0x1199, 0x6851) }, /* Sierra Wireless AirCard 881 */
172 { USB_DEVICE(0x1199, 0x6852) }, /* Sierra Wireless AirCard 880 E */ 210 { USB_DEVICE(0x1199, 0x6852) }, /* Sierra Wireless AirCard 880 E */
173 { USB_DEVICE(0x1199, 0x6853) }, /* Sierra Wireless AirCard 881 E */ 211 { USB_DEVICE(0x1199, 0x6853) }, /* Sierra Wireless AirCard 881 E */
174 { USB_DEVICE(0x1199, 0x6855) }, /* Sierra Wireless AirCard 880 U */ 212 { USB_DEVICE(0x1199, 0x6855) }, /* Sierra Wireless AirCard 880 U */
175 { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881 U */ 213 { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881 U */
214 { USB_DEVICE(0x1199, 0x6859), .driver_info = DEVICE_1_PORT }, /* Sierra Wireless AirCard 885 E */
215 { USB_DEVICE(0x1199, 0x685A), .driver_info = DEVICE_1_PORT }, /* Sierra Wireless AirCard 885 E */
176 216
177 { USB_DEVICE(0x1199, 0x6468) }, /* Sierra Wireless MP3G - EVDO */ 217 { USB_DEVICE(0x1199, 0x6468) }, /* Sierra Wireless MP3G - EVDO */
178 { USB_DEVICE(0x1199, 0x6469) }, /* Sierra Wireless MP3G - UMTS/HSPA */ 218 { USB_DEVICE(0x1199, 0x6469) }, /* Sierra Wireless MP3G - UMTS/HSPA */