# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#                  ChangeSet    1.546   -> 1.547  
#       drivers/usb/net/usbnet.c        1.22    -> 1.23   
#       drivers/usb/net/cdc-ether.c     1.11    -> 1.12   
#       drivers/usb/host/usb-ohci.c     1.33    -> 1.34   
#       drivers/usb/storage/usb.c       1.19    -> 1.20   
#        include/linux/usb.h    1.32    -> 1.33   
#       drivers/usb/host/usb-uhci.c     1.33    -> 1.34   
#       drivers/usb/media/usbvideo.c    1.18    -> 1.19   
#       drivers/usb/core/usb.c  1.53    -> 1.54   
#       drivers/usb/core/hcd.c  1.16    -> 1.17   
#       drivers/usb/host/uhci.c 1.42    -> 1.43   
#       drivers/usb/net/pegasus.c       1.26    -> 1.27   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/05/13      [EMAIL PROTECTED]  1.547
# [PATCH] USB device reference counting api cleanup changes
# 
# This patch replaces the awkwardly named usb_inc_dev_use() and
# usb_dec_dev_use() with usb_get_dev() and usb_put_dev() to match the
# naming convention of the rest of the kernel's reference counted
# structures.  It also does away with the special case of usb_free_dev(),
# and has usb_put_dev() be the same thing (through a #define, just like
# usb_free_urb() works.)
# 
# Now when the last person calls usb_put_dev() or usb_free_dev() the
# structure is cleaned up.  This allows the different host controller
# drivers to implement their logic differently if they want to (as they
# do), and everyone can be happy and stop arguing about the "proper" way
# to write their host controller drivers :)
# --------------------------------------------
#
diff -Nru a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
--- a/drivers/usb/core/hcd.c    Mon May 13 15:53:46 2002
+++ b/drivers/usb/core/hcd.c    Mon May 13 15:53:46 2002
@@ -1320,7 +1320,7 @@
        list_del_init (&urb->urb_list);
        dev = urb->dev;
        urb->dev = NULL;
-       usb_dec_dev_use (dev);
+       usb_put_dev (dev);
        spin_unlock_irqrestore (&hcd_data_lock, flags);
 }
 
@@ -1516,7 +1516,7 @@
 
        spin_lock_irqsave (&hcd_data_lock, flags);
        if (HCD_IS_RUNNING (hcd->state) && hcd->state != USB_STATE_QUIESCING) {
-               usb_inc_dev_use (urb->dev);
+               usb_get_dev (urb->dev);
                list_add (&urb->urb_list, &dev->urb_list);
                status = 0;
        } else {
diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
--- a/drivers/usb/core/usb.c    Mon May 13 15:53:46 2002
+++ b/drivers/usb/core/usb.c    Mon May 13 15:53:46 2002
@@ -969,21 +969,47 @@
 }
 
 /**
- * usb_free_dev - free a usb device structure (usbcore-internal)
+ * usb_get_dev - increments the reference count of the device
+ * @dev: the device being referenced
+ *
+ * Each live reference to a device should be refcounted.
+ *
+ * Drivers for USB interfaces should normally record such references in
+ * their probe() methods, when they bind to an interface, and release
+ * them by calling usb_put_dev(), in their disconnect() methods.
+ *
+ * A pointer to the device with the incremented reference counter is returned.
+ */
+struct usb_device *usb_get_dev (struct usb_device *dev)
+{
+       if (dev) {
+               atomic_inc (&dev->refcnt);
+               return dev;
+       }
+       return NULL;
+}
+
+/**
+ * usb_free_dev - free a usb device structure when all users of it are finished.
  * @dev: device that's been disconnected
  * Context: !in_interrupt ()
  *
+ * Must be called when a user of a device is finished with it.  When the last
+ * user of the device calls this function, the memory of the device is freed.
+ *
  * Used by hub and virtual root hub drivers.  The device is completely
  * gone, everything is cleaned up, so it's time to get rid of these last
  * records of this device.
  */
 void usb_free_dev(struct usb_device *dev)
 {
-       if (dev->bus->op->deallocate)
-               dev->bus->op->deallocate(dev);
-       usb_destroy_configuration (dev);
-       usb_bus_put (dev->bus);
-       kfree (dev);
+       if (atomic_dec_and_test(&dev->refcnt)) {
+               if (dev->bus->op->deallocate)
+                       dev->bus->op->deallocate(dev);
+               usb_destroy_configuration (dev);
+               usb_bus_put (dev->bus);
+               kfree (dev);
+       }
 }
 
 /**
@@ -1039,7 +1065,7 @@
 }
 
 /**
- * usb_get_urb - incrementes the reference count of the urb
+ * usb_get_urb - increments the reference count of the urb
  * @urb: pointer to the urb to modify
  *
  * This must be  called whenever a urb is transfered from a device driver to a
@@ -1928,7 +1954,7 @@
 
        /* Decrement the reference count, it'll auto free everything when */
        /* it hits 0 which could very well be now */
