27 #include <linux/device.h>
28 #include <linux/errno.h>
31 #include <linux/kernel.h>
32 #include <linux/module.h>
34 #include <linux/slab.h>
35 #include <linux/stat.h>
37 #include <linux/types.h>
38 #include <linux/usb/ch9.h>
44 #define DRIVER_VERSION "1.10"
45 #define DRIVER_DESC "Alcatel SpeedTouch USB driver version " DRIVER_VERSION
47 static const char speedtch_driver_name[] =
"speedtch";
49 #define CTRL_TIMEOUT 2000
50 #define DATA_TIMEOUT 2000
64 #define MIN_POLL_DELAY 5000
65 #define MAX_POLL_DELAY 60000
67 #define RESUBMIT_DELAY 1000
69 #define DEFAULT_BULK_ALTSETTING 1
70 #define DEFAULT_ISOC_ALTSETTING 3
71 #define DEFAULT_DL_512_FIRST 0
72 #define DEFAULT_ENABLE_ISOC 0
73 #define DEFAULT_SW_BUFFERING 0
75 static unsigned int altsetting = 0;
80 #define DEFAULT_B_MAX_DSL 8128
81 #define DEFAULT_MODEM_MODE 11
82 #define MODEM_OPTION_LENGTH 16
84 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
90 static unsigned int num_ModemOption;
94 "Alternative setting for data interface (bulk_default: "
100 "Read 512 bytes before sending firmware (default: "
105 "Use isochronous transfers if available (default: "
110 "Enable software buffering (default: "
124 #define INTERFACE_DATA 1
125 #define ENDPOINT_INT 0x81
126 #define ENDPOINT_BULK_DATA 0x07
127 #define ENDPOINT_ISOC_DATA 0x07
128 #define ENDPOINT_FIRMWARE 0x05
163 struct usb_device *usb_dev = usbatm->
usb_dev;
170 "%sabling SW buffering: usb_control_msg returned %d\n",
171 state ?
"En" :
"Dis", ret);
173 usb_dbg(usbatm,
"speedtch_set_swbuff: %sbled SW buffering\n", state ?
"En" :
"Dis");
179 struct usb_device *usb_dev = usbatm->
usb_dev;
189 usb_warn(usbatm,
"%s failed on URB147: %d\n", __func__, ret);
197 usb_warn(usbatm,
"%s failed on URB148: %d\n", __func__, ret);
206 usb_warn(usbatm,
"%s failed on URB149: %d\n", __func__, ret);
215 usb_warn(usbatm,
"%s failed on URB150: %d\n", __func__, ret);
220 buf[0] = instance->
params.ModemMode;
224 usb_warn(usbatm,
"%s failed on URBext1: %d\n", __func__, ret);
231 0x01, 0x40, 0x14, 0x00,
232 instance->
params.ModemOption,
235 usb_warn(usbatm,
"%s failed on URBext2: %d\n", __func__, ret);
238 buf[0] = instance->
params.BMaxDSL & 0xff;
239 buf[1] = instance->
params.BMaxDSL >> 8;
243 usb_warn(usbatm,
"%s failed on URBext3: %d\n", __func__, ret);
252 struct usb_device *usb_dev = usbatm->
usb_dev;
257 usb_dbg(usbatm,
"%s entered\n", __func__);
261 usb_dbg(usbatm,
"%s: no memory for buffer!\n", __func__);
267 usb_dbg(usbatm,
"%s: interface not found!\n", __func__);
274 buffer, 0x200, &actual_length, 2000);
277 usb_warn(usbatm,
"%s: read BLOCK0 from modem failed (%d)!\n", __func__, ret);
279 usb_dbg(usbatm,
"%s: BLOCK0 downloaded (%d bytes)\n", __func__, ret);
291 usb_err(usbatm,
"%s: write BLOCK1 to modem failed (%d)!\n", __func__, ret);
294 usb_dbg(usbatm,
"%s: BLOCK1 uploaded (%zu bytes)\n", __func__, fw1->
size);
304 usb_err(usbatm,
"%s: read BLOCK2 from modem failed (%d)!\n", __func__, ret);
307 usb_dbg(usbatm,
"%s: BLOCK2 downloaded (%d bytes)\n", __func__, actual_length);
318 usb_err(usbatm,
"%s: write BLOCK3 to modem failed (%d)!\n", __func__, ret);
322 usb_dbg(usbatm,
"%s: BLOCK3 uploaded (%zu bytes)\n", __func__, fw2->
size);
331 usb_err(usbatm,
"%s: read BLOCK4 from modem failed (%d)!\n", __func__, ret);
336 usb_dbg(usbatm,
"%s: BLOCK4 downloaded (%d bytes)\n", __func__, actual_length);
343 usb_err(usbatm,
"%s: setting interface to %d failed (%d)!\n", __func__, instance->
params.altsetting, ret);
349 speedtch_set_swbuff(instance, 1);
352 speedtch_test_sequence(instance);
367 const u8 major_revision = bcdDevice >> 8;
368 const u8 minor_revision = bcdDevice & 0xff;
371 sprintf(buf,
"speedtch-%d.bin.%x.%02x", phase, major_revision, minor_revision);
372 usb_dbg(usbatm,
"%s: looking for %s\n", __func__, buf);
375 sprintf(buf,
"speedtch-%d.bin.%x", phase, major_revision);
376 usb_dbg(usbatm,
"%s: looking for %s\n", __func__, buf);
379 sprintf(buf,
"speedtch-%d.bin", phase);
380 usb_dbg(usbatm,
"%s: looking for %s\n", __func__, buf);
383 usb_err(usbatm,
"%s: no stage %d firmware found!\n", __func__, phase);
389 usb_info(usbatm,
"found stage %d firmware %s\n", phase, buf);
400 if ((ret = speedtch_find_firmware(usbatm, intf, 1, &fw1)) < 0)
403 if ((ret = speedtch_find_firmware(usbatm, intf, 2, &fw2)) < 0) {
408 if ((ret = speedtch_upload_firmware(instance, fw1, fw2)) < 0)
409 usb_err(usbatm,
"%s: firmware upload failed (%d)!\n", __func__, ret);
425 struct usb_device *usb_dev = usbatm->
usb_dev;
435 atm_dbg(usbatm,
"%s: MSG 7 failed\n", __func__);
443 atm_dbg(usbatm,
"%s: MSG B failed\n", __func__);
451 atm_dbg(usbatm,
"%s: MSG D failed\n", __func__);
459 atm_dbg(usbatm,
"%s: MSG E failed\n", __func__);
467 atm_dbg(usbatm,
"%s: MSG F failed\n", __func__);
477 struct usb_device *usb_dev = usbatm->
usb_dev;
481 atm_dbg(usbatm,
"%s entered\n", __func__);
486 0x12, 0xc0, 0x04, 0x00,
490 atm_warn(usbatm,
"failed to start ADSL synchronisation: %d\n", ret);
492 atm_dbg(usbatm,
"%s: modem prodded. %d bytes returned: %02x %02x\n",
493 __func__, ret, buf[0], buf[1]);
506 int down_speed, up_speed,
ret;
510 atm_dbg(usbatm,
"%s entered\n", __func__);
513 ret = speedtch_read_status(instance);
515 atm_warn(usbatm,
"error %d fetching device status\n", ret);
524 if ((status != instance->
last_status) || !status) {
525 atm_dbg(usbatm,
"%s: line state 0x%02x\n", __func__, status);
531 atm_info(usbatm,
"ADSL line is down\n");
533 ret = speedtch_start_synchro(instance);
538 atm_info(usbatm,
"ADSL line is blocked?\n");
543 atm_info(usbatm,
"ADSL line is synchronising\n");
552 if (!(down_speed & 0x0000ffff) && !(up_speed & 0x0000ffff)) {
557 atm_dev->
link_rate = down_speed * 1000 / 424;
561 "ADSL line is up (%d kb/s down | %d kb/s up)\n",
562 down_speed, up_speed);
567 atm_info(usbatm,
"unknown line state %02x\n", status);
575 static void speedtch_status_poll(
unsigned long data)
585 atm_warn(instance->
usbatm,
"Too many failures - disabling line status polling\n");
588 static void speedtch_resubmit_int(
unsigned long data)
601 atm_dbg(instance->
usbatm,
"%s: usb_submit_urb failed with result %d\n", __func__, ret);
607 static void speedtch_handle_int(
struct urb *int_urb)
611 unsigned int count = int_urb->actual_length;
612 int status = int_urb->status;
616 static const unsigned char up_int[6] = { 0xa1, 0x00, 0x01, 0x00, 0x00, 0x00 };
618 static const unsigned char down_int[6] = { 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00 };
620 atm_dbg(usbatm,
"%s entered\n", __func__);
623 atm_dbg(usbatm,
"%s: nonzero urb status %d!\n", __func__, status);
629 atm_info(usbatm,
"DSL line goes up\n");
630 }
else if ((count == 6) && !
memcmp(down_int, instance->
int_data, 6)) {
631 atm_info(usbatm,
"DSL line goes down\n");
635 atm_dbg(usbatm,
"%s: unknown interrupt packet of length %d:", __func__, count);
636 for (i = 0; i <
count; i++)
642 if ((int_urb = instance->
int_urb)) {
646 atm_dbg(usbatm,
"%s: usb_submit_urb failed with result %d\n", __func__, ret);
654 if ((int_urb = instance->
int_urb))
658 static int speedtch_atm_start(
struct usbatm_data *usbatm,
struct atm_dev *atm_dev)
660 struct usb_device *usb_dev = usbatm->
usb_dev;
663 unsigned char mac_str[13];
665 atm_dbg(usbatm,
"%s entered\n", __func__);
669 if (
usb_string(usb_dev, usb_dev->descriptor.iSerialNumber, mac_str,
sizeof(mac_str)) == 12) {
670 for (i = 0; i < 6; i++)
676 ret = speedtch_start_synchro(instance);
683 atm_dbg(usbatm,
"%s: submission of interrupt URB failed (%d)!\n", __func__, ret);
695 static void speedtch_atm_stop(
struct usbatm_data *usbatm,
struct atm_dev *atm_dev)
700 atm_dbg(usbatm,
"%s entered\n", __func__);
740 {USB_DEVICE(0x06b9, 0x4061)},
748 static struct usb_driver speedtch_usb_driver = {
749 .name = speedtch_driver_name,
750 .probe = speedtch_usb_probe,
752 .pre_reset = speedtch_pre_reset,
753 .post_reset = speedtch_post_reset,
754 .id_table = speedtch_usb_ids
757 static void speedtch_release_interfaces(
struct usb_device *usb_dev,
763 for (i = 0; i < num_interfaces; i++)
765 usb_set_intfdata(cur_intf,
NULL);
770 static int speedtch_bind(
struct usbatm_data *usbatm,
774 struct usb_device *usb_dev = interface_to_usbdev(intf);
777 int ifnum = intf->altsetting->desc.bInterfaceNumber;
778 int num_interfaces = usb_dev->actconfig->desc.bNumInterfaces;
782 usb_dbg(usbatm,
"%s entered\n", __func__);
787 usb_err(usbatm,
"%s: wrong device class %d\n", __func__, usb_dev->descriptor.bDeviceClass);
792 usb_err(usbatm,
"%s: data interface not found!\n", __func__);
798 for (i = 0; i < num_interfaces; i++) {
801 if ((i != ifnum) && cur_intf) {
805 usb_err(usbatm,
"%s: failed to claim interface %2d (%d)!\n", __func__, i, ret);
806 speedtch_release_interfaces(usb_dev, i);
812 instance = kzalloc(
sizeof(*instance),
GFP_KERNEL);
815 usb_err(usbatm,
"%s: no memory for instance data!\n", __func__);
823 instance->
params.altsetting = altsetting;
824 instance->
params.BMaxDSL = BMaxDSL;
825 instance->
params.ModemMode = ModemMode;
827 memcpy(instance->
params.ModemOption, ModemOption, num_ModemOption);
828 use_isoc = enable_isoc;
830 if (instance->
params.altsetting)
832 usb_err(usbatm,
"%s: setting interface to %2d failed (%d)!\n", __func__, instance->
params.altsetting, ret);
833 instance->
params.altsetting = 0;
836 if (!instance->
params.altsetting && use_isoc)
843 const struct usb_host_interface *
desc = data_intf->cur_altsetting;
848 for (i = 0; i < desc->desc.bNumEndpoints; i++) {
853 usb_endpoint_xfer_isoc(endpoint_desc);
859 usb_info(usbatm,
"isochronous transfer not supported - using bulk\n");
862 if (!use_isoc && !instance->
params.altsetting)
868 if (!instance->
params.altsetting)
888 usb_fill_int_urb(instance->
int_urb, usb_dev,
891 speedtch_handle_int, instance, 50);
893 usb_dbg(usbatm,
"%s: no memory for interrupt urb!\n", __func__);
897 0x12, 0xc0, 0x07, 0x00,
906 usb_err(usbatm,
"%s: device reset failed (%d)!\n", __func__, ret);
918 speedtch_release_interfaces(usb_dev, num_interfaces);
924 struct usb_device *usb_dev = interface_to_usbdev(intf);
927 usb_dbg(usbatm,
"%s entered\n", __func__);
929 speedtch_release_interfaces(usb_dev, usb_dev->actconfig->desc.bNumInterfaces);
940 .driver_name = speedtch_driver_name,
941 .bind = speedtch_bind,
942 .heavy_init = speedtch_heavy_init,
943 .unbind = speedtch_unbind,
944 .atm_start = speedtch_atm_start,
945 .atm_stop = speedtch_atm_stop,