- printk(KERN_WARNING "%s failed on URB150: %d\n", __func__, ret);
-}
-
-static int speedtch_start_synchro(struct speedtch_instance_data *instance)
-{
- struct usb_device *dev = instance->u.usb_dev;
- unsigned char buf[2];
- int ret;
-
- ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
- 0x12, 0xc0, 0x04, 0x00,
- buf, sizeof(buf), CTRL_TIMEOUT);
- if (ret < 0) {
- printk(KERN_WARNING "SpeedTouch: Failed to start ADSL synchronisation: %d\n", ret);
- return ret;
- }
-
- dbg("speedtch_start_synchro: modem prodded. %d Bytes returned: %02x %02x", ret, buf[0], buf[1]);
- return 0;
-}
-
-static void speedtch_handle_int(struct urb *urb, struct pt_regs *regs)
-{
- struct speedtch_instance_data *instance = urb->context;
- unsigned int count = urb->actual_length;
- int ret;
-
- /* The magic interrupt for "up state" */
- const static unsigned char up_int[6] = { 0xa1, 0x00, 0x01, 0x00, 0x00, 0x00 };
- /* The magic interrupt for "down state" */
- const static unsigned char down_int[6] = { 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00 };
-
- switch (urb->status) {
- case 0:
- /* success */
- break;
- case -ECONNRESET:
- case -ENOENT:
- case -ESHUTDOWN:
- /* this urb is terminated; clean up */
- dbg("%s - urb shutting down with status: %d", __func__, urb->status);
- return;
- default:
- dbg("%s - nonzero urb status received: %d", __func__, urb->status);
- goto exit;
- }
-
- if (count < 6) {
- dbg("%s - int packet too short", __func__);
- goto exit;
- }
-
- if (!memcmp(up_int, instance->int_data, 6)) {
- del_timer(&instance->poll_timer);
- printk(KERN_NOTICE "DSL line goes up\n");
- } else if (!memcmp(down_int, instance->int_data, 6)) {
- printk(KERN_NOTICE "DSL line goes down\n");
- } else {
- int i;
-
- printk(KERN_DEBUG "Unknown interrupt packet of %d bytes:", count);
- for (i = 0; i < count; i++)
- printk(" %02x", instance->int_data[i]);
- printk("\n");
- }
- schedule_work(&instance->poll_work);
-
- exit:
- rmb();
- if (!instance->int_urb)
- return;
-
- ret = usb_submit_urb(urb, GFP_ATOMIC);
- if (ret)
- err("%s - usb_submit_urb failed with result %d", __func__, ret);
-}
-
-static int speedtch_get_status(struct speedtch_instance_data *instance,
- unsigned char *buf)
-{
- struct usb_device *dev = instance->u.usb_dev;
- int ret;
-
- memset(buf, 0, TOTAL);
-
- ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
- 0x12, 0xc0, 0x07, 0x00, buf + OFFSET_7, SIZE_7,
- CTRL_TIMEOUT);
- if (ret < 0) {
- dbg("MSG 7 failed");
- return ret;
- }
-
- ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
- 0x12, 0xc0, 0x0b, 0x00, buf + OFFSET_b, SIZE_b,
- CTRL_TIMEOUT);
- if (ret < 0) {
- dbg("MSG B failed");
- return ret;
- }
-
- ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
- 0x12, 0xc0, 0x0d, 0x00, buf + OFFSET_d, SIZE_d,
- CTRL_TIMEOUT);
- if (ret < 0) {
- dbg("MSG D failed");
- return ret;
- }
-
- ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
- 0x01, 0xc0, 0x0e, 0x00, buf + OFFSET_e, SIZE_e,
- CTRL_TIMEOUT);
- if (ret < 0) {
- dbg("MSG E failed");
- return ret;
- }
-
- ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
- 0x01, 0xc0, 0x0f, 0x00, buf + OFFSET_f, SIZE_f,
- CTRL_TIMEOUT);
- if (ret < 0) {
- dbg("MSG F failed");
- return ret;
- }
-
- return 0;