summaryrefslogblamecommitdiffstats
path: root/private/ntos/ndis/madge/driver/sys_dma.c
blob: 42d5b52441e750f2e75bd1cca32ccffe766ad69d (plain) (tree)








































































































































































































































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