- 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;
-}
-
-static void speedtch_poll_status(struct speedtch_instance_data *instance)
-{
- unsigned char buf[TOTAL];
- int ret;
-
- ret = speedtch_get_status(instance, buf);
- if (ret) {
- printk(KERN_WARNING
- "SpeedTouch: Error %d fetching device status\n", ret);
- return;
- }
-
- dbg("Line state %02x", buf[OFFSET_7]);
-
- switch (buf[OFFSET_7]) {
- case 0:
- if (instance->u.atm_dev->signal != ATM_PHY_SIG_LOST) {
- instance->u.atm_dev->signal = ATM_PHY_SIG_LOST;
- printk(KERN_NOTICE "ADSL line is down\n");
- }
- break;
-
- case 0x08:
- if (instance->u.atm_dev->signal != ATM_PHY_SIG_UNKNOWN) {
- instance->u.atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
- printk(KERN_NOTICE "ADSL line is blocked?\n");
- }
- break;
-
- case 0x10:
- if (instance->u.atm_dev->signal != ATM_PHY_SIG_LOST) {
- instance->u.atm_dev->signal = ATM_PHY_SIG_LOST;
- printk(KERN_NOTICE "ADSL line is synchronising\n");
- }
- break;
-
- case 0x20:
- if (instance->u.atm_dev->signal != ATM_PHY_SIG_FOUND) {
- int down_speed = buf[OFFSET_b] | (buf[OFFSET_b + 1] << 8)
- | (buf[OFFSET_b + 2] << 16) | (buf[OFFSET_b + 3] << 24);
- int up_speed = buf[OFFSET_b + 4] | (buf[OFFSET_b + 5] << 8)
- | (buf[OFFSET_b + 6] << 16) | (buf[OFFSET_b + 7] << 24);
-
- if (!(down_speed & 0x0000ffff) &&
- !(up_speed & 0x0000ffff)) {
- down_speed >>= 16;
- up_speed >>= 16;
- }
- instance->u.atm_dev->link_rate = down_speed * 1000 / 424;
- instance->u.atm_dev->signal = ATM_PHY_SIG_FOUND;
-
- printk(KERN_NOTICE
- "ADSL line is up (%d Kib/s down | %d Kib/s up)\n",
- down_speed, up_speed);
- }
- break;
-
- default:
- if (instance->u.atm_dev->signal != ATM_PHY_SIG_UNKNOWN) {
- instance->u.atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
- printk(KERN_NOTICE "Unknown line state %02x\n", buf[OFFSET_7]);
- }
- break;
- }
-}
-
-static void speedtch_timer_poll(unsigned long data)
-{
- struct speedtch_instance_data *instance = (void *)data;
+ /* URBext1 */
+ buf[0] = instance->params.ModemMode;
+ ret = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
+ 0x01, 0x40, 0x11, 0x00, buf, 1, CTRL_TIMEOUT);
+ if (ret < 0)
+ usb_warn(usbatm, "%s failed on URBext1: %d\n", __func__, ret);
+
+ /* URBext2 */
+ /* This seems to be the one which actually triggers the higher sync
+ rate -- it does require the new firmware too, although it works OK
+ with older firmware */
+ ret = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
+ 0x01, 0x40, 0x14, 0x00,
+ instance->params.ModemOption,
+ MODEM_OPTION_LENGTH, CTRL_TIMEOUT);
+ if (ret < 0)
+ usb_warn(usbatm, "%s failed on URBext2: %d\n", __func__, ret);