-       usb_dec_dev_use(dev);
+       usb_put_dev(dev);
 }
 
 /**
@@ -2760,6 +2786,7 @@
 
 EXPORT_SYMBOL(usb_alloc_dev);
 EXPORT_SYMBOL(usb_free_dev);
+EXPORT_SYMBOL(usb_get_dev);
 EXPORT_SYMBOL(usb_hub_tt_clear_buffer);
 
 EXPORT_SYMBOL(usb_find_interface_driver_for_ifnum);
diff -Nru a/drivers/usb/host/uhci.c b/drivers/usb/host/uhci.c
--- a/drivers/usb/host/uhci.c   Mon May 13 15:53:46 2002
+++ b/drivers/usb/host/uhci.c   Mon May 13 15:53:46 2002
@@ -165,7 +165,7 @@
        INIT_LIST_HEAD(&td->list);
        INIT_LIST_HEAD(&td->fl_list);
 
-       usb_inc_dev_use(dev);
+       usb_get_dev(dev);
 
        return td;
 }
@@ -317,7 +317,7 @@
                dbg("td is still in URB list!");
 
        if (td->dev)
-               usb_dec_dev_use(td->dev);
+               usb_put_dev(td->dev);
 
        pci_pool_free(uhci->td_pool, td, td->dma_handle);
 }
@@ -342,7 +342,7 @@
        INIT_LIST_HEAD(&qh->list);
        INIT_LIST_HEAD(&qh->remove_list);
 
-       usb_inc_dev_use(dev);
+       usb_get_dev(dev);
 
        return qh;
 }
@@ -355,7 +355,7 @@
                dbg("qh still in remove_list!");
 
        if (qh->dev)
-               usb_dec_dev_use(qh->dev);
+               usb_put_dev(qh->dev);
 
        pci_pool_free(uhci->qh_pool, qh, qh->dma_handle);
 }
@@ -1492,7 +1492,7 @@
        uhci = (struct uhci *)urb->dev->bus->hcpriv;
 
        INIT_LIST_HEAD(&urb->urb_list);
-       usb_inc_dev_use(urb->dev);
+       usb_get_dev(urb->dev);
 
        spin_lock_irqsave(&uhci->urb_list_lock, flags);
        spin_lock(&urb->lock);
@@ -1503,7 +1503,7 @@
                /* Since we can have problems on the out path */
                spin_unlock(&urb->lock);
                spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
-               usb_dec_dev_use(urb->dev);
+               usb_put_dev(urb->dev);
                usb_put_urb(urb);
 
                return ret;
@@ -2376,7 +2376,7 @@
                } else {
                        /* We decrement the usage count after we're done */
                        /*  with everything */
-                       usb_dec_dev_use(dev);
+                       usb_put_dev(dev);
                        usb_put_urb(urb);
                }
        }
