07590ff039
Extentions to RapidIO switch support: 1. modify switch route operation declarations to allow using single switch-specific file for family of switches that share the same route table operations. 2. add standard route table operations for switches that that support route table manipulation registers as defined in the Rev.1.3 of RapidIO specification. 3. add clear-route-table operation for switches 4. add CPSxx and TSIxxx families of RapidIO switches Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com> Tested-by: Thomas Moll <thomas.moll@sysgo.com> Cc: Matt Porter <mporter@kernel.crashing.org> Cc: Li Yang <leoli@freescale.com> Cc: Kumar Gala <galak@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
63 lines
2.5 KiB
C
63 lines
2.5 KiB
C
/*
|
|
* RapidIO interconnect services
|
|
*
|
|
* Copyright 2005 MontaVista Software, Inc.
|
|
* Matt Porter <mporter@kernel.crashing.org>
|
|
*
|
|
* 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
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/list.h>
|
|
#include <linux/rio.h>
|
|
|
|
/* Functions internal to the RIO core code */
|
|
|
|
extern u32 rio_mport_get_feature(struct rio_mport *mport, int local, u16 destid,
|
|
u8 hopcount, int ftr);
|
|
extern int rio_create_sysfs_dev_files(struct rio_dev *rdev);
|
|
extern int rio_enum_mport(struct rio_mport *mport);
|
|
extern int rio_disc_mport(struct rio_mport *mport);
|
|
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);
|
|
|
|
/* Structures internal to the RIO core code */
|
|
extern struct device_attribute rio_dev_attrs[];
|
|
extern spinlock_t rio_global_list_lock;
|
|
|
|
extern struct rio_route_ops __start_rio_route_ops[];
|
|
extern struct rio_route_ops __end_rio_route_ops[];
|
|
|
|
/* Helpers internal to the RIO core code */
|
|
#define DECLARE_RIO_ROUTE_SECTION(section, name, vid, did, add_hook, get_hook, clr_hook) \
|
|
static const struct rio_route_ops __rio_route_##name __used \
|
|
__section(section) = { vid, did, add_hook, get_hook, clr_hook };
|
|
|
|
/**
|
|
* DECLARE_RIO_ROUTE_OPS - Registers switch routing operations
|
|
* @vid: RIO vendor ID
|
|
* @did: RIO device ID
|
|
* @add_hook: Callback that adds a route entry
|
|
* @get_hook: Callback that gets a route entry
|
|
*
|
|
* Manipulating switch route tables in RIO is switch specific. This
|
|
* registers a switch by vendor and device ID with two callbacks for
|
|
* modifying and retrieving route entries in a switch. A &struct
|
|
* rio_route_ops is initialized with the ops and placed into a
|
|
* RIO-specific kernel section.
|
|
*/
|
|
#define DECLARE_RIO_ROUTE_OPS(vid, did, add_hook, get_hook, clr_hook) \
|
|
DECLARE_RIO_ROUTE_SECTION(.rio_route_ops, vid##did, \
|
|
vid, did, add_hook, get_hook, clr_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))
|