2 ** *************************************************************************
8 ** RedCreek InterFace include file.
10 ** ---------------------------------------------------------------------
11 ** --- Copyright (c) 1998-1999, RedCreek Communications Inc. ---
12 ** --- All rights reserved. ---
13 ** ---------------------------------------------------------------------
17 ** Header file private ioctl commands.
20 ** This program is free software; you can redistribute it and/or modify
21 ** it under the terms of the GNU General Public License as published by
22 ** the Free Software Foundation; either version 2 of the License, or
23 ** (at your option) any later version.
25 ** This program is distributed in the hope that it will be useful,
26 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
27 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 ** GNU General Public License for more details.
30 ** You should have received a copy of the GNU General Public License
31 ** along with this program; if not, write to the Free Software
32 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 ** *************************************************************************
39 /* The following protocol revision # should be incremented every time
40 a new protocol or new structures are used in this file. */
41 int USER_PROTOCOL_REV
= 2; /* used to track different protocol revisions */
43 /* define a single TCB & buffer */
44 typedef struct /* a single buffer */
46 U32 context
; /* context */
47 U32 scount
; /* segment count */
48 U32 size
; /* segment size */
49 U32 addr
; /* segment physical address */
51 __attribute__((packed
))
53 typedef struct /* a single TCB */
56 ** +-----------------------+
57 ** | 1 | one buffer in the TCB
58 ** +-----------------------+
59 ** | <user's Context> | user's buffer reference
60 ** +-----------------------+
61 ** | 1 | one segment buffer
62 ** +-----------------------+ _
63 ** | <buffer size> | size \
64 ** +-----------------------+ \ segment descriptor
65 ** | <physical address> | physical address of buffer /
66 ** +-----------------------+ _/
68 U32 bcount
; /* buffer count */
69 singleB b
; /* buffer */
72 __attribute__((packed
))
73 singleTCB
, *psingleTCB
;
76 When adding new entries, please add all 5 related changes, since
77 it helps keep everything consistent:
78 1) User structure entry
80 3) Structure short-cut entry
81 4) Data short-cut entry
82 5) Command identifier entry
84 For Example ("GETSPEED"):
85 1) struct RCgetspeed_tag { U32 LinkSpeedCode; } RCgetspeed;
86 2) struct RCgetspeed_tag *getspeed;
87 3) #define RCUS_GETSPEED data.RCgetspeed;
88 4) #define RCUD_GETSPEED _RC_user_data.getspeed
89 5) #define RCUC_GETSPEED 0x02
91 Notes for the "GETSPEED" entry, above:
92 1) RCgetspeed - RC{name}
93 RCgetspeed_tag - RC{name}_tag
94 LinkSpeedCode - create any structure format desired (not too large,
95 since memory will be unioned with all other entries)
96 2) RCgetspeed_tag - RC{name}_tag chosen in #1
97 getspeed - arbitrary name (ptr to structure in #1)
98 3) RCUS_GETSPEED - RCUS_{NAME} ("NAME" & "name" do not have to the same)
99 data.RCgetspeed - data.RC{name} ("RC{name}" from #1)
100 4) RCUD_GETSPEED - _RC_user_data.getspeed ("getspeed" from #2)
101 5) RCUC_GETSPEED - unique hex identifier entry.
104 typedef struct RC_user_tag RCuser_struct
;
106 /* 1) User structure entry */
112 /* GETINFO structure */
113 struct RCgetinfo_tag
{
114 unsigned long int mem_start
;
115 unsigned long int mem_end
;
116 unsigned long int base_addr
;
120 } RCgetinfo
; /* <---- RCgetinfo */
122 /* GETSPEED structure */
123 struct RCgetspeed_tag
{
125 } RCgetspeed
; /* <---- RCgetspeed */
127 /* SETSPEED structure */
128 struct RCsetspeed_tag
{
130 } RCsetspeed
; /* <---- RCsetspeed */
132 /* GETPROM structure */
133 struct RCgetprom_tag
{
135 } RCgetprom
; /* <---- RCgetprom */
137 /* SETPROM structure */
138 struct RCsetprom_tag
{
140 } RCsetprom
; /* <---- RCsetprom */
142 /* GETBROADCAST structure */
143 struct RCgetbroadcast_tag
{
145 } RCgetbroadcast
; /* <---- RCgetbroadcast */
147 /* SETBROADCAST structure */
148 struct RCsetbroadcast_tag
{
150 } RCsetbroadcast
; /* <---- RCsetbroadcast */
152 /* GETFIRMWAREVER structure */
153 #define FirmStringLen 80
154 struct RCgetfwver_tag
{
155 U8 FirmString
[FirmStringLen
];
156 } RCgetfwver
; /* <---- RCgetfwver */
158 /* GETIPANDMASK structure */
159 struct RCgetipnmask_tag
{
162 } RCgetipandmask
; /* <---- RCgetipandmask */
164 /* SETIPANDMASK structure */
165 struct RCsetipnmask_tag
{
168 } RCsetipandmask
; /* <---- RCsetipandmask */
170 /* GETMAC structure */
172 struct RCgetmac_tag
{
174 } RCgetmac
; /* <---- RCgetmac */
176 /* SETMAC structure */
177 struct RCsetmac_tag
{
179 } RCsetmac
; /* <---- RCsetmac */
181 /* GETLINKSTATUS structure */
182 struct RCgetlnkstatus_tag
{
184 } RCgetlnkstatus
; /* <---- RCgetlnkstatus */
186 /* GETLINKSTATISTICS structure */
187 struct RCgetlinkstats_tag
{
188 RCLINKSTATS StatsReturn
;
189 } RCgetlinkstats
; /* <---- RCgetlinkstats */
191 /* DEFAULT structure (when no command was recognized) */
192 struct RCdefault_tag
{
194 } RCdefault
; /* <---- RCdefault */
198 }; /* struct RC_user_tag { ... } */
200 /* 2) User data entry */
201 /* RCUD = RedCreek User Data */
202 union RC_user_data_tag
{ /* structure tags used are taken from RC_user_tag structure above */
203 struct RCgetinfo_tag
*getinfo
;
204 struct RCgetspeed_tag
*getspeed
;
205 struct RCgetprom_tag
*getprom
;
206 struct RCgetbroadcast_tag
*getbroadcast
;
207 struct RCgetfwver_tag
*getfwver
;
208 struct RCgetipnmask_tag
*getipandmask
;
209 struct RCgetmac_tag
*getmac
;
210 struct RCgetlnkstatus_tag
*getlinkstatus
;
211 struct RCgetlinkstats_tag
*getlinkstatistics
;
212 struct RCdefault_tag
*rcdefault
;
213 struct RCsetspeed_tag
*setspeed
;
214 struct RCsetprom_tag
*setprom
;
215 struct RCsetbroadcast_tag
*setbroadcast
;
216 struct RCsetipnmask_tag
*setipandmask
;
217 struct RCsetmac_tag
*setmac
;
218 } _RC_user_data
; /* declare as a global, so the defines below will work */
220 /* 3) Structure short-cut entry */
221 /* define structure short-cuts */ /* structure names are taken from RC_user_tag structure above */
222 #define RCUS_GETINFO data.RCgetinfo;
223 #define RCUS_GETSPEED data.RCgetspeed;
224 #define RCUS_GETPROM data.RCgetprom;
225 #define RCUS_GETBROADCAST data.RCgetbroadcast;
226 #define RCUS_GETFWVER data.RCgetfwver;
227 #define RCUS_GETIPANDMASK data.RCgetipandmask;
228 #define RCUS_GETMAC data.RCgetmac;
229 #define RCUS_GETLINKSTATUS data.RCgetlnkstatus;
230 #define RCUS_GETLINKSTATISTICS data.RCgetlinkstats;
231 #define RCUS_DEFAULT data.RCdefault;
232 #define RCUS_SETSPEED data.RCsetspeed;
233 #define RCUS_SETPROM data.RCsetprom;
234 #define RCUS_SETBROADCAST data.RCsetbroadcast;
235 #define RCUS_SETIPANDMASK data.RCsetipandmask;
236 #define RCUS_SETMAC data.RCsetmac;
238 /* 4) Data short-cut entry */
239 /* define data short-cuts */ /* pointer names are from RC_user_data_tag union (just below RC_user_tag) */
240 #define RCUD_GETINFO _RC_user_data.getinfo
241 #define RCUD_GETSPEED _RC_user_data.getspeed
242 #define RCUD_GETPROM _RC_user_data.getprom
243 #define RCUD_GETBROADCAST _RC_user_data.getbroadcast
244 #define RCUD_GETFWVER _RC_user_data.getfwver
245 #define RCUD_GETIPANDMASK _RC_user_data.getipandmask
246 #define RCUD_GETMAC _RC_user_data.getmac
247 #define RCUD_GETLINKSTATUS _RC_user_data.getlinkstatus
248 #define RCUD_GETLINKSTATISTICS _RC_user_data.getlinkstatistics
249 #define RCUD_DEFAULT _RC_user_data.rcdefault
250 #define RCUD_SETSPEED _RC_user_data.setspeed
251 #define RCUD_SETPROM _RC_user_data.setprom
252 #define RCUD_SETBROADCAST _RC_user_data.setbroadcast
253 #define RCUD_SETIPANDMASK _RC_user_data.setipandmask
254 #define RCUD_SETMAC _RC_user_data.setmac
256 /* 5) Command identifier entry */
257 /* define command identifiers */
258 #define RCUC_GETINFO 0x01
259 #define RCUC_GETSPEED 0x02
260 #define RCUC_GETFWVER 0x03
261 #define RCUC_GETIPANDMASK 0x04
262 #define RCUC_GETMAC 0x05
263 #define RCUC_GETLINKSTATUS 0x06
264 #define RCUC_GETLINKSTATISTICS 0x07
265 #define RCUC_GETPROM 0x14
266 #define RCUC_GETBROADCAST 0x15
267 #define RCUC_DEFAULT 0xff
268 #define RCUC_SETSPEED 0x08
269 #define RCUC_SETIPANDMASK 0x09
270 #define RCUC_SETMAC 0x0a
271 #define RCUC_SETPROM 0x16
272 #define RCUC_SETBROADCAST 0x17
274 /* define ioctl commands to use, when talking to RC 45/PCI driver */
275 #define RCU_PROTOCOL_REV SIOCDEVPRIVATE
276 #define RCU_COMMAND SIOCDEVPRIVATE+1
279 Intended use for the above defines is shown below (GETINFO, as this example):
281 RCuser_struct RCuser; // declare RCuser structure
282 struct ifreq ifr; // declare an interface request structure
284 RCuser.cmd = RCUC_GETINFO; // set user command to GETINFO
285 ifr->ifr_data = (caddr_t) &RCuser; // set point to user structure
287 sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); // get a socket
288 ioctl(sock, RCU_COMMAND, &ifr); // do ioctl on socket
290 RCUD_GETINFO = &RCuser.RCUS_GETINFO; // set data pointer for GETINFO
293 printf("memory 0x%lx-0x%lx, base address 0x%x, irq 0x%x\n",
294 RCUD_GETINFO->mem_start, RCUD_GETINFO->mem_end,
295 RCUD_GETINFO->base_addr, RCUD_GETINFO->irq);