xref: /linux/drivers/usb/atm/speedtch.c (revision 36ca1195ad7f760a6af3814cb002bd3a3d4b4db1)
1 /******************************************************************************
2  *  speedtch.c  -  Alcatel SpeedTouch USB xDSL modem driver
3  *
4  *  Copyright (C) 2001, Alcatel
5  *  Copyright (C) 2003, Duncan Sands
6  *  Copyright (C) 2004, David Woodhouse
7  *
8  *  This program is free software; you can redistribute it and/or modify it
9  *  under the terms of the GNU General Public License as published by the Free
10  *  Software Foundation; either version 2 of the License, or (at your option)
11  *  any later version.
12  *
13  *  This program is distributed in the hope that it will be useful, but WITHOUT
14  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  *  more details.
17  *
18  *  You should have received a copy of the GNU General Public License along with
19  *  this program; if not, write to the Free Software Foundation, Inc., 59
20  *  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  ******************************************************************************/
23 
24 #include <linux/module.h>
25 #include <linux/moduleparam.h>
26 #include <linux/gfp.h>
27 #include <linux/kernel.h>
28 #include <linux/sched.h>
29 #include <linux/timer.h>
30 #include <linux/errno.h>
31 #include <linux/proc_fs.h>
32 #include <linux/slab.h>
33 #include <linux/wait.h>
34 #include <linux/list.h>
35 #include <asm/processor.h>
36 #include <asm/uaccess.h>
37 #include <linux/smp_lock.h>
38 #include <linux/interrupt.h>
39 #include <linux/atm.h>
40 #include <linux/atmdev.h>
41 #include <linux/crc32.h>
42 #include <linux/init.h>
43 #include <linux/firmware.h>
44 
45 #include "usb_atm.h"
46 
47 #if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
48 #	define USE_FW_LOADER
49 #endif
50 
51 #define DRIVER_AUTHOR	"Johan Verrept, Duncan Sands <duncan.sands@free.fr>"
52 #define DRIVER_VERSION	"1.8"
53 #define DRIVER_DESC	"Alcatel SpeedTouch USB driver version " DRIVER_VERSION
54 
55 static const char speedtch_driver_name[] = "speedtch";
56 
57 #define SPEEDTOUCH_VENDORID		0x06b9
58 #define SPEEDTOUCH_PRODUCTID		0x4061
59 
60 /* Timeout in jiffies */
61 #define CTRL_TIMEOUT 2000
62 #define DATA_TIMEOUT 2000
63 
64 #define OFFSET_7  0		/* size 1 */
65 #define OFFSET_b  1		/* size 8 */
66 #define OFFSET_d  9		/* size 4 */
67 #define OFFSET_e 13		/* size 1 */
68 #define OFFSET_f 14		/* size 1 */
69 #define TOTAL    15
70 
71 #define SIZE_7 1
72 #define SIZE_b 8
73 #define SIZE_d 4
74 #define SIZE_e 1
75 #define SIZE_f 1
76 
77 static int dl_512_first = 0;
78 static int sw_buffering = 0;
79 
80 module_param(dl_512_first, bool, 0444);
81 MODULE_PARM_DESC(dl_512_first, "Read 512 bytes before sending firmware");
82 
83 module_param(sw_buffering, uint, 0444);
84 MODULE_PARM_DESC(sw_buffering, "Enable software buffering");
85 
86 #define UDSL_IOCTL_LINE_UP		1
87 #define UDSL_IOCTL_LINE_DOWN		2
88 
89 #define SPEEDTCH_ENDPOINT_INT		0x81
90 #define SPEEDTCH_ENDPOINT_DATA		0x07
91 #define SPEEDTCH_ENDPOINT_FIRMWARE	0x05
92 
93 #define hex2int(c) ( (c >= '0') && (c <= '9') ? (c - '0') : ((c & 0xf) + 9) )
94 
95 static struct usb_device_id speedtch_usb_ids[] = {
96 	{USB_DEVICE(SPEEDTOUCH_VENDORID, SPEEDTOUCH_PRODUCTID)},
97 	{}
98 };
99 
100 MODULE_DEVICE_TABLE(usb, speedtch_usb_ids);
101 
102 struct speedtch_instance_data {
103 	struct udsl_instance_data u;
104 
105 	/* Status */
106 	struct urb *int_urb;
107 	unsigned char int_data[16];
108 	struct work_struct poll_work;
109 	struct timer_list poll_timer;
110 };
111 /* USB */
112 
113 static int speedtch_usb_probe(struct usb_interface *intf,
114 			      const struct usb_device_id *id);
115 static void speedtch_usb_disconnect(struct usb_interface *intf);
116 static int speedtch_usb_ioctl(struct usb_interface *intf, unsigned int code,
117 			      void *user_data);
118 static void speedtch_handle_int(struct urb *urb, struct pt_regs *regs);
119 static void speedtch_poll_status(struct speedtch_instance_data *instance);
120 
121 static struct usb_driver speedtch_usb_driver = {
122 	.owner		= THIS_MODULE,
123 	.name		= speedtch_driver_name,
124 	.probe		= speedtch_usb_probe,
125 	.disconnect	= speedtch_usb_disconnect,
126 	.ioctl		= speedtch_usb_ioctl,
127 	.id_table	= speedtch_usb_ids,
128 };
129 
130 /***************
131 **  firmware  **
132 ***************/
133 
134 static void speedtch_got_firmware(struct speedtch_instance_data *instance,
135 				  int got_it)
136 {
137 	int err;
138 	struct usb_interface *intf;
139 
140 	down(&instance->u.serialize);	/* vs self, speedtch_firmware_start */
141 	if (instance->u.status == UDSL_LOADED_FIRMWARE)
142 		goto out;
143 	if (!got_it) {
144 		instance->u.status = UDSL_NO_FIRMWARE;
145 		goto out;
146 	}
147 	if ((err = usb_set_interface(instance->u.usb_dev, 1, 1)) < 0) {
148 		dbg("speedtch_got_firmware: usb_set_interface returned %d!", err);
149 		instance->u.status = UDSL_NO_FIRMWARE;
150 		goto out;
151 	}
152 
153 	/* Set up interrupt endpoint */
154 	intf = usb_ifnum_to_if(instance->u.usb_dev, 0);
155 	if (intf && !usb_driver_claim_interface(&speedtch_usb_driver, intf, NULL)) {
156 
157 		instance->int_urb = usb_alloc_urb(0, GFP_KERNEL);
158 		if (instance->int_urb) {
159 
160 			usb_fill_int_urb(instance->int_urb, instance->u.usb_dev,
161 					 usb_rcvintpipe(instance->u.usb_dev, SPEEDTCH_ENDPOINT_INT),
162 					 instance->int_data,
163 					 sizeof(instance->int_data),
164 					 speedtch_handle_int, instance, 50);
165 			err = usb_submit_urb(instance->int_urb, GFP_KERNEL);
166 			if (err) {
167 				/* Doesn't matter; we'll poll anyway */
168 				dbg("speedtch_got_firmware: Submission of interrupt URB failed %d", err);
169 				usb_free_urb(instance->int_urb);
170 				instance->int_urb = NULL;
171 				usb_driver_release_interface(&speedtch_usb_driver, intf);
172 			}
173 		}
174 	}
175 	/* Start status polling */
176 	mod_timer(&instance->poll_timer, jiffies + (1 * HZ));
177 
178 	instance->u.status = UDSL_LOADED_FIRMWARE;
179 	tasklet_schedule(&instance->u.receive_tasklet);
180  out:
181 	up(&instance->u.serialize);
182 	wake_up_interruptible(&instance->u.firmware_waiters);
183 }
184 
185 static int speedtch_set_swbuff(struct speedtch_instance_data *instance,
186 			       int state)
187 {
188 	struct usb_device *dev = instance->u.usb_dev;
189 	int ret;
190 
191 	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
192 			      0x32, 0x40, state ? 0x01 : 0x00,
193 			      0x00, NULL, 0, 100);
194 	if (ret < 0) {
195 		printk("Warning: %sabling SW buffering: usb_control_msg returned %d\n",
196 		     state ? "En" : "Dis", ret);
197 		return ret;
198 	}
199 
200 	dbg("speedtch_set_swbuff: %sbled SW buffering", state ? "En" : "Dis");
201 	return 0;
202 }
203 
204 static void speedtch_test_sequence(struct speedtch_instance_data *instance)
205 {
206 	struct usb_device *dev = instance->u.usb_dev;
207 	unsigned char buf[10];
208 	int ret;
209 
210 	/* URB 147 */
211 	buf[0] = 0x1c;
212 	buf[1] = 0x50;
213 	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
214 			      0x01, 0x40, 0x0b, 0x00, buf, 2, 100);
215 	if (ret < 0)
216 		printk(KERN_WARNING "%s failed on URB147: %d\n", __func__, ret);
217 
218 	/* URB 148 */
219 	buf[0] = 0x32;
220 	buf[1] = 0x00;
221 	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
222 			      0x01, 0x40, 0x02, 0x00, buf, 2, 100);
223 	if (ret < 0)
224 		printk(KERN_WARNING "%s failed on URB148: %d\n", __func__, ret);
225 
226 	/* URB 149 */
227 	buf[0] = 0x01;
228 	buf[1] = 0x00;
229 	buf[2] = 0x01;
230 	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
231 			      0x01, 0x40, 0x03, 0x00, buf, 3, 100);
232 	if (ret < 0)
233 		printk(KERN_WARNING "%s failed on URB149: %d\n", __func__, ret);
234 
235 	/* URB 150 */
236 	buf[0] = 0x01;
237 	buf[1] = 0x00;
238 	buf[2] = 0x01;
239 	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
240 			      0x01, 0x40, 0x04, 0x00, buf, 3, 100);
241 	if (ret < 0)
242 		printk(KERN_WARNING "%s failed on URB150: %d\n", __func__, ret);
243 }
244 
245 static int speedtch_start_synchro(struct speedtch_instance_data *instance)
246 {
247 	struct usb_device *dev = instance->u.usb_dev;
248 	unsigned char buf[2];
249 	int ret;
250 
251 	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
252 			      0x12, 0xc0, 0x04, 0x00,
253 			      buf, sizeof(buf), CTRL_TIMEOUT);
254 	if (ret < 0) {
255 		printk(KERN_WARNING "SpeedTouch: Failed to start ADSL synchronisation: %d\n", ret);
256 		return ret;
257 	}
258 
259 	dbg("speedtch_start_synchro: modem prodded. %d Bytes returned: %02x %02x", ret, buf[0], buf[1]);
260 	return 0;
261 }
262 
263 static void speedtch_handle_int(struct urb *urb, struct pt_regs *regs)
264 {
265 	struct speedtch_instance_data *instance = urb->context;
266 	unsigned int count = urb->actual_length;
267 	int ret;
268 
269 	/* The magic interrupt for "up state" */
270 	const static unsigned char up_int[6]   = { 0xa1, 0x00, 0x01, 0x00, 0x00, 0x00 };
271 	/* The magic interrupt for "down state" */
272 	const static unsigned char down_int[6] = { 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00 };
273 
274 	switch (urb->status) {
275 	case 0:
276 		/* success */
277 		break;
278 	case -ECONNRESET:
279 	case -ENOENT:
280 	case -ESHUTDOWN:
281 		/* this urb is terminated; clean up */
282 		dbg("%s - urb shutting down with status: %d", __func__, urb->status);
283 		return;
284 	default:
285 		dbg("%s - nonzero urb status received: %d", __func__, urb->status);
286 		goto exit;
287 	}
288 
289 	if (count < 6) {
290 		dbg("%s - int packet too short", __func__);
291 		goto exit;
292 	}
293 
294 	if (!memcmp(up_int, instance->int_data, 6)) {
295 		del_timer(&instance->poll_timer);
296 		printk(KERN_NOTICE "DSL line goes up\n");
297 	} else if (!memcmp(down_int, instance->int_data, 6)) {
298 		printk(KERN_NOTICE "DSL line goes down\n");
299 	} else {
300 		int i;
301 
302 		printk(KERN_DEBUG "Unknown interrupt packet of %d bytes:", count);
303 		for (i = 0; i < count; i++)
304 			printk(" %02x", instance->int_data[i]);
305 		printk("\n");
306 	}
307 	schedule_work(&instance->poll_work);
308 
309  exit:
310 	rmb();
311 	if (!instance->int_urb)
312 		return;
313 
314 	ret = usb_submit_urb(urb, GFP_ATOMIC);
315 	if (ret)
316 		err("%s - usb_submit_urb failed with result %d", __func__, ret);
317 }
318 
319 static int speedtch_get_status(struct speedtch_instance_data *instance,
320 			       unsigned char *buf)
321 {
322 	struct usb_device *dev = instance->u.usb_dev;
323 	int ret;
324 
325 	memset(buf, 0, TOTAL);
326 
327 	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
328 			      0x12, 0xc0, 0x07, 0x00, buf + OFFSET_7, SIZE_7,
329 			      CTRL_TIMEOUT);
330 	if (ret < 0) {
331 		dbg("MSG 7 failed");
332 		return ret;
333 	}
334 
335 	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
336 			      0x12, 0xc0, 0x0b, 0x00, buf + OFFSET_b, SIZE_b,
337 			      CTRL_TIMEOUT);
338 	if (ret < 0) {
339 		dbg("MSG B failed");
340 		return ret;
341 	}
342 
343 	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
344 			      0x12, 0xc0, 0x0d, 0x00, buf + OFFSET_d, SIZE_d,
345 			      CTRL_TIMEOUT);
346 	if (ret < 0) {
347 		dbg("MSG D failed");
348 		return ret;
349 	}
350 
351 	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
352 			      0x01, 0xc0, 0x0e, 0x00, buf + OFFSET_e, SIZE_e,
353 			      CTRL_TIMEOUT);
354 	if (ret < 0) {
355 		dbg("MSG E failed");
356 		return ret;
357 	}
358 
359 	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
360 			      0x01, 0xc0, 0x0f, 0x00, buf + OFFSET_f, SIZE_f,
361 			      CTRL_TIMEOUT);
362 	if (ret < 0) {
363 		dbg("MSG F failed");
364 		return ret;
365 	}
366 
367 	return 0;
368 }
369 
370 static void speedtch_poll_status(struct speedtch_instance_data *instance)
371 {
372 	unsigned char buf[TOTAL];
373 	int ret;
374 
375 	ret = speedtch_get_status(instance, buf);
376 	if (ret) {
377 		printk(KERN_WARNING
378 		       "SpeedTouch: Error %d fetching device status\n", ret);
379 		return;
380 	}
381 
382 	dbg("Line state %02x", buf[OFFSET_7]);
383 
384 	switch (buf[OFFSET_7]) {
385 	case 0:
386 		if (instance->u.atm_dev->signal != ATM_PHY_SIG_LOST) {
387 			instance->u.atm_dev->signal = ATM_PHY_SIG_LOST;
388 			printk(KERN_NOTICE "ADSL line is down\n");
389 			/* It'll never resync again unless we ask it to... */
390 			speedtch_start_synchro(instance);
391 		}
392 		break;
393 
394 	case 0x08:
395 		if (instance->u.atm_dev->signal != ATM_PHY_SIG_UNKNOWN) {
396 			instance->u.atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
397 			printk(KERN_NOTICE "ADSL line is blocked?\n");
398 		}
399 		break;
400 
401 	case 0x10:
402 		if (instance->u.atm_dev->signal != ATM_PHY_SIG_LOST) {
403 			instance->u.atm_dev->signal = ATM_PHY_SIG_LOST;
404 			printk(KERN_NOTICE "ADSL line is synchronising\n");
405 		}
406 		break;
407 
408 	case 0x20:
409 		if (instance->u.atm_dev->signal != ATM_PHY_SIG_FOUND) {
410 			int down_speed = buf[OFFSET_b] | (buf[OFFSET_b + 1] << 8)
411 				| (buf[OFFSET_b + 2] << 16) | (buf[OFFSET_b + 3] << 24);
412 			int up_speed = buf[OFFSET_b + 4] | (buf[OFFSET_b + 5] << 8)
413 				| (buf[OFFSET_b + 6] << 16) | (buf[OFFSET_b + 7] << 24);
414 
415 			if (!(down_speed & 0x0000ffff) &&
416 			    !(up_speed & 0x0000ffff)) {
417 				down_speed >>= 16;
418 				up_speed >>= 16;
419 			}
420 			instance->u.atm_dev->link_rate = down_speed * 1000 / 424;
421 			instance->u.atm_dev->signal = ATM_PHY_SIG_FOUND;
422 
423 			printk(KERN_NOTICE
424 			       "ADSL line is up (%d Kib/s down | %d Kib/s up)\n",
425 			       down_speed, up_speed);
426 		}
427 		break;
428 
429 	default:
430 		if (instance->u.atm_dev->signal != ATM_PHY_SIG_UNKNOWN) {
431 			instance->u.atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
432 			printk(KERN_NOTICE "Unknown line state %02x\n", buf[OFFSET_7]);
433 		}
434 		break;
435 	}
436 }
437 
438 static void speedtch_timer_poll(unsigned long data)
439 {
440 	struct speedtch_instance_data *instance = (void *)data;
441 
442 	schedule_work(&instance->poll_work);
443 	mod_timer(&instance->poll_timer, jiffies + (5 * HZ));
444 }
445 
446 #ifdef USE_FW_LOADER
447 static void speedtch_upload_firmware(struct speedtch_instance_data *instance,
448 				     const struct firmware *fw1,
449 				     const struct firmware *fw2)
450 {
451 	unsigned char *buffer;
452 	struct usb_device *usb_dev = instance->u.usb_dev;
453 	struct usb_interface *intf;
454 	int actual_length, ret;
455 	int offset;
456 
457 	dbg("speedtch_upload_firmware");
458 
459 	if (!(intf = usb_ifnum_to_if(usb_dev, 2))) {
460 		dbg("speedtch_upload_firmware: interface not found!");
461 		goto fail;
462 	}
463 
464 	if (!(buffer = (unsigned char *)__get_free_page(GFP_KERNEL))) {
465 		dbg("speedtch_upload_firmware: no memory for buffer!");
466 		goto fail;
467 	}
468 
469 	/* A user-space firmware loader may already have claimed interface #2 */
470 	if ((ret =
471 	     usb_driver_claim_interface(&speedtch_usb_driver, intf, NULL)) < 0) {
472 		dbg("speedtch_upload_firmware: interface in use (%d)!", ret);
473 		goto fail_free;
474 	}
475 
476 	/* URB 7 */
477 	if (dl_512_first) {	/* some modems need a read before writing the firmware */
478 		ret = usb_bulk_msg(usb_dev, usb_rcvbulkpipe(usb_dev, SPEEDTCH_ENDPOINT_FIRMWARE),
479 				   buffer, 0x200, &actual_length, 2000);
480 
481 		if (ret < 0 && ret != -ETIMEDOUT)
482 			dbg("speedtch_upload_firmware: read BLOCK0 from modem failed (%d)!", ret);
483 		else
484 			dbg("speedtch_upload_firmware: BLOCK0 downloaded (%d bytes)", ret);
485 	}
486 
487 	/* URB 8 : both leds are static green */
488 	for (offset = 0; offset < fw1->size; offset += PAGE_SIZE) {
489 		int thislen = min_t(int, PAGE_SIZE, fw1->size - offset);
490 		memcpy(buffer, fw1->data + offset, thislen);
491 
492 		ret = usb_bulk_msg(usb_dev, usb_sndbulkpipe(usb_dev, SPEEDTCH_ENDPOINT_FIRMWARE),
493 				   buffer, thislen, &actual_length, DATA_TIMEOUT);
494 
495 		if (ret < 0) {
496 			dbg("speedtch_upload_firmware: write BLOCK1 to modem failed (%d)!", ret);
497 			goto fail_release;
498 		}
499 		dbg("speedtch_upload_firmware: BLOCK1 uploaded (%zu bytes)", fw1->size);
500 	}
501 
502 	/* USB led blinking green, ADSL led off */
503 
504 	/* URB 11 */
505 	ret = usb_bulk_msg(usb_dev, usb_rcvbulkpipe(usb_dev, SPEEDTCH_ENDPOINT_FIRMWARE),
506 			   buffer, 0x200, &actual_length, DATA_TIMEOUT);
507 
508 	if (ret < 0) {
509 		dbg("speedtch_upload_firmware: read BLOCK2 from modem failed (%d)!", ret);
510 		goto fail_release;
511 	}
512 	dbg("speedtch_upload_firmware: BLOCK2 downloaded (%d bytes)", actual_length);
513 
514 	/* URBs 12 to 139 - USB led blinking green, ADSL led off */
515 	for (offset = 0; offset < fw2->size; offset += PAGE_SIZE) {
516 		int thislen = min_t(int, PAGE_SIZE, fw2->size - offset);
517 		memcpy(buffer, fw2->data + offset, thislen);
518 
519 		ret = usb_bulk_msg(usb_dev, usb_sndbulkpipe(usb_dev, SPEEDTCH_ENDPOINT_FIRMWARE),
520 				   buffer, thislen, &actual_length, DATA_TIMEOUT);
521 
522 		if (ret < 0) {
523 			dbg("speedtch_upload_firmware: write BLOCK3 to modem failed (%d)!", ret);
524 			goto fail_release;
525 		}
526 	}
527 	dbg("speedtch_upload_firmware: BLOCK3 uploaded (%zu bytes)", fw2->size);
528 
529 	/* USB led static green, ADSL led static red */
530 
531 	/* URB 142 */
532 	ret = usb_bulk_msg(usb_dev, usb_rcvbulkpipe(usb_dev, SPEEDTCH_ENDPOINT_FIRMWARE),
533 			   buffer, 0x200, &actual_length, DATA_TIMEOUT);
534 
535 	if (ret < 0) {
536 		dbg("speedtch_upload_firmware: read BLOCK4 from modem failed (%d)!", ret);
537 		goto fail_release;
538 	}
539 
540 	/* success */
541 	dbg("speedtch_upload_firmware: BLOCK4 downloaded (%d bytes)", actual_length);
542 
543 	/* Delay to allow firmware to start up. We can do this here
544 	   because we're in our own kernel thread anyway. */
545 	msleep(1000);
546 
547 	/* Enable software buffering, if requested */
548 	if (sw_buffering)
549 		speedtch_set_swbuff(instance, 1);
550 
551 	/* Magic spell; don't ask us what this does */
552 	speedtch_test_sequence(instance);
553 
554 	/* Start modem synchronisation */
555 	if (speedtch_start_synchro(instance))
556 		dbg("speedtch_start_synchro: failed");
557 
558 	speedtch_got_firmware(instance, 1);
559 
560 	free_page((unsigned long)buffer);
561 	return;
562 
563  fail_release:
564 	/* Only release interface #2 if uploading failed; we don't release it
565 	   we succeeded.  This prevents the userspace tools from trying to load
566 	   the firmware themselves */
567 	usb_driver_release_interface(&speedtch_usb_driver, intf);
568  fail_free:
569 	free_page((unsigned long)buffer);
570  fail:
571 	speedtch_got_firmware(instance, 0);
572 }
573 
574 static int speedtch_find_firmware(struct speedtch_instance_data
575 				  *instance, int phase,
576 				  const struct firmware **fw_p)
577 {
578 	char buf[24];
579 	const u16 bcdDevice = le16_to_cpu(instance->u.usb_dev->descriptor.bcdDevice);
580 	const u8 major_revision = bcdDevice >> 8;
581 	const u8 minor_revision = bcdDevice & 0xff;
582 
583 	sprintf(buf, "speedtch-%d.bin.%x.%02x", phase, major_revision, minor_revision);
584 	dbg("speedtch_find_firmware: looking for %s", buf);
585 
586 	if (request_firmware(fw_p, buf, &instance->u.usb_dev->dev)) {
587 		sprintf(buf, "speedtch-%d.bin.%x", phase, major_revision);
588 		dbg("speedtch_find_firmware: looking for %s", buf);
589 
590 		if (request_firmware(fw_p, buf, &instance->u.usb_dev->dev)) {
591 			sprintf(buf, "speedtch-%d.bin", phase);
592 			dbg("speedtch_find_firmware: looking for %s", buf);
593 
594 			if (request_firmware(fw_p, buf, &instance->u.usb_dev->dev)) {
595 				dev_warn(&instance->u.usb_dev->dev, "no stage %d firmware found!", phase);
596 				return -ENOENT;
597 			}
598 		}
599 	}
600 
601 	dev_info(&instance->u.usb_dev->dev, "found stage %d firmware %s\n", phase, buf);
602 
603 	return 0;
604 }
605 
606 static int speedtch_load_firmware(void *arg)
607 {
608 	const struct firmware *fw1, *fw2;
609 	struct speedtch_instance_data *instance = arg;
610 
611 	BUG_ON(!instance);
612 
613 	daemonize("firmware/speedtch");
614 
615 	if (!speedtch_find_firmware(instance, 1, &fw1)) {
616 		if (!speedtch_find_firmware(instance, 2, &fw2)) {
617 			speedtch_upload_firmware(instance, fw1, fw2);
618 			release_firmware(fw2);
619 		}
620 		release_firmware(fw1);
621 	}
622 
623 	/* In case we failed, set state back to NO_FIRMWARE so that
624 	   another later attempt may work. Otherwise, we never actually
625 	   manage to recover if, for example, the firmware is on /usr and
626 	   we look for it too early. */
627 	speedtch_got_firmware(instance, 0);
628 
629 	module_put(THIS_MODULE);
630 	udsl_put_instance(&instance->u);
631 	return 0;
632 }
633 #endif /* USE_FW_LOADER */
634 
635 static void speedtch_firmware_start(struct speedtch_instance_data *instance)
636 {
637 #ifdef USE_FW_LOADER
638 	int ret;
639 #endif
640 
641 	dbg("speedtch_firmware_start");
642 
643 	down(&instance->u.serialize);	/* vs self, speedtch_got_firmware */
644 
645 	if (instance->u.status >= UDSL_LOADING_FIRMWARE) {
646 		up(&instance->u.serialize);
647 		return;
648 	}
649 
650 	instance->u.status = UDSL_LOADING_FIRMWARE;
651 	up(&instance->u.serialize);
652 
653 #ifdef USE_FW_LOADER
654 	udsl_get_instance(&instance->u);
655 	try_module_get(THIS_MODULE);
656 
657 	ret = kernel_thread(speedtch_load_firmware, instance,
658 			    CLONE_FS | CLONE_FILES);
659 
660 	if (ret >= 0)
661 		return;		/* OK */
662 
663 	dbg("speedtch_firmware_start: kernel_thread failed (%d)!", ret);
664 
665 	module_put(THIS_MODULE);
666 	udsl_put_instance(&instance->u);
667 	/* Just pretend it never happened... hope modem_run happens */
668 #endif				/* USE_FW_LOADER */
669 
670 	speedtch_got_firmware(instance, 0);
671 }
672 
673 static int speedtch_firmware_wait(struct udsl_instance_data *instance)
674 {
675 	speedtch_firmware_start((void *)instance);
676 
677 	if (wait_event_interruptible(instance->firmware_waiters, instance->status != UDSL_LOADING_FIRMWARE) < 0)
678 		return -ERESTARTSYS;
679 
680 	return (instance->status == UDSL_LOADED_FIRMWARE) ? 0 : -EAGAIN;
681 }
682 
683 /**********
684 **  USB  **
685 **********/
686 
687 static int speedtch_usb_ioctl(struct usb_interface *intf, unsigned int code,
688 			      void *user_data)
689 {
690 	struct speedtch_instance_data *instance = usb_get_intfdata(intf);
691 
692 	dbg("speedtch_usb_ioctl entered");
693 
694 	if (!instance) {
695 		dbg("speedtch_usb_ioctl: NULL instance!");
696 		return -ENODEV;
697 	}
698 
699 	switch (code) {
700 	case UDSL_IOCTL_LINE_UP:
701 		instance->u.atm_dev->signal = ATM_PHY_SIG_FOUND;
702 		speedtch_got_firmware(instance, 1);
703 		return (instance->u.status == UDSL_LOADED_FIRMWARE) ? 0 : -EIO;
704 	case UDSL_IOCTL_LINE_DOWN:
705 		instance->u.atm_dev->signal = ATM_PHY_SIG_LOST;
706 		return 0;
707 	default:
708 		return -ENOTTY;
709 	}
710 }
711 
712 static int speedtch_usb_probe(struct usb_interface *intf,
713 			      const struct usb_device_id *id)
714 {
715 	struct usb_device *dev = interface_to_usbdev(intf);
716 	int ifnum = intf->altsetting->desc.bInterfaceNumber;
717 	struct speedtch_instance_data *instance;
718 	unsigned char mac_str[13];
719 	int ret, i;
720 	char buf7[SIZE_7];
721 
722 	dbg("speedtch_usb_probe: trying device with vendor=0x%x, product=0x%x, ifnum %d",
723 	    le16_to_cpu(dev->descriptor.idVendor),
724 	    le16_to_cpu(dev->descriptor.idProduct), ifnum);
725 
726 	if ((dev->descriptor.bDeviceClass != USB_CLASS_VENDOR_SPEC) ||
727 	    (ifnum != 1))
728 		return -ENODEV;
729 
730 	dbg("speedtch_usb_probe: device accepted");
731 
732 	/* instance init */
733 	instance = kmalloc(sizeof(*instance), GFP_KERNEL);
734 	if (!instance) {
735 		dbg("speedtch_usb_probe: no memory for instance data!");
736 		return -ENOMEM;
737 	}
738 
739 	memset(instance, 0, sizeof(struct speedtch_instance_data));
740 
741 	if ((ret = usb_set_interface(dev, 0, 0)) < 0)
742 		goto fail;
743 
744 	if ((ret = usb_set_interface(dev, 2, 0)) < 0)
745 		goto fail;
746 
747 	instance->u.data_endpoint = SPEEDTCH_ENDPOINT_DATA;
748 	instance->u.firmware_wait = speedtch_firmware_wait;
749 	instance->u.driver_name = speedtch_driver_name;
750 
751 	ret = udsl_instance_setup(dev, &instance->u);
752 	if (ret)
753 		goto fail;
754 
755 	init_timer(&instance->poll_timer);
756 	instance->poll_timer.function = speedtch_timer_poll;
757 	instance->poll_timer.data = (unsigned long)instance;
758 
759 	INIT_WORK(&instance->poll_work, (void *)speedtch_poll_status, instance);
760 
761 	/* set MAC address, it is stored in the serial number */
762 	memset(instance->u.atm_dev->esi, 0, sizeof(instance->u.atm_dev->esi));
763 	if (usb_string(dev, dev->descriptor.iSerialNumber, mac_str, sizeof(mac_str)) == 12) {
764 		for (i = 0; i < 6; i++)
765 			instance->u.atm_dev->esi[i] =
766 				(hex2int(mac_str[i * 2]) * 16) + (hex2int(mac_str[i * 2 + 1]));
767 	}
768 
769 	/* First check whether the modem already seems to be alive */
770 	ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
771 			      0x12, 0xc0, 0x07, 0x00, buf7, SIZE_7, 500);
772 
773 	if (ret == SIZE_7) {
774 		dbg("firmware appears to be already loaded");
775 		speedtch_got_firmware(instance, 1);
776 		speedtch_poll_status(instance);
777 	} else {
778 		speedtch_firmware_start(instance);
779 	}
780 
781 	usb_set_intfdata(intf, instance);
782 
783 	return 0;
784 
785  fail:
786 	kfree(instance);
787 
788 	return -ENOMEM;
789 }
790 
791 static void speedtch_usb_disconnect(struct usb_interface *intf)
792 {
793 	struct speedtch_instance_data *instance = usb_get_intfdata(intf);
794 
795 	dbg("speedtch_usb_disconnect entered");
796 
797 	if (!instance) {
798 		dbg("speedtch_usb_disconnect: NULL instance!");
799 		return;
800 	}
801 
802 /*QQ need to handle disconnects on interface #2 while uploading firmware */
803 /*QQ and what about interface #1? */
804 
805 	if (instance->int_urb) {
806 		struct urb *int_urb = instance->int_urb;
807 		instance->int_urb = NULL;
808 		wmb();
809 		usb_unlink_urb(int_urb);
810 		usb_free_urb(int_urb);
811 	}
812 
813 	instance->int_data[0] = 1;
814 	del_timer_sync(&instance->poll_timer);
815 	wmb();
816 	flush_scheduled_work();
817 
818 	udsl_instance_disconnect(&instance->u);
819 
820 	/* clean up */
821 	usb_set_intfdata(intf, NULL);
822 	udsl_put_instance(&instance->u);
823 }
824 
825 /***********
826 **  init  **
827 ***********/
828 
829 static int __init speedtch_usb_init(void)
830 {
831 	dbg("speedtch_usb_init: driver version " DRIVER_VERSION);
832 
833 	return usb_register(&speedtch_usb_driver);
834 }
835 
836 static void __exit speedtch_usb_cleanup(void)
837 {
838 	dbg("speedtch_usb_cleanup entered");
839 
840 	usb_deregister(&speedtch_usb_driver);
841 }
842 
843 module_init(speedtch_usb_init);
844 module_exit(speedtch_usb_cleanup);
845 
846 MODULE_AUTHOR(DRIVER_AUTHOR);
847 MODULE_DESCRIPTION(DRIVER_DESC);
848 MODULE_LICENSE("GPL");
849 MODULE_VERSION(DRIVER_VERSION);
850