diff -Nru a/drivers/usb/host/usb-ohci.c b/drivers/usb/host/usb-ohci.c
--- a/drivers/usb/host/usb-ohci.c       Mon May 13 15:53:46 2002
+++ b/drivers/usb/host/usb-ohci.c       Mon May 13 15:53:46 2002
@@ -210,7 +210,7 @@
                }
 
                urb_free_priv ((struct ohci *)urb->dev->bus->hcpriv, urb_priv);
-               usb_dec_dev_use (urb->dev);
+               usb_put_dev (urb->dev);
                urb->dev = NULL;
                usb_put_urb (urb);
        }
@@ -563,7 +563,7 @@
        /* increment the reference count of the urb, as we now also control it */
        urb = usb_get_urb (urb);
 
-       usb_inc_dev_use (urb->dev);
+       usb_get_dev (urb->dev);
        ohci = (ohci_t *) urb->dev->bus->hcpriv;
        
 #ifdef DEBUG
@@ -577,14 +577,14 @@
        /* when controller's hung, permit only roothub cleanup attempts
         * such as powering down ports */
        if (ohci->disabled) {
-               usb_dec_dev_use (urb->dev);     
+               usb_put_dev (urb->dev); 
                usb_put_urb (urb);
                return -ESHUTDOWN;
        }
 
        /* every endpoint has a ed, locate and fill it */
        if (!(ed = ep_add_ed (urb->dev, pipe, urb->interval, 1, mem_flags))) {
-               usb_dec_dev_use (urb->dev);     
+               usb_put_dev (urb->dev); 
                usb_put_urb (urb);
                return -ENOMEM;
        }
@@ -606,7 +606,7 @@
                case PIPE_ISOCHRONOUS: /* number of packets from URB */
                        size = urb->number_of_packets;
                        if (size <= 0) {
-                               usb_dec_dev_use (urb->dev);     
+                               usb_put_dev (urb->dev); 
                                usb_put_urb (urb);
                                return -EINVAL;
                        }
@@ -627,7 +627,7 @@
        /* allocate the private part of the URB */
        urb_priv = kmalloc (sizeof (urb_priv_t) + size * sizeof (td_t *), mem_flags);
        if (!urb_priv) {
-               usb_dec_dev_use (urb->dev);     
+               usb_put_dev (urb->dev); 
                usb_put_urb (urb);
                return -ENOMEM;
        }
@@ -645,7 +645,7 @@
                        urb_priv->length = i;
                        urb_free_priv (ohci, urb_priv);
                        spin_unlock_irqrestore (&usb_ed_lock, flags);
-                       usb_dec_dev_use (urb->dev);     
+                       usb_put_dev (urb->dev); 
                        usb_put_urb (urb);
                        return -ENOMEM;
                }
@@ -654,7 +654,7 @@
        if (ed->state == ED_NEW || (ed->state & ED_DEL)) {
                urb_free_priv (ohci, urb_priv);
                spin_unlock_irqrestore (&usb_ed_lock, flags);
-               usb_dec_dev_use (urb->dev);     
+               usb_put_dev (urb->dev); 
                usb_put_urb (urb);
                return -EINVAL;
        }
@@ -677,7 +677,7 @@
                        if (bustime < 0) {
                                urb_free_priv (ohci, urb_priv);
                                spin_unlock_irqrestore (&usb_ed_lock, flags);
-                               usb_dec_dev_use (urb->dev);     
+                               usb_put_dev (urb->dev); 
                                usb_put_urb (urb);
                                return bustime;
                        }
