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*****************************************************************************/ 233typedef 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*****************************************************************************/ 246typedef 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*****************************************************************************/ 258typedef 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*****************************************************************************/ 271typedef 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 */ 457typedef 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 469typedef 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 481typedef 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 ****************************************************************/ 509typedef 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 ****************************************************************/ 521typedef 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 ****************************************************************/ 533typedef 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 ****************************************************************/ 635typedef 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 ****************************************************************/ 647typedef 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 ****************************************************************/ 666typedef 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 684typedef 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 ****************************************************************/ 693typedef 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 ****************************************************************/ 704typedef 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 ****************************************************************/ 727typedef 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 754typedef 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 1142enum 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