blob: 823684eac34e56840dd6e3bb3df6c1292f24686f [file] [log] [blame]
/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates
This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms. Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.
********************************************************************************
Marvell Commercial License Option
If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.
********************************************************************************
Marvell GPL License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED. The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option
If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* 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.
* Neither the name of Marvell nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
*******************************************************************************/
/*******************************************************************************
* mvSata.h - Header File for mvSata.c.
*
* DESCRIPTION:
* None.
*
* DEPENDENCIES:
* mvOs.h
* ATA/ATAPI-6 standard
*
*******************************************************************************/
#ifndef __INCmvSatah
#define __INCmvSatah
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Includes */
#include "mvOsS.h"
#include "mvRegs.h"
#include "ctrlEnv/mvCtrlEnvSpec.h"
/* Definitions */
#define MV_CORE_DRIVER_LOG_ID 0
/* MV88SX50XX specific defines */
#define MV_SATA_VENDOR_ID 0x11AB
#define MV_SATA_DEVICE_ID_5080 0x5080
#define MV_SATA_DEVICE_ID_5081 0x5081
#define MV_SATA_DEVICE_ID_5040 0x5040
#define MV_SATA_DEVICE_ID_5041 0x5041
#define MV_SATA_DEVICE_ID_6041 0x6041
#define MV_SATA_DEVICE_ID_6081 0x6081
#define MV_SATA_DEVICE_ID_6042 0x6042
#define MV_SATA_DEVICE_ID_7042 0x7042
#define MV_SATA_DEVICE_ID_5182 0x5182 /*88F5182 integrated sata */
#define MV_SATA_DEVICE_ID_5082 0x5082 /*88F5082 integrated sata */
#define MV_SATA_DEVICE_ID_6082 0x6082 /* Same device ID for 6082L */
#define MV_SATA_DEVICE_ID_6490 0x6490 /*64660 integrated sata */
#define MV_SATA_DEVICE_ID_78XX0 0x7800 /*78x00 Z0/Y0 integrated sata */
#define MV_SATA_DEVICE_ID_78100 0x7810 /*78100 integrated sata */
#define MV_SATA_DEVICE_ID_78200 0x7820 /*78200 integrated sata */
#define MV_SATA_DEVICE_ID_76100 0x7610 /*76100 integrated sata */
#define MV_SATA_DEVICE_ID_6323 0x6323 /*6323 integrated sata */
#define MV_SATA_DEVICE_ID_6281 0x6281 /*88f6281 integrated sata */
#define MV_SATA_DEVICE_ID_6282 0x1155 /*88f6282 integrated sata */
#define MV_SATA_DEVICE_ID_6192 0x6192 /*88f6192 integrated sata */
#define MV_SATA_DEVICE_ID_6190 0x6190 /*88f6190 integrated sata */
#define MV_SATA_DEVICE_ID_6781 0x6781 /*88f6781 integrated sata */
#define MV_SATA_DEVICE_ID_6550 0x6550 /*88f6550 integrated sata */
#define MV_SATA_DEVICE_ID_6560 0x6560 /*88f6560 integrated sata */
#define MV_SATA_CHANNELS_NUM 8
#define MV_SATA_UNITS_NUM 2
#define MV_SATA_5082_PORT_NUM 1
#define MV_SATA_5182_PORT_NUM 2
#define MV_SATA_6082_PORT_NUM 1
#define MV_SATA_6490_PORT_NUM 1
#define MV_SATA_6281_PORT_NUM 2
#define MV_SATA_6282_PORT_NUM 2
#define MV_SATA_6192_PORT_NUM 2
#define MV_SATA_6190_PORT_NUM 1
#define MV_SATA_6781_PORT_NUM 1
#define MV_SATA_78XX0_PORT_NUM 2
#define MV_SATA_76100_PORT_NUM 1
#define MV_SATA_6323_PORT_NUM 1
#define MV_SATA_65XX_PORT_NUM 1
#define MV_SATA_PM_MAX_PORTS 15
#define MV_SATA_PM_CONTROL_PORT 15
#define MV_EDMA_QUEUE_LENGTH 32 /* Up to 32 outstanding */
#define MV_EDMA_GEN2E_QUEUE_LENGTH 128
/* commands per SATA channel*/
#ifndef MV_SATA_OVERRIDE_SW_QUEUE_SIZE
#define MV_SATA_SW_QUEUE_SIZE (MV_EDMA_QUEUE_LENGTH - 1)
#else
#define MV_SATA_SW_QUEUE_SIZE MV_SATA_REQUESTED_SW_QUEUE_SIZE
#endif
#ifdef MV_SATA_SUPPORT_GEN2E_128_QUEUE_LEN
#ifndef MV_SATA_OVERRIDE_GEN2E_SW_QUEUE_SIZE
#define MV_SATA_GEN2E_SW_QUEUE_SIZE (MV_EDMA_GEN2E_QUEUE_LENGTH - 1)
#else
#define MV_SATA_GEN2E_SW_QUEUE_SIZE MV_SATA_REQUESTED_GEN2E_SW_QUEUE_SIZE
#endif
#else
#define MV_SATA_GEN2E_SW_QUEUE_SIZE (MV_SATA_SW_QUEUE_SIZE)
#endif
#if ((MV_SATA_SW_QUEUE_SIZE) >= (MV_EDMA_QUEUE_LENGTH))
#error "FATAL ERROR: Bad Value for MV_SATA_SW_QUEUE_SIZE "
#endif
#if ((MV_SATA_GEN2E_SW_QUEUE_SIZE) >= (MV_EDMA_GEN2E_QUEUE_LENGTH))
#error "FATAL ERROR: Bad Value for MV_EDMA_GEN2E_QUEUE_LENGTH "
#endif
#if ((MV_SATA_SW_QUEUE_SIZE) > (MV_SATA_GEN2E_SW_QUEUE_SIZE))
#error "FATAL ERROR: MV_SATA_SW_QUEUE_SIZE bigger than MV_EDMA_GEN2E_QUEUE_LENGTH"
#endif
#if (((MV_SATA_GEN2E_SW_QUEUE_SIZE) * 4) > ((MV_SATA_SW_QUEUE_SIZE) * 8))
#define _MV_SATA_COMMANDS_PER_ADAPTER ((MV_SATA_GEN2E_SW_QUEUE_SIZE) * 4)
#else
#define _MV_SATA_COMMANDS_PER_ADAPTER ((MV_SATA_SW_QUEUE_SIZE) * 8)
#endif
#define MV_EDMA_QUEUE_MASK 0x1F
#define MV_EDMA_REQUEST_ENTRY_SIZE 32
#define MV_EDMA_RESPONSE_ENTRY_SIZE 8
#define MV_EDMA_REQUEST_QUEUE_SIZE 1024 /* 32*32 = 1KBytes */
#define MV_EDMA_RESPONSE_QUEUE_SIZE 256 /* 32*8 = 256 Bytes */
#define MV_EDMA_GEN2E_QUEUE_MASK 0x7F
#define MV_EDMA_GEN2E_REQUEST_QUEUE_SIZE 4096 /* 128*32 = 4KBytes */
#define MV_EDMA_GEN2E_RESPONSE_QUEUE_SIZE 1024 /* 128*8 = 1KBytes */
#define MV_EDMA_PRD_ENTRY_SIZE 16 /* 16Bytes */
#define MV_EDMA_PRD_NO_SNOOP_FLAG MV_BIT0
#define MV_EDMA_PRD_EOT_FLAG MV_BIT15
#define MV_ATA_IDENTIFY_DEV_DATA_LENGTH 256 /* number of words(2 byte) */
#define MV_ATA_MODEL_NUMBER_LEN 40
#define ATA_SECTOR_SIZE 512
#define ATA_SECTOR_SIZE_IN_WORDS 256
#define MV_SATA_COMM_INIT_DELAY 1000 /*1000 us */
#define MV_SATA_COMM_INIT_WAIT_DELAY 20000 /*20 ms */
/*Channel to Channel*/
#ifdef MV_SATA_C2C_COMM
#define MV_SATA_REGISTER_HOST_2_DEVICE_FIS 0x00000034
#define MV_SATA_DMA_ACTIVATE_FIS 0x00000039
#define MV_C2C_MESSAGE_SIZE 10
#endif
#ifdef MV_SATA_IO_GRANULARITY
#define MV_IOG_QUEUE_SIZE 0x40
#define MV_IOG_INVALID_COMMAND_ID MV_IOG_QUEUE_SIZE
#endif
/* Typedefs */
typedef enum mvUdmaType {
MV_UDMA_TYPE_READ, MV_UDMA_TYPE_WRITE
} MV_UDMA_TYPE;
typedef enum mvFlushType {
MV_FLUSH_TYPE_CALLBACK, MV_FLUSH_TYPE_NONE
} MV_FLUSH_TYPE;
typedef enum mvCompletionType {
MV_COMPLETION_TYPE_NORMAL, MV_COMPLETION_TYPE_ERROR,
MV_COMPLETION_TYPE_ABORT
} MV_COMPLETION_TYPE;
typedef enum mvEventType {
MV_EVENT_TYPE_ADAPTER_ERROR, MV_EVENT_TYPE_SATA_CABLE,
MV_EVENT_TYPE_SATA_ERROR
} MV_EVENT_TYPE;
typedef enum mvSataCableEvent {
MV_SATA_CABLE_EVENT_DISCONNECT = 0,
MV_SATA_CABLE_EVENT_CONNECT,
MV_SATA_CABLE_EVENT_PM_HOT_PLUG
} MV_SATA_CABLE_EVENT;
typedef enum mvSataErrorEvent {
MV_SATA_RECOVERABLE_COMMUNICATION_ERROR = 0,
MV_SATA_UNRECOVERABLE_COMMUNICATION_ERROR,
MV_SATA_DEVICE_ERROR
} MV_SATA_ERROR_EVENT;
#ifdef MV_SATA_C2C_COMM
typedef enum mvC2CEventType {
MV_C2C_REGISTER_DEVICE_TO_HOST_FIS_DONE,
MV_C2C_REGISTER_DEVICE_TO_HOST_FIS_ERROR,
MV_C2C_BM_DMA_DONE,
MV_C2C_BM_DMA_ERROR,
} MV_C2C_EVENT_TYPE;
#endif
typedef enum mvEdmaMode {
MV_EDMA_MODE_QUEUED,
MV_EDMA_MODE_NOT_QUEUED,
MV_EDMA_MODE_NATIVE_QUEUING
} MV_EDMA_MODE;
typedef enum mvQueueCommandResult {
MV_QUEUE_COMMAND_RESULT_OK = 0,
MV_QUEUE_COMMAND_RESULT_QUEUED_MODE_DISABLED,
MV_QUEUE_COMMAND_RESULT_FULL,
MV_QUEUE_COMMAND_RESULT_BAD_LBA_ADDRESS,
MV_QUEUE_COMMAND_RESULT_BAD_PARAMS
} MV_QUEUE_COMMAND_RESULT;
typedef enum mvNonUdmaProtocol {
MV_NON_UDMA_PROTOCOL_NON_DATA,
MV_NON_UDMA_PROTOCOL_PIO_DATA_IN,
MV_NON_UDMA_PROTOCOL_PIO_DATA_OUT,
MV_NON_UDMA_PROTOCOL_PACKET_PIO_NON_DATA,
MV_NON_UDMA_PROTOCOL_PACKET_PIO_DATA_IN,
MV_NON_UDMA_PROTOCOL_PACKET_PIO_DATA_OUT,
MV_NON_UDMA_PROTOCOL_PACKET_DMA,
MV_NON_UDMA_PROTOCOL_UNKNOWN
} MV_NON_UDMA_PROTOCOL;
typedef enum mvSataGeneration {
MV_SATA_GEN_I, MV_SATA_GEN_II, MV_SATA_GEN_IIE
} MV_SATA_GEN;
typedef enum mvSataInterfaceSpeed {
MV_SATA_IF_SPEED_1_5_GBPS, MV_SATA_IF_SPEED_3_GBPS,
MV_SATA_IF_SPEED_NO_LIMIT, MV_SATA_IF_SPEED_INVALID
} MV_SATA_IF_SPEED;
typedef enum mvSataInterfacePowerState {
MV_SATA_IF_POWER_PHY_READY = 1, MV_SATA_IF_POWER_PARTIAL = 2,
MV_SATA_IF_POWER_SLUMBER = 6
} MV_SATA_IF_POWER_STATE;
#ifdef MV_SATA_C2C_COMM
typedef enum mvSataC2CMode {
MV_SATA_C2C_MODE_INITIATOR, MV_SATA_C2C_MODE_TARGET
} MV_SATA_C2C_MODE;
#endif
typedef enum mvSataDeviceType {
MV_SATA_DEVICE_TYPE_UNKNOWN = 0,
MV_SATA_DEVICE_TYPE_ATA_DISK,
MV_SATA_DEVICE_TYPE_ATAPI_DEVICE,
MV_SATA_DEVICE_TYPE_PM
} MV_SATA_DEVICE_TYPE;
typedef enum mvPMSwitchingmode {
MV_SATA_SWITCHING_MODE_NONE = 0,
MV_SATA_SWITCHING_MODE_CBS,
MV_SATA_SWITCHING_MODE_QCBS,
MV_SATA_SWITCHING_MODE_FBS,
} MV_SATA_SWITCHING_MODE;
struct mvDmaRequestQueueEntry;
struct mvDmaResponseQueueEntry;
struct mvDmaCommandEntry;
struct mvSataAdapter;
struct mvStorageDevRegisters;
struct mvSataChannel;
typedef MV_BOOLEAN(*mvSataCommandCompletionCallBack_t) (struct mvSataAdapter *,
MV_U8,
MV_COMPLETION_TYPE,
MV_VOID_PTR, MV_U16, MV_U32, struct mvStorageDevRegisters *);
#ifdef MV_SATA_C2C_COMM
typedef MV_BOOLEAN(*C2CCallBack_t) (struct mvSataAdapter *,
struct mvSataChannel *, MV_C2C_EVENT_TYPE event, MV_U32 msgSize, MV_U8 *msg);
#endif
typedef enum mvQueuedCommandType {
MV_QUEUED_COMMAND_TYPE_UDMA,
MV_QUEUED_COMMAND_TYPE_NONE_UDMA,
MV_QUEUED_COMMAND_TYPE_PACKET
} MV_QUEUED_COMMAND_TYPE;
#ifdef MV_SATA_IO_GRANULARITY
typedef enum mvIogQueuedCommandType {
MV_IOG_COMMAND_TYPE_FIRST,
MV_IOG_COMMAND_TYPE_NEXT
} MV_IOG_COMMAND_TYPE;
#endif
typedef enum mvSataInterruptScheme {
MV_SATA_INTERRUPT_HANDLING_IN_ISR,
MV_SATA_INTERRUPT_HANDLING_IN_TASK,
MV_SATA_INTERRUPTS_DISABLED
} MV_SATA_INTERRUPT_SCHEME;
typedef struct mvUdmaCommandParams {
MV_UDMA_TYPE readWrite;
MV_BOOLEAN isEXT;
MV_BOOLEAN FUA;
MV_U32 lowLBAAddress;
MV_U16 highLBAAddress;
MV_U16 numOfSectors;
MV_U32 prdLowAddr;
MV_U32 prdHighAddr;
#ifdef MV_SATA_SUPPORT_EDMA_SINGLE_DATA_REGION
MV_BOOLEAN singleDataRegion;
MV_U16 byteCount;
#endif
mvSataCommandCompletionCallBack_t callBack;
MV_VOID_PTR commandId;
#ifdef MV_SATA_IO_GRANULARITY
MV_BOOLEAN ioGranularityEnabled;
MV_IOG_COMMAND_TYPE iogCommandType;
union {
MV_U8 transId;
MV_U8 transCount;
} ioGranularityCommandParam;
MV_U8 iogCurrentTransId;
#endif
} MV_UDMA_COMMAND_PARAMS;
typedef struct mvNoneUdmaCommandParams {
MV_NON_UDMA_PROTOCOL protocolType;
MV_BOOLEAN isEXT;
MV_U16_PTR bufPtr;
MV_U32 count;
MV_U16 features;
MV_U16 sectorCount;
MV_U16 lbaLow;
MV_U16 lbaMid;
MV_U16 lbaHigh;
MV_U8 device;
MV_U8 command;
mvSataCommandCompletionCallBack_t callBack;
MV_VOID_PTR commandId;
} MV_NONE_UDMA_COMMAND_PARAMS;
typedef struct mvPacketCommandParams {
MV_NON_UDMA_PROTOCOL protocolType;
MV_U16_PTR bufPtr;
MV_U32 buffer_len;
MV_U32 transfered_data;
MV_U8 cdb_len;
MV_U16_PTR cdb_buffer; /*SCSI command desciptor block */
MV_U8 flags; /* bit 0:1-> DMA write */
/* bit 1:1-> single Data Region */
MV_U32 prdLowAddr;
MV_U32 prdHighAddr;
mvSataCommandCompletionCallBack_t callBack;
MV_VOID_PTR commandId;
} MV_PACKET_COMMAND_PARAMS;
typedef struct mvQueueCommandInfo {
MV_QUEUED_COMMAND_TYPE type;
MV_U8 PMPort;
union {
MV_UDMA_COMMAND_PARAMS udmaCommand;
MV_NONE_UDMA_COMMAND_PARAMS NoneUdmaCommand;
MV_PACKET_COMMAND_PARAMS packetCommand;
} commandParams;
} MV_QUEUE_COMMAND_INFO;
/* The following structure is for the Core Driver internal usage */
typedef struct mvQueuedCommandEntry {
MV_BOOLEAN isFreeEntry;
/*MV_U8 commandTag; */
MV_U8 hostTag;
MV_U8 deviceTag;
MV_BOOLEAN isCommandInEdma:1;
MV_BOOLEAN commandAborted:1;
struct mvQueuedCommandEntry *next;
struct mvQueuedCommandEntry *prev;
MV_QUEUE_COMMAND_INFO *pCommandInfo;
#ifndef MV_SATA_STORE_COMMANDS_INFO_ON_IAL_STACK
MV_QUEUE_COMMAND_INFO commandInfo;
#endif
} MV_QUEUED_COMMAND_ENTRY;
typedef enum mvErrorHandlingState {
MV_ERROR_HANDLING_STATE_IDLE,
MV_ERROR_HANDLING_STATE_WAIT_FOR_COMPLETIONS,
MV_ERROR_HANDLING_STATE_WAIT_FOR_BUSY,
MV_ERROR_HANDLING_STATE_REQUEST_SENSE
} MV_ERROR_HANDLING_STATE;
typedef struct {
MV_ERROR_HANDLING_STATE state;
MV_U16 PortsWithErrors; /*which ports reported errors */
MV_U8 CurrPort;
MV_QUEUED_COMMAND_ENTRY *pReadLogExtEntry;
MV_U16_PTR ReadLogExtBuffer;
MV_BOOLEAN useVendorUniqGen2WA;
} MV_ERROR_HANDLING_INFO;
/*for internal usage*/
#define MV_SATA_TAGS_PER_POOL 32
#ifdef MV_SATA_SUPPORT_GEN2E_128_QUEUE_LEN
#define MV_SATA_GEN2E_TAG_POOLS_NUM (MV_SATA_PM_MAX_PORTS + 1)
#define MV_SATA_GEN2E_TAG_PMPORT_MASK 0x0F
#else
#define MV_SATA_GEN2E_TAG_POOLS_NUM 1
#define MV_SATA_GEN2E_TAG_PMPORT_MASK 0x00
#endif
struct _mvTagsStack {
MV_U8 *pTagsArray;
MV_U8 top;
};
struct _mvChannelTags {
struct _mvTagsStack HostTagsPool;
struct _mvTagsStack DeviceTagsPool[MV_SATA_GEN2E_TAG_POOLS_NUM];
MV_U8 HostTags[MV_SATA_GEN2E_SW_QUEUE_SIZE];
MV_U8 DeviceTags[MV_SATA_GEN2E_TAG_POOLS_NUM][MV_SATA_TAGS_PER_POOL];
};
typedef enum mvHostInterfase {
MV_HOST_IF_INTEGRATED, /*as in 5182 */
MV_HOST_IF_PEX,
MV_HOST_IF_PCI /*PCI/PCI-X */
} MV_HOST_IF;
/* The following structures are part of the Core Driver API */
typedef struct mvSataChannel {
/* Fields set by Intermediate Application Layer */
MV_U8 channelNumber;
struct mvDmaRequestQueueEntry *requestQueue;
struct mvDmaResponseQueueEntry *responseQueue;
MV_U32 requestQueuePciHiAddress;
MV_U32 requestQueuePciLowAddress;
MV_U32 responseQueuePciHiAddress;
MV_U32 responseQueuePciLowAddress;
/* DRQ Data Block size in sectors, Core Driver sets a default value of 1 */
/* sector in mvSataConfigureChannel */
MV_U8 DRQDataBlockSize;
/* Fields set by CORE driver */
struct mvSataAdapter *mvSataAdapter;
MV_OS_SEMAPHORE semaphore;
MV_U32 eDmaRegsOffset;
MV_BOOLEAN EdmaActive;
MV_EDMA_MODE queuedDMA;
MV_U8 outstandingCommands;
MV_U8 portQueuedCommands[MV_SATA_PM_MAX_PORTS + 1];
struct mvQueuedCommandEntry *commandsQueue;
struct mvQueuedCommandEntry *commandsQueueHead;
struct mvQueuedCommandEntry *commandsQueueTail;
MV_BOOLEAN queueCommandsEnabled;
MV_U8 noneUdmaOutstandingCommands;
#ifdef MV_SUPPORT_ATAPI
MV_U8 packetOutstandingCommands;
MV_BOOLEAN waitForBMDMA;
#endif
MV_U8 EdmaQueuedCommands;
MV_U8 commandsQueueSize;
struct _mvChannelTags Tags;
MV_U8 reqInPtr;
MV_U8 rspOutPtr;
MV_U8 EDMAQueuePtrMask;
MV_U32 EDMARequestInpMask;
/* Port Multiplier fiels */
MV_BOOLEAN PMSupported;
MV_SATA_DEVICE_TYPE deviceType;
MV_BOOLEAN FBSEnabled;
MV_BOOLEAN use128Entries;
#ifdef MV_SATA_C2C_COMM
/* Channel 2 Channel */
MV_BOOLEAN C2CmodeEnabled;
MV_SATA_C2C_MODE C2CMode;
C2CCallBack_t C2CCallback;
#endif
MV_U8 recoveredErrorsCounter;
/* NCQ error handling */
MV_ERROR_HANDLING_INFO ErrorHandlingInfo;
} MV_SATA_CHANNEL;
typedef struct mvSataAdapter {
/* Fields set by Intermediate Application Layer */
MV_U32 adapterId;
MV_VOID_PTR IALData;
MV_U8 pciConfigRevisionId;
MV_U16 pciConfigDeviceId;
MV_BUS_ADDR_T adapterIoBaseAddress;
MV_U32 intCoalThre[MV_SATA_UNITS_NUM];
MV_U32 intTimeThre[MV_SATA_UNITS_NUM];
MV_BOOLEAN (*mvSataEventNotify) (struct mvSataAdapter *, MV_EVENT_TYPE, MV_U32, MV_U32);
MV_SATA_CHANNEL *sataChannel[MV_SATA_CHANNELS_NUM];
MV_U32 pciCommand;
MV_U32 pciSerrMask;
MV_U32 pciInterruptMask;
/* Fields set by CORE driver */
MV_SATA_GEN sataAdapterGeneration;
MV_BOOLEAN staggaredSpinup[MV_SATA_CHANNELS_NUM]; /* For 60x1 only */
MV_BOOLEAN limitInterfaceSpeed[MV_SATA_CHANNELS_NUM]; /* For 60x1 only */
MV_SATA_IF_SPEED ifSpeed[MV_SATA_CHANNELS_NUM]; /* For 60x1 only */
MV_SATA_IF_POWER_STATE ifPowerState[MV_SATA_CHANNELS_NUM];
MV_U8 numberOfChannels; /* 4 channels for 504x, 8 for 508x */
MV_U8 numberOfUnits; /* 1 for 504x, 2 for 508x */
MV_U8 portsPerUnit;
MV_OS_SEMAPHORE semaphore;
MV_U32 mainMask;
MV_U32 mainMaskOffset;
MV_U32 mainCauseOffset;
MV_HOST_IF hostInterface;
MV_BOOLEAN interruptsAreMasked;
MV_SATA_INTERRUPT_SCHEME interruptsScheme;
MV_OS_SEMAPHORE interruptsMaskSem;
MV_BOOLEAN chipIs50XXB0;
MV_BOOLEAN chipIs50XXB2;
MV_BOOLEAN chipIs60X1B2;
MV_BOOLEAN chipIs60X1C0;
MV_BOOLEAN chipIs62X1Z0;
MV_BOOLEAN chipIs65XXZ0;
MV_U8 signalAmps[MV_SATA_CHANNELS_NUM];
MV_U8 pre[MV_SATA_CHANNELS_NUM];
struct mvQueuedCommandEntry adapterCommands[_MV_SATA_COMMANDS_PER_ADAPTER];
#ifdef MV_SATA_IO_GRANULARITY
MV_BOOLEAN iogEnabled;
MV_U8 iogFreeIdsStack[MV_IOG_QUEUE_SIZE];
MV_U8 iogFreeIdsNum;
MV_OS_SEMAPHORE iogSemaphore;
#endif
} MV_SATA_ADAPTER;
/* this structure used by the IAL defines the PRD entries used by the EDMA HW */
typedef struct mvSataEdmaPRDEntry {
volatile MV_U32 lowBaseAddr;
volatile MV_U16 byteCount;
volatile MV_U16 flags;
volatile MV_U32 highBaseAddr;
volatile MV_U32 reserved;
} MV_SATA_EDMA_PRD_ENTRY;
/* API Functions */
/* CORE driver Adapter Management */
MV_BOOLEAN mvSataInitAdapter(MV_SATA_ADAPTER *pAdapter);
MV_BOOLEAN mvSataShutdownAdapter(MV_SATA_ADAPTER *pAdapter);
MV_U32 mvSataReadReg(MV_SATA_ADAPTER *pAdapter, MV_U32 regOffset);
MV_VOID mvSataWriteReg(MV_SATA_ADAPTER *pAdapter, MV_U32 regOffset, MV_U32 regValue);
/* CORE driver SATA Channel Management */
MV_BOOLEAN mvSataConfigureChannel(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataRemoveChannel(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataIsStorageDeviceConnected(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex, MV_U32 *SStatus);
MV_BOOLEAN mvSataIfD2HReceived(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex, MV_U8 port);
MV_BOOLEAN mvSataChannelHardReset(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataSetFBSMode(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex,
MV_BOOLEAN enableFBS, MV_BOOLEAN useQueueLen128);
MV_BOOLEAN mvSataConfigEdmaMode(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex,
MV_EDMA_MODE eDmaMode, MV_U8 maxQueueDepth);
MV_BOOLEAN mvSataEnableChannelDma(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataDisableChannelDma(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataFlushDmaQueue(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex, MV_FLUSH_TYPE flushType);
MV_U8 mvSataNumOfDmaCommands(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_U8 mvSataGetNumOfPortQueuedCommands(MV_SATA_ADAPTER *pAdapter,
MV_U8 channelIndex, MV_U8 PMPort, MV_U8 *pCommandsPerChannel);
MV_BOOLEAN mvSataSetIntCoalParams(MV_SATA_ADAPTER *pAdapter, MV_U8 sataUnit, MV_U32 intCoalThre, MV_U32 intTimeThre);
MV_BOOLEAN mvSataSetChannelPhyParams(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex, MV_U8 signalAmps, MV_U8 pre);
MV_BOOLEAN mvSataChannelPhyShutdown(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataChannelPhyPowerOn(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataChannelFarLoopbackDiagnostic(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
/* Queue ATA command */
MV_QUEUE_COMMAND_RESULT mvSataQueueCommand(MV_SATA_ADAPTER *pAdapter,
MV_U8 channelIndex, MV_QUEUE_COMMAND_INFO *pCommandParams);
/* Interrupt Service Routine */
MV_BOOLEAN mvSataInterruptServiceRoutine(MV_SATA_ADAPTER *pAdapter);
MV_BOOLEAN mvSataMaskAdapterInterrupt(MV_SATA_ADAPTER *pAdapter);
MV_BOOLEAN mvSataUnmaskAdapterInterrupt(MV_SATA_ADAPTER *pAdapter);
MV_BOOLEAN mvSataCheckPendingInterrupt(MV_SATA_ADAPTER *pAdapter);
MV_BOOLEAN mvSataSetInterruptsScheme(MV_SATA_ADAPTER *pAdapter, MV_SATA_INTERRUPT_SCHEME interruptScheme);
/*
* Staggered spin-ip support and SATA interface speed control
* (relevant for 60x1 adapters)
*/
MV_BOOLEAN mvSataEnableStaggeredSpinUpAll(MV_SATA_ADAPTER *pAdapter);
MV_BOOLEAN mvSataEnableStaggeredSpinUp(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataDisableStaggeredSpinUpAll(MV_SATA_ADAPTER *pAdapter);
MV_BOOLEAN mvSataDisableStaggeredSpinUp(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataSetInterfaceSpeed(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex, MV_SATA_IF_SPEED ifSpeed);
MV_SATA_IF_SPEED mvSataGetInterfaceSpeed(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataSetInterfacePowerState(MV_SATA_ADAPTER *pAdapter,
MV_U8 channelIndex, MV_SATA_IF_POWER_STATE ifPowerState);
MV_BOOLEAN mvSataGetInterfacePowerState(MV_SATA_ADAPTER *pAdapter,
MV_U8 channelIndex, MV_SATA_IF_POWER_STATE *ifPowerState);
/* Command Completion and Event Notification (user implemented) */
MV_BOOLEAN mvSataEventNotify(MV_SATA_ADAPTER *, MV_EVENT_TYPE, MV_U32, MV_U32);
#ifdef MV_SATA_C2C_COMM
/* Channel 2 Channel communication */
MV_BOOLEAN mvSataC2CInit(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex,
MV_SATA_C2C_MODE mvSataC2CMode, C2CCallBack_t mvSataC2CCallBack);
MV_BOOLEAN mvSataC2CStop(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_BOOLEAN mvSataC2CSendRegisterDeviceToHostFIS(MV_SATA_ADAPTER *pAdapter,
MV_U8 channelIndex,
MV_U8 pmPort,
MV_BOOLEAN bInterrupt, MV_U8 message[MV_C2C_MESSAGE_SIZE]);
MV_BOOLEAN mvSataC2CActivateBmDma(MV_SATA_ADAPTER *pAdapter,
MV_U8 channelIndex,
MV_U8 pmPort, MV_U32 prdTableHi, MV_U32 prdTableLow, MV_UDMA_TYPE dmaType);
MV_BOOLEAN mvSataC2CResetBmDma(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
#endif
#ifdef MV_SATA_IO_GRANULARITY
MV_BOOLEAN mvSataEnableIoGranularity(MV_SATA_ADAPTER *pAdapter, MV_BOOLEAN enable);
#endif
MV_BOOLEAN mvSata60X1B2CheckDevError(MV_SATA_ADAPTER *pAdapter, MV_U8 channelIndex);
MV_STATUS mvSataWinInit(MV_UNIT_WIN_INFO *addrWinMap);
MV_STATUS mvSataWinRead(MV_U32 dev, MV_U32 winNum, MV_UNIT_WIN_INFO *pAddrDecWin);
MV_STATUS mvSataWinWrite(MV_U32 dev, MV_U32 winNum, MV_UNIT_WIN_INFO *pAddrDecWin);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __INCmvSatah */