496 lines
17 KiB
Objective-C
496 lines
17 KiB
Objective-C
/*
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
|
|
(C) Copyright 1999
|
|
All rights reserved.
|
|
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
|
|
Portions of this software are:
|
|
|
|
(C) Copyright 1995 TriplePoint, Inc. -- http://www.TriplePoint.com
|
|
License to use this software is granted under the same terms
|
|
outlined in the Microsoft Windows Device Driver Development Kit.
|
|
|
|
(C) Copyright 1992 Microsoft Corp. -- http://www.Microsoft.com
|
|
License to use this software is granted under the terms outlined in
|
|
the Microsoft Windows Device Driver Development Kit.
|
|
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
|
|
@doc INTERNAL Card Card_h
|
|
|
|
@module Card.h |
|
|
|
|
This module defines the hardware specific structures and values used to
|
|
control the network interface card.
|
|
|
|
@head3 Contents |
|
|
@index class,mfunc,func,msg,mdata,struct,enum | Card_h
|
|
|
|
@end
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
*/
|
|
|
|
/* @doc EXTERNAL INTERNAL
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
|
|
@topic 4.2 Card Overview |
|
|
|
|
This section describes the interfaces defined in <f Card\.h>.
|
|
|
|
This module isolates most the vendor specific hardware access interfaces.
|
|
It will require signficant changes to accomodate your hardware device.
|
|
You should try to isolate your changes to the <t CARD_OBJECT> rather then
|
|
the <t MINIPORT_ADAPTER_OBJECT>. This will make it eaiser to reuse the
|
|
upper portions of the driver should your hardware change in the future.
|
|
|
|
The driver assumes one <t CARD_OBJECT> per physical ISDN card. The card
|
|
object is always available via the <t MINIPORT_ADAPTER_OBJECT> which is
|
|
available in nearly every interface the driver supports. Each
|
|
<t CARD_OBJECT> contains one or more <t PORT_OBJECT>s depending on how
|
|
many physical ISDN lines your card supports.
|
|
|
|
You should add all your physical card related data to the <t CARD_OBJECT>.
|
|
You can also add any card related registry parameters to this structure,
|
|
and the <f g_CardParameters> table.
|
|
*/
|
|
|
|
#ifndef _CARD_H
|
|
#define _CARD_H
|
|
|
|
#define CARD_OBJECT_TYPE ((ULONG)'C')+\
|
|
((ULONG)'A'<<8)+\
|
|
((ULONG)'R'<<16)+\
|
|
((ULONG)'D'<<24)
|
|
|
|
/*
|
|
// TODO - These values will normally come from the NIC or the installer.
|
|
*/
|
|
#define MAX_ADAPTERS 8
|
|
#define CARD_NUM_PORTS 1
|
|
|
|
//#define CARD_MIN_IOPORT_SIZE 256
|
|
// TODO - How many I/O ports does the card have? (undefined if none)
|
|
|
|
//#define CARD_MIN_MEMORY_SIZE 256
|
|
// TODO - How much memory does the card have? (undefined if none)
|
|
|
|
#define CARD_IS_BUS_MASTER FALSE
|
|
// TODO - Is the card a bus master device? (TRUE or FALSE)
|
|
#if (CARD_IS_BUS_MASTER)
|
|
# define CARD_MAP_REGISTERS_NEEDED NUM_DEV_PER_ADAP
|
|
// TODO - How many map registers needed to transmit data to card.
|
|
#endif
|
|
|
|
//#define CARD_REQUEST_ISR TRUE
|
|
// TODO - How do you want to handle interrupts from the card?
|
|
// TRUE if you want to always use MiniportISR().
|
|
// FALSE if you want to use MiniportDisable() and MiniportEnable().
|
|
// Undefined if your card does not generate interrupts.
|
|
|
|
#if defined(CARD_REQUEST_ISR)
|
|
|
|
#define CARD_INTERRUPT_SHARED TRUE
|
|
// TODO - Is your interrupt shared? (TRUE or FALSE).
|
|
|
|
#define CARD_INTERRUPT_MODE NdisInterruptLevelSensitive
|
|
// TODO - Is your interrupt latched or level sensitve?
|
|
|
|
#endif // defined(CARD_REQUEST_ISR)
|
|
|
|
/*
|
|
// Maximum packet size allowed by the adapter -- must be restricted to
|
|
// 1500 bytes at this point, and must also allow for frames at least 32
|
|
// bytes longer.
|
|
*/
|
|
#define NDISWAN_EXTRA_SIZE 32
|
|
#define CARD_MIN_PACKET_SIZE ( 480 + NDISWAN_EXTRA_SIZE)
|
|
#define CARD_MAX_PACKET_SIZE (2016 + NDISWAN_EXTRA_SIZE)
|
|
#define CARD_DEFAULT_PACKET_SIZE (1504 + NDISWAN_EXTRA_SIZE)
|
|
|
|
/*
|
|
// The WAN miniport must indicate the entire packet when it is received.
|
|
*/
|
|
#define CARD_MAX_LOOKAHEAD (pAdapter->pCard->BufferSize)
|
|
|
|
/*
|
|
// Number of digits allowed in a phone number (not including spaces).
|
|
*/
|
|
#define CARD_MAX_DIAL_DIGITS 32
|
|
|
|
#define NULL_BUFFER_POOL ((NDIS_HANDLE) -1)
|
|
|
|
/* @doc INTERNAL Card Card_h CARD_RESOURCES
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
|
|
@struct CARD_RESOURCES |
|
|
|
|
This structure contains the data associated with the hardware resources
|
|
required to configure the NIC. These values are isolated from the rest
|
|
of the <t CARD_OBJECT> because they depend on the underlying hardware.
|
|
|
|
@comm
|
|
|
|
The contents of this structure depends on compile time flags and should
|
|
only include information about the resource actually used by the NIC.
|
|
|
|
This structure is filled in by <f CardFindNIC> and is used to configure
|
|
and allocate resources from NDIS when <f CardInitialize> is called.
|
|
|
|
*/
|
|
|
|
typedef struct CARD_RESOURCES
|
|
{
|
|
NDIS_INTERFACE_TYPE BusInterfaceType; // @field
|
|
// This value is used to tell NDIS what type of adapter this is.
|
|
// This is usually the same as the registry parameter BusType, but
|
|
// may be different in the case of a bridged adapter.
|
|
|
|
BOOLEAN Master; // @field
|
|
// This is TRUE if the adapter is capable of bus master transfers.
|
|
// Use the <t CARD_IS_BUS_MASTER> defininition to set this value
|
|
// so the other bus master values will be included if needed.
|
|
// See <f NdisMAllocateMapRegisters> for more details on the bus
|
|
// master parameters.
|
|
|
|
#if (CARD_IS_BUS_MASTER)
|
|
BOOLEAN Dma32BitAddresses; // @field
|
|
// This is TRUE if the bus master device uses 32-bit addresses.
|
|
// Almost always TRUE for today's devices.
|
|
|
|
ULONG PhysicalMapRegistersNeeded; // @field
|
|
// This should be set to the maximum number of outstanding DMA
|
|
// transfers that can be active at one time. One for each physical
|
|
// buffer segment.
|
|
|
|
ULONG MaximumPhysicalMapping; // @field
|
|
// This should be set to the maximum number of contigous bytes that
|
|
// can make up a single DMA transfer.
|
|
|
|
ULONG DmaChannel; // @field
|
|
// This should only be set if your adapter is an ISA bus master and
|
|
// requires the use of one of the host DMA channels.
|
|
|
|
#endif // (CARD_IS_BUS_MASTER)
|
|
|
|
#if defined(CARD_MIN_MEMORY_SIZE)
|
|
ULONG MemoryLength; // @field
|
|
// The number of bytes of memory the NIC has on board.
|
|
// Use the <t CARD_MIN_MEMORY_SIZE> defininition to set the minimum value
|
|
// so the other NIC based memory values will be included if needed.
|
|
|
|
NDIS_PHYSICAL_ADDRESS MemoryPhysicalAddress; // @field
|
|
// System physical address assigned to the NIC's on board memory.
|
|
|
|
#endif // CARD_MIN_MEMORY_SIZE
|
|
|
|
#if defined(CARD_MIN_IOPORT_SIZE)
|
|
ULONG IoPortLength; // @field
|
|
// The number of bytes of I/O ports the NIC has on board.
|
|
// Use the <t CARD_MIN_IOPORT_SIZE> defininition to set the minimum value
|
|
// so the other NIC based memory values will be included if needed.
|
|
|
|
NDIS_PHYSICAL_ADDRESS IoPortPhysicalAddress; // @field
|
|
// System physical address assigned to the NIC's on board I/O ports.
|
|
|
|
#endif // CARD_MIN_IOPORT_SIZE
|
|
|
|
#if defined(CARD_REQUEST_ISR)
|
|
ULONG InterruptVector; // @field
|
|
// System interrupt vector assigned to the NIC's interrupt request line.
|
|
|
|
ULONG InterruptLevel; // @field
|
|
// System interrupt level assigned to the NIC's interrupt request line.
|
|
|
|
ULONG InterruptMode; // @field
|
|
// Set this value to NdisInterruptLevelSensitive or NdisInterruptLatched.
|
|
// Use the <t CARD_INTERRUPT_MODE> defininition to set this value.
|
|
|
|
BOOLEAN InterruptShared; // @field
|
|
// Set TRUE if you want to allow the NIC's <f InterruptVector> to be
|
|
// shared with other drivers in the system.
|
|
// Use the <t CARD_INTERRUPT_SHARED> defininition to set this value.
|
|
|
|
#endif // defined(CARD_REQUEST_ISR)
|
|
|
|
} CARD_RESOURCES;
|
|
|
|
|
|
#if !defined(CARD_REQUEST_ISR)
|
|
|
|
|
|
/* @doc INTERNAL Card Card_h CARD_EVENT_CODE
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
|
|
@enum CARD_EVENT_CODE |
|
|
|
|
This enumeration defines the events generated by the card.
|
|
|
|
*/
|
|
|
|
typedef enum CARD_EVENT_CODE
|
|
{
|
|
CARD_EVENT_NULL, // @emem
|
|
// Not used for anything.
|
|
|
|
CARD_EVENT_RING, // @emem
|
|
// Indicates that a call is incoming on the given BChannel.
|
|
|
|
CARD_EVENT_CONNECT, // @emem
|
|
// Indicates that a call is connected on the given BChannel.
|
|
|
|
CARD_EVENT_DISCONNECT, // @emem
|
|
// Indicates that a call is disconnected on the given BChannel.
|
|
|
|
CARD_EVENT_RECEIVE, // @emem
|
|
// Indicates that a packet is incoming on the given BChannel.
|
|
|
|
CARD_EVENT_TRANSMIT_COMPLETE // @emem
|
|
// Indicates that the transmit is complete on the given BChannel.
|
|
|
|
} CARD_EVENT_CODE;
|
|
|
|
/* @doc INTERNAL Card Card_h CARD_EVENT_OBJECT
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
|
|
@struct CARD_EVENT_OBJECT |
|
|
|
|
This structure is used to keep track of events passed between the
|
|
callee and caller. Each <t CARD_OBJECT> keeps a list of these events.
|
|
*/
|
|
|
|
typedef struct CARD_EVENT_OBJECT
|
|
{
|
|
LIST_ENTRY Queue; // @field
|
|
// Used to place the buffer on one of the receive lists.
|
|
|
|
CARD_EVENT_CODE ulEventCode; // @field
|
|
// Reason for event notification.
|
|
|
|
PVOID pSendingObject; // @field
|
|
// Interface object that is notifying. See <t BCHANNEL_OBJECT> or
|
|
// <t DCHANNEL_OBJECT>,
|
|
|
|
PVOID pReceivingObject; // @field
|
|
// Interface object that is notifying. See <t BCHANNEL_OBJECT> or
|
|
// <t DCHANNEL_OBJECT>,
|
|
|
|
PNDIS_PACKET pNdisPacket; // @field
|
|
// A pointer to the associated NDIS packet structure <t NDIS_PACKET>.
|
|
|
|
} CARD_EVENT_OBJECT, *PCARD_EVENT_OBJECT;
|
|
|
|
#endif // !defined(CARD_REQUEST_ISR)
|
|
|
|
|
|
/* @doc INTERNAL Card Card_h CARD_OBJECT
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
|
|
@struct CARD_OBJECT |
|
|
|
|
This structure contains the data associated with the Network Interface
|
|
Card (NIC). This object is responsible for managing all the hardware
|
|
specific components of the NIC.
|
|
|
|
@comm
|
|
|
|
The <t MINIPORT_ADAPTER_OBJECT> manages the interface between NDIS and
|
|
the driver, and then passes off the hardware specific interface to this
|
|
object. There is one <t CARD_OBJECT> for each <t MINIPORT_ADAPTER_OBJECT>.
|
|
|
|
One of these objects is created each time that our <f MiniportInitialize>
|
|
routine is called. The NDIS wrapper calls this routine once for each of
|
|
NIC installed and enabled in the system. In the case of a hot swappable
|
|
NIC (e.g. PCMCIA) the adapter might come and go several times during a
|
|
single Windows session.
|
|
|
|
*/
|
|
|
|
typedef struct CARD_OBJECT
|
|
{
|
|
ULONG ObjectType; // @field
|
|
// Four characters used to identify this type of object 'CARD'.
|
|
|
|
ULONG ObjectID; // @field
|
|
// Instance number used to identify a specific object instance.
|
|
|
|
PMINIPORT_ADAPTER_OBJECT pAdapter; // @field
|
|
// A pointer to the <t MINIPORT_ADAPTER_OBJECT> instance.
|
|
|
|
CARD_RESOURCES ResourceInformation; // @field
|
|
// Contains adapter specific resource requirements and settings.
|
|
// See <t CARD_RESOURCES>.
|
|
|
|
ULONG InterruptStatus; // @field
|
|
// Bits indicating which interrupts need to be processed.
|
|
|
|
NDIS_MINIPORT_INTERRUPT Interrupt; // @field
|
|
// Miniport interrupt object used by NDIS.
|
|
|
|
USHORT ReceiveBuffersPerLink; // @field
|
|
// Maximum number of receive buffers per channel, registry parameter.
|
|
|
|
USHORT TransmitBuffersPerLink; // @field
|
|
// Maximum number of transmit buffers per channel, registry parameter.
|
|
|
|
USHORT BufferSize; // @field
|
|
// The maxmimum packet size. The NDISWAN spec says this must be 1500+32,
|
|
// but everything seems to work okay if it is set smaller.
|
|
|
|
ULONG NumChannels; // @field
|
|
// Number of communication channels configured on the NIC.
|
|
|
|
ULONG NumPorts; // @field
|
|
// Number of <t PORT_OBJECT>'s allocated in <p pPortArray>.
|
|
|
|
PPORT_OBJECT * pPortArray; // @field
|
|
// An array of <t PORT_OBJECT>'s created by <f PortCreate>.
|
|
// One entry for each port on NIC.
|
|
|
|
#if defined(PCI_BUS)
|
|
ULONG PciSlotNumber; // @field
|
|
// PCI slot number for this adapter (FunctionNumber * 32) + DeviceNumber.
|
|
|
|
#endif // PCI_BUS
|
|
|
|
#if defined(CARD_MIN_MEMORY_SIZE)
|
|
PCHAR pMemoryVirtualAddress; // @field
|
|
// Virtual adress of NIC memory area.
|
|
|
|
#endif // CARD_MIN_MEMORY_SIZE
|
|
|
|
#if defined(CARD_MIN_IOPORT_SIZE)
|
|
PCHAR pIoPortVirtualAddress; // @field
|
|
// Virtual adress of NIC I/O port area.
|
|
|
|
#endif // CARD_MIN_IOPORT_SIZE
|
|
|
|
#if (CARD_IS_BUS_MASTER)
|
|
ULONG MapRegisterIndex; // @field
|
|
// Next map register index to be used for DMA transfer.
|
|
|
|
long MapRegistersInUse; // @field
|
|
// Number of map registers currently in use.
|
|
|
|
#endif // (CARD_IS_BUS_MASTER)
|
|
|
|
NDIS_HANDLE PacketPoolHandle; // @field
|
|
// Internal message packet pool.
|
|
|
|
NDIS_HANDLE BufferPoolHandle; // @field
|
|
// Internal message buffer pool.
|
|
|
|
PUCHAR MessagesVirtualAddress; // @field
|
|
// Pointer to the message buffer area used for incoming packets.
|
|
|
|
LIST_ENTRY MessageBufferList; // @field
|
|
// List of available message buffers.
|
|
|
|
NDIS_SPIN_LOCK MessageBufferLock; // @field
|
|
// Spin lock used to protect <p MessageBufferList>.
|
|
|
|
ULONG NumMessageBuffers; // @field
|
|
// Number of message buffers to allocate for <p MessageBufferList>.
|
|
|
|
ULONG TODO; // @field
|
|
// Add your data members here.
|
|
|
|
ULONG NumDChannels; // @field
|
|
// The sample driver uses this registry value to determine the number
|
|
// of ports to simulate.
|
|
|
|
#if defined(SAMPLE_DRIVER)
|
|
|
|
LIST_ENTRY EventList; // @field
|
|
// Events waiting to be processed. See <t CARD_EVENT_OBJECT>.
|
|
|
|
# define MAX_EVENTS 32
|
|
CARD_EVENT_OBJECT EventArray[MAX_EVENTS]; // @field
|
|
// Card event allocation array.
|
|
|
|
ULONG NextEvent; // @field
|
|
// Index into EventArray.
|
|
|
|
#endif // SAMPLE_DRIVER
|
|
|
|
} CARD_OBJECT;
|
|
|
|
#define GET_ADAPTER_FROM_CARD(pCard) (pCard->pAdapter)
|
|
|
|
#define GET_QUEUE_FROM_PACKET(pNdisPacket)\
|
|
((PLIST_ENTRY) pNdisPacket->MiniportReservedEx)
|
|
#define GET_PACKET_FROM_QUEUE(pList)\
|
|
CONTAINING_RECORD(pList, NDIS_PACKET, MiniportReservedEx)
|
|
|
|
/*
|
|
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
|
|
Object Interface Prototypes
|
|
*/
|
|
|
|
NDIS_STATUS CardCreate(
|
|
OUT PCARD_OBJECT * ppCard,
|
|
IN PMINIPORT_ADAPTER_OBJECT pAdapter
|
|
);
|
|
|
|
void CardDestroy(
|
|
IN PCARD_OBJECT pCard
|
|
);
|
|
|
|
NDIS_STATUS CardInitialize(
|
|
IN PCARD_OBJECT pCard
|
|
);
|
|
|
|
ULONG CardNumChannels(
|
|
IN PCARD_OBJECT pCard
|
|
);
|
|
|
|
ULONG CardNumPorts(
|
|
IN PCARD_OBJECT pCard
|
|
);
|
|
|
|
void CardInterruptHandler(
|
|
IN PCARD_OBJECT pCard
|
|
);
|
|
|
|
BOOLEAN CardTransmitPacket(
|
|
IN PCARD_OBJECT pCard,
|
|
IN PBCHANNEL_OBJECT pBChannel,
|
|
IN PNDIS_PACKET pNdisPacket
|
|
);
|
|
|
|
USHORT CardCleanPhoneNumber(
|
|
OUT PUCHAR Dst,
|
|
IN PUSHORT Src,
|
|
IN USHORT Length
|
|
);
|
|
|
|
NDIS_STATUS CardReset(
|
|
IN PCARD_OBJECT pCard
|
|
);
|
|
|
|
#if defined(SAMPLE_DRIVER)
|
|
|
|
PBCHANNEL_OBJECT GET_BCHANNEL_FROM_PHONE_NUMBER(
|
|
IN PUCHAR pDialString
|
|
);
|
|
|
|
VOID CardNotifyEvent(
|
|
IN PCARD_OBJECT pCard,
|
|
IN PCARD_EVENT_OBJECT pEvent
|
|
);
|
|
|
|
PCARD_EVENT_OBJECT CardEventAllocate(
|
|
IN PCARD_OBJECT pCard
|
|
);
|
|
|
|
VOID CardEventRelease(
|
|
IN PCARD_OBJECT pCard,
|
|
IN PCARD_EVENT_OBJECT pEvent
|
|
);
|
|
|
|
#endif // SAMPLE_DRIVER
|
|
|
|
#endif // _CARD_H
|
|
|