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.8 2008/03/01 22:03:13 swildner 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.
48 * Called from a critical section.
51 * fup pointer to device unit structure
54 * 0 stats retrieval successful
55 * errno stats retrieval failed - reason indicated
59 fore_get_stats(Fore_unit *fup)
65 ATM_DEBUG1("fore_get_stats: fup=%p\n", fup);
68 * Make sure device has been initialized
70 if ((fup->fu_flags & CUF_INITED) == 0) {
75 * If someone has already initiated a stats request, we'll
76 * just wait for that one to complete
79 if (fup->fu_flags & FUF_STATCMD) {
81 sst = tsleep((caddr_t)&fup->fu_stats, PCATCH, "fore", 0);
83 return (sst ? sst : fup->fu_stats_ret);
87 * Limit stats gathering to once a second or so
89 if (time_second == fup->fu_stats_time) {
93 fup->fu_stats_time = time_second;
96 * Queue command at end of command queue
98 hcp = fup->fu_cmd_tail;
99 if ((*hcp->hcq_status) & QSTAT_FREE) {
103 * Queue entry available, so set our view of things up
105 hcp->hcq_code = CMD_GET_STATS;
107 fup->fu_cmd_tail = hcp->hcq_next;
110 * Now set the CP-resident queue entry - the CP will grab
111 * the command when the op-code is set.
113 cqp = hcp->hcq_cpelem;
114 (*hcp->hcq_status) = QSTAT_PENDING;
116 dma = DMA_GET_ADDR(fup->fu_stats, sizeof(Fore_cp_stats),
117 FORE_STATS_ALIGN, 0);
119 fup->fu_stats->st_drv.drv_cm_nodma++;
123 fup->fu_statsd = dma;
124 cqp->cmdq_stats.stats_buffer = (CP_dma) CP_WRITE(dma);
126 fup->fu_flags |= FUF_STATCMD;
127 cqp->cmdq_stats.stats_cmd =
128 CP_WRITE(CMD_GET_STATS | CMD_INTR_REQ);
131 * Now wait for command to finish
133 sst = tsleep((caddr_t)&fup->fu_stats, PCATCH, "fore", 0);
135 return (sst ? sst : fup->fu_stats_ret);
141 fup->fu_stats->st_drv.drv_cm_full++;