freebsd-dev/sys/dev/arl/if_arlreg.h
Brooks Davis fc74a9f93a Stop embedding struct ifnet at the top of driver softcs. Instead the
struct ifnet or the layer 2 common structure it was embedded in have
been replaced with a struct ifnet pointer to be filled by a call to the
new function, if_alloc(). The layer 2 common structure is also allocated
via if_alloc() based on the interface type. It is hung off the new
struct ifnet member, if_l2com.

This change removes the size of these structures from the kernel ABI and
will allow us to better manage them as interfaces come and go.

Other changes of note:
 - Struct arpcom is no longer referenced in normal interface code.
   Instead the Ethernet address is accessed via the IFP2ENADDR() macro.
   To enforce this ac_enaddr has been renamed to _ac_enaddr.
 - The second argument to ether_ifattach is now always the mac address
   from driver private storage rather than sometimes being ac_enaddr.

Reviewed by:	sobomax, sam
2005-06-10 16:49:24 +00:00

339 lines
8.5 KiB
C

/*-
* Copyright (c) 1999-2001, Ivan Sharov, Vitaly Belekhov.
* Copyright (c) 2004 Stanislav Svirid.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $RISS: if_arl/dev/arl/if_arlreg.h,v 1.4 2004/03/16 04:43:27 count Exp $
* $FreeBSD$
*/
#ifndef _IF_ARLREG_H
#define _IF_ARLREG_H
#define ARL_BASE_START 0xC0000
#define ARL_BASE_END 0xDE000
#define ARL_BASE_STEP 0x2000
#define ARLAN_NAME_SIZE 16
#define ARLAN_NAME "ArLan655-SCT"
/*
* Statistics
*/
struct arl_stats {
u_int32_t numDatagramsTransmitted;
u_int32_t numReTransmissions;
u_int32_t numFramesDiscarded;
u_int32_t numDatagramsReceived;
u_int32_t numDuplicateReceivedFrames;
u_int32_t numDatagramsDiscarded;
u_int16_t maxNumReTransmitDatagram;
u_int16_t maxNumReTransmitFrames;
u_int16_t maxNumConsecutiveDuplicateFrames;
u_int32_t numBytesTransmitted;
u_int32_t numBytesReceived;
u_int32_t numCRCErrors;
u_int32_t numLengthErrors;
u_int32_t numAbortErrors;
u_int32_t numTXUnderruns;
u_int32_t numRXOverruns;
u_int32_t numHoldOffs;
u_int32_t numFramesTransmitted;
u_int32_t numFramesReceived;
u_int32_t numReceiveFramesLost;
u_int32_t numRXBufferOverflows;
u_int32_t numFramesDiscardedAddrMismatch;
u_int32_t numFramesDiscardedSIDMismatch;
u_int32_t numPollsTransmistted;
u_int32_t numPollAcknowledges;
u_int32_t numStatusVectorTimeouts;
u_int32_t numNACKReceived;
} __attribute__((packed));
/*
* Arlan private structure in memomory
*/
struct arl_private {
/* Header Signature */
char textRegion[48];
u_int8_t resetFlag;
u_int8_t diagnosticInfo;
u_int16_t diagnosticOffset;
u_int8_t _1[12];
u_int8_t lanCardNodeId[6];
u_int8_t broadcastAddress[6];
u_int8_t hardwareType;
u_int8_t majorHardwareVersion;
u_int8_t minorHardwareVersion;
u_int8_t radioModule;
u_int8_t defaultChannelSet;
u_int8_t _2[47];
/* Control/Status Block - 0x0080 */
u_int8_t interruptInProgress;
u_int8_t cntrlRegImage;
u_int8_t _3[14];
u_int8_t commandByte;
u_int8_t commandParameter[15];
/* Receive Status - 0x00a0 */
u_int8_t rxStatusVector;
u_int8_t rxFrmType;
u_int16_t rxOffset;
u_int16_t rxLength;
u_int8_t rxSrc[6];
u_int8_t rxBroadcastFlag;
u_int8_t rxQuality;
u_int8_t scrambled;
u_int8_t _4[1];
/* Transmit Status - 0x00b0 */
u_int8_t txStatusVector;
u_int8_t txAckQuality;
u_int8_t numRetries;
u_int8_t _5[14];
u_int8_t registeredRouter[6];
u_int8_t backboneRouter[6];
u_int8_t registrationStatus;
u_int8_t configuredStatusFlag;
u_int8_t _6[1];
u_int8_t ultimateDestAddress[6];
u_int8_t immedDestAddress[6];
u_int8_t immedSrcAddress[6];
u_int16_t rxSequenceNumber;
u_int8_t assignedLocaltalkAddress;
u_int8_t _7[27];
/* System Parameter Block */
/* - Driver Parameters (Novell Specific) */
u_int16_t txTimeout;
u_int16_t transportTime;
u_int8_t _8[4];
/* - Configuration Parameters */
u_int8_t irqLevel;
u_int8_t spreadingCode;
u_int8_t channelSet;
u_int8_t channelNumber;
u_int16_t radioNodeId;
u_int8_t _9[2];
u_int8_t scramblingDisable;
u_int8_t radioType;
u_int16_t routerId;
u_int8_t _10[9];
u_int8_t txAttenuation;
u_int8_t systemId[4]; /* on an odd address for a long !!! */
u_int16_t globalChecksum;
u_int8_t _11[4];
u_int16_t maxDatagramSize;
u_int16_t maxFrameSize;
u_int8_t maxRetries;
u_int8_t receiveMode;
u_int8_t priority;
u_int8_t rootOrRepeater;
u_int8_t specifiedRouter[6];
u_int16_t fastPollPeriod;
u_int8_t pollDecay;
u_int8_t fastPollDelay[2];
u_int8_t arlThreshold;
u_int8_t arlDecay;
u_int8_t _12[1];
u_int16_t specRouterTimeout;
u_int8_t _13[5];
/* Scrambled Area */
u_int8_t SID[4];
u_int8_t encryptionKey[12];
u_int8_t _14[2];
u_int8_t waitTime[2];
u_int8_t lParameter[2];
u_int8_t _15[3];
u_int16_t headerSize;
u_int16_t sectionChecksum;
u_int8_t registrationMode;
u_int8_t registrationFill;
u_int16_t pollPeriod;
u_int16_t refreshPeriod;
u_int8_t name[ARLAN_NAME_SIZE];
u_int8_t NID[6];
u_int8_t localTalkAddress;
u_int8_t codeFormat;
u_int8_t SSCode[64];
u_int8_t _16[0x140];
/* Statistics Block - 0x0300 */
u_int8_t hostcpuLock;
u_int8_t lancpuLock;
u_int8_t resetTime[18];
struct arl_stats stat;
u_int8_t _17[0x86];
u_int8_t txBuffer[0x800];
u_int8_t rxBuffer[0x800];
u_int8_t _18[0x0bfd];
u_int8_t resetFlag1;
u_int8_t _19;
u_int8_t controlRegister;
};
/*
* Transmit parametrs
*/
struct arl_tx_param {
u_int16_t offset;
u_int16_t length;
u_int8_t dest[6];
u_int8_t clear;
u_int8_t retries;
u_int8_t routing;
u_int8_t scrambled;
};
#define ARL_HARDWARE_RESET 0x01
#define ARL_CHANNEL_ATTENTION 0x02
#define ARL_INTERRUPT_ENABLE 0x04
#define ARL_CLEAR_INTERRUPT 0x08
/* additions for sys/sockio.h ( socket ioctl parameters for arlan card ) */
#define SIOCGARLQLT _IOWR('i', 70, struct ifreq) /* get QUALITY */
#define SIOCGARLALL _IOWR('i', 71, struct ifreq) /* get ALL */
#define SIOCSARLALL _IOWR('i', 72, struct ifreq) /* set paramter (who_set) */
#define SIOCGARLSTB _IOWR('i', 73, struct ifreq) /* get statistic block */
/*
* Arlan request struct via ioctl
*/
struct arl_cfg_param {
u_char name[ARLAN_NAME_SIZE];
u_int8_t sid[4];
u_int8_t channelSet;
u_int8_t channelNumber;
u_int8_t spreadingCode;
u_int8_t registrationMode;
u_int8_t lanCardNodeId[6];
u_int8_t specifiedRouter[6];
u_int8_t hardwareType;
u_int8_t majorHardwareVersion;
u_int8_t minorHardwareVersion;
u_int8_t radioModule;
u_int8_t priority;
u_int8_t receiveMode;
u_int8_t txRetry;
};
struct arl_req {
u_int32_t what_set;
struct arl_cfg_param cfg;
};
#ifdef ARLCACHE
#define MAXARLCACHE 16
#define ARLCACHE_RX 0
#define ARLCACHE_TX 1
struct arl_sigcache {
u_int8_t macsrc[6]; /* unique MAC address for entry */
u_int8_t level[2];
u_int8_t quality[2];
};
#endif
#define ARLAN_SET_name 0x0001
#define ARLAN_SET_sid 0x0002
#define ARLAN_SET_channelSet 0x0004
#define ARLAN_SET_channelNumber 0x0008
#define ARLAN_SET_spreadingCode 0x0010
#define ARLAN_SET_registrationMode 0x0020
#define ARLAN_SET_lanCardNodeId 0x0040
#define ARLAN_SET_specifiedRouter 0x0080
#define ARLAN_SET_priority 0x0100
#define ARLAN_SET_receiveMode 0x0200
#define ARLAN_SET_txRetry 0x0400
#ifdef _KERNEL
struct arl_softc {
struct ifnet *arl_ifp;
int arl_unit;
struct arl_private * arl_mem; /* arlan data */
struct arl_cfg_param arl_cfg; /* arlan vars in our mem */
u_char arl_control;
int mem_rid; /* resource id for mem */
struct resource* mem_res; /* resource for mem */
int irq_rid; /* resource id for irq */
struct resource* irq_res; /* resource for irq */
void* irq_handle; /* handle for irq handler */
u_char arl_tx[2048];
int tx_len;
u_char arl_rx[2048];
int rx_len;
#ifdef ARLCACHE
struct arl_sigcache arl_sigcache[MAXARLCACHE];
#endif
struct ifmedia arl_ifmedia;
};
#endif
#define ARLAN_SIGN "TELESYSTEM"
#define ARLAN_HEADER_SIZE 0x0C
#define ar sc->arl_mem
#define arcfg sc->arl_cfg
#define ARDELAY 10000
#define ARDELAY1 50000
#define WAIT_RESET(cnt, delay) \
do { \
int i; \
for (i = cnt; i && ar->resetFlag; i--) { \
DELAY(delay); \
} \
} while (0);
#ifdef _KERNEL
void arl_release_resources (device_t);
int arl_alloc_memory (device_t, int, int);
int arl_alloc_irq (device_t, int, int);
int arl_attach (device_t);
int arl_wait_reset (struct arl_softc *, int, int);
void arl_stop (struct arl_softc *);
driver_intr_t arl_intr;
#endif
#endif /* _IF_ARLREG_H */