/*******************************************************************************
**
*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
*
*Redistribution and use in source and binary forms, with or without modification, are permitted provided 
*that the following conditions are met: 
*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
*following disclaimer. 
*2. Redistributions in binary form must reproduce the above copyright notice, 
*this list of conditions and the following disclaimer in the documentation and/or other materials provided
*with the distribution. 
*
*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 
*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
* $FreeBSD$
*
********************************************************************************/
/********************************************************************************
**    
*   dm.h 
*
*   Abstract:   This module defines the contants, enum and #define definition used
*               by Discovery Moduled (DM).
*     
********************************************************************************/

#ifndef DM_H

#define DM_H

/*************************************************
 *   constants for type field in agsaMem_t
 *************************************************/
#define DM_CACHED_MEM                             0x00     /**< CACHED memory type */
#define DM_DMA_MEM                                0x01     /**< DMA memory type */
#define DM_CACHED_DMA_MEM                         0x02     /**< CACHED DMA memory type */

/*************************************************
 *   constants for API return values
 *************************************************/
#define DM_RC_SUCCESS                             0x00     /**< Successful function return value */
#define DM_RC_FAILURE                             0x01     /**< Failed function return value */
#define DM_RC_BUSY                                0x02     /**< Busy function return value */
#define DM_RC_VERSION_INCOMPATIBLE                0x03     /**< Version miss match */
#define DM_RC_VERSION_UNTESTED                    0x04     /**< Version not tested */



/*************************************************
 *   Discovery option
 *************************************************/
#define DM_DISCOVERY_OPTION_FULL_START			0x00     /**< Full discovery */
#define DM_DISCOVERY_OPTION_INCREMENTAL_START		0x01     /**< Incremental discovery */
#define DM_DISCOVERY_OPTION_ABORT			0x02     /**< Discovery abort */


/*************************************************
 *   Discovery status
 *************************************************/
enum dmDiscoveryState_e
{
  dmDiscCompleted  = 0,
  dmDiscFailed,
  dmDiscAborted,
  dmDiscAbortFailed,
  dmDiscInProgress,
  dmDiscAbortInvalid, /* no discovery to abort */   
  dmDiscAbortInProgress, /* abort in progress */   

};

/*************************************************
 *   Device status
 *************************************************/
enum dmDeviceState_e
{
  dmDeviceNoChange = 0,
  dmDeviceArrival,
  dmDeviceRemoval,
  dmDeviceMCNChange,
  dmDeviceRateChange,
};

typedef struct  dmContext_s {
		void		*tdData;
		void		*dmData;
} dmContext_t;

typedef struct{
        bit16	smpTimeout;
        bit16	it_NexusTimeout;
        bit16	firstBurstSize;
        bit8	 flag;
        bit8	 devType_S_Rate;
        bit8 	sasAddressHi[4]; 
        bit8 	sasAddressLo[4];
        bit8    initiator_ssp_stp_smp;
        bit8    target_ssp_stp_smp;
        /* bit8 - bit14 are set by the user of DM such as TDM for directly attached expander
           0 - 7; PhyID 
           8: non SMP or not
           9 - 10: types of expander, valid only when bit8 is set
                   10b (2): edge expander
                   11b (3): fanout expander
           11 - 14: MCN
        */
        bit16   ext;
        bit8    sataDeviceType;
        bit8    reserved;
} dmDeviceInfo_t;


typedef struct{
	void 	*virtPtr;
	void 	*osHandle;
	bit32 	physAddrUpper;
	bit32 	physAddrLower;
	bit32 	totalLength;
	bit32 	numElements;
	bit32 	singleElementLength;
	bit32 	alignment;
	bit32 	type;
	bit32 	reserved;
} dmMem_t;

#define DM_NUM_MEM_CHUNKS 8

typedef struct{
	bit32 		count;
	dmMem_t 	dmMemory[DM_NUM_MEM_CHUNKS];
} dmMemoryRequirement_t;

typedef    dmContext_t    dmPortContext_t;

typedef    dmContext_t    dmRoot_t;

typedef struct{
 bit32   numDevHandles;
 bit32   tbd1;
 bit32   tbd2;
#ifdef DM_DEBUG
 bit32   DMDebugLevel;
#endif
 bit32   itNexusTimeout;
} dmSwConfig_t;

typedef struct{
               bit8  	sasRemoteAddressHi[4]; 
               bit8  	sasRemoteAddressLo[4]; 
               bit8  	sasLocalAddressHi[4]; 
               bit8  	sasLocalAddressLo[4]; 
               bit32    flag;
} dmPortInfo_t;


#endif  /* DM_H */