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

📄 mvialcommonutils.c

📁 此为marvell 6081芯片驱动源码
💻 C
📖 第 1 页 / 共 3 页
字号:
*       None.
*
*******************************************************************************/

MV_BOOLEAN mvConfigSataDisk(MV_SATA_ADAPTER *pSataAdapter, MV_U8 channelIndex,
                            MV_U8 PMPort, ATA_IDENTIFY_INFO   *pIdentifyInfo,
                            MV_U16_PTR identifyBuffer)
{
    MV_STORAGE_DEVICE_REGISTERS inATARegs;
    MV_STORAGE_DEVICE_REGISTERS outATARegs;
    /* identify device*/
    memset(&inATARegs, 0, sizeof(inATARegs));
    inATARegs.commandRegister = MV_ATA_COMMAND_IDENTIFY;
    if (mvStorageDevATAIdentifyDevice(pSataAdapter, channelIndex, PMPort,
                                      identifyBuffer)
        == MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: failed "
				 "to perform ATA Identify command\n", pSataAdapter->adapterId,
				 channelIndex, PMPort);
        return MV_FALSE;
    }
#ifdef MV_LOG_DEBUG
    mvLogMsg(MV_RAW_MSG_ID, 0, "Drive [%d,%d,%d] Identify Buffer:\n", 
			 pSataAdapter->adapterId, channelIndex, PMPort);

    printIdentifyBuffer(identifyBuffer);
#endif
    if (mvParseIdentifyResult(identifyBuffer, pIdentifyInfo) == MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: in "
				 "parsing ATA Identify Data\n", pSataAdapter->adapterId,
				 channelIndex, PMPort);
        return MV_FALSE;
    }
    if ((pIdentifyInfo->writeCacheSupported == MV_TRUE) &&
        (pIdentifyInfo->writeCacheEnabled == MV_FALSE))
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG,"[%d %d %d]: Write Cache "
				 "supported but disabled\n", pSataAdapter->adapterId,
				 channelIndex, PMPort);
        memset(&inATARegs, 0, sizeof(inATARegs));
        inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
        inATARegs.featuresRegister = MV_ATA_SET_FEATURES_ENABLE_WCACHE;

        if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
                                   MV_NON_UDMA_PROTOCOL_NON_DATA,
                                   MV_FALSE, NULL,0, &inATARegs, &outATARegs)
            == MV_FALSE)
        {
            mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: "
					 "Set Features failed(ENABLE WCACHE)\n",
					 pSataAdapter->adapterId, channelIndex, PMPort); 
            return MV_FALSE;
        }
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Write Cache "
				 "enabled\n", pSataAdapter->adapterId, channelIndex, PMPort);
    }
    if ((pIdentifyInfo->readAheadSupported == MV_TRUE) &&
        (pIdentifyInfo->readAheadEnabled == MV_FALSE))
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Read Look "
				 "Ahead supported but disabled\n", pSataAdapter->adapterId,
				 channelIndex, PMPort);
        memset(&inATARegs, 0, sizeof(inATARegs));
        inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
        inATARegs.featuresRegister = MV_ATA_SET_FEATURES_ENABLE_RLA;
        if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
                                   MV_NON_UDMA_PROTOCOL_NON_DATA,
                                   MV_FALSE, NULL,0, &inATARegs, &outATARegs)
            == MV_FALSE)
        {
            mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: "
					 "Set Features failed(ENABLE RLA)\n",
					 pSataAdapter->adapterId, channelIndex, PMPort); 
            return MV_FALSE;
        }
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Read Look "
				 "Ahead enabled\n", pSataAdapter->adapterId, channelIndex,
				 PMPort);
    }
    /* mvStorageDevATASetFeatures */

    /* Set transfer mode */
    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Set transfer mode "
			 "XFER_PIO_SLOW\n", pSataAdapter->adapterId, channelIndex, PMPort);
    memset(&inATARegs, 0, sizeof(inATARegs));
    inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
    inATARegs.featuresRegister = MV_ATA_SET_FEATURES_TRANSFER;
    inATARegs.sectorCountRegister = MV_ATA_TRANSFER_PIO_SLOW;
    if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
                               MV_NON_UDMA_PROTOCOL_NON_DATA,
                               MV_FALSE, NULL,0, &inATARegs, &outATARegs) == 
        MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: "
				 "Set Features failed to set XFER PIO SLOW\n",
                 pSataAdapter->adapterId, channelIndex, PMPort);

        return MV_FALSE;
    }

    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Set transfer mode "
			 "XFER_PIO_%d\n", pSataAdapter->adapterId, channelIndex, PMPort,
             pIdentifyInfo->PIOMode - MV_ATA_TRANSFER_PIO_0);

    memset(&inATARegs, 0, sizeof(inATARegs));
    inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
    inATARegs.featuresRegister = MV_ATA_SET_FEATURES_TRANSFER;
    inATARegs.sectorCountRegister = pIdentifyInfo->PIOMode;
    if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
                               MV_NON_UDMA_PROTOCOL_NON_DATA,
                               MV_FALSE, NULL,0, &inATARegs, &outATARegs) == 
        MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: "
				 "Set Features failed to set XFER PIO %d\n",
                 pSataAdapter->adapterId, channelIndex, PMPort,
				 pIdentifyInfo->PIOMode - MV_ATA_TRANSFER_PIO_0);
        return MV_FALSE;
    }


    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Set transfer mode"
			 " XFER_UDMA_%d\n", pSataAdapter->adapterId, channelIndex, PMPort,
             pIdentifyInfo->UdmaMode & 0xf);
    memset(&inATARegs, 0, sizeof(inATARegs));
    inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
    inATARegs.featuresRegister = MV_ATA_SET_FEATURES_TRANSFER;
    inATARegs.sectorCountRegister = pIdentifyInfo->UdmaMode;
    if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
                               MV_NON_UDMA_PROTOCOL_NON_DATA,
                               MV_FALSE, NULL,0, &inATARegs, &outATARegs) == 
        MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: "
				 "Set Features failed to set XFER UDMA %d\n",
                 pSataAdapter->adapterId, channelIndex, PMPort,
				 pIdentifyInfo->UdmaMode & 0xf); 
        return MV_FALSE;
    }
    return MV_TRUE;
}

