/**************************************************************************** * * 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 #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 ************************************************/