/*
* Copyright (c) 2016, Cavium Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Adam Dunkels.
* 4. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* qedi.h - qedi user space driver
*
*/
#ifndef __QEDI_H__
#define __QEDI_H__
#include "nic.h"
#define RX_RING_SIZE 15
#define PKT_BUF_SIZE 0X400
#define QEDI_PAGE_SIZE 4096
#define QEDI_UNKNOWN_MAJOR_VERSION -1
#define QEDI_UNKNOWN_MINOR_VERSION -1
#define QEDI_UNKNOWN_SUB_MINOR_VERSION -1
struct qedi_driver_version {
uint16_t major;
uint16_t minor;
uint16_t sub_minor;
};
#define QEDI_UCTRL_MAP_REG 0
#define QEDI_RING_MAP_REG 1
#define QEDI_BUF_MAP_REG 2
#define UIO_ATTR_TMPL "/sys/class/uio/uio%u/maps/map%u/%s"
#define UIO_ADDR_TMPL "/sys/class/uio/uio%u/maps/map%u/addr"
#define UIO_OFFSET_TMPL "/sys/class/uio/uio%u/maps/map%u/offset"
#define UIO_SIZE_TMPL "/sys/class/uio/uio%u/maps/map%u/size"
struct qedi_uio_ctrl {
/* meta data */
__u32 uio_hsi_version;
/* user writes */
__u32 host_tx_prod;
__u32 host_rx_cons;
__u32 host_rx_bd_cons;
__u32 host_tx_pkt_len;
__u32 host_rx_cons_cnt;
/* driver writes */
__u32 hw_tx_cons;
__u32 hw_rx_prod;
__u32 hw_rx_bd_prod;
__u32 hw_rx_prod_cnt;
/* other */
__u8 mac_addr[6];
__u8 reserve[2];
};
struct qedi_rx_bd {
__u32 rx_pkt_index;
__u32 rx_pkt_len;
__u16 vlan_id;
};
#define QEDI_RX_DESC_CNT (QEDI_PAGE_SIZE / sizeof(struct qedi_rx_bd))
#define QEDI_MAX_RX_DESC_CNT (QEDI_RX_DESC_CNT - 1)
#define QEDI_NUM_RX_BD (QEDI_RX_DESC_CNT * 1)
#define QEDI_MAX_RX_BD (QEDI_NUM_RX_BD - 1)
#define QEDI_NEXT_RX_IDX(x) ((((x) & (QEDI_MAX_RX_DESC_CNT)) == \
(QEDI_MAX_RX_DESC_CNT - 1)) ? \
(x) + 2 : (x) + 1)
#define QEDI_PATH_HANDLE 0xFE0000000
typedef struct qedi {
nic_t *parent;
struct qedi_driver_version version;
uint16_t flags;
#define CNIC_UIO_UNITIALIZED 0x0001
#define CNIC_UIO_INITIALIZED 0x0002
#define CNIC_UIO_ENABLED 0x0004
#define CNIC_UIO_DISABLED 0x0008
#define CNIC_UIO_IPv6_ENABLED 0x0010
#define CNIC_UIO_ADDED_MULICAST 0x0020
#define CNIC_UIO_MSIX_ENABLED 0x0200
#define CNIC_UIO_TX_HAS_SENT 0x0400
#define QEDI_OPENED 0x0800
__u32 chip_id;
int func;
int port;
int pfid;
__u32 cid;
__u32 client_id;
__u32 tx_prod;
__u32 tx_bd_prod;
__u32 tx_cons;
__u8 tx_vlan_tag_bit;
__u32 rx_prod;
__u32 rx_bd_prod;
__u32 rx_cons;
__u32 rx_bd_cons;
__u32 rx_hw_prod;
__u32 (*get_rx_cons)(struct qedi *);
__u32 (*get_tx_cons)(struct qedi *);
/* RX ring parameters */
uint32_t rx_ring_size;
uint32_t rx_buffer_size;
void *bufs; /* Pointer to the mapped buffer space */
void *uctrl_map; /* UIO control structure */
uint32_t uctrl_map_offset; /* UIO control structure mmap offset */
uint32_t rx_index;
void *rx_comp_ring;
void **rx_pkt_ring;
void *tx_pkt;
void *rx_pkts;
} qedi_t;
/******************************************************************************
* qedi Function Declarations
******************************************************************************/
void qedi_start_xmit(nic_t *nic, size_t len, u16_t vlan_id);
struct nic_ops *qedi_get_ops();
#endif /* __QEDI_H__ */