root/usr/src/uts/common/io/bnxe/bnxe_binding.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 2014 QLogic Corporation
 * The contents of this file are subject to the terms of the
 * QLogic End User License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
 * QLogic_End_User_Software_License.txt
 * See the License for the specific language governing permissions
 * and limitations under the License.
 */

#ifndef __BNXE_BINDING_H
#define __BNXE_BINDING_H

#include "bcmtype.h"
#include "mac_drv_info.h"

#define BNXE_BINDING_VERSION \
    ((MAJVERSION << 16) | (MINVERSION << 8) | (REVVERSION << 0))

/* cb_ioctl commands sent to bnxe */
#define BNXE_BIND_FCOE    0x0ead0001
#define BNXE_UNBIND_FCOE  0x0ead0002


/* default FCoE max exchanges is 4096 for SF and 2048 for MF */
#define FCOE_MAX_EXCHANGES_SF 4096
#define FCOE_MAX_EXCHANGES_MF 2048


#ifndef BNXE_FCOE_WWN_SIZE
#define BNXE_FCOE_WWN_SIZE 8
#endif

typedef struct bnxe_wwn_info
{
    uint32_t fcp_pwwn_provided;
    uint8_t  fcp_pwwn[BNXE_FCOE_WWN_SIZE];
    uint32_t fcp_nwwn_provided;
    uint8_t  fcp_nwwn[BNXE_FCOE_WWN_SIZE];
} BnxeWwnInfo;


#define FCOE_INFO_FLAG_FORCE_LOAD 0x1

#define FCOE_INFO_FLAG_MF_MODE_MASK 0x6 /* bits 2-3 */
#define FCOE_INFO_FLAG_MF_MODE_SF   0x0 /* single function */
#define FCOE_INFO_FLAG_MF_MODE_SD   0x2 /* switch dependent (vlan based) */
#define FCOE_INFO_FLAG_MF_MODE_SI   0x4 /* switch independent (mac based) */
#define FCOE_INFO_FLAG_MF_MODE_AFEX 0x6 /* switch dependent (afex based) */

#define FCOE_INFO_IS_MF_MODE_SF(flags) \
    (((flags) & FCOE_INFO_FLAG_MF_MODE_MASK) == FCOE_INFO_FLAG_MF_MODE_SF)
#define FCOE_INFO_IS_MF_MODE_SD(flags) \
    (((flags) & FCOE_INFO_FLAG_MF_MODE_MASK) == FCOE_INFO_FLAG_MF_MODE_SD)
#define FCOE_INFO_IS_MF_MODE_SI(flags) \
    (((flags) & FCOE_INFO_FLAG_MF_MODE_MASK) == FCOE_INFO_FLAG_MF_MODE_SI)
#define FCOE_INFO_IS_MF_MODE_AFEX(flags) \
    (((flags) & FCOE_INFO_FLAG_MF_MODE_MASK) == FCOE_INFO_FLAG_MF_MODE_AFEX)

typedef struct bnxe_fcoe_info
{
    u32_t       flags;
    u32_t       max_fcoe_conn;
    u32_t       max_fcoe_exchanges;
    BnxeWwnInfo wwn;
} BnxeFcoeInfo;


typedef struct bnxe_fcoe_caps
{
    struct fcoe_capabilities fcoe_caps;
} BnxeFcoeCaps;


/*
 * cli_ctl - misc control interface up to the client
 *
 *  cmd: CLI_CTL_LINK_UP   - link up event, no data passed
 *       CLI_CTL_LINK_DOWN - link down event, no data passed
 *       CLI_CTL_UNLOAD    - graceful unload event, no data passed
 *
 *  pData:    pointer to command data or NULL
 *
 *  dataLen:  length of command data or 0
 */
#define CLI_CTL_LINK_UP    1
#define CLI_CTL_LINK_DOWN  2
#define CLI_CTL_UNLOAD     3
typedef boolean_t (*cli_ctl)(dev_info_t * pDev,
                             int          cmd,
                             void *       pData,
                             int          dataLen);

typedef boolean_t (*cli_indicate_tx)(dev_info_t * pDev,
                                     mblk_t *     pMblk);

