1*191d7ec1SSascha Wildner /* $FreeBSD: src/sys/dev/isp/isp_library.h,v 1.11 2010/02/27 05:41:23 mjacob Exp $ */ 2*191d7ec1SSascha Wildner /*- 3*191d7ec1SSascha Wildner * Copyright (c) 1997-2009 by Matthew Jacob 4*191d7ec1SSascha Wildner * All rights reserved. 5*191d7ec1SSascha Wildner * 6*191d7ec1SSascha Wildner * Redistribution and use in source and binary forms, with or without 7*191d7ec1SSascha Wildner * modification, are permitted provided that the following conditions 8*191d7ec1SSascha Wildner * are met: 9*191d7ec1SSascha Wildner * 10*191d7ec1SSascha Wildner * 1. Redistributions of source code must retain the above copyright 11*191d7ec1SSascha Wildner * notice, this list of conditions and the following disclaimer. 12*191d7ec1SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright 13*191d7ec1SSascha Wildner * notice, this list of conditions and the following disclaimer in the 14*191d7ec1SSascha Wildner * documentation and/or other materials provided with the distribution. 15*191d7ec1SSascha Wildner * 16*191d7ec1SSascha Wildner * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17*191d7ec1SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*191d7ec1SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*191d7ec1SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 20*191d7ec1SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*191d7ec1SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*191d7ec1SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*191d7ec1SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*191d7ec1SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*191d7ec1SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*191d7ec1SSascha Wildner * SUCH DAMAGE. 27*191d7ec1SSascha Wildner * 28*191d7ec1SSascha Wildner */ 29*191d7ec1SSascha Wildner #ifndef _ISP_LIBRARY_H 30*191d7ec1SSascha Wildner #define _ISP_LIBRARY_H 31*191d7ec1SSascha Wildner 32*191d7ec1SSascha Wildner /* 33*191d7ec1SSascha Wildner * Common command shipping routine. 34*191d7ec1SSascha Wildner * 35*191d7ec1SSascha Wildner * This used to be platform specific, but basically once you get the segment 36*191d7ec1SSascha Wildner * stuff figured out, you can make all the code in one spot. 37*191d7ec1SSascha Wildner */ 38*191d7ec1SSascha Wildner typedef enum { ISP_TO_DEVICE, ISP_FROM_DEVICE, ISP_NOXFR} isp_ddir_t; 39*191d7ec1SSascha Wildner int isp_send_cmd(ispsoftc_t *, void *, void *, uint32_t, uint32_t, isp_ddir_t); 40*191d7ec1SSascha Wildner 41*191d7ec1SSascha Wildner /* 42*191d7ec1SSascha Wildner * Handle management functions. 43*191d7ec1SSascha Wildner * 44*191d7ec1SSascha Wildner * These handles are associate with a command. 45*191d7ec1SSascha Wildner */ 46*191d7ec1SSascha Wildner int isp_allocate_xs(ispsoftc_t *, XS_T *, uint32_t *); 47*191d7ec1SSascha Wildner XS_T * isp_find_xs(ispsoftc_t *, uint32_t); 48*191d7ec1SSascha Wildner uint32_t isp_find_handle(ispsoftc_t *, XS_T *); 49*191d7ec1SSascha Wildner uint32_t isp_handle_index(ispsoftc_t *, uint32_t); 50*191d7ec1SSascha Wildner void isp_destroy_handle(ispsoftc_t *, uint32_t); 51*191d7ec1SSascha Wildner 52*191d7ec1SSascha Wildner /* 53*191d7ec1SSascha Wildner * Request Queue allocation 54*191d7ec1SSascha Wildner */ 55*191d7ec1SSascha Wildner void *isp_getrqentry(ispsoftc_t *); 56*191d7ec1SSascha Wildner 57*191d7ec1SSascha Wildner /* 58*191d7ec1SSascha Wildner * Queue Entry debug functions 59*191d7ec1SSascha Wildner */ 60*191d7ec1SSascha Wildner void isp_print_qentry (ispsoftc_t *, const char *, int, void *); 61*191d7ec1SSascha Wildner void isp_print_bytes(ispsoftc_t *, const char *, int, void *); 62*191d7ec1SSascha Wildner 63*191d7ec1SSascha Wildner /* 64*191d7ec1SSascha Wildner * Fibre Channel specific routines and data. 65*191d7ec1SSascha Wildner */ 66*191d7ec1SSascha Wildner extern const char *isp_class3_roles[4]; 67*191d7ec1SSascha Wildner int isp_fc_runstate(ispsoftc_t *, int, int); 68*191d7ec1SSascha Wildner void isp_dump_portdb(ispsoftc_t *, int); 69*191d7ec1SSascha Wildner 70*191d7ec1SSascha Wildner const char *isp_fc_fw_statename(int); 71*191d7ec1SSascha Wildner const char *isp_fc_loop_statename(int); 72*191d7ec1SSascha Wildner const char *isp_fc_toponame(fcparam *); 73*191d7ec1SSascha Wildner 74*191d7ec1SSascha Wildner int isp_fc_change_role(ispsoftc_t *, int, int); 75*191d7ec1SSascha Wildner 76*191d7ec1SSascha Wildner 77*191d7ec1SSascha Wildner /* 78*191d7ec1SSascha Wildner * Cleanup 79*191d7ec1SSascha Wildner */ 80*191d7ec1SSascha Wildner void isp_clear_commands(ispsoftc_t *); 81*191d7ec1SSascha Wildner 82*191d7ec1SSascha Wildner /* 83*191d7ec1SSascha Wildner * Common chip shutdown function 84*191d7ec1SSascha Wildner */ 85*191d7ec1SSascha Wildner void isp_shutdown(ispsoftc_t *); 86*191d7ec1SSascha Wildner 87*191d7ec1SSascha Wildner /* 88*191d7ec1SSascha Wildner * Put/Get routines to push from CPU view to device view 89*191d7ec1SSascha Wildner * or to pull from device view to CPU view for various 90*191d7ec1SSascha Wildner * data structures (IOCB) 91*191d7ec1SSascha Wildner */ 92*191d7ec1SSascha Wildner void isp_put_hdr(ispsoftc_t *, isphdr_t *, isphdr_t *); 93*191d7ec1SSascha Wildner void isp_get_hdr(ispsoftc_t *, isphdr_t *, isphdr_t *); 94*191d7ec1SSascha Wildner int isp_get_response_type(ispsoftc_t *, isphdr_t *); 95*191d7ec1SSascha Wildner void isp_put_request(ispsoftc_t *, ispreq_t *, ispreq_t *); 96*191d7ec1SSascha Wildner void isp_put_marker(ispsoftc_t *, isp_marker_t *, isp_marker_t *); 97*191d7ec1SSascha Wildner void isp_put_marker_24xx(ispsoftc_t *, isp_marker_24xx_t *, isp_marker_24xx_t *); 98*191d7ec1SSascha Wildner void isp_put_request_t2(ispsoftc_t *, ispreqt2_t *, ispreqt2_t *); 99*191d7ec1SSascha Wildner void isp_put_request_t2e(ispsoftc_t *, ispreqt2e_t *, ispreqt2e_t *); 100*191d7ec1SSascha Wildner void isp_put_request_t3(ispsoftc_t *, ispreqt3_t *, ispreqt3_t *); 101*191d7ec1SSascha Wildner void isp_put_request_t3e(ispsoftc_t *, ispreqt3e_t *, ispreqt3e_t *); 102*191d7ec1SSascha Wildner void isp_put_extended_request(ispsoftc_t *, ispextreq_t *, ispextreq_t *); 103*191d7ec1SSascha Wildner void isp_put_request_t7(ispsoftc_t *, ispreqt7_t *, ispreqt7_t *); 104*191d7ec1SSascha Wildner void isp_put_24xx_tmf(ispsoftc_t *, isp24xx_tmf_t *, isp24xx_tmf_t *); 105*191d7ec1SSascha Wildner void isp_put_24xx_abrt(ispsoftc_t *, isp24xx_abrt_t *, isp24xx_abrt_t *); 106*191d7ec1SSascha Wildner void isp_put_cont_req(ispsoftc_t *, ispcontreq_t *, ispcontreq_t *); 107*191d7ec1SSascha Wildner void isp_put_cont64_req(ispsoftc_t *, ispcontreq64_t *, ispcontreq64_t *); 108*191d7ec1SSascha Wildner void isp_get_response(ispsoftc_t *, ispstatusreq_t *, ispstatusreq_t *); 109*191d7ec1SSascha Wildner void isp_get_24xx_response(ispsoftc_t *, isp24xx_statusreq_t *, isp24xx_statusreq_t *); 110*191d7ec1SSascha Wildner void isp_get_24xx_abrt(ispsoftc_t *, isp24xx_abrt_t *, isp24xx_abrt_t *); 111*191d7ec1SSascha Wildner void isp_get_rio1(ispsoftc_t *, isp_rio1_t *, isp_rio1_t *); 112*191d7ec1SSascha Wildner void isp_get_rio2(ispsoftc_t *, isp_rio2_t *, isp_rio2_t *); 113*191d7ec1SSascha Wildner void isp_put_icb(ispsoftc_t *, isp_icb_t *, isp_icb_t *); 114*191d7ec1SSascha Wildner void isp_put_icb_2400(ispsoftc_t *, isp_icb_2400_t *, isp_icb_2400_t *); 115*191d7ec1SSascha Wildner void isp_put_icb_2400_vpinfo(ispsoftc_t *, isp_icb_2400_vpinfo_t *, isp_icb_2400_vpinfo_t *); 116*191d7ec1SSascha Wildner void isp_put_vp_port_info(ispsoftc_t *, vp_port_info_t *, vp_port_info_t *); 117*191d7ec1SSascha Wildner void isp_get_vp_port_info(ispsoftc_t *, vp_port_info_t *, vp_port_info_t *); 118*191d7ec1SSascha Wildner void isp_put_vp_ctrl_info(ispsoftc_t *, vp_ctrl_info_t *, vp_ctrl_info_t *); 119*191d7ec1SSascha Wildner void isp_get_vp_ctrl_info(ispsoftc_t *, vp_ctrl_info_t *, vp_ctrl_info_t *); 120*191d7ec1SSascha Wildner void isp_put_vp_modify(ispsoftc_t *, vp_modify_t *, vp_modify_t *); 121*191d7ec1SSascha Wildner void isp_get_vp_modify(ispsoftc_t *, vp_modify_t *, vp_modify_t *); 122*191d7ec1SSascha Wildner void isp_get_pdb_21xx(ispsoftc_t *, isp_pdb_21xx_t *, isp_pdb_21xx_t *); 123*191d7ec1SSascha Wildner void isp_get_pdb_24xx(ispsoftc_t *, isp_pdb_24xx_t *, isp_pdb_24xx_t *); 124*191d7ec1SSascha Wildner void isp_get_ridacq(ispsoftc_t *, isp_ridacq_t *, isp_ridacq_t *); 125*191d7ec1SSascha Wildner void isp_get_plogx(ispsoftc_t *, isp_plogx_t *, isp_plogx_t *); 126*191d7ec1SSascha Wildner void isp_put_plogx(ispsoftc_t *, isp_plogx_t *, isp_plogx_t *); 127*191d7ec1SSascha Wildner void isp_get_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *, isp_ct_pt_t *); 128*191d7ec1SSascha Wildner void isp_get_ms(ispsoftc_t *isp, isp_ms_t *, isp_ms_t *); 129*191d7ec1SSascha Wildner void isp_put_ct_pt(ispsoftc_t *isp, isp_ct_pt_t *, isp_ct_pt_t *); 130*191d7ec1SSascha Wildner void isp_put_ms(ispsoftc_t *isp, isp_ms_t *, isp_ms_t *); 131*191d7ec1SSascha Wildner void isp_put_sns_request(ispsoftc_t *, sns_screq_t *, sns_screq_t *); 132*191d7ec1SSascha Wildner void isp_put_gid_ft_request(ispsoftc_t *, sns_gid_ft_req_t *, sns_gid_ft_req_t *); 133*191d7ec1SSascha Wildner void isp_put_gxn_id_request(ispsoftc_t *, sns_gxn_id_req_t *, sns_gxn_id_req_t *); 134*191d7ec1SSascha Wildner void isp_get_sns_response(ispsoftc_t *, sns_scrsp_t *, sns_scrsp_t *, int); 135*191d7ec1SSascha Wildner void isp_get_gid_ft_response(ispsoftc_t *, sns_gid_ft_rsp_t *, sns_gid_ft_rsp_t *, int); 136*191d7ec1SSascha Wildner void isp_get_gxn_id_response(ispsoftc_t *, sns_gxn_id_rsp_t *, sns_gxn_id_rsp_t *); 137*191d7ec1SSascha Wildner void isp_get_gff_id_response(ispsoftc_t *, sns_gff_id_rsp_t *, sns_gff_id_rsp_t *); 138*191d7ec1SSascha Wildner void isp_get_ga_nxt_response(ispsoftc_t *, sns_ga_nxt_rsp_t *, sns_ga_nxt_rsp_t *); 139*191d7ec1SSascha Wildner void isp_get_els(ispsoftc_t *, els_t *, els_t *); 140*191d7ec1SSascha Wildner void isp_put_els(ispsoftc_t *, els_t *, els_t *); 141*191d7ec1SSascha Wildner void isp_get_fc_hdr(ispsoftc_t *, fc_hdr_t *, fc_hdr_t *); 142*191d7ec1SSascha Wildner void isp_get_fcp_cmnd_iu(ispsoftc_t *, fcp_cmnd_iu_t *, fcp_cmnd_iu_t *); 143*191d7ec1SSascha Wildner void isp_put_rft_id(ispsoftc_t *, rft_id_t *, rft_id_t *); 144*191d7ec1SSascha Wildner void isp_get_ct_hdr(ispsoftc_t *isp, ct_hdr_t *, ct_hdr_t *); 145*191d7ec1SSascha Wildner void isp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t *, ct_hdr_t *); 146*191d7ec1SSascha Wildner 147*191d7ec1SSascha Wildner #define ISP_HANDLE_MASK 0x7fff 148*191d7ec1SSascha Wildner 149*191d7ec1SSascha Wildner #ifdef ISP_TARGET_MODE 150*191d7ec1SSascha Wildner #include <dev/disk/isp/isp_target.h> 151*191d7ec1SSascha Wildner 152*191d7ec1SSascha Wildner int isp_send_tgt_cmd(ispsoftc_t *, void *, void *, uint32_t, uint32_t, isp_ddir_t, void *, uint32_t); 153*191d7ec1SSascha Wildner 154*191d7ec1SSascha Wildner int isp_allocate_xs_tgt(ispsoftc_t *, void *, uint32_t *); 155*191d7ec1SSascha Wildner void *isp_find_xs_tgt(ispsoftc_t *, uint32_t); 156*191d7ec1SSascha Wildner uint32_t isp_find_tgt_handle(ispsoftc_t *, void *); 157*191d7ec1SSascha Wildner void isp_destroy_tgt_handle(ispsoftc_t *, uint32_t); 158*191d7ec1SSascha Wildner 159*191d7ec1SSascha Wildner int isp_find_pdb_by_wwn(ispsoftc_t *, int, uint64_t, fcportdb_t **); 160*191d7ec1SSascha Wildner int isp_find_pdb_by_loopid(ispsoftc_t *, int, uint32_t, fcportdb_t **); 161*191d7ec1SSascha Wildner int isp_find_pdb_by_sid(ispsoftc_t *, int, uint32_t, fcportdb_t **); 162*191d7ec1SSascha Wildner void isp_find_chan_by_did(ispsoftc_t *, uint32_t, uint16_t *); 163*191d7ec1SSascha Wildner void isp_add_wwn_entry(ispsoftc_t *, int, uint64_t, uint16_t, uint32_t); 164*191d7ec1SSascha Wildner void isp_del_wwn_entry(ispsoftc_t *, int, uint64_t, uint16_t, uint32_t); 165*191d7ec1SSascha Wildner void isp_del_all_wwn_entries(ispsoftc_t *, int); 166*191d7ec1SSascha Wildner void isp_del_wwn_entries(ispsoftc_t *, isp_notify_t *); 167*191d7ec1SSascha Wildner 168*191d7ec1SSascha Wildner void isp_put_atio(ispsoftc_t *, at_entry_t *, at_entry_t *); 169*191d7ec1SSascha Wildner void isp_get_atio(ispsoftc_t *, at_entry_t *, at_entry_t *); 170*191d7ec1SSascha Wildner void isp_put_atio2(ispsoftc_t *, at2_entry_t *, at2_entry_t *); 171*191d7ec1SSascha Wildner void isp_put_atio2e(ispsoftc_t *, at2e_entry_t *, at2e_entry_t *); 172*191d7ec1SSascha Wildner void isp_get_atio2(ispsoftc_t *, at2_entry_t *, at2_entry_t *); 173*191d7ec1SSascha Wildner void isp_get_atio2e(ispsoftc_t *, at2e_entry_t *, at2e_entry_t *); 174*191d7ec1SSascha Wildner void isp_get_atio7(ispsoftc_t *isp, at7_entry_t *, at7_entry_t *); 175*191d7ec1SSascha Wildner void isp_put_ctio(ispsoftc_t *, ct_entry_t *, ct_entry_t *); 176*191d7ec1SSascha Wildner void isp_get_ctio(ispsoftc_t *, ct_entry_t *, ct_entry_t *); 177*191d7ec1SSascha Wildner void isp_put_ctio2(ispsoftc_t *, ct2_entry_t *, ct2_entry_t *); 178*191d7ec1SSascha Wildner void isp_put_ctio2e(ispsoftc_t *, ct2e_entry_t *, ct2e_entry_t *); 179*191d7ec1SSascha Wildner void isp_put_ctio7(ispsoftc_t *, ct7_entry_t *, ct7_entry_t *); 180*191d7ec1SSascha Wildner void isp_get_ctio2(ispsoftc_t *, ct2_entry_t *, ct2_entry_t *); 181*191d7ec1SSascha Wildner void isp_get_ctio2e(ispsoftc_t *, ct2e_entry_t *, ct2e_entry_t *); 182*191d7ec1SSascha Wildner void isp_get_ctio7(ispsoftc_t *, ct7_entry_t *, ct7_entry_t *); 183*191d7ec1SSascha Wildner void isp_put_enable_lun(ispsoftc_t *, lun_entry_t *, lun_entry_t *); 184*191d7ec1SSascha Wildner void isp_get_enable_lun(ispsoftc_t *, lun_entry_t *, lun_entry_t *); 185*191d7ec1SSascha Wildner void isp_put_notify(ispsoftc_t *, in_entry_t *, in_entry_t *); 186*191d7ec1SSascha Wildner void isp_get_notify(ispsoftc_t *, in_entry_t *, in_entry_t *); 187*191d7ec1SSascha Wildner void isp_put_notify_fc(ispsoftc_t *, in_fcentry_t *, in_fcentry_t *); 188*191d7ec1SSascha Wildner void isp_put_notify_fc_e(ispsoftc_t *, in_fcentry_e_t *, in_fcentry_e_t *); 189*191d7ec1SSascha Wildner void isp_put_notify_24xx(ispsoftc_t *, in_fcentry_24xx_t *, in_fcentry_24xx_t *); 190*191d7ec1SSascha Wildner void isp_get_notify_fc(ispsoftc_t *, in_fcentry_t *, in_fcentry_t *); 191*191d7ec1SSascha Wildner void isp_get_notify_fc_e(ispsoftc_t *, in_fcentry_e_t *, in_fcentry_e_t *); 192*191d7ec1SSascha Wildner void isp_get_notify_24xx(ispsoftc_t *, in_fcentry_24xx_t *, in_fcentry_24xx_t *); 193*191d7ec1SSascha Wildner void isp_put_notify_ack(ispsoftc_t *, na_entry_t *, na_entry_t *); 194*191d7ec1SSascha Wildner void isp_get_notify_ack(ispsoftc_t *, na_entry_t *, na_entry_t *); 195*191d7ec1SSascha Wildner void isp_put_notify_24xx_ack(ispsoftc_t *, na_fcentry_24xx_t *, na_fcentry_24xx_t *); 196*191d7ec1SSascha Wildner void isp_put_notify_ack_fc(ispsoftc_t *, na_fcentry_t *, na_fcentry_t *); 197*191d7ec1SSascha Wildner void isp_put_notify_ack_fc_e(ispsoftc_t *, na_fcentry_e_t *, na_fcentry_e_t *); 198*191d7ec1SSascha Wildner void isp_put_notify_ack_24xx(ispsoftc_t *, na_fcentry_24xx_t *, na_fcentry_24xx_t *); 199*191d7ec1SSascha Wildner void isp_get_notify_ack_fc(ispsoftc_t *, na_fcentry_t *, na_fcentry_t *); 200*191d7ec1SSascha Wildner void isp_get_notify_ack_fc_e(ispsoftc_t *, na_fcentry_e_t *, na_fcentry_e_t *); 201*191d7ec1SSascha Wildner void isp_get_notify_ack_24xx(ispsoftc_t *, na_fcentry_24xx_t *, na_fcentry_24xx_t *); 202*191d7ec1SSascha Wildner void isp_get_abts(ispsoftc_t *, abts_t *, abts_t *); 203*191d7ec1SSascha Wildner void isp_put_abts_rsp(ispsoftc_t *, abts_rsp_t *, abts_rsp_t *); 204*191d7ec1SSascha Wildner void isp_get_abts_rsp(ispsoftc_t *, abts_rsp_t *, abts_rsp_t *); 205*191d7ec1SSascha Wildner #endif /* ISP_TARGET_MODE */ 206*191d7ec1SSascha Wildner #endif /* _ISP_LIBRARY_H */ 207