diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/ndis/madge/driver/sys_mem.c | 925 |
1 files changed, 925 insertions, 0 deletions
diff --git a/private/ntos/ndis/madge/driver/sys_mem.c b/private/ntos/ndis/madge/driver/sys_mem.c new file mode 100644 index 000000000..f72beb7bc --- /dev/null +++ b/private/ntos/ndis/madge/driver/sys_mem.c @@ -0,0 +1,925 @@ +/**************************************************************************** +* +* SYS_MEM.C +* +* FastMAC Plus based NDIS3 miniport driver. This module contains helper +* routines used by the FTK to perform I/O access to adapters. +* +* Copyright (c) Madge Networks Ltd 1991-1994 +* +* COMPANY CONFIDENTIAL +* +* Created: MF +* Major modifications: PBA 21/06/1994 +* +****************************************************************************/ + +#include <ndis.h> + +#include "ftk_defs.h" +#include "ftk_extr.h" + +#include "ndismod.h" + +/*-------------------------------------------------------------------------- +| +| Note: These I/O routines are more involved that I would have liked for +| two reasons. We cannot use uncooked raw I/O routines because our +| EISA adapters use two ranges of I/O locations which could have some +| other device in between them. Also we cannot turn these functions into +| macros because the FTK expects sys_ins{b|w} to return a value but the +| Ndis take a pointer to a memory cell for the value read. +| +--------------------------------------------------------------------------*/ + +/*************************************************************************** +* +* Function - sys_insw +* +* Parameters - adapter_handle -> FTK adapter handle. +* input_location -> I/O location to be read. +* +* Purpose - Read a word from an I/O location. +* +* Returns - The word read. +* +***************************************************************************/ + +WORD +sys_insw( + ADAPTER_HANDLE adapter_handle, + WORD input_location + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + WORD word_data; + +#ifdef _M_IX86 + + NdisRawReadPortUshort((ULONG) input_location, &word_data); + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) input_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) input_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) input_location - ndisAdap->IoLocation2); + + NdisRawReadPortUshort(port, &word_data); + +#endif + + return word_data; +} + + +/*************************************************************************** +* +* Function - sys_insb +* +* Parameters - adapter_handle -> FTK adapter handle. +* input_location -> I/O location to be read. +* +* Purpose - Read a byte from an I/O location. +* +* Returns - The byte read. +* +***************************************************************************/ + +BYTE +sys_insb( + ADAPTER_HANDLE adapter_handle, + WORD input_location + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + BYTE byte_data; + +#ifdef _M_IX86 + + NdisRawReadPortUchar((ULONG) input_location, &byte_data); + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) input_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) input_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) input_location - ndisAdap->IoLocation2); + + NdisRawReadPortUchar(port, &byte_data); + +#endif + + return byte_data; +} + + +/*************************************************************************** +* +* Function - sys_outsw +* +* Parameters - adapter_handle -> FTK adapter handle. +* output_location -> I/O location to be written. +* output_word -> The word to be written. +* +* Purpose - Write a word to an I/O location. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_outsw( + ADAPTER_HANDLE adapter_handle, + WORD output_location, + WORD output_word + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + +#ifdef _M_IX86 + + NdisRawWritePortUshort((ULONG) output_location, output_word); + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) output_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) output_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) output_location - ndisAdap->IoLocation2); + + NdisRawWritePortUshort(port, output_word); + +#endif +} + + +/*************************************************************************** +* +* Function - sys_outsb +* +* Parameters - adapter_handle -> FTK adapter handle. +* output_location -> I/O location to be written. +* output_byte -> The byte to be written. +* +* Purpose - Write a byte to an I/O location. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_outsb( + ADAPTER_HANDLE adapter_handle, + WORD output_location, + BYTE output_byte + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + +#ifdef _M_IX86 + + NdisRawWritePortUchar((ULONG) output_location, output_byte); + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) output_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) output_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) output_location - ndisAdap->IoLocation2); + + NdisRawWritePortUchar(port, output_byte); + +#endif +} + + +/*************************************************************************** +* +* Function - sys_rep_insw +* +* Parameters - adapter_handle -> FTK adapter handle. +* output_location -> I/O location to be read. +* destination_address -> Destination for the data read. +* length_in_words -> Number of words to read. +* +* Purpose - Read a number of words from an I/O location. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_rep_insw( + ADAPTER_HANDLE adapter_handle, + WORD input_location, + BYTE * destination_address, + WORD length_in_words + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + +#ifdef _M_IX86 + + NdisRawReadPortBufferUshort( + (ULONG) input_location, + (USHORT *) destination_address, + (ULONG) length_in_words + ); + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) input_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) input_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) input_location - ndisAdap->IoLocation2); + + NdisRawReadPortBufferUshort( + port, + (USHORT *) destination_address, + (ULONG) length_in_words + ); + +#endif +} + + +/*************************************************************************** +* +* Function - sys_rep_outsw +* +* Parameters - adapter_handle -> FTK adapter handle. +* output_location -> I/O location to be written. +* source_address -> Address of the data to be written. +* length_in_words -> Number of words to read. +* +* Purpose - Write a number of words to an I/O location. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_rep_outsw( + ADAPTER_HANDLE adapter_handle, + WORD input_location, + BYTE * source_address, + WORD length_in_words + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + +#ifdef _M_IX86 + + NdisRawWritePortBufferUshort( + (ULONG) input_location, + (USHORT *) source_address, + (ULONG) length_in_words + ); + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) input_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) input_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) input_location - ndisAdap->IoLocation2); + + NdisRawWritePortBufferUshort( + port, + (USHORT *) source_address, + (ULONG) length_in_words + ); + +#endif +} + + +/*************************************************************************** +* +* Function - sys_rep_swap_insw +* +* Parameters - adapter_handle -> FTK adapter handle. +* output_location -> I/O location to be read. +* destination_address -> Destination for the data read. +* length_in_words -> Number of words to read. +* +* Purpose - Read a number of byte swapped words from an I/O location. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_rep_swap_insw( + ADAPTER_HANDLE adapter_handle, + WORD input_location, + BYTE * destination_address, + WORD length_in_words + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + USHORT word_data; + WORD * ptr; + + ptr = (WORD *) destination_address; + +#ifdef _M_IX86 + + while (length_in_words > 0) + { + NdisRawReadPortUshort((ULONG) input_location, &word_data); + *ptr = ((WORD) word_data << 8) | ((WORD) word_data >> 8); + + ptr++; + length_in_words--; + } + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) input_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) input_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) input_location - ndisAdap->IoLocation2); + + while (length_in_words > 0) + { + NdisRawReadPortUshort(port, &word_data); + *ptr = ((WORD) word_data << 8) | ((WORD) word_data >> 8); + + ptr++; + length_in_words--; + } + + +#endif +} + + +/*************************************************************************** +* +* Function - sys_rep_swap_outsw +* +* Parameters - adapter_handle -> FTK adapter handle. +* output_location -> I/O location to be written. +* source_address -> Address of the data to be written. +* length_in_words -> Number of words to read. +* +* Purpose - Write a number of byte swapped words to an I/O location. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_rep_swap_outsw( + ADAPTER_HANDLE adapter_handle, + WORD input_location, + BYTE * source_address, + WORD length_in_words + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + USHORT word_data; + WORD * ptr; + + ptr = (WORD *) source_address; + +#ifdef _M_IX86 + + while (length_in_words > 0) + { + word_data = (USHORT) (*ptr << 8) | (*ptr >> 8); + NdisRawWritePortUshort((ULONG) input_location, word_data); + + ptr++; + length_in_words--; + } + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) input_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) input_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) input_location - ndisAdap->IoLocation2); + + while (length_in_words > 0) + { + word_data = (USHORT) (*ptr << 8) | (*ptr >> 8); + NdisRawWritePortUshort(port, word_data); + + ptr++; + length_in_words--; + } + +#endif +} + + +/*************************************************************************** +* +* Function - sys_rep_insd +* +* Parameters - adapter_handle -> FTK adapter handle. +* output_location -> I/O location to be read. +* destination_address -> Destination for the data read. +* length_in_dwords -> Number of dwords to read. +* +* Purpose - Read a number of dwords from an I/O location. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_rep_insd( + ADAPTER_HANDLE adapter_handle, + WORD input_location, + BYTE * destination_address, + WORD length_in_dwords + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + +#ifdef _M_IX86 + + NdisRawReadPortBufferUlong( + (ULONG) input_location, + (USHORT *) destination_address, + (ULONG) length_in_dwords + ); + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) input_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) input_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) input_location - ndisAdap->IoLocation2); + + NdisRawReadPortBufferUlong( + port, + (ULONG *) destination_address, + (ULONG) length_in_dwords + ); + +#endif +} + + +/*************************************************************************** +* +* Function - sys_rep_outsd +* +* Parameters - adapter_handle -> FTK adapter handle. +* output_location -> I/O location to be written. +* source_address -> Address of the data to be written. +* length_in_dwords -> Number of dwords to read. +* +* Purpose - Write a number of dwords to an I/O location. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_rep_outsd( + ADAPTER_HANDLE adapter_handle, + WORD input_location, + BYTE * source_address, + WORD length_in_dwords + ) +{ + PMADGE_ADAPTER ndisAdap; + ULONG port; + +#ifdef _M_IX86 + + NdisRawWritePortBufferUlong( + (ULONG) input_location, + (USHORT *) source_address, + (ULONG) length_in_dwords + ); + +#else + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + port = ((UINT) input_location <= ndisAdap->IORange1End) + ? (ULONG) ndisAdap->MappedIOLocation1 + + ((UINT) input_location - ndisAdap->IoLocation1) + : (ULONG) ndisAdap->MappedIOLocation2 + + ((UINT) input_location - ndisAdap->IoLocation2); + + NdisRawWritePortBufferUlong( + port, + (ULONG *) source_address, + (ULONG) length_in_dwords + ); + +#endif +} + +/*************************************************************************** +* +* Function - sys_sync_with_interrupt +* +* Parameter - adapter_handle -> FTK adapter handle. +* f -> Function to call. +* ptr -> Argument for f. +* +* Purpose - Call a function in such as way that its execution will +* never overlap with the ISR. +* +* Returns - The return value from *f. +* +***************************************************************************/ + +WBOOLEAN +sys_sync_with_interrupt( + ADAPTER_HANDLE adapter_handle, + WBOOLEAN (*f)(void *), + void * ptr + ) +{ + PMADGE_ADAPTER ndisAdap; + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + + return NdisMSynchronizeWithInterrupt( + &ndisAdap->Interrupt, + (void *) f, + ptr + ); +} + + +/*************************************************************************** +* +* Function - sys_rep_movsd_to +* +* Parameter - adapter_handle -> FTK adapter handle. +* SourcePtr -> Pointer to the source data. +* DestPtr -> pointer to the destination. +* TransferSize -> Number of bytes to transfer. +* +* Purpose - Transfer data to a memory mapped device. Although bytes +* are given as the transfer size a whole number of +* DWORDS are transferred. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_rep_movsd_to( + ADAPTER_HANDLE adapter_handle, + DWORD SourcePtr, + DWORD DestPtr, + WORD TransferSize + ) +{ + NdisMoveToMappedMemory( + (VOID *) DestPtr, + (VOID *) SourcePtr, + (ULONG) TransferSize + ); +} + + +/*************************************************************************** +* +* Function - sys_rep_movsd_from +* +* Parameter - adapter_handle -> FTK adapter handle. +* SourcePtr -> Pointer to the source data. +* DestPtr -> pointer to the destination. +* TransferSize -> Number of bytes to transfer. +* +* Purpose - Transfer data from a memory mapped device. Although bytes +* are given as the transfer size a whole number of +* DWORDS are transferred. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_rep_movsd_from( + ADAPTER_HANDLE adapter_handle, + DWORD SourcePtr, + DWORD DestPtr, + WORD TransferSize + ) +{ + NdisMoveFromMappedMemory( + (VOID *) DestPtr, + (VOID *) SourcePtr, + (ULONG) TransferSize + ); +} + + +/*************************************************************************** +* +* Function - sys_movsd_to +* +* Parameter - adapter_handle -> FTK adapter handle. +* SourcePtr -> Pointer to the source data. +* DestPtr -> pointer to the destination. +* +* Purpose - Transfer a DWORD of data to a memory mapped device. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_movsd_to( + ADAPTER_HANDLE adapter_handle, + DWORD SourcePtr, + DWORD DestPtr + ) +{ + *((DWORD *) DestPtr) = *((DWORD *) SourcePtr); +} + + +/*************************************************************************** +* +* Function - sys_movsd_from +* +* Parameter - adapter_handle -> FTK adapter handle. +* SourcePtr -> Pointer to the source data. +* DestPtr -> pointer to the destination. +* +* Purpose - Transfer a DWORD of data from a memory mapped device. +* +* Returns - Nothing. +* +***************************************************************************/ + +void +sys_movsd_from( + ADAPTER_HANDLE adapter_handle, + DWORD SourcePtr, + DWORD DestPtr + ) +{ + *((DWORD *) DestPtr) = *((DWORD *) SourcePtr); +} + + +/*************************************************************************** +* +* Function - sys_pci_read_config_dword +* +* Parameter - adapter_handle -> FTK adapter handle. +* index -> Offset into the configuration space from +* which to read. +* dword_ptr -> Buffer for the data read. +* +* Purpose - Read a DWORD from PCI configuration space. +* +* Returns - TRUE on success. +* +***************************************************************************/ + +WBOOLEAN +sys_pci_read_config_dword( + ADAPTER_HANDLE adapter_handle, + WORD index, + DWORD * dword_ptr + ) +{ + PMADGE_ADAPTER ndisAdap; + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + + NdisReadPciSlotInformation( + ndisAdap->UsedInISR.MiniportHandle, + (ULONG) adapter_record[adapter_handle]->pci_handle, + index, + (void *) dword_ptr, + 4 + ); + + return TRUE; +} + + +/*************************************************************************** +* +* Function - sys_pci_read_config_word +* +* Parameter - adapter_handle -> FTK adapter handle. +* index -> Offset into the configuration space from +* which to read. +* word_ptr -> Buffer for the data read. +* +* Purpose - Read a WORD from PCI configuration space. +* +* Returns - TRUE on success. +* +***************************************************************************/ + +WBOOLEAN +sys_pci_read_config_word( + ADAPTER_HANDLE adapter_handle, + WORD index, + WORD * word_ptr + ) +{ + PMADGE_ADAPTER ndisAdap; + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + + NdisReadPciSlotInformation( + ndisAdap->UsedInISR.MiniportHandle, + (ULONG) adapter_record[adapter_handle]->pci_handle, + index, + (void *) word_ptr, + 2 + ); + + return TRUE; +} + + +/*************************************************************************** +* +* Function - sys_pci_read_config_byte +* +* Parameter - adapter_handle -> FTK adapter handle. +* index -> Offset into the configuration space from +* which to read. +* byte_ptr -> Buffer for the data read. +* +* Purpose - Read a BYTE from PCI configuration space. +* +* Returns - TRUE on success. +* +***************************************************************************/ + +WBOOLEAN +sys_pci_read_config_byte( + ADAPTER_HANDLE adapter_handle, + WORD index, + BYTE * byte_ptr + ) +{ + PMADGE_ADAPTER ndisAdap; + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + + NdisReadPciSlotInformation( + ndisAdap->UsedInISR.MiniportHandle, + (ULONG) adapter_record[adapter_handle]->pci_handle, + index, + (void *) byte_ptr, + 1 + ); + + return TRUE; +} + + +/*************************************************************************** +* +* Function - sys_pci_write_config_dword +* +* Parameter - adapter_handle -> FTK adapter handle. +* index -> Offset into the configuration space to +* which to write. +* dword -> Data to write. +* +* Purpose - Write a DWORD to PCI configuration space. +* +* Returns - TRUE on success. +* +***************************************************************************/ + +WBOOLEAN +sys_pci_write_config_dword( + ADAPTER_HANDLE adapter_handle, + WORD index, + DWORD dword + ) +{ + PMADGE_ADAPTER ndisAdap; + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + + NdisWritePciSlotInformation( + ndisAdap->UsedInISR.MiniportHandle, + (ULONG) adapter_record[adapter_handle]->pci_handle, + index, + (void *) &dword, + 4 + ); + + return TRUE; +} + + +/*************************************************************************** +* +* Function - sys_pci_write_config_word +* +* Parameter - adapter_handle -> FTK adapter handle. +* index -> Offset into the configuration space to +* which to write. +* word -> Data to write. +* +* Purpose - Write a WORD to PCI configuration space. +* +* Returns - TRUE on success. +* +***************************************************************************/ + +WBOOLEAN +sys_pci_write_config_word( + ADAPTER_HANDLE adapter_handle, + WORD index, + WORD word + ) +{ + PMADGE_ADAPTER ndisAdap; + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + + NdisWritePciSlotInformation( + ndisAdap->UsedInISR.MiniportHandle, + (ULONG) adapter_record[adapter_handle]->pci_handle, + index, + (void *) &word, + 2 + ); + + return TRUE; +} + + +/*************************************************************************** +* +* Function - sys_pci_write_config_byte +* +* Parameter - adapter_handle -> FTK adapter handle. +* index -> Offset into the configuration space to +* which to write. +* byte -> Data to write. +* +* Purpose - Write a BYTE to PCI configuration space. +* +* Returns - TRUE on success. +* +***************************************************************************/ + +WBOOLEAN +sys_pci_write_config_byte( + ADAPTER_HANDLE adapter_handle, + WORD index, + BYTE byte + ) +{ + PMADGE_ADAPTER ndisAdap; + + ndisAdap = PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(adapter_handle); + + NdisWritePciSlotInformation( + ndisAdap->UsedInISR.MiniportHandle, + (ULONG) adapter_record[adapter_handle]->pci_handle, + index, + (void *) &byte, + 1 + ); + + return TRUE; +} + +/******** End of SYS_MEM.C ************************************************/ + |