Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 058f88d6 authored by Alexandre Bounine's avatar Alexandre Bounine Committed by Linus Torvalds
Browse files

rapidio: modify initialization of switch operations



Modify the way how RapidIO switch operations are declared.  Multiple
assignments through the linker script replaced by single initialization
call.

Signed-off-by: default avatarAlexandre 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: Thomas Moll <thomas.moll@sysgo.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 011507e4
Loading
Loading
Loading
Loading
+12 −37
Original line number Original line Diff line number Diff line
@@ -246,24 +246,24 @@ static int rio_is_switch(struct rio_dev *rdev)
}
}


/**
/**
 * rio_route_set_ops- Sets routing operations for a particular vendor switch
 * rio_switch_init - Sets switch operations for a particular vendor switch
 * @rdev: RIO device
 * @rdev: RIO device
 * @do_enum: Enumeration/Discovery mode flag
 *
 *
 * Searches the RIO route ops table for known switch types. If the vid
 * Searches the RIO switch ops table for known switch types. If the vid
 * and did match a switch table entry, then set the add_entry() and
 * and did match a switch table entry, then call switch initialization
 * get_entry() ops to the table entry values.
 * routine to setup switch-specific routines.
 */
 */
static void rio_route_set_ops(struct rio_dev *rdev)
static void rio_switch_init(struct rio_dev *rdev, int do_enum)
{
{
	struct rio_route_ops *cur = __start_rio_route_ops;
	struct rio_switch_ops *cur = __start_rio_switch_ops;
	struct rio_route_ops *end = __end_rio_route_ops;
	struct rio_switch_ops *end = __end_rio_switch_ops;


	while (cur < end) {
	while (cur < end) {
		if ((cur->vid == rdev->vid) && (cur->did == rdev->did)) {
		if ((cur->vid == rdev->vid) && (cur->did == rdev->did)) {
			pr_debug("RIO: adding routing ops for %s\n", rio_name(rdev));
			pr_debug("RIO: calling init routine for %s\n",
			rdev->rswitch->add_entry = cur->add_hook;
				 rio_name(rdev));
			rdev->rswitch->get_entry = cur->get_hook;
			cur->init_hook(rdev, do_enum);
			rdev->rswitch->clr_table = cur->clr_hook;
			break;
			break;
		}
		}
		cur++;
		cur++;
@@ -282,30 +282,6 @@ static void rio_route_set_ops(struct rio_dev *rdev)
		       rio_name(rdev));
		       rio_name(rdev));
}
}


/**
 * rio_em_set_ops- Sets Error Managment operations for a particular vendor switch
 * @rdev: RIO device
 *
 * Searches the RIO EM ops table for known switch types. If the vid
 * and did match a switch table entry, then set the em_init() and
 * em_handle() ops to the table entry values.
 */
static void rio_em_set_ops(struct rio_dev *rdev)
{
	struct rio_em_ops *cur = __start_rio_em_ops;
	struct rio_em_ops *end = __end_rio_em_ops;

	while (cur < end) {
		if ((cur->vid == rdev->vid) && (cur->did == rdev->did)) {
			pr_debug("RIO: adding EM ops for %s\n", rio_name(rdev));
			rdev->rswitch->em_init = cur->init_hook;
			rdev->rswitch->em_handle = cur->handler_hook;
			break;
		}
		cur++;
	}
}

