7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * CDDL HEADER START
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * The contents of this file are subject to the terms of the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Common Development and Distribution License (the "License").
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * You may not use this file except in compliance with the License.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * See the License for the specific language governing permissions
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * and limitations under the License.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * When distributing Covered Code, include this CDDL HEADER in each
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * If applicable, add the following below this CDDL HEADER, with the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fields enclosed by brackets "[]" replaced with your own identifying
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * information: Portions Copyright [yyyy] [name of copyright owner]
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * CDDL HEADER END
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This file defines interfaces between FCOE and LEADVILLE
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Driver kernel header files
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * LEADVILLE header files
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * COMSTAR head files (BIT_* macro)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FCOE header files
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Driver's own header files
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * forward declaration of static functions
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_populate_hba_fru_details(fcoei_soft_state_t *ss,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_initiate_ct_req(fcoei_exchange_t *xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_initiate_fcp_cmd(fcoei_exchange_t *xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_initiate_els_req(fcoei_exchange_t *xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_initiate_els_resp(fcoei_exchange_t *xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_logi_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_prli_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_logo_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_scr_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_adisc_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_linit_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_rls_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_rnid_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_acc_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_rjt_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_logi_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_prli_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_logo_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void fcoei_fill_els_adisc_resp(fc_packet_t *fpkt, fcoe_frame_t *frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_xch_abort(mod_hash_key_t key, mod_hash_val_t *val, void *arg);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Bind LV port instance with fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * dip = dev info of fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * port_info = fcoei specific parameters about LV port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * bind_info = LV specific parameters about fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * The pointer to fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Unpon the completion of this call, the port must be offline.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_port_enabled could trigger it to online
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_bind_port(dev_info_t *dip, fc_fca_port_info_t *port_info,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * get state info based on the dip
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ddi_get_soft_state(fcoei_state, ddi_get_instance(dip));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * make sure this port isn't bound
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * make sure request is in bounds
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * stash the ss_bind_info supplied by the FC Transport
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(bind_info, &ss->ss_bind_info, sizeof (fc_fca_bind_info_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * RNID parameter
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * populate T11 FC-HBA details
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * set port's current state, and it is always offline before binding
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * We hack pi_port_state to tell LV if it's NODMA_FCA
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_info->pi_port_state = FC_STATE_FCA_IS_NODMA;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * copy login param
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&ss->ss_els_logi, &port_info->pi_login_params,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Mark it as bound
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Let fcoe to report the link status
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "Exit fcoei_bind_port: %p", ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_unbind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Un-bind the fcoei port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Clear binding flag
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_OFFLINE, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "Exit fcoei_unbind_port: %p", ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_init_pkt
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initialize fcoei related part of fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = The pointer to fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * sleep = This call can sleep or not
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - Initialization completed successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Link the exchange elements with proper objects
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao/* ARGSUSED */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_init_pkt(void *fca_handle, fc_packet_t *fpkt, int sleep)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_un_init_pkt
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Uninitialize fcoei related part of fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = The pointer to fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - Uninitialize successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Very simple, just return successfully
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao/* ARGSUSED */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_un_init_pkt(void *fca_handle, fc_packet_t *fpkt)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_get_cap
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Export FCA hardware and software capability.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * cap = pointer to the capability string
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * ptr = buffer pointer for returning capability
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_CAP_ERROR - no such capability
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_CAP_FOUND - the capability was returned and cannot be set
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_CAP_UNSOL_BUF is one important capability, it will affect the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * implementation of fcoei_ub_alloc/free.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_get_cap(void * fca_handle, char *cap, void *ptr)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&ss->ss_els_logi.node_ww_name.raw_wwn[0], ptr, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy((void *)&ss->ss_els_logi, ptr, sizeof (la_els_logi_t));
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else if (strcmp(cap, FC_CAP_NOSTREAM_ON_UNALIGN_BUF) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else if (strcmp(cap, FC_CAP_PAYLOAD_SIZE) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang } else if (strcmp(cap, FC_CAP_POST_RESET_BEHAVIOR) == 0) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_set_cap
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Allow the FC Transport to set FCA capabilities if possible
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * cap = pointer to the capabilities string.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * ptr = buffer pointer for capability.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_CAP_ERROR - no such capability
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Currently, all capabilities can't be changed.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_set_cap(void * fca_handle, char *cap, void *ptr)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "cap: %s, %p, %p", cap, fca_handle, ptr);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_getmap
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Get lilp map
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * mapbuf = the buffer to store lilp map
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_FAILURE - Can't get the lilp map
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei can't work in loop topology, so it should never get called
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_getmap(void * fca_handle, fc_lilpmap_t *mapbuf)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not: %p-%p", fca_handle, mapbuf);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_ub_alloc
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Pre-allocate unsolicited buffers at the request of LV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * tokens = token array for each buffer.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * size = number of tokens
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * count = the acutual number of allocated unsolicited buffers
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * type = unsolicited buffer type
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - The requested buffers have been freeed
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_get_cap will set UNSOL_BUF to 0, so it should never get called.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_ub_alloc(void * fca_handle, uint64_t tokens[], uint32_t size,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not: %p-%p-%x-%p-%x", fca_handle, tokens,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_ub_free
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Free the pre-allocated unsolicited buffers at the request of LV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * count = number of buffers.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * tokens = token array for each buffer.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - The requested buffers have been freeed
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_get_cap will set UNSOL_BUF to 0, so it should never get called.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_ub_free(void * fca_handle, uint32_t count, uint64_t tokens[])
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_EXT_LOG(__FUNCTION__, "not: %p-%x-%p", fca_handle, count, tokens);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_ub_release
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Release unsolicited buffers from FC Transport to FCA for future use
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * count = number of buffers.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * tokens = token array for each buffer.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - The requested buffers have been released.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_FAILURE - The requested buffers have not been released.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * It will always succeed. It has nothing to do with fcoei_ub_alloc/free.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_ub_release(void * fca_handle, uint32_t count, uint64_t tokens[])
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_unsol_buf_t *ub = *((fc_unsol_buf_t **)tokens);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "count is not 1: %p", fca_handle);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_abort
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Direct FCA driver to abort an outstanding exchange associated with a
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * specified fc_packet_t struct
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt - A pointer to the fc_packet_t for the exchange to be aborted.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * flags - Set to KM_SLEEP if the function may sleep, or KM_NOSLEEP if
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * the function may not sleep.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_ABORTED - The specified exchange was successfully aborted.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_ABORTING - The specified exchange is being aborted.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_ABORT_FAILED - The specified exchange could not be aborted.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_TRANSPORT_ERROR - A transport error occurred while attempting to
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * abort the specified exchange.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_BADEXCHANGE - The specified exchange does not exist.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * After the exchange is aborted, the FCA driver must update the relevant
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fields in the fc_packet_t struct as per normal exchange completion and
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * call the pkt_comp function to return the fc_packet_t struct to the FC
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Transport.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * When an exchange is successfully aborted, the FCA driver must set the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * pkt_reason field in the fc_packet_t to FC_REASON_ABORTED and the
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * pkt_state field in the fc_packet_t to FC_PKT_LOCAL_RJT before returning
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * the fc_packet_t to the FC Transport.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Unfortunately, LV doesn't conform to the spec. It will take all these
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * legal return value as failure to abort.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_abort(void * fca_handle, fc_packet_t *fpkt, int flags)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not: %p-%p-%x", fca_handle, fpkt, flags);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_reset
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Reset link or hardware
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * cmd = reset type command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - Reset has completed successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_FAILURE - Reset has failed
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not online now: ss-%p", ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This is linkreset phase I
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_OFFLINE, 0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_port_event(ss->ss_eport, FCOE_NOTIFY_EPORT_LINK_DOWN);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Perpare linkreset phase II
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "cmd-%x not supported", cmd);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_port_manage
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Perform various port management operations at the request of LV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * pm = the pointer to the struct specifying the port management operation
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - The request completed successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_FAILURE - The request did not complete successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_port_manage(void * fca_handle, fc_fca_pm_t *pm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "code0x%x, %p", pm->pm_cmd_code, fca_handle);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "unsupported cmd-%x", pm->pm_cmd_code);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_get_device
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Get fcoei remote port with FCID of d_id
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * d_id = 24-bit FCID of remote port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * The pointer to fcoei remote port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei has no remote port device
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangstatic void *
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_get_device(void *fca_handle, fc_portid_t d_id)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_EXT_LOG(__FUNCTION__, "not supported: %p-%x", fca_handle, d_id);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_notify
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Notify the change of target device
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle = fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * cmd = detailed cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC_SUCCESS - Notification completed successfully
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * It's only needed to support non-COMSTAR FC target, so it should
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * never get called.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "not supported: %p-%x", fca_handle, cmd);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_transport
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Submit FCP/CT requests
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt - LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_transport(void *fca_handle, fc_packet_t *fpkt)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "AaA polling: %p-%p", fpkt, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang sema_init(&xch->xch_sema, 0, NULL, SEMA_DRIVER, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_insert_tail(&ss->ss_event_list, &xch->xch_ae);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "BaB polling: %p-%p", fpkt, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "after polling: %p-%p", fpkt, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_els_send
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Submit ELS request or response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fca_handle - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_els_send(void *fca_handle, fc_packet_t *fpkt)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)fca_handle;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "ELS poll mode is not supported");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * LV could release ub after this call, so we must save the ub type
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * for later use
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ((fc_unsol_buf_t *)fpkt->pkt_ub_resp_token)->ub_buffer[0];
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_insert_tail(&ss->ss_event_list, &xch->xch_ae);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_populate_hba_fru_details
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill detailed information about HBA
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * ss - fcoei soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * port_info = fc_fca_port_info_t that need be updated
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_populate_hba_fru_details(fcoei_soft_state_t *ss,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fca_port_attrs_t *port_attrs = &(port_info->pi_attrs);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) snprintf(port_attrs->manufacturer, FCHBA_MANUFACTURER_LEN,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang "Sun Microsystems, Inc.");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) snprintf(port_attrs->driver_name, FCHBA_DRIVER_NAME_LEN,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) snprintf(port_attrs->driver_version, FCHBA_DRIVER_VERSION_LEN,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->hardware_version, "N/A");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->model, "FCoE Virtual FC HBA");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->model_description, "N/A");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->firmware_version, "N/A");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) strcpy(port_attrs->option_rom_version, "N/A");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_attrs->max_frame_size = FCOE_MAX_FC_FRAME_SIZE;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang port_attrs->supported_speed = FC_HBA_PORTSPEED_1GBIT |
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_port_enabled
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Notify fcoe that the port has been enabled
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * arg = the related soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Only after this, fcoe will report the link status to us
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)arg;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_ONLINE, NULL);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_initiate_ct_req
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill and submit CT request
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * xch - the exchange that will be initiated
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_ct_header_t *ct = (fc_ct_header_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Ensure it's 4-byte aligned
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Allocate CT request frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm = xch->xch_ss->ss_eport->eport_alloc_frame(xch->xch_ss->ss_eport,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "failed to alloc: %p", xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * CT header (FC payload)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * CT payload (FC payload)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fp use bcopy to copy fp_fc4_types,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * we need to swap order for each integer
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(((uint32_t *)(intptr_t)(bp + offset))[0],
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break; /* FCSTYPE_DIRECTORY */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang "MS_GIEL ct_fcstype %x, ct_cmdrsp: %x",
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang break; /* FCSTYPE_MGMTSERVICE */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_initiate_fcp_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Submit FCP command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * xch - the exchange to be submitted
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcp_cmd_t *fcp_cmd_iu = (fcp_cmd_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm = xch->xch_ss->ss_eport->eport_alloc_frame(xch->xch_ss->ss_eport,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This will affect timing check
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Set exchange residual bytes
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill FCP command IU
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcp_ent_addr
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm->frm_payload[offset] = fcp_cmd_iu->fcp_cntl.cntl_qtype & 0x07;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(fcp_cmd_iu->fcp_cdb, frm->frm_payload + offset, FCP_CDB_SIZE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcp_data_len
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(fcp_cmd_iu->fcp_data_len, frm->frm_payload + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * FC frame header
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FRM2IFM(frm)->ifm_rctl = fpkt->pkt_cmd_fhdr.r_ctl;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_initiate_els_req
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initiate ELS request
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * xch = the exchange that will be initiated
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm = xch->xch_ss->ss_eport->eport_alloc_frame(xch->xch_ss->ss_eport,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This will affect timing check
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * For FLOGI, we expect response within E_D_TOV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang /* FALLTHROUGH */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * For LOGO, we expect response within E_D_TOV
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * set ifm_rtcl
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FRM2IFM(frm)->ifm_rctl = fpkt->pkt_cmd_fhdr.r_ctl;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_initiate_els_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Originate ELS response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * xch = the associated exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang frm = xch->xch_ss->ss_eport->eport_alloc_frame(xch->xch_ss->ss_eport,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * This will affect timing check
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Set ifm_rctl
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FRM2IFM(frm)->ifm_rctl = fpkt->pkt_cmd_fhdr.r_ctl;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FRM2SS(frm)->ss_p2p_info.fca_d_id = FRM_S_ID(frm);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_logi_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill SCR (state change register) command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LOGI response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_logi_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_logi_t *els_logi = (la_els_logi_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fill ls_code
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_logi->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fill common service parameters
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.fcph_version, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.btob_credit, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.cmn_features, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.rx_bufsize, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.conc_sequences, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->common_service.relative_offset, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(els_logi->common_service.e_d_tov, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_logi->nport_ww_name, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_logi->node_ww_name, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.class_opt, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.initiator_ctl, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.recipient_ctl, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.rcv_size, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.conc_sequences, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.n_port_e_to_e_credit, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_logi->class_3.open_seq_per_xchng, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * needn't touch other fields
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_prli_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill PRLI command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing PRLI response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_prli_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_prli_t *els_prli = (la_els_prli_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (struct fcp_prli *)(void *)els_prli->service_params;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fill basic PRLI fields
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_prli->page_length, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_2(els_prli->payload_length, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fill FCP service parameters page
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * PRLI flags, only 3 bits are valid
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe FCOE_V2B_2(((fcp_spp->orig_process_assoc_valid << 15) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->establish_image_pair << 13)), FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * process associator
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(fcp_spp->orig_process_associator, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_4(fcp_spp->resp_process_associator, FPLD + offset);
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->initiator_fn << 5) | (fcp_spp->target_fn << 4) |
7386f4319a95797d8397f24d609435b2c0e027a6Richard Lowe (fcp_spp->write_xfer_rdy_disabled), FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_scr_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill SCR (state change register) command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing SCR command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_scr_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fc_scr_req_t *els_scr = (fc_scr_req_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_scr->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_adisc_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill ADISC command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing ADISC command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_adisc_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_adisc_t *els_adisc = (la_els_adisc_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_adisc->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_adisc->hard_addr.hard_addr, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_adisc->nport_id.port_id, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_linit_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill LINIT command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LINIT command
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao/* ARGSUSED */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_linit_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_logo_cmd
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill LOGO command frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LOGO command
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_logo_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_logo_t *els_logo = (la_els_logo_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_logo->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_logo->nport_id.port_id, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_logo->nport_ww_name, FPLD + offset, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_rls_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_rls_t *els_rls = (la_els_rls_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_rls->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_rls->rls_portid.port_id, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_rnid_cmd(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_rnid_t *els_rnid = (la_els_rnid_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_rnid->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_acc_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill ELS ACC response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing ELS ACC response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_acc_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ls_code_t *els_code = (ls_code_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_rjt_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill ELS RJT response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containg ELS RJT response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_rjt_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_rjt_t *els_rjt = (la_els_rjt_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_rjt->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_adisc_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill ADISC response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing ADISC response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_adisc_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang la_els_adisc_t *els_adisc = (la_els_adisc_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_1(els_adisc->ls_code.ls_code, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_adisc->hard_addr.hard_addr, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_adisc->port_wwn, FPLD + offset, FC_WWN_SIZE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(&els_adisc->node_wwn, FPLD + offset, FC_WWN_SIZE);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOE_V2B_3(els_adisc->nport_id.port_id, FPLD + offset);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_logi_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill FLOGI/PLOGI response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LOGI response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_logi_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ls_code_t *els_code = (ls_code_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_prli_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill PRLI response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing PRLI response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_prli_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ls_code_t *els_code = (ls_code_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fill_els_logo_resp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Fill LOGO response frame
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt = LV fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * frm = Unsolicited frame containing LOGO response
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_fill_els_logo_resp(fc_packet_t *fpkt, fcoe_frame_t *frm)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ls_code_t *els_code = (ls_code_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_logo_peer
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Send LOGO to the peer to emulate link offline event
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * arg - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)arg;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Allocate space for exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Allocate space for fc_packet
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt = kmem_zalloc(sizeof (fc_packet_t), KM_SLEEP);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmd = kmem_zalloc(fpkt->pkt_cmdlen, KM_SLEEP);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_resp = kmem_zalloc(fpkt->pkt_rsplen, KM_SLEEP);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Link them together
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initialize FC frame header
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if (ss->ss_eport->eport_flags & EPORT_FLAG_IS_DIRECT_P2P) {
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fpkt->pkt_cmd_fhdr.s_id = ss->ss_p2p_info.fca_d_id;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initialize LOGO payload
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang els_logo = (la_els_logo_t *)(void *)fpkt->pkt_cmd;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang els_logo->nport_id.port_id = ss->ss_p2p_info.fca_d_id;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang bcopy(ss->ss_eport->eport_portwwn, &els_logo->nport_ww_name, 8);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Set the completion function
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "fcoei_transport LOGO failed");
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_fpkt_comp
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * internal exchange completion
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fpkt - fc_packet_t to be completed
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang FCOEI_LOG(__FUNCTION__, "internal exchange is completed: %p", xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang (void) fcoei_un_init_pkt(xch->xch_ss, xch->xch_fpkt);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmem_free(xch->xch_fpkt->pkt_cmd, xch->xch_fpkt->pkt_cmdlen);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang kmem_free(xch->xch_fpkt->pkt_resp, xch->xch_fpkt->pkt_rsplen);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_xch_abort
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Prepare to abort the exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * key = oxid/rxid of the exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * val = the exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * arg = the soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * MH_WALK_CONTINUE = continue to walk
516aa12c0e0be4dde28b9fc2b3d928230a8e4c42Yu Renia Miao/* ARGSUSED */
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_xch_abort(mod_hash_key_t key, mod_hash_val_t *val, void *arg)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang list_insert_tail(&xch->xch_ss->ss_comp_xch_list, xch);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_init_fcatran_vectors
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Initialize fc_fca_tran vectors that are defined in this file
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcatran - fc_fca_tran of the soft state
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wangfcoei_init_fcatran_vectors(fc_fca_tran_t *fcatran)
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_process_event_reset
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * link reset phase II
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * arg - fcoei soft state set in fcoei_bind_port
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_soft_state_t *ss = (fcoei_soft_state_t *)ae->ae_obj;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mod_hash_walk(ss->ss_sol_oxid_hash, fcoei_xch_abort, ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang mod_hash_walk(ss->ss_unsol_rxid_hash, fcoei_xch_abort, ss);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Notify LV that the link is up now
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang ss->ss_eport->eport_ctl(ss->ss_eport, FCOE_CMD_PORT_ONLINE, 0);
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * fcoei_process_event_exchange
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Process exchange in the single thread context
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * ae = the exchange event
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_exchange_t *xch = (fcoei_exchange_t *)ae->ae_obj;
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * These 4 elements need reset, pkt_state & pkt_reason will be set
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * port state sanity checking
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang if ((xch->xch_ss->ss_link_state != FC_STATE_ONLINE) ||
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * LV will retry it after one second
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang fcoei_complete_xch(xch, NULL, FC_PKT_PORT_OFFLINE,
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * Caution: in leadville, it still uses pkt_cmd_fhdr
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * oxid & rxid have been decided when we get unsolicited frames.
7ff836697c120cb94bd30d5c2204eb9b74718e4cZhong Wang * pkt_cmd_fhdr has contained the right oxid and rxid now.