]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - 6/sys/dev/hfa/fore_if.c
Clone Kip's Xen on stable/6 tree so that I can work on improving FreeBSD/amd64
[FreeBSD/FreeBSD.git] / 6 / sys / dev / hfa / fore_if.c
1 /*-
2  *
3  * ===================================
4  * HARP  |  Host ATM Research Platform
5  * ===================================
6  *
7  *
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.
12  *
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.
20  *
21  * Copyright 1994-1998 Network Computing Services, Inc.
22  *
23  * Copies of this Software may be made, however, the above copyright
24  * notice must be reproduced on all copies.
25  *
26  *      @(#) $FreeBSD$
27  *
28  */
29
30 /*
31  * FORE Systems 200-Series Adapter Support
32  * ---------------------------------------
33  *
34  * Network interface layer support
35  *
36  */
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/socket.h>
41 #include <sys/socketvar.h>
42 #include <net/if.h>
43 #include <netatm/port.h>
44 #include <netatm/queue.h>
45 #include <netatm/atm.h>
46 #include <netatm/atm_sys.h>
47 #include <netatm/atm_sap.h>
48 #include <netatm/atm_cm.h>
49 #include <netatm/atm_if.h>
50 #include <netatm/atm_ioctl.h>
51 #include <netatm/atm_stack.h>
52 #include <netatm/atm_pcb.h>
53 #include <netatm/atm_var.h>
54 #include <dev/pci/pcivar.h>
55 #include <dev/hfa/fore.h>
56 #include <dev/hfa/fore_aali.h>
57 #include <dev/hfa/fore_slave.h>
58 #include <dev/hfa/fore_stats.h>
59 #include <dev/hfa/fore_var.h>
60 #include <dev/hfa/fore_include.h>
61
62 #ifndef lint
63 __RCSID("@(#) $FreeBSD$");
64 #endif
65
66
67 /*
68  * Handle netatm core service interface ioctl requests 
69  *
70  * Called at splnet.
71  *
72  * Arguments:
73  *      code            ioctl function (sub)code
74  *      data            data to/from ioctl
75  *      arg             optional code-specific argument
76  *
77  * Returns:
78  *      0               request processed successfully
79  *      error           request failed - reason code
80  */
81 int
82 fore_atm_ioctl(code, data, arg)
83         int     code;
84         caddr_t data;
85         caddr_t arg;
86 {
87         struct atminfreq        *aip = (struct atminfreq *)data;
88         struct atm_pif          *pip;
89         Fore_unit               *fup;
90         caddr_t                 buf = aip->air_buf_addr;
91         struct air_vinfo_rsp    *avr;
92         size_t count;
93         size_t len;
94         size_t buf_len = aip->air_buf_len;
95         int                     err = 0;
96         char                    ifname[2*IFNAMSIZ];
97  
98
99         ATM_DEBUG2("fore_atm_ioctl: code=%d, opcode=%d\n", 
100                 code, aip->air_opcode);
101
102         switch ( aip->air_opcode ) {
103
104         case AIOCS_INF_VST:
105                 /*
106                  * Get vendor statistics
107                  */
108                 pip = (struct atm_pif *)arg;
109                 fup = (Fore_unit *)pip;
110                 if ( pip == NULL )
111                         return ( ENXIO );
112                 snprintf ( ifname, sizeof(ifname),
113                     "%s%d", pip->pif_name, pip->pif_unit );
114
115                 /*
116                  * Cast response structure onto user's buffer
117                  */
118                 avr = (struct air_vinfo_rsp *)buf;
119
120                 /*
121                  * How large is the response structure?
122                  */
123                 len = sizeof(struct air_vinfo_rsp);
124
125                 /*
126                  * Sanity check - enough room for response structure?
127                  */
128                 if ( buf_len < len )
129                         return ( ENOSPC );
130
131                 /*
132                  * Copy interface name into response structure
133                  */
134                 if ((err = copyout ( ifname, avr->avsp_intf, IFNAMSIZ)) != 0)
135                         break;
136
137                 /*
138                  * Advance the buffer address and decrement the size
139                  */
140                 buf += len;
141                 buf_len -= len;
142
143                 /*
144                  * Get the vendor stats from the hardware
145                  */
146                 count = 0;
147                 if ( ( err = fore_get_stats ( fup ) ) == 0 )
148                 {
149                         /*
150                          * Stick as much of it as we have room for 
151                          * into the response
152                          */
153                         count = min ( sizeof(Fore_stats), buf_len );
154
155                         /*
156                          * Copy stats into user's buffer. Return value is
157                          * amount of data copied.
158                          */
159                         if ((err = copyout((caddr_t)fup->fu_stats, buf, count)) != 0)
160                                 break;
161                         buf += count;
162                         buf_len -= count;
163                         if ( count < sizeof(Fore_stats) )
164                                 err = ENOSPC;
165                 }
166
167                 /*
168                  * Record amount we're returning as vendor info...
169                  */
170                 if ((err = copyout(&count, &avr->avsp_len, sizeof(count))) != 0)
171                         break;
172
173                 /*
174                  * Update the reply pointers and lengths
175                  */
176                 aip->air_buf_addr = buf;
177                 aip->air_buf_len = buf_len;
178                 break;
179
180         default:
181                 err = ENOSYS;           /* Operation not supported */
182                 break;
183         }
184
185         return (err);
186 }
187
188
189 /*
190  * Free Fore-specific device resources
191  * 
192  * Frees all dynamically acquired resources for a device unit.  Before
193  * this function is called, the CP will have been reset and our interrupt
194  * vectors removed.
195  *
196  * Arguments:
197  *      fup     pointer to device unit structure
198  *
199  * Returns:
200  *      none
201  *
202  */
203 void
204 fore_interface_free(fup)
205         Fore_unit       *fup;
206 {
207
208         /*
209          * Free up all of our allocated memory
210          */
211         fore_xmit_free(fup);
212         fore_recv_free(fup);
213         fore_buf_free(fup);
214         fore_cmd_free(fup);
215
216         /*
217          * Clear device initialized
218          */
219         if (fup->fu_flags & CUF_INITED) {
220                 fup->fu_flags &= ~CUF_INITED;
221         }
222
223         if (fup->fu_flags & FUF_STATCMD) {
224                 fup->fu_flags &= ~FUF_STATCMD;
225         }
226         return;
227 }
228