1 /*
2 ** *************************************************************************
3 **
4 **
5 **     R C I F . H
6 **
7 **
8 **  RedCreek InterFace include file.
9 **
10 **  ---------------------------------------------------------------------
11 **  ---     Copyright (c) 1998-1999, RedCreek Communications Inc.     ---
12 **  ---                   All rights reserved.                        ---
13 **  ---------------------------------------------------------------------
14 **
15 ** File Description:
16 **
17 ** Header file private ioctl commands.
18 **
19 **
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.
24 
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.
29 
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 ** *************************************************************************
34 */
35 
36 #ifndef RCIF_H
37 #define RCIF_H
38 
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 */
42 
43 /* define a single TCB & buffer */
44 typedef struct {		/* a single buffer */
45 	U32 context;		/* context */
46 	U32 scount;		/* segment count */
47 	U32 size;		/* segment size */
48 	U32 addr;		/* segment physical address */
49 } __attribute__ ((packed))
50     singleB, *psingleB;
51 typedef struct {		/* a single TCB */
52 	/*
53 	   **  +-----------------------+
54 	   **  |         1             |  one buffer in the TCB
55 	   **  +-----------------------+
56 	   **  |  <user's Context>     |  user's buffer reference
57 	   **  +-----------------------+
58 	   **  |         1             |  one segment buffer
59 	   **  +-----------------------+                            _
60 	   **  |    <buffer size>      |  size                       \
61 	   **  +-----------------------+                              \ segment descriptor
62 	   **  |  <physical address>   |  physical address of buffer  /
63 	   **  +-----------------------+                            _/
64 	 */
65 	U32 bcount;		/* buffer count */
66 	singleB b;		/* buffer */
67 
68 } __attribute__ ((packed))
69     singleTCB, *psingleTCB;
70 
71 /*
72    When adding new entries, please add all 5 related changes, since
73    it helps keep everything consistent:
74       1) User structure entry
75       2) User data entry
76       3) Structure short-cut entry
77       4) Data short-cut entry
78       5) Command identifier entry
79 
80    For Example ("GETSPEED"):
81       1) struct  RCgetspeed_tag { U32 LinkSpeedCode; } RCgetspeed;
82       2) struct  RCgetspeed_tag *getspeed;
83       3) #define RCUS_GETSPEED  data.RCgetspeed;
84       4) #define RCUD_GETSPEED  _RC_user_data.getspeed
85       5) #define RCUC_GETSPEED  0x02
86 
87    Notes for the "GETSPEED" entry, above:
88       1) RCgetspeed      - RC{name}
89          RCgetspeed_tag  - RC{name}_tag
90          LinkSpeedCode   - create any structure format desired (not too large,
91                            since memory will be unioned with all other entries)
92       2) RCgetspeed_tag  - RC{name}_tag chosen in #1
93          getspeed        - arbitrary name (ptr to structure in #1)
94       3) RCUS_GETSPEED   - RCUS_{NAME}   ("NAME" & "name" do not have to the same)
95          data.RCgetspeed - data.RC{name}  ("RC{name}" from #1)
96       4) RCUD_GETSPEED   - _RC_user_data.getspeed  ("getspeed" from #2)
97       5) RCUC_GETSPEED   - unique hex identifier entry.
98 */
99 
100 typedef struct RC_user_tag RCuser_struct;
101 
102 /* 1) User structure entry */
103 struct RC_user_tag {
104 	int cmd;
105 	union {
106 		/* GETINFO structure */
107 		struct RCgetinfo_tag {
108 			unsigned long int mem_start;
109 			unsigned long int mem_end;
110 			unsigned long int base_addr;
111 			unsigned char irq;
112 			unsigned char dma;
113 			unsigned char port;
114 		} RCgetinfo;	/* <---- RCgetinfo */
115 
116 		/* GETSPEED structure */
117 		struct RCgetspeed_tag {
118 			U32 LinkSpeedCode;
119 		} RCgetspeed;	/* <---- RCgetspeed */
120 
121 		/* SETSPEED structure */
122 		struct RCsetspeed_tag {
123 			U16 LinkSpeedCode;
124 		} RCsetspeed;	/* <---- RCsetspeed */
125 
126 		/* GETPROM structure */
127 		struct RCgetprom_tag {
128 			U32 PromMode;
129 		} RCgetprom;	/* <---- RCgetprom */
130 
131 		/* SETPROM structure */
132 		struct RCsetprom_tag {
133 			U16 PromMode;
134 		} RCsetprom;	/* <---- RCsetprom */
135 
136 		/* GETBROADCAST structure */
137 		struct RCgetbroadcast_tag {
138 			U32 BroadcastMode;
139 		} RCgetbroadcast;	/* <---- RCgetbroadcast */
140 
141 		/* SETBROADCAST structure */
142 		struct RCsetbroadcast_tag {
143 			U16 BroadcastMode;
144 		} RCsetbroadcast;	/* <---- RCsetbroadcast */
145 
146 		/* GETFIRMWAREVER structure */
147 #define FirmStringLen 80
148 		struct RCgetfwver_tag {
149 			U8 FirmString[FirmStringLen];
150 		} RCgetfwver;	/* <---- RCgetfwver */
151 
152 		/* GETIPANDMASK structure */
153 		struct RCgetipnmask_tag {
154 			U32 IpAddr;
155 			U32 NetMask;
156 		} RCgetipandmask;	/* <---- RCgetipandmask */
157 
158 		/* SETIPANDMASK structure */
159 		struct RCsetipnmask_tag {
160 			U32 IpAddr;
161 			U32 NetMask;
162 		} RCsetipandmask;	/* <---- RCsetipandmask */
163 
164 		/* GETMAC structure */
165 #define MAC_SIZE 10
166 		struct RCgetmac_tag {
167 			U8 mac[MAC_SIZE];
168 		} RCgetmac;	/* <---- RCgetmac */
169 
170 		/* SETMAC structure */
171 		struct RCsetmac_tag {
172 			U8 mac[MAC_SIZE];
173 		} RCsetmac;	/* <---- RCsetmac */
174 
175 		/* GETLINKSTATUS structure */
176 		struct RCgetlnkstatus_tag {
177 			U32 ReturnStatus;
178 		} RCgetlnkstatus;	/* <---- RCgetlnkstatus */
179 
180 		/* GETLINKSTATISTICS structure */
181 		struct RCgetlinkstats_tag {
182 			RCLINKSTATS StatsReturn;
183 		} RCgetlinkstats;	/* <---- RCgetlinkstats */
184 
185 		/* DEFAULT structure (when no command was recognized) */
186 		struct RCdefault_tag {
187 			int rc;
188 		} RCdefault;	/* <---- RCdefault */
189 
190 	} data;
191 
192 };				/* struct RC_user_tag { ... } */
193 
194 /* 2) User data entry */
195 /* RCUD = RedCreek User Data */
196 union RC_user_data_tag {	/* structure tags used are taken from RC_user_tag structure above */
197 	struct RCgetinfo_tag *getinfo;
198 	struct RCgetspeed_tag *getspeed;
199 	struct RCgetprom_tag *getprom;
200 	struct RCgetbroadcast_tag *getbroadcast;
201 	struct RCgetfwver_tag *getfwver;
202 	struct RCgetipnmask_tag *getipandmask;
203 	struct RCgetmac_tag *getmac;
204 	struct RCgetlnkstatus_tag *getlinkstatus;
205 	struct RCgetlinkstats_tag *getlinkstatistics;
206 	struct RCdefault_tag *rcdefault;
207 	struct RCsetspeed_tag *setspeed;
208 	struct RCsetprom_tag *setprom;
209 	struct RCsetbroadcast_tag *setbroadcast;
210 	struct RCsetipnmask_tag *setipandmask;
211 	struct RCsetmac_tag *setmac;
212 } _RC_user_data;		/* declare as a global, so the defines below will work */
213 
214 /* 3) Structure short-cut entry */
215 /* define structure short-cuts *//* structure names are taken from RC_user_tag structure above */
216 #define RCUS_GETINFO           data.RCgetinfo;
217 #define RCUS_GETSPEED          data.RCgetspeed;
218 #define RCUS_GETPROM           data.RCgetprom;
219 #define RCUS_GETBROADCAST      data.RCgetbroadcast;
220 #define RCUS_GETFWVER          data.RCgetfwver;
221 #define RCUS_GETIPANDMASK      data.RCgetipandmask;
222 #define RCUS_GETMAC            data.RCgetmac;
223 #define RCUS_GETLINKSTATUS     data.RCgetlnkstatus;
224 #define RCUS_GETLINKSTATISTICS data.RCgetlinkstats;
225 #define RCUS_DEFAULT           data.RCdefault;
226 #define RCUS_SETSPEED          data.RCsetspeed;
227 #define RCUS_SETPROM           data.RCsetprom;
228 #define RCUS_SETBROADCAST      data.RCsetbroadcast;
229 #define RCUS_SETIPANDMASK      data.RCsetipandmask;
230 #define RCUS_SETMAC            data.RCsetmac;
231 
232 /* 4) Data short-cut entry */
233 /* define data short-cuts *//* pointer names are from RC_user_data_tag union (just below RC_user_tag) */
234 #define RCUD_GETINFO           _RC_user_data.getinfo
235 #define RCUD_GETSPEED          _RC_user_data.getspeed
236 #define RCUD_GETPROM           _RC_user_data.getprom
237 #define RCUD_GETBROADCAST      _RC_user_data.getbroadcast
238 #define RCUD_GETFWVER          _RC_user_data.getfwver
239 #define RCUD_GETIPANDMASK      _RC_user_data.getipandmask
240 #define RCUD_GETMAC            _RC_user_data.getmac
241 #define RCUD_GETLINKSTATUS     _RC_user_data.getlinkstatus
242 #define RCUD_GETLINKSTATISTICS _RC_user_data.getlinkstatistics
243 #define RCUD_DEFAULT           _RC_user_data.rcdefault
244 #define RCUD_SETSPEED          _RC_user_data.setspeed
245 #define RCUD_SETPROM           _RC_user_data.setprom
246 #define RCUD_SETBROADCAST      _RC_user_data.setbroadcast
247 #define RCUD_SETIPANDMASK      _RC_user_data.setipandmask
248 #define RCUD_SETMAC            _RC_user_data.setmac
249 
250 /* 5) Command identifier entry */
251 /* define command identifiers */
252 #define RCUC_GETINFO            0x01
253 #define RCUC_GETSPEED           0x02
254 #define RCUC_GETFWVER           0x03
255 #define RCUC_GETIPANDMASK       0x04
256 #define RCUC_GETMAC             0x05
257 #define RCUC_GETLINKSTATUS      0x06
258 #define RCUC_GETLINKSTATISTICS  0x07
259 #define RCUC_GETPROM            0x14
260 #define RCUC_GETBROADCAST       0x15
261 #define RCUC_DEFAULT            0xff
262 #define RCUC_SETSPEED           0x08
263 #define RCUC_SETIPANDMASK       0x09
264 #define RCUC_SETMAC             0x0a
265 #define RCUC_SETPROM            0x16
266 #define RCUC_SETBROADCAST       0x17
267 
268 /* define ioctl commands to use, when talking to RC 45/PCI driver */
269 #define RCU_PROTOCOL_REV         SIOCDEVPRIVATE
270 #define RCU_COMMAND              SIOCDEVPRIVATE+1
271 
272 /*
273    Intended use for the above defines is shown below (GETINFO, as this example):
274 
275       RCuser_struct RCuser;           // declare RCuser structure
276       struct ifreq ifr;               // declare an interface request structure
277 
278       RCuser.cmd = RCUC_GETINFO;           // set user command to GETINFO
279       ifr->ifr_data = (caddr_t) &RCuser;   // set point to user structure
280 
281       sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);   // get a socket
282       ioctl(sock, RCU_COMMAND, &ifr);                  // do ioctl on socket
283 
284       RCUD_GETINFO = &RCuser.RCUS_GETINFO;   // set data pointer for GETINFO
285 
286       // print results
287       printf("memory 0x%lx-0x%lx, base address 0x%x, irq 0x%x\n",
288               RCUD_GETINFO->mem_start, RCUD_GETINFO->mem_end,
289               RCUD_GETINFO->base_addr, RCUD_GETINFO->irq);
290 */
291 
292 #endif				/* RCIF_H */
293