⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mvialcommonutils.c

📁 此为marvell 6081芯片驱动源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*******************************************************************************
*              (c), Copyright 2001, Marvell International Ltd.                 *
* THIS CODE CONTAINS CONFIDENTIAL INFORMATION OF MARVELL SEMICONDUCTOR, INC.   *
* NO RIGHTS ARE GRANTED HEREIN UNDER ANY PATENT, MASK WORK RIGHT OR COPYRIGHT  *
* OF MARVELL OR ANY THIRD PARTY. MARVELL RESERVES THE RIGHT AT ITS SOLE        *
* DISCRETION TO REQUEST THAT THIS CODE BE IMMEDIATELY RETURNED TO MARVELL.     *
* THIS CODE IS PROVIDED "AS IS". MARVELL MAKES NO WARRANTIES, EXPRESSED,       *
* IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, COMPLETENESS OR PERFORMANCE.   *
********************************************************************************
* mvIALCommon.c
*
* DESCRIPTION:
*       C implementation for IAL's common functions.
*
* DEPENDENCIES:
*       mvIALCommon.h.
*
*******************************************************************************/

/* includes */
#include "mvOs.h"
#include "mvIALCommonUtils.h"


static MV_BOOLEAN mvConfigSataDisk(MV_SATA_ADAPTER *pSataAdapter, 
                                    MV_U8 channelIndex,
                                    MV_U8 PMPort, 
                                    ATA_IDENTIFY_INFO   *pIdentifyInfo,
                                    MV_U16_PTR identifyBuffer);


static MV_VOID mvAta2HostString(MV_U16 *source, MV_U16 *target, 
                                MV_U32 wordsCount)
{
    MV_U32 i;
    for (i=0 ; i < wordsCount; i++)
    {
        /* Big to little*/
        target[i] = (source[i] >> 8) | ((source[i] & 0xff) << 8);
        /* Little to cpu*/
        target[i] = MV_LE16_TO_CPU(target[i]);
    }
}

/******************************************************************************
 *  Name: ParseIdentifyResult
 *
 *  Description:    this functions parses the identify command results, checks
 *                  that the connected deives can be accesed by device EDMA,
 *                  and updates the ATA drive parameters stucture accordingly.
 *
 *  Parameters:     pSataChannel - pointer to the channel data structure.
 *                  pIdentifyInfo- pointer to the ATA parameters structure.
 *
 *  Returns:        MV_TRUE if the ATA drive supported by device.
 *
 ******************************************************************************/
