My appologies - the script I had to send patches had got a bit broken and I'd completely forgotten... Martyn On 08/11/13 11:55, y wrote: > From: Martyn Welch <martyn.welch@xxxxxx> > > The match function for vme_user is completely wrong. It will blindly bind > against the first VME slot on each bus (at this point that would be just the > first bus as the driver can only handle one bus). > > The original intention (before some major subsystem changes) was that the > driver bind against the slot to which the bridge was attached in the VME > system and to the bus(es) provided via the "bus" module parameter. > > To do this cleanly (i.e. without poking arround in the subsystems internal > stuctures) a functionality has been added to provide access to the bus > enumeration. > > Signed-off-by: Martyn Welch <martyn.welch@xxxxxx> > --- > Documentation/vme_api.txt | 10 ++++++++++ > drivers/staging/vme/devices/vme_user.c | 13 ++++++++++--- > drivers/vme/vme.c | 13 +++++++++++++ > include/linux/vme.h | 1 + > 4 files changed, 34 insertions(+), 3 deletions(-) > > diff --git a/Documentation/vme_api.txt b/Documentation/vme_api.txt > index 856efa3..126a1f1 100644 > --- a/Documentation/vme_api.txt > +++ b/Documentation/vme_api.txt > @@ -394,3 +394,13 @@ Slot Detection > This function returns the slot ID of the provided bridge. > > int vme_slot_get(struct vme_dev *dev); > + > + > +Bus Detection > +============= > + > +This function returns the bus ID of the provided bridge. > + > + int vme_bus_num(struct vme_dev *dev); > + > + > diff --git a/drivers/staging/vme/devices/vme_user.c b/drivers/staging/vme/devices/vme_user.c > index daec155..caee906 100644 > --- a/drivers/staging/vme/devices/vme_user.c > +++ b/drivers/staging/vme/devices/vme_user.c > @@ -663,9 +663,16 @@ err_nocard: > > static int vme_user_match(struct vme_dev *vdev) > { > - if (vdev->num >= VME_USER_BUS_MAX) > - return 0; > - return 1; > + int i; > + > + int cur_bus = vme_bus_num(vdev); > + int cur_slot = vme_slot_get(vdev); > + > + for (i = 0; i < bus_num; i++) > + if ((cur_bus == bus[i]) && (cur_slot == vdev->num)) > + return 1; > + > + return 0; > } > > /* > diff --git a/drivers/vme/vme.c b/drivers/vme/vme.c > index f6856b4..8df5e4e 100644 > --- a/drivers/vme/vme.c > +++ b/drivers/vme/vme.c > @@ -1293,6 +1293,19 @@ int vme_slot_get(struct vme_dev *vdev) > } > EXPORT_SYMBOL(vme_slot_get); > > +int vme_bus_num(struct vme_dev *vdev) > +{ > + struct vme_bridge *bridge; > + > + bridge = vdev->bridge; > + if (bridge == NULL) { > + pr_err("Can't find VME bus\n"); > + return -EINVAL; > + } > + > + return bridge->num; > +} > +EXPORT_SYMBOL(vme_bus_num); > > /* - Bridge Registration --------------------------------------------------- */ > > diff --git a/include/linux/vme.h b/include/linux/vme.h > index c9d65bf..4eb42c8 100644 > --- a/include/linux/vme.h > +++ b/include/linux/vme.h > @@ -165,6 +165,7 @@ int vme_lm_detach(struct vme_resource *, int); > void vme_lm_free(struct vme_resource *); > > int vme_slot_get(struct vme_dev *); > +int vme_bus_num(struct vme_dev *); > > int vme_register_driver(struct vme_driver *, unsigned int); > void vme_unregister_driver(struct vme_driver *); > -- Martyn Welch (Lead Software Engineer) | Registered in England and Wales GE Intelligent Platforms | (3828642) at 100 Barbirolli Square T +44(0)1327322748 | Manchester, M2 3AB E martyn.welch@xxxxxx | VAT:GB 927559189 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel