12908d778SJames Bottomley /* 22908d778SJames Bottomley * SAS structures and definitions header file 32908d778SJames Bottomley * 42908d778SJames Bottomley * Copyright (C) 2005 Adaptec, Inc. All rights reserved. 52908d778SJames Bottomley * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com> 62908d778SJames Bottomley * 72908d778SJames Bottomley * This file is licensed under GPLv2. 82908d778SJames Bottomley * 92908d778SJames Bottomley * This program is free software; you can redistribute it and/or 102908d778SJames Bottomley * modify it under the terms of the GNU General Public License as 112908d778SJames Bottomley * published by the Free Software Foundation; either version 2 of the 122908d778SJames Bottomley * License, or (at your option) any later version. 132908d778SJames Bottomley * 142908d778SJames Bottomley * This program is distributed in the hope that it will be useful, but 152908d778SJames Bottomley * WITHOUT ANY WARRANTY; without even the implied warranty of 162908d778SJames Bottomley * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 172908d778SJames Bottomley * General Public License for more details. 182908d778SJames Bottomley * 192908d778SJames Bottomley * You should have received a copy of the GNU General Public License 202908d778SJames Bottomley * along with this program; if not, write to the Free Software 212908d778SJames Bottomley * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 222908d778SJames Bottomley * USA 232908d778SJames Bottomley * 242908d778SJames Bottomley */ 252908d778SJames Bottomley 262908d778SJames Bottomley #ifndef _SAS_H_ 272908d778SJames Bottomley #define _SAS_H_ 282908d778SJames Bottomley 292908d778SJames Bottomley #include <linux/types.h> 302908d778SJames Bottomley #include <asm/byteorder.h> 312908d778SJames Bottomley 322908d778SJames Bottomley #define SAS_ADDR_SIZE 8 332908d778SJames Bottomley #define HASHED_SAS_ADDR_SIZE 3 342908d778SJames Bottomley #define SAS_ADDR(_sa) ((unsigned long long) be64_to_cpu(*(__be64 *)(_sa))) 352908d778SJames Bottomley 362908d778SJames Bottomley #define SMP_REQUEST 0x40 372908d778SJames Bottomley #define SMP_RESPONSE 0x41 382908d778SJames Bottomley 392908d778SJames Bottomley #define SSP_DATA 0x01 402908d778SJames Bottomley #define SSP_XFER_RDY 0x05 412908d778SJames Bottomley #define SSP_COMMAND 0x06 422908d778SJames Bottomley #define SSP_RESPONSE 0x07 432908d778SJames Bottomley #define SSP_TASK 0x16 442908d778SJames Bottomley 452908d778SJames Bottomley #define SMP_REPORT_GENERAL 0x00 462908d778SJames Bottomley #define SMP_REPORT_MANUF_INFO 0x01 472908d778SJames Bottomley #define SMP_READ_GPIO_REG 0x02 482908d778SJames Bottomley #define SMP_DISCOVER 0x10 492908d778SJames Bottomley #define SMP_REPORT_PHY_ERR_LOG 0x11 502908d778SJames Bottomley #define SMP_REPORT_PHY_SATA 0x12 512908d778SJames Bottomley #define SMP_REPORT_ROUTE_INFO 0x13 522908d778SJames Bottomley #define SMP_WRITE_GPIO_REG 0x82 532908d778SJames Bottomley #define SMP_CONF_ROUTE_INFO 0x90 542908d778SJames Bottomley #define SMP_PHY_CONTROL 0x91 552908d778SJames Bottomley #define SMP_PHY_TEST_FUNCTION 0x92 562908d778SJames Bottomley 572908d778SJames Bottomley #define SMP_RESP_FUNC_ACC 0x00 582908d778SJames Bottomley #define SMP_RESP_FUNC_UNK 0x01 592908d778SJames Bottomley #define SMP_RESP_FUNC_FAILED 0x02 602908d778SJames Bottomley #define SMP_RESP_INV_FRM_LEN 0x03 612908d778SJames Bottomley #define SMP_RESP_NO_PHY 0x10 622908d778SJames Bottomley #define SMP_RESP_NO_INDEX 0x11 632908d778SJames Bottomley #define SMP_RESP_PHY_NO_SATA 0x12 642908d778SJames Bottomley #define SMP_RESP_PHY_UNK_OP 0x13 652908d778SJames Bottomley #define SMP_RESP_PHY_UNK_TESTF 0x14 662908d778SJames Bottomley #define SMP_RESP_PHY_TEST_INPROG 0x15 672908d778SJames Bottomley #define SMP_RESP_PHY_VACANT 0x16 682908d778SJames Bottomley 692908d778SJames Bottomley /* SAM TMFs */ 702908d778SJames Bottomley #define TMF_ABORT_TASK 0x01 712908d778SJames Bottomley #define TMF_ABORT_TASK_SET 0x02 722908d778SJames Bottomley #define TMF_CLEAR_TASK_SET 0x04 732908d778SJames Bottomley #define TMF_LU_RESET 0x08 742908d778SJames Bottomley #define TMF_CLEAR_ACA 0x40 752908d778SJames Bottomley #define TMF_QUERY_TASK 0x80 762908d778SJames Bottomley 772908d778SJames Bottomley /* SAS TMF responses */ 782908d778SJames Bottomley #define TMF_RESP_FUNC_COMPLETE 0x00 792908d778SJames Bottomley #define TMF_RESP_INVALID_FRAME 0x02 802908d778SJames Bottomley #define TMF_RESP_FUNC_ESUPP 0x04 812908d778SJames Bottomley #define TMF_RESP_FUNC_FAILED 0x05 822908d778SJames Bottomley #define TMF_RESP_FUNC_SUCC 0x08 832908d778SJames Bottomley #define TMF_RESP_NO_LUN 0x09 842908d778SJames Bottomley #define TMF_RESP_OVERLAPPED_TAG 0x0A 852908d778SJames Bottomley 862908d778SJames Bottomley enum sas_oob_mode { 872908d778SJames Bottomley OOB_NOT_CONNECTED, 882908d778SJames Bottomley SATA_OOB_MODE, 892908d778SJames Bottomley SAS_OOB_MODE 902908d778SJames Bottomley }; 912908d778SJames Bottomley 922908d778SJames Bottomley /* See sas_discover.c if you plan on changing these. 932908d778SJames Bottomley */ 942908d778SJames Bottomley enum sas_dev_type { 952908d778SJames Bottomley NO_DEVICE = 0, /* protocol */ 962908d778SJames Bottomley SAS_END_DEV = 1, /* protocol */ 972908d778SJames Bottomley EDGE_DEV = 2, /* protocol */ 982908d778SJames Bottomley FANOUT_DEV = 3, /* protocol */ 992908d778SJames Bottomley SAS_HA = 4, 1002908d778SJames Bottomley SATA_DEV = 5, 1012908d778SJames Bottomley SATA_PM = 7, 1022908d778SJames Bottomley SATA_PM_PORT= 8, 1032908d778SJames Bottomley }; 1042908d778SJames Bottomley 1055929faf3SDarrick J. Wong enum sas_protocol { 1065929faf3SDarrick J. Wong SAS_PROTOCOL_SATA = 0x01, 1075929faf3SDarrick J. Wong SAS_PROTOCOL_SMP = 0x02, 1085929faf3SDarrick J. Wong SAS_PROTOCOL_STP = 0x04, 1095929faf3SDarrick J. Wong SAS_PROTOCOL_SSP = 0x08, 1105929faf3SDarrick J. Wong SAS_PROTOCOL_ALL = 0x0E, 11105a2a173SDan Williams SAS_PROTOCOL_STP_ALL = SAS_PROTOCOL_STP|SAS_PROTOCOL_SATA, 1122908d778SJames Bottomley }; 1132908d778SJames Bottomley 1142908d778SJames Bottomley /* From the spec; local phys only */ 1152908d778SJames Bottomley enum phy_func { 1162908d778SJames Bottomley PHY_FUNC_NOP, 1172908d778SJames Bottomley PHY_FUNC_LINK_RESET, /* Enables the phy */ 1182908d778SJames Bottomley PHY_FUNC_HARD_RESET, 1192908d778SJames Bottomley PHY_FUNC_DISABLE, 1202908d778SJames Bottomley PHY_FUNC_CLEAR_ERROR_LOG = 5, 1212908d778SJames Bottomley PHY_FUNC_CLEAR_AFFIL, 1222908d778SJames Bottomley PHY_FUNC_TX_SATA_PS_SIGNAL, 1232908d778SJames Bottomley PHY_FUNC_RELEASE_SPINUP_HOLD = 0x10, /* LOCAL PORT ONLY! */ 124a01e70e5SJames Bottomley PHY_FUNC_SET_LINK_RATE, 1252908d778SJames Bottomley }; 1262908d778SJames Bottomley 1272908d778SJames Bottomley /* SAS LLDD would need to report only _very_few_ of those, like BROADCAST. 1282908d778SJames Bottomley * Most of those are here for completeness. 1292908d778SJames Bottomley */ 1302908d778SJames Bottomley enum sas_prim { 1312908d778SJames Bottomley SAS_PRIM_AIP_NORMAL = 1, 1322908d778SJames Bottomley SAS_PRIM_AIP_R0 = 2, 1332908d778SJames Bottomley SAS_PRIM_AIP_R1 = 3, 1342908d778SJames Bottomley SAS_PRIM_AIP_R2 = 4, 1352908d778SJames Bottomley SAS_PRIM_AIP_WC = 5, 1362908d778SJames Bottomley SAS_PRIM_AIP_WD = 6, 1372908d778SJames Bottomley SAS_PRIM_AIP_WP = 7, 1382908d778SJames Bottomley SAS_PRIM_AIP_RWP = 8, 1392908d778SJames Bottomley 1402908d778SJames Bottomley SAS_PRIM_BC_CH = 9, 1412908d778SJames Bottomley SAS_PRIM_BC_RCH0 = 10, 1422908d778SJames Bottomley SAS_PRIM_BC_RCH1 = 11, 1432908d778SJames Bottomley SAS_PRIM_BC_R0 = 12, 1442908d778SJames Bottomley SAS_PRIM_BC_R1 = 13, 1452908d778SJames Bottomley SAS_PRIM_BC_R2 = 14, 1462908d778SJames Bottomley SAS_PRIM_BC_R3 = 15, 1472908d778SJames Bottomley SAS_PRIM_BC_R4 = 16, 1482908d778SJames Bottomley 1492908d778SJames Bottomley SAS_PRIM_NOTIFY_ENSP= 17, 1502908d778SJames Bottomley SAS_PRIM_NOTIFY_R0 = 18, 1512908d778SJames Bottomley SAS_PRIM_NOTIFY_R1 = 19, 1522908d778SJames Bottomley SAS_PRIM_NOTIFY_R2 = 20, 1532908d778SJames Bottomley 1542908d778SJames Bottomley SAS_PRIM_CLOSE_CLAF = 21, 1552908d778SJames Bottomley SAS_PRIM_CLOSE_NORM = 22, 1562908d778SJames Bottomley SAS_PRIM_CLOSE_R0 = 23, 1572908d778SJames Bottomley SAS_PRIM_CLOSE_R1 = 24, 1582908d778SJames Bottomley 1592908d778SJames Bottomley SAS_PRIM_OPEN_RTRY = 25, 1602908d778SJames Bottomley SAS_PRIM_OPEN_RJCT = 26, 1612908d778SJames Bottomley SAS_PRIM_OPEN_ACPT = 27, 1622908d778SJames Bottomley 1632908d778SJames Bottomley SAS_PRIM_DONE = 28, 1642908d778SJames Bottomley SAS_PRIM_BREAK = 29, 1652908d778SJames Bottomley 1662908d778SJames Bottomley SATA_PRIM_DMAT = 33, 1672908d778SJames Bottomley SATA_PRIM_PMNAK = 34, 1682908d778SJames Bottomley SATA_PRIM_PMACK = 35, 1692908d778SJames Bottomley SATA_PRIM_PMREQ_S = 36, 1702908d778SJames Bottomley SATA_PRIM_PMREQ_P = 37, 1712908d778SJames Bottomley SATA_SATA_R_ERR = 38, 1722908d778SJames Bottomley }; 1732908d778SJames Bottomley 1742908d778SJames Bottomley enum sas_open_rej_reason { 1752908d778SJames Bottomley /* Abandon open */ 1762908d778SJames Bottomley SAS_OREJ_UNKNOWN = 0, 1772908d778SJames Bottomley SAS_OREJ_BAD_DEST = 1, 1782908d778SJames Bottomley SAS_OREJ_CONN_RATE = 2, 1792908d778SJames Bottomley SAS_OREJ_EPROTO = 3, 1802908d778SJames Bottomley SAS_OREJ_RESV_AB0 = 4, 1812908d778SJames Bottomley SAS_OREJ_RESV_AB1 = 5, 1822908d778SJames Bottomley SAS_OREJ_RESV_AB2 = 6, 1832908d778SJames Bottomley SAS_OREJ_RESV_AB3 = 7, 1842908d778SJames Bottomley SAS_OREJ_WRONG_DEST= 8, 1852908d778SJames Bottomley SAS_OREJ_STP_NORES = 9, 1862908d778SJames Bottomley 1872908d778SJames Bottomley /* Retry open */ 1882908d778SJames Bottomley SAS_OREJ_NO_DEST = 10, 1892908d778SJames Bottomley SAS_OREJ_PATH_BLOCKED = 11, 1902908d778SJames Bottomley SAS_OREJ_RSVD_CONT0 = 12, 1912908d778SJames Bottomley SAS_OREJ_RSVD_CONT1 = 13, 1922908d778SJames Bottomley SAS_OREJ_RSVD_INIT0 = 14, 1932908d778SJames Bottomley SAS_OREJ_RSVD_INIT1 = 15, 1942908d778SJames Bottomley SAS_OREJ_RSVD_STOP0 = 16, 1952908d778SJames Bottomley SAS_OREJ_RSVD_STOP1 = 17, 1962908d778SJames Bottomley SAS_OREJ_RSVD_RETRY = 18, 1972908d778SJames Bottomley }; 1982908d778SJames Bottomley 1998ec6552fSDan Williams enum sas_gpio_reg_type { 2008ec6552fSDan Williams SAS_GPIO_REG_CFG = 0, 2018ec6552fSDan Williams SAS_GPIO_REG_RX = 1, 2028ec6552fSDan Williams SAS_GPIO_REG_RX_GP = 2, 2038ec6552fSDan Williams SAS_GPIO_REG_TX = 3, 2048ec6552fSDan Williams SAS_GPIO_REG_TX_GP = 4, 2058ec6552fSDan Williams }; 2068ec6552fSDan Williams 2072908d778SJames Bottomley struct dev_to_host_fis { 2082908d778SJames Bottomley u8 fis_type; /* 0x34 */ 2092908d778SJames Bottomley u8 flags; 2102908d778SJames Bottomley u8 status; 2112908d778SJames Bottomley u8 error; 2122908d778SJames Bottomley 2132908d778SJames Bottomley u8 lbal; 2142908d778SJames Bottomley union { u8 lbam; u8 byte_count_low; }; 2152908d778SJames Bottomley union { u8 lbah; u8 byte_count_high; }; 2162908d778SJames Bottomley u8 device; 2172908d778SJames Bottomley 2182908d778SJames Bottomley u8 lbal_exp; 2192908d778SJames Bottomley u8 lbam_exp; 2202908d778SJames Bottomley u8 lbah_exp; 2212908d778SJames Bottomley u8 _r_a; 2222908d778SJames Bottomley 2232908d778SJames Bottomley union { u8 sector_count; u8 interrupt_reason; }; 2242908d778SJames Bottomley u8 sector_count_exp; 2252908d778SJames Bottomley u8 _r_b; 2262908d778SJames Bottomley u8 _r_c; 2272908d778SJames Bottomley 2282908d778SJames Bottomley u32 _r_d; 2292908d778SJames Bottomley } __attribute__ ((packed)); 2302908d778SJames Bottomley 2312908d778SJames Bottomley struct host_to_dev_fis { 2322908d778SJames Bottomley u8 fis_type; /* 0x27 */ 2332908d778SJames Bottomley u8 flags; 2342908d778SJames Bottomley u8 command; 2352908d778SJames Bottomley u8 features; 2362908d778SJames Bottomley 2372908d778SJames Bottomley u8 lbal; 2382908d778SJames Bottomley union { u8 lbam; u8 byte_count_low; }; 2392908d778SJames Bottomley union { u8 lbah; u8 byte_count_high; }; 2402908d778SJames Bottomley u8 device; 2412908d778SJames Bottomley 2422908d778SJames Bottomley u8 lbal_exp; 2432908d778SJames Bottomley u8 lbam_exp; 2442908d778SJames Bottomley u8 lbah_exp; 2452908d778SJames Bottomley u8 features_exp; 2462908d778SJames Bottomley 2472908d778SJames Bottomley union { u8 sector_count; u8 interrupt_reason; }; 2482908d778SJames Bottomley u8 sector_count_exp; 2492908d778SJames Bottomley u8 _r_a; 2502908d778SJames Bottomley u8 control; 2512908d778SJames Bottomley 2522908d778SJames Bottomley u32 _r_b; 2532908d778SJames Bottomley } __attribute__ ((packed)); 2542908d778SJames Bottomley 2552908d778SJames Bottomley /* Prefer to have code clarity over header file clarity. 2562908d778SJames Bottomley */ 2572908d778SJames Bottomley #ifdef __LITTLE_ENDIAN_BITFIELD 2582908d778SJames Bottomley struct sas_identify_frame { 2592908d778SJames Bottomley /* Byte 0 */ 2602908d778SJames Bottomley u8 frame_type:4; 2612908d778SJames Bottomley u8 dev_type:3; 2622908d778SJames Bottomley u8 _un0:1; 2632908d778SJames Bottomley 2642908d778SJames Bottomley /* Byte 1 */ 2652908d778SJames Bottomley u8 _un1; 2662908d778SJames Bottomley 2672908d778SJames Bottomley /* Byte 2 */ 2682908d778SJames Bottomley union { 2692908d778SJames Bottomley struct { 2702908d778SJames Bottomley u8 _un20:1; 2712908d778SJames Bottomley u8 smp_iport:1; 2722908d778SJames Bottomley u8 stp_iport:1; 2732908d778SJames Bottomley u8 ssp_iport:1; 2742908d778SJames Bottomley u8 _un247:4; 2752908d778SJames Bottomley }; 2762908d778SJames Bottomley u8 initiator_bits; 2772908d778SJames Bottomley }; 2782908d778SJames Bottomley 2792908d778SJames Bottomley /* Byte 3 */ 2802908d778SJames Bottomley union { 2812908d778SJames Bottomley struct { 2822908d778SJames Bottomley u8 _un30:1; 2832908d778SJames Bottomley u8 smp_tport:1; 2842908d778SJames Bottomley u8 stp_tport:1; 2852908d778SJames Bottomley u8 ssp_tport:1; 2862908d778SJames Bottomley u8 _un347:4; 2872908d778SJames Bottomley }; 2882908d778SJames Bottomley u8 target_bits; 2892908d778SJames Bottomley }; 2902908d778SJames Bottomley 2912908d778SJames Bottomley /* Byte 4 - 11 */ 2922908d778SJames Bottomley u8 _un4_11[8]; 2932908d778SJames Bottomley 2942908d778SJames Bottomley /* Byte 12 - 19 */ 2952908d778SJames Bottomley u8 sas_addr[SAS_ADDR_SIZE]; 2962908d778SJames Bottomley 2972908d778SJames Bottomley /* Byte 20 */ 2982908d778SJames Bottomley u8 phy_id; 2992908d778SJames Bottomley 3002908d778SJames Bottomley u8 _un21_27[7]; 3012908d778SJames Bottomley 3022908d778SJames Bottomley __be32 crc; 3032908d778SJames Bottomley } __attribute__ ((packed)); 3042908d778SJames Bottomley 3052908d778SJames Bottomley struct ssp_frame_hdr { 3062908d778SJames Bottomley u8 frame_type; 3072908d778SJames Bottomley u8 hashed_dest_addr[HASHED_SAS_ADDR_SIZE]; 3082908d778SJames Bottomley u8 _r_a; 3092908d778SJames Bottomley u8 hashed_src_addr[HASHED_SAS_ADDR_SIZE]; 3102908d778SJames Bottomley __be16 _r_b; 3112908d778SJames Bottomley 3122908d778SJames Bottomley u8 changing_data_ptr:1; 3132908d778SJames Bottomley u8 retransmit:1; 3142908d778SJames Bottomley u8 retry_data_frames:1; 3152908d778SJames Bottomley u8 _r_c:5; 3162908d778SJames Bottomley 3172908d778SJames Bottomley u8 num_fill_bytes:2; 3182908d778SJames Bottomley u8 _r_d:6; 3192908d778SJames Bottomley 3202908d778SJames Bottomley u32 _r_e; 3212908d778SJames Bottomley __be16 tag; 3222908d778SJames Bottomley __be16 tptt; 3232908d778SJames Bottomley __be32 data_offs; 3242908d778SJames Bottomley } __attribute__ ((packed)); 3252908d778SJames Bottomley 3262908d778SJames Bottomley struct ssp_response_iu { 3272908d778SJames Bottomley u8 _r_a[10]; 3282908d778SJames Bottomley 3292908d778SJames Bottomley u8 datapres:2; 3302908d778SJames Bottomley u8 _r_b:6; 3312908d778SJames Bottomley 3322908d778SJames Bottomley u8 status; 3332908d778SJames Bottomley 3342908d778SJames Bottomley u32 _r_c; 3352908d778SJames Bottomley 3362908d778SJames Bottomley __be32 sense_data_len; 3372908d778SJames Bottomley __be32 response_data_len; 3382908d778SJames Bottomley 3392908d778SJames Bottomley u8 resp_data[0]; 3402908d778SJames Bottomley u8 sense_data[0]; 3412908d778SJames Bottomley } __attribute__ ((packed)); 3422908d778SJames Bottomley 3432908d778SJames Bottomley /* ---------- SMP ---------- */ 3442908d778SJames Bottomley 3452908d778SJames Bottomley struct report_general_resp { 3462908d778SJames Bottomley __be16 change_count; 3472908d778SJames Bottomley __be16 route_indexes; 3482908d778SJames Bottomley u8 _r_a; 3492908d778SJames Bottomley u8 num_phys; 3502908d778SJames Bottomley 3512908d778SJames Bottomley u8 conf_route_table:1; 3522908d778SJames Bottomley u8 configuring:1; 353ffaac8f4SLuben Tuikov u8 config_others:1; 354ffaac8f4SLuben Tuikov u8 orej_retry_supp:1; 355ffaac8f4SLuben Tuikov u8 stp_cont_awt:1; 356ffaac8f4SLuben Tuikov u8 self_config:1; 357ffaac8f4SLuben Tuikov u8 zone_config:1; 358ffaac8f4SLuben Tuikov u8 t2t_supp:1; 3592908d778SJames Bottomley 3602908d778SJames Bottomley u8 _r_c; 3612908d778SJames Bottomley 3622908d778SJames Bottomley u8 enclosure_logical_id[8]; 3632908d778SJames Bottomley 3642908d778SJames Bottomley u8 _r_d[12]; 3652908d778SJames Bottomley } __attribute__ ((packed)); 3662908d778SJames Bottomley 3672908d778SJames Bottomley struct discover_resp { 3682908d778SJames Bottomley u8 _r_a[5]; 3692908d778SJames Bottomley 3702908d778SJames Bottomley u8 phy_id; 3712908d778SJames Bottomley __be16 _r_b; 3722908d778SJames Bottomley 3732908d778SJames Bottomley u8 _r_c:4; 3742908d778SJames Bottomley u8 attached_dev_type:3; 3752908d778SJames Bottomley u8 _r_d:1; 3762908d778SJames Bottomley 3772908d778SJames Bottomley u8 linkrate:4; 3782908d778SJames Bottomley u8 _r_e:4; 3792908d778SJames Bottomley 3802908d778SJames Bottomley u8 attached_sata_host:1; 3812908d778SJames Bottomley u8 iproto:3; 3822908d778SJames Bottomley u8 _r_f:4; 3832908d778SJames Bottomley 3842908d778SJames Bottomley u8 attached_sata_dev:1; 3852908d778SJames Bottomley u8 tproto:3; 3862908d778SJames Bottomley u8 _r_g:3; 3872908d778SJames Bottomley u8 attached_sata_ps:1; 3882908d778SJames Bottomley 3892908d778SJames Bottomley u8 sas_addr[8]; 3902908d778SJames Bottomley u8 attached_sas_addr[8]; 3912908d778SJames Bottomley u8 attached_phy_id; 3922908d778SJames Bottomley 3932908d778SJames Bottomley u8 _r_h[7]; 3942908d778SJames Bottomley 3952908d778SJames Bottomley u8 hmin_linkrate:4; 3962908d778SJames Bottomley u8 pmin_linkrate:4; 3972908d778SJames Bottomley u8 hmax_linkrate:4; 3982908d778SJames Bottomley u8 pmax_linkrate:4; 3992908d778SJames Bottomley 4002908d778SJames Bottomley u8 change_count; 4012908d778SJames Bottomley 4022908d778SJames Bottomley u8 pptv:4; 4032908d778SJames Bottomley u8 _r_i:3; 4042908d778SJames Bottomley u8 virtual:1; 4052908d778SJames Bottomley 4062908d778SJames Bottomley u8 routing_attr:4; 4072908d778SJames Bottomley u8 _r_j:4; 4082908d778SJames Bottomley 4092908d778SJames Bottomley u8 conn_type; 4102908d778SJames Bottomley u8 conn_el_index; 4112908d778SJames Bottomley u8 conn_phy_link; 4122908d778SJames Bottomley 4132908d778SJames Bottomley u8 _r_k[8]; 4142908d778SJames Bottomley } __attribute__ ((packed)); 4152908d778SJames Bottomley 4162908d778SJames Bottomley struct report_phy_sata_resp { 4172908d778SJames Bottomley u8 _r_a[5]; 4182908d778SJames Bottomley 4192908d778SJames Bottomley u8 phy_id; 4202908d778SJames Bottomley u8 _r_b; 4212908d778SJames Bottomley 4222908d778SJames Bottomley u8 affil_valid:1; 4232908d778SJames Bottomley u8 affil_supp:1; 4242908d778SJames Bottomley u8 _r_c:6; 4252908d778SJames Bottomley 4262908d778SJames Bottomley u32 _r_d; 4272908d778SJames Bottomley 4282908d778SJames Bottomley u8 stp_sas_addr[8]; 4292908d778SJames Bottomley 4302908d778SJames Bottomley struct dev_to_host_fis fis; 4312908d778SJames Bottomley 4322908d778SJames Bottomley u32 _r_e; 4332908d778SJames Bottomley 4342908d778SJames Bottomley u8 affil_stp_ini_addr[8]; 4352908d778SJames Bottomley 4362908d778SJames Bottomley __be32 crc; 4372908d778SJames Bottomley } __attribute__ ((packed)); 4382908d778SJames Bottomley 4392908d778SJames Bottomley struct smp_resp { 4402908d778SJames Bottomley u8 frame_type; 4412908d778SJames Bottomley u8 function; 4422908d778SJames Bottomley u8 result; 4432908d778SJames Bottomley u8 reserved; 4442908d778SJames Bottomley union { 4452908d778SJames Bottomley struct report_general_resp rg; 4462908d778SJames Bottomley struct discover_resp disc; 4472908d778SJames Bottomley struct report_phy_sata_resp rps; 4482908d778SJames Bottomley }; 4492908d778SJames Bottomley } __attribute__ ((packed)); 4502908d778SJames Bottomley 4512908d778SJames Bottomley #elif defined(__BIG_ENDIAN_BITFIELD) 4522908d778SJames Bottomley struct sas_identify_frame { 4532908d778SJames Bottomley /* Byte 0 */ 4542908d778SJames Bottomley u8 _un0:1; 4552908d778SJames Bottomley u8 dev_type:3; 4562908d778SJames Bottomley u8 frame_type:4; 4572908d778SJames Bottomley 4582908d778SJames Bottomley /* Byte 1 */ 4592908d778SJames Bottomley u8 _un1; 4602908d778SJames Bottomley 4612908d778SJames Bottomley /* Byte 2 */ 4622908d778SJames Bottomley union { 4632908d778SJames Bottomley struct { 4642908d778SJames Bottomley u8 _un247:4; 4652908d778SJames Bottomley u8 ssp_iport:1; 4662908d778SJames Bottomley u8 stp_iport:1; 4672908d778SJames Bottomley u8 smp_iport:1; 4682908d778SJames Bottomley u8 _un20:1; 4692908d778SJames Bottomley }; 4702908d778SJames Bottomley u8 initiator_bits; 4712908d778SJames Bottomley }; 4722908d778SJames Bottomley 4732908d778SJames Bottomley /* Byte 3 */ 4742908d778SJames Bottomley union { 4752908d778SJames Bottomley struct { 4762908d778SJames Bottomley u8 _un347:4; 4772908d778SJames Bottomley u8 ssp_tport:1; 4782908d778SJames Bottomley u8 stp_tport:1; 4792908d778SJames Bottomley u8 smp_tport:1; 4802908d778SJames Bottomley u8 _un30:1; 4812908d778SJames Bottomley }; 4822908d778SJames Bottomley u8 target_bits; 4832908d778SJames Bottomley }; 4842908d778SJames Bottomley 4852908d778SJames Bottomley /* Byte 4 - 11 */ 4862908d778SJames Bottomley u8 _un4_11[8]; 4872908d778SJames Bottomley 4882908d778SJames Bottomley /* Byte 12 - 19 */ 4892908d778SJames Bottomley u8 sas_addr[SAS_ADDR_SIZE]; 4902908d778SJames Bottomley 4912908d778SJames Bottomley /* Byte 20 */ 4922908d778SJames Bottomley u8 phy_id; 4932908d778SJames Bottomley 4942908d778SJames Bottomley u8 _un21_27[7]; 4952908d778SJames Bottomley 4962908d778SJames Bottomley __be32 crc; 4972908d778SJames Bottomley } __attribute__ ((packed)); 4982908d778SJames Bottomley 4992908d778SJames Bottomley struct ssp_frame_hdr { 5002908d778SJames Bottomley u8 frame_type; 5012908d778SJames Bottomley u8 hashed_dest_addr[HASHED_SAS_ADDR_SIZE]; 5022908d778SJames Bottomley u8 _r_a; 5032908d778SJames Bottomley u8 hashed_src_addr[HASHED_SAS_ADDR_SIZE]; 5042908d778SJames Bottomley __be16 _r_b; 5052908d778SJames Bottomley 5062908d778SJames Bottomley u8 _r_c:5; 5072908d778SJames Bottomley u8 retry_data_frames:1; 5082908d778SJames Bottomley u8 retransmit:1; 5092908d778SJames Bottomley u8 changing_data_ptr:1; 5102908d778SJames Bottomley 5112908d778SJames Bottomley u8 _r_d:6; 5122908d778SJames Bottomley u8 num_fill_bytes:2; 5132908d778SJames Bottomley 5142908d778SJames Bottomley u32 _r_e; 5152908d778SJames Bottomley __be16 tag; 5162908d778SJames Bottomley __be16 tptt; 5172908d778SJames Bottomley __be32 data_offs; 5182908d778SJames Bottomley } __attribute__ ((packed)); 5192908d778SJames Bottomley 5202908d778SJames Bottomley struct ssp_response_iu { 5212908d778SJames Bottomley u8 _r_a[10]; 5222908d778SJames Bottomley 5232908d778SJames Bottomley u8 _r_b:6; 5242908d778SJames Bottomley u8 datapres:2; 5252908d778SJames Bottomley 5262908d778SJames Bottomley u8 status; 5272908d778SJames Bottomley 5282908d778SJames Bottomley u32 _r_c; 5292908d778SJames Bottomley 5302908d778SJames Bottomley __be32 sense_data_len; 5312908d778SJames Bottomley __be32 response_data_len; 5322908d778SJames Bottomley 5332908d778SJames Bottomley u8 resp_data[0]; 5342908d778SJames Bottomley u8 sense_data[0]; 5352908d778SJames Bottomley } __attribute__ ((packed)); 5362908d778SJames Bottomley 5372908d778SJames Bottomley /* ---------- SMP ---------- */ 5382908d778SJames Bottomley 5392908d778SJames Bottomley struct report_general_resp { 5402908d778SJames Bottomley __be16 change_count; 5412908d778SJames Bottomley __be16 route_indexes; 5422908d778SJames Bottomley u8 _r_a; 5432908d778SJames Bottomley u8 num_phys; 5442908d778SJames Bottomley 545ffaac8f4SLuben Tuikov u8 t2t_supp:1; 546ffaac8f4SLuben Tuikov u8 zone_config:1; 547ffaac8f4SLuben Tuikov u8 self_config:1; 548ffaac8f4SLuben Tuikov u8 stp_cont_awt:1; 549ffaac8f4SLuben Tuikov u8 orej_retry_supp:1; 550ffaac8f4SLuben Tuikov u8 config_others:1; 5512908d778SJames Bottomley u8 configuring:1; 5522908d778SJames Bottomley u8 conf_route_table:1; 5532908d778SJames Bottomley 5542908d778SJames Bottomley u8 _r_c; 5552908d778SJames Bottomley 5562908d778SJames Bottomley u8 enclosure_logical_id[8]; 5572908d778SJames Bottomley 5582908d778SJames Bottomley u8 _r_d[12]; 5592908d778SJames Bottomley } __attribute__ ((packed)); 5602908d778SJames Bottomley 5612908d778SJames Bottomley struct discover_resp { 5622908d778SJames Bottomley u8 _r_a[5]; 5632908d778SJames Bottomley 5642908d778SJames Bottomley u8 phy_id; 5652908d778SJames Bottomley __be16 _r_b; 5662908d778SJames Bottomley 5672908d778SJames Bottomley u8 _r_d:1; 5682908d778SJames Bottomley u8 attached_dev_type:3; 5692908d778SJames Bottomley u8 _r_c:4; 5702908d778SJames Bottomley 5712908d778SJames Bottomley u8 _r_e:4; 5722908d778SJames Bottomley u8 linkrate:4; 5732908d778SJames Bottomley 5742908d778SJames Bottomley u8 _r_f:4; 5752908d778SJames Bottomley u8 iproto:3; 5762908d778SJames Bottomley u8 attached_sata_host:1; 5772908d778SJames Bottomley 5782908d778SJames Bottomley u8 attached_sata_ps:1; 5792908d778SJames Bottomley u8 _r_g:3; 5802908d778SJames Bottomley u8 tproto:3; 5812908d778SJames Bottomley u8 attached_sata_dev:1; 5822908d778SJames Bottomley 5832908d778SJames Bottomley u8 sas_addr[8]; 5842908d778SJames Bottomley u8 attached_sas_addr[8]; 5852908d778SJames Bottomley u8 attached_phy_id; 5862908d778SJames Bottomley 5872908d778SJames Bottomley u8 _r_h[7]; 5882908d778SJames Bottomley 5892908d778SJames Bottomley u8 pmin_linkrate:4; 5902908d778SJames Bottomley u8 hmin_linkrate:4; 5912908d778SJames Bottomley u8 pmax_linkrate:4; 5922908d778SJames Bottomley u8 hmax_linkrate:4; 5932908d778SJames Bottomley 5942908d778SJames Bottomley u8 change_count; 5952908d778SJames Bottomley 5962908d778SJames Bottomley u8 virtual:1; 5972908d778SJames Bottomley u8 _r_i:3; 5982908d778SJames Bottomley u8 pptv:4; 5992908d778SJames Bottomley 6002908d778SJames Bottomley u8 _r_j:4; 6012908d778SJames Bottomley u8 routing_attr:4; 6022908d778SJames Bottomley 6032908d778SJames Bottomley u8 conn_type; 6042908d778SJames Bottomley u8 conn_el_index; 6052908d778SJames Bottomley u8 conn_phy_link; 6062908d778SJames Bottomley 6072908d778SJames Bottomley u8 _r_k[8]; 6082908d778SJames Bottomley } __attribute__ ((packed)); 6092908d778SJames Bottomley 6102908d778SJames Bottomley struct report_phy_sata_resp { 6112908d778SJames Bottomley u8 _r_a[5]; 6122908d778SJames Bottomley 6132908d778SJames Bottomley u8 phy_id; 6142908d778SJames Bottomley u8 _r_b; 6152908d778SJames Bottomley 6162908d778SJames Bottomley u8 _r_c:6; 6172908d778SJames Bottomley u8 affil_supp:1; 6182908d778SJames Bottomley u8 affil_valid:1; 6192908d778SJames Bottomley 6202908d778SJames Bottomley u32 _r_d; 6212908d778SJames Bottomley 6222908d778SJames Bottomley u8 stp_sas_addr[8]; 6232908d778SJames Bottomley 6242908d778SJames Bottomley struct dev_to_host_fis fis; 6252908d778SJames Bottomley 6262908d778SJames Bottomley u32 _r_e; 6272908d778SJames Bottomley 6282908d778SJames Bottomley u8 affil_stp_ini_addr[8]; 6292908d778SJames Bottomley 6302908d778SJames Bottomley __be32 crc; 6312908d778SJames Bottomley } __attribute__ ((packed)); 6322908d778SJames Bottomley 6332908d778SJames Bottomley struct smp_resp { 6342908d778SJames Bottomley u8 frame_type; 6352908d778SJames Bottomley u8 function; 6362908d778SJames Bottomley u8 result; 6372908d778SJames Bottomley u8 reserved; 6382908d778SJames Bottomley union { 6392908d778SJames Bottomley struct report_general_resp rg; 6402908d778SJames Bottomley struct discover_resp disc; 6412908d778SJames Bottomley struct report_phy_sata_resp rps; 6422908d778SJames Bottomley }; 6432908d778SJames Bottomley } __attribute__ ((packed)); 6442908d778SJames Bottomley 6452908d778SJames Bottomley #else 6462908d778SJames Bottomley #error "Bitfield order not defined!" 6472908d778SJames Bottomley #endif 6482908d778SJames Bottomley 6492908d778SJames Bottomley #endif /* _SAS_H_ */ 650