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