/**
/**
 * rio_add_device- Adds a RIO device to the device model
 * rio_add_device- Adds a RIO device to the device model
 * @rdev: RIO device
 * @rdev: RIO device
@@ -484,8 +460,7 @@ static struct rio_dev __devinit *rio_setup_device(struct rio_net *net,
		rdev->rswitch = rswitch;
		rdev->rswitch = rswitch;
		dev_set_name(&rdev->dev, "%02x:s:%04x", rdev->net->id,
		dev_set_name(&rdev->dev, "%02x:s:%04x", rdev->net->id,
			     rdev->rswitch->switchid);
			     rdev->rswitch->switchid);
		rio_route_set_ops(rdev);
		rio_switch_init(rdev, do_enum);
		rio_em_set_ops(rdev);


		if (do_enum && rdev->rswitch->clr_table)
		if (do_enum && rdev->rswitch->clr_table)
			rdev->rswitch->clr_table(port, destid, hopcount,
			rdev->rswitch->clr_table(port, destid, hopcount,
+15 −41
Original line number Original line Diff line number Diff line
@@ -39,55 +39,29 @@ extern int rio_set_port_lockout(struct rio_dev *rdev, u32 pnum, int lock);
extern struct device_attribute rio_dev_attrs[];
extern struct device_attribute rio_dev_attrs[];
extern spinlock_t rio_global_list_lock;
extern spinlock_t rio_global_list_lock;


extern struct rio_route_ops __start_rio_route_ops[];
extern struct rio_switch_ops __start_rio_switch_ops[];
extern struct rio_route_ops __end_rio_route_ops[];
extern struct rio_switch_ops __end_rio_switch_ops[];


/* Helpers internal to the RIO core code */
/* Helpers internal to the RIO core code */
#define DECLARE_RIO_ROUTE_SECTION(section, name, vid, did, add_hook, get_hook, clr_hook) \
#define DECLARE_RIO_SWITCH_SECTION(section, name, vid, did, init_hook) \
	static const struct rio_route_ops __rio_route_##name __used \
	static const struct rio_switch_ops __rio_switch_##name __used \
	__section(section) = { vid, did, add_hook, get_hook, clr_hook };
	__section(section) = { vid, did, init_hook };


/**
/**
 * DECLARE_RIO_ROUTE_OPS - Registers switch routing operations
 * DECLARE_RIO_SWITCH_INIT - Registers switch initialization routine
 * @vid: RIO vendor ID
 * @vid: RIO vendor ID
 * @did: RIO device ID
 * @did: RIO device ID
 * @add_hook: Callback that adds a route entry
 * @init_hook: Callback that performs switch-specific initialization
 * @get_hook: Callback that gets a route entry
 *
 *
 * Manipulating switch route tables in RIO is switch specific. This
 * Manipulating switch route tables and error management in RIO
 * registers a switch by vendor and device ID with two callbacks for
 * is switch specific. This registers a switch by vendor and device ID with
 * modifying and retrieving route entries in a switch. A &struct
 * initialization callback for setting up switch operations and (if required)
 * rio_route_ops is initialized with the ops and placed into a
 * hardware initialization. A &struct rio_switch_ops is initialized with
 * RIO-specific kernel section.
 * pointer to the init routine and placed into a RIO-specific kernel section.
 */
 */
#define DECLARE_RIO_ROUTE_OPS(vid, did, add_hook, get_hook, clr_hook)	\
#define DECLARE_RIO_SWITCH_INIT(vid, did, init_hook)		\
	DECLARE_RIO_ROUTE_SECTION(.rio_route_ops, vid##did,		\
	DECLARE_RIO_SWITCH_SECTION(.rio_switch_ops, vid##did, \
			vid, did, add_hook, get_hook, clr_hook)
			vid, did, init_hook)


#define RIO_GET_DID(size, x)	(size ? (x & 0xffff) : ((x & 0x00ff0000) >> 16))
#define RIO_GET_DID(size, x)	(size ? (x & 0xffff) : ((x & 0x00ff0000) >> 16))
#define RIO_SET_DID(size, x)	(size ? (x & 0xffff) : ((x & 0x000000ff) << 16))
#define RIO_SET_DID(size, x)	(size ? (x & 0xffff) : ((x & 0x000000ff) << 16))

/*
 *   RapidIO Error Management
 */
extern struct rio_em_ops __start_rio_em_ops[];
extern struct rio_em_ops __end_rio_em_ops[];