@@ -802,7 +802,7 @@
                                        return -ETIMEDOUT;
                                }
                        } else {
-                               /* usb_dec_dev_use done in dl_del_list() */
+                               /* usb_put_dev done in dl_del_list() */
                                urb->status = -EINPROGRESS;
                                spin_unlock_irqrestore (&usb_ed_lock, flags);
                                return -EINPROGRESS;
@@ -2109,7 +2109,7 @@
 #endif
 
        urb->hcpriv = NULL;
-       usb_dec_dev_use (usb_dev);
+       usb_put_dev (usb_dev);
        urb->dev = NULL;
        if (urb->complete)
                urb->complete (urb);
@@ -2129,7 +2129,7 @@
                ohci->rh.urb = NULL;
 
                urb->hcpriv = NULL;
-               usb_dec_dev_use(urb->dev);
+               usb_put_dev (urb->dev);
                urb->dev = NULL;
                if (urb->transfer_flags & USB_ASYNC_UNLINK) {
                        urb->status = -ECONNRESET;
diff -Nru a/drivers/usb/host/usb-uhci.c b/drivers/usb/host/usb-uhci.c
--- a/drivers/usb/host/usb-uhci.c       Mon May 13 15:53:46 2002
+++ b/drivers/usb/host/usb-uhci.c       Mon May 13 15:53:46 2002
@@ -1217,7 +1217,7 @@
                        urb->dev = NULL;
                        urb->complete ((struct urb *) urb);
                }
-               usb_dec_dev_use (usb_dev);
+               usb_put_dev (usb_dev);
                usb_put_urb (urb);
        }
        else
@@ -1301,7 +1301,7 @@
        
                        uhci_urb_dma_unmap(s, urb, urb_priv);
 
-                       usb_dec_dev_use (dev);
+                       usb_put_dev (dev);
 #ifdef DEBUG_SLAB
                        kmem_cache_free (urb_priv_kmem, urb_priv);
 #else
@@ -1655,7 +1655,7 @@
        /* increment the reference count of the urb, as we now also control it */
        urb = usb_get_urb (urb);
 
-       usb_inc_dev_use (urb->dev);
+       usb_get_dev (urb->dev);
 
        spin_lock_irqsave (&s->urb_list_lock, flags);
 
@@ -1669,7 +1669,7 @@
                    ((type == PIPE_BULK) &&
                     (!(urb->transfer_flags & USB_QUEUE_BULK) || 
!(queued_urb->transfer_flags & USB_QUEUE_BULK)))) {
                        spin_unlock_irqrestore (&s->urb_list_lock, flags);
-                       usb_dec_dev_use (urb->dev);
+                       usb_put_dev (urb->dev);
                        usb_put_urb (urb);
                        err("ENXIO %08x, flags %x, urb %p, burb 
%p",urb->pipe,urb->transfer_flags,urb,queued_urb);
                        return -ENXIO;  // urb already queued
@@ -1682,7 +1682,7 @@
        urb_priv = kmalloc (sizeof (urb_priv_t), mem_flags);
 #endif
        if (!urb_priv) {
-               usb_dec_dev_use (urb->dev);
+               usb_put_dev (urb->dev);
                spin_unlock_irqrestore (&s->urb_list_lock, flags);
                usb_put_urb (urb);
                return -ENOMEM;
@@ -1767,7 +1767,7 @@
        
        if (ret != 0) {
                uhci_urb_dma_unmap(s, urb, urb_priv);
-               usb_dec_dev_use (urb->dev);
+               usb_put_dev (urb->dev);
 #ifdef DEBUG_SLAB
                kmem_cache_free(urb_priv_kmem, urb_priv);
 #else
@@ -2737,7 +2737,7 @@
                                spin_lock(&s->urb_list_lock);
                        }
                        
-                       usb_dec_dev_use (usb_dev);
+                       usb_put_dev (usb_dev);
                        usb_put_urb (urb);
                }
        }
diff -Nru a/drivers/usb/media/usbvideo.c b/drivers/usb/media/usbvideo.c
--- a/drivers/usb/media/usbvideo.c      Mon May 13 15:53:46 2002
+++ b/drivers/usb/media/usbvideo.c      Mon May 13 15:53:46 2002
@@ -970,7 +970,7 @@
        for (i=0; i < USBVIDEO_NUMSBUF; i++)
                usb_free_urb(uvd->sbuf[i].urb);
 
-       usb_dec_dev_use(uvd->dev);
+       usb_put_dev(uvd->dev);
        uvd->dev = NULL;            /* USB device is no more */
 
        video_unregister_device(&uvd->vdev);
@@ -1176,7 +1176,7 @@
        }
 #endif
 
