3 * ===================================
4 * HARP | Host ATM Research Platform
5 * ===================================
8 * This Host ATM Research Platform ("HARP") file (the "Software") is
9 * made available by Network Computing Services, Inc. ("NetworkCS")
10 * "AS IS". NetworkCS does not provide maintenance, improvements or
11 * support of any kind.
13 * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
14 * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
15 * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
16 * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
17 * In no event shall NetworkCS be responsible for any damages, including
18 * but not limited to consequential damages, arising from or relating to
19 * any use of the Software or related support.
21 * Copyright 1994-1998 Network Computing Services, Inc.
23 * Copies of this Software may be made, however, the above copyright
24 * notice must be reproduced on all copies.
26 * @(#) $FreeBSD: src/sys/dev/hfa/fore_stats.c,v 1.4 1999/08/28 00:41:52 peter Exp $
27 * @(#) $DragonFly: src/sys/dev/atm/hfa/fore_stats.c,v 1.6 2005/02/01 00:51:50 joerg Exp $
31 * FORE Systems 200-Series Adapter Support
32 * ---------------------------------------
34 * Device statistics routines
38 #include "fore_include.h"
41 * Get device statistics from CP
43 * This function will issue a GET_STATS command to the CP in order to
44 * initiate the DMA transfer of the CP's statistics structure to the host.
45 * We will then sleep pending command completion. This must only be called
46 * from the ioctl system call handler.
51 * fup pointer to device unit structure
54 * 0 stats retrieval successful
55 * errno stats retrieval failed - reason indicated
66 ATM_DEBUG1("fore_get_stats: fup=%p\n", fup);
69 * Make sure device has been initialized
71 if ((fup->fu_flags & CUF_INITED) == 0) {
76 * If someone has already initiated a stats request, we'll
77 * just wait for that one to complete
80 if (fup->fu_flags & FUF_STATCMD) {
82 sst = tsleep((caddr_t)&fup->fu_stats, PCATCH, "fore", 0);
84 return (sst ? sst : fup->fu_stats_ret);
88 * Limit stats gathering to once a second or so
90 if (time_second == fup->fu_stats_time) {
94 fup->fu_stats_time = time_second;
97 * Queue command at end of command queue
99 hcp = fup->fu_cmd_tail;
100 if ((*hcp->hcq_status) & QSTAT_FREE) {
104 * Queue entry available, so set our view of things up
106 hcp->hcq_code = CMD_GET_STATS;
108 fup->fu_cmd_tail = hcp->hcq_next;
111 * Now set the CP-resident queue entry - the CP will grab
112 * the command when the op-code is set.
114 cqp = hcp->hcq_cpelem;
115 (*hcp->hcq_status) = QSTAT_PENDING;
117 dma = DMA_GET_ADDR(fup->fu_stats, sizeof(Fore_cp_stats),
118 FORE_STATS_ALIGN, 0);
120 fup->fu_stats->st_drv.drv_cm_nodma++;
124 fup->fu_statsd = dma;
125 cqp->cmdq_stats.stats_buffer = (CP_dma) CP_WRITE(dma);
127 fup->fu_flags |= FUF_STATCMD;
128 cqp->cmdq_stats.stats_cmd =
129 CP_WRITE(CMD_GET_STATS | CMD_INTR_REQ);
132 * Now wait for command to finish
134 sst = tsleep((caddr_t)&fup->fu_stats, PCATCH, "fore", 0);
136 return (sst ? sst : fup->fu_stats_ret);
142 fup->fu_stats->st_drv.drv_cm_full++;