1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SATA_H 28 #define _SATA_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* 37 * Generic SATA Host Adapter Implementation 38 */ 39 40 #include <sys/types.h> 41 #include <sys/scsi/scsi.h> 42 #include <sys/scsi/impl/services.h> 43 #include <sys/sata/sata_defs.h> 44 #include <sys/sata/sata_hba.h> 45 46 /* Statistics counters */ 47 struct sata_port_stats { 48 uint64_t link_lost; /* event counter */ 49 uint64_t link_established; /* event counter */ 50 uint64_t device_attached; /* event counter */ 51 uint64_t device_detached; /* event counter */ 52 uint64_t port_reset; /* event counter */ 53 uint64_t port_pwr_changed; /* event counter */ 54 }; 55 56 typedef struct sata_port_stats sata_port_stats_t; 57 58 struct sata_drive_stats { 59 uint64_t media_error; /* available ??? */ 60 uint64_t drive_reset; /* event counter */ 61 } sata_drv_stats_t; 62 63 typedef struct sata_drive_stats sata_drive_stats_t; 64 65 struct sata_ctrl_stats { 66 uint64_t ctrl_reset; /* event counter */ 67 uint64_t ctrl_pwr_change; /* event counter */ 68 }; 69 70 typedef struct sata_ctrl_stats sata_ctrl_stats_t; 71 72 73 /* 74 * SATA HBA instance info structure 75 */ 76 struct sata_hba_inst { 77 dev_info_t *satahba_dip; /* this HBA instance devinfo */ 78 struct sata_hba_inst *satahba_next; /* ptr to next sata_hba_inst */ 79 struct sata_hba_inst *satahba_prev; /* ptr to prev sata_hba_inst */ 80 struct scsi_hba_tran *satahba_scsi_tran; /* scsi_hba_tran */ 81 struct sata_hba_tran *satahba_tran; /* sata_hba_tran */ 82 kmutex_t satahba_mutex; /* sata hba cntrl mutex */ 83 struct taskq *satahba_taskq; /* cmd completion task queue */ 84 85 /* 86 * HBA event flags: 87 * SATA_EVNT_MAIN 88 * SATA_EVNT_PWR_LEVEL_CHANGED 89 * SATA_EVNT_SKIP 90 */ 91 uint_t satahba_event_flags; 92 93 struct sata_cport_info *satahba_dev_port[SATA_MAX_CPORTS]; 94 95 /* 96 * DEVCTL open flag: 97 * SATA_DEVCTL_SOPENED 98 * SATA_DEVCTL_EXOPENED 99 */ 100 uint_t satahba_open_flag; /* shared open flag */ 101 struct sata_ctrl_stats satahba_stats; /* HBA cntrl statistics */ 102 103 uint_t satahba_attached; /* HBA attaching: */ 104 /* 0 - not completed */ 105 /* 1 - completed */ 106 }; 107 108 typedef struct sata_hba_inst sata_hba_inst_t; 109 110 /* 111 * SATA controller's device port info and state. 112 * This structure is pointed to by the sata_hba_inst.satahba_dev_port[x] 113 * where x is a device port number. 114 * cport_state holds port state flags, defined in sata_hba.h file. 115 * cport_event_flags holds SATA_EVNT_* flags defined in this file and in 116 * sata_hba.h file. 117 * cport_dev_type holds SATA_DTYPE_* types defined in sata_hba.h file. 118 */ 119 struct sata_cport_info { 120 sata_address_t cport_addr; /* this port SATA address */ 121 kmutex_t cport_mutex; /* port mutex */ 122 123 /* 124 * Port state flags 125 * SATA_STATE_UNKNOWN 126 * SATA_STATE_PROBING 127 * SATA_STATE_PROBED 128 * SATA_STATE_READY 129 * SATA_PSTATE_PWRON 130 * SATA_PSTATE_PWROFF 131 * SATA_PSTATE_SHUTDOWN 132 * SATA_PSTATE_FAILED 133 */ 134 uint32_t cport_state; 135 136 /* 137 * Port event flags: 138 * SATA_EVNT_DEVICE_ATTACHED 139 * SATA_EVNT_DEVICE_DETACHED 140 * SATA_EVNT_LINK_LOST 141 * SATA_EVNT_LINK_ESTABLISHED 142 * SATA_EVNT_PORT_FAILED 143 * SATA_EVNT_PWR_LEVEL_CHANGED 144 */ 145 uint32_t cport_event_flags; 146 147 struct sata_port_scr cport_scr; /* Port status and ctrl regs */ 148 149 /* 150 * Attached device type: 151 * SATA_DTYPE_NONE 152 * SATA_DTYPE_ATADISK 153 * SATA_DTYPE_ATAPICD 154 * SATA_DTYPE_ATAPINONCD 155 * SATA_DTYPE_PMULT 156 * SATA_DTYPE_UNKNOWN 157 */ 158 uint32_t cport_dev_type; 159 union { 160 struct sata_drive_info *cport_sata_drive; /* Attached drive info */ 161 struct sata_pmult_info *cport_sata_pmult; /* Attached Port Mult */ 162 } cport_devp; 163 /* lbolt value at link lost */ 164 clock_t cport_link_lost_time; 165 /* lbolt value @ dev attached */ 166 clock_t cport_dev_attach_time; 167 168 struct sata_port_stats cport_stats; /* Port statistics */ 169 170 boolean_t cport_tgtnode_clean; /* Target node usable */ 171 }; 172 173 typedef struct sata_cport_info sata_cport_info_t; 174 175 /* 176 * Attached SATA drive info and state. 177 * This structure is pointed to by sata_cport_info's cport_sata_drive field 178 * when a drive is attached directly to a controller device port. 179 */ 180 struct sata_drive_info { 181 sata_address_t satadrv_addr; /* this drive SATA address */ 182 183 /* 184 * Drive state flags 185 * SATA_STATE_UNKNOWN 186 * SATA_STATE_PROBING 187 * SATA_STATE_PROBED 188 * SATA_STATE_READY 189 * SATA_DSTATE_PWR_ACTIVE 190 * SATA_DSTATE_PWR_IDLE 191 * SATA_DSTATE_RESET 192 * SATA_DSTATE_FAILED 193 */ 194 uint32_t satadrv_state; 195 196 /* 197 * drive event flags: 198 * SATA_EVNT_DRIVE_RESET 199 */ 200 uint32_t satadrv_event_flags; 201 202 /* 203 * Attached device type: 204 * SATA_DTYPE_ATADISK 205 * SATA_DTYPE_ATAPICD 206 * SATA_DTYPE_ATAPINONCD 207 */ 208 uint32_t satadrv_type; 209 210 uint32_t satadrv_status_reg; /* drive status reg */ 211 uint32_t satadrv_error_reg; /* drive error reg */ 212 uint16_t satadrv_features_support; /* drive features support */ 213 uint16_t satadrv_queue_depth; /* drive queue depth */ 214 uint16_t satadrv_atapi_cdb_len; /* atapi supported cdb length */ 215 uint16_t satadrv_atapi_trans_ver; /* atapi transport version */ 216 uint16_t satadrv_settings; /* drive settings flags */ 217 uint16_t satadrv_features_enabled; /* drive features enabled */ 218 uint64_t satadrv_capacity; /* drive capacity */ 219 uint64_t satadrv_max_queue_depth; /* maximum queue depth */ 220 sata_id_t satadrv_id; /* Device Identify Data */ 221 struct sata_drive_stats satadrv_stats; /* drive statistics */ 222 }; 223 224 typedef struct sata_drive_info sata_drive_info_t; 225 226 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_drive_info)) 227 228 229 /* Port Multiplier & host port info and state */ 230 struct sata_pmult_info { 231 sata_address_t pmult_addr; /* this PMult SATA Address */ 232 kmutex_t pmult_mutex; /* pmult (host port) mutex */ 233 234 /* 235 * PMult state flags 236 * SATA_STATE_UNKNOWN 237 * SATA_STATE_PROBING 238 * SATA_STATE_PROBED 239 * SATA_STATE_READY 240 * SATA_PSTATE_FAILED 241 */ 242 uint32_t pmult_state; 243 uint32_t pmult_event_flags; /* Undefined for now */ 244 struct sata_port_scr pmult_scr; /* Host port SCR block */ 245 uint32_t pmult_num_dev_ports; /* Number of data ports */ 246 struct sata_pmport_info *pmult_dev_port[SATA_MAX_PMPORTS - 1]; 247 }; 248 249 typedef struct sata_pmult_info sata_pmult_info_t; 250 251 /* Port Multiplier's device port info & state */ 252 struct sata_pmport_info { 253 sata_address_t pmport_addr; /* this SATA port address */ 254 kmutex_t pmport_mutex; /* pmult device port mutex */ 255 256 /* 257 * Port state flags 258 * SATA_STATE_UNKNOWN 259 * SATA_STATE_PROBING 260 * SATA_STATE_PROBED 261 * SATA_STATE_READY 262 * SATA_PSTATE_PWRON 263 * SATA_PSTATE_PWROFF 264 * SATA_PSTATE_SHUTDOWN 265 * SATA_PSTATE_FAILED 266 */ 267 uint32_t pmport_state; 268 269 /* 270 * Port event flags: 271 * SATA_EVNT_DEVICE_ATTACHED 272 * SATA_EVNT_DEVICE_DETACHED 273 * SATA_EVNT_LINK_LOST 274 * SATA_EVNT_LINK_ESTABLISHED 275 * SATA_EVNT_PORT_FAILED 276 * SATA_EVNT_PWR_LEVEL_CHANGED 277 */ 278 uint32_t pmport_event_flags; 279 280 struct sata_port_scr pmport_scr; /* PMult device port scr */ 281 282 /* 283 * Attached device type: 284 * SATA_DTYPE_NONE 285 * SATA_DTYPE_ATADISK 286 * SATA_DTYPE_ATAPICD 287 * SATA_DTYPE_ATAPINONCD 288 * SATA_DTYPE_UNKNOWN 289 */ 290 uint32_t pmport_dev_type; 291 292 struct sata_drive_info *pmport_sata_drive; /* Attached drive info */ 293 294 /* lbolt value at link lost */ 295 clock_t pmport_link_lost_time; 296 /* lbolt value @ dev attached */ 297 clock_t pmport_dev_attach_time; 298 299 struct sata_port_stats pmport_stats; /* Port statistics */ 300 301 boolean_t pmport_tgtnode_clean; /* Target node usable */ 302 }; 303 304 typedef struct sata_pmport_info sata_pmport_info_t; 305 306 /* 307 * Port SSTATUS register (sata_port_scr sport_sstatus field). 308 * Link bits are valid only in port active state. 309 */ 310 #define SATA_PORT_DEVLINK_UP 0x00000103 /* Link with dev established */ 311 #define SATA_PORT_DEVLINK_UP_MASK 0x0000010F /* Mask for link bits */ 312 313 /* 314 * Port state clear mask (cport_state and pmport_state fields). 315 * SATA_PSTATE_SHUTDOWN and power state are preserved. 316 */ 317 #define SATA_PORT_STATE_CLEAR_MASK (~(SATA_PSTATE_SHUTDOWN)) 318 319 /* 320 * Valid i.e.supported device types mask (cport_dev_type, satadrv_type, 321 * pmult_dev_type fields). 322 * ATA disks and ATAPI CD/DVD now. 323 */ 324 #define SATA_VALID_DEV_TYPE (SATA_DTYPE_ATADISK | \ 325 SATA_DTYPE_ATAPICD) 326 327 /* 328 * Device feature_support (satadrv_features_support) 329 */ 330 #define SATA_DEV_F_DMA 0x01 331 #define SATA_DEV_F_LBA28 0x02 332 #define SATA_DEV_F_LBA48 0x04 333 #define SATA_DEV_F_NCQ 0x08 334 #define SATA_DEV_F_SATA1 0x10 335 #define SATA_DEV_F_SATA2 0x20 336 #define SATA_DEV_F_TCQ 0x40 /* Non NCQ tagged queuing */ 337 338 /* 339 * Device features enabled (satadrv_features_enabled) 340 */ 341 #define SATA_DEV_F_E_TAGGED_QING 0x01 /* Tagged queuing enabled */ 342 #define SATA_DEV_F_E_UNTAGGED_QING 0x02 /* Untagged queuing enabled */ 343 344 /* 345 * Drive settings flags (satdrv_settings) 346 */ 347 #define SATA_DEV_READ_AHEAD 0x0001 /* Read Ahead enabled */ 348 #define SATA_DEV_WRITE_CACHE 0x0002 /* Write cache ON */ 349 #define SATA_DEV_DMA 0x0004 /* DMA selected */ 350 #define SATA_DEV_SERIAL_FEATURES 0x8000 /* Serial ATA feat. enabled */ 351 #define SATA_DEV_ASYNCH_NOTIFY 0x2000 /* Asynch-event enabled */ 352 #define SATA_DEV_RMSN 0x0100 /* Rem Media Stat Notfc enbl */ 353 354 /* 355 * Internal event and flags. 356 * These flags are set in the *_event_flags fields of various structures. 357 * Events and lock flags defined below are used internally by the 358 * SATA framework (they are not reported by SATA HBA drivers). 359 */ 360 #define SATA_EVNT_MAIN 0x80000000 361 #define SATA_EVNT_SKIP 0x40000000 362 #define SATA_EVNT_INPROC_DEVICE_RESET 0x08000000 363 #define SATA_EVNT_CLEAR_DEVICE_RESET 0x04000000 364 #define SATA_EVNT_TARGET_NODE_CLEANUP 0x00000100 365 366 /* 367 * Lock flags - used to serialize configuration operations 368 * on ports and devices. 369 * SATA_EVNT_LOCK_PORT_BUSY is set by event daemon to prevent 370 * simultaneous cfgadm operations. 371 * SATA_APCTL_LOCK_PORT_BUSY is set by cfgadm ioctls to prevent 372 * simultaneous event processing. 373 */ 374 #define SATA_EVNT_LOCK_PORT_BUSY 0x00800000 375 #define SATA_APCTL_LOCK_PORT_BUSY 0x00400000 376 377 /* Mask for port events */ 378 #define SATA_EVNT_PORT_EVENTS (SATA_EVNT_DEVICE_ATTACHED | \ 379 SATA_EVNT_DEVICE_DETACHED | \ 380 SATA_EVNT_LINK_LOST | \ 381 SATA_EVNT_LINK_ESTABLISHED | \ 382 SATA_EVNT_PORT_FAILED | \ 383 SATA_EVNT_TARGET_NODE_CLEANUP) 384 /* Mask for drive events */ 385 #define SATA_EVNT_DRIVE_EVENTS (SATA_EVNT_DEVICE_RESET | \ 386 SATA_EVNT_INPROC_DEVICE_RESET) 387 #define SATA_EVNT_CONTROLLER_EVENTS SATA_EVNT_PWR_LEVEL_CHANGED 388 389 /* Delays and timeounts definitions */ 390 #define SATA_EVNT_DAEMON_SLEEP_TIME 50000 /* 50 ms */ 391 #define SATA_EVNT_DAEMON_TERM_TIMEOUT 100000 /* 100 ms */ 392 #define SATA_EVNT_DAEMON_TERM_WAIT 60000000 /* 60 s */ 393 #define SATA_EVNT_LINK_LOST_TIMEOUT 1000000 /* 1 s */ 394 #define SATA_DEV_IDENTIFY_TIMEOUT 60000000 /* 60 s */ 395 #define SATA_DEV_IDENTIFY_RETRY_DELAY 10000 /* 10 ms */ 396 397 /* DEVICE IDENTIFY and device initialization retry delay */ 398 #define SATA_DEV_IDENTIFY_RETRY 1 399 #define SATA_DEV_IDENTIFY_NORETRY 0 400 401 /* 402 * sata_scsi's hba_open_flag: field indicating open devctl instance. 403 * 0 = closed, 1 = shared open, 2 = exclusive open. 404 */ 405 #define SATA_DEVCTL_CLOSED 0 406 #define SATA_DEVCTL_SOPENED 1 407 #define SATA_DEVCTL_EXOPENED 2 408 409 /* 410 * sata_pkt_txlate structure contains info about resources allocated 411 * for the packet 412 * Address of this structure is stored in scsi_pkt.pkt_ha_private and 413 * in sata_pkt.sata_hba_private fields, so all three strucures are 414 * cross-linked, with sata_pkt_txlate as a centerpiece. 415 */ 416 417 typedef struct sata_pkt_txlate { 418 struct sata_hba_inst *txlt_sata_hba_inst; 419 struct scsi_pkt *txlt_scsi_pkt; 420 struct sata_pkt *txlt_sata_pkt; 421 ddi_dma_handle_t txlt_buf_dma_handle; 422 uint_t txlt_flags; /* data-in / data-out */ 423 uint_t txlt_num_dma_win; /* number of DMA windows */ 424 uint_t txlt_cur_dma_win; /* current DMA window */ 425 426 /* cookies in the current DMA window */ 427 uint_t txlt_curwin_num_dma_cookies; 428 429 /* processed dma cookies in current DMA win */ 430 uint_t txlt_curwin_processed_dma_cookies; 431 size_t txlt_total_residue; 432 ddi_dma_cookie_t txlt_dma_cookie; /* default dma cookie */ 433 int txlt_dma_cookie_list_len; /* alloc list len */ 434 ddi_dma_cookie_t *txlt_dma_cookie_list; /* dma cookie list */ 435 int txlt_num_dma_cookies; /* dma cookies in list */ 436 437 /* temporary buffer access handle */ 438 ddi_acc_handle_t txlt_tmp_buf_handle; 439 caddr_t txlt_tmp_buf; /* temp buffer address */ 440 } sata_pkt_txlate_t; 441 442 _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt_txlate)) 443 _NOTE(SCHEME_PROTECTS_DATA("unshared data", scsi_pkt)) 444 445 446 /* 447 * Additional scsi sense code definitions. 448 * These definition should eventually be moved to scsi header file 449 * usr/src/uts/common/sys/scsi/generic/sense.h 450 */ 451 #define SD_SCSI_ASC_NO_ADD_SENSE 0x00 452 #define SD_SCSI_ASC_LU_NOT_READY 0x04 453 #define SD_SCSI_ASC_WRITE_ERROR 0x0c 454 #define SD_SCSI_ASC_UNREC_READ_ERROR 0x11 455 #define SD_SCSI_ASC_INVALID_COMMAND_CODE 0x20 456 #define SD_SCSI_ASC_LBA_OUT_OF_RANGE 0x21 457 #define SD_SCSI_ASC_INVALID_FIELD_IN_CDB 0x24 458 #define SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST 0x26 459 #define SD_SCSI_ASC_RESET 0x29 460 #define SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED 0x39 461 462 463 /* SCSI defs missing from scsi headers */ 464 /* Missing from sys/scsi/generic/commands.h */ 465 #define SCMD_SYNCHRONIZE_CACHE_G1 0x91 466 /* 467 * Missing from sys/scsi/impl/mode.h, although defined 468 * in sys/scsi/targets/sddefs.h as MODEPAGE_ERR_RECOV 469 */ 470 #define MODEPAGE_RW_ERRRECOV 0x01 /* read/write recovery */ 471 472 /* 473 * Macros for accessing various structure fields 474 */ 475 476 #define SATA_TRAN(sata_hba_inst) \ 477 sata_hba_inst->satahba_tran 478 479 #define SATA_DIP(sata_hba_inst) \ 480 sata_hba_inst->satahba_dip 481 482 #define SATA_NUM_CPORTS(sata_hba_inst) \ 483 sata_hba_inst->satahba_tran->sata_tran_hba_num_cports 484 485 #define SATA_QDEPTH(sata_hba_inst) \ 486 sata_hba_inst->satahba_tran->sata_tran_hba_qdepth 487 488 #define SATA_FEATURES(sata_hba_inst) \ 489 sata_hba_inst->satahba_tran->sata_tran_hba_features_support 490 491 #define SATA_DMA_ATTR(sata_hba_inst) \ 492 sata_hba_inst->satahba_tran->sata_tran_hba_dma_attr 493 494 #define SATA_START_FUNC(sata_hba_inst) \ 495 sata_hba_inst->satahba_tran->sata_tran_start 496 497 #define SATA_ABORT_FUNC(sata_hba_inst) \ 498 sata_hba_inst->satahba_tran->sata_tran_abort 499 500 #define SATA_RESET_DPORT_FUNC(sata_hba_inst) \ 501 sata_hba_inst->satahba_tran->sata_tran_reset_dport 502 503 #define SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) \ 504 (sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \ 505 NULL : \ 506 sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\ 507 sata_tran_port_deactivate) 508 509 #define SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) \ 510 (sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \ 511 NULL : \ 512 sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\ 513 sata_tran_port_activate) 514 515 #define SATA_PROBE_PORT_FUNC(sata_hba_inst) \ 516 sata_hba_inst->satahba_tran->sata_tran_probe_port 517 518 #define SATA_SELFTEST_FUNC(sata_hba_inst) \ 519 sata_hba_inst->satahba_tran->sata_tran_selftest 520 521 #define SATA_CPORT_MUTEX(sata_hba_inst, cport) \ 522 sata_hba_inst->satahba_dev_port[cport]->cport_mutex 523 524 #define SATA_CPORT_INFO(sata_hba_inst, cport) \ 525 sata_hba_inst->satahba_dev_port[cport] 526 527 #define SATA_CPORT_STATE(sata_hba_inst, cport) \ 528 sata_hba_inst->satahba_dev_port[cport]->cport_state 529 530 #define SATA_CPORT_EVENT_FLAGS(sata_hba_inst, cport) \ 531 sata_hba_inst->satahba_dev_port[cport]->cport_event_flags 532 533 #define SATA_CPORT_SCR(sata_hba_inst, cport) \ 534 sata_hba_inst->satahba_dev_port[cport]->cport_scr 535 536 #define SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) \ 537 sata_hba_inst->satahba_dev_port[cport]->cport_dev_type 538 539 #define SATA_CPORT_DRV_INFO(sata_hba_inst, cport) \ 540 sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_drive 541 542 #define SATA_CPORTINFO_DRV_TYPE(cportinfo) \ 543 cportinfo->cport_dev_type 544 545 #define SATA_CPORTINFO_DRV_INFO(cportinfo) \ 546 cportinfo->cport_devp.cport_sata_drive 547 548 #define SATA_CPORTINFO_PMULT_INFO(cportinfo) \ 549 cportinfo->cport_devp.cport_sata_pmult 550 551 #define SATA_PMULT_INFO(sata_hba_inst, cport) \ 552 sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_pmult 553 554 #define SATA_NUM_PMPORTS(sata_hba_inst, cport) \ 555 sata_hba_inst->satahba_dev_port[cport]->\ 556 cport_devp.cport_sata_pmult->pmult_num_dev_ports 557 558 #define SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) \ 559 sata_hba_inst->satahba_dev_port[cport]->\ 560 cport_devp.cport_sata_pmult->pmult_dev_port[pmport] 561 562 #define SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport) \ 563 sata_hba_inst->satahba_dev_port[cport]->\ 564 cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\ 565 pmport_sata_drive 566 567 #define SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) \ 568 sata_hba_inst->satahba_dev_port[cport]->\ 569 cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_state 570 571 #define SATA_PMPORT_SCR(sata_hba_inst, cport, pmport) \ 572 sata_hba_inst->satahba_dev_port[cport]->\ 573 cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_scr 574 575 #define SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport) \ 576 sata_hba_inst->satahba_dev_port[cport]->\ 577 cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_dev_type 578 579 #define SATA_TXLT_HBA_INST(spx) \ 580 spx->txlt_sata_hba_inst 581 582 #define SATA_TXLT_CPORT(spx) \ 583 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport 584 585 #define SATA_TXLT_CPORT_MUTEX(spx) \ 586 spx->txlt_sata_hba_inst->\ 587 satahba_dev_port[spx->txlt_sata_pkt->\ 588 satapkt_device.satadev_addr.cport]->cport_mutex 589 590 #define SATA_TXLT_TASKQ(spx) \ 591 spx->txlt_sata_hba_inst->\ 592 satahba_taskq 593 594 /* 595 * Minor number construction for devctl and attachment point nodes. 596 * All necessary information has to be encoded in NBITSMINOR32 bits. 597 * 598 * Devctl node minor number: 599 * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_DEVCTL_NODE) 600 * 601 * Attachment point node minor number has to include controller 602 * instance (7 bits), controller port number (5 bits) and port multiplier 603 * device port number (4 bits) and port multiplier device port 604 * indicator (1 bit). Additionally, a single bit is used to 605 * differentiate between attachment point node and device control node. 606 * 607 * Attachment point minor number: 608 * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_AP_NODE | 609 * [(port_multiplier_device_port << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP] | 610 * (controller_port)) 611 * 612 * 17 bits are used (if 64 instances of controllers are expected) 613 * bit 18 is reserved for future use. 614 * 615 * -------------------------------------------------------- 616 * |17|16|15|14|13|12|11|10 |09|08|07|06|05|04|03|02|01|00| 617 * -------------------------------------------------------- 618 * | R| c| c| c| c| c| c|a/d|pm|pp|pp|pp|pp|cp|cp|cp|cp|cp| 619 * -------------------------------------------------------- 620 * Where: 621 * cp - device port number on the HBA SATA controller 622 * pp - device port number on the port multiplier 623 * pm - 0 - target attached to controller device port 624 * 1 - target attached to port multiplier's device port 625 * a/d - 0 - devctl node 626 * 1 - attachment point node 627 * c - controller number 628 * R - reserved bit 629 */ 630 631 #define SATA_AP_NODE 0x400 /* Attachment Point node */ 632 #define SATA_DEVCTL_NODE 0x000 /* DEVCTL node */ 633 #define SATA_PMULT_AP 0x200 /* device on PMult port */ 634 #define SATA_PMULT_PORT_SHIFT 5 635 #define SATA_CNTRL_INSTANCE_SHIFT 11 636 #define SATA_CPORT_MASK 0x1f /* 32 device ports */ 637 #define SATA_PMULT_PORT_MASK 0xf /* 15 device ports */ 638 #define SATA_CNTRL_INSTANCE_MASK 0x03F /* 64 controllers */ 639 640 /* Macro for creating devctl node minor number */ 641 #define SATA_MAKE_DEVCTL_MINOR(controller_instance) \ 642 ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | \ 643 SATA_DEVCTL_NODE) 644 645 /* Macro for creating an attachment point node minor number */ 646 #define SATA_MAKE_AP_MINOR(cntrl_instance, cport, pmport, qual) \ 647 (qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT) ? \ 648 (((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \ 649 SATA_AP_NODE | SATA_PMULT_AP | \ 650 (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \ 651 (((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \ 652 SATA_AP_NODE | cport)) 653 654 /* Macro retrieving controller number from a minor number */ 655 #define SATA_MINOR2INSTANCE(minor) \ 656 ((minor >> SATA_CNTRL_INSTANCE_SHIFT) & SATA_CNTRL_INSTANCE_MASK) 657 658 /* 659 * Macro for creating an attachment point number from sata address. 660 * Address qualifier has to be one of: 661 * SATA_ADDR_DCPORT, SATA_ADDR_DPMPORT, SATA_ADDR_CPORT or SATA_ADDR_PMPORT 662 */ 663 #define SATA_MAKE_AP_NUMBER(cport, pmport, qual) \ 664 ((qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) ? \ 665 (SATA_PMULT_AP | (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \ 666 (cport)) 667 668 /* 669 * SCSI target number format 670 * 671 * ------------------------------- 672 * | 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| Bit number 673 * ------------------------------- 674 * |pm|pp|pp|pp|pp|cp|cp|cp|cp|cp| 675 * ------------------------------- 676 * Where: 677 * cp - device port number on the HBA SATA controller 678 * pp - device port number on the port multiplier 679 * pm - 0 - target attached to controller device port 680 * 1 - target attached to port multiplier's device port 681 */ 682 683 /* SATA ports to SCSI target number translation */ 684 685 #define SATA_TO_SCSI_TARGET(cport, pmport, qual) \ 686 (qual == SATA_ADDR_DCPORT ? cport : \ 687 (cport | (pmport << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP)) 688 689 /* SCSI target number to SATA cntrl/pmport/cport translations */ 690 #define SCSI_TO_SATA_CPORT(scsi_target) \ 691 (scsi_target & SATA_CPORT_MASK) 692 693 #define SCSI_TO_SATA_PMPORT(scsi_target) \ 694 ((scsi_target >> SATA_PMULT_PORT_SHIFT) & SATA_PMULT_PORT_MASK) 695 696 #define SCSI_TO_SATA_ADDR_QUAL(scsi_target) \ 697 ((scsi_target & SATA_PMULT_AP) ? SATA_ADDR_DPMPORT : \ 698 SATA_ADDR_DCPORT) 699 700 701 /* Debug flags */ 702 #if DEBUG 703 704 #define SATA_DEBUG 705 #define SATA_DBG_SCSI_IF 1 706 #define SATA_DBG_HBA_IF 2 707 #define SATA_DBG_NODES 4 708 #define SATA_DBG_IOCTL_IF 8 709 #define SATA_DBG_EVENTS 0x10 710 #define SATA_DBG_EVENTS_PROC 0x20 711 #define SATA_DBG_EVENTS_PROCPST 0x40 712 #define SATA_DBG_EVENTS_CNTRL 0x80 713 #define SATA_DBG_EVENTS_DAEMON 0x100 714 #define SATA_DBG_DMA_SETUP 0x400 715 #define SATA_DBG_DEV_SETTINGS 0x800 716 #define SATA_DBG_ATAPI 0x1000 717 #define SATA_DBG_ATAPI_PACKET 0x8000 718 719 typedef struct sata_atapi_cmd { 720 uint8_t acdb[SATA_ATAPI_MAX_CDB_LEN]; 721 uint8_t arqs[SATA_ATAPI_RQSENSE_LEN]; 722 uint_t sata_pkt_reason; 723 uint_t scsi_pkt_reason; 724 } sata_atapi_cmd_t; 725 726 /* Debug macros */ 727 #define SATADBG1(flag, sata, format, arg1) \ 728 if (sata_debug_flags & (flag)) { \ 729 sata_log(sata, CE_CONT, format, arg1); \ 730 } 731 732 #define SATADBG2(flag, sata, format, arg1, arg2) \ 733 if (sata_debug_flags & (flag)) { \ 734 sata_log(sata, CE_CONT, format, arg1, arg2); \ 735 } 736 737 #define SATADBG3(flag, sata, format, arg1, arg2, arg3) \ 738 if (sata_debug_flags & (flag)) { \ 739 sata_log(sata, CE_CONT, format, arg1, arg2, arg3); \ 740 } 741 #else 742 743 #define SATADBG1(flag, dip, frmt, arg1) 744 #define SATADBG2(flag, dip, frmt, arg1, arg2) 745 #define SATADBG3(flag, dip, frmt, arg1, arg2, arg3) 746 747 #endif 748 749 #ifdef __cplusplus 750 } 751 #endif 752 753 #endif /* _SATA_H */ 754