-       usb_inc_dev_use(uvd->dev);
+       usb_get_dev(uvd->dev);
        return 0;
 }
 
diff -Nru a/drivers/usb/net/cdc-ether.c b/drivers/usb/net/cdc-ether.c
--- a/drivers/usb/net/cdc-ether.c       Mon May 13 15:53:46 2002
+++ b/drivers/usb/net/cdc-ether.c       Mon May 13 15:53:46 2002
@@ -1256,7 +1256,7 @@
                                    ether_dev );
 
        // Does this REALLY do anything???
-       usb_inc_dev_use( usb );
+       usb_get_dev( usb );
 
        // TODO - last minute HACK
        ether_dev->comm_ep_in = 5;
@@ -1298,7 +1298,7 @@
        ether_dev->net = NULL;
 
        // I ask again, does this do anything???
-       usb_dec_dev_use( usb );
+       usb_put_dev( usb );
 
        // We are done with this interface
        usb_driver_release_interface( &CDCEther_driver, 
diff -Nru a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c
--- a/drivers/usb/net/pegasus.c Mon May 13 15:53:46 2002
+++ b/drivers/usb/net/pegasus.c Mon May 13 15:53:46 2002
@@ -981,7 +981,7 @@
                return NULL;
        }
 
-       usb_inc_dev_use(dev);
+       usb_get_dev(dev);
        memset(pegasus, 0, sizeof(struct pegasus));
        pegasus->dev_index = dev_index;
        init_waitqueue_head(&pegasus->ctrl_wait);
@@ -1086,7 +1086,7 @@
 
        pegasus->flags |= PEGASUS_UNPLUG;
        unregister_netdev(pegasus->net);
-       usb_dec_dev_use(dev);
+       usb_put_dev(dev);
        usb_unlink_urb(pegasus->intr_urb);
        usb_unlink_urb(pegasus->tx_urb);
        usb_unlink_urb(pegasus->rx_urb);
diff -Nru a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c
--- a/drivers/usb/net/usbnet.c  Mon May 13 15:53:46 2002
+++ b/drivers/usb/net/usbnet.c  Mon May 13 15:53:46 2002
@@ -1951,7 +1951,7 @@
        flush_scheduled_tasks ();
 
        kfree (dev);
-       usb_dec_dev_use (udev);
+       usb_put_dev (udev);
 }
 
 
@@ -1997,7 +1997,7 @@
        memset (dev, 0, sizeof *dev);
 
        init_MUTEX_LOCKED (&dev->mutex);
-       usb_inc_dev_use (udev);
+       usb_get_dev (udev);
        dev->udev = udev;
        dev->driver_info = info;
        dev->msg_level = msg_level;
diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
--- a/drivers/usb/storage/usb.c Mon May 13 15:53:46 2002
+++ b/drivers/usb/storage/usb.c Mon May 13 15:53:46 2002
@@ -676,7 +676,7 @@
        }
 
        /* At this point, we're committed to using the device */
-       usb_inc_dev_use(dev);
+       usb_get_dev(dev);
 
        /* clear the GUID and fetch the strings */
        GUID_CLEAR(guid);
@@ -735,14 +735,14 @@
 
                /* allocate an IRQ callback if one is needed */
                if ((ss->protocol == US_PR_CBI) && usb_stor_allocate_irq(ss)) {
-                       usb_dec_dev_use(dev);
+                       usb_put_dev(dev);
                        return NULL;
                }
 
                /* allocate the URB we're going to use */
                ss->current_urb = usb_alloc_urb(0, GFP_KERNEL);
                if (!ss->current_urb) {
-                       usb_dec_dev_use(dev);
+                       usb_put_dev(dev);
                        return NULL;
                }
 
@@ -760,7 +760,7 @@
                if ((ss = (struct us_data *)kmalloc(sizeof(struct us_data), 
                                                    GFP_KERNEL)) == NULL) {
                        printk(KERN_WARNING USB_STORAGE "Out of memory\n");
-                       usb_dec_dev_use(dev);
+                       usb_put_dev(dev);
                        return NULL;
                }
                memset(ss, 0, sizeof(struct us_data));
