fore_stats.c

来自「基于组件方式开发操作系统的OSKIT源代码」· C语言 代码 · 共 165 行

C
165
字号
/* * * =================================== * HARP  |  Host ATM Research Platform * =================================== * * * This Host ATM Research Platform ("HARP") file (the "Software") is * made available by Network Computing Services, Inc. ("NetworkCS") * "AS IS".  NetworkCS does not provide maintenance, improvements or * support of any kind. * * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. * In no event shall NetworkCS be responsible for any damages, including * but not limited to consequential damages, arising from or relating to * any use of the Software or related support. * * Copyright 1994-1998 Network Computing Services, Inc. * * Copies of this Software may be made, however, the above copyright * notice must be reproduced on all copies. * *	@(#) $Id: fore_stats.c,v 1.3 1998/10/31 20:06:53 phk Exp $ * *//* * FORE Systems 200-Series Adapter Support * --------------------------------------- * * Device statistics routines * */#include <dev/hfa/fore_include.h>#ifndef lint__RCSID("@(#) $Id: fore_stats.c,v 1.3 1998/10/31 20:06:53 phk Exp $");#endif/* * Get device statistics from CP *  * This function will issue a GET_STATS command to the CP in order to * initiate the DMA transfer of the CP's statistics structure to the host. * We will then sleep pending command completion.  This must only be called * from the ioctl system call handler. * * Called at splnet. * * Arguments: *	fup	pointer to device unit structure * * Returns: *	0	stats retrieval successful *	errno 	stats retrieval failed - reason indicated * */intfore_get_stats(fup)	Fore_unit	*fup;{	H_cmd_queue	*hcp;	Cmd_queue	*cqp;	int		s, sst;	ATM_DEBUG1("fore_get_stats: fup=%p\n", fup);	/*	 * Make sure device has been initialized	 */	if ((fup->fu_flags & CUF_INITED) == 0) {		return (EIO);	}	/*	 * If someone has already initiated a stats request, we'll	 * just wait for that one to complete	 */	s = splimp();	if (fup->fu_flags & FUF_STATCMD) {#if (defined(BSD) && (BSD >= 199103))		sst = tsleep((caddr_t)&fup->fu_stats, PWAIT|PCATCH, "fore", 0);#else		sst = sleep((caddr_t)&fup->fu_stats, PWAIT|PCATCH);		if (sst != 0)			sst = EINTR;#endif		(void) splx(s);		return (sst ? sst : fup->fu_stats_ret);	}	/*	 * Limit stats gathering to once a second or so	 */	if (time_second == fup->fu_stats_time) {		(void) splx(s);		return (0);	} else		fup->fu_stats_time = time_second;	/*	 * Queue command at end of command queue	 */	hcp = fup->fu_cmd_tail;	if ((*hcp->hcq_status) & QSTAT_FREE) {		void	*dma;		/*		 * Queue entry available, so set our view of things up		 */		hcp->hcq_code = CMD_GET_STATS;		hcp->hcq_arg = NULL;		fup->fu_cmd_tail = hcp->hcq_next;		/*		 * Now set the CP-resident queue entry - the CP will grab		 * the command when the op-code is set.		 */		cqp = hcp->hcq_cpelem;		(*hcp->hcq_status) = QSTAT_PENDING;		dma = DMA_GET_ADDR(fup->fu_stats, sizeof(Fore_cp_stats),			FORE_STATS_ALIGN, 0);		if (dma == NULL) {			fup->fu_stats->st_drv.drv_cm_nodma++;			(void) splx(s);			return (EIO);		}		fup->fu_statsd = dma;		cqp->cmdq_stats.stats_buffer = (CP_dma) CP_WRITE(dma);		fup->fu_flags |= FUF_STATCMD;		cqp->cmdq_stats.stats_cmd = 			CP_WRITE(CMD_GET_STATS | CMD_INTR_REQ);		/*		 * Now wait for command to finish		 */#if (defined(BSD) && (BSD >= 199103))		sst = tsleep((caddr_t)&fup->fu_stats, PWAIT|PCATCH, "fore", 0);#else		sst = sleep((caddr_t)&fup->fu_stats, PWAIT|PCATCH);		if (sst != 0)			sst = EINTR;#endif		(void) splx(s);		return (sst ? sst : fup->fu_stats_ret);	} else {		/*		 * Command queue full		 */		fup->fu_stats->st_drv.drv_cm_full++;		(void) splx(s);		return (EIO);	}}

⌨️ 快捷键说明

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