1*4e1bc9a0SAchim Leubner /******************************************************************************* 2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3*4e1bc9a0SAchim Leubner * 4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided 5*4e1bc9a0SAchim Leubner *that the following conditions are met: 6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7*4e1bc9a0SAchim Leubner *following disclaimer. 8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice, 9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided 10*4e1bc9a0SAchim Leubner *with the distribution. 11*4e1bc9a0SAchim Leubner * 12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20*4e1bc9a0SAchim Leubner * 21*4e1bc9a0SAchim Leubner * 22*4e1bc9a0SAchim Leubner ********************************************************************************/ 23*4e1bc9a0SAchim Leubner #ifndef __SMDEFS_H__ 24*4e1bc9a0SAchim Leubner #define __SMDEFS_H__ 25*4e1bc9a0SAchim Leubner 26*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/ossa.h> 27*4e1bc9a0SAchim Leubner 28*4e1bc9a0SAchim Leubner /* the index for memory requirement, must be continious */ 29*4e1bc9a0SAchim Leubner #define SM_ROOT_MEM_INDEX 0 /**< the index of dm root memory */ 30*4e1bc9a0SAchim Leubner #define SM_DEVICE_MEM_INDEX 1 /**< the index of Device descriptors memory */ 31*4e1bc9a0SAchim Leubner #define SM_IO_MEM_INDEX 2 /**< the index of IO command descriptors memory */ 32*4e1bc9a0SAchim Leubner 33*4e1bc9a0SAchim Leubner 34*4e1bc9a0SAchim Leubner #define SM_MAX_DEV 256 35*4e1bc9a0SAchim Leubner #define SM_MAX_IO 1024 36*4e1bc9a0SAchim Leubner 37*4e1bc9a0SAchim Leubner #define SM_USECS_PER_TICK 1000000 /**< defines the heart beat of the LL layer 10ms */ 38*4e1bc9a0SAchim Leubner 39*4e1bc9a0SAchim Leubner enum sm_locks_e 40*4e1bc9a0SAchim Leubner { 41*4e1bc9a0SAchim Leubner SM_TIMER_LOCK = 0, 42*4e1bc9a0SAchim Leubner SM_DEVICE_LOCK, 43*4e1bc9a0SAchim Leubner SM_INTERNAL_IO_LOCK, 44*4e1bc9a0SAchim Leubner SM_EXTERNAL_IO_LOCK, 45*4e1bc9a0SAchim Leubner SM_NCQ_TAG_LOCK, 46*4e1bc9a0SAchim Leubner SM_TBD_LOCK, 47*4e1bc9a0SAchim Leubner SM_MAX_LOCKS 48*4e1bc9a0SAchim Leubner }; 49*4e1bc9a0SAchim Leubner 50*4e1bc9a0SAchim Leubner /* ATA device type */ 51*4e1bc9a0SAchim Leubner #define SATA_ATA_DEVICE 0x01 /**< ATA ATA device type */ 52*4e1bc9a0SAchim Leubner #define SATA_ATAPI_DEVICE 0x02 /**< ATA ATAPI device type */ 53*4e1bc9a0SAchim Leubner #define SATA_PM_DEVICE 0x03 /**< ATA PM device type */ 54*4e1bc9a0SAchim Leubner #define SATA_SEMB_DEVICE 0x04 /**< ATA SEMB device type */ 55*4e1bc9a0SAchim Leubner #define SATA_SEMB_WO_SEP_DEVICE 0x05 /**< ATA SEMB without SEP device type */ 56*4e1bc9a0SAchim Leubner #define UNKNOWN_DEVICE 0xFF 57*4e1bc9a0SAchim Leubner 58*4e1bc9a0SAchim Leubner /* 59*4e1bc9a0SAchim Leubner * FIS type 60*4e1bc9a0SAchim Leubner */ 61*4e1bc9a0SAchim Leubner #define PIO_SETUP_DEV_TO_HOST_FIS 0x5F 62*4e1bc9a0SAchim Leubner #define REG_DEV_TO_HOST_FIS 0x34 63*4e1bc9a0SAchim Leubner #define SET_DEV_BITS_FIS 0xA1 64*4e1bc9a0SAchim Leubner 65*4e1bc9a0SAchim Leubner /* 66*4e1bc9a0SAchim Leubner * ATA Command code 67*4e1bc9a0SAchim Leubner */ 68*4e1bc9a0SAchim Leubner #define SAT_READ_FPDMA_QUEUED 0x60 69*4e1bc9a0SAchim Leubner #define SAT_READ_DMA_EXT 0x25 70*4e1bc9a0SAchim Leubner #define SAT_READ_DMA 0xC8 71*4e1bc9a0SAchim Leubner #define SAT_WRITE_FPDMA_QUEUED 0x61 72*4e1bc9a0SAchim Leubner #define SAT_WRITE_DMA_EXT 0x35 73*4e1bc9a0SAchim Leubner #define SAT_WRITE_DMA_FUA_EXT 0x3D 74*4e1bc9a0SAchim Leubner #define SAT_WRITE_DMA 0xCA 75*4e1bc9a0SAchim Leubner #define SAT_CHECK_POWER_MODE 0xE5 76*4e1bc9a0SAchim Leubner #define SAT_READ_LOG_EXT 0x2F 77*4e1bc9a0SAchim Leubner #define SAT_READ_VERIFY_SECTORS 0x40 78*4e1bc9a0SAchim Leubner #define SAT_READ_VERIFY_SECTORS_EXT 0x42 79*4e1bc9a0SAchim Leubner #define SAT_SMART 0xB0 80*4e1bc9a0SAchim Leubner #define SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE 0xD4 81*4e1bc9a0SAchim Leubner #define SAT_SMART_RETURN_STATUS 0xDA 82*4e1bc9a0SAchim Leubner #define SAT_SMART_READ_LOG 0xD5 83*4e1bc9a0SAchim Leubner #define SAT_SMART_ENABLE_OPERATIONS 0xD8 84*4e1bc9a0SAchim Leubner #define SAT_SMART_DISABLE_OPERATIONS 0xD9 85*4e1bc9a0SAchim Leubner #define SAT_FLUSH_CACHE 0xE7 86*4e1bc9a0SAchim Leubner #define SAT_FLUSH_CACHE_EXT 0xEA 87*4e1bc9a0SAchim Leubner #define SAT_STANDBY 0xE2 88*4e1bc9a0SAchim Leubner #define SAT_MEDIA_EJECT 0xED 89*4e1bc9a0SAchim Leubner #define SAT_WRITE_SECTORS 0x30 90*4e1bc9a0SAchim Leubner #define SAT_WRITE_SECTORS_EXT 0x34 91*4e1bc9a0SAchim Leubner #define SAT_READ_SECTORS 0x20 92*4e1bc9a0SAchim Leubner #define SAT_READ_SECTORS_EXT 0x24 93*4e1bc9a0SAchim Leubner #define SAT_GET_MEDIA_STATUS 0xDA 94*4e1bc9a0SAchim Leubner #define SAT_SET_FEATURES 0xEF 95*4e1bc9a0SAchim Leubner #define SAT_IDENTIFY_DEVICE 0xEC 96*4e1bc9a0SAchim Leubner #define SAT_READ_BUFFER 0xE4 97*4e1bc9a0SAchim Leubner #define SAT_WRITE_BUFFER 0xE8 98*4e1bc9a0SAchim Leubner 99*4e1bc9a0SAchim Leubner /* 100*4e1bc9a0SAchim Leubner * ATAPI Command code 101*4e1bc9a0SAchim Leubner */ 102*4e1bc9a0SAchim Leubner #define SAT_IDENTIFY_PACKET_DEVICE 0xA1 103*4e1bc9a0SAchim Leubner #define SAT_PACKET 0xA0 104*4e1bc9a0SAchim Leubner #define SAT_DEVICE_RESET 0x08 105*4e1bc9a0SAchim Leubner #define SAT_EXECUTE_DEVICE_DIAGNOSTIC 0x90 106*4e1bc9a0SAchim Leubner 107*4e1bc9a0SAchim Leubner 108*4e1bc9a0SAchim Leubner /* 109*4e1bc9a0SAchim Leubner * ATA Status Register Mask 110*4e1bc9a0SAchim Leubner */ 111*4e1bc9a0SAchim Leubner #define ERR_ATA_STATUS_MASK 0x01 /* Error/check bit */ 112*4e1bc9a0SAchim Leubner #define DRQ_ATA_STATUS_MASK 0x08 /* Data Request bit */ 113*4e1bc9a0SAchim Leubner #define DF_ATA_STATUS_MASK 0x20 /* Device Fault bit */ 114*4e1bc9a0SAchim Leubner #define DRDY_ATA_STATUS_MASK 0x40 /* Device Ready bit */ 115*4e1bc9a0SAchim Leubner #define BSY_ATA_STATUS_MASK 0x80 /* Busy bit */ 116*4e1bc9a0SAchim Leubner 117*4e1bc9a0SAchim Leubner /* 118*4e1bc9a0SAchim Leubner * ATA Error Register Mask 119*4e1bc9a0SAchim Leubner */ 120*4e1bc9a0SAchim Leubner #define NM_ATA_ERROR_MASK 0x02 /* No media present bit */ 121*4e1bc9a0SAchim Leubner #define ABRT_ATA_ERROR_MASK 0x04 /* Command aborted bit */ 122*4e1bc9a0SAchim Leubner #define MCR_ATA_ERROR_MASK 0x08 /* Media change request bit */ 123*4e1bc9a0SAchim Leubner #define IDNF_ATA_ERROR_MASK 0x10 /* Address not found bit */ 124*4e1bc9a0SAchim Leubner #define MC_ATA_ERROR_MASK 0x20 /* Media has changed bit */ 125*4e1bc9a0SAchim Leubner #define UNC_ATA_ERROR_MASK 0x40 /* Uncorrectable data error bit */ 126*4e1bc9a0SAchim Leubner #define ICRC_ATA_ERROR_MASK 0x80 /* Interface CRC error bit */ 127*4e1bc9a0SAchim Leubner 128*4e1bc9a0SAchim Leubner 129*4e1bc9a0SAchim Leubner 130*4e1bc9a0SAchim Leubner 131*4e1bc9a0SAchim Leubner /* 132*4e1bc9a0SAchim Leubner * transfer length and LBA limit 2^28 See identify device data word 61:60 133*4e1bc9a0SAchim Leubner * ATA spec p125 134*4e1bc9a0SAchim Leubner * 7 zeros 135*4e1bc9a0SAchim Leubner */ 136*4e1bc9a0SAchim Leubner #define SAT_TR_LBA_LIMIT 0x10000000 137*4e1bc9a0SAchim Leubner 138*4e1bc9a0SAchim Leubner /* 139*4e1bc9a0SAchim Leubner * transfer length and LBA limit 2^48 See identify device data word 61:60 140*4e1bc9a0SAchim Leubner * ATA spec p125 141*4e1bc9a0SAchim Leubner * 12 zeros 142*4e1bc9a0SAchim Leubner */ 143*4e1bc9a0SAchim Leubner #define SAT_EXT_TR_LBA_LIMIT 0x1000000000000 144*4e1bc9a0SAchim Leubner 145*4e1bc9a0SAchim Leubner 146*4e1bc9a0SAchim Leubner /* 147*4e1bc9a0SAchim Leubner * ATA command type. This is for setting LBA, Sector Count 148*4e1bc9a0SAchim Leubner */ 149*4e1bc9a0SAchim Leubner #define SAT_NON_EXT_TYPE 0 150*4e1bc9a0SAchim Leubner #define SAT_EXT_TYPE 1 151*4e1bc9a0SAchim Leubner #define SAT_FP_TYPE 2 152*4e1bc9a0SAchim Leubner 153*4e1bc9a0SAchim Leubner 154*4e1bc9a0SAchim Leubner /* 155*4e1bc9a0SAchim Leubner * Report LUNs response data. 156*4e1bc9a0SAchim Leubner */ 157*4e1bc9a0SAchim Leubner typedef struct smScsiReportLun_s 158*4e1bc9a0SAchim Leubner { 159*4e1bc9a0SAchim Leubner bit8 len[4]; 160*4e1bc9a0SAchim Leubner bit32 reserved; 161*4e1bc9a0SAchim Leubner tiLUN_t lunList[1]; 162*4e1bc9a0SAchim Leubner } smScsiReportLun_t; 163*4e1bc9a0SAchim Leubner 164*4e1bc9a0SAchim Leubner /* Inquiry vendor string */ 165*4e1bc9a0SAchim Leubner #define AG_SAT_VENDOR_ID_STRING "ATA " 166*4e1bc9a0SAchim Leubner 167*4e1bc9a0SAchim Leubner /* 168*4e1bc9a0SAchim Leubner * Simple form of SATA Identify Device Data, similar definition is defined by 169*4e1bc9a0SAchim Leubner * LL Layer as agsaSATAIdentifyData_t. 170*4e1bc9a0SAchim Leubner */ 171*4e1bc9a0SAchim Leubner typedef struct satSimpleSATAIdentifyData_s 172*4e1bc9a0SAchim Leubner { 173*4e1bc9a0SAchim Leubner bit16 word[256]; 174*4e1bc9a0SAchim Leubner } satSimpleSATAIdentifyData_t; 175*4e1bc9a0SAchim Leubner 176*4e1bc9a0SAchim Leubner 177*4e1bc9a0SAchim Leubner /* 178*4e1bc9a0SAchim Leubner * READ LOG EXT page 10h 179*4e1bc9a0SAchim Leubner */ 180*4e1bc9a0SAchim Leubner typedef struct satReadLogExtPage10h_s 181*4e1bc9a0SAchim Leubner { 182*4e1bc9a0SAchim Leubner bit8 byte[512]; 183*4e1bc9a0SAchim Leubner } satReadLogExtPage10h_t; 184*4e1bc9a0SAchim Leubner 185*4e1bc9a0SAchim Leubner /* 186*4e1bc9a0SAchim Leubner * READ LOG EXT Extended Self-test log 187*4e1bc9a0SAchim Leubner * ATA Table27 p196 188*4e1bc9a0SAchim Leubner */ 189*4e1bc9a0SAchim Leubner typedef struct satReadLogExtSelfTest_s 190*4e1bc9a0SAchim Leubner { 191*4e1bc9a0SAchim Leubner bit8 byte[512]; 192*4e1bc9a0SAchim Leubner } satReadLogExtSelfTest_t; 193*4e1bc9a0SAchim Leubner 194*4e1bc9a0SAchim Leubner /* 195*4e1bc9a0SAchim Leubner * SMART READ LOG Self-test log 196*4e1bc9a0SAchim Leubner * ATA Table60 p296 197*4e1bc9a0SAchim Leubner */ 198*4e1bc9a0SAchim Leubner typedef struct satSmartReadLogSelfTest_s 199*4e1bc9a0SAchim Leubner { 200*4e1bc9a0SAchim Leubner bit8 byte[512]; 201*4e1bc9a0SAchim Leubner } satSmartReadLogSelfTest_t; 202*4e1bc9a0SAchim Leubner 203*4e1bc9a0SAchim Leubner 204*4e1bc9a0SAchim Leubner /* 205*4e1bc9a0SAchim Leubner * Flag definition for satIntFlag field in smSatInternalIo_t. 206*4e1bc9a0SAchim Leubner */ 207*4e1bc9a0SAchim Leubner 208*4e1bc9a0SAchim Leubner /* Original NCQ I/O already completed, so at the completion of READ LOG EXT 209*4e1bc9a0SAchim Leubner * page 10h, ignore the TAG tranaltion to get the failed I/O 210*4e1bc9a0SAchim Leubner */ 211*4e1bc9a0SAchim Leubner #define AG_SAT_INT_IO_FLAG_ORG_IO_COMPLETED 0x00000001 212*4e1bc9a0SAchim Leubner 213*4e1bc9a0SAchim Leubner #define INQUIRY_SUPPORTED_VPD_PAGE 0x00 214*4e1bc9a0SAchim Leubner #define INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE 0x80 215*4e1bc9a0SAchim Leubner #define INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE 0x83 216*4e1bc9a0SAchim Leubner #define INQUIRY_ATA_INFORMATION_VPD_PAGE 0x89 217*4e1bc9a0SAchim Leubner #define INQUIRY_BLOCK_DEVICE_CHARACTERISTICS_VPD_PAGE 0xB1 218*4e1bc9a0SAchim Leubner 219*4e1bc9a0SAchim Leubner #define MODESENSE_CONTROL_PAGE 0x0A 220*4e1bc9a0SAchim Leubner #define MODESENSE_READ_WRITE_ERROR_RECOVERY_PAGE 0x01 221*4e1bc9a0SAchim Leubner #define MODESENSE_CACHING 0x08 222*4e1bc9a0SAchim Leubner #define MODESENSE_INFORMATION_EXCEPTION_CONTROL_PAGE 0x1C 223*4e1bc9a0SAchim Leubner #define MODESENSE_RETURN_ALL_PAGES 0x3F 224*4e1bc9a0SAchim Leubner #define MODESENSE_VENDOR_SPECIFIC_PAGE 0x00 225*4e1bc9a0SAchim Leubner 226*4e1bc9a0SAchim Leubner #define MODESELECT_CONTROL_PAGE 0x0A 227*4e1bc9a0SAchim Leubner #define MODESELECT_READ_WRITE_ERROR_RECOVERY_PAGE 0x01 228*4e1bc9a0SAchim Leubner #define MODESELECT_CACHING 0x08 229*4e1bc9a0SAchim Leubner #define MODESELECT_INFORMATION_EXCEPTION_CONTROL_PAGE 0x1C 230*4e1bc9a0SAchim Leubner #define MODESELECT_RETURN_ALL_PAGES 0x3F 231*4e1bc9a0SAchim Leubner #define MODESELECT_VENDOR_SPECIFIC_PAGE 0x00 232*4e1bc9a0SAchim Leubner 233*4e1bc9a0SAchim Leubner #define LOGSENSE_SUPPORTED_LOG_PAGES 0x00 234*4e1bc9a0SAchim Leubner #define LOGSENSE_SELFTEST_RESULTS_PAGE 0x10 235*4e1bc9a0SAchim Leubner #define LOGSENSE_INFORMATION_EXCEPTIONS_PAGE 0x2F 236*4e1bc9a0SAchim Leubner 237*4e1bc9a0SAchim Leubner 238*4e1bc9a0SAchim Leubner /* 239*4e1bc9a0SAchim Leubner * Bit mask definition 240*4e1bc9a0SAchim Leubner */ 241*4e1bc9a0SAchim Leubner #define SCSI_EVPD_MASK 0x01 242*4e1bc9a0SAchim Leubner #define SCSI_IMMED_MASK 0x01 243*4e1bc9a0SAchim Leubner #define SCSI_NACA_MASK 0x04 244*4e1bc9a0SAchim Leubner #define SCSI_LINK_MASK 0x01 245*4e1bc9a0SAchim Leubner #define SCSI_PF_MASK 0x10 246*4e1bc9a0SAchim Leubner #define SCSI_DEVOFFL_MASK 0x02 247*4e1bc9a0SAchim Leubner #define SCSI_UNITOFFL_MASK 0x01 248*4e1bc9a0SAchim Leubner #define SCSI_START_MASK 0x01 249*4e1bc9a0SAchim Leubner #define SCSI_LOEJ_MASK 0x02 250*4e1bc9a0SAchim Leubner #define SCSI_NM_MASK 0x02 251*4e1bc9a0SAchim Leubner #define SCSI_FLUSH_CACHE_IMMED_MASK 0x02 252*4e1bc9a0SAchim Leubner #define SCSI_FUA_NV_MASK 0x02 253*4e1bc9a0SAchim Leubner #define SCSI_VERIFY_BYTCHK_MASK 0x02 254*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_IMMED_MASK 0x02 255*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_FOV_MASK 0x80 256*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_DCRT_MASK 0x20 257*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_IP_MASK 0x08 258*4e1bc9a0SAchim Leubner #define SCSI_WRITE_SAME_LBDATA_MASK 0x02 259*4e1bc9a0SAchim Leubner #define SCSI_WRITE_SAME_PBDATA_MASK 0x04 260*4e1bc9a0SAchim Leubner #define SCSI_SYNC_CACHE_IMMED_MASK 0x02 261*4e1bc9a0SAchim Leubner #define SCSI_WRITE_N_VERIFY_BYTCHK_MASK 0x02 262*4e1bc9a0SAchim Leubner #define SCSI_SEND_DIAGNOSTIC_SELFTEST_MASK 0x04 263*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_DEFECT_LIST_FORMAT_MASK 0x07 264*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_FMTDATA_MASK 0x10 265*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_DCRT_MASK 0x20 266*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_CMPLIST_MASK 0x08 267*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_LONGLIST_MASK 0x20 268*4e1bc9a0SAchim Leubner #define SCSI_READ10_FUA_MASK 0x08 269*4e1bc9a0SAchim Leubner #define SCSI_READ12_FUA_MASK 0x08 270*4e1bc9a0SAchim Leubner #define SCSI_READ16_FUA_MASK 0x08 271*4e1bc9a0SAchim Leubner #define SCSI_WRITE10_FUA_MASK 0x08 272*4e1bc9a0SAchim Leubner #define SCSI_WRITE12_FUA_MASK 0x08 273*4e1bc9a0SAchim Leubner #define SCSI_WRITE16_FUA_MASK 0x08 274*4e1bc9a0SAchim Leubner #define SCSI_READ_CAPACITY10_PMI_MASK 0x01 275*4e1bc9a0SAchim Leubner #define SCSI_READ_CAPACITY16_PMI_MASK 0x01 276*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE6_PC_MASK 0xC0 277*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE6_PAGE_CODE_MASK 0x3F 278*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE10_PC_MASK 0xC0 279*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE10_LLBAA_MASK 0x10 280*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE10_PAGE_CODE_MASK 0x3F 281*4e1bc9a0SAchim Leubner #define SCSI_SEND_DIAGNOSTIC_TEST_CODE_MASK 0xE0 282*4e1bc9a0SAchim Leubner #define SCSI_LOG_SENSE_PAGE_CODE_MASK 0x3F 283*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_PF_MASK 0x10 284*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_AWRE_MASK 0x80 285*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_RC_MASK 0x10 286*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_EER_MASK 0x08 287*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_PER_MASK 0x04 288*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_DTE_MASK 0x02 289*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_DCR_MASK 0x01 290*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_WCE_MASK 0x04 291*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_DRA_MASK 0x20 292*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_PERF_MASK 0x80 293*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_TEST_MASK 0x04 294*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_DEXCPT_MASK 0x08 295*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_PF_MASK 0x10 296*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_LONGLBA_MASK 0x01 297*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_AWRE_MASK 0x80 298*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_RC_MASK 0x10 299*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_EER_MASK 0x08 300*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_PER_MASK 0x04 301*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_DTE_MASK 0x02 302*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_DCR_MASK 0x01 303*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_WCE_MASK 0x04 304*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_DRA_MASK 0x20 305*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_PERF_MASK 0x80 306*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_TEST_MASK 0x04 307*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_DEXCPT_MASK 0x08 308*4e1bc9a0SAchim Leubner #define SCSI_WRITE_N_VERIFY10_FUA_MASK 0x08 309*4e1bc9a0SAchim Leubner #define SCSI_REQUEST_SENSE_DESC_MASK 0x01 310*4e1bc9a0SAchim Leubner #define SCSI_READ_BUFFER_MODE_MASK 0x1F 311*4e1bc9a0SAchim Leubner 312*4e1bc9a0SAchim Leubner #define ATA_REMOVABLE_MEDIA_DEVICE_MASK 0x80 313*4e1bc9a0SAchim Leubner #define SCSI_REASSIGN_BLOCKS_LONGLIST_MASK 0x01 314*4e1bc9a0SAchim Leubner #define SCSI_REASSIGN_BLOCKS_LONGLBA_MASK 0x02 315*4e1bc9a0SAchim Leubner 316*4e1bc9a0SAchim Leubner 317*4e1bc9a0SAchim Leubner #define SENSE_DATA_LENGTH 0x12 /* 18 */ 318*4e1bc9a0SAchim Leubner #define SELFTEST_RESULTS_LOG_PAGE_LENGTH 404 319*4e1bc9a0SAchim Leubner #define INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH 11 320*4e1bc9a0SAchim Leubner #define ZERO_MEDIA_SERIAL_NUMBER_LENGTH 8 321*4e1bc9a0SAchim Leubner 322*4e1bc9a0SAchim Leubner #define LOG_SENSE_0 0 323*4e1bc9a0SAchim Leubner #define LOG_SENSE_1 1 324*4e1bc9a0SAchim Leubner #define LOG_SENSE_2 2 325*4e1bc9a0SAchim Leubner 326*4e1bc9a0SAchim Leubner #define READ_BUFFER_DATA_MODE 0x02 327*4e1bc9a0SAchim Leubner #define READ_BUFFER_DESCRIPTOR_MODE 0x03 328*4e1bc9a0SAchim Leubner #define READ_BUFFER_DESCRIPTOR_MODE_DATA_LEN 0x04 329*4e1bc9a0SAchim Leubner 330*4e1bc9a0SAchim Leubner #define WRITE_BUFFER_DATA_MODE 0x02 331*4e1bc9a0SAchim Leubner #define WRITE_BUFFER_DL_MICROCODE_SAVE_MODE 0x05 332*4e1bc9a0SAchim Leubner 333*4e1bc9a0SAchim Leubner /* bit mask */ 334*4e1bc9a0SAchim Leubner #define BIT0_MASK 0x01 335*4e1bc9a0SAchim Leubner #define BIT1_MASK 0x02 336*4e1bc9a0SAchim Leubner #define BIT2_MASK 0x04 337*4e1bc9a0SAchim Leubner #define BIT3_MASK 0x08 338*4e1bc9a0SAchim Leubner #define BIT4_MASK 0x10 339*4e1bc9a0SAchim Leubner #define BIT5_MASK 0x20 340*4e1bc9a0SAchim Leubner #define BIT6_MASK 0x40 341*4e1bc9a0SAchim Leubner #define BIT7_MASK 0x80 342*4e1bc9a0SAchim Leubner 343*4e1bc9a0SAchim Leubner #define MODE_SENSE6_RETURN_ALL_PAGES_LEN 68 344*4e1bc9a0SAchim Leubner #define MODE_SENSE6_CONTROL_PAGE_LEN 24 345*4e1bc9a0SAchim Leubner #define MODE_SENSE6_READ_WRITE_ERROR_RECOVERY_PAGE_LEN 24 346*4e1bc9a0SAchim Leubner #define MODE_SENSE6_CACHING_LEN 32 347*4e1bc9a0SAchim Leubner #define MODE_SENSE6_INFORMATION_EXCEPTION_CONTROL_PAGE_LEN 24 348*4e1bc9a0SAchim Leubner 349*4e1bc9a0SAchim Leubner 350*4e1bc9a0SAchim Leubner #define MODE_SENSE10_RETURN_ALL_PAGES_LEN 68 + 4 351*4e1bc9a0SAchim Leubner #define MODE_SENSE10_CONTROL_PAGE_LEN 24 + 4 352*4e1bc9a0SAchim Leubner #define MODE_SENSE10_READ_WRITE_ERROR_RECOVERY_PAGE_LEN 24 + 4 353*4e1bc9a0SAchim Leubner #define MODE_SENSE10_CACHING_LEN 32 + 4 354*4e1bc9a0SAchim Leubner #define MODE_SENSE10_INFORMATION_EXCEPTION_CONTROL_PAGE_LEN 24 + 4 355*4e1bc9a0SAchim Leubner 356*4e1bc9a0SAchim Leubner #define MODE_SENSE10_RETURN_ALL_PAGES_LLBAA_LEN 68 + 4 + 8 357*4e1bc9a0SAchim Leubner #define MODE_SENSE10_CONTROL_PAGE_LLBAA_LEN 24 + 4 + 8 358*4e1bc9a0SAchim Leubner #define MODE_SENSE10_READ_WRITE_ERROR_RECOVERY_PAGE_LLBAA_LEN 24 + 4 + 8 359*4e1bc9a0SAchim Leubner #define MODE_SENSE10_CACHING_LLBAA_LEN 32 + 4 + 8 360*4e1bc9a0SAchim Leubner #define MODE_SENSE10_INFORMATION_EXCEPTION_CONTROL_PAGE_LLBAA_LEN 24 + 4 + 8 361*4e1bc9a0SAchim Leubner 362*4e1bc9a0SAchim Leubner /***************************************************************************** 363*4e1bc9a0SAchim Leubner ** SCSI SENSE KEY VALUES 364*4e1bc9a0SAchim Leubner *****************************************************************************/ 365*4e1bc9a0SAchim Leubner 366*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_NO_SENSE 0x00 367*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_RECOVERED_ERROR 0x01 368*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_NOT_READY 0x02 369*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_MEDIUM_ERROR 0x03 370*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_HARDWARE_ERROR 0x04 371*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_ILLEGAL_REQUEST 0x05 372*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_UNIT_ATTENTION 0x06 373*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_DATA_PROTECT 0x07 374*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_ABORTED_COMMAND 0x0B 375*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_MISCOMPARE 0x0E 376*4e1bc9a0SAchim Leubner 377*4e1bc9a0SAchim Leubner /***************************************************************************** 378*4e1bc9a0SAchim Leubner ** SCSI Additional Sense Codes and Qualifiers combo two-bytes 379*4e1bc9a0SAchim Leubner *****************************************************************************/ 380*4e1bc9a0SAchim Leubner 381*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_NO_ADDITIONAL_INFO 0x0000 382*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LUN_CRC_ERROR_DETECTED 0x0803 383*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INVALID_COMMAND 0x2000 384*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_BLOCK_OUT 0x2100 385*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INVALID_FIELD_IN_CDB 0x2400 386*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_NOT_SUPPORTED 0x2500 387*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_POWERON_RESET 0x2900 388*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_EVERLAPPED_CMDS 0x4e00 389*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INTERNAL_TARGET_FAILURE 0x4400 390*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_MEDIUM_NOT_PRESENT 0x3a00 391*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_UNRECOVERED_READ_ERROR 0x1100 392*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_RECORD_NOT_FOUND 0x1401 393*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_NOT_READY_TO_READY_CHANGE 0x2800 394*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_OPERATOR_MEDIUM_REMOVAL_REQUEST 0x5a01 395*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INFORMATION_UNIT_CRC_ERROR 0x4703 396*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS 0x0404 397*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE 0x5d10 398*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOW_POWER_CONDITION_ON 0x5e00 399*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INIT_REQUIRED 0x0402 400*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INVALID_FIELD_PARAMETER_LIST 0x2600 401*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_ATA_DEVICE_FAILED_SET_FEATURES 0x4471 402*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_ATA_DEVICE_FEATURE_NOT_ENABLED 0x670B 403*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST 0x3E03 404*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR 0x2C00 405*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x2100 406*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_FAILURE 0x3E01 407*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED 0x5300 408*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INITIALIZING_COMMAND_REQUIRED 0x0402 409*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE 0x0400 410*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION 0x0500 411*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN 0x4000 412*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_COMMANDS_CLEARED_BY_ANOTHER_INITIATOR 0x2F00 413*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED 0x0C02 414*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_ATA_PASS_THROUGH_INFORMATION_AVAILABLE 0x001D 415*4e1bc9a0SAchim Leubner 416*4e1bc9a0SAchim Leubner /***************************************************************************** 417*4e1bc9a0SAchim Leubner ** SCSI Additional Sense Codes and Qualifiers saparate bytes 418*4e1bc9a0SAchim Leubner *****************************************************************************/ 419*4e1bc9a0SAchim Leubner 420*4e1bc9a0SAchim Leubner #define SCSI_ASC_NOTREADY_INIT_CMD_REQ 0x04 421*4e1bc9a0SAchim Leubner #define SCSI_ASCQ_NOTREADY_INIT_CMD_REQ 0x02 422*4e1bc9a0SAchim Leubner 423*4e1bc9a0SAchim Leubner 424*4e1bc9a0SAchim Leubner /***************************************************************************** 425*4e1bc9a0SAchim Leubner ** Inquiry command fields and response sizes 426*4e1bc9a0SAchim Leubner *****************************************************************************/ 427*4e1bc9a0SAchim Leubner #define SCSIOP_INQUIRY_CMDDT 0x02 428*4e1bc9a0SAchim Leubner #define SCSIOP_INQUIRY_EVPD 0x01 429*4e1bc9a0SAchim Leubner #define STANDARD_INQUIRY_SIZE 36 430*4e1bc9a0SAchim Leubner #define SATA_PAGE83_INQUIRY_WWN_SIZE 16 /* SAT, revision8, Table81, p78, 12 + 4 */ 431*4e1bc9a0SAchim Leubner #define SATA_PAGE83_INQUIRY_NO_WWN_SIZE 76 /* SAT, revision8, Table81, p78, 72 + 4 */ 432*4e1bc9a0SAchim Leubner #define SATA_PAGE89_INQUIRY_SIZE 572 /* SAT, revision8, Table87, p84 */ 433*4e1bc9a0SAchim Leubner #define SATA_PAGE0_INQUIRY_SIZE 9 /* SPC-4, 7.6.9 Table331, p345 */ 434*4e1bc9a0SAchim Leubner #define SATA_PAGE80_INQUIRY_SIZE 24 /* SAT, revision8, Table79, p77 */ 435*4e1bc9a0SAchim Leubner #define SATA_PAGEB1_INQUIRY_SIZE 64 /* SBC-3, revision31, Table193, p273 */ 436*4e1bc9a0SAchim Leubner 437*4e1bc9a0SAchim Leubner /***************************************************************************** 438*4e1bc9a0SAchim Leubner ** SCSI Operation Codes (first byte in CDB) 439*4e1bc9a0SAchim Leubner *****************************************************************************/ 440*4e1bc9a0SAchim Leubner 441*4e1bc9a0SAchim Leubner 442*4e1bc9a0SAchim Leubner #define SCSIOPC_TEST_UNIT_READY 0x00 443*4e1bc9a0SAchim Leubner #define SCSIOPC_INQUIRY 0x12 444*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SENSE_6 0x1A 445*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SENSE_10 0x5A 446*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SELECT_6 0x15 447*4e1bc9a0SAchim Leubner #define SCSIOPC_START_STOP_UNIT 0x1B 448*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_CAPACITY_10 0x25 449*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_CAPACITY_16 0x9E 450*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_6 0x08 451*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_10 0x28 452*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_12 0xA8 453*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_16 0x88 454*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_6 0x0A 455*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_10 0x2A 456*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_12 0xAA 457*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_16 0x8A 458*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_VERIFY 0x2E 459*4e1bc9a0SAchim Leubner #define SCSIOPC_VERIFY_10 0x2F 460*4e1bc9a0SAchim Leubner #define SCSIOPC_VERIFY_12 0xAF 461*4e1bc9a0SAchim Leubner #define SCSIOPC_VERIFY_16 0x8F 462*4e1bc9a0SAchim Leubner #define SCSIOPC_REQUEST_SENSE 0x03 463*4e1bc9a0SAchim Leubner #define SCSIOPC_REPORT_LUN 0xA0 464*4e1bc9a0SAchim Leubner #define SCSIOPC_FORMAT_UNIT 0x04 465*4e1bc9a0SAchim Leubner #define SCSIOPC_SEND_DIAGNOSTIC 0x1D 466*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_SAME_10 0x41 467*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_SAME_16 0x93 468*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_BUFFER 0x3C 469*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_BUFFER 0x3B 470*4e1bc9a0SAchim Leubner 471*4e1bc9a0SAchim Leubner #define SCSIOPC_LOG_SENSE 0x4D 472*4e1bc9a0SAchim Leubner #define SCSIOPC_LOG_SELECT 0x4C 473*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SELECT_6 0x15 474*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SELECT_10 0x55 475*4e1bc9a0SAchim Leubner #define SCSIOPC_SYNCHRONIZE_CACHE_10 0x35 476*4e1bc9a0SAchim Leubner #define SCSIOPC_SYNCHRONIZE_CACHE_16 0x91 477*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_AND_VERIFY_10 0x2E 478*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_AND_VERIFY_12 0xAE 479*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_AND_VERIFY_16 0x8E 480*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_MEDIA_SERIAL_NUMBER 0xAB 481*4e1bc9a0SAchim Leubner #define SCSIOPC_REASSIGN_BLOCKS 0x07 482*4e1bc9a0SAchim Leubner 483*4e1bc9a0SAchim Leubner #define SCSIOPC_GET_CONFIG 0x46 484*4e1bc9a0SAchim Leubner #define SCSIOPC_GET_EVENT_STATUS_NOTIFICATION 0x4a 485*4e1bc9a0SAchim Leubner #define SCSIOPC_REPORT_KEY 0xA4 486*4e1bc9a0SAchim Leubner #define SCSIOPC_SEND_KEY 0xA3 487*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_DVD_STRUCTURE 0xAD 488*4e1bc9a0SAchim Leubner #define SCSIOPC_TOC 0x43 489*4e1bc9a0SAchim Leubner #define SCSIOPC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E 490*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_VERIFY 0x42 491*4e1bc9a0SAchim Leubner #define SCSIOPC_ATA_PASS_THROUGH12 0xA1 492*4e1bc9a0SAchim Leubner #define SCSIOPC_ATA_PASS_THROUGH16 0x85 493*4e1bc9a0SAchim Leubner 494*4e1bc9a0SAchim Leubner 495*4e1bc9a0SAchim Leubner /*! \def MIN(a,b) 496*4e1bc9a0SAchim Leubner * \brief MIN macro 497*4e1bc9a0SAchim Leubner * 498*4e1bc9a0SAchim Leubner * use to find MIN of two values 499*4e1bc9a0SAchim Leubner */ 500*4e1bc9a0SAchim Leubner #ifndef MIN 501*4e1bc9a0SAchim Leubner #define MIN(a,b) ((a) < (b) ? (a) : (b)) 502*4e1bc9a0SAchim Leubner #endif 503*4e1bc9a0SAchim Leubner 504*4e1bc9a0SAchim Leubner /*! \def MAX(a,b) 505*4e1bc9a0SAchim Leubner * \brief MAX macro 506*4e1bc9a0SAchim Leubner * 507*4e1bc9a0SAchim Leubner * use to find MAX of two values 508*4e1bc9a0SAchim Leubner */ 509*4e1bc9a0SAchim Leubner #ifndef MAX 510*4e1bc9a0SAchim Leubner #define MAX(a,b) ((a) < (b) ? (b) : (a)) 511*4e1bc9a0SAchim Leubner #endif 512*4e1bc9a0SAchim Leubner 513*4e1bc9a0SAchim Leubner /* for debugging print */ 514*4e1bc9a0SAchim Leubner #if defined(SM_DEBUG) 515*4e1bc9a0SAchim Leubner 516*4e1bc9a0SAchim Leubner /* 517*4e1bc9a0SAchim Leubner * for debugging purposes. 518*4e1bc9a0SAchim Leubner */ 519*4e1bc9a0SAchim Leubner extern bit32 gSMDebugLevel; 520*4e1bc9a0SAchim Leubner 521*4e1bc9a0SAchim Leubner #define SM_DBG0(format) tdsmLogDebugString(gSMDebugLevel, 0, format) 522*4e1bc9a0SAchim Leubner #define SM_DBG1(format) tdsmLogDebugString(gSMDebugLevel, 1, format) 523*4e1bc9a0SAchim Leubner #define SM_DBG2(format) tdsmLogDebugString(gSMDebugLevel, 2, format) 524*4e1bc9a0SAchim Leubner #define SM_DBG3(format) tdsmLogDebugString(gSMDebugLevel, 3, format) 525*4e1bc9a0SAchim Leubner #define SM_DBG4(format) tdsmLogDebugString(gSMDebugLevel, 4, format) 526*4e1bc9a0SAchim Leubner #define SM_DBG5(format) tdsmLogDebugString(gSMDebugLevel, 5, format) 527*4e1bc9a0SAchim Leubner #define SM_DBG6(format) tdsmLogDebugString(gSMDebugLevel, 6, format) 528*4e1bc9a0SAchim Leubner 529*4e1bc9a0SAchim Leubner #else 530*4e1bc9a0SAchim Leubner 531*4e1bc9a0SAchim Leubner #define SM_DBG0(format) 532*4e1bc9a0SAchim Leubner #define SM_DBG1(format) 533*4e1bc9a0SAchim Leubner #define SM_DBG2(format) 534*4e1bc9a0SAchim Leubner #define SM_DBG3(format) 535*4e1bc9a0SAchim Leubner #define SM_DBG4(format) 536*4e1bc9a0SAchim Leubner #define SM_DBG5(format) 537*4e1bc9a0SAchim Leubner #define SM_DBG6(format) 538*4e1bc9a0SAchim Leubner 539*4e1bc9a0SAchim Leubner #endif /* SM_DEBUG */ 540*4e1bc9a0SAchim Leubner 541*4e1bc9a0SAchim Leubner //#define SM_ASSERT OS_ASSERT 542*4e1bc9a0SAchim Leubner //#define tdsmLogDebugString TIDEBUG_MSG 543*4e1bc9a0SAchim Leubner 544*4e1bc9a0SAchim Leubner /* 545*4e1bc9a0SAchim Leubner * SAT specific structure per SATA drive 546*4e1bc9a0SAchim Leubner */ 547*4e1bc9a0SAchim Leubner #define SAT_NONNCQ_MAX 1 548*4e1bc9a0SAchim Leubner #define SAT_NCQ_MAX 32 549*4e1bc9a0SAchim Leubner #define SAT_MAX_INT_IO 16 550*4e1bc9a0SAchim Leubner #define SAT_APAPI_CMDQ_MAX 2 551*4e1bc9a0SAchim Leubner 552*4e1bc9a0SAchim Leubner /* Device state */ 553*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_NORMAL 0 /* Normal */ 554*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_IN_RECOVERY 1 /* SAT in recovery mode */ 555*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_FORMAT_IN_PROGRESS 2 /* Format unit in progress */ 556*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_SMART_THRESHOLD 3 /* SMART Threshold Exceeded Condition*/ 557*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_LOW_POWER 4 /* Low Power State*/ 558*4e1bc9a0SAchim Leubner 559*4e1bc9a0SAchim Leubner #ifndef agNULL 560*4e1bc9a0SAchim Leubner #define agNULL ((void *)0) 561*4e1bc9a0SAchim Leubner #endif 562*4e1bc9a0SAchim Leubner 563*4e1bc9a0SAchim Leubner #define SM_SET_ESGL_EXTEND(val) \ 564*4e1bc9a0SAchim Leubner ((val) = (val) | 0x80000000) 565*4e1bc9a0SAchim Leubner 566*4e1bc9a0SAchim Leubner #define SM_CLEAR_ESGL_EXTEND(val) \ 567*4e1bc9a0SAchim Leubner ((val) = (val) & 0x7FFFFFFF) 568*4e1bc9a0SAchim Leubner 569*4e1bc9a0SAchim Leubner #ifndef OPEN_RETRY_RETRIES 570*4e1bc9a0SAchim Leubner #define OPEN_RETRY_RETRIES 10 571*4e1bc9a0SAchim Leubner #endif 572*4e1bc9a0SAchim Leubner 573*4e1bc9a0SAchim Leubner /********************************************************************* 574*4e1bc9a0SAchim Leubner * CPU buffer access macro * 575*4e1bc9a0SAchim Leubner * * 576*4e1bc9a0SAchim Leubner */ 577*4e1bc9a0SAchim Leubner 578*4e1bc9a0SAchim Leubner #define OSSA_OFFSET_OF(STRUCT_TYPE, FEILD) \ 579*4e1bc9a0SAchim Leubner (bitptr)&(((STRUCT_TYPE *)0)->FEILD) 580*4e1bc9a0SAchim Leubner 581*4e1bc9a0SAchim Leubner 582*4e1bc9a0SAchim Leubner #if defined(SA_CPU_LITTLE_ENDIAN) 583*4e1bc9a0SAchim Leubner 584*4e1bc9a0SAchim Leubner #define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16) \ 585*4e1bc9a0SAchim Leubner (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16); 586*4e1bc9a0SAchim Leubner 587*4e1bc9a0SAchim Leubner #define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32) \ 588*4e1bc9a0SAchim Leubner (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32); 589*4e1bc9a0SAchim Leubner 590*4e1bc9a0SAchim Leubner #define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET) \ 591*4e1bc9a0SAchim Leubner (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) 592*4e1bc9a0SAchim Leubner 593*4e1bc9a0SAchim Leubner #define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET) \ 594*4e1bc9a0SAchim Leubner (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) 595*4e1bc9a0SAchim Leubner 596*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16) \ 597*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit8)((((bit16)VALUE16)>>8)&0xFF); \ 598*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)(((bit16)VALUE16)&0xFF); 599*4e1bc9a0SAchim Leubner 600*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32) \ 601*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit8)((((bit32)VALUE32)>>24)&0xFF); \ 602*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>16)&0xFF); \ 603*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>8)&0xFF); \ 604*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)(((bit32)VALUE32)&0xFF); 605*4e1bc9a0SAchim Leubner 606*4e1bc9a0SAchim Leubner #define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET) \ 607*4e1bc9a0SAchim Leubner (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); \ 608*4e1bc9a0SAchim Leubner (*(bit8 *)(((bit8 *)ADDR16))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); 609*4e1bc9a0SAchim Leubner 610*4e1bc9a0SAchim Leubner #define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET) \ 611*4e1bc9a0SAchim Leubner (*(bit8 *)(((bit8 *)ADDR32)+3)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); \ 612*4e1bc9a0SAchim Leubner (*(bit8 *)(((bit8 *)ADDR32)+2)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \ 613*4e1bc9a0SAchim Leubner (*(bit8 *)(((bit8 *)ADDR32)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \ 614*4e1bc9a0SAchim Leubner (*(bit8 *)(((bit8 *)ADDR32))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))); 615*4e1bc9a0SAchim Leubner 616*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN) \ 617*4e1bc9a0SAchim Leubner si_memcpy(DEST_ADDR, SRC_ADDR, LEN); 618*4e1bc9a0SAchim Leubner 619*4e1bc9a0SAchim Leubner 620*4e1bc9a0SAchim Leubner #elif defined(SA_CPU_BIG_ENDIAN) 621*4e1bc9a0SAchim Leubner 622*4e1bc9a0SAchim Leubner #define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16) \ 623*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit16)VALUE16)>>8)&0xFF); \ 624*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit8)(((bit16)VALUE16)&0xFF); 625*4e1bc9a0SAchim Leubner 626*4e1bc9a0SAchim Leubner #define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32) \ 627*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)((((bit32)VALUE32)>>24)&0xFF); \ 628*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>16)&0xFF); \ 629*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>8)&0xFF); \ 630*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit8)(((bit32)VALUE32)&0xFF); 631*4e1bc9a0SAchim Leubner 632*4e1bc9a0SAchim Leubner #define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET) \ 633*4e1bc9a0SAchim Leubner (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); \ 634*4e1bc9a0SAchim Leubner (*(bit8 *)(((bit8 *)ADDR16))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); 635*4e1bc9a0SAchim Leubner 636*4e1bc9a0SAchim Leubner #define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET) \ 637*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)ADDR32)+3))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); \ 638*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)ADDR32)+2))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \ 639*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)ADDR32)+1))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \ 640*4e1bc9a0SAchim Leubner (*((bit8 *)(((bit8 *)ADDR32)))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))); 641*4e1bc9a0SAchim Leubner 642*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16) \ 643*4e1bc9a0SAchim Leubner (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16); 644*4e1bc9a0SAchim Leubner 645*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32) \ 646*4e1bc9a0SAchim Leubner (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32); 647*4e1bc9a0SAchim Leubner 648*4e1bc9a0SAchim Leubner #define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET) \ 649*4e1bc9a0SAchim Leubner (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); 650*4e1bc9a0SAchim Leubner 651*4e1bc9a0SAchim Leubner #define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET) \ 652*4e1bc9a0SAchim Leubner (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); 653*4e1bc9a0SAchim Leubner 654*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN) \ 655*4e1bc9a0SAchim Leubner si_memcpy(DEST_ADDR, SRC_ADDR, LEN); 656*4e1bc9a0SAchim Leubner 657*4e1bc9a0SAchim Leubner #else 658*4e1bc9a0SAchim Leubner 659*4e1bc9a0SAchim Leubner #error (Host CPU endianess undefined!!) 660*4e1bc9a0SAchim Leubner 661*4e1bc9a0SAchim Leubner #endif 662*4e1bc9a0SAchim Leubner 663*4e1bc9a0SAchim Leubner 664*4e1bc9a0SAchim Leubner #if defined(SA_CPU_LITTLE_ENDIAN) 665*4e1bc9a0SAchim Leubner 666*4e1bc9a0SAchim Leubner #ifndef LEBIT16_TO_BIT16 667*4e1bc9a0SAchim Leubner #define LEBIT16_TO_BIT16(_x) (_x) 668*4e1bc9a0SAchim Leubner #endif 669*4e1bc9a0SAchim Leubner 670*4e1bc9a0SAchim Leubner #ifndef BIT16_TO_LEBIT16 671*4e1bc9a0SAchim Leubner #define BIT16_TO_LEBIT16(_x) (_x) 672*4e1bc9a0SAchim Leubner #endif 673*4e1bc9a0SAchim Leubner 674*4e1bc9a0SAchim Leubner #ifndef BIT16_TO_BEBIT16 675*4e1bc9a0SAchim Leubner #define BIT16_TO_BEBIT16(_x) AGSA_FLIP_2_BYTES(_x) 676*4e1bc9a0SAchim Leubner #endif 677*4e1bc9a0SAchim Leubner 678*4e1bc9a0SAchim Leubner #ifndef BEBIT16_TO_BIT16 679*4e1bc9a0SAchim Leubner #define BEBIT16_TO_BIT16(_x) AGSA_FLIP_2_BYTES(_x) 680*4e1bc9a0SAchim Leubner #endif 681*4e1bc9a0SAchim Leubner 682*4e1bc9a0SAchim Leubner #ifndef LEBIT32_TO_BIT32 683*4e1bc9a0SAchim Leubner #define LEBIT32_TO_BIT32(_x) (_x) 684*4e1bc9a0SAchim Leubner #endif 685*4e1bc9a0SAchim Leubner 686*4e1bc9a0SAchim Leubner #ifndef BIT32_TO_LEBIT32 687*4e1bc9a0SAchim Leubner #define BIT32_TO_LEBIT32(_x) (_x) 688*4e1bc9a0SAchim Leubner #endif 689*4e1bc9a0SAchim Leubner 690*4e1bc9a0SAchim Leubner 691*4e1bc9a0SAchim Leubner #ifndef BEBIT32_TO_BIT32 692*4e1bc9a0SAchim Leubner #define BEBIT32_TO_BIT32(_x) AGSA_FLIP_4_BYTES(_x) 693*4e1bc9a0SAchim Leubner #endif 694*4e1bc9a0SAchim Leubner 695*4e1bc9a0SAchim Leubner #ifndef BIT32_TO_BEBIT32 696*4e1bc9a0SAchim Leubner #define BIT32_TO_BEBIT32(_x) AGSA_FLIP_4_BYTES(_x) 697*4e1bc9a0SAchim Leubner #endif 698*4e1bc9a0SAchim Leubner 699*4e1bc9a0SAchim Leubner #elif defined(SA_CPU_BIG_ENDIAN) 700*4e1bc9a0SAchim Leubner 701*4e1bc9a0SAchim Leubner #ifndef LEBIT16_TO_BIT16 702*4e1bc9a0SAchim Leubner #define LEBIT16_TO_BIT16(_x) AGSA_FLIP_2_BYTES(_x) 703*4e1bc9a0SAchim Leubner #endif 704*4e1bc9a0SAchim Leubner 705*4e1bc9a0SAchim Leubner #ifndef BIT16_TO_LEBIT16 706*4e1bc9a0SAchim Leubner #define BIT16_TO_LEBIT16(_x) AGSA_FLIP_2_BYTES(_x) 707*4e1bc9a0SAchim Leubner #endif 708*4e1bc9a0SAchim Leubner 709*4e1bc9a0SAchim Leubner #ifndef BIT16_TO_BEBIT16 710*4e1bc9a0SAchim Leubner #define BIT16_TO_BEBIT16(_x) (_x) 711*4e1bc9a0SAchim Leubner #endif 712*4e1bc9a0SAchim Leubner 713*4e1bc9a0SAchim Leubner #ifndef BEBIT16_TO_BIT16 714*4e1bc9a0SAchim Leubner #define BEBIT16_TO_BIT16(_x) (_x) 715*4e1bc9a0SAchim Leubner #endif 716*4e1bc9a0SAchim Leubner 717*4e1bc9a0SAchim Leubner #ifndef LEBIT32_TO_BIT32 718*4e1bc9a0SAchim Leubner #define LEBIT32_TO_BIT32(_x) AGSA_FLIP_4_BYTES(_x) 719*4e1bc9a0SAchim Leubner #endif 720*4e1bc9a0SAchim Leubner 721*4e1bc9a0SAchim Leubner #ifndef BIT32_TO_LEBIT32 722*4e1bc9a0SAchim Leubner #define BIT32_TO_LEBIT32(_x) AGSA_FLIP_4_BYTES(_x) 723*4e1bc9a0SAchim Leubner #endif 724*4e1bc9a0SAchim Leubner 725*4e1bc9a0SAchim Leubner #ifndef BEBIT32_TO_BIT32 726*4e1bc9a0SAchim Leubner #define BEBIT32_TO_BIT32(_x) (_x) 727*4e1bc9a0SAchim Leubner #endif 728*4e1bc9a0SAchim Leubner 729*4e1bc9a0SAchim Leubner #ifndef BIT32_TO_BEBIT32 730*4e1bc9a0SAchim Leubner #define BIT32_TO_BEBIT32(_x) (_x) 731*4e1bc9a0SAchim Leubner #endif 732*4e1bc9a0SAchim Leubner 733*4e1bc9a0SAchim Leubner #else 734*4e1bc9a0SAchim Leubner 735*4e1bc9a0SAchim Leubner #error No definition of SA_CPU_BIG_ENDIAN or SA_CPU_LITTLE_ENDIAN 736*4e1bc9a0SAchim Leubner 737*4e1bc9a0SAchim Leubner #endif 738*4e1bc9a0SAchim Leubner 739*4e1bc9a0SAchim Leubner 740*4e1bc9a0SAchim Leubner /* 741*4e1bc9a0SAchim Leubner * Task Management task used in tiINITaskManagement() 742*4e1bc9a0SAchim Leubner * 743*4e1bc9a0SAchim Leubner * 1 SM_ABORT TASK - aborts the task identified by the Referenced Task Tag field. 744*4e1bc9a0SAchim Leubner * 2 SM_ABORT TASK SET - aborts all Tasks issued by this initiator on the Logical Unit 745*4e1bc9a0SAchim Leubner * 3 SM_CLEAR ACA - clears the Auto Contingent Allegiance condition. 746*4e1bc9a0SAchim Leubner * 4 SM_CLEAR TASK SET - Aborts all Tasks (from all initiators) for the Logical Unit. 747*4e1bc9a0SAchim Leubner * 5 SM_LOGICAL UNIT RESET 748*4e1bc9a0SAchim Leubner * 6 SM_TARGET WARM RESET - iSCSI only 749*4e1bc9a0SAchim Leubner * 7 SM_TARGET_COLD_RESET - iSCSI only 750*4e1bc9a0SAchim Leubner * 8 SM_TASK_REASSIGN - iSCSI only 751*4e1bc9a0SAchim Leubner * 9 SM_QUERY_TASK - SAS only 752*4e1bc9a0SAchim Leubner */ 753*4e1bc9a0SAchim Leubner 754*4e1bc9a0SAchim Leubner #define SM_ABORT_TASK 1 755*4e1bc9a0SAchim Leubner #define SM_ABORT_TASK_SET 2 756*4e1bc9a0SAchim Leubner #define SM_CLEAR_ACA 3 757*4e1bc9a0SAchim Leubner #define SM_CLEAR_TASK_SET 4 758*4e1bc9a0SAchim Leubner #define SM_LOGICAL_UNIT_RESET 5 759*4e1bc9a0SAchim Leubner #define SM_TARGET_WARM_RESET 6 /* iSCSI only */ 760*4e1bc9a0SAchim Leubner #define SM_TARGET_COLD_RESET 7 /* iSCSI only */ 761*4e1bc9a0SAchim Leubner #define SM_TASK_REASSIGN 8 /* iSCSI only */ 762*4e1bc9a0SAchim Leubner #define SM_QUERY_TASK 9 /* SAS only */ 763*4e1bc9a0SAchim Leubner 764*4e1bc9a0SAchim Leubner /* SMP PHY CONTROL OPERATION */ 765*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_NOP 0x00 766*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_LINK_RESET 0x01 767*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_HARD_RESET 0x02 768*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_DISABLE 0x03 769*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_CLEAR_ERROR_LOG 0x05 770*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_CLEAR_AFFILIATION 0x06 771*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_XMIT_SATA_PS_SIGNAL 0x07 772*4e1bc9a0SAchim Leubner 773*4e1bc9a0SAchim Leubner /**************************************************************** 774*4e1bc9a0SAchim Leubner * Phy Control request 775*4e1bc9a0SAchim Leubner ****************************************************************/ 776*4e1bc9a0SAchim Leubner typedef struct smpReqPhyControl_s 777*4e1bc9a0SAchim Leubner { 778*4e1bc9a0SAchim Leubner bit8 reserved1[4]; 779*4e1bc9a0SAchim Leubner bit8 reserved2; 780*4e1bc9a0SAchim Leubner bit8 phyIdentifier; 781*4e1bc9a0SAchim Leubner bit8 phyOperation; 782*4e1bc9a0SAchim Leubner bit8 updatePartialPathwayTOValue; 783*4e1bc9a0SAchim Leubner /* b7-1 : reserved */ 784*4e1bc9a0SAchim Leubner /* b0 : update partial pathway timeout value */ 785*4e1bc9a0SAchim Leubner bit8 reserved3[20]; 786*4e1bc9a0SAchim Leubner bit8 programmedMinPhysicalLinkRate; 787*4e1bc9a0SAchim Leubner /* b7-4 : programmed Minimum Physical Link Rate*/ 788*4e1bc9a0SAchim Leubner /* b3-0 : reserved */ 789*4e1bc9a0SAchim Leubner bit8 programmedMaxPhysicalLinkRate; 790*4e1bc9a0SAchim Leubner /* b7-4 : programmed Maximum Physical Link Rate*/ 791*4e1bc9a0SAchim Leubner /* b3-0 : reserved */ 792*4e1bc9a0SAchim Leubner bit8 reserved4[2]; 793*4e1bc9a0SAchim Leubner bit8 partialPathwayTOValue; 794*4e1bc9a0SAchim Leubner /* b7-4 : reserved */ 795*4e1bc9a0SAchim Leubner /* b3-0 : partial Pathway TO Value */ 796*4e1bc9a0SAchim Leubner bit8 reserved5[3]; 797*4e1bc9a0SAchim Leubner } smpReqPhyControl_t; 798*4e1bc9a0SAchim Leubner 799*4e1bc9a0SAchim Leubner 800*4e1bc9a0SAchim Leubner typedef struct smSMPFrameHeader_s 801*4e1bc9a0SAchim Leubner { 802*4e1bc9a0SAchim Leubner bit8 smpFrameType; /* The first byte of SMP frame represents the SMP FRAME TYPE */ 803*4e1bc9a0SAchim Leubner bit8 smpFunction; /* The second byte of the SMP frame represents the SMP FUNCTION */ 804*4e1bc9a0SAchim Leubner bit8 smpFunctionResult; /* The third byte of SMP frame represents FUNCTION RESULT of the SMP response. */ 805*4e1bc9a0SAchim Leubner bit8 smpReserved; /* reserved */ 806*4e1bc9a0SAchim Leubner } smSMPFrameHeader_t; 807*4e1bc9a0SAchim Leubner 808*4e1bc9a0SAchim Leubner /* SMP direct payload size limit: IOMB direct payload size = 48 */ 809*4e1bc9a0SAchim Leubner #define SMP_DIRECT_PAYLOAD_LIMIT 44 810*4e1bc9a0SAchim Leubner 811*4e1bc9a0SAchim Leubner #define SMP_REQUEST 0x40 812*4e1bc9a0SAchim Leubner #define SMP_RESPONSE 0x41 813*4e1bc9a0SAchim Leubner 814*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL 0x91 815*4e1bc9a0SAchim Leubner 816*4e1bc9a0SAchim Leubner /* SMP function results */ 817*4e1bc9a0SAchim Leubner #define SMP_FUNCTION_ACCEPTED 0x00 818*4e1bc9a0SAchim Leubner 819*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */ 820*4e1bc9a0SAchim Leubner #define SM_GET_SAS_ADDRESSLO(sasAddressLo) \ 821*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressLo) 822*4e1bc9a0SAchim Leubner 823*4e1bc9a0SAchim Leubner #define SM_GET_SAS_ADDRESSHI(sasAddressHi) \ 824*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressHi) 825*4e1bc9a0SAchim Leubner 826*4e1bc9a0SAchim Leubner /* SATA sector size 512 bytes = 0x200 bytes */ 827*4e1bc9a0SAchim Leubner #define SATA_SECTOR_SIZE 0x200 828*4e1bc9a0SAchim Leubner /* TL limit in sector */ 829*4e1bc9a0SAchim Leubner /* for SAT_READ/WRITE_DMA and SAT_READ/WRITE_SECTORS ATA command */ 830*4e1bc9a0SAchim Leubner #define NON_BIT48_ADDRESS_TL_LIMIT 0x100 831*4e1bc9a0SAchim Leubner /* for SAT_READ/WRITE_DMA_EXT and SAT_READ/WRITE_SECTORS_EXT and SAT_READ/WRITE_FPDMA_QUEUEDATA command */ 832*4e1bc9a0SAchim Leubner #define BIT48_ADDRESS_TL_LIMIT 0xFFFF 833*4e1bc9a0SAchim Leubner 834*4e1bc9a0SAchim Leubner #define VEN_DEV_SPC 0x800111f8 835*4e1bc9a0SAchim Leubner #define VEN_DEV_SPCv 0x800811f8 836*4e1bc9a0SAchim Leubner #define VEN_DEV_SPCve 0x800911f8 837*4e1bc9a0SAchim Leubner #define VEN_DEV_SPCvplus 0x801811f8 838*4e1bc9a0SAchim Leubner #define VEN_DEV_SPCveplus 0x801911f8 839*4e1bc9a0SAchim Leubner 840*4e1bc9a0SAchim Leubner #define SMIsSPC(agr) (VEN_DEV_SPC == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPC */ 841*4e1bc9a0SAchim Leubner #define SMIsSPCv(agr) (VEN_DEV_SPCv == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCv */ 842*4e1bc9a0SAchim Leubner #define SMIsSPCve(agr) (VEN_DEV_SPCve == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCve */ 843*4e1bc9a0SAchim Leubner #define SMIsSPCvplus(agr) (VEN_DEV_SPCvplus == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCv+ */ 844*4e1bc9a0SAchim Leubner #define SMIsSPCveplus(agr) (VEN_DEV_SPCveplus == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCve+ */ 845*4e1bc9a0SAchim Leubner 846*4e1bc9a0SAchim Leubner #define DEFAULT_KEY_BUFFER_SIZE 64 847*4e1bc9a0SAchim Leubner 848*4e1bc9a0SAchim Leubner 849*4e1bc9a0SAchim Leubner #endif /* __SMDEFS_H__ */ 850*4e1bc9a0SAchim Leubner 851