MV_BOOLEAN mvParseIdentifyResult(MV_U16_PTR  iden,
                                 ATA_IDENTIFY_INFO   *pIdentifyInfo)
{
    char    temp[80];
    MV_U32  version;
    MV_BOOLEAN  udmaModeEnabled = MV_FALSE;

    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "Parse IDENTIFY data:\n");

    mvAta2HostString( iden + IDEN_MODEL_OFFSET, (MV_U16_PTR)temp, 24);
    temp[25] = '\0';
    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n","Model", temp);
    memcpy(&pIdentifyInfo->model[0], iden + IDEN_MODEL_OFFSET, IDEN_MODEL_SIZE * 2);
    memcpy(&pIdentifyInfo->firmware[0], iden + IDEN_FIRMWARE_OFFSET,
           IDEN_FIRMWARE_SIZE * 2);
    /* ATA version supported*/
    if (iden[IDEN_ATA_VERSION] & MV_BIT7)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %d\n", "ATA version supported", 7); 
        version = 7;
    }
    else if (iden[IDEN_ATA_VERSION] & MV_BIT6)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %d\n", "ATA version supported", 6); 
        version = 6;
    }
    else if (iden[IDEN_ATA_VERSION] & MV_BIT5)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %d\n", "ATA version supported", 5); 
        version = 5;
    }
    else if (iden[IDEN_ATA_VERSION] & MV_BIT4)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %d\n", "ATA version supported", 4); 
        version = 4;
    }
    else
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, " IDENTIFY info: ATA "
				 "version(%d) not supported\n", iden[IDEN_ATA_VERSION]);
        return MV_FALSE;
    }
    pIdentifyInfo->version = version;
    /*LBA addressing*/
    if ((version >= 6) && (!(iden[IDEN_CAPACITY_1_OFFSET] & MV_BIT9)))
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, " IDENTIFY info: LBA not supported\n");
        return MV_FALSE;
    }
    else
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "Capabilities",
                 "LBA supported");
    }
    /* 48 bit address */
    if ((version >= 6) && (iden[IDEN_SUPPORTED_COMMANDS2] & MV_BIT10))
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "LBA48 addressing", "supported");
        pIdentifyInfo->LBA48Supported = MV_TRUE;

        if ((iden[103]) || (iden[102]))
        {
            mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "WARNING Disk size more "
                     "than 32 bit sectors - setting to 0xffffffff sectors\n");
            pIdentifyInfo->ATADiskSize = 0xffffffff;
        }
        else
        {
            pIdentifyInfo->ATADiskSize = ((MV_U32)iden[101] << 16) | 
                                     ((MV_U32)iden[100]);
        }

        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - 0x%x%04x%04x%04x sectors\n",
                 "Number of sectors", iden[103] , iden[102], iden[101],
                 iden[100]);
    }
    else
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n",
				 "LBA48 addressing", "Not supported");
        pIdentifyInfo->LBA48Supported = MV_FALSE;
        pIdentifyInfo->ATADiskSize = ((MV_U32)iden[IDEN_NUM_OF_ADDRESSABLE_SECTORS + 1] << 16) | 
                                     ((MV_U32)iden[IDEN_NUM_OF_ADDRESSABLE_SECTORS]);

        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - 0x%x sectors\n",
				 "Number of sectors",
                 (iden[IDEN_NUM_OF_ADDRESSABLE_SECTORS + 1] << 16) | 
                 ((MV_U32)iden[IDEN_NUM_OF_ADDRESSABLE_SECTORS]));


    }
    /*DMA support*/
    if ((version >= 6) && (!(iden[IDEN_CAPACITY_1_OFFSET] & MV_BIT8)))
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "IDENTIFY info: DMA not "
				 "supported\n");
        return MV_FALSE;
    }
    else
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "Capabilities",
				 "DMA supported");
    }
    /* PIO */
    if ((iden[IDEN_VALID] & MV_BIT1) == 0)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, " IDENTIFY info: not "
				 "able to find PIO mode\n");
        return MV_FALSE;
    }
    else if (iden[IDEN_PIO_MODE_SPPORTED] & MV_BIT0)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "PIO mode 3",
				 "supported");
        pIdentifyInfo->PIOMode = MV_ATA_TRANSFER_PIO_3;
    }
    else if (iden[IDEN_PIO_MODE_SPPORTED] & MV_BIT1)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "PIO mode 4",
				 "supported");
        pIdentifyInfo->PIOMode = MV_ATA_TRANSFER_PIO_4;
    }
    else
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "IDENTIFY info: PIO "
				 "modes 3 and 4 not supported\n");
        pIdentifyInfo->PIOMode = MV_ATA_TRANSFER_PIO_SLOW;
        return MV_FALSE;
    }


    /*UDMA*/
    if ((iden[IDEN_VALID] & MV_BIT2) == 0)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, " IDENTIFY info: not "
				 "able to find UDMA mode\n");
        return MV_FALSE;
    }


    if ((version >= 7) && (iden[IDEN_UDMA_MODE] & MV_BIT6))
    {
        pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_6;
        if (iden[IDEN_UDMA_MODE] & MV_BIT14)
        {
            udmaModeEnabled = MV_TRUE;
        }
    }
    else if ((version >= 6) && (iden[IDEN_UDMA_MODE] & MV_BIT5))
    {
        pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_5;
        if (iden[IDEN_UDMA_MODE] & MV_BIT13)
        {
            udmaModeEnabled = MV_TRUE;
        }
    }
    else if ((version >= 5) && (iden[IDEN_UDMA_MODE] & MV_BIT4))
    {
        pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_4;
        if (iden[IDEN_UDMA_MODE] & MV_BIT12)
        {
            udmaModeEnabled = MV_TRUE;
        }
    }
    else if ((version >= 4) && (iden[IDEN_UDMA_MODE] & MV_BIT3))
    {
        pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_3;
        if (iden[IDEN_UDMA_MODE] & MV_BIT11)
        {
            udmaModeEnabled = MV_TRUE;
        }
    }
    else if (iden[IDEN_UDMA_MODE] & MV_BIT2)
    {
        pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_2;
        if (iden[IDEN_UDMA_MODE] & MV_BIT10)
        {
            udmaModeEnabled = MV_TRUE;
        }
    }
    else
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "IDENTIFY info: Ultra"
				 " DMA mode < 2 not supported IDENTIFY[88] 0x%04x\n",
				 iden[IDEN_UDMA_MODE]);
        pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_0;
        return MV_FALSE;
    }
    if (udmaModeEnabled == MV_TRUE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s%d%s\n",
				 "Ultra DMA mode","UDMA mode ",
				 pIdentifyInfo->UdmaMode - MV_ATA_TRANSFER_UDMA_0,
				 " supported and enabled");
    }
    else
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s%d%s\n",
				 "Ultra DMA mode","UDMA mode ",
                 pIdentifyInfo->UdmaMode - MV_ATA_TRANSFER_UDMA_0,
                 " supported but disabled");
    }


    if ((iden[IDEN_SUPPORTED_COMMANDS1] & MV_BIT13))
    {
        if (iden[IDEN_ENABLED_COMMANDS1] & MV_BIT13)
        {
            mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %20s\n",
					 "READ BUFFER", "supported and enabled");
        }
        else
        {
            mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %20s\n",
					 "READ BUFFER", "supported and disabled");
        }
    }
    else
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "READ BUFFER",
				 " Not supported");
    }

    if ((iden[IDEN_SUPPORTED_COMMANDS1] & MV_BIT12))
    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -