110696SDavid.Hollister@Sun.COM /* 210696SDavid.Hollister@Sun.COM * CDDL HEADER START 310696SDavid.Hollister@Sun.COM * 410696SDavid.Hollister@Sun.COM * The contents of this file are subject to the terms of the 510696SDavid.Hollister@Sun.COM * Common Development and Distribution License (the "License"). 610696SDavid.Hollister@Sun.COM * You may not use this file except in compliance with the License. 710696SDavid.Hollister@Sun.COM * 810696SDavid.Hollister@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 910696SDavid.Hollister@Sun.COM * or http://www.opensolaris.org/os/licensing. 1010696SDavid.Hollister@Sun.COM * See the License for the specific language governing permissions 1110696SDavid.Hollister@Sun.COM * and limitations under the License. 1210696SDavid.Hollister@Sun.COM * 1310696SDavid.Hollister@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 1410696SDavid.Hollister@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1510696SDavid.Hollister@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 1610696SDavid.Hollister@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 1710696SDavid.Hollister@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 1810696SDavid.Hollister@Sun.COM * 1910696SDavid.Hollister@Sun.COM * CDDL HEADER END 2012120SDavid.Hollister@Sun.COM */ 2112120SDavid.Hollister@Sun.COM /* 2212120SDavid.Hollister@Sun.COM * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 2310696SDavid.Hollister@Sun.COM */ 2410696SDavid.Hollister@Sun.COM /* 2510696SDavid.Hollister@Sun.COM * This file provides prototype function definitions. 2610696SDavid.Hollister@Sun.COM */ 2710696SDavid.Hollister@Sun.COM #ifndef _PMCS_PROTO_H 2810696SDavid.Hollister@Sun.COM #define _PMCS_PROTO_H 2910696SDavid.Hollister@Sun.COM #ifdef __cplusplus 3010696SDavid.Hollister@Sun.COM extern "C" { 3110696SDavid.Hollister@Sun.COM #endif 3210696SDavid.Hollister@Sun.COM 3310696SDavid.Hollister@Sun.COM 3410696SDavid.Hollister@Sun.COM typedef enum { 3510696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG = 0, 3610696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG1, 3710696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG2, 3810696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG3, 3910696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG_CONFIG, 4010696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG_IPORT, 4110696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG_MAP, 4210696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG_UNDERFLOW, 4310696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG_SCSI_STATUS, 4410696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG_PHY_LOCKING, 4510696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG_DEV_STATE, 4610696SDavid.Hollister@Sun.COM PMCS_PRT_DEBUG_DEVEL, 4710696SDavid.Hollister@Sun.COM PMCS_PRT_INFO, 4810696SDavid.Hollister@Sun.COM PMCS_PRT_WARN, 4910696SDavid.Hollister@Sun.COM PMCS_PRT_ERR 5010696SDavid.Hollister@Sun.COM } pmcs_prt_level_t; 5110696SDavid.Hollister@Sun.COM 5211048SDavid.Hollister@Sun.COM #define pmcs_prt(pwp, level, phy, tgt, fmt...) { \ 5311048SDavid.Hollister@Sun.COM int lvl = level; \ 5411048SDavid.Hollister@Sun.COM if (((pwp->debug_mask & (1 << lvl)) != 0) || \ 5511048SDavid.Hollister@Sun.COM (lvl > PMCS_PRT_DEBUG_DEVEL)) { \ 5612120SDavid.Hollister@Sun.COM pmcs_prt_impl(pwp, lvl, phy, tgt, fmt); \ 5711048SDavid.Hollister@Sun.COM } \ 5810696SDavid.Hollister@Sun.COM } 5910696SDavid.Hollister@Sun.COM 6011048SDavid.Hollister@Sun.COM /*PRINTFLIKE5*/ 6110696SDavid.Hollister@Sun.COM void 6211048SDavid.Hollister@Sun.COM pmcs_prt_impl(pmcs_hw_t *, pmcs_prt_level_t, pmcs_phy_t *, pmcs_xscsi_t *, 6311048SDavid.Hollister@Sun.COM const char *, ...) __KPRINTFLIKE(5); 6410696SDavid.Hollister@Sun.COM 6510696SDavid.Hollister@Sun.COM boolean_t pmcs_assign_device(pmcs_hw_t *, pmcs_xscsi_t *); 6610696SDavid.Hollister@Sun.COM void pmcs_remove_device(pmcs_hw_t *, pmcs_phy_t *); 6710696SDavid.Hollister@Sun.COM void pmcs_handle_dead_phys(pmcs_hw_t *); 6810696SDavid.Hollister@Sun.COM 6910696SDavid.Hollister@Sun.COM int pmcs_acquire_scratch(pmcs_hw_t *, boolean_t); 7010696SDavid.Hollister@Sun.COM void pmcs_release_scratch(pmcs_hw_t *); 7110696SDavid.Hollister@Sun.COM 7210696SDavid.Hollister@Sun.COM /* get a work structure */ 7310696SDavid.Hollister@Sun.COM pmcwork_t *pmcs_gwork(pmcs_hw_t *, uint32_t, pmcs_phy_t *); 7410696SDavid.Hollister@Sun.COM 7510696SDavid.Hollister@Sun.COM /* put a work structure */ 7610696SDavid.Hollister@Sun.COM void pmcs_pwork(pmcs_hw_t *, struct pmcwork *); 7710696SDavid.Hollister@Sun.COM 7810696SDavid.Hollister@Sun.COM /* given a tag, find a work structure */ 7912258Ssrikanth.suravajhala@oracle.com pmcwork_t *pmcs_tag2wp(pmcs_hw_t *, uint32_t, boolean_t); 8010696SDavid.Hollister@Sun.COM 8110696SDavid.Hollister@Sun.COM /* 8210696SDavid.Hollister@Sun.COM * Abort function 8310696SDavid.Hollister@Sun.COM */ 8410696SDavid.Hollister@Sun.COM int pmcs_abort(pmcs_hw_t *, pmcs_phy_t *, uint32_t, int, int); 8510696SDavid.Hollister@Sun.COM 8610696SDavid.Hollister@Sun.COM /* 8710696SDavid.Hollister@Sun.COM * SSP Task Management Function 8810696SDavid.Hollister@Sun.COM */ 8910696SDavid.Hollister@Sun.COM int pmcs_ssp_tmf(pmcs_hw_t *, pmcs_phy_t *, uint8_t, uint32_t, uint64_t, 9010696SDavid.Hollister@Sun.COM uint32_t *); 9110696SDavid.Hollister@Sun.COM 9210696SDavid.Hollister@Sun.COM /* 9310696SDavid.Hollister@Sun.COM * Abort NCQ function 9410696SDavid.Hollister@Sun.COM */ 9510696SDavid.Hollister@Sun.COM int pmcs_sata_abort_ncq(pmcs_hw_t *, pmcs_phy_t *); 9610696SDavid.Hollister@Sun.COM 9710696SDavid.Hollister@Sun.COM /* 9810696SDavid.Hollister@Sun.COM * Interrupt Functions 9910696SDavid.Hollister@Sun.COM */ 10010696SDavid.Hollister@Sun.COM void pmcs_general_intr(pmcs_hw_t *); 10110696SDavid.Hollister@Sun.COM void pmcs_iodone_intr(pmcs_hw_t *); 10210696SDavid.Hollister@Sun.COM void pmcs_event_intr(pmcs_hw_t *); 10310696SDavid.Hollister@Sun.COM void pmcs_timed_out(pmcs_hw_t *, uint32_t, const char *); 10410696SDavid.Hollister@Sun.COM 10510696SDavid.Hollister@Sun.COM /* 10610696SDavid.Hollister@Sun.COM * Abort handler 10710696SDavid.Hollister@Sun.COM */ 10810696SDavid.Hollister@Sun.COM int pmcs_abort_handler(pmcs_hw_t *); 10910696SDavid.Hollister@Sun.COM 11010696SDavid.Hollister@Sun.COM /* 11110696SDavid.Hollister@Sun.COM * Deregister all expander connected devices 11210696SDavid.Hollister@Sun.COM */ 11310696SDavid.Hollister@Sun.COM void pmcs_deregister_devices(pmcs_hw_t *, pmcs_phy_t *); 11410696SDavid.Hollister@Sun.COM int pmcs_register_device(pmcs_hw_t *, pmcs_phy_t *); 11510696SDavid.Hollister@Sun.COM void pmcs_deregister_device(pmcs_hw_t *, pmcs_phy_t *); 11610696SDavid.Hollister@Sun.COM 11710696SDavid.Hollister@Sun.COM /* 11810696SDavid.Hollister@Sun.COM * endian transform a data structure 11910696SDavid.Hollister@Sun.COM */ 12010696SDavid.Hollister@Sun.COM void pmcs_endian_transform(pmcs_hw_t *, void *, void *, const uint8_t *); 12110696SDavid.Hollister@Sun.COM 12210696SDavid.Hollister@Sun.COM /* get the connection rate string */ 12310696SDavid.Hollister@Sun.COM const char *pmcs_get_rate(unsigned int); 12410696SDavid.Hollister@Sun.COM 12510696SDavid.Hollister@Sun.COM /* get the device type string */ 12610696SDavid.Hollister@Sun.COM const char *pmcs_get_typename(pmcs_dtype_t pmcs_dtype); 12710696SDavid.Hollister@Sun.COM 12810696SDavid.Hollister@Sun.COM /* get the SAS Task Management function name */ 12910696SDavid.Hollister@Sun.COM const char *pmcs_tmf2str(int); 13010696SDavid.Hollister@Sun.COM 13110696SDavid.Hollister@Sun.COM /* get the PMC status string */ 13210696SDavid.Hollister@Sun.COM const char *pmcs_status_str(uint32_t); 13310696SDavid.Hollister@Sun.COM 13410696SDavid.Hollister@Sun.COM /* 13510696SDavid.Hollister@Sun.COM * WWN to Byte Array and vice versa conversion 13610696SDavid.Hollister@Sun.COM */ 13710696SDavid.Hollister@Sun.COM uint64_t pmcs_barray2wwn(uint8_t[8]); 13810696SDavid.Hollister@Sun.COM void pmcs_wwn2barray(uint64_t, uint8_t[8]); 13910696SDavid.Hollister@Sun.COM 14010696SDavid.Hollister@Sun.COM /* 14110696SDavid.Hollister@Sun.COM * Print f/w version 14210696SDavid.Hollister@Sun.COM */ 14310696SDavid.Hollister@Sun.COM void pmcs_report_fwversion(pmcs_hw_t *); 14410696SDavid.Hollister@Sun.COM 14510696SDavid.Hollister@Sun.COM /* 14610696SDavid.Hollister@Sun.COM * Build a device name. 14710696SDavid.Hollister@Sun.COM */ 14810696SDavid.Hollister@Sun.COM void pmcs_phy_name(pmcs_hw_t *, pmcs_phy_t *, char *, size_t); 14910696SDavid.Hollister@Sun.COM 15010696SDavid.Hollister@Sun.COM /* 15110696SDavid.Hollister@Sun.COM * Find a PHY by wwn 15210696SDavid.Hollister@Sun.COM */ 15310696SDavid.Hollister@Sun.COM pmcs_phy_t *pmcs_find_phy_by_wwn(pmcs_hw_t *, uint64_t); 15410696SDavid.Hollister@Sun.COM 15510696SDavid.Hollister@Sun.COM /* 15610696SDavid.Hollister@Sun.COM * Find a PHY by sas_address 15710696SDavid.Hollister@Sun.COM */ 15810696SDavid.Hollister@Sun.COM pmcs_phy_t *pmcs_find_phy_by_sas_address(pmcs_hw_t *, pmcs_iport_t *, 15910696SDavid.Hollister@Sun.COM pmcs_phy_t *, char *); 16010696SDavid.Hollister@Sun.COM 16110696SDavid.Hollister@Sun.COM /* 16210696SDavid.Hollister@Sun.COM * Print out a FIS 16310696SDavid.Hollister@Sun.COM */ 16410696SDavid.Hollister@Sun.COM void pmcs_fis_dump(pmcs_hw_t *, fis_t); 16510696SDavid.Hollister@Sun.COM 16610696SDavid.Hollister@Sun.COM /* 16710696SDavid.Hollister@Sun.COM * Print an IOMB 16810696SDavid.Hollister@Sun.COM */ 16910696SDavid.Hollister@Sun.COM void pmcs_print_entry(pmcs_hw_t *, int, char *, void *); 17010696SDavid.Hollister@Sun.COM 17110696SDavid.Hollister@Sun.COM void pmcs_spinup_release(pmcs_hw_t *, pmcs_phy_t *phyp); 17210696SDavid.Hollister@Sun.COM 17310696SDavid.Hollister@Sun.COM /* 17410696SDavid.Hollister@Sun.COM * Handler for events - can be called from interrupt level or from worker thread 17510696SDavid.Hollister@Sun.COM */ 17610696SDavid.Hollister@Sun.COM void pmcs_ack_events(pmcs_hw_t *); 17710696SDavid.Hollister@Sun.COM 17810696SDavid.Hollister@Sun.COM /* 17910696SDavid.Hollister@Sun.COM * This function does some initial setup and hardware validation 18010696SDavid.Hollister@Sun.COM */ 18110696SDavid.Hollister@Sun.COM int pmcs_setup(pmcs_hw_t *); 18210696SDavid.Hollister@Sun.COM 18310696SDavid.Hollister@Sun.COM /* 18410696SDavid.Hollister@Sun.COM * These functions start and stop the MPI (message passing interface) 18510696SDavid.Hollister@Sun.COM */ 18610696SDavid.Hollister@Sun.COM int pmcs_start_mpi(pmcs_hw_t *); 18710696SDavid.Hollister@Sun.COM int pmcs_stop_mpi(pmcs_hw_t *); 18810696SDavid.Hollister@Sun.COM 18910696SDavid.Hollister@Sun.COM /* 19010696SDavid.Hollister@Sun.COM * This function checks firmware revisions against required revisions 19110696SDavid.Hollister@Sun.COM * and attempts to flash new firmware (if possible). 19210696SDavid.Hollister@Sun.COM */ 19310696SDavid.Hollister@Sun.COM int pmcs_firmware_update(pmcs_hw_t *); 19410696SDavid.Hollister@Sun.COM 19510696SDavid.Hollister@Sun.COM /* 19610696SDavid.Hollister@Sun.COM * This function runs ECHO commands to test both interrupts and queues 19710696SDavid.Hollister@Sun.COM */ 19810696SDavid.Hollister@Sun.COM int pmcs_echo_test(pmcs_hw_t *); 19910696SDavid.Hollister@Sun.COM 20010696SDavid.Hollister@Sun.COM /* 20110696SDavid.Hollister@Sun.COM * These functions start, reset, and stop the physical chip PHYs 20210696SDavid.Hollister@Sun.COM */ 20310696SDavid.Hollister@Sun.COM int pmcs_start_phy(pmcs_hw_t *, int, int, int); 20410696SDavid.Hollister@Sun.COM int pmcs_start_phys(pmcs_hw_t *); 20510696SDavid.Hollister@Sun.COM void pmcs_stop_phy(pmcs_hw_t *, int); 20610696SDavid.Hollister@Sun.COM void pmcs_stop_phys(pmcs_hw_t *); 20710696SDavid.Hollister@Sun.COM 20810696SDavid.Hollister@Sun.COM /* 20910696SDavid.Hollister@Sun.COM * These functions setup/teardown iport tgtmap 21010696SDavid.Hollister@Sun.COM */ 21110696SDavid.Hollister@Sun.COM int pmcs_iport_tgtmap_create(pmcs_iport_t *); 21210696SDavid.Hollister@Sun.COM int pmcs_iport_tgtmap_destroy(pmcs_iport_t *); 21310696SDavid.Hollister@Sun.COM 21410696SDavid.Hollister@Sun.COM /* 21510696SDavid.Hollister@Sun.COM * Utility and wrapper functions for SAS_DIAG_EXECUTE 21610696SDavid.Hollister@Sun.COM */ 21710696SDavid.Hollister@Sun.COM int pmcs_sas_diag_execute(pmcs_hw_t *, uint32_t, uint32_t, uint8_t); 21810696SDavid.Hollister@Sun.COM int pmcs_get_diag_report(pmcs_hw_t *, uint32_t, uint8_t); 21910696SDavid.Hollister@Sun.COM int pmcs_clear_diag_counters(pmcs_hw_t *, uint8_t); 22010696SDavid.Hollister@Sun.COM 22110696SDavid.Hollister@Sun.COM /* 22210696SDavid.Hollister@Sun.COM * Register Dump (including "internal" registers) 22310696SDavid.Hollister@Sun.COM */ 22410696SDavid.Hollister@Sun.COM void pmcs_register_dump(pmcs_hw_t *); 22510696SDavid.Hollister@Sun.COM void pmcs_iqp_trace(pmcs_hw_t *, uint32_t); 22610696SDavid.Hollister@Sun.COM void pmcs_register_dump_int(pmcs_hw_t *); 22710696SDavid.Hollister@Sun.COM int pmcs_dump_binary(pmcs_hw_t *, uint32_t *, uint32_t, 22810696SDavid.Hollister@Sun.COM uint32_t, caddr_t, uint32_t); 22910696SDavid.Hollister@Sun.COM int pmcs_dump_feregs(pmcs_hw_t *, uint32_t *, uint8_t, 23010696SDavid.Hollister@Sun.COM caddr_t, uint32_t); 23110696SDavid.Hollister@Sun.COM 23210696SDavid.Hollister@Sun.COM /* 23310696SDavid.Hollister@Sun.COM * This function perform a soft reset. 23410696SDavid.Hollister@Sun.COM * Hard reset is platform specific. 23510696SDavid.Hollister@Sun.COM */ 23610696SDavid.Hollister@Sun.COM int pmcs_soft_reset(pmcs_hw_t *, boolean_t); 23710696SDavid.Hollister@Sun.COM 23810696SDavid.Hollister@Sun.COM /* 23911692SJesse.Butler@Sun.COM * This is a hot reset which will attempt reconfiguration after reset. 24011692SJesse.Butler@Sun.COM */ 24111692SJesse.Butler@Sun.COM int pmcs_hot_reset(pmcs_hw_t *); 24211692SJesse.Butler@Sun.COM 24311692SJesse.Butler@Sun.COM /* 24410696SDavid.Hollister@Sun.COM * Some more reset functions 24510696SDavid.Hollister@Sun.COM */ 24610696SDavid.Hollister@Sun.COM int pmcs_reset_dev(pmcs_hw_t *, pmcs_phy_t *, uint64_t); 24710696SDavid.Hollister@Sun.COM int pmcs_reset_phy(pmcs_hw_t *, pmcs_phy_t *, uint8_t); 24810696SDavid.Hollister@Sun.COM 24910696SDavid.Hollister@Sun.COM /* 25010696SDavid.Hollister@Sun.COM * These functions do topology configuration changes 25110696SDavid.Hollister@Sun.COM */ 25210696SDavid.Hollister@Sun.COM void pmcs_discover(pmcs_hw_t *); 25310696SDavid.Hollister@Sun.COM void pmcs_set_changed(pmcs_hw_t *, pmcs_phy_t *, boolean_t, int); 25410696SDavid.Hollister@Sun.COM void pmcs_kill_changed(pmcs_hw_t *, pmcs_phy_t *, int); 25510696SDavid.Hollister@Sun.COM void pmcs_clear_phy(pmcs_hw_t *, pmcs_phy_t *); 25610696SDavid.Hollister@Sun.COM int pmcs_kill_device(pmcs_hw_t *, pmcs_phy_t *); 25710696SDavid.Hollister@Sun.COM 25810696SDavid.Hollister@Sun.COM /* 25910696SDavid.Hollister@Sun.COM * Firmware flash function 26010696SDavid.Hollister@Sun.COM */ 26110696SDavid.Hollister@Sun.COM int pmcs_fw_flash(pmcs_hw_t *, pmcs_fw_hdr_t *, uint32_t); 26210696SDavid.Hollister@Sun.COM 26310696SDavid.Hollister@Sun.COM /* 26410696SDavid.Hollister@Sun.COM * Set a new value for the interrupt coalescing timer. If it's being set 26510696SDavid.Hollister@Sun.COM * to zero (disabling), then re-enable auto clear if necessary. If it's 26610696SDavid.Hollister@Sun.COM * being changed from zero, turn off auto clear if it was on. 26710696SDavid.Hollister@Sun.COM */ 26810696SDavid.Hollister@Sun.COM typedef enum { 26910696SDavid.Hollister@Sun.COM DECREASE_TIMER = 0, 27010696SDavid.Hollister@Sun.COM INCREASE_TIMER 27110696SDavid.Hollister@Sun.COM } pmcs_coal_timer_adj_t; 27210696SDavid.Hollister@Sun.COM 27310696SDavid.Hollister@Sun.COM void pmcs_check_intr_coal(void *arg); 27410696SDavid.Hollister@Sun.COM void pmcs_set_intr_coal_timer(pmcs_hw_t *pwp, pmcs_coal_timer_adj_t adj); 27510696SDavid.Hollister@Sun.COM 27610696SDavid.Hollister@Sun.COM /* 27710696SDavid.Hollister@Sun.COM * Misc supporting routines 27810696SDavid.Hollister@Sun.COM */ 27910696SDavid.Hollister@Sun.COM void pmcs_check_iomb_status(pmcs_hw_t *pwp, uint32_t *iomb); 28010696SDavid.Hollister@Sun.COM void pmcs_clear_xp(pmcs_hw_t *, pmcs_xscsi_t *); 28112077Ssrikanth.suravajhala@oracle.com void pmcs_create_one_phy_stats(pmcs_iport_t *, pmcs_phy_t *); 28210696SDavid.Hollister@Sun.COM int pmcs_run_sata_cmd(pmcs_hw_t *, pmcs_phy_t *, fis_t, uint32_t, 28310696SDavid.Hollister@Sun.COM uint32_t, uint32_t); 28410696SDavid.Hollister@Sun.COM int pmcs_sata_identify(pmcs_hw_t *, pmcs_phy_t *); 28510696SDavid.Hollister@Sun.COM void pmcs_sata_work(pmcs_hw_t *); 28610696SDavid.Hollister@Sun.COM boolean_t pmcs_dma_setup(pmcs_hw_t *pwp, ddi_dma_attr_t *dma_attr, 28710696SDavid.Hollister@Sun.COM ddi_acc_handle_t *acch, ddi_dma_handle_t *dmah, size_t length, 28811185SSean.McEnroe@Sun.COM caddr_t *kvap, uint64_t *dma_addr); 28910696SDavid.Hollister@Sun.COM void pmcs_fm_ereport(pmcs_hw_t *pwp, char *detail); 29010696SDavid.Hollister@Sun.COM int pmcs_check_dma_handle(ddi_dma_handle_t handle); 29110696SDavid.Hollister@Sun.COM int pmcs_check_acc_handle(ddi_acc_handle_t handle); 29210696SDavid.Hollister@Sun.COM int pmcs_check_acc_dma_handle(pmcs_hw_t *pwp); 29310696SDavid.Hollister@Sun.COM int pmcs_get_nvmd(pmcs_hw_t *pwp, pmcs_nvmd_type_t nvmd_type, uint8_t nvmd, 29410696SDavid.Hollister@Sun.COM uint32_t offset, char *buf, uint32_t size_left); 29510696SDavid.Hollister@Sun.COM boolean_t pmcs_set_nvmd(pmcs_hw_t *pwp, pmcs_nvmd_type_t nvmd_type, 29610696SDavid.Hollister@Sun.COM uint8_t *buf, size_t len); 29710696SDavid.Hollister@Sun.COM void pmcs_complete_work_impl(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb, 29810696SDavid.Hollister@Sun.COM size_t amt); 29910696SDavid.Hollister@Sun.COM void pmcs_flush_target_queues(pmcs_hw_t *, pmcs_xscsi_t *, uint8_t); 30010696SDavid.Hollister@Sun.COM boolean_t pmcs_iport_has_targets(pmcs_hw_t *, pmcs_iport_t *); 30110696SDavid.Hollister@Sun.COM void pmcs_free_dma_chunklist(pmcs_hw_t *); 30210696SDavid.Hollister@Sun.COM void pmcs_dev_state_recovery(pmcs_hw_t *, pmcs_phy_t *); 30311347SRamana.Srikanth@Sun.COM void pmcs_deregister_device_work(pmcs_hw_t *, pmcs_phy_t *); 30411090SDavid.Hollister@Sun.COM int pmcs_send_err_recovery_cmd(pmcs_hw_t *, uint8_t, pmcs_phy_t *, 30511090SDavid.Hollister@Sun.COM pmcs_xscsi_t *); 30610696SDavid.Hollister@Sun.COM void pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, 30710696SDavid.Hollister@Sun.COM uint32_t *iomb, size_t amt); 30810696SDavid.Hollister@Sun.COM void pmcs_ssp_event_recovery(pmcs_hw_t *); 30910696SDavid.Hollister@Sun.COM 31011601SDavid.Hollister@Sun.COM pmcs_iport_t *pmcs_get_iport_by_wwn(pmcs_hw_t *pwp, uint64_t wwn); 31111133SJesse.Butler@Sun.COM pmcs_phy_t *pmcs_promote_next_phy(pmcs_phy_t *pptr); 312*12462Sjesse.butler@oracle.com void pmcs_hold_iport(pmcs_iport_t *iport); 31310696SDavid.Hollister@Sun.COM void pmcs_rele_iport(pmcs_iport_t *iport); 31410696SDavid.Hollister@Sun.COM int pmcs_iport_configure_phys(pmcs_iport_t *iport); 31511133SJesse.Butler@Sun.COM void pmcs_iport_teardown_phys(pmcs_iport_t *iport); 31610696SDavid.Hollister@Sun.COM 31710696SDavid.Hollister@Sun.COM void pmcs_lock_phy(pmcs_phy_t *); 31810696SDavid.Hollister@Sun.COM void pmcs_unlock_phy(pmcs_phy_t *); 31910696SDavid.Hollister@Sun.COM 32010696SDavid.Hollister@Sun.COM void pmcs_destroy_target(pmcs_xscsi_t *); 32110696SDavid.Hollister@Sun.COM void pmcs_phymap_activate(void *, char *, void **); 32210696SDavid.Hollister@Sun.COM void pmcs_phymap_deactivate(void *, char *, void *); 32310696SDavid.Hollister@Sun.COM void pmcs_add_phy_to_iport(pmcs_iport_t *, pmcs_phy_t *); 32410696SDavid.Hollister@Sun.COM void pmcs_remove_phy_from_iport(pmcs_iport_t *, pmcs_phy_t *); 32510696SDavid.Hollister@Sun.COM void pmcs_free_all_phys(pmcs_hw_t *, pmcs_phy_t *); 32610696SDavid.Hollister@Sun.COM void pmcs_free_phys(pmcs_hw_t *, pmcs_phy_t *); 32710696SDavid.Hollister@Sun.COM 32810696SDavid.Hollister@Sun.COM int pmcs_phy_constructor(void *, void *, int); 32910696SDavid.Hollister@Sun.COM void pmcs_phy_destructor(void *, void *); 33010696SDavid.Hollister@Sun.COM 33110696SDavid.Hollister@Sun.COM void pmcs_inc_phy_ref_count(pmcs_phy_t *); 33210696SDavid.Hollister@Sun.COM void pmcs_dec_phy_ref_count(pmcs_phy_t *); 33310696SDavid.Hollister@Sun.COM 33410696SDavid.Hollister@Sun.COM /* Worker thread */ 33510696SDavid.Hollister@Sun.COM void pmcs_worker(void *); 33610696SDavid.Hollister@Sun.COM 33710696SDavid.Hollister@Sun.COM pmcs_phy_t *pmcs_get_root_phy(pmcs_phy_t *); 33811692SJesse.Butler@Sun.COM pmcs_xscsi_t *pmcs_get_target(pmcs_iport_t *, char *, boolean_t); 33910696SDavid.Hollister@Sun.COM 34010696SDavid.Hollister@Sun.COM void pmcs_fatal_handler(pmcs_hw_t *); 34110696SDavid.Hollister@Sun.COM 34210696SDavid.Hollister@Sun.COM /* 34310696SDavid.Hollister@Sun.COM * Schedule device state recovery for this device immediately 34410696SDavid.Hollister@Sun.COM */ 34510696SDavid.Hollister@Sun.COM void pmcs_start_dev_state_recovery(pmcs_xscsi_t *, pmcs_phy_t *); 34610696SDavid.Hollister@Sun.COM 34711267SJesse.Butler@Sun.COM /* 34811267SJesse.Butler@Sun.COM * Functions to serialize SMP requests 34911267SJesse.Butler@Sun.COM */ 35011267SJesse.Butler@Sun.COM void pmcs_smp_acquire(pmcs_iport_t *iport); 35111267SJesse.Butler@Sun.COM void pmcs_smp_release(pmcs_iport_t *iport); 35211267SJesse.Butler@Sun.COM 35311307SDavid.Hollister@Sun.COM /* 35411307SDavid.Hollister@Sun.COM * Update attached-port-pm and target-port-pm properties on a PHY 35511307SDavid.Hollister@Sun.COM */ 35611307SDavid.Hollister@Sun.COM void pmcs_update_phy_pm_props(pmcs_phy_t *, uint64_t, uint64_t, boolean_t); 35711307SDavid.Hollister@Sun.COM 35811601SDavid.Hollister@Sun.COM /* 35911601SDavid.Hollister@Sun.COM * Determine whether it's worth retrying enumeration 36011601SDavid.Hollister@Sun.COM */ 36111601SDavid.Hollister@Sun.COM void pmcs_status_disposition(pmcs_phy_t *, uint32_t); 36211601SDavid.Hollister@Sun.COM 36311694SDavid.Hollister@Sun.COM /* 36411694SDavid.Hollister@Sun.COM * Write out firmware event log (if configured to do so) if it's filled up 36511694SDavid.Hollister@Sun.COM */ 36611694SDavid.Hollister@Sun.COM void pmcs_gather_fwlog(pmcs_hw_t *); 36711694SDavid.Hollister@Sun.COM 36810696SDavid.Hollister@Sun.COM #ifdef __cplusplus 36910696SDavid.Hollister@Sun.COM } 37010696SDavid.Hollister@Sun.COM #endif 37110696SDavid.Hollister@Sun.COM #endif /* _PMCS_PROTO_H */ 372