/*******************************************************************************
* mvInitSataDisk - short description
*
* DESCRIPTION:
*       None.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       None.
*
*******************************************************************************/
MV_BOOLEAN mvInitSataDisk(MV_SATA_ADAPTER   *pSataAdapter, MV_U8 channelIndex,
                          MV_U8 PMPort, ATA_IDENTIFY_INFO   *pIdentifyInfo,
                          MV_U16_PTR identifyBuffer
                         )
{
#if 0
    MV_STORAGE_DEVICE_REGISTERS mvStorageDevRegisters;
    MV_SATA_DEVICE_TYPE deviceType;    

    /* Software reset channel */
    if (mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex, PMPort,
                                       &mvStorageDevRegisters)== MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: Software reset "
                 "failed\n", pSataAdapter->adapterId, channelIndex, PMPort);
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR," ATA Drive Registers:\n");
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","Error", mvStorageDevRegisters.errorRegister);
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","SectorCount", mvStorageDevRegisters.sectorCountRegister);
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","LBA Low", mvStorageDevRegisters.lbaLowRegister);
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","LBA Mid", mvStorageDevRegisters.lbaMidRegister);
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","LBA High", mvStorageDevRegisters.lbaHighRegister);
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","Device", mvStorageDevRegisters.deviceRegister);
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","Status", mvStorageDevRegisters.statusRegister);
        /* Software reset PM */
        mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex,
                                       MV_SATA_PM_CONTROL_PORT, NULL);
        /*if sw reset of the drive didn't finished, estabisl sama comm  */
        /*again and don't clear s-error so D2H Fis will be blocked      */
        mvPMDevEnableStaggeredSpinUp(pSataAdapter,channelIndex , PMPort);
        return MV_FALSE;
    }

    if (mvStorageDevRegisters.errorRegister != 1)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: Device Diagnostics "
                 "failed\n", pSataAdapter->adapterId, channelIndex, PMPort);
        return MV_FALSE;   
    }


    deviceType = mvGetSataDeviceType(&mvStorageDevRegisters);
    if (deviceType != MV_SATA_DEVICE_TYPE_ATA_DISK)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: Bad Device"
				 " Type (%d) failed\n", pSataAdapter->adapterId, channelIndex,
				 PMPort, deviceType);
        return MV_FALSE;   
    }
#endif
    if (mvConfigSataDisk(pSataAdapter, channelIndex, PMPort, pIdentifyInfo,
                         identifyBuffer) == MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: Failed to"
				 " Config Device\n", pSataAdapter->adapterId, channelIndex,
				 PMPort);
        if (mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex, PMPort,
                                           NULL)== MV_FALSE)
        {
            mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: "
					 "Software reset failed\n", pSataAdapter->adapterId,
					 channelIndex, PMPort);
            /* Software reset PM */
            mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex,
                                           MV_SATA_PM_CONTROL_PORT, NULL);

        }
        return MV_FALSE;
    }
    return MV_TRUE;
}
MV_BOOLEAN  mvGetPMDeviceInfo(MV_SATA_ADAPTER   *pSataAdapter,
                              MV_U8 channelIndex, 
                              MV_SATA_PM_DEVICE_INFO *pPMDeviceInfo)
{
    MV_U32  regVal;

    if (mvPMDevReadReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
                       MV_SATA_GSCR_ID_REG_NUM, &regVal, NULL) == MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: "
                 "mvGetPMDeviceInfo Failed", pSataAdapter->adapterId,
				 channelIndex);
        return MV_FALSE;
    }
    pPMDeviceInfo->vendorId = (MV_U16)(regVal & 0xffff); 
    pPMDeviceInfo->deviceId = (MV_U16)((regVal & 0xffff0000) >> 16);

    if (mvPMDevReadReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
                       MV_SATA_GSCR_REVISION_REG_NUM, &regVal, NULL)== MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: "
                 "mvGetPMDeviceInfo Failed", pSataAdapter->adapterId,
                 channelIndex);
        return MV_FALSE;
    }

    pPMDeviceInfo->PMSpecRevision = (MV_U8)(regVal & 0xff); 
    pPMDeviceInfo->productRevision = (MV_U8)((regVal & 0xff00) >> 8);

    if (mvPMDevReadReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
                       MV_SATA_GSCR_INFO_REG_NUM, &regVal, NULL)== MV_FALSE)
    {
        mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: "
                 "mvGetPMDeviceInfo Failed", pSataAdapter->adapterId,
                 channelIndex);
        return MV_FALSE;
    }
    pPMDeviceInfo->numberOfPorts = CT_MAX_PMPort; //修改 —— 将(MV_U8)(regVal & 0xf);改为CT_MAX_PMPort即4;

    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d]: PM Information:\n",
             pSataAdapter->adapterId,channelIndex);
    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %04x\n", "Vendor Id", pPMDeviceInfo->vendorId);
    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %04x\n", "Device Id", pPMDeviceInfo->deviceId);
    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %02x\n", "Product Revision", pPMDeviceInfo->productRevision);
    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %02x\n", "Spec Revision", pPMDeviceInfo->PMSpecRevision);
    mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %02x\n", "Fan-out ports", pPMDeviceInfo->numberOfPorts);
    return MV_TRUE;
}

⌨️ 快捷键说明

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