pegasus->eth_regs[EthCtrl0] |= RX_MULTICAST;
                pegasus->eth_regs[EthCtrl2] &= ~RX_PROMISCUOUS;
                if (netif_msg_link(pegasus))
-                       pr_info("%s: set allmulti\n", net->name);
+                       pr_debug("%s: set allmulti\n", net->name);
        } else {
                pegasus->eth_regs[EthCtrl0] &= ~RX_MULTICAST;
                pegasus->eth_regs[EthCtrl2] &= ~RX_PROMISCUOUS;
 }
 
 
+static int pegasus_count;
 static struct workqueue_struct *pegasus_workqueue = NULL;
 #define CARRIER_CHECK_DELAY (2 * HZ)
 
        return 0;
 }
 
+/* we rely on probe() and remove() being serialized so we
+ * don't need extra locking on pegasus_count.
+ */
+static void pegasus_dec_workqueue(void)
+{
+       pegasus_count--;
+       if (pegasus_count == 0) {
+               destroy_workqueue(pegasus_workqueue);
+               pegasus_workqueue = NULL;
+       }
+}
+
 static int pegasus_probe(struct usb_interface *intf,
                         const struct usb_device_id *id)
 {
        int dev_index = id - pegasus_ids;
        int res = -ENOMEM;
 
-       usb_get_dev(dev);
+       if (pegasus_blacklisted(dev))
+               return -ENODEV;
 
-       if (pegasus_blacklisted(dev)) {
-               res = -ENODEV;
-               goto out;
+       if (pegasus_count == 0) {
+               pegasus_workqueue = create_singlethread_workqueue("pegasus");
+               if (!pegasus_workqueue)
+                       return -ENOMEM;
        }
+       pegasus_count++;
+
+       usb_get_dev(dev);
 
        net = alloc_etherdev(sizeof(struct pegasus));
        if (!net) {
        free_netdev(net);
 out:
        usb_put_dev(dev);
+       pegasus_dec_workqueue();
        return res;
 }
 
                pegasus->rx_skb = NULL;
        }
        free_netdev(pegasus->net);
+       pegasus_dec_workqueue();
 }
 
 static int pegasus_suspend (struct usb_interface *intf, pm_message_t message)
        .resume = pegasus_resume,
 };
 
-static void parse_id(char *id)
+static void __init parse_id(char *id)
 {
        unsigned int vendor_id=0, device_id=0, flags=0, i=0;
        char *token, *name=NULL;
        pr_info("%s: %s, " DRIVER_DESC "\n", driver_name, DRIVER_VERSION);
        if (devid)
                parse_id(devid);
-       pegasus_workqueue = create_singlethread_workqueue("pegasus");
-       if (!pegasus_workqueue)
-               return -ENOMEM;
        return usb_register(&pegasus_driver);
 }
 
 static void __exit pegasus_exit(void)
 {
-       destroy_workqueue(pegasus_workqueue);
        usb_deregister(&pegasus_driver);
 }