home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / scsi / sas.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  11.7 KB  |  631 lines

  1. /*
  2.  * SAS structures and definitions header file
  3.  *
  4.  * Copyright (C) 2005 Adaptec, Inc.  All rights reserved.
  5.  * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com>
  6.  *
  7.  * This file is licensed under GPLv2.
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License as
  11.  * published by the Free Software Foundation; either version 2 of the
  12.  * License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful, but
  15.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17.  * General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  22.  * USA
  23.  *
  24.  */
  25.  
  26. #ifndef _SAS_H_
  27. #define _SAS_H_
  28.  
  29. #include <linux/types.h>
  30. #include <asm/byteorder.h>
  31.  
  32. #define SAS_ADDR_SIZE        8
  33. #define HASHED_SAS_ADDR_SIZE 3
  34. #define SAS_ADDR(_sa) ((unsigned long long) be64_to_cpu(*(__be64 *)(_sa)))
  35.  
  36. #define SMP_REQUEST             0x40
  37. #define SMP_RESPONSE            0x41
  38.  
  39. #define SSP_DATA                0x01
  40. #define SSP_XFER_RDY            0x05
  41. #define SSP_COMMAND             0x06
  42. #define SSP_RESPONSE            0x07
  43. #define SSP_TASK                0x16
  44.  
  45. #define SMP_REPORT_GENERAL       0x00
  46. #define SMP_REPORT_MANUF_INFO    0x01
  47. #define SMP_READ_GPIO_REG        0x02
  48. #define SMP_DISCOVER             0x10
  49. #define SMP_REPORT_PHY_ERR_LOG   0x11
  50. #define SMP_REPORT_PHY_SATA      0x12
  51. #define SMP_REPORT_ROUTE_INFO    0x13
  52. #define SMP_WRITE_GPIO_REG       0x82
  53. #define SMP_CONF_ROUTE_INFO      0x90
  54. #define SMP_PHY_CONTROL          0x91
  55. #define SMP_PHY_TEST_FUNCTION    0x92
  56.  
  57. #define SMP_RESP_FUNC_ACC        0x00
  58. #define SMP_RESP_FUNC_UNK        0x01
  59. #define SMP_RESP_FUNC_FAILED     0x02
  60. #define SMP_RESP_INV_FRM_LEN     0x03
  61. #define SMP_RESP_NO_PHY          0x10
  62. #define SMP_RESP_NO_INDEX        0x11
  63. #define SMP_RESP_PHY_NO_SATA     0x12
  64. #define SMP_RESP_PHY_UNK_OP      0x13
  65. #define SMP_RESP_PHY_UNK_TESTF   0x14
  66. #define SMP_RESP_PHY_TEST_INPROG 0x15
  67. #define SMP_RESP_PHY_VACANT      0x16
  68.  
  69. /* SAM TMFs */
  70. #define TMF_ABORT_TASK      0x01
  71. #define TMF_ABORT_TASK_SET  0x02
  72. #define TMF_CLEAR_TASK_SET  0x04
  73. #define TMF_LU_RESET        0x08
  74. #define TMF_CLEAR_ACA       0x40
  75. #define TMF_QUERY_TASK      0x80
  76.  
  77. /* SAS TMF responses */
  78. #define TMF_RESP_FUNC_COMPLETE   0x00
  79. #define TMF_RESP_INVALID_FRAME   0x02
  80. #define TMF_RESP_FUNC_ESUPP      0x04
  81. #define TMF_RESP_FUNC_FAILED     0x05
  82. #define TMF_RESP_FUNC_SUCC       0x08
  83. #define TMF_RESP_NO_LUN          0x09
  84. #define TMF_RESP_OVERLAPPED_TAG  0x0A
  85.  
  86. enum sas_oob_mode {
  87.     OOB_NOT_CONNECTED,
  88.     SATA_OOB_MODE,
  89.     SAS_OOB_MODE
  90. };
  91.  
  92. /* See sas_discover.c if you plan on changing these.
  93.  */
  94. enum sas_dev_type {
  95.     NO_DEVICE   = 0,      /* protocol */
  96.     SAS_END_DEV = 1,      /* protocol */
  97.     EDGE_DEV    = 2,      /* protocol */
  98.     FANOUT_DEV  = 3,      /* protocol */
  99.     SAS_HA      = 4,
  100.     SATA_DEV    = 5,
  101.     SATA_PM     = 7,
  102.     SATA_PM_PORT= 8,
  103. };
  104.  
  105. enum sas_protocol {
  106.     SAS_PROTOCOL_SATA        = 0x01,
  107.     SAS_PROTOCOL_SMP        = 0x02,
  108.     SAS_PROTOCOL_STP        = 0x04,
  109.     SAS_PROTOCOL_SSP        = 0x08,
  110.     SAS_PROTOCOL_ALL        = 0x0E,
  111. };
  112.  
  113. /* From the spec; local phys only */
  114. enum phy_func {
  115.     PHY_FUNC_NOP,
  116.     PHY_FUNC_LINK_RESET,          /* Enables the phy */
  117.     PHY_FUNC_HARD_RESET,
  118.     PHY_FUNC_DISABLE,
  119.     PHY_FUNC_CLEAR_ERROR_LOG = 5,
  120.     PHY_FUNC_CLEAR_AFFIL,
  121.     PHY_FUNC_TX_SATA_PS_SIGNAL,
  122.     PHY_FUNC_RELEASE_SPINUP_HOLD = 0x10, /* LOCAL PORT ONLY! */
  123.     PHY_FUNC_SET_LINK_RATE,
  124. };
  125.  
  126. /* SAS LLDD would need to report only _very_few_ of those, like BROADCAST.
  127.  * Most of those are here for completeness.
  128.  */
  129. enum sas_prim {
  130.     SAS_PRIM_AIP_NORMAL = 1,
  131.     SAS_PRIM_AIP_R0     = 2,
  132.     SAS_PRIM_AIP_R1     = 3,
  133.     SAS_PRIM_AIP_R2     = 4,
  134.     SAS_PRIM_AIP_WC     = 5,
  135.     SAS_PRIM_AIP_WD     = 6,
  136.     SAS_PRIM_AIP_WP     = 7,
  137.     SAS_PRIM_AIP_RWP    = 8,
  138.  
  139.     SAS_PRIM_BC_CH      = 9,
  140.     SAS_PRIM_BC_RCH0    = 10,
  141.     SAS_PRIM_BC_RCH1    = 11,
  142.     SAS_PRIM_BC_R0      = 12,
  143.     SAS_PRIM_BC_R1      = 13,
  144.     SAS_PRIM_BC_R2      = 14,
  145.     SAS_PRIM_BC_R3      = 15,
  146.     SAS_PRIM_BC_R4      = 16,
  147.  
  148.     SAS_PRIM_NOTIFY_ENSP= 17,
  149.     SAS_PRIM_NOTIFY_R0  = 18,
  150.     SAS_PRIM_NOTIFY_R1  = 19,
  151.     SAS_PRIM_NOTIFY_R2  = 20,
  152.  
  153.     SAS_PRIM_CLOSE_CLAF = 21,
  154.     SAS_PRIM_CLOSE_NORM = 22,
  155.     SAS_PRIM_CLOSE_R0   = 23,
  156.     SAS_PRIM_CLOSE_R1   = 24,
  157.  
  158.     SAS_PRIM_OPEN_RTRY  = 25,
  159.     SAS_PRIM_OPEN_RJCT  = 26,
  160.     SAS_PRIM_OPEN_ACPT  = 27,
  161.  
  162.     SAS_PRIM_DONE       = 28,
  163.     SAS_PRIM_BREAK      = 29,
  164.  
  165.     SATA_PRIM_DMAT      = 33,
  166.     SATA_PRIM_PMNAK     = 34,
  167.     SATA_PRIM_PMACK     = 35,
  168.     SATA_PRIM_PMREQ_S   = 36,
  169.     SATA_PRIM_PMREQ_P   = 37,
  170.     SATA_SATA_R_ERR     = 38,
  171. };
  172.  
  173. enum sas_open_rej_reason {
  174.     /* Abandon open */
  175.     SAS_OREJ_UNKNOWN   = 0,
  176.     SAS_OREJ_BAD_DEST  = 1,
  177.     SAS_OREJ_CONN_RATE = 2,
  178.     SAS_OREJ_EPROTO    = 3,
  179.     SAS_OREJ_RESV_AB0  = 4,
  180.     SAS_OREJ_RESV_AB1  = 5,
  181.     SAS_OREJ_RESV_AB2  = 6,
  182.     SAS_OREJ_RESV_AB3  = 7,
  183.     SAS_OREJ_WRONG_DEST= 8,
  184.     SAS_OREJ_STP_NORES = 9,
  185.  
  186.     /* Retry open */
  187.     SAS_OREJ_NO_DEST   = 10,
  188.     SAS_OREJ_PATH_BLOCKED = 11,
  189.     SAS_OREJ_RSVD_CONT0 = 12,
  190.     SAS_OREJ_RSVD_CONT1 = 13,
  191.     SAS_OREJ_RSVD_INIT0 = 14,
  192.     SAS_OREJ_RSVD_INIT1 = 15,
  193.     SAS_OREJ_RSVD_STOP0 = 16,
  194.     SAS_OREJ_RSVD_STOP1 = 17,
  195.     SAS_OREJ_RSVD_RETRY = 18,
  196. };
  197.  
  198. struct  dev_to_host_fis {
  199.     u8     fis_type;      /* 0x34 */
  200.     u8     flags;
  201.     u8     status;
  202.     u8     error;
  203.  
  204.     u8     lbal;
  205.     union { u8 lbam; u8 byte_count_low; };
  206.     union { u8 lbah; u8 byte_count_high; };
  207.     u8     device;
  208.  
  209.     u8     lbal_exp;
  210.     u8     lbam_exp;
  211.     u8     lbah_exp;
  212.     u8     _r_a;
  213.  
  214.     union { u8  sector_count; u8 interrupt_reason; };
  215.     u8     sector_count_exp;
  216.     u8     _r_b;
  217.     u8     _r_c;
  218.  
  219.     u32    _r_d;
  220. } __attribute__ ((packed));
  221.  
  222. struct host_to_dev_fis {
  223.     u8     fis_type;      /* 0x27 */
  224.     u8     flags;
  225.     u8     command;
  226.     u8     features;
  227.  
  228.     u8     lbal;
  229.     union { u8 lbam; u8 byte_count_low; };
  230.     union { u8 lbah; u8 byte_count_high; };
  231.     u8     device;
  232.  
  233.     u8     lbal_exp;
  234.     u8     lbam_exp;
  235.     u8     lbah_exp;
  236.     u8     features_exp;
  237.  
  238.     union { u8  sector_count; u8 interrupt_reason; };
  239.     u8     sector_count_exp;
  240.     u8     _r_a;
  241.     u8     control;
  242.  
  243.     u32    _r_b;
  244. } __attribute__ ((packed));
  245.  
  246. /* Prefer to have code clarity over header file clarity.
  247.  */
  248. #ifdef __LITTLE_ENDIAN_BITFIELD
  249. struct sas_identify_frame {
  250.     /* Byte 0 */
  251.     u8  frame_type:4;
  252.     u8  dev_type:3;
  253.     u8  _un0:1;
  254.  
  255.     /* Byte 1 */
  256.     u8  _un1;
  257.  
  258.     /* Byte 2 */
  259.     union {
  260.         struct {
  261.             u8  _un20:1;
  262.             u8  smp_iport:1;
  263.             u8  stp_iport:1;
  264.             u8  ssp_iport:1;
  265.             u8  _un247:4;
  266.         };
  267.         u8 initiator_bits;
  268.     };
  269.  
  270.     /* Byte 3 */
  271.     union {
  272.         struct {
  273.             u8  _un30:1;
  274.             u8 smp_tport:1;
  275.             u8 stp_tport:1;
  276.             u8 ssp_tport:1;
  277.             u8 _un347:4;
  278.         };
  279.         u8 target_bits;
  280.     };
  281.  
  282.     /* Byte 4 - 11 */
  283.     u8 _un4_11[8];
  284.  
  285.     /* Byte 12 - 19 */
  286.     u8 sas_addr[SAS_ADDR_SIZE];
  287.  
  288.     /* Byte 20 */
  289.     u8 phy_id;
  290.  
  291.     u8 _un21_27[7];
  292.  
  293.     __be32 crc;
  294. } __attribute__ ((packed));
  295.  
  296. struct ssp_frame_hdr {
  297.     u8     frame_type;
  298.     u8     hashed_dest_addr[HASHED_SAS_ADDR_SIZE];
  299.     u8     _r_a;
  300.     u8     hashed_src_addr[HASHED_SAS_ADDR_SIZE];
  301.     __be16 _r_b;
  302.  
  303.     u8     changing_data_ptr:1;
  304.     u8     retransmit:1;
  305.     u8     retry_data_frames:1;
  306.     u8     _r_c:5;
  307.  
  308.     u8     num_fill_bytes:2;
  309.     u8     _r_d:6;
  310.  
  311.     u32    _r_e;
  312.     __be16 tag;
  313.     __be16 tptt;
  314.     __be32 data_offs;
  315. } __attribute__ ((packed));
  316.  
  317. struct ssp_response_iu {
  318.     u8     _r_a[10];
  319.  
  320.     u8     datapres:2;
  321.     u8     _r_b:6;
  322.  
  323.     u8     status;
  324.  
  325.     u32    _r_c;
  326.  
  327.     __be32 sense_data_len;
  328.     __be32 response_data_len;
  329.  
  330.     u8     resp_data[0];
  331.     u8     sense_data[0];
  332. } __attribute__ ((packed));
  333.  
  334. /* ---------- SMP ---------- */
  335.  
  336. struct report_general_resp {
  337.     __be16  change_count;
  338.     __be16  route_indexes;
  339.     u8      _r_a;
  340.     u8      num_phys;
  341.  
  342.     u8      conf_route_table:1;
  343.     u8      configuring:1;
  344.     u8      _r_b:6;
  345.  
  346.     u8      _r_c;
  347.  
  348.     u8      enclosure_logical_id[8];
  349.  
  350.     u8      _r_d[12];
  351. } __attribute__ ((packed));
  352.  
  353. struct discover_resp {
  354.     u8    _r_a[5];
  355.  
  356.     u8    phy_id;
  357.     __be16 _r_b;
  358.  
  359.     u8    _r_c:4;
  360.     u8    attached_dev_type:3;
  361.     u8    _r_d:1;
  362.  
  363.     u8    linkrate:4;
  364.     u8    _r_e:4;
  365.  
  366.     u8    attached_sata_host:1;
  367.     u8    iproto:3;
  368.     u8    _r_f:4;
  369.  
  370.     u8    attached_sata_dev:1;
  371.     u8    tproto:3;
  372.     u8    _r_g:3;
  373.     u8    attached_sata_ps:1;
  374.  
  375.     u8    sas_addr[8];
  376.     u8    attached_sas_addr[8];
  377.     u8    attached_phy_id;
  378.  
  379.     u8    _r_h[7];
  380.  
  381.     u8    hmin_linkrate:4;
  382.     u8    pmin_linkrate:4;
  383.     u8    hmax_linkrate:4;
  384.     u8    pmax_linkrate:4;
  385.  
  386.     u8    change_count;
  387.  
  388.     u8    pptv:4;
  389.     u8    _r_i:3;
  390.     u8    virtual:1;
  391.  
  392.     u8    routing_attr:4;
  393.     u8    _r_j:4;
  394.  
  395.     u8    conn_type;
  396.     u8    conn_el_index;
  397.     u8    conn_phy_link;
  398.  
  399.     u8    _r_k[8];
  400. } __attribute__ ((packed));
  401.  
  402. struct report_phy_sata_resp {
  403.     u8    _r_a[5];
  404.  
  405.     u8    phy_id;
  406.     u8    _r_b;
  407.  
  408.     u8    affil_valid:1;
  409.     u8    affil_supp:1;
  410.     u8    _r_c:6;
  411.  
  412.     u32    _r_d;
  413.  
  414.     u8    stp_sas_addr[8];
  415.  
  416.     struct dev_to_host_fis fis;
  417.  
  418.     u32   _r_e;
  419.  
  420.     u8    affil_stp_ini_addr[8];
  421.  
  422.     __be32 crc;
  423. } __attribute__ ((packed));
  424.  
  425. struct smp_resp {
  426.     u8    frame_type;
  427.     u8    function;
  428.     u8    result;
  429.     u8    reserved;
  430.     union {
  431.         struct report_general_resp  rg;
  432.         struct discover_resp        disc;
  433.         struct report_phy_sata_resp rps;
  434.     };
  435. } __attribute__ ((packed));
  436.  
  437. #elif defined(__BIG_ENDIAN_BITFIELD)
  438. struct sas_identify_frame {
  439.     /* Byte 0 */
  440.     u8  _un0:1;
  441.     u8  dev_type:3;
  442.     u8  frame_type:4;
  443.  
  444.     /* Byte 1 */
  445.     u8  _un1;
  446.  
  447.     /* Byte 2 */
  448.     union {
  449.         struct {
  450.             u8  _un247:4;
  451.             u8  ssp_iport:1;
  452.             u8  stp_iport:1;
  453.             u8  smp_iport:1;
  454.             u8  _un20:1;
  455.         };
  456.         u8 initiator_bits;
  457.     };
  458.  
  459.     /* Byte 3 */
  460.     union {
  461.         struct {
  462.             u8 _un347:4;
  463.             u8 ssp_tport:1;
  464.             u8 stp_tport:1;
  465.             u8 smp_tport:1;
  466.             u8 _un30:1;
  467.         };
  468.         u8 target_bits;
  469.     };
  470.  
  471.     /* Byte 4 - 11 */
  472.     u8 _un4_11[8];
  473.  
  474.     /* Byte 12 - 19 */
  475.     u8 sas_addr[SAS_ADDR_SIZE];
  476.  
  477.     /* Byte 20 */
  478.     u8 phy_id;
  479.  
  480.     u8 _un21_27[7];
  481.  
  482.     __be32 crc;
  483. } __attribute__ ((packed));
  484.  
  485. struct ssp_frame_hdr {
  486.     u8     frame_type;
  487.     u8     hashed_dest_addr[HASHED_SAS_ADDR_SIZE];
  488.     u8     _r_a;
  489.     u8     hashed_src_addr[HASHED_SAS_ADDR_SIZE];
  490.     __be16 _r_b;
  491.  
  492.     u8     _r_c:5;
  493.     u8     retry_data_frames:1;
  494.     u8     retransmit:1;
  495.     u8     changing_data_ptr:1;
  496.  
  497.     u8     _r_d:6;
  498.     u8     num_fill_bytes:2;
  499.  
  500.     u32    _r_e;
  501.     __be16 tag;
  502.     __be16 tptt;
  503.     __be32 data_offs;
  504. } __attribute__ ((packed));
  505.  
  506. struct ssp_response_iu {
  507.     u8     _r_a[10];
  508.  
  509.     u8     _r_b:6;
  510.     u8     datapres:2;
  511.  
  512.     u8     status;
  513.  
  514.     u32    _r_c;
  515.  
  516.     __be32 sense_data_len;
  517.     __be32 response_data_len;
  518.  
  519.     u8     resp_data[0];
  520.     u8     sense_data[0];
  521. } __attribute__ ((packed));
  522.  
  523. /* ---------- SMP ---------- */
  524.  
  525. struct report_general_resp {
  526.     __be16  change_count;
  527.     __be16  route_indexes;
  528.     u8      _r_a;
  529.     u8      num_phys;
  530.  
  531.     u8      _r_b:6;
  532.     u8      configuring:1;
  533.     u8      conf_route_table:1;
  534.  
  535.     u8      _r_c;
  536.  
  537.     u8      enclosure_logical_id[8];
  538.  
  539.     u8      _r_d[12];
  540. } __attribute__ ((packed));
  541.  
  542. struct discover_resp {
  543.     u8    _r_a[5];
  544.  
  545.     u8    phy_id;
  546.     __be16 _r_b;
  547.  
  548.     u8    _r_d:1;
  549.     u8    attached_dev_type:3;
  550.     u8    _r_c:4;
  551.  
  552.     u8    _r_e:4;
  553.     u8    linkrate:4;
  554.  
  555.     u8    _r_f:4;
  556.     u8    iproto:3;
  557.     u8    attached_sata_host:1;
  558.  
  559.     u8    attached_sata_ps:1;
  560.     u8    _r_g:3;
  561.     u8    tproto:3;
  562.     u8    attached_sata_dev:1;
  563.  
  564.     u8    sas_addr[8];
  565.     u8    attached_sas_addr[8];
  566.     u8    attached_phy_id;
  567.  
  568.     u8    _r_h[7];
  569.  
  570.     u8    pmin_linkrate:4;
  571.     u8    hmin_linkrate:4;
  572.     u8    pmax_linkrate:4;
  573.     u8    hmax_linkrate:4;
  574.  
  575.     u8    change_count;
  576.  
  577.     u8    virtual:1;
  578.     u8    _r_i:3;
  579.     u8    pptv:4;
  580.  
  581.     u8    _r_j:4;
  582.     u8    routing_attr:4;
  583.  
  584.     u8    conn_type;
  585.     u8    conn_el_index;
  586.     u8    conn_phy_link;
  587.  
  588.     u8    _r_k[8];
  589. } __attribute__ ((packed));
  590.  
  591. struct report_phy_sata_resp {
  592.     u8    _r_a[5];
  593.  
  594.     u8    phy_id;
  595.     u8    _r_b;
  596.  
  597.     u8    _r_c:6;
  598.     u8    affil_supp:1;
  599.     u8    affil_valid:1;
  600.  
  601.     u32   _r_d;
  602.  
  603.     u8    stp_sas_addr[8];
  604.  
  605.     struct dev_to_host_fis fis;
  606.  
  607.     u32   _r_e;
  608.  
  609.     u8    affil_stp_ini_addr[8];
  610.  
  611.     __be32 crc;
  612. } __attribute__ ((packed));
  613.  
  614. struct smp_resp {
  615.     u8    frame_type;
  616.     u8    function;
  617.     u8    result;
  618.     u8    reserved;
  619.     union {
  620.         struct report_general_resp  rg;
  621.         struct discover_resp        disc;
  622.         struct report_phy_sata_resp rps;
  623.     };
  624. } __attribute__ ((packed));
  625.  
  626. #else
  627. #error "Bitfield order not defined!"
  628. #endif
  629.  
  630. #endif /* _SAS_H_ */
  631.