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