]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/usb/hso.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6-omap-h63xx.git] / drivers / net / usb / hso.c
index 8e90891f0e422b8cc0f645c9eab388ff39b22d45..9f7896a25f1bfb6df80e1d16db0641305f5e8259 100644 (file)
@@ -417,6 +417,11 @@ static const struct usb_device_id hso_ids[] = {
        {USB_DEVICE(0x0af0, 0x7401)},           /* GI 0401 */
        {USB_DEVICE(0x0af0, 0x7501)},           /* GTM 382 */
        {USB_DEVICE(0x0af0, 0x7601)},           /* GE40x */
+       {USB_DEVICE(0x0af0, 0x7701)},
+       {USB_DEVICE(0x0af0, 0x7801)},
+       {USB_DEVICE(0x0af0, 0x7901)},
+       {USB_DEVICE(0x0af0, 0x7361)},
+       {icon321_port_device(0x0af0, 0xd051)},
        {}
 };
 MODULE_DEVICE_TABLE(usb, hso_ids);
@@ -658,10 +663,9 @@ static int hso_net_open(struct net_device *net)
        odev->rx_buf_missing = sizeof(struct iphdr);
        spin_unlock_irqrestore(&odev->net_lock, flags);
 
-       hso_start_net_device(odev->parent);
-
        /* We are up and running. */
        set_bit(HSO_NET_RUNNING, &odev->flags);
+       hso_start_net_device(odev->parent);
 
        /* Tell the kernel we are ready to start receiving from it */
        netif_start_queue(net);
@@ -2750,18 +2754,21 @@ static int hso_resume(struct usb_interface *iface)
                if (network_table[i] &&
                    (network_table[i]->interface == iface)) {
                        hso_net = dev2net(network_table[i]);
-                       /* First transmit any lingering data, then restart the
-                        * device. */
-                       if (hso_net->skb_tx_buf) {
-                               dev_dbg(&iface->dev,
-                                       "Transmitting lingering data\n");
-                               hso_net_start_xmit(hso_net->skb_tx_buf,
-                                                  hso_net->net);
-                               hso_net->skb_tx_buf = NULL;
+                       if (hso_net->flags & IFF_UP) {
+                               /* First transmit any lingering data,
+                                  then restart the device. */
+                               if (hso_net->skb_tx_buf) {
+                                       dev_dbg(&iface->dev,
+                                               "Transmitting"
+                                               " lingering data\n");
+                                       hso_net_start_xmit(hso_net->skb_tx_buf,
+                                                          hso_net->net);
+                                       hso_net->skb_tx_buf = NULL;
+                               }
+                               result = hso_start_net_device(network_table[i]);
+                               if (result)
+                                       goto out;
                        }
-                       result = hso_start_net_device(network_table[i]);
-                       if (result)
-                               goto out;
                }
        }
 
@@ -2824,7 +2831,7 @@ static struct usb_endpoint_descriptor *hso_get_ep(struct usb_interface *intf,
        for (i = 0; i < iface->desc.bNumEndpoints; i++) {
                endp = &iface->endpoint[i].desc;
                if (((endp->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == dir) &&
-                   ((endp->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == type))
+                   (usb_endpoint_type(endp) == type))
                        return endp;
        }
 
@@ -2894,6 +2901,7 @@ static struct usb_driver hso_driver = {
        .id_table = hso_ids,
        .suspend = hso_suspend,
        .resume = hso_resume,
+       .reset_resume = hso_resume,
        .supports_autosuspend = 1,
 };