linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / usb / net / pegasus.c
index ab21f96..156a2f1 100644 (file)
@@ -163,8 +163,6 @@ static int get_registers(pegasus_t * pegasus, __u16 indx, __u16 size,
 
        /* using ATOMIC, we'd never wake up if we slept */
        if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) {
-               if (ret == -ENODEV)
-                       netif_device_detach(pegasus->net);
                if (netif_msg_drv(pegasus))
                        dev_err(&pegasus->intf->dev, "%s, status %d\n",
                                        __FUNCTION__, ret);
@@ -219,8 +217,6 @@ static int set_registers(pegasus_t * pegasus, __u16 indx, __u16 size,
        set_current_state(TASK_UNINTERRUPTIBLE);
 
        if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) {
-               if (ret == -ENODEV)
-                       netif_device_detach(pegasus->net);
                if (netif_msg_drv(pegasus))
                        dev_err(&pegasus->intf->dev, "%s, status %d\n",
                                        __FUNCTION__, ret);
@@ -266,14 +262,12 @@ static int set_register(pegasus_t * pegasus, __u16 indx, __u8 data)
        usb_fill_control_urb(pegasus->ctrl_urb, pegasus->usb,
                             usb_sndctrlpipe(pegasus->usb, 0),
                             (char *) &pegasus->dr,
-                            tmp, 1, ctrl_callback, pegasus);
+                            &tmp, 1, ctrl_callback, pegasus);
 
        add_wait_queue(&pegasus->ctrl_wait, &wait);
        set_current_state(TASK_UNINTERRUPTIBLE);
 
        if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) {
-               if (ret == -ENODEV)
-                       netif_device_detach(pegasus->net);
                if (netif_msg_drv(pegasus))
                        dev_err(&pegasus->intf->dev, "%s, status %d\n",
                                        __FUNCTION__, ret);
@@ -304,13 +298,10 @@ static int update_eth_regs_async(pegasus_t * pegasus)
                             (char *) &pegasus->dr,
                             pegasus->eth_regs, 3, ctrl_callback, pegasus);
 
-       if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) {
-               if (ret == -ENODEV)
-                       netif_device_detach(pegasus->net);
+       if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC)))
                if (netif_msg_drv(pegasus))
                        dev_err(&pegasus->intf->dev, "%s, status %d\n",
                                        __FUNCTION__, ret);
-       }
 
        return ret;
 }
@@ -327,8 +318,6 @@ static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd)
        set_register(pegasus, PhyCtrl, (indx | PHY_READ));
        for (i = 0; i < REG_TIMEOUT; i++) {
                ret = get_registers(pegasus, PhyCtrl, 1, data);
-               if (ret == -ESHUTDOWN)
-                       goto fail;
                if (data[0] & PHY_DONE)
                        break;
        }
@@ -337,7 +326,6 @@ static int read_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 * regd)
                *regd = le16_to_cpu(regdi);
                return ret;
        }
-fail:
        if (netif_msg_drv(pegasus))
                dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
 
@@ -366,15 +354,12 @@ static int write_mii_word(pegasus_t * pegasus, __u8 phy, __u8 indx, __u16 regd)
        set_register(pegasus, PhyCtrl, (indx | PHY_WRITE));
        for (i = 0; i < REG_TIMEOUT; i++) {
                ret = get_registers(pegasus, PhyCtrl, 1, data);
-               if (ret == -ESHUTDOWN)
-                       goto fail;
                if (data[0] & PHY_DONE)
                        break;
        }
        if (i < REG_TIMEOUT)
                return ret;
 
-fail:
        if (netif_msg_drv(pegasus))
                dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
        return -ETIMEDOUT;
@@ -402,8 +387,6 @@ static int read_eprom_word(pegasus_t * pegasus, __u8 index, __u16 * retdata)
                ret = get_registers(pegasus, EpromCtrl, 1, &tmp);
                if (tmp & EPROM_DONE)
                        break;
-               if (ret == -ESHUTDOWN)
-                       goto fail;
        }
        if (i < REG_TIMEOUT) {
                ret = get_registers(pegasus, EpromData, 2, &retdatai);
@@ -411,7 +394,6 @@ static int read_eprom_word(pegasus_t * pegasus, __u8 index, __u16 * retdata)
                return ret;
        }
 
-fail:
        if (netif_msg_drv(pegasus))
                dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
        return -ETIMEDOUT;
@@ -451,15 +433,12 @@ static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data)
 
        for (i = 0; i < REG_TIMEOUT; i++) {
                ret = get_registers(pegasus, EpromCtrl, 1, &tmp);
-               if (ret == -ESHUTDOWN)
-                       goto fail;
                if (tmp & EPROM_DONE)
                        break;
        }
        disable_eprom_write(pegasus);
        if (i < REG_TIMEOUT)
                return ret;
