lkml.org 
[lkml]   [2011]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 3/6] staging: vme: keep track of registered buses
    On 10/08/11 10:33, Manohar Vanga wrote:
    > This patch adds a list which keeps track of all registered VME
    > buses. This is required for adding refcounting later to bridge
    > modules, something that is not currently implemented.
    >
    > This is based on the changes introduced by Emilio G. Cota in the
    > patch:
    >
    > https://lkml.org/lkml/2010/10/25/486
    >
    > Signed-off-by: Manohar Vanga <manohar.vanga@cern.ch>

    Looks OK:

    Acked-by: Martyn Welch <martyn.welch@ge.com>

    > ---
    > drivers/staging/vme/vme.c | 46 ++++++++++++++++++++-----------------
    > drivers/staging/vme/vme_bridge.h | 1 +
    > 2 files changed, 26 insertions(+), 21 deletions(-)
    >
    > diff --git a/drivers/staging/vme/vme.c b/drivers/staging/vme/vme.c
    > index 15a6161..f811d07 100644
    > --- a/drivers/staging/vme/vme.c
    > +++ b/drivers/staging/vme/vme.c
    > @@ -34,9 +34,10 @@
    > #include "vme.h"
    > #include "vme_bridge.h"
    >
    > -/* Bitmask and mutex to keep track of bridge numbers */
    > +/* Bitmask and list of registered buses both protected by common mutex */
    > static unsigned int vme_bus_numbers;
    > -static DEFINE_MUTEX(vme_bus_num_mtx);
    > +static LIST_HEAD(vme_bus_list);
    > +static DEFINE_MUTEX(vme_buses_lock);
    >
    > static void __exit vme_exit(void);
    > static int __init vme_init(void);
    > @@ -1309,11 +1310,12 @@ EXPORT_SYMBOL(vme_slot_get);
    >
    > /* - Bridge Registration --------------------------------------------------- */
    >
    > -/* call with vme_bus_num_mtx held */
    > -static int __vme_alloc_bus_num(int bus_num)
    > +/* call with vme_buses_lock held */
    > +static int __vme_add_bus(struct vme_bridge *bridge)
    > {
    > int num;
    > int i;
    > + int bus_num = bridge->num;
    >
    > if (bus_num == -1) {
    > /* try to find a free bus number */
    > @@ -1335,25 +1337,29 @@ static int __vme_alloc_bus_num(int bus_num)
    > }
    > num = bus_num;
    > }
    > + bridge->num = num;
    > + list_add_tail(&bridge->bus_list, &vme_bus_list);
    > vme_bus_numbers |= 1 << num;
    > - return num;
    > + return 0;
    > }
    >
    > -static int vme_alloc_bus_num(int bus_num)
    > +static int vme_add_bus(struct vme_bridge *bridge)
    > {
    > - int num;
    > + int ret;
    >
    > - mutex_lock(&vme_bus_num_mtx);
    > - num = __vme_alloc_bus_num(bus_num);
    > - mutex_unlock(&vme_bus_num_mtx);
    > - return num;
    > + mutex_lock(&vme_buses_lock);
    > + ret = __vme_add_bus(bridge);
    > + mutex_unlock(&vme_buses_lock);
    > +
    > + return ret;
    > }
    >
    > -static void vme_free_bus_num(int bus)
    > +static void vme_remove_bus(struct vme_bridge *bridge)
    > {
    > - mutex_lock(&vme_bus_num_mtx);
    > - vme_bus_numbers &= ~(0x1 << bus);
    > - mutex_unlock(&vme_bus_num_mtx);
    > + mutex_lock(&vme_buses_lock);
    > + vme_bus_numbers &= ~(1 << bridge->num);
    > + list_del(&bridge->bus_list);
    > + mutex_unlock(&vme_buses_lock);
    > }
    >
    > int vme_register_bridge(struct vme_bridge *bridge)
    > @@ -1362,12 +1368,10 @@ int vme_register_bridge(struct vme_bridge *bridge)
    > int retval;
    > int i;
    >
    > - retval = vme_alloc_bus_num(bridge->num);
    > - if (retval < 0)
    > + retval = vme_add_bus(bridge);
    > + if (retval)
    > return retval;
    >
    > - bridge->num = retval;
    > -
    > /* This creates 32 vme "slot" devices. This equates to a slot for each
    > * ID available in a system conforming to the ANSI/VITA 1-1994
    > * specification.
    > @@ -1398,7 +1402,7 @@ err_reg:
    > dev = &bridge->dev[i];
    > device_unregister(dev);
    > }
    > - vme_free_bus_num(bridge->num);
    > + vme_remove_bus(bridge);
    > return retval;
    > }
    > EXPORT_SYMBOL(vme_register_bridge);
    > @@ -1413,7 +1417,7 @@ void vme_unregister_bridge(struct vme_bridge *bridge)
    > dev = &bridge->dev[i];
    > device_unregister(dev);
    > }
    > - vme_free_bus_num(bridge->num);
    > + vme_remove_bus(bridge);
    > }
    > EXPORT_SYMBOL(vme_unregister_bridge);
    >
    > diff --git a/drivers/staging/vme/vme_bridge.h b/drivers/staging/vme/vme_bridge.h
    > index a9084f0..8959670 100644
    > --- a/drivers/staging/vme/vme_bridge.h
    > +++ b/drivers/staging/vme/vme_bridge.h
    > @@ -112,6 +112,7 @@ struct vme_bridge {
    > /* Bridge Info - XXX Move to private structure? */
    > struct device *parent; /* Parent device (eg. pdev->dev for PCI) */
    > void *driver_priv; /* Private pointer for the bridge driver */
    > + struct list_head bus_list; /* list of VME buses */
    >
    > struct device dev[VME_SLOTS_MAX]; /* Device registered with
    > * device model on VME bus


    --
    Martyn Welch (Principal Software Engineer) | Registered in England and
    GE Intelligent Platforms | Wales (3828642) at 100
    T +44(0)127322748 | Barbirolli Square, Manchester,
    E martyn.welch@ge.com | M2 3AB VAT:GB 927559189


    \
     
     \ /
      Last update: 2011-08-10 12:09    [W:3.606 / U:0.780 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site