/******************************************************************************* NAME $RCSfile: commSCSI.c,v $ SUMMARY Report mechanism for PikesPeak VERSION $Revision: 1.1 $ UPDATE DATE $Date: 2009/07/14 04:18:00 $ PROGRAMMER $Author: lecter $ Copyright 2009 LSI Corporation. All Rights Reserved. DESCRIPTION: The functions used to report diagnostics status REFERENCE: *******************************************************************************/ /*** INCLUDES ***/ #include #include #include #include #include #include #include #include /*** PROCEDURES ***/ /******************************************************************************* * PROCEDURE * * NAME: scsiWrite * SUMMARY: Write to a SCSI device * SCOPE: public * * DESCRIPTION: This function use the start lba and transfer length to build a SCSI WRITE command * * RETURNS: * * NOTES: * */ PUBLIC INT32 scsiWrite(struct scsi_device *pSCSIDev, UINT32 startLBA, UINT32 length, VOID *pBuffer) { UINT8 cmd[BLK_MAX_CDB]; INT32 result; INT32 senseValid; INT32 reqLen; struct scsi_sense_hdr sshdr; //set up WRITE_10 cdb cmd[0] = WRITE_10; cmd[1] = 0; cmd[2] = (startLBA >> 24) & 0xFF; cmd[3] = (startLBA >> 16) & 0xFF; cmd[4] = (startLBA >> 8) & 0xFF; cmd[5] = (startLBA) & 0xFF; cmd[6] = 0; cmd[7] = (length >> 8) & 0xFF; cmd[8] = (length) & 0xFF; cmd[9] = 0; result = scsi_execute_req(pSCSIDev, cmd, DMA_TO_DEVICE, pBuffer, length * pSCSIDev->sector_size, &sshdr, SD_TIMEOUT, SD_MAX_RETRIES, &reqLen); if (result) { scsi_show_result(result); senseValid = scsi_sense_valid(&sshdr); if (driver_byte(result) & DRIVER_SENSE) { scsi_show_sense_hdr(&sshdr); scsi_show_extd_sense(sshdr.asc, sshdr.ascq); } else printk("Error: [SCSI] write sense not available.\n"); } return result; } /******************************************************************************* * PROCEDURE * * NAME: scsiRead * SUMMARY: Report the progress in the diagnostics * SCOPE: public * * DESCRIPTION: This function used to show the progress of a diagnostics * * RETURNS: * * NOTES: * */ PUBLIC INT32 scsiRead(struct scsi_device *pSCSIDev, UINT32 startLBA, UINT32 length, VOID *pBuffer) { UINT8 cmd[BLK_MAX_CDB]; INT32 result; INT32 senseValid; INT32 reqLen; struct scsi_sense_hdr sshdr; //set up READ_10 cdb cmd[0] = READ_10; cmd[1] = 0; cmd[2] = (startLBA >> 24) & 0xFF; cmd[3] = (startLBA >> 16) & 0xFF; cmd[4] = (startLBA >> 8) & 0xFF; cmd[5] = (startLBA) & 0xFF; cmd[6] = 0; cmd[7] = (length >> 8) & 0xFF; cmd[8] = (length) & 0xFF; cmd[9] = 0; result = scsi_execute_req(pSCSIDev, cmd, DMA_FROM_DEVICE, pBuffer, length * pSCSIDev->sector_size, &sshdr, SD_TIMEOUT, SD_MAX_RETRIES, &reqLen); if (result) { scsi_show_result(result); senseValid = scsi_sense_valid(&sshdr); if (driver_byte(result) & DRIVER_SENSE) { scsi_show_sense_hdr(&sshdr); scsi_show_extd_sense(sshdr.asc, sshdr.ascq); } else printk("Error: [SCSI] read sense not available.\n"); } return result; } /******************************************************************************* * PROCEDURE * * NAME: scsiReadCapacity * SUMMARY: Report the progress in the diagnostics * SCOPE: public * * DESCRIPTION: This function used to show the progress of a diagnostics * * RETURNS: * * NOTES: * */ PUBLIC INT32 scsiReadCapacity(struct scsi_device *pSCSIDev, VOID *pBuffer) { UINT8 cmd[BLK_MAX_CDB]; INT32 result; INT32 senseValid; struct scsi_sense_hdr sshdr; //set up READ_CAPACITY cdb cmd[0] = READ_CAPACITY; memset((void *) &cmd[1], 0, 9); memset((void *) pBuffer, 0, 8); result = scsi_execute_req(pSCSIDev, cmd, DMA_FROM_DEVICE, pBuffer, 8, &sshdr, SD_TIMEOUT, SD_MAX_RETRIES, NULL); if (result) { scsi_show_result(result); senseValid = scsi_sense_valid(&sshdr); if (driver_byte(result) & DRIVER_SENSE) { scsi_show_sense_hdr(&sshdr); scsi_show_extd_sense(sshdr.asc, sshdr.ascq); } else printk("Error: [SCSI] read capacity sense not available.\n"); } return result; }