/* Helpers internal to the RIO core code */
#define DECLARE_RIO_EM_SECTION(section, name, vid, did, init_hook, em_hook)  \
	static const struct rio_em_ops __rio_em_##name __used   \
	__section(section) = { vid, did, init_hook, em_hook };

/**
 * DECLARE_RIO_EM_OPS - Registers switch EM operations
 * @vid: RIO vendor ID
 * @did: RIO device ID
 * @init_hook: Callback that initializes device specific EM
 * @em_hook: Callback that handles device specific EM
 *
 * A &struct rio_em_ops is initialized with the ops and placed into a
 * RIO-specific kernel section.
 */
#define DECLARE_RIO_EM_OPS(vid, did, init_hook, em_hook)	\
	DECLARE_RIO_EM_SECTION(.rio_em_ops, vid##did,		\
			vid, did, init_hook, em_hook)
+20 −7
Original line number Original line Diff line number Diff line
/*
/*
 * IDT CPS RapidIO switches support
 * IDT CPS RapidIO switches support
 *
 *
 * Copyright 2009 Integrated Device Technology, Inc.
 * Copyright 2009-2010 Integrated Device Technology, Inc.
 * Alexandre Bounine <alexandre.bounine@idt.com>
 *
 *
 * This program is free software; you can redistribute  it and/or modify it
 * This program is free software; you can redistribute  it and/or modify it
 * under  the terms of  the GNU General  Public License as published by the
 * under  the terms of  the GNU General  Public License as published by the
@@ -81,9 +82,21 @@ idtcps_route_clr_table(struct rio_mport *mport, u16 destid, u8 hopcount,
	return 0;
	return 0;
}
}


DECLARE_RIO_ROUTE_OPS(RIO_VID_IDT, RIO_DID_IDTCPS6Q, idtcps_route_add_entry, idtcps_route_get_entry, idtcps_route_clr_table);
static int idtcps_switch_init(struct rio_dev *rdev, int do_enum)
DECLARE_RIO_ROUTE_OPS(RIO_VID_IDT, RIO_DID_IDTCPS8, idtcps_route_add_entry, idtcps_route_get_entry, idtcps_route_clr_table);
{
DECLARE_RIO_ROUTE_OPS(RIO_VID_IDT, RIO_DID_IDTCPS10Q, idtcps_route_add_entry, idtcps_route_get_entry, idtcps_route_clr_table);
	pr_debug("RIO: %s for %s\n", __func__, rio_name(rdev));
DECLARE_RIO_ROUTE_OPS(RIO_VID_IDT, RIO_DID_IDTCPS12, idtcps_route_add_entry, idtcps_route_get_entry, idtcps_route_clr_table);
	rdev->rswitch->add_entry = idtcps_route_add_entry;
DECLARE_RIO_ROUTE_OPS(RIO_VID_IDT, RIO_DID_IDTCPS16, idtcps_route_add_entry, idtcps_route_get_entry, idtcps_route_clr_table);
	rdev->rswitch->get_entry = idtcps_route_get_entry;
DECLARE_RIO_ROUTE_OPS(RIO_VID_IDT, RIO_DID_IDT70K200, idtcps_route_add_entry, idtcps_route_get_entry, idtcps_route_clr_table);
	rdev->rswitch->clr_table = idtcps_route_clr_table;
	rdev->rswitch->em_init = NULL;
	rdev->rswitch->em_handle = NULL;

	return 0;
}

DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT, RIO_DID_IDTCPS6Q, idtcps_switch_init);
DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT, RIO_DID_IDTCPS8, idtcps_switch_init);
DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT, RIO_DID_IDTCPS10Q, idtcps_switch_init);
DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT, RIO_DID_IDTCPS12, idtcps_switch_init);
DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT, RIO_DID_IDTCPS16, idtcps_switch_init);
DECLARE_RIO_SWITCH_INIT(RIO_VID_IDT, RIO_DID_IDT70K200, idtcps_switch_init);
+17 −1
Original line number Original line Diff line number Diff line
/*
/*
 * RapidIO Tsi500 switch support
 * RapidIO Tsi500 switch support
 *
 *
 * Copyright 2009-2010 Integrated Device Technology, Inc.
 * Alexandre Bounine <alexandre.bounine@idt.com>
 *  - Modified switch operations initialization.
 *
 * Copyright 2005 MontaVista Software, Inc.
 * Copyright 2005 MontaVista Software, Inc.
 * Matt Porter <mporter@kernel.crashing.org>
 * Matt Porter <mporter@kernel.crashing.org>
 *
 *
@@ -57,4 +61,16 @@ tsi500_route_get_entry(struct rio_mport *mport, u16 destid, u8 hopcount, u16 tab
	return ret;
	return ret;
}
}


DECLARE_RIO_ROUTE_OPS(RIO_VID_TUNDRA, RIO_DID_TSI500, tsi500_route_add_entry, tsi500_route_get_entry, NULL);
static int tsi500_switch_init(struct rio_dev *rdev, int do_enum)
{
	pr_debug("RIO: %s for %s\n", __func__, rio_name(rdev));
	rdev->rswitch->add_entry = tsi500_route_add_entry;
	rdev->rswitch->get_entry = tsi500_route_get_entry;
	rdev->rswitch->clr_table = NULL;
	rdev->rswitch->em_init = NULL;
	rdev->rswitch->em_handle = NULL;

	return 0;
}

DECLARE_RIO_SWITCH_INIT(RIO_VID_TUNDRA, RIO_DID_TSI500, tsi500_switch_init);
+17 −3
Original line number Original line Diff line number Diff line
@@ -2,6 +2,10 @@
 * RapidIO Tsi568 switch support
 * RapidIO Tsi568 switch support
 *
 *
 * Copyright 2009-2010 Integrated Device Technology, Inc.
 * Copyright 2009-2010 Integrated Device Technology, Inc.
 * Alexandre Bounine <alexandre.bounine@idt.com>
 *  - Added EM support
 *  - Modified switch operations initialization.
 *
 * Copyright 2005 MontaVista Software, Inc.
 * Copyright 2005 MontaVista Software, Inc.
 * Matt Porter <mporter@kernel.crashing.org>
 * Matt Porter <mporter@kernel.crashing.org>
 *
 *
@@ -106,8 +110,6 @@ tsi568_route_clr_table(struct rio_mport *mport, u16 destid, u8 hopcount,
	return 0;
	return 0;
}
}


DECLARE_RIO_ROUTE_OPS(RIO_VID_TUNDRA, RIO_DID_TSI568, tsi568_route_add_entry, tsi568_route_get_entry, tsi568_route_clr_table);

static int
static int
tsi568_em_init(struct rio_dev *rdev)
tsi568_em_init(struct rio_dev *rdev)
{
{
@@ -127,4 +129,16 @@ tsi568_em_init(struct rio_dev *rdev)
	return 0;
	return 0;
}
}


DECLARE_RIO_EM_OPS(RIO_VID_TUNDRA, RIO_DID_TSI568, tsi568_em_init, NULL);
static int tsi568_switch_init(struct rio_dev *rdev, int do_enum)
{
	pr_debug("RIO: %s for %s\n", __func__, rio_name(rdev));
	rdev->rswitch->add_entry = tsi568_route_add_entry;
	rdev->rswitch->get_entry = tsi568_route_get_entry;
	rdev->rswitch->clr_table = tsi568_route_clr_table;
	rdev->rswitch->em_init = tsi568_em_init;
	rdev->rswitch->em_handle = NULL;

	return 0;
}

DECLARE_RIO_SWITCH_INIT(RIO_VID_TUNDRA, RIO_DID_TSI568, tsi568_switch_init);
Loading