#ifndef SRC_DRIVERS_INFINIBAND_FLEXBOOT_NODNIC_FLEXBOOT_NODNIC_H_ #define SRC_DRIVERS_INFINIBAND_FLEXBOOT_NODNIC_FLEXBOOT_NODNIC_H_ /* * Copyright (C) 2015 Mellanox Technologies Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ FILE_LICENCE ( GPL2_OR_LATER ); #include "mlx_nodnic/include/mlx_nodnic_data_structures.h" #include "nodnic_prm.h" #include #include #include #include "mlx_utils/mlx_lib/mlx_nvconfig/mlx_nvconfig.h" /* * If defined, use interrupts in NODNIC driver */ #define NODNIC_IRQ_ENABLED #define FLEXBOOT_NODNIC_MAX_PORTS 2 #define FLEXBOOT_NODNIC_PORT_BASE 1 #define FLEXBOOT_NODNIC_OPCODE_SEND 0xa #define FLEXBOOT_NODNIC_HCA_BAR PCI_BASE_ADDRESS_0 //BAR 0 #define FLEXBOOT_NODNIC_PAGE_SHIFT 12 #define FLEXBOOT_NODNIC_PAGE_SIZE (1 << FLEXBOOT_NODNIC_PAGE_SHIFT) #define FLEXBOOT_NODNIC_PAGE_MASK (FLEXBOOT_NODNIC_PAGE_SIZE - 1) #define EN_DEFAULT_ADMIN_MTU 1522 /* Port protocol */ enum flexboot_nodnic_protocol { FLEXBOOT_NODNIC_PROT_IB_IPV6 = 0, FLEXBOOT_NODNIC_PROT_ETH, FLEXBOOT_NODNIC_PROT_IB_IPV4, FLEXBOOT_NODNIC_PROT_FCOE }; /** A flexboot nodnic port */ struct flexboot_nodnic_port { /** Infiniband device */ struct ib_device *ibdev; /** Network device */ struct net_device *netdev; /** nodic port */ nodnic_port_priv port_priv; /** Port type */ struct flexboot_nodnic_port_type *type; /** Ethernet completion queue */ struct ib_completion_queue *eth_cq; /** Ethernet queue pair */ struct ib_queue_pair *eth_qp; mlx_uint8 cmdsn; }; /** A flexboot nodnic queue pair */ struct flexboot_nodnic_queue_pair { nodnic_qp *nodnic_queue_pair; }; /** A flexboot nodnic cq */ struct flexboot_nodnic_completion_queue { nodnic_cq *nodnic_completion_queue; }; /** A flexboot_nodnic device */ struct flexboot_nodnic { /** PCI device */ struct pci_device *pci; /** nic specific data*/ struct flexboot_nodnic_callbacks *callbacks; /**nodnic device*/ nodnic_device_priv device_priv; /**flexboot_nodnic ports*/ struct flexboot_nodnic_port port[FLEXBOOT_NODNIC_MAX_PORTS]; /** Device open request counter */ unsigned int open_count; /** Port masking */ u16 port_mask; /** device private data */ void *priv_data; }; /** A flexboot_nodnic port type */ struct flexboot_nodnic_port_type { /** Register port * * @v flexboot_nodnic flexboot_nodnic device * @v port flexboot_nodnic port * @ret mlx_status Return status code */ mlx_status ( * register_dev ) ( struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port ); /** Port state changed * * @v flexboot_nodnic flexboot_nodnic device * @v port flexboot_nodnic port * @v link_up Link is up */ void ( * state_change ) ( struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port, int link_up ); /** Unregister port * * @v flexboot_nodnic flexboot_nodnic device * @v port flexboot_nodnic port */ void ( * unregister_dev ) ( struct flexboot_nodnic *flexboot_nodnic, struct flexboot_nodnic_port *port ); }; struct cqe_data{ mlx_boolean owner; mlx_uint32 qpn; mlx_uint32 is_send; mlx_uint32 is_error; mlx_uint32 syndrome; mlx_uint32 vendor_err_syndrome; mlx_uint32 wqe_counter; mlx_uint32 byte_cnt; }; union arm_cq_uar { struct { //big endian mlx_uint32 reserved0 :2; mlx_uint32 cmdn :2; mlx_uint32 reserved1 :3; mlx_uint32 cmd :1; mlx_uint32 cq_ci :24; mlx_uint32 reserved2 :8; mlx_uint32 cq_n :24; }; mlx_uint32 dword[2]; mlx_uint64 qword; }; struct flexboot_nodnic_callbacks { mlx_status ( * fill_completion ) ( void *cqe, struct cqe_data *cqe_data ); mlx_status ( * cqe_set_owner ) ( void *cq, unsigned int num_cqes ); mlx_size ( * get_cqe_size ) (); mlx_status ( * fill_send_wqe[5] ) ( struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_address_vector *av, struct io_buffer *iobuf, struct nodnic_send_wqbb *wqbb, unsigned long wqe_idx ); void ( * irq ) ( struct net_device *netdev, int enable ); mlx_status ( * tx_uar_send_doorbell_fn ) ( struct ib_device *ibdev, struct nodnic_send_wqbb *wqbb ); }; int flexboot_nodnic_probe ( struct pci_device *pci, struct flexboot_nodnic_callbacks *callbacks, void *drv_priv ); void flexboot_nodnic_remove ( struct pci_device *pci ); void flexboot_nodnic_eth_irq ( struct net_device *netdev, int enable ); int flexboot_nodnic_is_supported ( struct pci_device *pci ); void flexboot_nodnic_copy_mac ( uint8_t mac_addr[], uint32_t low_byte, uint16_t high_byte ); int init_mlx_utils ( mlx_utils **utils, struct pci_device *pci ); void free_mlx_utils ( mlx_utils **utils ); #endif /* SRC_DRIVERS_INFINIBAND_FLEXBOOT_NODNIC_FLEXBOOT_NODNIC_H_ */