root/usr/src/uts/common/sys/fcoe/fcoeio.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
#ifndef _FCOEIO_H_
#define _FCOEIO_H_

#include <sys/ethernet.h>
#include <sys/types.h>

#ifdef  __cplusplus
extern "C" {
#endif

/*
 * ioctl cmd definitions
 */
#define FCOEIO_CMD                      ('G'<< 8 | 2009)
#define FCOEIO_SUB_CMD                  ('X' << 8)

/*
 * fcoe ioctl sub-command
 */
#define FCOEIO_CREATE_FCOE_PORT                 (FCOEIO_SUB_CMD + 0x01)
#define FCOEIO_DELETE_FCOE_PORT                 (FCOEIO_SUB_CMD + 0x02)
#define FCOEIO_GET_FCOE_PORT_LIST               (FCOEIO_SUB_CMD + 0x03)

/*
 * define common-used constants
 */
#define FCOE_MAX_MAC_NAME_LEN   32

/*
 * fcoeio_xfer definitions
 */
#define FCOEIO_XFER_NONE                0x00
#define FCOEIO_XFER_READ                0x01
#define FCOEIO_XFER_WRITE               0x02
#define FCOEIO_XFER_RW          (FCOEIO_XFER_READ | FCOEIO_XFER_WRITE)

/*
 * fcoeio_errno definitions
 */
typedef enum {
        FCOEIOE_INVAL_ARG = 5,
        FCOEIOE_BUSY,
        FCOEIOE_ALREADY,
        FCOEIOE_PWWN_CONFLICTED,
        FCOEIOE_NWWN_CONFLICTED,
        FCOEIOE_CREATE_MAC,
        FCOEIOE_OPEN_MAC,
        FCOEIOE_CREATE_PORT,
        FCOEIOE_NEED_JUMBO_FRAME,
        FCOEIOE_MAC_NOT_FOUND,
        FCOEIOE_OFFLINE_FAILURE,
        FCOEIOE_MORE_DATA
} fcoeio_stat_t;

/* Biggest buffer length, can hold up to 1024 port instances */
#define FCOEIO_MAX_BUF_LEN      0x10000

typedef struct fcoeio {
        uint16_t        fcoeio_xfer;            /* direction */
        uint16_t        fcoeio_cmd;             /* sub command */
        uint16_t        fcoeio_flags;           /* flags */
        uint16_t        fcoeio_cmd_flags;       /* command specific flags */
        uint32_t        fcoeio_ilen;            /* Input buffer length */
        uint32_t        fcoeio_olen;            /* Output buffer length */
        uint32_t        fcoeio_alen;            /* Auxillary buffer length */
        fcoeio_stat_t   fcoeio_status;          /* FC internal error status */
        uint64_t        fcoeio_ibuf;            /* Input buffer */
        uint64_t        fcoeio_obuf;            /* Output buffer */
        uint64_t        fcoeio_abuf;            /* Auxillary buffer */
} fcoeio_t;

/*
 * Client port type
 */
typedef enum {
        FCOE_CLIENT_INITIATOR = 0,
        FCOE_CLIENT_TARGET
} fcoe_cli_type_t;

/*
 * Command for FCOEIO_CREATE_FCOET_PORT
 */
#define FCOE_WWN_SIZE           8
typedef struct fcoeio_create_port_param {
        uchar_t         fcp_pwwn[FCOE_WWN_SIZE];
        uchar_t         fcp_nwwn[FCOE_WWN_SIZE];
        uint32_t        fcp_nwwn_provided;
        uint32_t        fcp_pwwn_provided;
        uint32_t        fcp_force_promisc;
        fcoe_cli_type_t fcp_port_type;
        datalink_id_t   fcp_mac_linkid;
        uint32_t        fcp_rsvd0;
} fcoeio_create_port_param_t;

typedef struct fcoeio_delete_port_param {
        datalink_id_t   fdp_mac_linkid;
        uint32_t        fdp_rsvd0;
} fcoeio_delete_port_param_t;

/*
 * FCOE port instance
 */
typedef struct fcoe_port_instance {
        uchar_t                 fpi_pwwn[FCOE_WWN_SIZE];
        datalink_id_t           fpi_mac_linkid;
        uint32_t                fpi_rsvd0;
        uint8_t                 fpi_mac_factory_addr[ETHERADDRL];
        uint16_t                fpi_mac_promisc;
        uint8_t                 fpi_mac_current_addr[ETHERADDRL];
        uint16_t                fpi_rsvd1;
        fcoe_cli_type_t         fpi_port_type;
        uint32_t                fpi_mtu_size;
} fcoe_port_instance_t;

/*
 * FCOE port instance list
 */
typedef struct fcoe_port_list {
        uint64_t                numPorts;
        fcoe_port_instance_t    ports[1];
} fcoe_port_list_t;

#ifdef  __cplusplus
}
#endif

#endif  /* _FCOEIO_H_ */