⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xswitch.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
字号:
/* $Id$ * * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 1992 - 1997, 2000 Silicon Graphics, Inc. * Copyright (C) 2000 by Colin Ngam */#include <linux/types.h>#include <linux/slab.h>#include <asm/sn/sgi.h>#include <asm/sn/iobus.h>#include <asm/sn/iograph.h>#include <asm/sn/invent.h>#include <asm/sn/hcl.h>#include <asm/sn/labelcl.h>#include <asm/sn/xtalk/xtalk.h>#include <asm/sn/xtalk/xswitch.h>#include <asm/sn/xtalk/xwidget.h>#include <asm/sn/xtalk/xtalk_private.h>#define	NEW(ptr)	(ptr = kmalloc(sizeof (*(ptr)), GFP_KERNEL))#define	DEL(ptr)	(kfree(ptr))int                     xswitch_devflag = D_MP;/* * This file provides generic support for Crosstalk * Switches, in a way that insulates crosstalk providers * from specifics about the switch chips being used. */#include <asm/sn/xtalk/xbow.h>#define DEV_FUNC(dev,func)      xbow_##func#if !defined(DEV_FUNC)/* * There is more than one possible provider * for this platform. We need to examine the * master vertex of the current vertex for * a provider function structure, and indirect * through the appropriately named member. */#define	DEV_FUNC(dev,func)	xwidget_to_provider_fns(dev)->funcstatic xswitch_provider_t *xwidget_to_provider_fns(devfs_handle_t xconn){    devfs_handle_t            busv;    xswitch_info_t          xswitch_info;    xswitch_provider_t      provider_fns;    busv = hwgraph_connectpt_get(xconn_vhdl);    ASSERT(busv != GRAPH_VERTEX_NONE);    xswitch_info = xswitch_info_get(busv);    ASSERT(xswitch_info != NULL);    provider_fns = xswitch_info->xswitch_fns;    ASSERT(provider_fns != NULL);    return provider_fns;}#endif#define	XSWITCH_CENSUS_BIT(port)		(1<<(port))#define	XSWITCH_CENSUS_PORT_MIN			(0x0)#define	XSWITCH_CENSUS_PORT_MAX			(0xF)#define	XSWITCH_CENSUS_PORTS			(0x10)#define	XSWITCH_WIDGET_PRESENT(infop,port)	((infop)->census & XSWITCH_CENSUS_BIT(port))static char             xswitch_info_fingerprint[] = "xswitch_info";struct xswitch_info_s {    char                   *fingerprint;    unsigned                census;    devfs_handle_t            vhdl[XSWITCH_CENSUS_PORTS];    devfs_handle_t            master_vhdl[XSWITCH_CENSUS_PORTS];    xswitch_provider_t     *xswitch_fns;};xswitch_info_txswitch_info_get(devfs_handle_t xwidget){    xswitch_info_t          xswitch_info;    xswitch_info = (xswitch_info_t)	hwgraph_fastinfo_get(xwidget);#ifdef IRIX    if ((xswitch_info != NULL) &&	(xswitch_info->fingerprint != xswitch_info_fingerprint))	cmn_err(CE_PANIC, "%v xswitch_info_get bad fingerprint", xwidget);#endif    printk("xswitch_info_get: xwidget 0x%p xswitch_info 0x%p\n", xwidget, xswitch_info);    return (xswitch_info);}voidxswitch_info_vhdl_set(xswitch_info_t xswitch_info,		      xwidgetnum_t port,		      devfs_handle_t xwidget){#if XSWITCH_CENSUS_PORT_MIN    if (port < XSWITCH_CENSUS_PORT_MIN)	return;#endif    if (port > XSWITCH_CENSUS_PORT_MAX)	return;    xswitch_info->vhdl[port - XSWITCH_CENSUS_PORT_MIN] = xwidget;}devfs_handle_txswitch_info_vhdl_get(xswitch_info_t xswitch_info,		      xwidgetnum_t port){#ifdef IRIX    if (xswitch_info == NULL)	cmn_err(CE_PANIC, "xswitch_info_vhdl_get: null xswitch_info");#endif#if XSWITCH_CENSUS_PORT_MIN    if (port < XSWITCH_CENSUS_PORT_MIN)	return GRAPH_VERTEX_NONE;#endif    if (port > XSWITCH_CENSUS_PORT_MAX)	return GRAPH_VERTEX_NONE;    return xswitch_info->vhdl[port - XSWITCH_CENSUS_PORT_MIN];}/* * Some systems may allow for multiple switch masters.  On such systems, * we assign a master for each port on the switch.  These interfaces * establish and retrieve that assignment. */voidxswitch_info_master_assignment_set(xswitch_info_t xswitch_info,				   xwidgetnum_t port,				   devfs_handle_t master_vhdl){#if XSWITCH_CENSUS_PORT_MIN    if (port < XSWITCH_CENSUS_PORT_MIN)	return;#endif    if (port > XSWITCH_CENSUS_PORT_MAX)	return;    xswitch_info->master_vhdl[port - XSWITCH_CENSUS_PORT_MIN] = master_vhdl;}devfs_handle_txswitch_info_master_assignment_get(xswitch_info_t xswitch_info,				   xwidgetnum_t port){#if XSWITCH_CENSUS_PORT_MIN    if (port < XSWITCH_CENSUS_PORT_MIN)	return GRAPH_VERTEX_NONE;#endif    if (port > XSWITCH_CENSUS_PORT_MAX)	return GRAPH_VERTEX_NONE;    return xswitch_info->master_vhdl[port - XSWITCH_CENSUS_PORT_MIN];}voidxswitch_info_set(devfs_handle_t xwidget, xswitch_info_t xswitch_info){    xswitch_info->fingerprint = xswitch_info_fingerprint;    hwgraph_fastinfo_set(xwidget, (arbitrary_info_t) xswitch_info);}xswitch_info_txswitch_info_new(devfs_handle_t xwidget){    xswitch_info_t          xswitch_info;    xswitch_info = xswitch_info_get(xwidget);    if (xswitch_info == NULL) {	int                     port;	NEW(xswitch_info);	xswitch_info->census = 0;	for (port = XSWITCH_CENSUS_PORT_MIN;	     port <= XSWITCH_CENSUS_PORT_MAX;	     port++) {	    xswitch_info_vhdl_set(xswitch_info, port,				  GRAPH_VERTEX_NONE);	    xswitch_info_master_assignment_set(xswitch_info,					       port,					       GRAPH_VERTEX_NONE);	}	xswitch_info_set(xwidget, xswitch_info);	printk("xswitch_info_new: xswitch_info_set xwidget 0x%p, xswitch_info 0x%p\n",		xwidget, xswitch_info);    }    return xswitch_info;}voidxswitch_provider_register(devfs_handle_t busv,			  xswitch_provider_t * xswitch_fns){    xswitch_info_t          xswitch_info = xswitch_info_get(busv);    ASSERT(xswitch_info);    xswitch_info->xswitch_fns = xswitch_fns;}voidxswitch_info_link_is_ok(xswitch_info_t xswitch_info, xwidgetnum_t port){    xswitch_info->census |= XSWITCH_CENSUS_BIT(port);}intxswitch_info_link_ok(xswitch_info_t xswitch_info, xwidgetnum_t port){#if XSWITCH_CENSUS_PORT_MIN    if (port < XSWITCH_CENSUS_PORT_MIN)	return 0;#endif    if (port > XSWITCH_CENSUS_PORT_MAX)	return 0;    return (xswitch_info->census & XSWITCH_CENSUS_BIT(port));}intxswitch_reset_link(devfs_handle_t xconn_vhdl){    return DEV_FUNC(xconn_vhdl, reset_link)	(xconn_vhdl);}/* Given a vertex handle to the xswitch get its logical * id. */intxswitch_id_get(devfs_handle_t	xconn_vhdl){    arbitrary_info_t 	xbow_num;    graph_error_t	rv;    rv = hwgraph_info_get_LBL(xconn_vhdl,INFO_LBL_XSWITCH_ID,&xbow_num);    ASSERT(rv == GRAPH_SUCCESS);    return(xbow_num);}/* Given a vertex handle to the xswitch set its logical * id. */voidxswitch_id_set(devfs_handle_t	xconn_vhdl,int xbow_num){    graph_error_t	rv;    rv = hwgraph_info_add_LBL(xconn_vhdl,INFO_LBL_XSWITCH_ID,			      (arbitrary_info_t)xbow_num);    ASSERT(rv == GRAPH_SUCCESS);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -