rcif.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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. **  This program is distributed in the hope that it will be useful,
  25. **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26. **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27. **  GNU General Public License for more details.
  28. **  You should have received a copy of the GNU General Public License
  29. **  along with this program; if not, write to the Free Software
  30. **  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  31. ** *************************************************************************
  32. */
  33. #ifndef RCIF_H
  34. #define RCIF_H
  35. /* The following protocol revision # should be incremented every time
  36.    a new protocol or new structures are used in this file. */
  37. int USER_PROTOCOL_REV = 2; /* used to track different protocol revisions */
  38. /* define a single TCB & buffer */
  39. typedef struct { /* a single buffer */
  40. U32 context; /* context */
  41. U32 scount; /* segment count */
  42. U32 size; /* segment size */
  43. U32 addr; /* segment physical address */
  44. } __attribute__ ((packed))
  45.     singleB, *psingleB;
  46. typedef struct { /* a single TCB */
  47. /*
  48.    **  +-----------------------+
  49.    **  |         1             |  one buffer in the TCB
  50.    **  +-----------------------+
  51.    **  |  <user's Context>     |  user's buffer reference
  52.    **  +-----------------------+
  53.    **  |         1             |  one segment buffer
  54.    **  +-----------------------+                            _
  55.    **  |    <buffer size>      |  size                        
  56.    **  +-----------------------+                               segment descriptor
  57.    **  |  <physical address>   |  physical address of buffer  /
  58.    **  +-----------------------+                            _/
  59.  */
  60. U32 bcount; /* buffer count */
  61. singleB b; /* buffer */
  62. } __attribute__ ((packed))
  63.     singleTCB, *psingleTCB;
  64. /*
  65.    When adding new entries, please add all 5 related changes, since 
  66.    it helps keep everything consistent:
  67.       1) User structure entry
  68.       2) User data entry
  69.       3) Structure short-cut entry
  70.       4) Data short-cut entry
  71.       5) Command identifier entry
  72.    For Example ("GETSPEED"):
  73.       1) struct  RCgetspeed_tag { U32 LinkSpeedCode; } RCgetspeed;
  74.       2) struct  RCgetspeed_tag *getspeed;
  75.       3) #define RCUS_GETSPEED  data.RCgetspeed;
  76.       4) #define RCUD_GETSPEED  _RC_user_data.getspeed
  77.       5) #define RCUC_GETSPEED  0x02
  78.   
  79.    Notes for the "GETSPEED" entry, above:
  80.       1) RCgetspeed      - RC{name}
  81.          RCgetspeed_tag  - RC{name}_tag
  82.          LinkSpeedCode   - create any structure format desired (not too large,
  83.                            since memory will be unioned with all other entries)
  84.       2) RCgetspeed_tag  - RC{name}_tag chosen in #1
  85.          getspeed        - arbitrary name (ptr to structure in #1)
  86.       3) RCUS_GETSPEED   - RCUS_{NAME}   ("NAME" & "name" do not have to the same)
  87.          data.RCgetspeed - data.RC{name}  ("RC{name}" from #1)
  88.       4) RCUD_GETSPEED   - _RC_user_data.getspeed  ("getspeed" from #2)
  89.       5) RCUC_GETSPEED   - unique hex identifier entry.
  90. */
  91. typedef struct RC_user_tag RCuser_struct;
  92. /* 1) User structure entry */
  93. struct RC_user_tag {
  94. int cmd;
  95. union {
  96. /* GETINFO structure */
  97. struct RCgetinfo_tag {
  98. unsigned long int mem_start;
  99. unsigned long int mem_end;
  100. unsigned long int base_addr;
  101. unsigned char irq;
  102. unsigned char dma;
  103. unsigned char port;
  104. } RCgetinfo; /* <---- RCgetinfo */
  105. /* GETSPEED structure */
  106. struct RCgetspeed_tag {
  107. U32 LinkSpeedCode;
  108. } RCgetspeed; /* <---- RCgetspeed */
  109. /* SETSPEED structure */
  110. struct RCsetspeed_tag {
  111. U16 LinkSpeedCode;
  112. } RCsetspeed; /* <---- RCsetspeed */
  113. /* GETPROM structure */
  114. struct RCgetprom_tag {
  115. U32 PromMode;
  116. } RCgetprom; /* <---- RCgetprom */
  117. /* SETPROM structure */
  118. struct RCsetprom_tag {
  119. U16 PromMode;
  120. } RCsetprom; /* <---- RCsetprom */
  121. /* GETBROADCAST structure */
  122. struct RCgetbroadcast_tag {
  123. U32 BroadcastMode;
  124. } RCgetbroadcast; /* <---- RCgetbroadcast */
  125. /* SETBROADCAST structure */
  126. struct RCsetbroadcast_tag {
  127. U16 BroadcastMode;
  128. } RCsetbroadcast; /* <---- RCsetbroadcast */
  129. /* GETFIRMWAREVER structure */
  130. #define FirmStringLen 80
  131. struct RCgetfwver_tag {
  132. U8 FirmString[FirmStringLen];
  133. } RCgetfwver; /* <---- RCgetfwver */
  134. /* GETIPANDMASK structure */
  135. struct RCgetipnmask_tag {
  136. U32 IpAddr;
  137. U32 NetMask;
  138. } RCgetipandmask; /* <---- RCgetipandmask */
  139. /* SETIPANDMASK structure */
  140. struct RCsetipnmask_tag {
  141. U32 IpAddr;
  142. U32 NetMask;
  143. } RCsetipandmask; /* <---- RCsetipandmask */
  144. /* GETMAC structure */
  145. #define MAC_SIZE 10
  146. struct RCgetmac_tag {
  147. U8 mac[MAC_SIZE];
  148. } RCgetmac; /* <---- RCgetmac */
  149. /* SETMAC structure */
  150. struct RCsetmac_tag {
  151. U8 mac[MAC_SIZE];
  152. } RCsetmac; /* <---- RCsetmac */
  153. /* GETLINKSTATUS structure */
  154. struct RCgetlnkstatus_tag {
  155. U32 ReturnStatus;
  156. } RCgetlnkstatus; /* <---- RCgetlnkstatus */
  157. /* GETLINKSTATISTICS structure */
  158. struct RCgetlinkstats_tag {
  159. RCLINKSTATS StatsReturn;
  160. } RCgetlinkstats; /* <---- RCgetlinkstats */
  161. /* DEFAULT structure (when no command was recognized) */
  162. struct RCdefault_tag {
  163. int rc;
  164. } RCdefault; /* <---- RCdefault */
  165. } data;
  166. }; /* struct RC_user_tag { ... } */
  167. /* 2) User data entry */
  168. /* RCUD = RedCreek User Data */
  169. union RC_user_data_tag { /* structure tags used are taken from RC_user_tag structure above */
  170. struct RCgetinfo_tag *getinfo;
  171. struct RCgetspeed_tag *getspeed;
  172. struct RCgetprom_tag *getprom;
  173. struct RCgetbroadcast_tag *getbroadcast;
  174. struct RCgetfwver_tag *getfwver;
  175. struct RCgetipnmask_tag *getipandmask;
  176. struct RCgetmac_tag *getmac;
  177. struct RCgetlnkstatus_tag *getlinkstatus;
  178. struct RCgetlinkstats_tag *getlinkstatistics;
  179. struct RCdefault_tag *rcdefault;
  180. struct RCsetspeed_tag *setspeed;
  181. struct RCsetprom_tag *setprom;
  182. struct RCsetbroadcast_tag *setbroadcast;
  183. struct RCsetipnmask_tag *setipandmask;
  184. struct RCsetmac_tag *setmac;
  185. } _RC_user_data; /* declare as a global, so the defines below will work */
  186. /* 3) Structure short-cut entry */
  187. /* define structure short-cuts *//* structure names are taken from RC_user_tag structure above */
  188. #define RCUS_GETINFO           data.RCgetinfo;
  189. #define RCUS_GETSPEED          data.RCgetspeed;
  190. #define RCUS_GETPROM           data.RCgetprom;
  191. #define RCUS_GETBROADCAST      data.RCgetbroadcast;
  192. #define RCUS_GETFWVER          data.RCgetfwver;
  193. #define RCUS_GETIPANDMASK      data.RCgetipandmask;
  194. #define RCUS_GETMAC            data.RCgetmac;
  195. #define RCUS_GETLINKSTATUS     data.RCgetlnkstatus;
  196. #define RCUS_GETLINKSTATISTICS data.RCgetlinkstats;
  197. #define RCUS_DEFAULT           data.RCdefault;
  198. #define RCUS_SETSPEED          data.RCsetspeed;
  199. #define RCUS_SETPROM           data.RCsetprom;
  200. #define RCUS_SETBROADCAST      data.RCsetbroadcast;
  201. #define RCUS_SETIPANDMASK      data.RCsetipandmask;
  202. #define RCUS_SETMAC            data.RCsetmac;
  203. /* 4) Data short-cut entry */
  204. /* define data short-cuts *//* pointer names are from RC_user_data_tag union (just below RC_user_tag) */
  205. #define RCUD_GETINFO           _RC_user_data.getinfo
  206. #define RCUD_GETSPEED          _RC_user_data.getspeed
  207. #define RCUD_GETPROM           _RC_user_data.getprom
  208. #define RCUD_GETBROADCAST      _RC_user_data.getbroadcast
  209. #define RCUD_GETFWVER          _RC_user_data.getfwver
  210. #define RCUD_GETIPANDMASK      _RC_user_data.getipandmask
  211. #define RCUD_GETMAC            _RC_user_data.getmac
  212. #define RCUD_GETLINKSTATUS     _RC_user_data.getlinkstatus
  213. #define RCUD_GETLINKSTATISTICS _RC_user_data.getlinkstatistics
  214. #define RCUD_DEFAULT           _RC_user_data.rcdefault
  215. #define RCUD_SETSPEED          _RC_user_data.setspeed
  216. #define RCUD_SETPROM           _RC_user_data.setprom
  217. #define RCUD_SETBROADCAST      _RC_user_data.setbroadcast
  218. #define RCUD_SETIPANDMASK      _RC_user_data.setipandmask
  219. #define RCUD_SETMAC            _RC_user_data.setmac
  220. /* 5) Command identifier entry */
  221. /* define command identifiers */
  222. #define RCUC_GETINFO            0x01
  223. #define RCUC_GETSPEED           0x02
  224. #define RCUC_GETFWVER           0x03
  225. #define RCUC_GETIPANDMASK       0x04
  226. #define RCUC_GETMAC             0x05
  227. #define RCUC_GETLINKSTATUS      0x06
  228. #define RCUC_GETLINKSTATISTICS  0x07
  229. #define RCUC_GETPROM            0x14
  230. #define RCUC_GETBROADCAST       0x15
  231. #define RCUC_DEFAULT            0xff
  232. #define RCUC_SETSPEED           0x08
  233. #define RCUC_SETIPANDMASK       0x09
  234. #define RCUC_SETMAC             0x0a
  235. #define RCUC_SETPROM            0x16
  236. #define RCUC_SETBROADCAST       0x17
  237. /* define ioctl commands to use, when talking to RC 45/PCI driver */
  238. #define RCU_PROTOCOL_REV         SIOCDEVPRIVATE
  239. #define RCU_COMMAND              SIOCDEVPRIVATE+1
  240. /*
  241.    Intended use for the above defines is shown below (GETINFO, as this example):
  242.       RCuser_struct RCuser;           // declare RCuser structure
  243.       struct ifreq ifr;               // declare an interface request structure
  244.       RCuser.cmd = RCUC_GETINFO;           // set user command to GETINFO
  245.       ifr->ifr_data = (caddr_t) &RCuser;   // set point to user structure
  246.       sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);   // get a socket
  247.       ioctl(sock, RCU_COMMAND, &ifr);                  // do ioctl on socket
  248.       RCUD_GETINFO = &RCuser.RCUS_GETINFO;   // set data pointer for GETINFO
  249.       // print results
  250.       printf("memory 0x%lx-0x%lx, base address 0x%x, irq 0x%xn",
  251.               RCUD_GETINFO->mem_start, RCUD_GETINFO->mem_end,
  252.               RCUD_GETINFO->base_addr, RCUD_GETINFO->irq);
  253. */
  254. #endif /* RCIF_H */