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.we...@ge.com>
> 
> 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.we...@ge.com>
> ---
>  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.we...@ge.com                  | VAT:GB 927559189
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to