/* ** ************************************************************************* ** ** ** R C I F . H ** ** ** RedCreek InterFace include file. ** ** --------------------------------------------------------------------- ** --- Copyright (c) 1998-1999, RedCreek Communications Inc. --- ** --- All rights reserved. --- ** --------------------------------------------------------------------- ** ** File Description: ** ** Header file private ioctl commands. ** ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ** ************************************************************************* */ #ifndef RCIF_H #define RCIF_H /* The following protocol revision # should be incremented every time a new protocol or new structures are used in this file. */ int USER_PROTOCOL_REV = 2; /* used to track different protocol revisions */ /* define a single TCB & buffer */ typedef struct { /* a single buffer */ U32 context; /* context */ U32 scount; /* segment count */ U32 size; /* segment size */ U32 addr; /* segment physical address */ } __attribute__ ((packed)) singleB, *psingleB; typedef struct { /* a single TCB */ /* ** +-----------------------+ ** | 1 | one buffer in the TCB ** +-----------------------+ ** | | user's buffer reference ** +-----------------------+ ** | 1 | one segment buffer ** +-----------------------+ _ ** | | size \ ** +-----------------------+ \ segment descriptor ** | | physical address of buffer / ** +-----------------------+ _/ */ U32 bcount; /* buffer count */ singleB b; /* buffer */ } __attribute__ ((packed)) singleTCB, *psingleTCB; /* When adding new entries, please add all 5 related changes, since it helps keep everything consistent: 1) User structure entry 2) User data entry 3) Structure short-cut entry 4) Data short-cut entry 5) Command identifier entry For Example ("GETSPEED"): 1) struct RCgetspeed_tag { U32 LinkSpeedCode; } RCgetspeed; 2) struct RCgetspeed_tag *getspeed; 3) #define RCUS_GETSPEED data.RCgetspeed; 4) #define RCUD_GETSPEED _RC_user_data.getspeed 5) #define RCUC_GETSPEED 0x02 Notes for the "GETSPEED" entry, above: 1) RCgetspeed - RC{name} RCgetspeed_tag - RC{name}_tag LinkSpeedCode - create any structure format desired (not too large, since memory will be unioned with all other entries) 2) RCgetspeed_tag - RC{name}_tag chosen in #1 getspeed - arbitrary name (ptr to structure in #1) 3) RCUS_GETSPEED - RCUS_{NAME} ("NAME" & "name" do not have to the same) data.RCgetspeed - data.RC{name} ("RC{name}" from #1) 4) RCUD_GETSPEED - _RC_user_data.getspeed ("getspeed" from #2) 5) RCUC_GETSPEED - unique hex identifier entry. */ typedef struct RC_user_tag RCuser_struct; /* 1) User structure entry */ struct RC_user_tag { int cmd; union { /* GETINFO structure */ struct RCgetinfo_tag { unsigned long int mem_start; unsigned long int mem_end; unsigned long int base_addr; unsigned char irq; unsigned char dma; unsigned char port; } RCgetinfo; /* <---- RCgetinfo */ /* GETSPEED structure */ struct RCgetspeed_tag { U32 LinkSpeedCode; } RCgetspeed; /* <---- RCgetspeed */ /* SETSPEED structure */ struct RCsetspeed_tag { U16 LinkSpeedCode; } RCsetspeed; /* <---- RCsetspeed */ /* GETPROM structure */ struct RCgetprom_tag { U32 PromMode; } RCgetprom; /* <---- RCgetprom */ /* SETPROM structure */ struct RCsetprom_tag { U16 PromMode; } RCsetprom; /* <---- RCsetprom */ /* GETBROADCAST structure */ struct RCgetbroadcast_tag { U32 BroadcastMode; } RCgetbroadcast; /* <---- RCgetbroadcast */ /* SETBROADCAST structure */ struct RCsetbroadcast_tag { U16 BroadcastMode; } RCsetbroadcast; /* <---- RCsetbroadcast */ /* GETFIRMWAREVER structure */ #define FirmStringLen 80 struct RCgetfwver_tag { U8 FirmString[FirmStringLen]; } RCgetfwver; /* <---- RCgetfwver */ /* GETIPANDMASK structure */ struct RCgetipnmask_tag { U32 IpAddr; U32 NetMask; } RCgetipandmask; /* <---- RCgetipandmask */ /* SETIPANDMASK structure */ struct RCsetipnmask_tag { U32 IpAddr; U32 NetMask; } RCsetipandmask; /* <---- RCsetipandmask */ /* GETMAC structure */ #define MAC_SIZE 10 struct RCgetmac_tag { U8 mac[MAC_SIZE]; } RCgetmac; /* <---- RCgetmac */ /* SETMAC structure */ struct RCsetmac_tag { U8 mac[MAC_SIZE]; } RCsetmac; /* <---- RCsetmac */ /* GETLINKSTATUS structure */ struct RCgetlnkstatus_tag { U32 ReturnStatus; } RCgetlnkstatus; /* <---- RCgetlnkstatus */ /* GETLINKSTATISTICS structure */ struct RCgetlinkstats_tag { RCLINKSTATS StatsReturn; } RCgetlinkstats; /* <---- RCgetlinkstats */ /* DEFAULT structure (when no command was recognized) */ struct RCdefault_tag { int rc; } RCdefault; /* <---- RCdefault */ } data; }; /* struct RC_user_tag { ... } */ /* 2) User data entry */ /* RCUD = RedCreek User Data */ union RC_user_data_tag { /* structure tags used are taken from RC_user_tag structure above */ struct RCgetinfo_tag *getinfo; struct RCgetspeed_tag *getspeed; struct RCgetprom_tag *getprom; struct RCgetbroadcast_tag *getbroadcast; struct RCgetfwver_tag *getfwver; struct RCgetipnmask_tag *getipandmask; struct RCgetmac_tag *getmac; struct RCgetlnkstatus_tag *getlinkstatus; struct RCgetlinkstats_tag *getlinkstatistics; struct RCdefault_tag *rcdefault; struct RCsetspeed_tag *setspeed; struct RCsetprom_tag *setprom; struct RCsetbroadcast_tag *setbroadcast; struct RCsetipnmask_tag *setipandmask; struct RCsetmac_tag *setmac; } _RC_user_data; /* declare as a global, so the defines below will work */ /* 3) Structure short-cut entry */ /* define structure short-cuts *//* structure names are taken from RC_user_tag structure above */ #define RCUS_GETINFO data.RCgetinfo; #define RCUS_GETSPEED data.RCgetspeed; #define RCUS_GETPROM data.RCgetprom; #define RCUS_GETBROADCAST data.RCgetbroadcast; #define RCUS_GETFWVER data.RCgetfwver; #define RCUS_GETIPANDMASK data.RCgetipandmask; #define RCUS_GETMAC data.RCgetmac; #define RCUS_GETLINKSTATUS data.RCgetlnkstatus; #define RCUS_GETLINKSTATISTICS data.RCgetlinkstats; #define RCUS_DEFAULT data.RCdefault; #define RCUS_SETSPEED data.RCsetspeed; #define RCUS_SETPROM data.RCsetprom; #define RCUS_SETBROADCAST data.RCsetbroadcast; #define RCUS_SETIPANDMASK data.RCsetipandmask; #define RCUS_SETMAC data.RCsetmac; /* 4) Data short-cut entry */ /* define data short-cuts *//* pointer names are from RC_user_data_tag union (just below RC_user_tag) */ #define RCUD_GETINFO _RC_user_data.getinfo #define RCUD_GETSPEED _RC_user_data.getspeed #define RCUD_GETPROM _RC_user_data.getprom #define RCUD_GETBROADCAST _RC_user_data.getbroadcast #define RCUD_GETFWVER _RC_user_data.getfwver #define RCUD_GETIPANDMASK _RC_user_data.getipandmask #define RCUD_GETMAC _RC_user_data.getmac #define RCUD_GETLINKSTATUS _RC_user_data.getlinkstatus #define RCUD_GETLINKSTATISTICS _RC_user_data.getlinkstatistics #define RCUD_DEFAULT _RC_user_data.rcdefault #define RCUD_SETSPEED _RC_user_data.setspeed #define RCUD_SETPROM _RC_user_data.setprom #define RCUD_SETBROADCAST _RC_user_data.setbroadcast #define RCUD_SETIPANDMASK _RC_user_data.setipandmask #define RCUD_SETMAC _RC_user_data.setmac /* 5) Command identifier entry */ /* define command identifiers */ #define RCUC_GETINFO 0x01 #define RCUC_GETSPEED 0x02 #define RCUC_GETFWVER 0x03 #define RCUC_GETIPANDMASK 0x04 #define RCUC_GETMAC 0x05 #define RCUC_GETLINKSTATUS 0x06 #define RCUC_GETLINKSTATISTICS 0x07 #define RCUC_GETPROM 0x14 #define RCUC_GETBROADCAST 0x15 #define RCUC_DEFAULT 0xff #define RCUC_SETSPEED 0x08 #define RCUC_SETIPANDMASK 0x09 #define RCUC_SETMAC 0x0a #define RCUC_SETPROM 0x16 #define RCUC_SETBROADCAST 0x17 /* define ioctl commands to use, when talking to RC 45/PCI driver */ #define RCU_PROTOCOL_REV SIOCDEVPRIVATE #define RCU_COMMAND SIOCDEVPRIVATE+1 /* Intended use for the above defines is shown below (GETINFO, as this example): RCuser_struct RCuser; // declare RCuser structure struct ifreq ifr; // declare an interface request structure RCuser.cmd = RCUC_GETINFO; // set user command to GETINFO ifr->ifr_data = (caddr_t) &RCuser; // set point to user structure sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); // get a socket ioctl(sock, RCU_COMMAND, &ifr); // do ioctl on socket RCUD_GETINFO = &RCuser.RCUS_GETINFO; // set data pointer for GETINFO // print results printf("memory 0x%lx-0x%lx, base address 0x%x, irq 0x%x\n", RCUD_GETINFO->mem_start, RCUD_GETINFO->mem_end, RCUD_GETINFO->base_addr, RCUD_GETINFO->irq); */ #endif /* RCIF_H */