-fail:
        if (netif_msg_drv(pegasus))
                dev_warn(&pegasus->intf->dev, "fail %s\n", __FUNCTION__);
        return -ETIMEDOUT;
@@ -545,7 +524,6 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb)
        ret = set_registers(pegasus, EthCtrl0, 3, data);
 
        if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS ||
-           usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS2 ||
            usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) {
                u16 auxmode;
                read_mii_word(pegasus, 0, 0x1b, &auxmode);
@@ -701,10 +679,7 @@ goon:
                          usb_rcvbulkpipe(pegasus->usb, 1),
                          pegasus->rx_skb->data, PEGASUS_MTU + 8,
                          read_bulk_callback, pegasus);
-       rx_status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC);
-       if (rx_status == -ENODEV)
-               netif_device_detach(pegasus->net);
-       else if (rx_status) {
+       if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC)) {
                pegasus->flags |= PEGASUS_RX_URB_FAIL;
                goto tl_sched;
        } else {
@@ -721,7 +696,6 @@ static void rx_fixup(unsigned long data)
 {
        pegasus_t *pegasus;
        unsigned long flags;
-       int status;
 
        pegasus = (pegasus_t *) data;
        if (pegasus->flags & PEGASUS_UNPLUG)
@@ -747,10 +721,7 @@ static void rx_fixup(unsigned long data)
                          pegasus->rx_skb->data, PEGASUS_MTU + 8,
                          read_bulk_callback, pegasus);
 try_again:
-       status = usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC);
-       if (status == -ENODEV)
-               netif_device_detach(pegasus->net);
-       else if (status) {
+       if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC)) {
                pegasus->flags |= PEGASUS_RX_URB_FAIL;
                tasklet_schedule(&pegasus->rx_tl);
        } else {
@@ -852,8 +823,6 @@ static void intr_callback(struct urb *urb, struct pt_regs *regs)
        }
 
        status = usb_submit_urb(urb, SLAB_ATOMIC);
-       if (status == -ENODEV)
-               netif_device_detach(pegasus->net);
        if (status && netif_msg_timer(pegasus))
                printk(KERN_ERR "%s: can't resubmit interrupt urb, %d\n",
                                net->name, status);
@@ -892,7 +861,6 @@ static int pegasus_start_xmit(struct sk_buff *skb, struct net_device *net)
                        /* cleanup should already have been scheduled */
                        break;
                case -ENODEV:           /* disconnect() upcoming */
-                       netif_device_detach(pegasus->net);
                        break;
                default:
                        pegasus->stats.tx_errors++;
@@ -1018,8 +986,6 @@ static int pegasus_open(struct net_device *net)
                          pegasus->rx_skb->data, PEGASUS_MTU + 8,
                          read_bulk_callback, pegasus);
        if ((res = usb_submit_urb(pegasus->rx_urb, GFP_KERNEL))) {
-               if (res == -ENODEV)
-                       netif_device_detach(pegasus->net);
                if (netif_msg_ifup(pegasus))
                        pr_debug("%s: failed rx_urb, %d", net->name, res);
                goto exit;
@@ -1030,8 +996,6 @@ static int pegasus_open(struct net_device *net)
                         pegasus->intr_buff, sizeof (pegasus->intr_buff),
                         intr_callback, pegasus, pegasus->intr_interval);
        if ((res = usb_submit_urb(pegasus->intr_urb, GFP_KERNEL))) {
-               if (res == -ENODEV)
-                       netif_device_detach(pegasus->net);
                if (netif_msg_ifup(pegasus))
                        pr_debug("%s: failed intr_urb, %d\n", net->name, res);
                usb_kill_urb(pegasus->rx_urb);
@@ -1413,8 +1377,9 @@ static int pegasus_suspend (struct usb_interface *intf, pm_message_t message)
        struct pegasus *pegasus = usb_get_intfdata(intf);
        
        netif_device_detach (pegasus->net);
-       cancel_delayed_work(&pegasus->carrier_check);
        if (netif_running(pegasus->net)) {
+               cancel_delayed_work(&pegasus->carrier_check);
+
                usb_kill_urb(pegasus->rx_urb);
                usb_kill_urb(pegasus->intr_urb);
        }
@@ -1434,9 +1399,10 @@ static int pegasus_resume (struct usb_interface *intf)
                pegasus->intr_urb->status = 0;
                pegasus->intr_urb->actual_length = 0;
                intr_callback(pegasus->intr_urb, NULL);
+
+               queue_delayed_work(pegasus_workqueue, &pegasus->carrier_check,
+                                       CARRIER_CHECK_DELAY);
        }
-       queue_delayed_work(pegasus_workqueue, &pegasus->carrier_check,
-                               CARRIER_CHECK_DELAY);
        return 0;
 }