@@ -769,7 +769,7 @@
                ss->current_urb = usb_alloc_urb(0, GFP_KERNEL);
                if (!ss->current_urb) {
                        kfree(ss);
-                       usb_dec_dev_use(dev);
+                       usb_put_dev(dev);
                        return NULL;
                }
 
@@ -919,7 +919,7 @@
                        ss->transport_name = "Unknown";
                        kfree(ss->current_urb);
                        kfree(ss);
-                       usb_dec_dev_use(dev);
+                       usb_put_dev(dev);
                        return NULL;
                        break;
                }
@@ -974,7 +974,7 @@
                        ss->protocol_name = "Unknown";
                        kfree(ss->current_urb);
                        kfree(ss);
-                       usb_dec_dev_use(dev);
+                       usb_put_dev(dev);
                        return NULL;
                        break;
                }
@@ -984,7 +984,7 @@
                if ((ss->protocol == US_PR_CBI) && usb_stor_allocate_irq(ss)) {
                        kfree(ss->current_urb);
                        kfree(ss);
-                       usb_dec_dev_use(dev);
+                       usb_put_dev(dev);
                        return NULL;
                }
 
@@ -1020,7 +1020,7 @@
                               "Unable to start control thread\n");
                        kfree(ss->current_urb);
                        kfree(ss);
-                       usb_dec_dev_use(dev);
+                       usb_put_dev(dev);
                        return NULL;
                }
 
@@ -1087,7 +1087,7 @@
        ss->current_urb = NULL;
 
        /* mark the device as gone */
-       usb_dec_dev_use(ss->pusb_dev);
+       usb_put_dev(ss->pusb_dev);
        ss->pusb_dev = NULL;
        atomic_set(&ss->sm_state, US_STATE_DETACHED);
 
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h       Mon May 13 15:53:46 2002
+++ b/include/linux/usb.h       Mon May 13 15:53:46 2002
@@ -426,10 +426,10 @@
        struct usb_device *children[USB_MAXCHILDREN];
 };
 
-/* usb_free_dev can be called anywhere from usb_dec_dev_use */
-extern struct usb_device *usb_alloc_dev(struct usb_device *parent,
-       struct usb_bus *);
+extern struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *);
+extern struct usb_device *usb_get_dev(struct usb_device *dev);
 extern void usb_free_dev(struct usb_device *);
+#define usb_put_dev usb_free_dev
 
 /* for when layers above USB add new non-USB drivers */
 extern void usb_scan_devices(void);
@@ -439,34 +439,6 @@
 
 /* for drivers using iso endpoints */
 extern int usb_get_current_frame_number (struct usb_device *usb_dev);
-
-/**
- * usb_inc_dev_use - record another reference to a device
- * @dev: the device being referenced
- *
- * Each live reference to a device should be refcounted.
- *
- * Drivers for USB interfaces should normally record such references in
- * their probe() methods, when they bind to an interface, and release
- * them usb_dec_dev_use(), in their disconnect() methods.
- */
-static inline void usb_inc_dev_use (struct usb_device *dev)
-{
-       atomic_inc (&dev->refcnt);
-}
-
-/**
- * usb_dec_dev_use - drop a reference to a device
- * @dev: the device no longer being referenced
- *
- * Each live reference to a device should be refcounted.
- */
-static inline void usb_dec_dev_use (struct usb_device *dev)
-{
-       if (atomic_dec_and_test(&dev->refcnt))
-               usb_free_dev(dev);
-}
-
 
 /* used these for multi-interface device registration */
 extern int usb_find_interface_driver_for_ifnum(struct usb_device *dev, unsigned int 
ifnum);

_______________________________________________________________

Have big pipes? SourceForge.net is looking for download mirrors. We supply
the hardware. You get the recognition. Email Us: [EMAIL PROTECTED]
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to