1 /******************************************************************************* 2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3 * 4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided 5 *that the following conditions are met: 6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7 *following disclaimer. 8 *2. Redistributions in binary form must reproduce the above copyright notice, 9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided 10 *with the distribution. 11 * 12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20 * 21 * $FreeBSD$ 22 * 23 ********************************************************************************/ 24 /*******************************************************************************/ 25 /** \file 26 * 27 * The file contains defines and data structures for SAS/SATA TD layer 28 * 29 */ 30 31 #ifndef __TDDEFS_H__ 32 #define __TDDEFS_H__ 33 34 35 36 #ifndef agTRUE 37 #define agTRUE 1 38 #endif 39 40 #ifndef agFALSE 41 #define agFALSE 0 42 #endif 43 44 #ifndef agNULL 45 #define agNULL ((void *)0) 46 #endif 47 48 #ifndef IN 49 #define IN 50 #endif 51 52 #ifndef OUT 53 #define OUT 54 #endif 55 56 #ifndef IN_OUT 57 #define IN_OUT 58 #endif 59 60 #ifndef os_bit8 61 #define os_bit8 bit8 62 #endif 63 64 #ifndef os_bit16 65 #define os_bit16 bit16 66 #endif 67 68 #ifndef os_bit32 69 #define os_bit32 bit32 70 #endif 71 72 #ifndef OFF 73 #define OFF 0 74 #endif 75 76 #ifndef ON 77 #define ON 1 78 #endif 79 80 #ifndef MIN 81 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 82 #endif 83 84 #ifndef MAX 85 #define MAX(a,b) ((a) < (b) ? (b) : (a)) 86 #endif 87 88 #define TD_OPERATION_INITIATOR 0x1 89 #define TD_OPERATION_TARGET 0x2 90 91 /* indices for mem_t structures */ 92 #define DEK_MEM_INDEX_1 15 93 #define DEK_MEM_INDEX_2 16 94 95 /* some useful macros */ 96 #ifndef AG_ALIGNSIZE 97 #define AG_ALIGNSIZE(count, alignment) (bit32) ( (bitptr)(count)+(bitptr)(alignment) ) 98 #endif 99 100 #define DEFAULT_KEY_BUFFER_SIZE 64 101 102 /**< the default maximum number of phys */ 103 #ifdef FPGA_CARD 104 105 #define TD_MAX_NUM_PHYS 2 106 107 #else 108 #define TD_MAX_NUM_PHYS 16 109 #define TD_MAX_CARD_NUM 20 110 #endif 111 112 #define TD_CARD_ID_FREE 0 113 #define TD_CARD_ID_ALLOC 1 114 #define TD_CARD_ID_LEN 128 115 116 /**< the maximum number of port context */ 117 /* should be the number of phyical phys in chip + 1 */ 118 #define TD_MAX_PORT_CONTEXT 16 119 /**< the maximum number of target device */ 120 /* For Initiator and Target 121 this is initial value for MaxTargets in the configuration(adj) file */ 122 #define DEFAULT_MAX_DEV 256 123 /* the maximum number of interrupt coalesce context */ 124 #define TD_MAX_INT_COALESCE 512 125 126 #if (defined(__FreeBSD__)) 127 #define MAX_OUTSTANDING_IO_PER_LUN 64 128 #else 129 #define MAX_OUTSTANDING_IO_PER_LUN 254 //64 130 #endif 131 132 /* default values */ 133 #define DEFAULT_MAX_ACTIVE_IOS 128 134 #define DEFAULT_NUM_REG_CLIENTS 256 135 #define DEFAULT_NUM_INBOUND_QUEUE 1 136 #define DEFAULT_NUM_OUTBOUND_QUEUE 1 137 #define DEFAULT_INBOUND_QUEUE_SIZE 512 138 #define DEFAULT_INBOUND_QUEUE_ELE_SIZE 128 139 #define DEFAULT_OUTBOUND_QUEUE_SIZE 512 140 #define DEFAULT_OUTBOUND_QUEUE_ELE_SIZE 128 141 #define DEFAULT_OUTBOUND_QUEUE_INTERRUPT_DELAY 0 142 #define DEFAULT_OUTBOUND_QUEUE_INTERRUPT_COUNT 1 143 #define DEFAULT_OUTBOUND_INTERRUPT_ENABLE 1 144 #define DEFAULT_INBOUND_QUEUE_PRIORITY 0 145 #define DEFAULT_QUEUE_OPTION 0 146 #define DEFAULT_FW_MAX_PORTS 8 147 148 149 150 /* SAS device type definition. SAS spec(r.7) p206 */ 151 #define SAS_NO_DEVICE 0 152 #define SAS_END_DEVICE 1 153 #define SAS_EDGE_EXPANDER_DEVICE 2 154 #define SAS_FANOUT_EXPANDER_DEVICE 3 155 156 /* routing attributes */ 157 #define SAS_ROUTING_DIRECT 0x00 158 #define SAS_ROUTING_SUBTRACTIVE 0x01 159 #define SAS_ROUTING_TABLE 0x02 160 161 #define SAS_CONNECTION_RATE_1_5G 0x08 162 #define SAS_CONNECTION_RATE_3_0G 0x09 163 #define SAS_CONNECTION_RATE_6_0G 0x0A 164 #define SAS_CONNECTION_RATE_12_0G 0x0B 165 166 /**< defines the maximum number of expanders */ 167 #define TD_MAX_EXPANDER_PHYS 256 168 /**< the maximum number of expanders at TD */ 169 #define TD_MAX_EXPANDER 128 170 171 /***************************************************************************** 172 ** SCSI Operation Codes (first byte in CDB) 173 *****************************************************************************/ 174 175 176 #define SCSIOPC_TEST_UNIT_READY 0x00 177 #define SCSIOPC_INQUIRY 0x12 178 #define SCSIOPC_MODE_SENSE_6 0x1A 179 #define SCSIOPC_MODE_SENSE_10 0x5A 180 #define SCSIOPC_MODE_SELECT_6 0x15 181 #define SCSIOPC_START_STOP_UNIT 0x1B 182 #define SCSIOPC_READ_CAPACITY_10 0x25 183 #define SCSIOPC_READ_CAPACITY_16 0x9E 184 #define SCSIOPC_READ_6 0x08 185 #define SCSIOPC_READ_10 0x28 186 #define SCSIOPC_READ_12 0xA8 187 #define SCSIOPC_READ_16 0x88 188 #define SCSIOPC_WRITE_6 0x0A 189 #define SCSIOPC_WRITE_10 0x2A 190 #define SCSIOPC_WRITE_12 0xAA 191 #define SCSIOPC_WRITE_16 0x8A 192 #define SCSIOPC_WRITE_VERIFY 0x2E 193 #define SCSIOPC_VERIFY_10 0x2F 194 #define SCSIOPC_VERIFY_12 0xAF 195 #define SCSIOPC_VERIFY_16 0x8F 196 #define SCSIOPC_REQUEST_SENSE 0x03 197 #define SCSIOPC_REPORT_LUN 0xA0 198 #define SCSIOPC_FORMAT_UNIT 0x04 199 #define SCSIOPC_SEND_DIAGNOSTIC 0x1D 200 #define SCSIOPC_WRITE_SAME_10 0x41 201 #define SCSIOPC_WRITE_SAME_16 0x93 202 #define SCSIOPC_READ_BUFFER 0x3C 203 #define SCSIOPC_WRITE_BUFFER 0x3B 204 205 #define SCSIOPC_GET_CONFIG 0x46 206 #define SCSIOPC_GET_EVENT_STATUS_NOTIFICATION 0x4a 207 #define SCSIOPC_REPORT_KEY 0xA4 208 #define SCSIOPC_SEND_KEY 0xA3 209 #define SCSIOPC_READ_DVD_STRUCTURE 0xAD 210 #define SCSIOPC_TOC 0x43 211 #define SCSIOPC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E 212 #define SCSIOPC_READ_VERIFY 0x42 213 214 #define SCSIOPC_LOG_SENSE 0x4D 215 #define SCSIOPC_LOG_SELECT 0x4C 216 #define SCSIOPC_MODE_SELECT_6 0x15 217 #define SCSIOPC_MODE_SELECT_10 0x55 218 #define SCSIOPC_SYNCHRONIZE_CACHE_10 0x35 219 #define SCSIOPC_SYNCHRONIZE_CACHE_16 0x91 220 #define SCSIOPC_WRITE_AND_VERIFY_10 0x2E 221 #define SCSIOPC_WRITE_AND_VERIFY_12 0xAE 222 #define SCSIOPC_WRITE_AND_VERIFY_16 0x8E 223 #define SCSIOPC_READ_MEDIA_SERIAL_NUMBER 0xAB 224 #define SCSIOPC_REASSIGN_BLOCKS 0x07 225 226 227 228 229 230 /***************************************************************************** 231 ** SCSI GENERIC 6 BYTE CDB 232 *****************************************************************************/ 233 typedef struct CBD6_s { 234 bit8 opcode; 235 bit8 rsv; /* not 100% correct */ 236 bit8 lba[2]; /* not 100% correct */ 237 bit8 len; 238 bit8 control; 239 } CDB6_t; 240 241 242 243 /***************************************************************************** 244 ** SCSI GENERIC 10 BYTE CDB 245 *****************************************************************************/ 246 typedef struct CBD10_s { 247 bit8 opcode; 248 bit8 rsv_service; 249 bit8 lba[4]; 250 bit8 rsv; 251 bit8 len[2]; 252 bit8 control; 253 } CDB10_t; 254 255 /***************************************************************************** 256 ** SCSI GENERIC 12 BYTE CDB 257 *****************************************************************************/ 258 typedef struct CBD12_s { 259 bit8 opcode; 260 bit8 rsv_service; 261 bit8 lba[4]; 262 bit8 len[4]; 263 bit8 rsv; 264 bit8 control; 265 } CDB12_t; 266 267 268 /***************************************************************************** 269 ** SCSI GENERIC 16 BYTE CDB 270 *****************************************************************************/ 271 typedef struct CBD16_s { 272 bit8 opcode; 273 bit8 rsv_service; 274 bit8 lba[4]; 275 bit8 add_cdb[4]; 276 bit8 len[4]; 277 bit8 rsv; 278 bit8 control; 279 } CDB16_t; 280 281 #define BLOCK_BYTE_LENGTH 512 282 283 /***************************************************************************** 284 ** SCSI STATUS BYTES 285 *****************************************************************************/ 286 287 #define SCSI_STATUS_GOOD 0x00 288 #define SCSI_STATUS_CHECK_CONDITION 0x02 289 #define SCSI_STATUS_BUSY 0x08 290 #define SCSI_STATUS_COMMAND_TERMINATED 0x22 291 #define SCSI_STATUS_TASK_SET_FULL 0x28 292 293 /***************************************************************************** 294 ** SAS TM Function data present see SAS spec p311 Table 109 (Revision 7) 295 *****************************************************************************/ 296 #define NO_DATA 0 297 #define RESPONSE_DATA 1 298 #define SENSE_DATA 2 299 300 /* 4 bytes, SAS spec p312 Table 110 (Revision 7) */ 301 #define RESPONSE_DATA_LEN 4 302 303 #define SAS_CMND 0 304 #define SAS_TM 1 305 306 /* SMP frame type */ 307 #define SMP_REQUEST 0x40 308 #define SMP_RESPONSE 0x41 309 310 #define SMP_INITIATOR 0x01 311 #define SMP_TARGET 0x02 312 313 /* default SMP timeout: 0xFFFF is the Maximum Allowed */ 314 #define DEFAULT_SMP_TIMEOUT 0xFFFF 315 316 /* SMP direct payload size limit: IOMB direct payload size = 48 */ 317 #define SMP_DIRECT_PAYLOAD_LIMIT 44 318 319 /* SMP function */ 320 #define SMP_REPORT_GENERAL 0x00 321 #define SMP_REPORT_MANUFACTURE_INFORMATION 0x01 322 #define SMP_READ_GPIO_REGISTER 0x02 323 #define SMP_DISCOVER 0x10 324 #define SMP_REPORT_PHY_ERROR_LOG 0x11 325 #define SMP_REPORT_PHY_SATA 0x12 326 #define SMP_REPORT_ROUTING_INFORMATION 0x13 327 #define SMP_WRITE_GPIO_REGISTER 0x82 328 #define SMP_CONFIGURE_ROUTING_INFORMATION 0x90 329 #define SMP_PHY_CONTROL 0x91 330 #define SMP_PHY_TEST_FUNCTION 0x92 331 #define SMP_PMC_SPECIFIC 0xC0 332 333 334 /* SMP function results */ 335 #define SMP_FUNCTION_ACCEPTED 0x00 336 #define UNKNOWN_SMP_FUNCTION 0x01 337 #define SMP_FUNCTION_FAILED 0x02 338 #define INVALID_REQUEST_FRAME_LENGTH 0x03 339 #define INVALID_EXPANDER_CHANGE_COUNT 0x04 340 #define SMP_FN_BUSY 0x05 341 #define INCOMPLETE_DESCRIPTOR_LIST 0x06 342 #define PHY_DOES_NOT_EXIST 0x10 343 #define INDEX_DOES_NOT_EXIST 0x11 344 #define PHY_DOES_NOT_SUPPORT_SATA 0x12 345 #define UNKNOWN_PHY_OPERATION 0x13 346 #define UNKNOWN_PHY_TEST_FUNCTION 0x14 347 #define PHY_TEST_FUNCTION_IN_PROGRESS 0x15 348 #define PHY_VACANT 0x16 349 #define UNKNOWN_PHY_EVENT_SOURCE 0x17 350 #define UNKNOWN_DESCRIPTOT_TYPE 0x18 351 #define UNKNOWN_PHY_FILETER 0x19 352 #define AFFILIATION_VIOLATION 0x1A 353 #define SMP_ZONE_VIOLATION 0x20 354 #define NO_MANAGEMENT_ACCESS_RIGHTS 0x21 355 #define UNKNOWN_ENABLE_DISABLE_ZONING_VALUE 0x22 356 #define ZONE_LOCK_VIOLATION 0x23 357 #define NOT_ACTIVATED 0x24 358 #define ZONE_GROUP_OUT_OF_RANGE 0x25 359 #define NO_PHYSICAL_PRESENCE 0x26 360 #define SAVING_NOT_SUPPORTED 0x27 361 #define SOURCE_ZONE_GROUP_DOES_NOT_EXIST 0x28 362 #define DISABLED_PASSWORD_NOT_SUPPORTED 0x29 363 364 /* SMP PHY CONTROL OPERATION */ 365 #define SMP_PHY_CONTROL_NOP 0x00 366 #define SMP_PHY_CONTROL_LINK_RESET 0x01 367 #define SMP_PHY_CONTROL_HARD_RESET 0x02 368 #define SMP_PHY_CONTROL_DISABLE 0x03 369 #define SMP_PHY_CONTROL_CLEAR_ERROR_LOG 0x05 370 #define SMP_PHY_CONTROL_CLEAR_AFFILIATION 0x06 371 #define SMP_PHY_CONTROL_XMIT_SATA_PS_SIGNAL 0x07 372 373 374 #define IT_NEXUS_TIMEOUT 0x7D0 /* 2000 ms; old value was 0xFFFF */ 375 376 #define PORT_RECOVERY_TIMEOUT ((IT_NEXUS_TIMEOUT/100) + 30) /* 5000 ms; in 100ms; should be large than IT_NEXUS_TIMEOUT */ 377 378 #define STP_IDLE_TIME 5 /* 5 us; the defaulf of the controller */ 379 380 #define SET_ESGL_EXTEND(val) \ 381 ((val) = (val) | 0x80000000) 382 383 #define CLEAR_ESGL_EXTEND(val) \ 384 ((val) = (val) & 0x7FFFFFFF) 385 386 #define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \ 387 DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo) 388 389 #define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \ 390 DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi) 391 392 /* this macro is based on SAS spec, not sTSDK 0xC0 */ 393 #define DEVINFO_GET_DEVICETTYPE(devInfo) \ 394 (((devInfo)->devType_S_Rate & 0xC0) >> 6) 395 396 #define DEVINFO_GET_LINKRATE(devInfo) \ 397 ((devInfo)->devType_S_Rate & 0x0F) 398 399 #define DEVINFO_GET_EXT_MCN(devInfo) \ 400 (((devInfo)->ext & 0x7800) >> 11) 401 402 403 #define DEVINFO_PUT_SMPTO(devInfo, smpto) \ 404 ((devInfo)->smpTimeout) = smpto 405 406 #define DEVINFO_PUT_ITNEXUSTO(devInfo, itnexusto) \ 407 ((devInfo)->it_NexusTimeout) = itnexusto 408 409 #define DEVINFO_PUT_FBS(devInfo, fbs) \ 410 ((devInfo)->firstBurstSize) = fbs 411 412 #define DEVINFO_PUT_FLAG(devInfo, tlr) \ 413 ((devInfo)->flag) = tlr 414 415 #define DEVINFO_PUT_DEV_S_RATE(devInfo, dev_s_rate) \ 416 ((devInfo)->devType_S_Rate) = dev_s_rate 417 418 #define DEVINFO_PUT_SAS_ADDRESSLO(devInfo, src32) \ 419 *(bit32 *)((devInfo)->sasAddressLo) = BIT32_TO_DMA_BEBIT32(src32) 420 421 #define DEVINFO_PUT_SAS_ADDRESSHI(devInfo, src32) \ 422 *(bit32 *)((devInfo)->sasAddressHi) = BIT32_TO_DMA_BEBIT32(src32) 423 424 #define DEVICE_SSP_BIT 0x8 /* SSP Initiator port */ 425 #define DEVICE_STP_BIT 0x4 /* STP Initiator port */ 426 #define DEVICE_SMP_BIT 0x2 /* SMP Initiator port */ 427 #define DEVICE_SATA_BIT 0x1 /* SATA device, valid in the discovery response only */ 428 429 #define DEVICE_IS_SSP_INITIATOR(DeviceData) \ 430 (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT) 431 432 #define DEVICE_IS_STP_INITIATOR(DeviceData) \ 433 (((DeviceData)->initiator_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT) 434 435 #define DEVICE_IS_SMP_INITIATOR(DeviceData) \ 436 (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT) 437 438 #define DEVICE_IS_SSP_TARGET(DeviceData) \ 439 (((DeviceData)->target_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT) 440 441 #define DEVICE_IS_STP_TARGET(DeviceData) \ 442 (((DeviceData)->target_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT) 443 444 #define DEVICE_IS_SMP_TARGET(DeviceData) \ 445 (((DeviceData)->target_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT) 446 447 #define DEVICE_IS_SATA_DEVICE(DeviceData) \ 448 (((DeviceData)->target_ssp_stp_smp & DEVICE_SATA_BIT) == DEVICE_SATA_BIT) 449 450 451 452 453 /* Negotiated Phyical Link Rate 454 #define Phy_ENABLED_UNKNOWN 455 */ 456 /* old SMP header definition */ 457 typedef struct tdssSMPFrameHeader_s 458 { 459 bit8 smpFrameType; /* The first byte of SMP frame represents the SMP FRAME TYPE */ 460 bit8 smpFunction; /* The second byte of the SMP frame represents the SMP FUNCTION */ 461 bit8 smpFunctionResult; /* The third byte of SMP frame represents FUNCTION RESULT of the SMP response. */ 462 bit8 smpReserved; /* reserved */ 463 } tdssSMPFrameHeader_t; 464 465 /**************************************************************** 466 * report general request 467 ****************************************************************/ 468 #ifdef FOR_COMPLETENESS 469 typedef struct smpReqReportGeneral_s 470 { 471 /* nothing. some compiler disallowed structure with no member */ 472 } smpReqReportGeneral_t; 473 #endif 474 475 /**************************************************************** 476 * report general response 477 ****************************************************************/ 478 #define REPORT_GENERAL_CONFIGURING_BIT 0x2 479 #define REPORT_GENERAL_CONFIGURABLE_BIT 0x1 480 481 typedef struct smpRespReportGeneral_s 482 { 483 bit8 expanderChangeCount16[2]; 484 bit8 expanderRouteIndexes16[2]; 485 bit8 reserved1; 486 bit8 numOfPhys; 487 bit8 configuring_configurable; 488 /* B7-2 : reserved */ 489 /* B1 : configuring */ 490 /* B0 : configurable */ 491 bit8 reserved4[17]; 492 } smpRespReportGeneral_t; 493 494 #define REPORT_GENERAL_IS_CONFIGURING(pResp) \ 495 (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURING_BIT) == \ 496 REPORT_GENERAL_CONFIGURING_BIT) 497 498 #define REPORT_GENERAL_IS_CONFIGURABLE(pResp) \ 499 (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURABLE_BIT) == \ 500 REPORT_GENERAL_CONFIGURABLE_BIT) 501 502 #define REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \ 503 DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16)) 504 505 506 /**************************************************************** 507 * report manufacturer info response 508 ****************************************************************/ 509 typedef struct smpRespReportManufactureInfo_s 510 { 511 bit8 reserved1[8]; 512 bit8 vendorIdentification[8]; 513 bit8 productIdentification[16]; 514 bit8 productRevisionLevel[4]; 515 bit8 vendorSpecific[20]; 516 } smpRespReportManufactureInfo_t; 517 518 /**************************************************************** 519 * discover request 520 ****************************************************************/ 521 typedef struct smpReqDiscover_s 522 { 523 bit32 reserved1; 524 bit8 reserved2; 525 bit8 phyIdentifier; 526 bit8 ignored; 527 bit8 reserved3; 528 } smpReqDiscover_t; 529 530 /**************************************************************** 531 * discover response 532 ****************************************************************/ 533 typedef struct smpRespDiscover_s 534 { 535 bit8 reserved1[4]; 536 bit8 reserved2; 537 bit8 phyIdentifier; 538 bit8 reserved3[2]; 539 bit8 attachedDeviceType; 540 /* B7 : reserved */ 541 /* B6-4 : attachedDeviceType */ 542 /* B3-0 : reserved */ 543 bit8 negotiatedPhyLinkRate; 544 /* B7-4 : reserved */ 545 /* B3-0 : negotiatedPhyLinkRate */ 546 bit8 attached_Ssp_Stp_Smp_Sata_Initiator; 547 /* B7-4 : reserved */ 548 /* B3 : attachedSspInitiator */ 549 /* B2 : attachedStpInitiator */ 550 /* B1 : attachedSmpInitiator */ 551 /* B0 : attachedSataHost */ 552 bit8 attached_SataPS_Ssp_Stp_Smp_Sata_Target; 553 /* B7 : attachedSataPortSelector */ 554 /* B6-4 : reserved */ 555 /* B3 : attachedSspTarget */ 556 /* B2 : attachedStpTarget */ 557 /* B1 : attachedSmpTarget */ 558 /* B0 : attachedSatadevice */ 559 bit8 sasAddressHi[4]; 560 bit8 sasAddressLo[4]; 561 bit8 attachedSasAddressHi[4]; 562 bit8 attachedSasAddressLo[4]; 563 bit8 attachedPhyIdentifier; 564 bit8 reserved9[7]; 565 bit8 programmedAndHardware_MinPhyLinkRate; 566 /* B7-4 : programmedMinPhyLinkRate */ 567 /* B3-0 : hardwareMinPhyLinkRate */ 568 bit8 programmedAndHardware_MaxPhyLinkRate; 569 /* B7-4 : programmedMaxPhyLinkRate */ 570 /* B3-0 : hardwareMaxPhyLinkRate */ 571 bit8 phyChangeCount; 572 bit8 virtualPhy_partialPathwayTimeout; 573 /* B7 : virtualPhy*/ 574 /* B6-4 : reserved */ 575 /* B3-0 : partialPathwayTimeout */ 576 bit8 routingAttribute; 577 /* B7-4 : reserved */ 578 /* B3-0 : routingAttribute */ 579 bit8 reserved13[5]; 580 bit8 vendorSpecific[2]; 581 } smpRespDiscover_t; 582 583 #define DISCRSP_SSP_BIT 0x08 584 #define DISCRSP_STP_BIT 0x04 585 #define DISCRSP_SMP_BIT 0x02 586 #define DISCRSP_SATA_BIT 0x01 587 588 #define DISCRSP_SATA_PS_BIT 0x80 589 590 #define DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \ 591 (((pResp)->attachedDeviceType & 0x70) >> 4) 592 #define DISCRSP_GET_LINKRATE(pResp) \ 593 ((bit8)((pResp)->negotiatedPhyLinkRate & 0x0F)) 594 595 #define DISCRSP_IS_SSP_INITIATOR(pResp) \ 596 (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT) 597 #define DISCRSP_IS_STP_INITIATOR(pResp) \ 598 (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_STP_BIT) == DISCRSP_STP_BIT) 599 #define DISCRSP_IS_SMP_INITIATOR(pResp) \ 600 (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT) 601 #define DISCRSP_IS_SATA_HOST(pResp) \ 602 (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT) 603 604 #define DISCRSP_IS_SSP_TARGET(pResp) \ 605 (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT) 606 #define DISCRSP_IS_STP_TARGET(pResp) \ 607 (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_STP_BIT) == DISCRSP_STP_BIT) 608 #define DISCRSP_IS_SMP_TARGET(pResp) \ 609 (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT) 610 #define DISCRSP_IS_SATA_DEVICE(pResp) \ 611 (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT) 612 #define DISCRSP_IS_SATA_PORTSELECTOR(pResp) \ 613 (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_PS_BIT) == DISCRSP_SATA_PS_BIT) 614 615 #define DISCRSP_GET_SAS_ADDRESSHI(pResp) \ 616 DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi) 617 #define DISCRSP_GET_SAS_ADDRESSLO(pResp) \ 618 DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo) 619 620 #define DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \ 621 DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi) 622 #define DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \ 623 DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo) 624 625 #define DISCRSP_VIRTUALPHY_BIT 0x80 626 #define DISCRSP_IS_VIRTUALPHY(pResp) \ 627 (((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT) 628 629 #define DISCRSP_GET_ROUTINGATTRIB(pResp) \ 630 ((bit8)((pResp)->routingAttribute & 0x0F)) 631 632 /**************************************************************** 633 * report route table request 634 ****************************************************************/ 635 typedef struct smpReqReportRouteTable_s 636 { 637 bit8 reserved1[2]; 638 bit8 expanderRouteIndex16[20]; 639 bit8 reserved2; 640 bit8 phyIdentifier; 641 bit8 reserved3[2]; 642 } smpReqReportRouteTable_t; 643 644 /**************************************************************** 645 * report route response 646 ****************************************************************/ 647 typedef struct smpRespReportRouteTable_s 648 { 649 bit8 reserved1[2]; 650 bit8 expanderRouteIndex16[2]; 651 bit8 reserved2; 652 bit8 phyIdentifier; 653 bit8 reserved3[2]; 654 bit8 disabled; 655 /* B7 : expander route entry disabled */ 656 /* B6-0 : reserved */ 657 bit8 reserved5[3]; 658 bit8 routedSasAddressHi32[4]; 659 bit8 routedSasAddressLo32[4]; 660 bit8 reserved6[16]; 661 } smpRespReportRouteTable_t; 662 663 /**************************************************************** 664 * configure route information request 665 ****************************************************************/ 666 typedef struct smpReqConfigureRouteInformation_s 667 { 668 bit8 reserved1[2]; 669 bit8 expanderRouteIndex[2]; 670 bit8 reserved2; 671 bit8 phyIdentifier; 672 bit8 reserved3[2]; 673 bit8 disabledBit_reserved4; 674 bit8 reserved5[3]; 675 bit8 routedSasAddressHi[4]; 676 bit8 routedSasAddressLo[4]; 677 bit8 reserved6[16]; 678 } smpReqConfigureRouteInformation_t; 679 680 /**************************************************************** 681 * configure route response 682 ****************************************************************/ 683 #ifdef FOR_COMPLETENESS 684 typedef struct smpRespConfigureRouteInformation_s 685 { 686 /* nothing. some compiler disallowed structure with no member */ 687 } smpRespConfigureRouteInformation_t; 688 #endif 689 690 /**************************************************************** 691 * report Phy Sata request 692 ****************************************************************/ 693 typedef struct smpReqReportPhySata_s 694 { 695 bit8 reserved1[4]; 696 bit8 reserved2; 697 bit8 phyIdentifier; 698 bit8 reserved3[2]; 699 } smpReqReportPhySata_t; 700 701 /**************************************************************** 702 * report Phy Sata response 703 ****************************************************************/ 704 typedef struct smpRespReportPhySata_s 705 { 706 bit8 reserved1[4]; 707 bit8 reserved2; 708 bit8 phyIdentifier; 709 bit8 reserved3; 710 bit8 affiliations_sup_valid; 711 /* b7-2 : reserved */ 712 /* b1 : Affiliations supported */ 713 /* b0 : Affiliation valid */ 714 bit8 reserved5[4]; 715 bit8 stpSasAddressHi[4]; 716 bit8 stpSasAddressLo[4]; 717 bit8 regDevToHostFis[20]; 718 bit8 reserved6[4]; 719 bit8 affiliatedStpInitiatorSasAddressHi[4]; 720 bit8 affiliatedStpInitiatorSasAddressLo[4]; 721 } smpRespReportPhySata_t; 722 723 724 /**************************************************************** 725 * Phy Control request 726 ****************************************************************/ 727 typedef struct smpReqPhyControl_s 728 { 729 bit8 reserved1[4]; 730 bit8 reserved2; 731 bit8 phyIdentifier; 732 bit8 phyOperation; 733 bit8 updatePartialPathwayTOValue; 734 /* b7-1 : reserved */ 735 /* b0 : update partial pathway timeout value */ 736 bit8 reserved3[20]; 737 bit8 programmedMinPhysicalLinkRate; 738 /* b7-4 : programmed Minimum Physical Link Rate*/ 739 /* b3-0 : reserved */ 740 bit8 programmedMaxPhysicalLinkRate; 741 /* b7-4 : programmed Maximum Physical Link Rate*/ 742 /* b3-0 : reserved */ 743 bit8 reserved4[2]; 744 bit8 partialPathwayTOValue; 745 /* b7-4 : reserved */ 746 /* b3-0 : partial Pathway TO Value */ 747 bit8 reserved5[3]; 748 } smpReqPhyControl_t; 749 750 /**************************************************************** 751 * Phy Control response 752 ****************************************************************/ 753 #ifdef FOR_COMPLETENESS 754 typedef struct smpRespPhyControl_s 755 { 756 /* nothing. some compiler disallowed structure with no member */ 757 } smpRespPhyControl_t; 758 #endif 759 760 761 /***************************************************************************** 762 ** SCSI SENSE KEY VALUES 763 *****************************************************************************/ 764 765 #define SCSI_SNSKEY_NO_SENSE 0x00 766 #define SCSI_SNSKEY_RECOVERED_ERROR 0x01 767 #define SCSI_SNSKEY_NOT_READY 0x02 768 #define SCSI_SNSKEY_MEDIUM_ERROR 0x03 769 #define SCSI_SNSKEY_HARDWARE_ERROR 0x04 770 #define SCSI_SNSKEY_ILLEGAL_REQUEST 0x05 771 #define SCSI_SNSKEY_UNIT_ATTENTION 0x06 772 #define SCSI_SNSKEY_DATA_PROTECT 0x07 773 #define SCSI_SNSKEY_ABORTED_COMMAND 0x0B 774 #define SCSI_SNSKEY_MISCOMPARE 0x0E 775 776 /***************************************************************************** 777 ** SCSI Additional Sense Codes and Qualifiers combo two-bytes 778 *****************************************************************************/ 779 780 #define SCSI_SNSCODE_NO_ADDITIONAL_INFO 0x0000 781 #define SCSI_SNSCODE_LUN_CRC_ERROR_DETECTED 0x0803 782 #define SCSI_SNSCODE_INVALID_COMMAND 0x2000 783 #define SCSI_SNSCODE_LOGICAL_BLOCK_OUT 0x2100 784 #define SCSI_SNSCODE_INVALID_FIELD_IN_CDB 0x2400 785 #define SCSI_SNSCODE_LOGICAL_NOT_SUPPORTED 0x2500 786 #define SCSI_SNSCODE_POWERON_RESET 0x2900 787 #define SCSI_SNSCODE_EVERLAPPED_CMDS 0x4e00 788 #define SCSI_SNSCODE_INTERNAL_TARGET_FAILURE 0x4400 789 #define SCSI_SNSCODE_MEDIUM_NOT_PRESENT 0x3a00 790 #define SCSI_SNSCODE_UNRECOVERED_READ_ERROR 0x1100 791 #define SCSI_SNSCODE_RECORD_NOT_FOUND 0x1401 792 #define SCSI_SNSCODE_NOT_READY_TO_READY_CHANGE 0x2800 793 #define SCSI_SNSCODE_OPERATOR_MEDIUM_REMOVAL_REQUEST 0x5a01 794 #define SCSI_SNSCODE_INFORMATION_UNIT_CRC_ERROR 0x4703 795 #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS 0x0404 796 #define SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE 0x5d10 797 #define SCSI_SNSCODE_LOW_POWER_CONDITION_ON 0x5e00 798 #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INIT_REQUIRED 0x0402 799 #define SCSI_SNSCODE_INVALID_FIELD_PARAMETER_LIST 0x2600 800 #define SCSI_SNSCODE_ATA_DEVICE_FAILED_SET_FEATURES 0x4471 801 #define SCSI_SNSCODE_ATA_DEVICE_FEATURE_NOT_ENABLED 0x670B 802 #define SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST 0x3E03 803 #define SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR 0x2C00 804 #define SCSI_SNSCODE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x2100 805 #define SCSI_SNSCODE_LOGICAL_UNIT_FAILURE 0x3E01 806 #define SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED 0x5300 807 #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INITIALIZING_COMMAND_REQUIRED 0x0402 808 #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE 0x0400 809 #define SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION 0x0500 810 #define SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN 0x4000 811 #define SCSI_SNSCODE_COMMANDS_CLEARED_BY_ANOTHER_INITIATOR 0x2F00 812 #define SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED 0x0C02 813 /***************************************************************************** 814 ** SCSI Additional Sense Codes and Qualifiers saparate bytes 815 *****************************************************************************/ 816 817 #define SCSI_ASC_NOTREADY_INIT_CMD_REQ 0x04 818 #define SCSI_ASCQ_NOTREADY_INIT_CMD_REQ 0x02 819 820 821 /***************************************************************************** 822 ** Inquiry command fields and response sizes 823 *****************************************************************************/ 824 #define SCSIOP_INQUIRY_CMDDT 0x02 825 #define SCSIOP_INQUIRY_EVPD 0x01 826 #define STANDARD_INQUIRY_SIZE 36 827 #define SATA_PAGE83_INQUIRY_WWN_SIZE 16 /* SAT, revision8, Table81, p78, 12 + 4 */ 828 #define SATA_PAGE83_INQUIRY_NO_WWN_SIZE 76 /* SAT, revision8, Table81, p78, 72 + 4 */ 829 #define SATA_PAGE89_INQUIRY_SIZE 572 /* SAT, revision8, Table87, p84 */ 830 #define SATA_PAGE0_INQUIRY_SIZE 8 /* SPC-4, 7.6.9 Table331, p345 */ 831 #define SATA_PAGE80_INQUIRY_SIZE 24 /* SAT, revision8, Table79, p77 */ 832 833 834 /* not sure here */ 835 /* define byte swap macro */ 836 #define AGSA_FLIP_2_BYTES(_x) ((bit16)(((((bit16)(_x))&0x00FF)<<8)| \ 837 ((((bit16)(_x))&0xFF00)>>8))) 838 839 #define AGSA_FLIP_4_BYTES(_x) ((bit32)(((((bit32)(_x))&0x000000FF)<<24)| \ 840 ((((bit32)(_x))&0x0000FF00)<<8)| \ 841 ((((bit32)(_x))&0x00FF0000)>>8)| \ 842 ((((bit32)(_x))&0xFF000000)>>24))) 843 844 845 /********************************************************************* 846 ** BUFFER CONVERTION MACROS 847 *********************************************************************/ 848 849 /********************************************************************* 850 * CPU buffer access macro * 851 * * 852 */ 853 854 #define OSSA_OFFSET_OF(STRUCT_TYPE, FEILD) \ 855 (bitptr)&(((STRUCT_TYPE *)0)->FEILD) 856 857 858 #if defined(SA_CPU_LITTLE_ENDIAN) 859 860 #define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16) \ 861 (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16); 862 863 #define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32) \ 864 (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32); 865 866 #define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET) \ 867 (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) 868 869 #define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET) \ 870 (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) 871 872 #define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16) \ 873 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit8)((((bit16)VALUE16)>>8)&0xFF); \ 874 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)(((bit16)VALUE16)&0xFF); 875 876 #define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32) \ 877 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit8)((((bit32)VALUE32)>>24)&0xFF); \ 878 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>16)&0xFF); \ 879 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>8)&0xFF); \ 880 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)(((bit32)VALUE32)&0xFF); 881 882 #define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET) \ 883 (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); \ 884 (*(bit8 *)(((bit8 *)ADDR16))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); 885 886 #define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET) \ 887 (*(bit8 *)(((bit8 *)ADDR32)+3)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); \ 888 (*(bit8 *)(((bit8 *)ADDR32)+2)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \ 889 (*(bit8 *)(((bit8 *)ADDR32)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \ 890 (*(bit8 *)(((bit8 *)ADDR32))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))); 891 892 #define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN) \ 893 si_memcpy(DEST_ADDR, SRC_ADDR, LEN); 894 895 896 #elif defined(SA_CPU_BIG_ENDIAN) 897 898 #define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16) \ 899 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit16)VALUE16)>>8)&0xFF); \ 900 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit8)(((bit16)VALUE16)&0xFF); 901 902 #define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32) \ 903 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)((((bit32)VALUE32)>>24)&0xFF); \ 904 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>16)&0xFF); \ 905 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>8)&0xFF); \ 906 (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit8)(((bit32)VALUE32)&0xFF); 907 908 #define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET) \ 909 (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); \ 910 (*(bit8 *)(((bit8 *)ADDR16))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); 911 912 #define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET) \ 913 (*((bit8 *)(((bit8 *)ADDR32)+3))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); \ 914 (*((bit8 *)(((bit8 *)ADDR32)+2))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \ 915 (*((bit8 *)(((bit8 *)ADDR32)+1))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \ 916 (*((bit8 *)(((bit8 *)ADDR32)))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))); 917 918 #define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16) \ 919 (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16); 920 921 #define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32) \ 922 (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32); 923 924 #define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET) \ 925 (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); 926 927 #define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET) \ 928 (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))); 929 930 #define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN) \ 931 si_memcpy(DEST_ADDR, SRC_ADDR, LEN); 932 933 #else 934 935 #error (Host CPU endianess undefined!!) 936 937 #endif 938 939 940 #if defined(SA_CPU_LITTLE_ENDIAN) 941 942 #ifndef LEBIT16_TO_BIT16 943 #define LEBIT16_TO_BIT16(_x) (_x) 944 #endif 945 946 #ifndef BIT16_TO_LEBIT16 947 #define BIT16_TO_LEBIT16(_x) (_x) 948 #endif 949 950 #ifndef BIT16_TO_BEBIT16 951 #define BIT16_TO_BEBIT16(_x) AGSA_FLIP_2_BYTES(_x) 952 #endif 953 954 #ifndef BEBIT16_TO_BIT16 955 #define BEBIT16_TO_BIT16(_x) AGSA_FLIP_2_BYTES(_x) 956 #endif 957 958 #ifndef LEBIT32_TO_BIT32 959 #define LEBIT32_TO_BIT32(_x) (_x) 960 #endif 961 962 #ifndef BIT32_TO_LEBIT32 963 #define BIT32_TO_LEBIT32(_x) (_x) 964 #endif 965 966 967 #ifndef BEBIT32_TO_BIT32 968 #define BEBIT32_TO_BIT32(_x) AGSA_FLIP_4_BYTES(_x) 969 #endif 970 971 #ifndef BIT32_TO_BEBIT32 972 #define BIT32_TO_BEBIT32(_x) AGSA_FLIP_4_BYTES(_x) 973 #endif 974 975 #elif defined(SA_CPU_BIG_ENDIAN) 976 977 #ifndef LEBIT16_TO_BIT16 978 #define LEBIT16_TO_BIT16(_x) AGSA_FLIP_2_BYTES(_x) 979 #endif 980 981 #ifndef BIT16_TO_LEBIT16 982 #define BIT16_TO_LEBIT16(_x) AGSA_FLIP_2_BYTES(_x) 983 #endif 984 985 #ifndef BIT16_TO_BEBIT16 986 #define BIT16_TO_BEBIT16(_x) (_x) 987 #endif 988 989 #ifndef BEBIT16_TO_BIT16 990 #define BEBIT16_TO_BIT16(_x) (_x) 991 #endif 992 993 #ifndef LEBIT32_TO_BIT32 994 #define LEBIT32_TO_BIT32(_x) AGSA_FLIP_4_BYTES(_x) 995 #endif 996 997 #ifndef BIT32_TO_LEBIT32 998 #define BIT32_TO_LEBIT32(_x) AGSA_FLIP_4_BYTES(_x) 999 #endif 1000 1001 #ifndef BEBIT32_TO_BIT32 1002 #define BEBIT32_TO_BIT32(_x) (_x) 1003 #endif 1004 1005 #ifndef BIT32_TO_BEBIT32 1006 #define BIT32_TO_BEBIT32(_x) (_x) 1007 #endif 1008 1009 #else 1010 1011 #error No definition of SA_CPU_BIG_ENDIAN or SA_CPU_LITTLE_ENDIAN 1012 1013 #endif 1014 1015 1016 #define TargetUnknown 0 1017 #define TargetRead 1 1018 #define TargetWrite 2 1019 1020 1021 #define CDB_GRP_MASK 0xE0 /* 1110 0000 */ 1022 #define CDB_6BYTE 0x00 1023 #define CDB_10BYTE1 0x20 1024 #define CDB_10BYTE2 0x40 1025 #define CDB_12BYTE 0xA0 1026 #define CDB_16BYTE 0x80 1027 1028 /* ATA device type */ 1029 #define SATA_ATA_DEVICE 0x01 /**< ATA ATA device type */ 1030 #define SATA_ATAPI_DEVICE 0x02 /**< ATA ATAPI device type */ 1031 #define SATA_PM_DEVICE 0x03 /**< ATA PM device type */ 1032 #define SATA_SEMB_DEVICE 0x04 /**< ATA SEMB device type */ 1033 #define SATA_SEMB_WO_SEP_DEVICE 0x05 /**< ATA SEMB without SEP device type */ 1034 #define UNKNOWN_DEVICE 0xFF 1035 1036 /**************************************************************** 1037 * SATA Specification related defines * 1038 ****************************************************************/ 1039 #define SATA_MAX_QUEUED_COMMANDS 32 1040 #define SATA_MAX_PM_PORTS 15 1041 1042 1043 /* PMC IOCTL signature */ 1044 #define PMC_IOCTL_SIGNATURE 0x1234 1045 1046 1047 1048 /* 1049 * FIS type 1050 */ 1051 #define PIO_SETUP_DEV_TO_HOST_FIS 0x5F 1052 #define REG_DEV_TO_HOST_FIS 0x34 1053 #define SET_DEV_BITS_FIS 0xA1 1054 1055 #define TD_ASSERT OS_ASSERT 1056 1057 #ifdef TD_DISCOVER 1058 #define TDSA_DISCOVERY_OPTION_FULL_START 0 1059 #define TDSA_DISCOVERY_OPTION_INCREMENTAL_START 1 1060 #define TDSA_DISCOVERY_OPTION_ABORT 2 1061 1062 #define TDSA_DISCOVERY_TYPE_SAS 0 1063 #define TDSA_DISCOVERY_TYPE_SATA 1 1064 1065 1066 #define DISCOVERY_TIMER_VALUE (2 * 1000 * 1000) /* 2 seconds */ 1067 #define DISCOVERY_RETRIES 3 1068 #define CONFIGURE_ROUTE_TIMER_VALUE (1 * 1000 * 1000) /* 1 seconds */ 1069 #define DEVICE_REGISTRATION_TIMER_VALUE (2 * 1000 * 1000) /* 2 seconds */ 1070 #define SMP_RETRIES 5 1071 #define SMP_BUSY_TIMER_VALUE (1 * 1000 * 1000) /* 1 second */ 1072 #define SMP_BUSY_RETRIES 5 1073 #define SATA_ID_DEVICE_DATA_TIMER_VALUE (3 * 1000 * 1000) /* 3 second */ 1074 #define SATA_ID_DEVICE_DATA_RETRIES 3 1075 #define BC_TIMER_VALUE (5 * 1000 * 1000 ) /* 5 second */ 1076 #define SMP_TIMER_VALUE (10 * 1000 * 1000) /* 10 second */ 1077 1078 #endif 1079 #define STP_DEVICE_TYPE 0 /* SATA behind expander 00*/ 1080 #define SAS_DEVICE_TYPE 1 /* SSP or SMP 01 */ 1081 #define SATA_DEVICE_TYPE 2 /* direct SATA 10 */ 1082 1083 #define ATAPI_DEVICE_FLAG 0x200000 /* ATAPI device flag*/ 1084 1085 #define TD_INTERNAL_TM_RESET 0xFF 1086 1087 /* in terms of Kbytes*/ 1088 #define HOST_EVENT_LOG_SIZE 128 1089 #define DEFAULT_EVENT_LOG_OPTION 3 1090 1091 /* Device state */ 1092 #define SAT_DEV_STATE_NORMAL 0 /* Normal */ 1093 #define SAT_DEV_STATE_IN_RECOVERY 1 /* SAT in recovery mode */ 1094 #define SAT_DEV_STATE_FORMAT_IN_PROGRESS 2 /* Format unit in progress */ 1095 #define SAT_DEV_STATE_SMART_THRESHOLD 3 /* SMART Threshold Exceeded Condition*/ 1096 #define SAT_DEV_STATE_LOW_POWER 4 /* Low Power State*/ 1097 1098 #define TD_GET_PHY_ID(input) (input & 0x0F) 1099 #define TD_GET_PHY_NUMS(input) ((input & 0xF0) >> 4) 1100 #define TD_GET_LINK_RATE(input) ((input & 0xFF00) >> 8) 1101 #define TD_GET_PORT_STATE(input) ((input & 0xF0000) >> 16) 1102 #define TD_GET_PHY_STATUS(input) ((input & 0xFF00) >> 8) 1103 #define TD_GET_RESET_STATUS(input) ((input & 0xFF00) >> 8) 1104 1105 #define TD_MAX_NUM_NOTIFY_SPINUP 20 1106 1107 #define SPC_VPD_SIGNATURE 0xFEDCBA98 1108 1109 #define TD_GET_FRAME_TYPE(input) (input & 0xFF) 1110 #define TD_GET_TLR(input) ((input & 0x300) >> 8) 1111 1112 /* PORT RESET TMO is in 100ms */ 1113 #define SAS_PORT_RESET_TMO 3 /* 300 ms */ 1114 #define SATA_PORT_RESET_TMO 80 /* 8000 ms = 8 sec */ 1115 #define SAS_12G_PORT_RESET_TMO 8 /* 800 ms */ 1116 1117 /* task attribute based on sTSDK API */ 1118 #define TD_TASK_SIMPLE 0x0 /* Simple */ 1119 #define TD_TASK_ORDERED 0x2 /* Ordered */ 1120 #define TD_TASK_HEAD_OF_QUEUE 0x1 /* Head of Queue */ 1121 #define TD_TASK_ACA 0x4 /* ACA */ 1122 1123 /* compiler flag for direct smp */ 1124 #define DIRECT_SMP 1125 //#undef DIRECT_SMP 1126 1127 #define CONFIGURE_FW_MAX_PORTS 0x20000000 1128 1129 #define NO_ACK 0xFFFF 1130 1131 #define OPEN_RETRY_RETRIES 10 1132 1133 #ifdef AGTIAPI_CTL 1134 /* scsi command/page */ 1135 #define MODE_SELECT 0x15 1136 #define PAGE_FORMAT 0x10 1137 #define DR_MODE_PG_SZ 16 1138 #define DR_MODE_PG_CODE 0x02 1139 #define DR_MODE_PG_LENGTH 0x0e 1140 #endif /* AGTIAPI_CTL */ 1141 1142 enum td_locks_e 1143 { 1144 /* for tdsaAllShared->FreeDeviceList, tdsaAllShared->MainDeviceList, 1145 oneDeviceData->MainLink, oneDeviceData->FreeLink */ 1146 TD_DEVICE_LOCK, 1147 /* for tdsaAllShared->FreePortContextList, tdsaAllShared->MainPortContextList, 1148 onePortContext->MainLink, onePortContext->FreeLink */ 1149 TD_PORT_LOCK, 1150 /* for onePortContext->discovery.discoveringExpanderList, 1151 onePortContext->discovery.UpdiscoveringExpanderList, 1152 tdsaAllShared->freeExpanderList */ 1153 TD_DISC_LOCK, 1154 /* for onePortContext->discovery.DiscoverySMPTimer, 1155 oneDeviceData->SATAIDDeviceTimer, discovery->discoveryTimer, 1156 discovery->SMPBusyTimer, discovery->BCTimer, 1157 discovery->deviceRegistrationTimer, discovery->configureRouteTimer, 1158 tdsaAllShared->itdsaIni->timerlist, tdsaAllShared->timerlist */ 1159 TD_TIMER_LOCK, 1160 #ifdef INITIATOR_DRIVER 1161 /* for tdsaAllShared->pEsglAllInfo->freelist 1162 tdsaAllShared->pEsglAllInfo->NumFreeEsglPages 1163 tdsaAllShared->pEsglPageInfo->tdlist */ 1164 TD_ESGL_LOCK, 1165 /* for satIOContext->pSatDevData->satVerifyState, 1166 satIOContext->pSatDevData->satSectorDone, 1167 satIOContext->pSatDevData->satPendingNCQIO, 1168 satIOContext->pSatDevData->satPendingIO, 1169 satIOContext->pSatDevData->satPendingNONNCQIO, 1170 satIOContext->pSatDevData->satFreeIntIoLinkList, 1171 satIOContext->pSatDevData->satActiveIntIoLinkList, 1172 satIOContext->pSatDevData->freeSATAFDMATagBitmap, 1173 satIOContext->satIoContextLink, 1174 oneDeviceData->satDevData.satIoLinkList */ 1175 TD_SATA_LOCK, 1176 #ifdef TD_INT_COALESCE 1177 /* for tdsaIntCoalCxt->FreeLink, tdsaIntCoalCxt->MainLink, 1178 tdsaIntCoalCxtHead->FreeLink, tdsaIntCoalCxtHead->MainLink */ 1179 TD_INTCOAL_LOCK, 1180 #endif 1181 #endif 1182 #ifdef TARGET_DRIVER 1183 /* for tdsaAllShared->ttdsaTgt->ttdsaXchgData.xchgFreeList, 1184 tdsaAllShared->ttdsaTgt->ttdsaXchgData.xchgBusyList */ 1185 TD_TGT_LOCK, 1186 #endif 1187 TD_MAX_LOCKS 1188 }; 1189 1190 #define TD_GET_SAS_ADDRESSLO(sasAddressLo) \ 1191 DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressLo) 1192 1193 #define TD_GET_SAS_ADDRESSHI(sasAddressHi) \ 1194 DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressHi) 1195 1196 #define TD_XFER_RDY_PRIORTY_DEVICE_FLAG (1 << 22) 1197 1198 1199 #ifdef FDS_DM 1200 /* bit32 -> bit8 array[4] */ 1201 #define PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(portInfo, src32) \ 1202 *(bit32 *)((portInfo)->sasLocalAddressLo) = BIT32_TO_DMA_BEBIT32(src32) 1203 1204 #define PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(portInfo, src32) \ 1205 *(bit32 *)((portInfo)->sasLocalAddressHi) = BIT32_TO_DMA_BEBIT32(src32) 1206 /* bit32 -> bit8 array[4] */ 1207 #define PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(portInfo, src32) \ 1208 *(bit32 *)((portInfo)->sasRemoteAddressLo) = BIT32_TO_DMA_BEBIT32(src32) 1209 #define PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(portInfo, src32) \ 1210 *(bit32 *)((portInfo)->sasRemoteAddressHi) = BIT32_TO_DMA_BEBIT32(src32) 1211 #endif /* FDS_DM */ 1212 1213 #ifdef FDS_SM 1214 /* this applies to ID data and all other SATA IOs */ 1215 #define SM_RETRIES 10 1216 #endif 1217 1218 #define TI_TIROOT_TO_tdsaRoot(t_r) (((tdsaRoot_t *)((tiRoot_t *)t_r)->tdData) ) 1219 1220 #define TI_TIROOT_TO_tdsaAllShared(t_r1) (tdsaContext_t *)&(t_r1->tdsaAllShared) 1221 1222 #define TI_TIROOT_TO_agroot(t_r2) (agsaRoot_t *)&((t_r2)->agRootNonInt) 1223 1224 1225 #define TI_TIROOT_TO_AGROOT(t_root) (TI_TIROOT_TO_agroot(TI_TIROOT_TO_tdsaAllShared(TI_TIROOT_TO_tdsaRoot(t_root)) )) 1226 1227 #define TI_VEN_DEV_SPC 0x80010000 1228 #define TI_VEN_DEV_SPCADAP 0x80810000 1229 #define TI_VEN_DEV_SPCv 0x80080000 1230 #define TI_VEN_DEV_SPCve 0x80090000 1231 #define TI_VEN_DEV_SPCvplus 0x80180000 1232 #define TI_VEN_DEV_SPCveplus 0x80190000 1233 #define TI_VEN_DEV_SPCADAPvplus 0x80880000 1234 #define TI_VEN_DEV_SPCADAPveplus 0x80890000 1235 1236 #define TI_VEN_DEV_SPC12Gv 0x80700000 1237 #define TI_VEN_DEV_SPC12Gve 0x80710000 1238 #define TI_VEN_DEV_SPC12Gvplus 0x80720000 1239 #define TI_VEN_DEV_SPC12Gveplus 0x80730000 1240 #define TI_VEN_DEV_9015 0x90150000 1241 #define TI_VEN_DEV_SPC12ADP 0x80740000 /* 8 ports KBP added*/ 1242 #define TI_VEN_DEV_SPC12ADPP 0x80760000 /* 16 ports */ 1243 #define TI_VEN_DEV_SPC12SATA 0x80060000 /* SATA HBA */ 1244 #define TI_VEN_DEV_9060 0x90600000 1245 1246 #define tIsSPC(agr) (TI_VEN_DEV_SPC == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC */ 1247 #define tIsSPCHIL(agr) (TI_VEN_DEV_SPCADAP == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC */ 1248 #define tIsSPCv(agr) (TI_VEN_DEV_SPCv == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv */ 1249 #define tIsSPCve(agr) (TI_VEN_DEV_SPCve == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve */ 1250 #define tIsSPCvplus(agr) (TI_VEN_DEV_SPCvplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */ 1251 #define tIsSPCveplus(agr) (TI_VEN_DEV_SPCveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */ 1252 #define tIsSPCADAPvplus(agr) (TI_VEN_DEV_SPCADAPvplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */ 1253 #define tIsSPCADAPveplus(agr) (TI_VEN_DEV_SPCADAPveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */ 1254 1255 #define tIsSPC12Gv(agr) (TI_VEN_DEV_SPC12Gv == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gv */ 1256 #define tIsSPC12Gve(agr) (TI_VEN_DEV_SPC12Gve == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gve */ 1257 #define tIsSPC12Gvplus(agr) (TI_VEN_DEV_SPC12Gvplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gv+ */ 1258 #define tIsSPC12Gveplus(agr) (TI_VEN_DEV_SPC12Gveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gve+ */ 1259 #define tIsSPC9015(agr) (TI_VEN_DEV_9015 == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gve+ */ 1260 #define tIsSPC9060(agr) (TI_VEN_DEV_9060 == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gve+ */ 1261 #define tIsSPC12ADP(agr) (TI_VEN_DEV_SPC12ADP == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) 1262 #define tIsSPC12ADPP(agr) (TI_VEN_DEV_SPC12ADPP == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) 1263 #define tIsSPC12SATA(agr) (TI_VEN_DEV_SPC12SATA == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) 1264 1265 #define tiIS_SPC(agr) (( tIsSPC((agr)) == 1) ? 1 : \ 1266 ( tIsSPCHIL((agr)) == 1) ? 1 : 0 ) 1267 1268 #define tiIS_HIL(agr) ((tIsSPCHIL ((agr)) == 1) ? 1 : \ 1269 (tIsSPCADAPvplus((agr)) == 1) ? 1 : \ 1270 (tIsSPCADAPveplus((agr)) == 1) ? 1 : 0 ) 1271 1272 #define tiIS_SPC6V(agr) ((tIsSPCv((agr)) == 1) ? 1 : \ 1273 (tIsSPCve((agr)) == 1) ? 1 : \ 1274 (tIsSPCvplus((agr)) == 1) ? 1 : \ 1275 (tIsSPCveplus((agr)) == 1) ? 1 : \ 1276 (tIsSPCADAPvplus((agr)) == 1) ? 1 : \ 1277 (tIsSPCADAPveplus((agr)) == 1) ? 1 : 0 ) 1278 1279 #define tIsSPCV12G(agr) ((tIsSPC12Gv(agr) == 1) ? 1 : \ 1280 (tIsSPC12Gve(agr) == 1) ? 1 : \ 1281 (tIsSPC12Gvplus(agr)== 1) ? 1 : \ 1282 (tIsSPC12Gveplus(agr)== 1) ? 1 : \ 1283 (tIsSPC9015(agr)== 1) ? 1 : \ 1284 (tIsSPC12ADP(agr)== 1) ? 1 : \ 1285 (tIsSPC12ADPP(agr)== 1) ? 1 : \ 1286 (tIsSPC12SATA(agr) == 1) ? 1 : \ 1287 (tIsSPC9060(agr) == 1) ? 1 : 0) 1288 1289 #define tiIS_8PHY(agr) ((tIsSPCv((agr)) == 1) ? 1 : \ 1290 (tIsSPCve((agr)) == 1) ? 1 : \ 1291 (tIsSPC12Gv((agr)) == 1) ? 1 : \ 1292 (tIsSPC12Gve((agr)) == 1) ? 1 : \ 1293 (tIsSPC12ADP(agr) == 1) ? 1 : 0 ) 1294 1295 #define tiIS_16PHY(agr) ((tIsSPCvplus((agr)) == 1) ? 1 : \ 1296 (tIsSPCveplus((agr)) == 1) ? 1 : \ 1297 (tIsSPCADAPvplus((agr)) == 1) ? 1 : \ 1298 (tIsSPCADAPveplus((agr)) == 1) ? 1 : \ 1299 (tIsSPC12ADPP(agr) == 1) ? 1 : \ 1300 (tIsSPC12SATA(agr) == 1) ? 1 : 0 ) 1301 1302 #define tiIS_SPC_ENC(agr)((tIsSPCve((agr)) == 1) ? 1 : \ 1303 (tIsSPCveplus((agr)) == 1) ? 1 : \ 1304 (tIsSPCADAPveplus((agr)) == 1) ? 1 : 0 ) 1305 1306 #define tIsSPCV12or6G(agr) ((tiIS_SPC6V(agr) == 1) ? 1 : \ 1307 (tIsSPCV12G(agr) == 1) ? 1 : 0) 1308 1309 #endif /* __TDDEFS_H__ */ 1310