xref: /onnv-gate/usr/src/uts/common/sys/scsi/adapters/pmcs/pmcs_proto.h (revision 12462:6a2cdc3dccf5)
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