1ba6d10abSLinus Torvalds /* SPDX-License-Identifier: GPL-2.0-only */ 22908d778SJames Bottomley /* 32908d778SJames Bottomley * SAS structures and definitions header file 42908d778SJames Bottomley * 52908d778SJames Bottomley * Copyright (C) 2005 Adaptec, Inc. All rights reserved. 62908d778SJames Bottomley * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com> 72908d778SJames Bottomley */ 82908d778SJames Bottomley 92908d778SJames Bottomley #ifndef _SAS_H_ 102908d778SJames Bottomley #define _SAS_H_ 112908d778SJames Bottomley 122908d778SJames Bottomley #include <linux/types.h> 132908d778SJames Bottomley #include <asm/byteorder.h> 142908d778SJames Bottomley 152908d778SJames Bottomley #define SAS_ADDR_SIZE 8 162908d778SJames Bottomley #define HASHED_SAS_ADDR_SIZE 3 172908d778SJames Bottomley #define SAS_ADDR(_sa) ((unsigned long long) be64_to_cpu(*(__be64 *)(_sa))) 182908d778SJames Bottomley 192908d778SJames Bottomley #define SMP_REQUEST 0x40 202908d778SJames Bottomley #define SMP_RESPONSE 0x41 212908d778SJames Bottomley 222908d778SJames Bottomley #define SSP_DATA 0x01 232908d778SJames Bottomley #define SSP_XFER_RDY 0x05 242908d778SJames Bottomley #define SSP_COMMAND 0x06 252908d778SJames Bottomley #define SSP_RESPONSE 0x07 262908d778SJames Bottomley #define SSP_TASK 0x16 272908d778SJames Bottomley 282908d778SJames Bottomley #define SMP_REPORT_GENERAL 0x00 292908d778SJames Bottomley #define SMP_REPORT_MANUF_INFO 0x01 302908d778SJames Bottomley #define SMP_READ_GPIO_REG 0x02 312908d778SJames Bottomley #define SMP_DISCOVER 0x10 322908d778SJames Bottomley #define SMP_REPORT_PHY_ERR_LOG 0x11 332908d778SJames Bottomley #define SMP_REPORT_PHY_SATA 0x12 342908d778SJames Bottomley #define SMP_REPORT_ROUTE_INFO 0x13 352908d778SJames Bottomley #define SMP_WRITE_GPIO_REG 0x82 362908d778SJames Bottomley #define SMP_CONF_ROUTE_INFO 0x90 372908d778SJames Bottomley #define SMP_PHY_CONTROL 0x91 382908d778SJames Bottomley #define SMP_PHY_TEST_FUNCTION 0x92 392908d778SJames Bottomley 402908d778SJames Bottomley #define SMP_RESP_FUNC_ACC 0x00 412908d778SJames Bottomley #define SMP_RESP_FUNC_UNK 0x01 422908d778SJames Bottomley #define SMP_RESP_FUNC_FAILED 0x02 432908d778SJames Bottomley #define SMP_RESP_INV_FRM_LEN 0x03 442908d778SJames Bottomley #define SMP_RESP_NO_PHY 0x10 452908d778SJames Bottomley #define SMP_RESP_NO_INDEX 0x11 462908d778SJames Bottomley #define SMP_RESP_PHY_NO_SATA 0x12 472908d778SJames Bottomley #define SMP_RESP_PHY_UNK_OP 0x13 482908d778SJames Bottomley #define SMP_RESP_PHY_UNK_TESTF 0x14 492908d778SJames Bottomley #define SMP_RESP_PHY_TEST_INPROG 0x15 502908d778SJames Bottomley #define SMP_RESP_PHY_VACANT 0x16 512908d778SJames Bottomley 522908d778SJames Bottomley /* SAM TMFs */ 532908d778SJames Bottomley #define TMF_ABORT_TASK 0x01 542908d778SJames Bottomley #define TMF_ABORT_TASK_SET 0x02 552908d778SJames Bottomley #define TMF_CLEAR_TASK_SET 0x04 562908d778SJames Bottomley #define TMF_LU_RESET 0x08 572908d778SJames Bottomley #define TMF_CLEAR_ACA 0x40 582908d778SJames Bottomley #define TMF_QUERY_TASK 0x80 592908d778SJames Bottomley 602908d778SJames Bottomley /* SAS TMF responses */ 612908d778SJames Bottomley #define TMF_RESP_FUNC_COMPLETE 0x00 622908d778SJames Bottomley #define TMF_RESP_INVALID_FRAME 0x02 632908d778SJames Bottomley #define TMF_RESP_FUNC_ESUPP 0x04 642908d778SJames Bottomley #define TMF_RESP_FUNC_FAILED 0x05 652908d778SJames Bottomley #define TMF_RESP_FUNC_SUCC 0x08 662908d778SJames Bottomley #define TMF_RESP_NO_LUN 0x09 672908d778SJames Bottomley #define TMF_RESP_OVERLAPPED_TAG 0x0A 682908d778SJames Bottomley 692908d778SJames Bottomley enum sas_oob_mode { 702908d778SJames Bottomley OOB_NOT_CONNECTED, 712908d778SJames Bottomley SATA_OOB_MODE, 722908d778SJames Bottomley SAS_OOB_MODE 732908d778SJames Bottomley }; 742908d778SJames Bottomley 75354cf829SDan Williams /* See sas_discover.c if you plan on changing these */ 76aa9f8328SJames Bottomley enum sas_device_type { 77aa9f8328SJames Bottomley /* these are SAS protocol defined (attached device type field) */ 78aa9f8328SJames Bottomley SAS_PHY_UNUSED = 0, 79aa9f8328SJames Bottomley SAS_END_DEVICE = 1, 80aa9f8328SJames Bottomley SAS_EDGE_EXPANDER_DEVICE = 2, 81aa9f8328SJames Bottomley SAS_FANOUT_EXPANDER_DEVICE = 3, 82aa9f8328SJames Bottomley /* these are internal to libsas */ 832908d778SJames Bottomley SAS_HA = 4, 84aa9f8328SJames Bottomley SAS_SATA_DEV = 5, 85aa9f8328SJames Bottomley SAS_SATA_PM = 7, 86aa9f8328SJames Bottomley SAS_SATA_PM_PORT = 8, 87aa9f8328SJames Bottomley SAS_SATA_PENDING = 9, 882908d778SJames Bottomley }; 892908d778SJames Bottomley 905929faf3SDarrick J. Wong enum sas_protocol { 91c79dd80dSDan Williams SAS_PROTOCOL_NONE = 0, 925929faf3SDarrick J. Wong SAS_PROTOCOL_SATA = 0x01, 935929faf3SDarrick J. Wong SAS_PROTOCOL_SMP = 0x02, 945929faf3SDarrick J. Wong SAS_PROTOCOL_STP = 0x04, 955929faf3SDarrick J. Wong SAS_PROTOCOL_SSP = 0x08, 965929faf3SDarrick J. Wong SAS_PROTOCOL_ALL = 0x0E, 9705a2a173SDan Williams SAS_PROTOCOL_STP_ALL = SAS_PROTOCOL_STP|SAS_PROTOCOL_SATA, 985c9bf363SJohn Garry /* these are internal to libsas */ 995c9bf363SJohn Garry SAS_PROTOCOL_INTERNAL_ABORT = 0x10, 1002908d778SJames Bottomley }; 1012908d778SJames Bottomley 1022908d778SJames Bottomley /* From the spec; local phys only */ 1032908d778SJames Bottomley enum phy_func { 1042908d778SJames Bottomley PHY_FUNC_NOP, 1052908d778SJames Bottomley PHY_FUNC_LINK_RESET, /* Enables the phy */ 1062908d778SJames Bottomley PHY_FUNC_HARD_RESET, 1072908d778SJames Bottomley PHY_FUNC_DISABLE, 1082908d778SJames Bottomley PHY_FUNC_CLEAR_ERROR_LOG = 5, 1092908d778SJames Bottomley PHY_FUNC_CLEAR_AFFIL, 1102908d778SJames Bottomley PHY_FUNC_TX_SATA_PS_SIGNAL, 1112908d778SJames Bottomley PHY_FUNC_RELEASE_SPINUP_HOLD = 0x10, /* LOCAL PORT ONLY! */ 112a01e70e5SJames Bottomley PHY_FUNC_SET_LINK_RATE, 113ac013ed1SDan Williams PHY_FUNC_GET_EVENTS, 1142908d778SJames Bottomley }; 1152908d778SJames Bottomley 1162908d778SJames Bottomley /* SAS LLDD would need to report only _very_few_ of those, like BROADCAST. 1172908d778SJames Bottomley * Most of those are here for completeness. 1182908d778SJames Bottomley */ 1192908d778SJames Bottomley enum sas_prim { 1202908d778SJames Bottomley SAS_PRIM_AIP_NORMAL = 1, 1212908d778SJames Bottomley SAS_PRIM_AIP_R0 = 2, 1222908d778SJames Bottomley SAS_PRIM_AIP_R1 = 3, 1232908d778SJames Bottomley SAS_PRIM_AIP_R2 = 4, 1242908d778SJames Bottomley SAS_PRIM_AIP_WC = 5, 1252908d778SJames Bottomley SAS_PRIM_AIP_WD = 6, 1262908d778SJames Bottomley SAS_PRIM_AIP_WP = 7, 1272908d778SJames Bottomley SAS_PRIM_AIP_RWP = 8, 1282908d778SJames Bottomley 1292908d778SJames Bottomley SAS_PRIM_BC_CH = 9, 1302908d778SJames Bottomley SAS_PRIM_BC_RCH0 = 10, 1312908d778SJames Bottomley SAS_PRIM_BC_RCH1 = 11, 1322908d778SJames Bottomley SAS_PRIM_BC_R0 = 12, 1332908d778SJames Bottomley SAS_PRIM_BC_R1 = 13, 1342908d778SJames Bottomley SAS_PRIM_BC_R2 = 14, 1352908d778SJames Bottomley SAS_PRIM_BC_R3 = 15, 1362908d778SJames Bottomley SAS_PRIM_BC_R4 = 16, 1372908d778SJames Bottomley 1382908d778SJames Bottomley SAS_PRIM_NOTIFY_ENSP= 17, 1392908d778SJames Bottomley SAS_PRIM_NOTIFY_R0 = 18, 1402908d778SJames Bottomley SAS_PRIM_NOTIFY_R1 = 19, 1412908d778SJames Bottomley SAS_PRIM_NOTIFY_R2 = 20, 1422908d778SJames Bottomley 1432908d778SJames Bottomley SAS_PRIM_CLOSE_CLAF = 21, 1442908d778SJames Bottomley SAS_PRIM_CLOSE_NORM = 22, 1452908d778SJames Bottomley SAS_PRIM_CLOSE_R0 = 23, 1462908d778SJames Bottomley SAS_PRIM_CLOSE_R1 = 24, 1472908d778SJames Bottomley 1482908d778SJames Bottomley SAS_PRIM_OPEN_RTRY = 25, 1492908d778SJames Bottomley SAS_PRIM_OPEN_RJCT = 26, 1502908d778SJames Bottomley SAS_PRIM_OPEN_ACPT = 27, 1512908d778SJames Bottomley 1522908d778SJames Bottomley SAS_PRIM_DONE = 28, 1532908d778SJames Bottomley SAS_PRIM_BREAK = 29, 1542908d778SJames Bottomley 1552908d778SJames Bottomley SATA_PRIM_DMAT = 33, 1562908d778SJames Bottomley SATA_PRIM_PMNAK = 34, 1572908d778SJames Bottomley SATA_PRIM_PMACK = 35, 1582908d778SJames Bottomley SATA_PRIM_PMREQ_S = 36, 1592908d778SJames Bottomley SATA_PRIM_PMREQ_P = 37, 1602908d778SJames Bottomley SATA_SATA_R_ERR = 38, 1612908d778SJames Bottomley }; 1622908d778SJames Bottomley 1632908d778SJames Bottomley enum sas_open_rej_reason { 1642908d778SJames Bottomley /* Abandon open */ 1652908d778SJames Bottomley SAS_OREJ_UNKNOWN = 0, 1662908d778SJames Bottomley SAS_OREJ_BAD_DEST = 1, 1672908d778SJames Bottomley SAS_OREJ_CONN_RATE = 2, 1682908d778SJames Bottomley SAS_OREJ_EPROTO = 3, 1692908d778SJames Bottomley SAS_OREJ_RESV_AB0 = 4, 1702908d778SJames Bottomley SAS_OREJ_RESV_AB1 = 5, 1712908d778SJames Bottomley SAS_OREJ_RESV_AB2 = 6, 1722908d778SJames Bottomley SAS_OREJ_RESV_AB3 = 7, 1732908d778SJames Bottomley SAS_OREJ_WRONG_DEST= 8, 1742908d778SJames Bottomley SAS_OREJ_STP_NORES = 9, 1752908d778SJames Bottomley 1762908d778SJames Bottomley /* Retry open */ 1772908d778SJames Bottomley SAS_OREJ_NO_DEST = 10, 1782908d778SJames Bottomley SAS_OREJ_PATH_BLOCKED = 11, 1792908d778SJames Bottomley SAS_OREJ_RSVD_CONT0 = 12, 1802908d778SJames Bottomley SAS_OREJ_RSVD_CONT1 = 13, 1812908d778SJames Bottomley SAS_OREJ_RSVD_INIT0 = 14, 1822908d778SJames Bottomley SAS_OREJ_RSVD_INIT1 = 15, 1832908d778SJames Bottomley SAS_OREJ_RSVD_STOP0 = 16, 1842908d778SJames Bottomley SAS_OREJ_RSVD_STOP1 = 17, 1852908d778SJames Bottomley SAS_OREJ_RSVD_RETRY = 18, 1862908d778SJames Bottomley }; 1872908d778SJames Bottomley 1888ec6552fSDan Williams enum sas_gpio_reg_type { 1898ec6552fSDan Williams SAS_GPIO_REG_CFG = 0, 1908ec6552fSDan Williams SAS_GPIO_REG_RX = 1, 1918ec6552fSDan Williams SAS_GPIO_REG_RX_GP = 2, 1928ec6552fSDan Williams SAS_GPIO_REG_TX = 3, 1938ec6552fSDan Williams SAS_GPIO_REG_TX_GP = 4, 1948ec6552fSDan Williams }; 1958ec6552fSDan Williams 1961d6049a3SJohn Garry /* Response frame DATAPRES field */ 1971d6049a3SJohn Garry enum { 1981d6049a3SJohn Garry SAS_DATAPRES_NO_DATA = 0, 1991d6049a3SJohn Garry SAS_DATAPRES_RESPONSE_DATA = 1, 2001d6049a3SJohn Garry SAS_DATAPRES_SENSE_DATA = 2, 2011d6049a3SJohn Garry }; 2021d6049a3SJohn Garry 2032908d778SJames Bottomley struct dev_to_host_fis { 2042908d778SJames Bottomley u8 fis_type; /* 0x34 */ 2052908d778SJames Bottomley u8 flags; 2062908d778SJames Bottomley u8 status; 2072908d778SJames Bottomley u8 error; 2082908d778SJames Bottomley 2092908d778SJames Bottomley u8 lbal; 2102908d778SJames Bottomley union { u8 lbam; u8 byte_count_low; }; 2112908d778SJames Bottomley union { u8 lbah; u8 byte_count_high; }; 2122908d778SJames Bottomley u8 device; 2132908d778SJames Bottomley 2142908d778SJames Bottomley u8 lbal_exp; 2152908d778SJames Bottomley u8 lbam_exp; 2162908d778SJames Bottomley u8 lbah_exp; 2172908d778SJames Bottomley u8 _r_a; 2182908d778SJames Bottomley 2192908d778SJames Bottomley union { u8 sector_count; u8 interrupt_reason; }; 2202908d778SJames Bottomley u8 sector_count_exp; 2212908d778SJames Bottomley u8 _r_b; 2222908d778SJames Bottomley u8 _r_c; 2232908d778SJames Bottomley 2242908d778SJames Bottomley u32 _r_d; 2252908d778SJames Bottomley } __attribute__ ((packed)); 2262908d778SJames Bottomley 2272908d778SJames Bottomley struct host_to_dev_fis { 2282908d778SJames Bottomley u8 fis_type; /* 0x27 */ 2292908d778SJames Bottomley u8 flags; 2302908d778SJames Bottomley u8 command; 2312908d778SJames Bottomley u8 features; 2322908d778SJames Bottomley 2332908d778SJames Bottomley u8 lbal; 2342908d778SJames Bottomley union { u8 lbam; u8 byte_count_low; }; 2352908d778SJames Bottomley union { u8 lbah; u8 byte_count_high; }; 2362908d778SJames Bottomley u8 device; 2372908d778SJames Bottomley 2382908d778SJames Bottomley u8 lbal_exp; 2392908d778SJames Bottomley u8 lbam_exp; 2402908d778SJames Bottomley u8 lbah_exp; 2412908d778SJames Bottomley u8 features_exp; 2422908d778SJames Bottomley 2432908d778SJames Bottomley union { u8 sector_count; u8 interrupt_reason; }; 2442908d778SJames Bottomley u8 sector_count_exp; 2452908d778SJames Bottomley u8 _r_a; 2462908d778SJames Bottomley u8 control; 2472908d778SJames Bottomley 2482908d778SJames Bottomley u32 _r_b; 2492908d778SJames Bottomley } __attribute__ ((packed)); 2502908d778SJames Bottomley 2512908d778SJames Bottomley /* Prefer to have code clarity over header file clarity. 2522908d778SJames Bottomley */ 2532908d778SJames Bottomley #ifdef __LITTLE_ENDIAN_BITFIELD 2542908d778SJames Bottomley struct sas_identify_frame { 2552908d778SJames Bottomley /* Byte 0 */ 2562908d778SJames Bottomley u8 frame_type:4; 2572908d778SJames Bottomley u8 dev_type:3; 2582908d778SJames Bottomley u8 _un0:1; 2592908d778SJames Bottomley 2602908d778SJames Bottomley /* Byte 1 */ 2612908d778SJames Bottomley u8 _un1; 2622908d778SJames Bottomley 2632908d778SJames Bottomley /* Byte 2 */ 2642908d778SJames Bottomley union { 2652908d778SJames Bottomley struct { 2662908d778SJames Bottomley u8 _un20:1; 2672908d778SJames Bottomley u8 smp_iport:1; 2682908d778SJames Bottomley u8 stp_iport:1; 2692908d778SJames Bottomley u8 ssp_iport:1; 2702908d778SJames Bottomley u8 _un247:4; 2712908d778SJames Bottomley }; 2722908d778SJames Bottomley u8 initiator_bits; 2732908d778SJames Bottomley }; 2742908d778SJames Bottomley 2752908d778SJames Bottomley /* Byte 3 */ 2762908d778SJames Bottomley union { 2772908d778SJames Bottomley struct { 2782908d778SJames Bottomley u8 _un30:1; 2792908d778SJames Bottomley u8 smp_tport:1; 2802908d778SJames Bottomley u8 stp_tport:1; 2812908d778SJames Bottomley u8 ssp_tport:1; 2822908d778SJames Bottomley u8 _un347:4; 2832908d778SJames Bottomley }; 2842908d778SJames Bottomley u8 target_bits; 2852908d778SJames Bottomley }; 2862908d778SJames Bottomley 2872908d778SJames Bottomley /* Byte 4 - 11 */ 2882908d778SJames Bottomley u8 _un4_11[8]; 2892908d778SJames Bottomley 2902908d778SJames Bottomley /* Byte 12 - 19 */ 2912908d778SJames Bottomley u8 sas_addr[SAS_ADDR_SIZE]; 2922908d778SJames Bottomley 2932908d778SJames Bottomley /* Byte 20 */ 2942908d778SJames Bottomley u8 phy_id; 2952908d778SJames Bottomley 2962908d778SJames Bottomley u8 _un21_27[7]; 2972908d778SJames Bottomley 2982908d778SJames Bottomley __be32 crc; 2992908d778SJames Bottomley } __attribute__ ((packed)); 3002908d778SJames Bottomley 3012908d778SJames Bottomley struct ssp_frame_hdr { 3022908d778SJames Bottomley u8 frame_type; 3032908d778SJames Bottomley u8 hashed_dest_addr[HASHED_SAS_ADDR_SIZE]; 3042908d778SJames Bottomley u8 _r_a; 3052908d778SJames Bottomley u8 hashed_src_addr[HASHED_SAS_ADDR_SIZE]; 3062908d778SJames Bottomley __be16 _r_b; 3072908d778SJames Bottomley 3082908d778SJames Bottomley u8 changing_data_ptr:1; 3092908d778SJames Bottomley u8 retransmit:1; 3102908d778SJames Bottomley u8 retry_data_frames:1; 3112908d778SJames Bottomley u8 _r_c:5; 3122908d778SJames Bottomley 3132908d778SJames Bottomley u8 num_fill_bytes:2; 3142908d778SJames Bottomley u8 _r_d:6; 3152908d778SJames Bottomley 3162908d778SJames Bottomley u32 _r_e; 3172908d778SJames Bottomley __be16 tag; 3182908d778SJames Bottomley __be16 tptt; 3192908d778SJames Bottomley __be32 data_offs; 3202908d778SJames Bottomley } __attribute__ ((packed)); 3212908d778SJames Bottomley 3222908d778SJames Bottomley struct ssp_response_iu { 3232908d778SJames Bottomley u8 _r_a[10]; 3242908d778SJames Bottomley 3252908d778SJames Bottomley u8 datapres:2; 3262908d778SJames Bottomley u8 _r_b:6; 3272908d778SJames Bottomley 3282908d778SJames Bottomley u8 status; 3292908d778SJames Bottomley 3302908d778SJames Bottomley u32 _r_c; 3312908d778SJames Bottomley 3322908d778SJames Bottomley __be32 sense_data_len; 3332908d778SJames Bottomley __be32 response_data_len; 3342908d778SJames Bottomley 335fa7845cfSKees Cook union { 336fa7845cfSKees Cook DECLARE_FLEX_ARRAY(u8, resp_data); 337fa7845cfSKees Cook DECLARE_FLEX_ARRAY(u8, sense_data); 338fa7845cfSKees Cook }; 3392908d778SJames Bottomley } __attribute__ ((packed)); 3402908d778SJames Bottomley 341c15d75beSJohn Garry struct ssp_command_iu { 342c15d75beSJohn Garry u8 lun[8]; 343c15d75beSJohn Garry u8 _r_a; 344c15d75beSJohn Garry 345c15d75beSJohn Garry union { 346c15d75beSJohn Garry struct { 347c15d75beSJohn Garry u8 attr:3; 348c15d75beSJohn Garry u8 prio:4; 349c15d75beSJohn Garry u8 efb:1; 350c15d75beSJohn Garry }; 351c15d75beSJohn Garry u8 efb_prio_attr; 352c15d75beSJohn Garry }; 353c15d75beSJohn Garry 354c15d75beSJohn Garry u8 _r_b; 355c15d75beSJohn Garry 356c15d75beSJohn Garry u8 _r_c:2; 357c15d75beSJohn Garry u8 add_cdb_len:6; 358c15d75beSJohn Garry 359c15d75beSJohn Garry u8 cdb[16]; 36000b42b70SGustavo A. R. Silva u8 add_cdb[]; 361c15d75beSJohn Garry } __attribute__ ((packed)); 362c15d75beSJohn Garry 363c15d75beSJohn Garry struct xfer_rdy_iu { 364c15d75beSJohn Garry __be32 requested_offset; 365c15d75beSJohn Garry __be32 write_data_len; 366c15d75beSJohn Garry __be32 _r_a; 367c15d75beSJohn Garry } __attribute__ ((packed)); 368c15d75beSJohn Garry 369c15d75beSJohn Garry struct ssp_tmf_iu { 370c15d75beSJohn Garry u8 lun[8]; 371c15d75beSJohn Garry u16 _r_a; 372c15d75beSJohn Garry u8 tmf; 373c15d75beSJohn Garry u8 _r_b; 374c15d75beSJohn Garry __be16 tag; 375c15d75beSJohn Garry u8 _r_c[14]; 376c15d75beSJohn Garry } __attribute__ ((packed)); 377c15d75beSJohn Garry 3782908d778SJames Bottomley /* ---------- SMP ---------- */ 3792908d778SJames Bottomley 3802908d778SJames Bottomley struct report_general_resp { 3812908d778SJames Bottomley __be16 change_count; 3822908d778SJames Bottomley __be16 route_indexes; 3832908d778SJames Bottomley u8 _r_a; 3842908d778SJames Bottomley u8 num_phys; 3852908d778SJames Bottomley 3862908d778SJames Bottomley u8 conf_route_table:1; 3872908d778SJames Bottomley u8 configuring:1; 388ffaac8f4SLuben Tuikov u8 config_others:1; 389ffaac8f4SLuben Tuikov u8 orej_retry_supp:1; 390ffaac8f4SLuben Tuikov u8 stp_cont_awt:1; 391ffaac8f4SLuben Tuikov u8 self_config:1; 392ffaac8f4SLuben Tuikov u8 zone_config:1; 393ffaac8f4SLuben Tuikov u8 t2t_supp:1; 3942908d778SJames Bottomley 3952908d778SJames Bottomley u8 _r_c; 3962908d778SJames Bottomley 3972908d778SJames Bottomley u8 enclosure_logical_id[8]; 3982908d778SJames Bottomley 3992908d778SJames Bottomley u8 _r_d[12]; 4002908d778SJames Bottomley } __attribute__ ((packed)); 4012908d778SJames Bottomley 4022908d778SJames Bottomley struct discover_resp { 4032908d778SJames Bottomley u8 _r_a[5]; 4042908d778SJames Bottomley 4052908d778SJames Bottomley u8 phy_id; 4062908d778SJames Bottomley __be16 _r_b; 4072908d778SJames Bottomley 4082908d778SJames Bottomley u8 _r_c:4; 4092908d778SJames Bottomley u8 attached_dev_type:3; 4102908d778SJames Bottomley u8 _r_d:1; 4112908d778SJames Bottomley 4122908d778SJames Bottomley u8 linkrate:4; 4132908d778SJames Bottomley u8 _r_e:4; 4142908d778SJames Bottomley 4152908d778SJames Bottomley u8 attached_sata_host:1; 4162908d778SJames Bottomley u8 iproto:3; 4172908d778SJames Bottomley u8 _r_f:4; 4182908d778SJames Bottomley 4192908d778SJames Bottomley u8 attached_sata_dev:1; 4202908d778SJames Bottomley u8 tproto:3; 4212908d778SJames Bottomley u8 _r_g:3; 4222908d778SJames Bottomley u8 attached_sata_ps:1; 4232908d778SJames Bottomley 4242908d778SJames Bottomley u8 sas_addr[8]; 4252908d778SJames Bottomley u8 attached_sas_addr[8]; 4262908d778SJames Bottomley u8 attached_phy_id; 4272908d778SJames Bottomley 4282908d778SJames Bottomley u8 _r_h[7]; 4292908d778SJames Bottomley 4302908d778SJames Bottomley u8 hmin_linkrate:4; 4312908d778SJames Bottomley u8 pmin_linkrate:4; 4322908d778SJames Bottomley u8 hmax_linkrate:4; 4332908d778SJames Bottomley u8 pmax_linkrate:4; 4342908d778SJames Bottomley 4352908d778SJames Bottomley u8 change_count; 4362908d778SJames Bottomley 4372908d778SJames Bottomley u8 pptv:4; 4382908d778SJames Bottomley u8 _r_i:3; 4392908d778SJames Bottomley u8 virtual:1; 4402908d778SJames Bottomley 4412908d778SJames Bottomley u8 routing_attr:4; 4422908d778SJames Bottomley u8 _r_j:4; 4432908d778SJames Bottomley 4442908d778SJames Bottomley u8 conn_type; 4452908d778SJames Bottomley u8 conn_el_index; 4462908d778SJames Bottomley u8 conn_phy_link; 4472908d778SJames Bottomley 4482908d778SJames Bottomley u8 _r_k[8]; 4492908d778SJames Bottomley } __attribute__ ((packed)); 4502908d778SJames Bottomley 4512908d778SJames Bottomley struct report_phy_sata_resp { 4522908d778SJames Bottomley u8 _r_a[5]; 4532908d778SJames Bottomley 4542908d778SJames Bottomley u8 phy_id; 4552908d778SJames Bottomley u8 _r_b; 4562908d778SJames Bottomley 4572908d778SJames Bottomley u8 affil_valid:1; 4582908d778SJames Bottomley u8 affil_supp:1; 4592908d778SJames Bottomley u8 _r_c:6; 4602908d778SJames Bottomley 4612908d778SJames Bottomley u32 _r_d; 4622908d778SJames Bottomley 4632908d778SJames Bottomley u8 stp_sas_addr[8]; 4642908d778SJames Bottomley 4652908d778SJames Bottomley struct dev_to_host_fis fis; 4662908d778SJames Bottomley 4672908d778SJames Bottomley u32 _r_e; 4682908d778SJames Bottomley 4692908d778SJames Bottomley u8 affil_stp_ini_addr[8]; 4702908d778SJames Bottomley 4712908d778SJames Bottomley __be32 crc; 4722908d778SJames Bottomley } __attribute__ ((packed)); 4732908d778SJames Bottomley 4742908d778SJames Bottomley #elif defined(__BIG_ENDIAN_BITFIELD) 4752908d778SJames Bottomley struct sas_identify_frame { 4762908d778SJames Bottomley /* Byte 0 */ 4772908d778SJames Bottomley u8 _un0:1; 4782908d778SJames Bottomley u8 dev_type:3; 4792908d778SJames Bottomley u8 frame_type:4; 4802908d778SJames Bottomley 4812908d778SJames Bottomley /* Byte 1 */ 4822908d778SJames Bottomley u8 _un1; 4832908d778SJames Bottomley 4842908d778SJames Bottomley /* Byte 2 */ 4852908d778SJames Bottomley union { 4862908d778SJames Bottomley struct { 4872908d778SJames Bottomley u8 _un247:4; 4882908d778SJames Bottomley u8 ssp_iport:1; 4892908d778SJames Bottomley u8 stp_iport:1; 4902908d778SJames Bottomley u8 smp_iport:1; 4912908d778SJames Bottomley u8 _un20:1; 4922908d778SJames Bottomley }; 4932908d778SJames Bottomley u8 initiator_bits; 4942908d778SJames Bottomley }; 4952908d778SJames Bottomley 4962908d778SJames Bottomley /* Byte 3 */ 4972908d778SJames Bottomley union { 4982908d778SJames Bottomley struct { 4992908d778SJames Bottomley u8 _un347:4; 5002908d778SJames Bottomley u8 ssp_tport:1; 5012908d778SJames Bottomley u8 stp_tport:1; 5022908d778SJames Bottomley u8 smp_tport:1; 5032908d778SJames Bottomley u8 _un30:1; 5042908d778SJames Bottomley }; 5052908d778SJames Bottomley u8 target_bits; 5062908d778SJames Bottomley }; 5072908d778SJames Bottomley 5082908d778SJames Bottomley /* Byte 4 - 11 */ 5092908d778SJames Bottomley u8 _un4_11[8]; 5102908d778SJames Bottomley 5112908d778SJames Bottomley /* Byte 12 - 19 */ 5122908d778SJames Bottomley u8 sas_addr[SAS_ADDR_SIZE]; 5132908d778SJames Bottomley 5142908d778SJames Bottomley /* Byte 20 */ 5152908d778SJames Bottomley u8 phy_id; 5162908d778SJames Bottomley 5172908d778SJames Bottomley u8 _un21_27[7]; 5182908d778SJames Bottomley 5192908d778SJames Bottomley __be32 crc; 5202908d778SJames Bottomley } __attribute__ ((packed)); 5212908d778SJames Bottomley 5222908d778SJames Bottomley struct ssp_frame_hdr { 5232908d778SJames Bottomley u8 frame_type; 5242908d778SJames Bottomley u8 hashed_dest_addr[HASHED_SAS_ADDR_SIZE]; 5252908d778SJames Bottomley u8 _r_a; 5262908d778SJames Bottomley u8 hashed_src_addr[HASHED_SAS_ADDR_SIZE]; 5272908d778SJames Bottomley __be16 _r_b; 5282908d778SJames Bottomley 5292908d778SJames Bottomley u8 _r_c:5; 5302908d778SJames Bottomley u8 retry_data_frames:1; 5312908d778SJames Bottomley u8 retransmit:1; 5322908d778SJames Bottomley u8 changing_data_ptr:1; 5332908d778SJames Bottomley 5342908d778SJames Bottomley u8 _r_d:6; 5352908d778SJames Bottomley u8 num_fill_bytes:2; 5362908d778SJames Bottomley 5372908d778SJames Bottomley u32 _r_e; 5382908d778SJames Bottomley __be16 tag; 5392908d778SJames Bottomley __be16 tptt; 5402908d778SJames Bottomley __be32 data_offs; 5412908d778SJames Bottomley } __attribute__ ((packed)); 5422908d778SJames Bottomley 5432908d778SJames Bottomley struct ssp_response_iu { 5442908d778SJames Bottomley u8 _r_a[10]; 5452908d778SJames Bottomley 5462908d778SJames Bottomley u8 _r_b:6; 5472908d778SJames Bottomley u8 datapres:2; 5482908d778SJames Bottomley 5492908d778SJames Bottomley u8 status; 5502908d778SJames Bottomley 5512908d778SJames Bottomley u32 _r_c; 5522908d778SJames Bottomley 5532908d778SJames Bottomley __be32 sense_data_len; 5542908d778SJames Bottomley __be32 response_data_len; 5552908d778SJames Bottomley 556fa7845cfSKees Cook union { 557fa7845cfSKees Cook DECLARE_FLEX_ARRAY(u8, resp_data); 558fa7845cfSKees Cook DECLARE_FLEX_ARRAY(u8, sense_data); 559fa7845cfSKees Cook }; 5602908d778SJames Bottomley } __attribute__ ((packed)); 5612908d778SJames Bottomley 562c15d75beSJohn Garry struct ssp_command_iu { 563c15d75beSJohn Garry u8 lun[8]; 564c15d75beSJohn Garry u8 _r_a; 565c15d75beSJohn Garry 566c15d75beSJohn Garry union { 567c15d75beSJohn Garry struct { 568c15d75beSJohn Garry u8 efb:1; 569c15d75beSJohn Garry u8 prio:4; 570c15d75beSJohn Garry u8 attr:3; 571c15d75beSJohn Garry }; 572c15d75beSJohn Garry u8 efb_prio_attr; 573c15d75beSJohn Garry }; 574c15d75beSJohn Garry 575c15d75beSJohn Garry u8 _r_b; 576c15d75beSJohn Garry 577c15d75beSJohn Garry u8 add_cdb_len:6; 578c15d75beSJohn Garry u8 _r_c:2; 579c15d75beSJohn Garry 580c15d75beSJohn Garry u8 cdb[16]; 58100b42b70SGustavo A. R. Silva u8 add_cdb[]; 582c15d75beSJohn Garry } __attribute__ ((packed)); 583c15d75beSJohn Garry 584c15d75beSJohn Garry struct xfer_rdy_iu { 585c15d75beSJohn Garry __be32 requested_offset; 586c15d75beSJohn Garry __be32 write_data_len; 587c15d75beSJohn Garry __be32 _r_a; 588c15d75beSJohn Garry } __attribute__ ((packed)); 589c15d75beSJohn Garry 590c15d75beSJohn Garry struct ssp_tmf_iu { 591c15d75beSJohn Garry u8 lun[8]; 592c15d75beSJohn Garry u16 _r_a; 593c15d75beSJohn Garry u8 tmf; 594c15d75beSJohn Garry u8 _r_b; 595c15d75beSJohn Garry __be16 tag; 596c15d75beSJohn Garry u8 _r_c[14]; 597c15d75beSJohn Garry } __attribute__ ((packed)); 598c15d75beSJohn Garry 5992908d778SJames Bottomley /* ---------- SMP ---------- */ 6002908d778SJames Bottomley 6012908d778SJames Bottomley struct report_general_resp { 6022908d778SJames Bottomley __be16 change_count; 6032908d778SJames Bottomley __be16 route_indexes; 6042908d778SJames Bottomley u8 _r_a; 6052908d778SJames Bottomley u8 num_phys; 6062908d778SJames Bottomley 607ffaac8f4SLuben Tuikov u8 t2t_supp:1; 608ffaac8f4SLuben Tuikov u8 zone_config:1; 609ffaac8f4SLuben Tuikov u8 self_config:1; 610ffaac8f4SLuben Tuikov u8 stp_cont_awt:1; 611ffaac8f4SLuben Tuikov u8 orej_retry_supp:1; 612ffaac8f4SLuben Tuikov u8 config_others:1; 6132908d778SJames Bottomley u8 configuring:1; 6142908d778SJames Bottomley u8 conf_route_table:1; 6152908d778SJames Bottomley 6162908d778SJames Bottomley u8 _r_c; 6172908d778SJames Bottomley 6182908d778SJames Bottomley u8 enclosure_logical_id[8]; 6192908d778SJames Bottomley 6202908d778SJames Bottomley u8 _r_d[12]; 6212908d778SJames Bottomley } __attribute__ ((packed)); 6222908d778SJames Bottomley 6232908d778SJames Bottomley struct discover_resp { 6242908d778SJames Bottomley u8 _r_a[5]; 6252908d778SJames Bottomley 6262908d778SJames Bottomley u8 phy_id; 6272908d778SJames Bottomley __be16 _r_b; 6282908d778SJames Bottomley 6292908d778SJames Bottomley u8 _r_d:1; 6302908d778SJames Bottomley u8 attached_dev_type:3; 6312908d778SJames Bottomley u8 _r_c:4; 6322908d778SJames Bottomley 6332908d778SJames Bottomley u8 _r_e:4; 6342908d778SJames Bottomley u8 linkrate:4; 6352908d778SJames Bottomley 6362908d778SJames Bottomley u8 _r_f:4; 6372908d778SJames Bottomley u8 iproto:3; 6382908d778SJames Bottomley u8 attached_sata_host:1; 6392908d778SJames Bottomley 6402908d778SJames Bottomley u8 attached_sata_ps:1; 6412908d778SJames Bottomley u8 _r_g:3; 6422908d778SJames Bottomley u8 tproto:3; 6432908d778SJames Bottomley u8 attached_sata_dev:1; 6442908d778SJames Bottomley 6452908d778SJames Bottomley u8 sas_addr[8]; 6462908d778SJames Bottomley u8 attached_sas_addr[8]; 6472908d778SJames Bottomley u8 attached_phy_id; 6482908d778SJames Bottomley 6492908d778SJames Bottomley u8 _r_h[7]; 6502908d778SJames Bottomley 6512908d778SJames Bottomley u8 pmin_linkrate:4; 6522908d778SJames Bottomley u8 hmin_linkrate:4; 6532908d778SJames Bottomley u8 pmax_linkrate:4; 6542908d778SJames Bottomley u8 hmax_linkrate:4; 6552908d778SJames Bottomley 6562908d778SJames Bottomley u8 change_count; 6572908d778SJames Bottomley 6582908d778SJames Bottomley u8 virtual:1; 6592908d778SJames Bottomley u8 _r_i:3; 6602908d778SJames Bottomley u8 pptv:4; 6612908d778SJames Bottomley 6622908d778SJames Bottomley u8 _r_j:4; 6632908d778SJames Bottomley u8 routing_attr:4; 6642908d778SJames Bottomley 6652908d778SJames Bottomley u8 conn_type; 6662908d778SJames Bottomley u8 conn_el_index; 6672908d778SJames Bottomley u8 conn_phy_link; 6682908d778SJames Bottomley 6692908d778SJames Bottomley u8 _r_k[8]; 6702908d778SJames Bottomley } __attribute__ ((packed)); 6712908d778SJames Bottomley 6722908d778SJames Bottomley struct report_phy_sata_resp { 6732908d778SJames Bottomley u8 _r_a[5]; 6742908d778SJames Bottomley 6752908d778SJames Bottomley u8 phy_id; 6762908d778SJames Bottomley u8 _r_b; 6772908d778SJames Bottomley 6782908d778SJames Bottomley u8 _r_c:6; 6792908d778SJames Bottomley u8 affil_supp:1; 6802908d778SJames Bottomley u8 affil_valid:1; 6812908d778SJames Bottomley 6822908d778SJames Bottomley u32 _r_d; 6832908d778SJames Bottomley 6842908d778SJames Bottomley u8 stp_sas_addr[8]; 6852908d778SJames Bottomley 6862908d778SJames Bottomley struct dev_to_host_fis fis; 6872908d778SJames Bottomley 6882908d778SJames Bottomley u32 _r_e; 6892908d778SJames Bottomley 6902908d778SJames Bottomley u8 affil_stp_ini_addr[8]; 6912908d778SJames Bottomley 6922908d778SJames Bottomley __be32 crc; 6932908d778SJames Bottomley } __attribute__ ((packed)); 6942908d778SJames Bottomley 695c3752f44SDamien Le Moal #else 696c3752f44SDamien Le Moal #error "Bitfield order not defined!" 697c3752f44SDamien Le Moal #endif 698c3752f44SDamien Le Moal 69944f2bfe9SDamien Le Moal struct smp_rg_resp { 70044f2bfe9SDamien Le Moal u8 frame_type; 70144f2bfe9SDamien Le Moal u8 function; 70244f2bfe9SDamien Le Moal u8 result; 70344f2bfe9SDamien Le Moal u8 reserved; 70444f2bfe9SDamien Le Moal struct report_general_resp rg; 70544f2bfe9SDamien Le Moal } __attribute__ ((packed)); 70644f2bfe9SDamien Le Moal 707c3752f44SDamien Le Moal struct smp_disc_resp { 708c3752f44SDamien Le Moal u8 frame_type; 709c3752f44SDamien Le Moal u8 function; 710c3752f44SDamien Le Moal u8 result; 711c3752f44SDamien Le Moal u8 reserved; 712c3752f44SDamien Le Moal struct discover_resp disc; 713c3752f44SDamien Le Moal } __attribute__ ((packed)); 714c3752f44SDamien Le Moal 715*3dafe064SDamien Le Moal struct smp_rps_resp { 7162908d778SJames Bottomley u8 frame_type; 7172908d778SJames Bottomley u8 function; 7182908d778SJames Bottomley u8 result; 7192908d778SJames Bottomley u8 reserved; 7202908d778SJames Bottomley struct report_phy_sata_resp rps; 7212908d778SJames Bottomley } __attribute__ ((packed)); 7222908d778SJames Bottomley 7232908d778SJames Bottomley #endif /* _SAS_H_ */ 724