linux/drivers/net/cnic_if.h
<<
>>
Prefs
   1/* cnic_if.h: Broadcom CNIC core network driver.
   2 *
   3 * Copyright (c) 2006 Broadcom Corporation
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation.
   8 *
   9 */
  10
  11
  12#ifndef CNIC_IF_H
  13#define CNIC_IF_H
  14
  15#define CNIC_MODULE_VERSION     "2.0.1"
  16#define CNIC_MODULE_RELDATE     "Oct 01, 2009"
  17
  18#define CNIC_ULP_RDMA           0
  19#define CNIC_ULP_ISCSI          1
  20#define CNIC_ULP_L4             2
  21#define MAX_CNIC_ULP_TYPE_EXT   2
  22#define MAX_CNIC_ULP_TYPE       3
  23
  24struct kwqe {
  25        u32 kwqe_op_flag;
  26
  27#define KWQE_OPCODE_MASK        0x00ff0000
  28#define KWQE_OPCODE_SHIFT       16
  29#define KWQE_FLAGS_LAYER_SHIFT  28
  30#define KWQE_OPCODE(x)          ((x & KWQE_OPCODE_MASK) >> KWQE_OPCODE_SHIFT)
  31
  32        u32 kwqe_info0;
  33        u32 kwqe_info1;
  34        u32 kwqe_info2;
  35        u32 kwqe_info3;
  36        u32 kwqe_info4;
  37        u32 kwqe_info5;
  38        u32 kwqe_info6;
  39};
  40
  41struct kwqe_16 {
  42        u32 kwqe_info0;
  43        u32 kwqe_info1;
  44        u32 kwqe_info2;
  45        u32 kwqe_info3;
  46};
  47
  48struct kcqe {
  49        u32 kcqe_info0;
  50        u32 kcqe_info1;
  51        u32 kcqe_info2;
  52        u32 kcqe_info3;
  53        u32 kcqe_info4;
  54        u32 kcqe_info5;
  55        u32 kcqe_info6;
  56        u32 kcqe_op_flag;
  57                #define KCQE_RAMROD_COMPLETION          (0x1<<27) /* Everest */
  58                #define KCQE_FLAGS_LAYER_MASK           (0x7<<28)
  59                #define KCQE_FLAGS_LAYER_MASK_MISC      (0<<28)
  60                #define KCQE_FLAGS_LAYER_MASK_L2        (2<<28)
  61                #define KCQE_FLAGS_LAYER_MASK_L3        (3<<28)
  62                #define KCQE_FLAGS_LAYER_MASK_L4        (4<<28)
  63                #define KCQE_FLAGS_LAYER_MASK_L5_RDMA   (5<<28)
  64                #define KCQE_FLAGS_LAYER_MASK_L5_ISCSI  (6<<28)
  65                #define KCQE_FLAGS_NEXT                 (1<<31)
  66                #define KCQE_FLAGS_OPCODE_MASK          (0xff<<16)
  67                #define KCQE_FLAGS_OPCODE_SHIFT         (16)
  68                #define KCQE_OPCODE(op)                 \
  69                (((op) & KCQE_FLAGS_OPCODE_MASK) >> KCQE_FLAGS_OPCODE_SHIFT)
  70};
  71
  72#define MAX_CNIC_CTL_DATA       64
  73#define MAX_DRV_CTL_DATA        64
  74
  75#define CNIC_CTL_STOP_CMD               1
  76#define CNIC_CTL_START_CMD              2
  77#define CNIC_CTL_COMPLETION_CMD         3
  78
  79#define DRV_CTL_IO_WR_CMD               0x101
  80#define DRV_CTL_IO_RD_CMD               0x102
  81#define DRV_CTL_CTX_WR_CMD              0x103
  82#define DRV_CTL_CTXTBL_WR_CMD           0x104
  83#define DRV_CTL_COMPLETION_CMD          0x105
  84
  85struct cnic_ctl_completion {
  86        u32     cid;
  87};
  88
  89struct drv_ctl_completion {
  90        u32     comp_count;
  91};
  92
  93struct cnic_ctl_info {
  94        int     cmd;
  95        union {
  96                struct cnic_ctl_completion comp;
  97                char bytes[MAX_CNIC_CTL_DATA];
  98        } data;
  99};
 100
 101struct drv_ctl_io {
 102        u32             cid_addr;
 103        u32             offset;
 104        u32             data;
 105        dma_addr_t      dma_addr;
 106};
 107
 108struct drv_ctl_info {
 109        int     cmd;
 110        union {
 111                struct drv_ctl_completion comp;
 112                struct drv_ctl_io io;
 113                char bytes[MAX_DRV_CTL_DATA];
 114        } data;
 115};
 116
 117struct cnic_ops {
 118        struct module   *cnic_owner;
 119        /* Calls to these functions are protected by RCU.  When
 120         * unregistering, we wait for any calls to complete before
 121         * continuing.
 122         */
 123        int             (*cnic_handler)(void *, void *);
 124        int             (*cnic_ctl)(void *, struct cnic_ctl_info *);
 125};
 126
 127#define MAX_CNIC_VEC    8
 128
 129struct cnic_irq {
 130        unsigned int    vector;
 131        void            *status_blk;
 132        u32             status_blk_num;
 133        u32             irq_flags;
 134#define CNIC_IRQ_FL_MSIX                0x00000001
 135};
 136
 137struct cnic_eth_dev {
 138        struct module   *drv_owner;
 139        u32             drv_state;
 140#define CNIC_DRV_STATE_REGD             0x00000001
 141#define CNIC_DRV_STATE_USING_MSIX       0x00000002
 142        u32             chip_id;
 143        u32             max_kwqe_pending;
 144        struct pci_dev  *pdev;
 145        void __iomem    *io_base;
 146
 147        u32             ctx_tbl_offset;
 148        u32             ctx_tbl_len;
 149        int             ctx_blk_size;
 150        u32             starting_cid;
 151        u32             max_iscsi_conn;
 152        u32             max_fcoe_conn;
 153        u32             max_rdma_conn;
 154        u32             reserved0[2];
 155
 156        int             num_irq;
 157        struct cnic_irq irq_arr[MAX_CNIC_VEC];
 158        int             (*drv_register_cnic)(struct net_device *,
 159                                             struct cnic_ops *, void *);
 160        int             (*drv_unregister_cnic)(struct net_device *);
 161        int             (*drv_submit_kwqes_32)(struct net_device *,
 162                                               struct kwqe *[], u32);
 163        int             (*drv_submit_kwqes_16)(struct net_device *,
 164                                               struct kwqe_16 *[], u32);
 165        int             (*drv_ctl)(struct net_device *, struct drv_ctl_info *);
 166        unsigned long   reserved1[2];
 167};
 168
 169struct cnic_sockaddr {
 170        union {
 171                struct sockaddr_in      v4;
 172                struct sockaddr_in6     v6;
 173        } local;
 174        union {
 175                struct sockaddr_in      v4;
 176                struct sockaddr_in6     v6;
 177        } remote;
 178};
 179
 180struct cnic_sock {
 181        struct cnic_dev *dev;
 182        void    *context;
 183        u32     src_ip[4];
 184        u32     dst_ip[4];
 185        u16     src_port;
 186        u16     dst_port;
 187        u16     vlan_id;
 188        unsigned char old_ha[6];
 189        unsigned char ha[6];
 190        u32     mtu;
 191        u32     cid;
 192        u32     l5_cid;
 193        u32     pg_cid;
 194        int     ulp_type;
 195
 196        u32     ka_timeout;
 197        u32     ka_interval;
 198        u8      ka_max_probe_count;
 199        u8      tos;
 200        u8      ttl;
 201        u8      snd_seq_scale;
 202        u32     rcv_buf;
 203        u32     snd_buf;
 204        u32     seed;
 205
 206        unsigned long   tcp_flags;
 207#define SK_TCP_NO_DELAY_ACK     0x1
 208#define SK_TCP_KEEP_ALIVE       0x2
 209#define SK_TCP_NAGLE            0x4
 210#define SK_TCP_TIMESTAMP        0x8
 211#define SK_TCP_SACK             0x10
 212#define SK_TCP_SEG_SCALING      0x20
 213        unsigned long   flags;
 214#define SK_F_INUSE              0
 215#define SK_F_OFFLD_COMPLETE     1
 216#define SK_F_OFFLD_SCHED        2
 217#define SK_F_PG_OFFLD_COMPLETE  3
 218#define SK_F_CONNECT_START      4
 219#define SK_F_IPV6               5
 220#define SK_F_CLOSING            7
 221
 222        atomic_t ref_count;
 223        u32 state;
 224        struct kwqe kwqe1;
 225        struct kwqe kwqe2;
 226        struct kwqe kwqe3;
 227};
 228
 229struct cnic_dev {
 230        struct net_device       *netdev;
 231        struct pci_dev          *pcidev;
 232        void __iomem            *regview;
 233        struct list_head        list;
 234
 235        int (*register_device)(struct cnic_dev *dev, int ulp_type,
 236                               void *ulp_ctx);
 237        int (*unregister_device)(struct cnic_dev *dev, int ulp_type);
 238        int (*submit_kwqes)(struct cnic_dev *dev, struct kwqe *wqes[],
 239                                u32 num_wqes);
 240        int (*submit_kwqes_16)(struct cnic_dev *dev, struct kwqe_16 *wqes[],
 241                                u32 num_wqes);
 242
 243        int (*cm_create)(struct cnic_dev *, int, u32, u32, struct cnic_sock **,
 244                         void *);
 245        int (*cm_destroy)(struct cnic_sock *);
 246        int (*cm_connect)(struct cnic_sock *, struct cnic_sockaddr *);
 247        int (*cm_abort)(struct cnic_sock *);
 248        int (*cm_close)(struct cnic_sock *);
 249        struct cnic_dev *(*cm_select_dev)(struct sockaddr_in *, int ulp_type);
 250        int (*iscsi_nl_msg_recv)(struct cnic_dev *dev, u32 msg_type,
 251                                 char *data, u16 data_size);
 252        unsigned long   flags;
 253#define CNIC_F_CNIC_UP          1
 254#define CNIC_F_BNX2_CLASS       3
 255#define CNIC_F_BNX2X_CLASS      4
 256        atomic_t        ref_count;
 257        u8              mac_addr[6];
 258
 259        int             max_iscsi_conn;
 260        int             max_fcoe_conn;
 261        int             max_rdma_conn;
 262
 263        void            *cnic_priv;
 264};
 265
 266#define CNIC_WR(dev, off, val)          writel(val, dev->regview + off)
 267#define CNIC_WR16(dev, off, val)        writew(val, dev->regview + off)
 268#define CNIC_WR8(dev, off, val)         writeb(val, dev->regview + off)
 269#define CNIC_RD(dev, off)               readl(dev->regview + off)
 270#define CNIC_RD16(dev, off)             readw(dev->regview + off)
 271
 272struct cnic_ulp_ops {
 273        /* Calls to these functions are protected by RCU.  When
 274         * unregistering, we wait for any calls to complete before
 275         * continuing.
 276         */
 277
 278        void (*cnic_init)(struct cnic_dev *dev);
 279        void (*cnic_exit)(struct cnic_dev *dev);
 280        void (*cnic_start)(void *ulp_ctx);
 281        void (*cnic_stop)(void *ulp_ctx);
 282        void (*indicate_kcqes)(void *ulp_ctx, struct kcqe *cqes[],
 283                                u32 num_cqes);
 284        void (*indicate_netevent)(void *ulp_ctx, unsigned long event);
 285        void (*cm_connect_complete)(struct cnic_sock *);
 286        void (*cm_close_complete)(struct cnic_sock *);
 287        void (*cm_abort_complete)(struct cnic_sock *);
 288        void (*cm_remote_close)(struct cnic_sock *);
 289        void (*cm_remote_abort)(struct cnic_sock *);
 290        void (*iscsi_nl_send_msg)(struct cnic_dev *dev, u32 msg_type,
 291                                  char *data, u16 data_size);
 292        struct module *owner;
 293        atomic_t ref_count;
 294};
 295
 296extern int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops);
 297
 298extern int cnic_unregister_driver(int ulp_type);
 299
 300extern struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev);
 301
 302#endif
 303
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.