166f9d5cbSmlf /* 266f9d5cbSmlf * CDDL HEADER START 366f9d5cbSmlf * 466f9d5cbSmlf * The contents of this file are subject to the terms of the 566f9d5cbSmlf * Common Development and Distribution License (the "License"). 666f9d5cbSmlf * You may not use this file except in compliance with the License. 766f9d5cbSmlf * 866f9d5cbSmlf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 966f9d5cbSmlf * or http://www.opensolaris.org/os/licensing. 1066f9d5cbSmlf * See the License for the specific language governing permissions 1166f9d5cbSmlf * and limitations under the License. 1266f9d5cbSmlf * 1366f9d5cbSmlf * When distributing Covered Code, include this CDDL HEADER in each 1466f9d5cbSmlf * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1566f9d5cbSmlf * If applicable, add the following below this CDDL HEADER, with the 1666f9d5cbSmlf * fields enclosed by brackets "[]" replaced with your own identifying 1766f9d5cbSmlf * information: Portions Copyright [yyyy] [name of copyright owner] 1866f9d5cbSmlf * 1966f9d5cbSmlf * CDDL HEADER END 2066f9d5cbSmlf */ 2166f9d5cbSmlf 2266f9d5cbSmlf /* 230bc523e5SAlan Perry * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 2466f9d5cbSmlf * Use is subject to license terms. 2566f9d5cbSmlf */ 26257c04ecSMarcel Telka /* 27257c04ecSMarcel Telka * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 28257c04ecSMarcel Telka */ 2966f9d5cbSmlf 3066f9d5cbSmlf #ifndef _SATA_H 3166f9d5cbSmlf #define _SATA_H 3266f9d5cbSmlf 3366f9d5cbSmlf #ifdef __cplusplus 3466f9d5cbSmlf extern "C" { 3566f9d5cbSmlf #endif 3666f9d5cbSmlf 3766f9d5cbSmlf /* 3866f9d5cbSmlf * Generic SATA Host Adapter Implementation 3966f9d5cbSmlf */ 4066f9d5cbSmlf 4166f9d5cbSmlf #include <sys/types.h> 4266f9d5cbSmlf #include <sys/scsi/scsi.h> 4366f9d5cbSmlf #include <sys/scsi/impl/services.h> 4466f9d5cbSmlf #include <sys/sata/sata_defs.h> 4566f9d5cbSmlf #include <sys/sata/sata_hba.h> 4666f9d5cbSmlf 474372d277Spawelw /* Common flags specifying current state of a port or an attached drive. */ 484372d277Spawelw #define SATA_STATE_PROBING 0x000001 494372d277Spawelw #define SATA_STATE_PROBED 0x000002 504372d277Spawelw 5166f9d5cbSmlf /* Statistics counters */ 5266f9d5cbSmlf struct sata_port_stats { 5366f9d5cbSmlf uint64_t link_lost; /* event counter */ 5466f9d5cbSmlf uint64_t link_established; /* event counter */ 5566f9d5cbSmlf uint64_t device_attached; /* event counter */ 5666f9d5cbSmlf uint64_t device_detached; /* event counter */ 5766f9d5cbSmlf uint64_t port_reset; /* event counter */ 5866f9d5cbSmlf uint64_t port_pwr_changed; /* event counter */ 5966f9d5cbSmlf }; 6066f9d5cbSmlf 6166f9d5cbSmlf typedef struct sata_port_stats sata_port_stats_t; 6266f9d5cbSmlf 6366f9d5cbSmlf struct sata_drive_stats { 6466f9d5cbSmlf uint64_t media_error; /* available ??? */ 6566f9d5cbSmlf uint64_t drive_reset; /* event counter */ 6666f9d5cbSmlf } sata_drv_stats_t; 6766f9d5cbSmlf 6866f9d5cbSmlf typedef struct sata_drive_stats sata_drive_stats_t; 6966f9d5cbSmlf 7066f9d5cbSmlf struct sata_ctrl_stats { 7166f9d5cbSmlf uint64_t ctrl_reset; /* event counter */ 7266f9d5cbSmlf uint64_t ctrl_pwr_change; /* event counter */ 7366f9d5cbSmlf }; 7466f9d5cbSmlf 7566f9d5cbSmlf typedef struct sata_ctrl_stats sata_ctrl_stats_t; 7666f9d5cbSmlf 7766f9d5cbSmlf 7866f9d5cbSmlf /* 7966f9d5cbSmlf * SATA HBA instance info structure 8066f9d5cbSmlf */ 8166f9d5cbSmlf struct sata_hba_inst { 8266f9d5cbSmlf dev_info_t *satahba_dip; /* this HBA instance devinfo */ 8366f9d5cbSmlf struct sata_hba_inst *satahba_next; /* ptr to next sata_hba_inst */ 8466f9d5cbSmlf struct sata_hba_inst *satahba_prev; /* ptr to prev sata_hba_inst */ 8566f9d5cbSmlf struct scsi_hba_tran *satahba_scsi_tran; /* scsi_hba_tran */ 8666f9d5cbSmlf struct sata_hba_tran *satahba_tran; /* sata_hba_tran */ 8766f9d5cbSmlf kmutex_t satahba_mutex; /* sata hba cntrl mutex */ 887a1efdfeSpawelw struct taskq *satahba_taskq; /* cmd completion task queue */ 8966f9d5cbSmlf 9066f9d5cbSmlf /* 9166f9d5cbSmlf * HBA event flags: 9266f9d5cbSmlf * SATA_EVNT_MAIN 9366f9d5cbSmlf * SATA_EVNT_PWR_LEVEL_CHANGED 9466f9d5cbSmlf * SATA_EVNT_SKIP 9566f9d5cbSmlf */ 9666f9d5cbSmlf uint_t satahba_event_flags; 9766f9d5cbSmlf 9866f9d5cbSmlf struct sata_cport_info *satahba_dev_port[SATA_MAX_CPORTS]; 9966f9d5cbSmlf 10066f9d5cbSmlf /* 10166f9d5cbSmlf * DEVCTL open flag: 10266f9d5cbSmlf * SATA_DEVCTL_SOPENED 10366f9d5cbSmlf * SATA_DEVCTL_EXOPENED 10466f9d5cbSmlf */ 10566f9d5cbSmlf uint_t satahba_open_flag; /* shared open flag */ 10666f9d5cbSmlf struct sata_ctrl_stats satahba_stats; /* HBA cntrl statistics */ 10766f9d5cbSmlf 10866f9d5cbSmlf uint_t satahba_attached; /* HBA attaching: */ 10966f9d5cbSmlf /* 0 - not completed */ 11066f9d5cbSmlf /* 1 - completed */ 11166f9d5cbSmlf }; 11266f9d5cbSmlf 11366f9d5cbSmlf typedef struct sata_hba_inst sata_hba_inst_t; 11466f9d5cbSmlf 11566f9d5cbSmlf /* 11666f9d5cbSmlf * SATA controller's device port info and state. 11766f9d5cbSmlf * This structure is pointed to by the sata_hba_inst.satahba_dev_port[x] 11866f9d5cbSmlf * where x is a device port number. 11966f9d5cbSmlf * cport_state holds port state flags, defined in sata_hba.h file. 12066f9d5cbSmlf * cport_event_flags holds SATA_EVNT_* flags defined in this file and in 12166f9d5cbSmlf * sata_hba.h file. 12266f9d5cbSmlf * cport_dev_type holds SATA_DTYPE_* types defined in sata_hba.h file. 12366f9d5cbSmlf */ 12466f9d5cbSmlf struct sata_cport_info { 12566f9d5cbSmlf sata_address_t cport_addr; /* this port SATA address */ 12666f9d5cbSmlf kmutex_t cport_mutex; /* port mutex */ 12766f9d5cbSmlf 12866f9d5cbSmlf /* 12966f9d5cbSmlf * Port state flags 13066f9d5cbSmlf * SATA_STATE_UNKNOWN 13166f9d5cbSmlf * SATA_STATE_PROBING 13266f9d5cbSmlf * SATA_STATE_PROBED 13366f9d5cbSmlf * SATA_STATE_READY 13466f9d5cbSmlf * SATA_PSTATE_PWRON 13566f9d5cbSmlf * SATA_PSTATE_PWROFF 13666f9d5cbSmlf * SATA_PSTATE_SHUTDOWN 13766f9d5cbSmlf * SATA_PSTATE_FAILED 13866f9d5cbSmlf */ 13966f9d5cbSmlf uint32_t cport_state; 14066f9d5cbSmlf 14166f9d5cbSmlf /* 14266f9d5cbSmlf * Port event flags: 14366f9d5cbSmlf * SATA_EVNT_DEVICE_ATTACHED 14466f9d5cbSmlf * SATA_EVNT_DEVICE_DETACHED 14566f9d5cbSmlf * SATA_EVNT_LINK_LOST 14666f9d5cbSmlf * SATA_EVNT_LINK_ESTABLISHED 14766f9d5cbSmlf * SATA_EVNT_PORT_FAILED 14866f9d5cbSmlf * SATA_EVNT_PWR_LEVEL_CHANGED 14966f9d5cbSmlf */ 15066f9d5cbSmlf uint32_t cport_event_flags; 15166f9d5cbSmlf 15266f9d5cbSmlf struct sata_port_scr cport_scr; /* Port status and ctrl regs */ 15366f9d5cbSmlf 15466f9d5cbSmlf /* 15566f9d5cbSmlf * Attached device type: 15666f9d5cbSmlf * SATA_DTYPE_NONE 15766f9d5cbSmlf * SATA_DTYPE_ATADISK 15866f9d5cbSmlf * SATA_DTYPE_ATAPICD 15938547057Sying tian - Beijing China * SATA_DTYPE_ATAPITAPE 160f8a673adSying tian - Beijing China * SATA_DTYPE_ATAPIDISK 16166f9d5cbSmlf * SATA_DTYPE_PMULT 16266f9d5cbSmlf * SATA_DTYPE_UNKNOWN 163257c04ecSMarcel Telka * SATA_DTYPE_ATAPIPROC 16466f9d5cbSmlf */ 16566f9d5cbSmlf uint32_t cport_dev_type; 16666f9d5cbSmlf union { 16766f9d5cbSmlf struct sata_drive_info *cport_sata_drive; /* Attached drive info */ 16866f9d5cbSmlf struct sata_pmult_info *cport_sata_pmult; /* Attached Port Mult */ 16966f9d5cbSmlf } cport_devp; 17066f9d5cbSmlf /* lbolt value at link lost */ 17166f9d5cbSmlf clock_t cport_link_lost_time; 1726ed1276fSpawelw /* lbolt value @ dev attached */ 1736ed1276fSpawelw clock_t cport_dev_attach_time; 17466f9d5cbSmlf 17566f9d5cbSmlf struct sata_port_stats cport_stats; /* Port statistics */ 1764360436bSpawelw 1774360436bSpawelw boolean_t cport_tgtnode_clean; /* Target node usable */ 17866f9d5cbSmlf }; 17966f9d5cbSmlf 18066f9d5cbSmlf typedef struct sata_cport_info sata_cport_info_t; 18166f9d5cbSmlf 18266f9d5cbSmlf /* 18366f9d5cbSmlf * Attached SATA drive info and state. 18466f9d5cbSmlf * This structure is pointed to by sata_cport_info's cport_sata_drive field 18566f9d5cbSmlf * when a drive is attached directly to a controller device port. 18666f9d5cbSmlf */ 18766f9d5cbSmlf struct sata_drive_info { 18866f9d5cbSmlf sata_address_t satadrv_addr; /* this drive SATA address */ 18966f9d5cbSmlf 19066f9d5cbSmlf /* 19166f9d5cbSmlf * Drive state flags 19266f9d5cbSmlf * SATA_STATE_UNKNOWN 19366f9d5cbSmlf * SATA_STATE_PROBING 19466f9d5cbSmlf * SATA_STATE_PROBED 19566f9d5cbSmlf * SATA_STATE_READY 19666f9d5cbSmlf * SATA_DSTATE_PWR_ACTIVE 19766f9d5cbSmlf * SATA_DSTATE_PWR_IDLE 19866f9d5cbSmlf * SATA_DSTATE_RESET 19966f9d5cbSmlf * SATA_DSTATE_FAILED 20066f9d5cbSmlf */ 20166f9d5cbSmlf uint32_t satadrv_state; 20266f9d5cbSmlf 20366f9d5cbSmlf /* 20466f9d5cbSmlf * drive event flags: 20566f9d5cbSmlf * SATA_EVNT_DRIVE_RESET 20666f9d5cbSmlf */ 20766f9d5cbSmlf uint32_t satadrv_event_flags; 2084372d277Spawelw /* 2094372d277Spawelw * lbolt value @ start of 2104372d277Spawelw * device reset processing 2114372d277Spawelw */ 2124372d277Spawelw clock_t satadrv_reset_time; 21366f9d5cbSmlf /* 21466f9d5cbSmlf * Attached device type: 21566f9d5cbSmlf * SATA_DTYPE_ATADISK 21666f9d5cbSmlf * SATA_DTYPE_ATAPICD 21738547057Sying tian - Beijing China * SATA_DTYPE_ATAPITAPE 218f8a673adSying tian - Beijing China * SATA_DTYPE_ATAPIDISK 219257c04ecSMarcel Telka * SATA_DTYPE_ATAPIPROC 22066f9d5cbSmlf */ 22166f9d5cbSmlf uint32_t satadrv_type; 22266f9d5cbSmlf 22366f9d5cbSmlf uint32_t satadrv_status_reg; /* drive status reg */ 22466f9d5cbSmlf uint32_t satadrv_error_reg; /* drive error reg */ 22566f9d5cbSmlf uint16_t satadrv_features_support; /* drive features support */ 22666f9d5cbSmlf uint16_t satadrv_queue_depth; /* drive queue depth */ 2272038334aSUnknown uint16_t satadrv_atapi_cdb_len; /* atapi supported cdb length */ 2282038334aSUnknown uint16_t satadrv_atapi_trans_ver; /* atapi transport version */ 22966f9d5cbSmlf uint16_t satadrv_settings; /* drive settings flags */ 2304e540238Sls24207 uint16_t satadrv_features_enabled; /* drive features enabled */ 23166f9d5cbSmlf uint64_t satadrv_capacity; /* drive capacity */ 2322038334aSUnknown uint64_t satadrv_max_queue_depth; /* maximum queue depth */ 23366f9d5cbSmlf sata_id_t satadrv_id; /* Device Identify Data */ 23466f9d5cbSmlf struct sata_drive_stats satadrv_stats; /* drive statistics */ 2352ee4dfc7SJane Chu 2362ee4dfc7SJane Chu /* 2372ee4dfc7SJane Chu * saved standby timer 2382ee4dfc7SJane Chu * [0] - [3] = high - low 2392ee4dfc7SJane Chu */ 2402ee4dfc7SJane Chu uint8_t satadrv_standby_timer[4]; 2412ee4dfc7SJane Chu uint8_t satadrv_power_level; /* saved power level */ 24266f9d5cbSmlf }; 24366f9d5cbSmlf 24466f9d5cbSmlf typedef struct sata_drive_info sata_drive_info_t; 24566f9d5cbSmlf 24666f9d5cbSmlf _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_drive_info)) 24766f9d5cbSmlf 24866f9d5cbSmlf 24966f9d5cbSmlf /* Port Multiplier & host port info and state */ 25066f9d5cbSmlf struct sata_pmult_info { 25166f9d5cbSmlf sata_address_t pmult_addr; /* this PMult SATA Address */ 25266f9d5cbSmlf /* 25366f9d5cbSmlf * PMult state flags 25466f9d5cbSmlf * SATA_STATE_UNKNOWN 25566f9d5cbSmlf * SATA_STATE_PROBING 25666f9d5cbSmlf * SATA_STATE_PROBED 25766f9d5cbSmlf * SATA_STATE_READY 25866f9d5cbSmlf * SATA_PSTATE_FAILED 25966f9d5cbSmlf */ 26066f9d5cbSmlf uint32_t pmult_state; 26166f9d5cbSmlf uint32_t pmult_event_flags; /* Undefined for now */ 2628aa6aadbSXiao-Yu Zhang struct sata_pmult_gscr pmult_gscr; /* PMult GSCR block */ 26366f9d5cbSmlf uint32_t pmult_num_dev_ports; /* Number of data ports */ 26466f9d5cbSmlf struct sata_pmport_info *pmult_dev_port[SATA_MAX_PMPORTS - 1]; 26566f9d5cbSmlf }; 26666f9d5cbSmlf 26766f9d5cbSmlf typedef struct sata_pmult_info sata_pmult_info_t; 26866f9d5cbSmlf 2698aa6aadbSXiao-Yu Zhang _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pmult_info)) 2708aa6aadbSXiao-Yu Zhang _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \ 2718aa6aadbSXiao-Yu Zhang sata_pmult_info::pmult_dev_port)) 2728aa6aadbSXiao-Yu Zhang 27366f9d5cbSmlf /* Port Multiplier's device port info & state */ 27466f9d5cbSmlf struct sata_pmport_info { 27566f9d5cbSmlf sata_address_t pmport_addr; /* this SATA port address */ 27666f9d5cbSmlf kmutex_t pmport_mutex; /* pmult device port mutex */ 27766f9d5cbSmlf 27866f9d5cbSmlf /* 27966f9d5cbSmlf * Port state flags 28066f9d5cbSmlf * SATA_STATE_UNKNOWN 28166f9d5cbSmlf * SATA_STATE_PROBING 28266f9d5cbSmlf * SATA_STATE_PROBED 28366f9d5cbSmlf * SATA_STATE_READY 28466f9d5cbSmlf * SATA_PSTATE_PWRON 28566f9d5cbSmlf * SATA_PSTATE_PWROFF 28666f9d5cbSmlf * SATA_PSTATE_SHUTDOWN 28766f9d5cbSmlf * SATA_PSTATE_FAILED 28866f9d5cbSmlf */ 28966f9d5cbSmlf uint32_t pmport_state; 29066f9d5cbSmlf 29166f9d5cbSmlf /* 29266f9d5cbSmlf * Port event flags: 29366f9d5cbSmlf * SATA_EVNT_DEVICE_ATTACHED 29466f9d5cbSmlf * SATA_EVNT_DEVICE_DETACHED 29566f9d5cbSmlf * SATA_EVNT_LINK_LOST 29666f9d5cbSmlf * SATA_EVNT_LINK_ESTABLISHED 29766f9d5cbSmlf * SATA_EVNT_PORT_FAILED 29866f9d5cbSmlf * SATA_EVNT_PWR_LEVEL_CHANGED 29966f9d5cbSmlf */ 30066f9d5cbSmlf uint32_t pmport_event_flags; 30166f9d5cbSmlf 30266f9d5cbSmlf struct sata_port_scr pmport_scr; /* PMult device port scr */ 30366f9d5cbSmlf 30466f9d5cbSmlf /* 30566f9d5cbSmlf * Attached device type: 30666f9d5cbSmlf * SATA_DTYPE_NONE 30766f9d5cbSmlf * SATA_DTYPE_ATADISK 30866f9d5cbSmlf * SATA_DTYPE_ATAPICD 30938547057Sying tian - Beijing China * SATA_DTYPE_ATAPITAPE 310f8a673adSying tian - Beijing China * SATA_DTYPE_ATAPIDISK 31166f9d5cbSmlf * SATA_DTYPE_UNKNOWN 312257c04ecSMarcel Telka * SATA_DTYPE_ATAPIPROC 31366f9d5cbSmlf */ 31466f9d5cbSmlf uint32_t pmport_dev_type; 31566f9d5cbSmlf 31666f9d5cbSmlf struct sata_drive_info *pmport_sata_drive; /* Attached drive info */ 31766f9d5cbSmlf 31866f9d5cbSmlf /* lbolt value at link lost */ 31966f9d5cbSmlf clock_t pmport_link_lost_time; 3206ed1276fSpawelw /* lbolt value @ dev attached */ 3216ed1276fSpawelw clock_t pmport_dev_attach_time; 32266f9d5cbSmlf 32366f9d5cbSmlf struct sata_port_stats pmport_stats; /* Port statistics */ 3244360436bSpawelw 3254360436bSpawelw boolean_t pmport_tgtnode_clean; /* Target node usable */ 32666f9d5cbSmlf }; 32766f9d5cbSmlf 32866f9d5cbSmlf typedef struct sata_pmport_info sata_pmport_info_t; 32966f9d5cbSmlf 33066f9d5cbSmlf /* 3312ee4dfc7SJane Chu * sata drive's power level 3322ee4dfc7SJane Chu * default value is active 3332ee4dfc7SJane Chu */ 3342ee4dfc7SJane Chu #define SATA_POWER_ACTIVE 0x00 3352ee4dfc7SJane Chu #define SATA_POWER_IDLE 0x01 3362ee4dfc7SJane Chu #define SATA_POWER_STANDBY 0x02 3372ee4dfc7SJane Chu #define SATA_POWER_STOPPED 0x03 3382ee4dfc7SJane Chu 3392ee4dfc7SJane Chu /* 3402ee4dfc7SJane Chu * pm-capable value definition according to PSARC 2009/310 3412ee4dfc7SJane Chu */ 3422ee4dfc7SJane Chu #define SATA_CAP_POWER_CONDITON PM_CAPABLE_SPC4 3432ee4dfc7SJane Chu #define SATA_CAP_SMART_PAGE PM_CAPABLE_SMART_LOG 3442ee4dfc7SJane Chu #define SATA_CAP_LOG_SENSE PM_CAPABLE_LOG_SUPPORTED 3452ee4dfc7SJane Chu 3462ee4dfc7SJane Chu /* 34766f9d5cbSmlf * Port SSTATUS register (sata_port_scr sport_sstatus field). 34866f9d5cbSmlf * Link bits are valid only in port active state. 34966f9d5cbSmlf */ 35066f9d5cbSmlf #define SATA_PORT_DEVLINK_UP 0x00000103 /* Link with dev established */ 35166f9d5cbSmlf #define SATA_PORT_DEVLINK_UP_MASK 0x0000010F /* Mask for link bits */ 35266f9d5cbSmlf 35366f9d5cbSmlf /* 35466f9d5cbSmlf * Port state clear mask (cport_state and pmport_state fields). 35566f9d5cbSmlf * SATA_PSTATE_SHUTDOWN and power state are preserved. 35666f9d5cbSmlf */ 35766f9d5cbSmlf #define SATA_PORT_STATE_CLEAR_MASK (~(SATA_PSTATE_SHUTDOWN)) 35866f9d5cbSmlf 35966f9d5cbSmlf /* 36066f9d5cbSmlf * Valid i.e.supported device types mask (cport_dev_type, satadrv_type, 36166f9d5cbSmlf * pmult_dev_type fields). 3622038334aSUnknown * ATA disks and ATAPI CD/DVD now. 36366f9d5cbSmlf */ 3642038334aSUnknown #define SATA_VALID_DEV_TYPE (SATA_DTYPE_ATADISK | \ 36538547057Sying tian - Beijing China SATA_DTYPE_ATAPICD | \ 366f8a673adSying tian - Beijing China SATA_DTYPE_ATAPITAPE | \ 367f8a673adSying tian - Beijing China SATA_DTYPE_ATAPIDISK) 36866f9d5cbSmlf 36966f9d5cbSmlf /* 37066f9d5cbSmlf * Device feature_support (satadrv_features_support) 37166f9d5cbSmlf */ 37266f9d5cbSmlf #define SATA_DEV_F_DMA 0x01 37366f9d5cbSmlf #define SATA_DEV_F_LBA28 0x02 37466f9d5cbSmlf #define SATA_DEV_F_LBA48 0x04 37566f9d5cbSmlf #define SATA_DEV_F_NCQ 0x08 37666f9d5cbSmlf #define SATA_DEV_F_SATA1 0x10 37766f9d5cbSmlf #define SATA_DEV_F_SATA2 0x20 378489f952bSls24207 #define SATA_DEV_F_TCQ 0x40 /* Non NCQ tagged queuing */ 37913c8743eSMarcel Telka #define SATA_DEV_F_SATA3 0x80 38066f9d5cbSmlf 38166f9d5cbSmlf /* 3824e540238Sls24207 * Device features enabled (satadrv_features_enabled) 3834e540238Sls24207 */ 3844e540238Sls24207 #define SATA_DEV_F_E_TAGGED_QING 0x01 /* Tagged queuing enabled */ 3854e540238Sls24207 #define SATA_DEV_F_E_UNTAGGED_QING 0x02 /* Untagged queuing enabled */ 3864e540238Sls24207 3874e540238Sls24207 /* 38866f9d5cbSmlf * Drive settings flags (satdrv_settings) 38966f9d5cbSmlf */ 39066f9d5cbSmlf #define SATA_DEV_READ_AHEAD 0x0001 /* Read Ahead enabled */ 39166f9d5cbSmlf #define SATA_DEV_WRITE_CACHE 0x0002 /* Write cache ON */ 3922038334aSUnknown #define SATA_DEV_DMA 0x0004 /* DMA selected */ 39366f9d5cbSmlf #define SATA_DEV_SERIAL_FEATURES 0x8000 /* Serial ATA feat. enabled */ 39466f9d5cbSmlf #define SATA_DEV_ASYNCH_NOTIFY 0x2000 /* Asynch-event enabled */ 3952038334aSUnknown #define SATA_DEV_RMSN 0x0100 /* Rem Media Stat Notfc enbl */ 39666f9d5cbSmlf 39766f9d5cbSmlf /* 39866f9d5cbSmlf * Internal event and flags. 39966f9d5cbSmlf * These flags are set in the *_event_flags fields of various structures. 40066f9d5cbSmlf * Events and lock flags defined below are used internally by the 40166f9d5cbSmlf * SATA framework (they are not reported by SATA HBA drivers). 40266f9d5cbSmlf */ 40366f9d5cbSmlf #define SATA_EVNT_MAIN 0x80000000 40466f9d5cbSmlf #define SATA_EVNT_SKIP 0x40000000 40566f9d5cbSmlf #define SATA_EVNT_INPROC_DEVICE_RESET 0x08000000 40666f9d5cbSmlf #define SATA_EVNT_CLEAR_DEVICE_RESET 0x04000000 4074360436bSpawelw #define SATA_EVNT_TARGET_NODE_CLEANUP 0x00000100 408c75976d1Spawelw #define SATA_EVNT_AUTOONLINE_DEVICE 0x00000200 40966f9d5cbSmlf 41066f9d5cbSmlf /* 41166f9d5cbSmlf * Lock flags - used to serialize configuration operations 41266f9d5cbSmlf * on ports and devices. 41366f9d5cbSmlf * SATA_EVNT_LOCK_PORT_BUSY is set by event daemon to prevent 41466f9d5cbSmlf * simultaneous cfgadm operations. 41566f9d5cbSmlf * SATA_APCTL_LOCK_PORT_BUSY is set by cfgadm ioctls to prevent 41666f9d5cbSmlf * simultaneous event processing. 41766f9d5cbSmlf */ 41866f9d5cbSmlf #define SATA_EVNT_LOCK_PORT_BUSY 0x00800000 41966f9d5cbSmlf #define SATA_APCTL_LOCK_PORT_BUSY 0x00400000 42066f9d5cbSmlf 42166f9d5cbSmlf /* Mask for port events */ 42266f9d5cbSmlf #define SATA_EVNT_PORT_EVENTS (SATA_EVNT_DEVICE_ATTACHED | \ 42366f9d5cbSmlf SATA_EVNT_DEVICE_DETACHED | \ 42466f9d5cbSmlf SATA_EVNT_LINK_LOST | \ 42566f9d5cbSmlf SATA_EVNT_LINK_ESTABLISHED | \ 4268aa6aadbSXiao-Yu Zhang SATA_EVNT_PMULT_LINK_CHANGED | \ 4274360436bSpawelw SATA_EVNT_PORT_FAILED | \ 428c75976d1Spawelw SATA_EVNT_TARGET_NODE_CLEANUP | \ 429c75976d1Spawelw SATA_EVNT_AUTOONLINE_DEVICE) 43066f9d5cbSmlf /* Mask for drive events */ 4314360436bSpawelw #define SATA_EVNT_DRIVE_EVENTS (SATA_EVNT_DEVICE_RESET | \ 4324360436bSpawelw SATA_EVNT_INPROC_DEVICE_RESET) 43366f9d5cbSmlf #define SATA_EVNT_CONTROLLER_EVENTS SATA_EVNT_PWR_LEVEL_CHANGED 43466f9d5cbSmlf 435c75976d1Spawelw /* Delays and timeout duration definitions */ 43666f9d5cbSmlf #define SATA_EVNT_DAEMON_SLEEP_TIME 50000 /* 50 ms */ 43766f9d5cbSmlf #define SATA_EVNT_DAEMON_TERM_TIMEOUT 100000 /* 100 ms */ 43866f9d5cbSmlf #define SATA_EVNT_DAEMON_TERM_WAIT 60000000 /* 60 s */ 43966f9d5cbSmlf #define SATA_EVNT_LINK_LOST_TIMEOUT 1000000 /* 1 s */ 4404372d277Spawelw 4414372d277Spawelw #define SATA_DEV_IDENTIFY_TIMEOUT 60000000 /* 60 s, device enumeration */ 4424372d277Spawelw #define SATA_DEV_REPROBE_TIMEOUT 30000000 /* 30 s, dev resp after rst */ 4434372d277Spawelw #define SATA_DEV_RETRY_DLY 10000 /* 10 ms */ 44466f9d5cbSmlf 4456ed1276fSpawelw /* DEVICE IDENTIFY and device initialization retry delay */ 4466ed1276fSpawelw #define SATA_DEV_IDENTIFY_RETRY 1 4476ed1276fSpawelw #define SATA_DEV_IDENTIFY_NORETRY 0 44866f9d5cbSmlf 44966f9d5cbSmlf /* 45066f9d5cbSmlf * sata_scsi's hba_open_flag: field indicating open devctl instance. 45166f9d5cbSmlf * 0 = closed, 1 = shared open, 2 = exclusive open. 45266f9d5cbSmlf */ 45366f9d5cbSmlf #define SATA_DEVCTL_CLOSED 0 45466f9d5cbSmlf #define SATA_DEVCTL_SOPENED 1 45566f9d5cbSmlf #define SATA_DEVCTL_EXOPENED 2 45666f9d5cbSmlf 45766f9d5cbSmlf /* 45866f9d5cbSmlf * sata_pkt_txlate structure contains info about resources allocated 45966f9d5cbSmlf * for the packet 46066f9d5cbSmlf * Address of this structure is stored in scsi_pkt.pkt_ha_private and 46166f9d5cbSmlf * in sata_pkt.sata_hba_private fields, so all three strucures are 46266f9d5cbSmlf * cross-linked, with sata_pkt_txlate as a centerpiece. 46366f9d5cbSmlf */ 46466f9d5cbSmlf 46566f9d5cbSmlf typedef struct sata_pkt_txlate { 46666f9d5cbSmlf struct sata_hba_inst *txlt_sata_hba_inst; 46766f9d5cbSmlf struct scsi_pkt *txlt_scsi_pkt; 46866f9d5cbSmlf struct sata_pkt *txlt_sata_pkt; 46966f9d5cbSmlf ddi_dma_handle_t txlt_buf_dma_handle; 47066f9d5cbSmlf uint_t txlt_flags; /* data-in / data-out */ 47166f9d5cbSmlf uint_t txlt_num_dma_win; /* number of DMA windows */ 47266f9d5cbSmlf uint_t txlt_cur_dma_win; /* current DMA window */ 47366f9d5cbSmlf 47466f9d5cbSmlf /* cookies in the current DMA window */ 47566f9d5cbSmlf uint_t txlt_curwin_num_dma_cookies; 47666f9d5cbSmlf 4774360436bSpawelw /* processed dma cookies in current DMA win */ 47866f9d5cbSmlf uint_t txlt_curwin_processed_dma_cookies; 47966f9d5cbSmlf size_t txlt_total_residue; 4804360436bSpawelw ddi_dma_cookie_t txlt_dma_cookie; /* default dma cookie */ 48166f9d5cbSmlf int txlt_dma_cookie_list_len; /* alloc list len */ 48266f9d5cbSmlf ddi_dma_cookie_t *txlt_dma_cookie_list; /* dma cookie list */ 48366f9d5cbSmlf int txlt_num_dma_cookies; /* dma cookies in list */ 4847a70ede8Spawelw 4857a70ede8Spawelw /* temporary buffer access handle */ 4867a70ede8Spawelw ddi_acc_handle_t txlt_tmp_buf_handle; 4877a70ede8Spawelw caddr_t txlt_tmp_buf; /* temp buffer address */ 48866f9d5cbSmlf } sata_pkt_txlate_t; 48966f9d5cbSmlf 49066f9d5cbSmlf _NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt_txlate)) 49166f9d5cbSmlf _NOTE(SCHEME_PROTECTS_DATA("unshared data", scsi_pkt)) 49266f9d5cbSmlf 49363aa5377SAlan Perry /* Length of largest sense buffer used by sata */ 49463aa5377SAlan Perry #define SATA_MAX_SENSE_LEN MAX(sizeof (struct scsi_arq_status), \ 49563aa5377SAlan Perry sizeof (struct scsi_arq_status) - sizeof (struct scsi_extended_sense) + \ 49663aa5377SAlan Perry sizeof (struct scsi_descr_sense_hdr) + \ 49763aa5377SAlan Perry MAX(sizeof (struct scsi_cmd_specific_sense_descr), \ 49863aa5377SAlan Perry sizeof (struct scsi_ata_status_ret_sense_descr))) 49963aa5377SAlan Perry 50063aa5377SAlan Perry /* 50163aa5377SAlan Perry * Sense Data structure for ATA Pass Through 50263aa5377SAlan Perry * This is the entire sense data block passed back up to scsi. It is 50363aa5377SAlan Perry * effectively the scsi_arq_status structure for ATA Sense Return descriptor 50463aa5377SAlan Perry * format sense data. 50563aa5377SAlan Perry */ 50663aa5377SAlan Perry struct sata_apt_sense_data { 50763aa5377SAlan Perry struct scsi_status apt_status; 50863aa5377SAlan Perry struct scsi_status apt_rqpkt_status; 50963aa5377SAlan Perry uchar_t apt_rqpkt_reason; 51063aa5377SAlan Perry uchar_t apt_rqpkt_resid; 51163aa5377SAlan Perry uint_t apt_rqpkt_state; 51263aa5377SAlan Perry uint_t apt_rqpkt_statistics; 51363aa5377SAlan Perry struct scsi_descr_sense_hdr apt_sd_hdr; 51463aa5377SAlan Perry struct scsi_ata_status_ret_sense_descr apt_sd_sense; 51563aa5377SAlan Perry }; 51663aa5377SAlan Perry 51766f9d5cbSmlf 51866f9d5cbSmlf /* 51966f9d5cbSmlf * Additional scsi sense code definitions. 5202038334aSUnknown * These definition should eventually be moved to scsi header file 5212038334aSUnknown * usr/src/uts/common/sys/scsi/generic/sense.h 52266f9d5cbSmlf */ 5232038334aSUnknown #define SD_SCSI_ASC_NO_ADD_SENSE 0x00 524*2acf01fdSYuri Pankov #define SD_SCSI_ASC_APT_INFO_AVAIL 0x00 5252038334aSUnknown #define SD_SCSI_ASC_LU_NOT_READY 0x04 52663aa5377SAlan Perry #define SD_SCSI_ASC_LU_NOT_RESPONSE 0x05 527c75976d1Spawelw #define SD_SCSI_ASC_WRITE_ERR 0x0c 528c75976d1Spawelw #define SD_SCSI_ASC_UNREC_READ_ERR 0x11 5292038334aSUnknown #define SD_SCSI_ASC_INVALID_COMMAND_CODE 0x20 5302038334aSUnknown #define SD_SCSI_ASC_LBA_OUT_OF_RANGE 0x21 5312038334aSUnknown #define SD_SCSI_ASC_INVALID_FIELD_IN_CDB 0x24 5322038334aSUnknown #define SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST 0x26 53363aa5377SAlan Perry #define SD_SCSI_ASC_WRITE_PROTECTED 0x27 53463aa5377SAlan Perry #define SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED 0x28 5352038334aSUnknown #define SD_SCSI_ASC_RESET 0x29 5362ee4dfc7SJane Chu #define SD_SCSI_ASC_CMD_SEQUENCE_ERR 0x2c 53763aa5377SAlan Perry #define SD_SCSI_ASC_MEDIUM_NOT_PRESENT 0x3a 53863aa5377SAlan Perry #define SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED 0x39 53963aa5377SAlan Perry #define SD_SCSI_ASC_INTERNAL_TARGET_FAILURE 0x44 54063aa5377SAlan Perry #define SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR 0x47 54163aa5377SAlan Perry #define SD_SCSI_ASC_OP_MEDIUM_REM_REQ 0x5a 5422ee4dfc7SJane Chu #define SD_SCSI_ASC_LOW_POWER_CONDITION_ON 0x5e 54366f9d5cbSmlf 54466f9d5cbSmlf 54566f9d5cbSmlf /* SCSI defs missing from scsi headers */ 54666f9d5cbSmlf /* Missing from sys/scsi/generic/commands.h */ 54766f9d5cbSmlf #define SCMD_SYNCHRONIZE_CACHE_G1 0x91 54866f9d5cbSmlf /* 54966f9d5cbSmlf * Missing from sys/scsi/impl/mode.h, although defined 55066f9d5cbSmlf * in sys/scsi/targets/sddefs.h as MODEPAGE_ERR_RECOV 55166f9d5cbSmlf */ 55266f9d5cbSmlf #define MODEPAGE_RW_ERRRECOV 0x01 /* read/write recovery */ 5530bc523e5SAlan Perry /* Missing from sys/scsi/impl/commands.h */ 5540bc523e5SAlan Perry #define SCSI_READ_CAPACITY16_MAX_LBA 0xfffffffffffffffe 55566f9d5cbSmlf 55666f9d5cbSmlf /* 5572ee4dfc7SJane Chu * medium access command 5582ee4dfc7SJane Chu */ 5592ee4dfc7SJane Chu #define SATA_IS_MEDIUM_ACCESS_CMD(cmd) \ 5602ee4dfc7SJane Chu (((cmd) == SCMD_READ) || ((cmd) == SCMD_WRITE) || \ 5612ee4dfc7SJane Chu ((cmd) == SCMD_READ_G1) || ((cmd) == SCMD_WRITE_G1) || \ 5622ee4dfc7SJane Chu ((cmd) == SCMD_READ_G4) || ((cmd) == SCMD_WRITE_G4) || \ 5632ee4dfc7SJane Chu ((cmd) == SCMD_READ_G5) || ((cmd) == SCMD_WRITE_G5) || \ 5642ee4dfc7SJane Chu ((cmd) == SCMD_VERIFY) || ((cmd) == SCMD_VERIFY_G4) || \ 5652ee4dfc7SJane Chu ((cmd) == SCMD_VERIFY_G5) || ((cmd) == 0x7f) /* VERIFY(32) */|| \ 5662ee4dfc7SJane Chu ((cmd) == SCMD_SYNCHRONIZE_CACHE) || ((cmd) == SCMD_SPACE_G4) || \ 5672ee4dfc7SJane Chu ((cmd) == SCMD_READ_POSITION) || \ 5682ee4dfc7SJane Chu ((cmd) == 0x90) /* PRE-FETCH(16) */ || \ 5692ee4dfc7SJane Chu ((cmd) == SCMD_READ_DEFECT_LIST) || \ 5702ee4dfc7SJane Chu ((cmd) == 0xb7) /* READ DEFECT DATA */ || \ 5712ee4dfc7SJane Chu ((cmd) == SCMD_READ_LONG) || ((cmd) == SCMD_SVC_ACTION_IN_G4) || \ 5722ee4dfc7SJane Chu ((cmd) == SCMD_WRITE_LONG) || ((cmd) == SCMD_SVC_ACTION_OUT_G4) || \ 5732ee4dfc7SJane Chu ((cmd) == 0x41) || ((cmd) == 0x93) || /* WRITE SAME */ \ 5742ee4dfc7SJane Chu ((cmd) == 0x52) || ((cmd) == 0x50) || /* XDREAD & XDWRITE */ \ 5752ee4dfc7SJane Chu ((cmd) == 0x53) || ((cmd) == 0x51) || /* XDWRITEREAD & XPWRITE */ \ 5762ee4dfc7SJane Chu ((cmd) == 0x7f)) 5772ee4dfc7SJane Chu 5782ee4dfc7SJane Chu /* 57966f9d5cbSmlf * Macros for accessing various structure fields 58066f9d5cbSmlf */ 58166f9d5cbSmlf 58266f9d5cbSmlf #define SATA_TRAN(sata_hba_inst) \ 58366f9d5cbSmlf sata_hba_inst->satahba_tran 58466f9d5cbSmlf 58566f9d5cbSmlf #define SATA_DIP(sata_hba_inst) \ 58666f9d5cbSmlf sata_hba_inst->satahba_dip 58766f9d5cbSmlf 58866f9d5cbSmlf #define SATA_NUM_CPORTS(sata_hba_inst) \ 58966f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_hba_num_cports 59066f9d5cbSmlf 59166f9d5cbSmlf #define SATA_QDEPTH(sata_hba_inst) \ 59266f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_hba_qdepth 59366f9d5cbSmlf 59466f9d5cbSmlf #define SATA_FEATURES(sata_hba_inst) \ 59566f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_hba_features_support 59666f9d5cbSmlf 59766f9d5cbSmlf #define SATA_DMA_ATTR(sata_hba_inst) \ 59866f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_hba_dma_attr 59966f9d5cbSmlf 60066f9d5cbSmlf #define SATA_START_FUNC(sata_hba_inst) \ 60166f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_start 60266f9d5cbSmlf 60366f9d5cbSmlf #define SATA_ABORT_FUNC(sata_hba_inst) \ 60466f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_abort 60566f9d5cbSmlf 60666f9d5cbSmlf #define SATA_RESET_DPORT_FUNC(sata_hba_inst) \ 60766f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_reset_dport 60866f9d5cbSmlf 60966f9d5cbSmlf #define SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) \ 61066f9d5cbSmlf (sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \ 61166f9d5cbSmlf NULL : \ 61266f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\ 61366f9d5cbSmlf sata_tran_port_deactivate) 61466f9d5cbSmlf 61566f9d5cbSmlf #define SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) \ 61666f9d5cbSmlf (sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \ 61766f9d5cbSmlf NULL : \ 61866f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\ 61966f9d5cbSmlf sata_tran_port_activate) 62066f9d5cbSmlf 62166f9d5cbSmlf #define SATA_PROBE_PORT_FUNC(sata_hba_inst) \ 62266f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_probe_port 62366f9d5cbSmlf 62466f9d5cbSmlf #define SATA_SELFTEST_FUNC(sata_hba_inst) \ 62566f9d5cbSmlf sata_hba_inst->satahba_tran->sata_tran_selftest 62666f9d5cbSmlf 62766f9d5cbSmlf #define SATA_CPORT_MUTEX(sata_hba_inst, cport) \ 62866f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->cport_mutex 62966f9d5cbSmlf 63066f9d5cbSmlf #define SATA_CPORT_INFO(sata_hba_inst, cport) \ 63166f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport] 63266f9d5cbSmlf 63366f9d5cbSmlf #define SATA_CPORT_STATE(sata_hba_inst, cport) \ 63466f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->cport_state 63566f9d5cbSmlf 6364360436bSpawelw #define SATA_CPORT_EVENT_FLAGS(sata_hba_inst, cport) \ 6374360436bSpawelw sata_hba_inst->satahba_dev_port[cport]->cport_event_flags 6384360436bSpawelw 63966f9d5cbSmlf #define SATA_CPORT_SCR(sata_hba_inst, cport) \ 64066f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->cport_scr 64166f9d5cbSmlf 64266f9d5cbSmlf #define SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) \ 64366f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->cport_dev_type 64466f9d5cbSmlf 64566f9d5cbSmlf #define SATA_CPORT_DRV_INFO(sata_hba_inst, cport) \ 64666f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_drive 64766f9d5cbSmlf 64866f9d5cbSmlf #define SATA_CPORTINFO_DRV_TYPE(cportinfo) \ 64966f9d5cbSmlf cportinfo->cport_dev_type 65066f9d5cbSmlf 65166f9d5cbSmlf #define SATA_CPORTINFO_DRV_INFO(cportinfo) \ 65266f9d5cbSmlf cportinfo->cport_devp.cport_sata_drive 65366f9d5cbSmlf 65466f9d5cbSmlf #define SATA_CPORTINFO_PMULT_INFO(cportinfo) \ 65566f9d5cbSmlf cportinfo->cport_devp.cport_sata_pmult 65666f9d5cbSmlf 65766f9d5cbSmlf #define SATA_PMULT_INFO(sata_hba_inst, cport) \ 65866f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_pmult 65966f9d5cbSmlf 66066f9d5cbSmlf #define SATA_NUM_PMPORTS(sata_hba_inst, cport) \ 66166f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->\ 66266f9d5cbSmlf cport_devp.cport_sata_pmult->pmult_num_dev_ports 66366f9d5cbSmlf 6648aa6aadbSXiao-Yu Zhang #define SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport) \ 6658aa6aadbSXiao-Yu Zhang sata_hba_inst->satahba_dev_port[cport]->\ 6668aa6aadbSXiao-Yu Zhang cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_mutex 6678aa6aadbSXiao-Yu Zhang 66866f9d5cbSmlf #define SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) \ 66966f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->\ 67066f9d5cbSmlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport] 67166f9d5cbSmlf 67266f9d5cbSmlf #define SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport) \ 67366f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->\ 67466f9d5cbSmlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\ 67566f9d5cbSmlf pmport_sata_drive 67666f9d5cbSmlf 67766f9d5cbSmlf #define SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) \ 67866f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->\ 67966f9d5cbSmlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_state 68066f9d5cbSmlf 68166f9d5cbSmlf #define SATA_PMPORT_SCR(sata_hba_inst, cport, pmport) \ 68266f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->\ 68366f9d5cbSmlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_scr 68466f9d5cbSmlf 68566f9d5cbSmlf #define SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport) \ 68666f9d5cbSmlf sata_hba_inst->satahba_dev_port[cport]->\ 68766f9d5cbSmlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_dev_type 68866f9d5cbSmlf 6898aa6aadbSXiao-Yu Zhang #define SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, cport, pmport) \ 6908aa6aadbSXiao-Yu Zhang sata_hba_inst->satahba_dev_port[cport]->\ 6918aa6aadbSXiao-Yu Zhang cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\ 6928aa6aadbSXiao-Yu Zhang pmport_event_flags 6938aa6aadbSXiao-Yu Zhang 694c75976d1Spawelw #define SATA_PMPORTINFO_DRV_TYPE(pmportinfo) \ 695c75976d1Spawelw pmportinfo->pmport_dev_type 696c75976d1Spawelw 697c75976d1Spawelw #define SATA_PMPORTINFO_DRV_INFO(pmportinfo) \ 698c75976d1Spawelw pmportinfo->pmport_sata_drive 699c75976d1Spawelw 70066f9d5cbSmlf #define SATA_TXLT_HBA_INST(spx) \ 70166f9d5cbSmlf spx->txlt_sata_hba_inst 70266f9d5cbSmlf 70366f9d5cbSmlf #define SATA_TXLT_CPORT(spx) \ 70466f9d5cbSmlf spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport 70566f9d5cbSmlf 7068aa6aadbSXiao-Yu Zhang #define SATA_TXLT_PMPORT(spx) \ 7078aa6aadbSXiao-Yu Zhang spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport 7088aa6aadbSXiao-Yu Zhang 7098aa6aadbSXiao-Yu Zhang #define SATA_TXLT_QUAL(spx) \ 7108aa6aadbSXiao-Yu Zhang spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual 7118aa6aadbSXiao-Yu Zhang 71266f9d5cbSmlf #define SATA_TXLT_CPORT_MUTEX(spx) \ 71366f9d5cbSmlf spx->txlt_sata_hba_inst->\ 71466f9d5cbSmlf satahba_dev_port[spx->txlt_sata_pkt->\ 71566f9d5cbSmlf satapkt_device.satadev_addr.cport]->cport_mutex 71666f9d5cbSmlf 7177a1efdfeSpawelw #define SATA_TXLT_TASKQ(spx) \ 7187a1efdfeSpawelw spx->txlt_sata_hba_inst->\ 7197a1efdfeSpawelw satahba_taskq 7207a1efdfeSpawelw 72166f9d5cbSmlf /* 72266f9d5cbSmlf * Minor number construction for devctl and attachment point nodes. 72366f9d5cbSmlf * All necessary information has to be encoded in NBITSMINOR32 bits. 72466f9d5cbSmlf * 72566f9d5cbSmlf * Devctl node minor number: 72666f9d5cbSmlf * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_DEVCTL_NODE) 72766f9d5cbSmlf * 72866f9d5cbSmlf * Attachment point node minor number has to include controller 72966f9d5cbSmlf * instance (7 bits), controller port number (5 bits) and port multiplier 73066f9d5cbSmlf * device port number (4 bits) and port multiplier device port 73166f9d5cbSmlf * indicator (1 bit). Additionally, a single bit is used to 73266f9d5cbSmlf * differentiate between attachment point node and device control node. 73366f9d5cbSmlf * 73466f9d5cbSmlf * Attachment point minor number: 73566f9d5cbSmlf * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_AP_NODE | 73666f9d5cbSmlf * [(port_multiplier_device_port << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP] | 73766f9d5cbSmlf * (controller_port)) 73866f9d5cbSmlf * 73966f9d5cbSmlf * 17 bits are used (if 64 instances of controllers are expected) 74066f9d5cbSmlf * bit 18 is reserved for future use. 74166f9d5cbSmlf * 74266f9d5cbSmlf * -------------------------------------------------------- 74366f9d5cbSmlf * |17|16|15|14|13|12|11|10 |09|08|07|06|05|04|03|02|01|00| 74466f9d5cbSmlf * -------------------------------------------------------- 74566f9d5cbSmlf * | R| c| c| c| c| c| c|a/d|pm|pp|pp|pp|pp|cp|cp|cp|cp|cp| 74666f9d5cbSmlf * -------------------------------------------------------- 74766f9d5cbSmlf * Where: 74866f9d5cbSmlf * cp - device port number on the HBA SATA controller 74966f9d5cbSmlf * pp - device port number on the port multiplier 75066f9d5cbSmlf * pm - 0 - target attached to controller device port 75166f9d5cbSmlf * 1 - target attached to port multiplier's device port 75266f9d5cbSmlf * a/d - 0 - devctl node 75366f9d5cbSmlf * 1 - attachment point node 75466f9d5cbSmlf * c - controller number 75566f9d5cbSmlf * R - reserved bit 75666f9d5cbSmlf */ 75766f9d5cbSmlf 75866f9d5cbSmlf #define SATA_AP_NODE 0x400 /* Attachment Point node */ 75966f9d5cbSmlf #define SATA_DEVCTL_NODE 0x000 /* DEVCTL node */ 76066f9d5cbSmlf #define SATA_PMULT_AP 0x200 /* device on PMult port */ 76166f9d5cbSmlf #define SATA_PMULT_PORT_SHIFT 5 76266f9d5cbSmlf #define SATA_CNTRL_INSTANCE_SHIFT 11 76366f9d5cbSmlf #define SATA_CPORT_MASK 0x1f /* 32 device ports */ 76466f9d5cbSmlf #define SATA_PMULT_PORT_MASK 0xf /* 15 device ports */ 76566f9d5cbSmlf #define SATA_CNTRL_INSTANCE_MASK 0x03F /* 64 controllers */ 76666f9d5cbSmlf 76766f9d5cbSmlf /* Macro for creating devctl node minor number */ 76866f9d5cbSmlf #define SATA_MAKE_DEVCTL_MINOR(controller_instance) \ 76966f9d5cbSmlf ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | \ 77066f9d5cbSmlf SATA_DEVCTL_NODE) 77166f9d5cbSmlf 77266f9d5cbSmlf /* Macro for creating an attachment point node minor number */ 77366f9d5cbSmlf #define SATA_MAKE_AP_MINOR(cntrl_instance, cport, pmport, qual) \ 77466f9d5cbSmlf (qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT) ? \ 77566f9d5cbSmlf (((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \ 77666f9d5cbSmlf SATA_AP_NODE | SATA_PMULT_AP | \ 77766f9d5cbSmlf (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \ 77866f9d5cbSmlf (((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \ 77966f9d5cbSmlf SATA_AP_NODE | cport)) 78066f9d5cbSmlf 78166f9d5cbSmlf /* Macro retrieving controller number from a minor number */ 78266f9d5cbSmlf #define SATA_MINOR2INSTANCE(minor) \ 78366f9d5cbSmlf ((minor >> SATA_CNTRL_INSTANCE_SHIFT) & SATA_CNTRL_INSTANCE_MASK) 78466f9d5cbSmlf 785f76ee27aSpawelw /* 786f76ee27aSpawelw * Macro for creating an attachment point number from sata address. 787f76ee27aSpawelw * Address qualifier has to be one of: 788f76ee27aSpawelw * SATA_ADDR_DCPORT, SATA_ADDR_DPMPORT, SATA_ADDR_CPORT or SATA_ADDR_PMPORT 789f76ee27aSpawelw */ 790f76ee27aSpawelw #define SATA_MAKE_AP_NUMBER(cport, pmport, qual) \ 791f76ee27aSpawelw ((qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) ? \ 792f76ee27aSpawelw (SATA_PMULT_AP | (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \ 793f76ee27aSpawelw (cport)) 79466f9d5cbSmlf 79566f9d5cbSmlf /* 79666f9d5cbSmlf * SCSI target number format 79766f9d5cbSmlf * 79866f9d5cbSmlf * ------------------------------- 79966f9d5cbSmlf * | 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| Bit number 80066f9d5cbSmlf * ------------------------------- 80166f9d5cbSmlf * |pm|pp|pp|pp|pp|cp|cp|cp|cp|cp| 80266f9d5cbSmlf * ------------------------------- 80366f9d5cbSmlf * Where: 80466f9d5cbSmlf * cp - device port number on the HBA SATA controller 80566f9d5cbSmlf * pp - device port number on the port multiplier 80666f9d5cbSmlf * pm - 0 - target attached to controller device port 80766f9d5cbSmlf * 1 - target attached to port multiplier's device port 80866f9d5cbSmlf */ 80966f9d5cbSmlf 81066f9d5cbSmlf /* SATA ports to SCSI target number translation */ 81166f9d5cbSmlf 81266f9d5cbSmlf #define SATA_TO_SCSI_TARGET(cport, pmport, qual) \ 81366f9d5cbSmlf (qual == SATA_ADDR_DCPORT ? cport : \ 81466f9d5cbSmlf (cport | (pmport << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP)) 81566f9d5cbSmlf 81666f9d5cbSmlf /* SCSI target number to SATA cntrl/pmport/cport translations */ 81766f9d5cbSmlf #define SCSI_TO_SATA_CPORT(scsi_target) \ 81866f9d5cbSmlf (scsi_target & SATA_CPORT_MASK) 81966f9d5cbSmlf 82066f9d5cbSmlf #define SCSI_TO_SATA_PMPORT(scsi_target) \ 82166f9d5cbSmlf ((scsi_target >> SATA_PMULT_PORT_SHIFT) & SATA_PMULT_PORT_MASK) 82266f9d5cbSmlf 82366f9d5cbSmlf #define SCSI_TO_SATA_ADDR_QUAL(scsi_target) \ 82466f9d5cbSmlf ((scsi_target & SATA_PMULT_AP) ? SATA_ADDR_DPMPORT : \ 82566f9d5cbSmlf SATA_ADDR_DCPORT) 82666f9d5cbSmlf 82766f9d5cbSmlf 82866f9d5cbSmlf /* Debug flags */ 82966f9d5cbSmlf #if DEBUG 83066f9d5cbSmlf 83166f9d5cbSmlf #define SATA_DEBUG 83266f9d5cbSmlf #define SATA_DBG_SCSI_IF 1 83366f9d5cbSmlf #define SATA_DBG_HBA_IF 2 83466f9d5cbSmlf #define SATA_DBG_NODES 4 83566f9d5cbSmlf #define SATA_DBG_IOCTL_IF 8 83666f9d5cbSmlf #define SATA_DBG_EVENTS 0x10 83766f9d5cbSmlf #define SATA_DBG_EVENTS_PROC 0x20 83866f9d5cbSmlf #define SATA_DBG_EVENTS_PROCPST 0x40 83966f9d5cbSmlf #define SATA_DBG_EVENTS_CNTRL 0x80 84066f9d5cbSmlf #define SATA_DBG_EVENTS_DAEMON 0x100 84166f9d5cbSmlf #define SATA_DBG_DMA_SETUP 0x400 842b7343288Spawelw #define SATA_DBG_DEV_SETTINGS 0x800 8432038334aSUnknown #define SATA_DBG_ATAPI 0x1000 8442038334aSUnknown #define SATA_DBG_ATAPI_PACKET 0x8000 8453852f673SPawel Wojcik #define SATA_DBG_INTR_CTX 0x10000 8468aa6aadbSXiao-Yu Zhang #define SATA_DBG_PMULT 0x20000 8472038334aSUnknown 8482038334aSUnknown typedef struct sata_atapi_cmd { 8492038334aSUnknown uint8_t acdb[SATA_ATAPI_MAX_CDB_LEN]; 8502038334aSUnknown uint8_t arqs[SATA_ATAPI_RQSENSE_LEN]; 8512038334aSUnknown uint_t sata_pkt_reason; 8522038334aSUnknown uint_t scsi_pkt_reason; 8532038334aSUnknown } sata_atapi_cmd_t; 85466f9d5cbSmlf 85566f9d5cbSmlf /* Debug macros */ 85666f9d5cbSmlf #define SATADBG1(flag, sata, format, arg1) \ 85766f9d5cbSmlf if (sata_debug_flags & (flag)) { \ 85866f9d5cbSmlf sata_log(sata, CE_CONT, format, arg1); \ 85966f9d5cbSmlf } 86066f9d5cbSmlf 86166f9d5cbSmlf #define SATADBG2(flag, sata, format, arg1, arg2) \ 86266f9d5cbSmlf if (sata_debug_flags & (flag)) { \ 86366f9d5cbSmlf sata_log(sata, CE_CONT, format, arg1, arg2); \ 86466f9d5cbSmlf } 86566f9d5cbSmlf 86666f9d5cbSmlf #define SATADBG3(flag, sata, format, arg1, arg2, arg3) \ 86766f9d5cbSmlf if (sata_debug_flags & (flag)) { \ 86866f9d5cbSmlf sata_log(sata, CE_CONT, format, arg1, arg2, arg3); \ 86966f9d5cbSmlf } 87066f9d5cbSmlf #else 87166f9d5cbSmlf 87266f9d5cbSmlf #define SATADBG1(flag, dip, frmt, arg1) 87366f9d5cbSmlf #define SATADBG2(flag, dip, frmt, arg1, arg2) 87466f9d5cbSmlf #define SATADBG3(flag, dip, frmt, arg1, arg2, arg3) 87566f9d5cbSmlf 87666f9d5cbSmlf #endif 87766f9d5cbSmlf 878918304a3SXiao-Yu Zhang /* sata_rev_tag 1.46 */ 8793852f673SPawel Wojcik 88066f9d5cbSmlf #ifdef __cplusplus 88166f9d5cbSmlf } 88266f9d5cbSmlf #endif 88366f9d5cbSmlf 88466f9d5cbSmlf #endif /* _SATA_H */ 885