rapidio: convert switch drivers to modules
Rework RapidIO switch drivers to add an option to build them as loadable kernel modules. This patch removes RapidIO-specific vmlinux section and converts switch drivers to be compatible with LDM driver registration method. To simplify registration of device-specific callback routines this patch introduces rio_switch_ops data structure. The sw_sysfs() callback is removed from the list of device-specific operations because under the new structure its functions can be handled by switch driver's probe() and remove() routines. If a specific switch device driver is not loaded the RapidIO subsystem core will use default standard-based operations to configure a switch. Because the current implementation of RapidIO enumeration/discovery method relies on availability of device-specific operations for error management, switch device drivers must be loaded before the RapidIO enumeration/discovery starts. This patch also moves several common routines from enumeration/discovery module into the RapidIO core code to make switch-specific operations accessible to all components of RapidIO subsystem. Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com> Cc: Matt Porter <mporter@kernel.crashing.org> Cc: Li Yang <leoli@freescale.com> Cc: Kumar Gala <galak@kernel.crashing.org> Cc: Andre van Herk <andre.van.herk@Prodrive.nl> Cc: Micha Nelissen <micha.nelissen@Prodrive.nl> Cc: Stef van Os <stef.van.os@Prodrive.nl> Cc: Jean Delvare <jdelvare@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
36f0efbbe8
commit
2ec3ba69fa
@@ -28,18 +28,17 @@ extern u32 rio_mport_get_efb(struct rio_mport *port, int local, u16 destid,
|
||||
extern int rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid,
|
||||
u8 hopcount);
|
||||
extern int rio_create_sysfs_dev_files(struct rio_dev *rdev);
|
||||
extern int rio_std_route_add_entry(struct rio_mport *mport, u16 destid,
|
||||
u8 hopcount, u16 table, u16 route_destid,
|
||||
u8 route_port);
|
||||
extern int rio_std_route_get_entry(struct rio_mport *mport, u16 destid,
|
||||
u8 hopcount, u16 table, u16 route_destid,
|
||||
u8 *route_port);
|
||||
extern int rio_std_route_clr_table(struct rio_mport *mport, u16 destid,
|
||||
u8 hopcount, u16 table);
|
||||
extern int rio_lock_device(struct rio_mport *port, u16 destid,
|
||||
u8 hopcount, int wait_ms);
|
||||
extern int rio_unlock_device(struct rio_mport *port, u16 destid, u8 hopcount);
|
||||
extern int rio_route_add_entry(struct rio_dev *rdev,
|
||||
u16 table, u16 route_destid, u8 route_port, int lock);
|
||||
extern int rio_route_get_entry(struct rio_dev *rdev, u16 table,
|
||||
u16 route_destid, u8 *route_port, int lock);
|
||||
extern int rio_route_clr_table(struct rio_dev *rdev, u16 table, int lock);
|
||||
extern int rio_set_port_lockout(struct rio_dev *rdev, u32 pnum, int lock);
|
||||
extern struct rio_dev *rio_get_comptag(u32 comp_tag, struct rio_dev *from);
|
||||
extern int rio_add_device(struct rio_dev *rdev);
|
||||
extern void rio_switch_init(struct rio_dev *rdev, int do_enum);
|
||||
extern int rio_enable_rx_tx_port(struct rio_mport *port, int local, u16 destid,
|
||||
u8 hopcount, u8 port_num);
|
||||
extern int rio_register_scan(int mport_id, struct rio_scan *scan_ops);
|
||||
@@ -51,29 +50,5 @@ extern struct rio_mport *rio_find_mport(int mport_id);
|
||||
extern struct device_attribute rio_dev_attrs[];
|
||||
extern struct bus_attribute rio_bus_attrs[];
|
||||
|
||||
extern struct rio_switch_ops __start_rio_switch_ops[];
|
||||
extern struct rio_switch_ops __end_rio_switch_ops[];
|
||||
|
||||
/* Helpers internal to the RIO core code */
|
||||
#define DECLARE_RIO_SWITCH_SECTION(section, name, vid, did, init_hook) \
|
||||
static const struct rio_switch_ops __rio_switch_##name __used \
|
||||
__section(section) = { vid, did, init_hook };
|
||||
|
||||
/**
|
||||
* DECLARE_RIO_SWITCH_INIT - Registers switch initialization routine
|
||||
* @vid: RIO vendor ID
|
||||
* @did: RIO device ID
|
||||
* @init_hook: Callback that performs switch-specific initialization
|
||||
*
|
||||
* Manipulating switch route tables and error management in RIO
|
||||
* is switch specific. This registers a switch by vendor and device ID with
|
||||
* initialization callback for setting up switch operations and (if required)
|
||||
* hardware initialization. A &struct rio_switch_ops is initialized with
|
||||
* pointer to the init routine and placed into a RIO-specific kernel section.
|
||||
*/
|
||||
#define DECLARE_RIO_SWITCH_INIT(vid, did, init_hook) \
|
||||
DECLARE_RIO_SWITCH_SECTION(.rio_switch_ops, vid##did, \
|
||||
vid, did, init_hook)
|
||||
|
||||
#define RIO_GET_DID(size, x) (size ? (x & 0xffff) : ((x & 0x00ff0000) >> 16))
|
||||
#define RIO_SET_DID(size, x) (size ? (x & 0xffff) : ((x & 0x000000ff) << 16))
|
||||
|
Reference in New Issue
Block a user