390 lines · c
1/* cnic_if.h: QLogic cnic core network driver.2 *3 * Copyright (c) 2006-2014 Broadcom Corporation4 * Copyright (c) 2014-2015 QLogic Corporation5 *6 * This program is free software; you can redistribute it and/or modify7 * it under the terms of the GNU General Public License as published by8 * the Free Software Foundation.9 *10 */11 12 13#ifndef CNIC_IF_H14#define CNIC_IF_H15 16#include "bnx2x/bnx2x_mfw_req.h"17 18#define CNIC_MODULE_VERSION "2.5.22"19#define CNIC_MODULE_RELDATE "July 20, 2015"20 21#define CNIC_ULP_RDMA 022#define CNIC_ULP_ISCSI 123#define CNIC_ULP_FCOE 224#define CNIC_ULP_L4 325#define MAX_CNIC_ULP_TYPE_EXT 326#define MAX_CNIC_ULP_TYPE 427 28/* Use CPU native page size up to 16K for cnic ring sizes. */29#if (PAGE_SHIFT > 14)30#define CNIC_PAGE_BITS 1431#else32#define CNIC_PAGE_BITS PAGE_SHIFT33#endif34#define CNIC_PAGE_SIZE (1 << (CNIC_PAGE_BITS))35#define CNIC_PAGE_ALIGN(addr) ALIGN(addr, CNIC_PAGE_SIZE)36#define CNIC_PAGE_MASK (~((CNIC_PAGE_SIZE) - 1))37 38struct kwqe {39 u32 kwqe_op_flag;40 41#define KWQE_QID_SHIFT 842#define KWQE_OPCODE_MASK 0x00ff000043#define KWQE_OPCODE_SHIFT 1644#define KWQE_OPCODE(x) ((x & KWQE_OPCODE_MASK) >> KWQE_OPCODE_SHIFT)45#define KWQE_LAYER_MASK 0x7000000046#define KWQE_LAYER_SHIFT 2847#define KWQE_FLAGS_LAYER_MASK_L2 (2<<28)48#define KWQE_FLAGS_LAYER_MASK_L3 (3<<28)49#define KWQE_FLAGS_LAYER_MASK_L4 (4<<28)50#define KWQE_FLAGS_LAYER_MASK_L5_RDMA (5<<28)51#define KWQE_FLAGS_LAYER_MASK_L5_ISCSI (6<<28)52#define KWQE_FLAGS_LAYER_MASK_L5_FCOE (7<<28)53 54 u32 kwqe_info0;55 u32 kwqe_info1;56 u32 kwqe_info2;57 u32 kwqe_info3;58 u32 kwqe_info4;59 u32 kwqe_info5;60 u32 kwqe_info6;61};62 63struct kwqe_16 {64 u32 kwqe_info0;65 u32 kwqe_info1;66 u32 kwqe_info2;67 u32 kwqe_info3;68};69 70struct kcqe {71 u32 kcqe_info0;72 u32 kcqe_info1;73 u32 kcqe_info2;74 u32 kcqe_info3;75 u32 kcqe_info4;76 u32 kcqe_info5;77 u32 kcqe_info6;78 u32 kcqe_op_flag;79 #define KCQE_RAMROD_COMPLETION (0x1<<27) /* Everest */80 #define KCQE_FLAGS_LAYER_MASK (0x7<<28)81 #define KCQE_FLAGS_LAYER_MASK_MISC (0<<28)82 #define KCQE_FLAGS_LAYER_MASK_L2 (2<<28)83 #define KCQE_FLAGS_LAYER_MASK_L3 (3<<28)84 #define KCQE_FLAGS_LAYER_MASK_L4 (4<<28)85 #define KCQE_FLAGS_LAYER_MASK_L5_RDMA (5<<28)86 #define KCQE_FLAGS_LAYER_MASK_L5_ISCSI (6<<28)87 #define KCQE_FLAGS_LAYER_MASK_L5_FCOE (7<<28)88 #define KCQE_FLAGS_NEXT (1<<31)89 #define KCQE_FLAGS_OPCODE_MASK (0xff<<16)90 #define KCQE_FLAGS_OPCODE_SHIFT (16)91 #define KCQE_OPCODE(op) \92 (((op) & KCQE_FLAGS_OPCODE_MASK) >> KCQE_FLAGS_OPCODE_SHIFT)93};94 95#define MAX_CNIC_CTL_DATA 6496#define MAX_DRV_CTL_DATA 6497 98#define CNIC_CTL_STOP_CMD 199#define CNIC_CTL_START_CMD 2100#define CNIC_CTL_COMPLETION_CMD 3101#define CNIC_CTL_STOP_ISCSI_CMD 4102#define CNIC_CTL_FCOE_STATS_GET_CMD 5103#define CNIC_CTL_ISCSI_STATS_GET_CMD 6104 105#define DRV_CTL_IO_WR_CMD 0x101106#define DRV_CTL_IO_RD_CMD 0x102107#define DRV_CTL_CTX_WR_CMD 0x103108#define DRV_CTL_CTXTBL_WR_CMD 0x104109#define DRV_CTL_RET_L5_SPQ_CREDIT_CMD 0x105110#define DRV_CTL_START_L2_CMD 0x106111#define DRV_CTL_STOP_L2_CMD 0x107112#define DRV_CTL_RET_L2_SPQ_CREDIT_CMD 0x10c113#define DRV_CTL_ISCSI_STOPPED_CMD 0x10d114#define DRV_CTL_ULP_REGISTER_CMD 0x10e115#define DRV_CTL_ULP_UNREGISTER_CMD 0x10f116 117struct cnic_ctl_completion {118 u32 cid;119 u8 opcode;120 u8 error;121};122 123struct cnic_ctl_info {124 int cmd;125 union {126 struct cnic_ctl_completion comp;127 char bytes[MAX_CNIC_CTL_DATA];128 } data;129};130 131struct drv_ctl_spq_credit {132 u32 credit_count;133};134 135struct drv_ctl_io {136 u32 cid_addr;137 u32 offset;138 u32 data;139 dma_addr_t dma_addr;140};141 142struct drv_ctl_l2_ring {143 u32 client_id;144 u32 cid;145};146 147struct drv_ctl_register_data {148 int ulp_type;149 struct fcoe_capabilities fcoe_features;150};151 152struct drv_ctl_info {153 int cmd;154 int drv_state;155#define DRV_NOP 0156#define DRV_ACTIVE 1157#define DRV_INACTIVE 2158#define DRV_UNLOADED 3159 union {160 struct drv_ctl_spq_credit credit;161 struct drv_ctl_io io;162 struct drv_ctl_l2_ring ring;163 int ulp_type;164 struct drv_ctl_register_data register_data;165 char bytes[MAX_DRV_CTL_DATA];166 } data;167};168 169#define MAX_NPIV_ENTRIES 64170#define FC_NPIV_WWN_SIZE 8171 172struct cnic_fc_npiv_tbl {173 u8 wwpn[MAX_NPIV_ENTRIES][FC_NPIV_WWN_SIZE];174 u8 wwnn[MAX_NPIV_ENTRIES][FC_NPIV_WWN_SIZE];175 u32 count;176};177 178struct cnic_ops {179 struct module *cnic_owner;180 /* Calls to these functions are protected by RCU. When181 * unregistering, we wait for any calls to complete before182 * continuing.183 */184 int (*cnic_handler)(void *, void *);185 int (*cnic_ctl)(void *, struct cnic_ctl_info *);186};187 188#define MAX_CNIC_VEC 8189 190struct cnic_irq {191 unsigned int vector;192 void *status_blk;193 dma_addr_t status_blk_map;194 u32 status_blk_num;195 u32 status_blk_num2;196 u32 irq_flags;197#define CNIC_IRQ_FL_MSIX 0x00000001198};199 200struct cnic_eth_dev {201 struct module *drv_owner;202 u32 drv_state;203#define CNIC_DRV_STATE_REGD 0x00000001204#define CNIC_DRV_STATE_USING_MSIX 0x00000002205#define CNIC_DRV_STATE_NO_ISCSI_OOO 0x00000004206#define CNIC_DRV_STATE_NO_ISCSI 0x00000008207#define CNIC_DRV_STATE_NO_FCOE 0x00000010208#define CNIC_DRV_STATE_HANDLES_IRQ 0x00000020209 u32 chip_id;210 u32 max_kwqe_pending;211 struct pci_dev *pdev;212 void __iomem *io_base;213 void __iomem *io_base2;214 const void *iro_arr;215 216 u32 ctx_tbl_offset;217 u32 ctx_tbl_len;218 int ctx_blk_size;219 u32 starting_cid;220 u32 max_iscsi_conn;221 u32 max_fcoe_conn;222 u32 max_rdma_conn;223 u32 fcoe_init_cid;224 u32 max_fcoe_exchanges;225 u32 fcoe_wwn_port_name_hi;226 u32 fcoe_wwn_port_name_lo;227 u32 fcoe_wwn_node_name_hi;228 u32 fcoe_wwn_node_name_lo;229 230 u16 iscsi_l2_client_id;231 u16 iscsi_l2_cid;232 u8 iscsi_mac[ETH_ALEN];233 234 int num_irq;235 struct cnic_irq irq_arr[MAX_CNIC_VEC];236 int (*drv_register_cnic)(struct net_device *,237 struct cnic_ops *, void *);238 int (*drv_unregister_cnic)(struct net_device *);239 int (*drv_submit_kwqes_32)(struct net_device *,240 struct kwqe *[], u32);241 int (*drv_submit_kwqes_16)(struct net_device *,242 struct kwqe_16 *[], u32);243 int (*drv_ctl)(struct net_device *, struct drv_ctl_info *);244 int (*drv_get_fc_npiv_tbl)(struct net_device *,245 struct cnic_fc_npiv_tbl *);246 unsigned long reserved1[2];247 union drv_info_to_mcp *addr_drv_info_to_mcp;248};249 250struct cnic_sockaddr {251 union {252 struct sockaddr_in v4;253 struct sockaddr_in6 v6;254 } local;255 union {256 struct sockaddr_in v4;257 struct sockaddr_in6 v6;258 } remote;259};260 261struct cnic_sock {262 struct cnic_dev *dev;263 void *context;264 u32 src_ip[4];265 u32 dst_ip[4];266 u16 src_port;267 u16 dst_port;268 u16 vlan_id;269 unsigned char old_ha[ETH_ALEN];270 unsigned char ha[ETH_ALEN];271 u32 mtu;272 u32 cid;273 u32 l5_cid;274 u32 pg_cid;275 int ulp_type;276 277 u32 ka_timeout;278 u32 ka_interval;279 u8 ka_max_probe_count;280 u8 tos;281 u8 ttl;282 u8 snd_seq_scale;283 u32 rcv_buf;284 u32 snd_buf;285 u32 seed;286 287 unsigned long tcp_flags;288#define SK_TCP_NO_DELAY_ACK 0x1289#define SK_TCP_KEEP_ALIVE 0x2290#define SK_TCP_NAGLE 0x4291#define SK_TCP_TIMESTAMP 0x8292#define SK_TCP_SACK 0x10293#define SK_TCP_SEG_SCALING 0x20294 unsigned long flags;295#define SK_F_INUSE 0296#define SK_F_OFFLD_COMPLETE 1297#define SK_F_OFFLD_SCHED 2298#define SK_F_PG_OFFLD_COMPLETE 3299#define SK_F_CONNECT_START 4300#define SK_F_IPV6 5301#define SK_F_CLOSING 7302#define SK_F_HW_ERR 8303 304 atomic_t ref_count;305 u32 state;306 struct kwqe kwqe1;307 struct kwqe kwqe2;308 struct kwqe kwqe3;309};310 311struct cnic_dev {312 struct net_device *netdev;313 struct pci_dev *pcidev;314 void __iomem *regview;315 struct list_head list;316 317 int (*register_device)(struct cnic_dev *dev, int ulp_type,318 void *ulp_ctx);319 int (*unregister_device)(struct cnic_dev *dev, int ulp_type);320 int (*submit_kwqes)(struct cnic_dev *dev, struct kwqe *wqes[],321 u32 num_wqes);322 int (*submit_kwqes_16)(struct cnic_dev *dev, struct kwqe_16 *wqes[],323 u32 num_wqes);324 325 int (*cm_create)(struct cnic_dev *, int, u32, u32, struct cnic_sock **,326 void *);327 int (*cm_destroy)(struct cnic_sock *);328 int (*cm_connect)(struct cnic_sock *, struct cnic_sockaddr *);329 int (*cm_abort)(struct cnic_sock *);330 int (*cm_close)(struct cnic_sock *);331 struct cnic_dev *(*cm_select_dev)(struct sockaddr_in *, int ulp_type);332 int (*iscsi_nl_msg_recv)(struct cnic_dev *dev, u32 msg_type,333 char *data, u16 data_size);334 int (*get_fc_npiv_tbl)(struct cnic_dev *, struct cnic_fc_npiv_tbl *);335 unsigned long flags;336#define CNIC_F_CNIC_UP 1337#define CNIC_F_BNX2_CLASS 3338#define CNIC_F_BNX2X_CLASS 4339 atomic_t ref_count;340 u8 mac_addr[ETH_ALEN];341 342 int max_iscsi_conn;343 int max_fcoe_conn;344 int max_rdma_conn;345 346 int max_fcoe_exchanges;347 348 union drv_info_to_mcp *stats_addr;349 struct fcoe_capabilities *fcoe_cap;350 351 void *cnic_priv;352};353 354#define CNIC_WR(dev, off, val) writel(val, dev->regview + off)355#define CNIC_WR16(dev, off, val) writew(val, dev->regview + off)356#define CNIC_WR8(dev, off, val) writeb(val, dev->regview + off)357#define CNIC_RD(dev, off) readl(dev->regview + off)358#define CNIC_RD16(dev, off) readw(dev->regview + off)359 360struct cnic_ulp_ops {361 /* Calls to these functions are protected by RCU. When362 * unregistering, we wait for any calls to complete before363 * continuing.364 */365 366 void (*cnic_init)(struct cnic_dev *dev);367 void (*cnic_exit)(struct cnic_dev *dev);368 void (*cnic_start)(void *ulp_ctx);369 void (*cnic_stop)(void *ulp_ctx);370 void (*indicate_kcqes)(void *ulp_ctx, struct kcqe *cqes[],371 u32 num_cqes);372 void (*indicate_netevent)(void *ulp_ctx, unsigned long event, u16 vid);373 void (*cm_connect_complete)(struct cnic_sock *);374 void (*cm_close_complete)(struct cnic_sock *);375 void (*cm_abort_complete)(struct cnic_sock *);376 void (*cm_remote_close)(struct cnic_sock *);377 void (*cm_remote_abort)(struct cnic_sock *);378 int (*iscsi_nl_send_msg)(void *ulp_ctx, u32 msg_type,379 char *data, u16 data_size);380 int (*cnic_get_stats)(void *ulp_ctx);381 struct module *owner;382 atomic_t ref_count;383};384 385int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops);386 387int cnic_unregister_driver(int ulp_type);388 389#endif390