typedef boolean_t (*cli_indicate_rx)(dev_info_t * pDev,
                                     mblk_t *     pMblk);

typedef boolean_t (*cli_indicate_cqes)(dev_info_t * pDev,
                                       void *       cqes[],
                                       int          cqeCnt);


/*
 * prv_ctl - misc control interface down to the provider
 *
 *  cmd: PRV_CTL_GET_MAC_ADDR      - get MAC Address, pass data buffer to hold addr
 *       PRV_CTL_SET_MAC_ADDR      - set MAC Address, pass data buffer contains addr
 *       PRV_CTL_QUERY_PARAMS      - query related params, pass BnxeXXXInfo struct
 *       PRV_CTL_DISABLE_INTR      - disable interrupts, no data passed
 *       PRV_CTL_ENABLE_INTR       - enable interrupts, no data passed
 *       PRV_CTL_MBA_BOOT          - check if MBA performed network boot
 *       PRV_CTL_LINK_STATE        - query the link state, pass boolean buffer
 *       PRV_CTL_BOARD_TYPE        - query the board type, pass string buffer
 *       PRV_CTL_BOARD_SERNUM      - query the board's serial number, pass string buffer
 *       PRV_CTL_BOOTCODE_VERSION  - query the MFW bootcode version, pass string buffer
 *       PRV_CTL_REPORT_FCOE_STATS - report FCoE stats, pass filled in fcoe_stats_info_t
 *       PRV_CTL_SET_CAPS          - report FCoE capabilities, pass filled in BnxeFcoeCaps struct
 *
 *  pData:    pointer to command data or NULL
 *
 *  dataLen:  length of command data or 0
 *
 *  returns:  TRUE upon success, FALSE otherwise
 */
#define PRV_CTL_GET_MAC_ADDR      1
#define PRV_CTL_SET_MAC_ADDR      2
#define PRV_CTL_QUERY_PARAMS      3
#define PRV_CTL_DISABLE_INTR      4
#define PRV_CTL_ENABLE_INTR       5
#define PRV_CTL_MBA_BOOT          6
#define PRV_CTL_LINK_STATE        7
#define PRV_CTL_BOARD_TYPE        8
#define PRV_CTL_BOARD_SERNUM      9
#define PRV_CTL_BOOTCODE_VERSION  10
#define PRV_CTL_REPORT_FCOE_STATS 11
#define PRV_CTL_SET_CAPS          12
typedef boolean_t (*prv_ctl)(dev_info_t * pDev,
                             int          cmd,
                             void *       pData,
                             int          dataLen);

#define PRV_TX_VLAN_TAG  1
typedef mblk_t * (*prv_tx)(dev_info_t * pDev,
                           mblk_t *     pMblk,
                           u32_t        flags,
                           u16_t        vlan_tag);

typedef boolean_t (*prv_poll)(dev_info_t * pDev);

typedef boolean_t (*prv_send_wqes)(dev_info_t * pDev,
                                   void *       wqes[],
                                   int          wqeCnt);

typedef boolean_t (*prv_map_mailboxq)(dev_info_t *       pDev,
                                      u32_t              cid,
                                      void **            ppMap,
                                      ddi_acc_handle_t * pAccHandle);

typedef boolean_t (*prv_unmap_mailboxq)(dev_info_t *     pDev,
                                        u32_t            cid,
                                        void *           pMap,
                                        ddi_acc_handle_t accHandle);


typedef struct bnxe_binding
{
    u32_t              version;

    dev_info_t *       pCliDev; /* bnxe client */

    cli_ctl            cliCtl;
    cli_indicate_tx    cliIndicateTx;
    cli_indicate_rx    cliIndicateRx;
    cli_indicate_cqes  cliIndicateCqes;

    u32_t              numRxDescs;
    u32_t              numTxDescs;

    dev_info_t *       pPrvDev; /* bnxe */

    prv_ctl            prvCtl;
    prv_tx             prvTx;
    prv_poll           prvPoll;
    prv_send_wqes      prvSendWqes;
    prv_map_mailboxq   prvMapMailboxq;
    prv_unmap_mailboxq prvUnmapMailboxq;
} BnxeBinding;

#endif /* __BNXE_BINDING_H */