/******************************************************************************* NAME $RCSfile: sataConfig.c,v $ SUMMARY SATA disgnostics configuration VERSION $Revision: 1.3 $ UPDATE DATE $Date: 2009/09/01 08:42:09 $ PROGRAMMER $Author: lecter $ Copyright 2009 LSI Corporation. All Rights Reserved. DESCRIPTION: The functions used to configure SATA diagnostics REFERENCE: *******************************************************************************/ #define __SRCsataConfig /*** INCLUDES ***/ #include #include #include /*** EXTERNAL REFERENCES ***/ extern UINT8 gExpSATADeviceNum; extern UINT8 gMaxSATADeviceNum; /*** PROCEDURES ***/ /******************************************************************************* * PROCEDURE * * NAME: sataDeviceIsValid * SUMMARY: Verify if thi device is SATA * SCOPE: public * * DESCRIPTION: This function use ata device identification * to verify if the device is SATA * * RETURNS: * * NOTES: * */ BOOLEAN sataDeviceIsValid(struct ata_device* pSATADev) { if(!ata_id_is_ata(pSATADev->id)) return FALSE; if(!ata_id_is_sata(pSATADev->id)) return FALSE; if(!ata_id_has_dma(pSATADev->id)) return FALSE; if(!ata_id_has_lba(pSATADev->id)) return FALSE; if(!ata_id_iordy_disable(pSATADev->id)) return FALSE; if(!ata_id_has_iordy(pSATADev->id)) return FALSE; return TRUE; } /******************************************************************************* * PROCEDURE * * NAME: sataGetDeviceList * SUMMARY: Get the list of SATA device on this ahci controller * SCOPE: public * * DESCRIPTION: This function search all ports of this ahci controll * to generate the attached SATA device list * * RETURNS: * * NOTES: * */ UINT8 sataGetDeviceList(struct pci_dev* pDev, UINT8 idxSATAPort, struct scsi_device** pSCSIDev) { struct ata_host* pSATAHost = NULL; struct ata_port* pSATAPort = NULL; struct ata_device* pSATADev = NULL; UINT8 numSATADev; UINT8 idxDev; numSATADev = 0; for(idxDev = 0; idxDev < gMaxSATADeviceNum; idxDev++) { pSCSIDev[idxDev] = NULL; } pSATAHost = dev_get_drvdata(&pDev->dev); if(idxSATAPort < pSATAHost->n_ports) pSATAPort = pSATAHost->ports[idxSATAPort]; else return 0; // if (!(pSATAPort->flags & ATA_FLAG_DISABLED)) // { // ata_for_each_dev(pSATADev, &pSATAPort->link, ENABLED) // { // if(sataDeviceIsValid(pSATADev)) // { // if(pSATADev->sdev != NULL) // { // pSCSIDev[numSATADev] = pSATADev->sdev; // numSATADev++; // } // } // } // } ata_for_each_dev(pSATADev, &pSATAPort->link, ALL) { if (pSATADev->class != ATA_DEV_UNKNOWN) pSCSIDev[numSATADev] = pSATADev->sdev; numSATADev++; } return numSATADev; } /******************************************************************************* * PROCEDURE * * NAME: sataDiagDevice * SUMMARY: Diagnose if this ahci controller detect SATA device * SCOPE: public * * DESCRIPTION: This function will search all ports of this ahci controller * to check if any SATA device has been detected * * RETURNS: * * NOTES: * */ void sataDiagDevice(struct pci_dev* pDev, UINT8 idxSATAPort, struct scsi_device** pSCSIDev, UINT8* numSATADev) { struct ata_host* pSATAHost = NULL; struct ata_port* pSATAPort = NULL; struct ata_device* pSATADev = NULL; UINT8 idxDev; UINT8 numDev = 0; for(idxDev = 0; idxDev < gMaxSATADeviceNum; idxDev++) { pSCSIDev[idxDev] = NULL; } pSATAHost = dev_get_drvdata(&pDev->dev); if(idxSATAPort < pSATAHost->n_ports) pSATAPort = pSATAHost->ports[idxSATAPort]; else return; // if (!(pSATAPort->flags & ATA_FLAG_DISABLED)) // { // ata_for_each_dev(pSATADev, &pSATAPort->link, ENABLED) // { // if(sataDeviceIsValid(pSATADev)) // { // if(pSATADev->sdev != NULL) // { // pSCSIDev[numDev] = pSATADev->sdev; // numDev++; // } // } // } // } ata_for_each_dev(pSATADev, &pSATAPort->link, ALL) { if (pSATADev->class != ATA_DEV_UNKNOWN) pSCSIDev[numDev] = pSATADev->sdev; numDev++; } *numSATADev = numDev; }