Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

VME: Provide access to VME bus enumeration and fix vme_user match function

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@ge.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Martyn Welch and committed by
Greg Kroah-Hartman
978f47d6 49cf10c6

+34 -3
+10
Documentation/vme_api.txt
··· 394 394 This function returns the slot ID of the provided bridge. 395 395 396 396 int vme_slot_get(struct vme_dev *dev); 397 + 398 + 399 + Bus Detection 400 + ============= 401 + 402 + This function returns the bus ID of the provided bridge. 403 + 404 + int vme_bus_num(struct vme_dev *dev); 405 + 406 +
+10 -3
drivers/staging/vme/devices/vme_user.c
··· 663 663 664 664 static int vme_user_match(struct vme_dev *vdev) 665 665 { 666 - if (vdev->num >= VME_USER_BUS_MAX) 667 - return 0; 668 - return 1; 666 + int i; 667 + 668 + int cur_bus = vme_bus_num(vdev); 669 + int cur_slot = vme_slot_get(vdev); 670 + 671 + for (i = 0; i < bus_num; i++) 672 + if ((cur_bus == bus[i]) && (cur_slot == vdev->num)) 673 + return 1; 674 + 675 + return 0; 669 676 } 670 677 671 678 /*
+13
drivers/vme/vme.c
··· 1293 1293 } 1294 1294 EXPORT_SYMBOL(vme_slot_get); 1295 1295 1296 + int vme_bus_num(struct vme_dev *vdev) 1297 + { 1298 + struct vme_bridge *bridge; 1299 + 1300 + bridge = vdev->bridge; 1301 + if (bridge == NULL) { 1302 + pr_err("Can't find VME bus\n"); 1303 + return -EINVAL; 1304 + } 1305 + 1306 + return bridge->num; 1307 + } 1308 + EXPORT_SYMBOL(vme_bus_num); 1296 1309 1297 1310 /* - Bridge Registration --------------------------------------------------- */ 1298 1311
+1
include/linux/vme.h
··· 165 165 void vme_lm_free(struct vme_resource *); 166 166 167 167 int vme_slot_get(struct vme_dev *); 168 + int vme_bus_num(struct vme_dev *); 168 169 169 170 int vme_register_driver(struct vme_driver *, unsigned int); 170 171 void vme_unregister_driver(struct vme_driver *);