Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

233 lines
6.8 KiB

/****************************************************************************
*
* SYS_DMA.C
*
* This module contains helper routines used by the FTK to initialise
* DMA 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"
/*---------------------------------------------------------------------------
|
| DMA General Note
| ----------------
|
| On an IBM compatible PC/AT machine, DMA is controlled by Programmable
| DMA Controller 8237 chips. On AT machines there are two 8237 DMA
| controllers. The primary controller handles DMA channels 0-3, the
| secondary controller handles channels 4-7.
|
| The FTK is interested in three registers on each controller. These are
| the mode register for setting the DMA mode for a given channel, the
| mask register used for enabling/disabling a DMA channel, and the status
| register for seeing what DMA channel requests have been generated.
|
---------------------------------------------------------------------------*/
//
// IO ports for status, mask and mode registers on primary DMA controller
//
#define DMA_STATUS_PRIMARY_8237 0x08
#define DMA_MASK_PRIMARY_8237 0x0A
#define DMA_MODE_PRIMARY_8237 0x0B
//
// IO ports for status, mask and mode registers on secondary DMA controller
//
#define DMA_STATUS_SECONDARY_8237 0x0D0
#define DMA_MASK_SECONDARY_8237 0x0D4
#define DMA_MODE_SECONDARY_8237 0x0D6
//
// Set cascade mode code (sent to mode register along with DMA channel)
//
#define DMA_CASCADE_MODE_8237 0x0C0
//
// Disable DMA channel code (sent to mask register along with DMA channel)
//
#define DMA_DISABLE_MASK_8237 0x04
/****************************************************************************
*
* Function - sys_enable_dma_channel
*
* Parameters - adapter_handle -> FTK adapter handle.
* dma_channel -> The DMA channel number.
*
* Purpose - Initialise a DMA channel.
*
* Returns - TRUE on success or FALSE on failure.
*
* Notes:
*
* With the NDIS3 driver the dma channel is enabled by the underlying
* operating system. We pass information about our adapter in the
* NDIS_ADAPTER_INFORMATION structure, including whether its a
* BusMasterDma card --- by setting the AdapterInformation.Master flag
* in MDGNT.c.
*
* So eventually this routine should be null and just return TRUE.
*
* Upto NT build 438, there is a problem with the AdapterInformation.Master
* flag. Setting it does not enable the DMA channel on certain ISA/AT
* platforms. Therefore the following code has been included such that we
* explicitly enable the DMA channel.
*
* The DMA channel has been specified in the AdapterInformation structure
* passed by the MAC driver to NdisRegisterAdapter()
*
****************************************************************************/
WBOOLEAN
sys_enable_dma_channel(ADAPTER_HANDLE adapter_handle, WORD dma_channel);
#pragma FTK_INIT_FUNCTION(sys_enable_dma_channel)
WBOOLEAN
sys_enable_dma_channel(ADAPTER_HANDLE adapter_handle, WORD dma_channel)
{
#ifdef _M_IX86
if (dma_channel < 4)
{
//
// Program up primary 8237. Write local DMA channel with cascade
// mode to mode register. Write local DMA channel to mask register
// to enable it.
//
//
// (dma_channel + DMA_CASCADE_MODE_8237) -> DMA_MODE_PRIMARY_8237
//
sys_outsb(
adapter_handle,
(WORD) DMA_MODE_PRIMARY_8237,
(BYTE) (dma_channel + DMA_CASCADE_MODE_8237)
);
//
// (dma_channel) -> DMA_MASK_PRIMARY_8237
//
sys_outsb(
adapter_handle,
(WORD) DMA_MASK_PRIMARY_8237,
(BYTE) dma_channel
);
}
else
{
//
// Program up secondary 8237. Get local DMA channel by DMA-4.
// Write local DMA channel with cascade mode to mode register.
// Write local DMA channel to mask register to enable it.
//
dma_channel = dma_channel - 4;
//
// (dma_channel + DMA_CASCADE_MODE_8237) -> DMA_MODE_SECONDARY_8237
//
sys_outsb(
adapter_handle,
(WORD) DMA_MODE_SECONDARY_8237,
(BYTE)(dma_channel + DMA_CASCADE_MODE_8237)
);
//
// (dma_channel) -> DMA_MASK_SECONDARY_8237
//
sys_outsb(
adapter_handle,
(WORD) DMA_MASK_SECONDARY_8237,
(BYTE) dma_channel
);
}
#endif
return TRUE;
}
/****************************************************************************
*
* Function - sys_disable_dma_channel
*
* Parameters - adapter_handle -> FTK adapter handle.
* dma_channel -> The DMA channel number.
*
* Purpose - De-initialise a DMA channel.
*
* Returns - Nothing.
*
* Notes:
*
* Upto NT build 438, there is a problem with the AdapterInformation.Master
* flag. Setting it does not enable the DMA channel on certain ISA/AT
* platforms. Therefore the code in sys_enable_dma_channel() above, has been
* included such that we explicitly enable the DMA channel.
*
* Eventually, the Operating system will do this for us. And will also disable
* the DMA channel when the driver is unloaded.
*
* Therefore, I have not added code to explicitly disable DMA channel.
*
*
* However, if we do not disable the channel certain ISA platforms hang
* on shutdown. (pba 25/5/1994)
*
***************************************************************************/
void
sys_disable_dma_channel(ADAPTER_HANDLE adapter_handle, WORD dma_channel)
{
#ifdef _M_IX86
if (dma_channel < 4)
{
sys_outsb(
adapter_handle,
(WORD) DMA_MASK_PRIMARY_8237,
(BYTE) (DMA_DISABLE_MASK_8237 + dma_channel)
);
}
else
{
sys_outsb(
adapter_handle,
(WORD)DMA_MASK_SECONDARY_8237,
(BYTE)(DMA_DISABLE_MASK_8237 + (dma_channel - 4))
);
}
#endif
}
/******** End of SYS_DMA.C *************************************************/