root/drivers/scsi/csiostor/csio_lnode.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * This file is part of the Chelsio FCoE driver for Linux.
   3  *
   4  * Copyright (c) 2008-2012 Chelsio Communications, Inc. All rights reserved.
   5  *
   6  * This software is available to you under a choice of one of two
   7  * licenses.  You may choose to be licensed under the terms of the GNU
   8  * General Public License (GPL) Version 2, available from the file
   9  * COPYING in the main directory of this source tree, or the
  10  * OpenIB.org BSD license below:
  11  *
  12  *     Redistribution and use in source and binary forms, with or
  13  *     without modification, are permitted provided that the following
  14  *     conditions are met:
  15  *
  16  *      - Redistributions of source code must retain the above
  17  *        copyright notice, this list of conditions and the following
  18  *        disclaimer.
  19  *
  20  *      - Redistributions in binary form must reproduce the above
  21  *        copyright notice, this list of conditions and the following
  22  *        disclaimer in the documentation and/or other materials
  23  *        provided with the distribution.
  24  *
  25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  26  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  27  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  28  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  29  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  30  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  31  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  32  * SOFTWARE.
  33  */
  34 
  35 #ifndef __CSIO_LNODE_H__
  36 #define __CSIO_LNODE_H__
  37 
  38 #include <linux/kref.h>
  39 #include <linux/timer.h>
  40 #include <linux/workqueue.h>
  41 #include <scsi/fc/fc_els.h>
  42 
  43 
  44 #include "csio_defs.h"
  45 #include "csio_hw.h"
  46 
  47 #define CSIO_FCOE_MAX_NPIV      128
  48 #define CSIO_FCOE_MAX_RNODES    2048
  49 
  50 /* FDMI port attribute unknown speed */
  51 #define CSIO_HBA_PORTSPEED_UNKNOWN      0x8000
  52 
  53 extern int csio_fcoe_rnodes;
  54 extern int csio_fdmi_enable;
  55 
  56 /* State machine evets */
  57 enum csio_ln_ev {
  58         CSIO_LNE_NONE = (uint32_t)0,
  59         CSIO_LNE_LINKUP,
  60         CSIO_LNE_FAB_INIT_DONE,
  61         CSIO_LNE_LINK_DOWN,
  62         CSIO_LNE_DOWN_LINK,
  63         CSIO_LNE_LOGO,
  64         CSIO_LNE_CLOSE,
  65         CSIO_LNE_MAX_EVENT,
  66 };
  67 
  68 
  69 struct csio_fcf_info {
  70         struct list_head        list;
  71         uint8_t                 priority;
  72         uint8_t                 mac[6];
  73         uint8_t                 name_id[8];
  74         uint8_t                 fabric[8];
  75         uint16_t                vf_id;
  76         uint8_t                 vlan_id;
  77         uint16_t                max_fcoe_size;
  78         uint8_t                 fc_map[3];
  79         uint32_t                fka_adv;
  80         uint32_t                fcfi;
  81         uint8_t                 get_next:1;
  82         uint8_t                 link_aff:1;
  83         uint8_t                 fpma:1;
  84         uint8_t                 spma:1;
  85         uint8_t                 login:1;
  86         uint8_t                 portid;
  87         uint8_t                 spma_mac[6];
  88         struct kref             kref;
  89 };
  90 
  91 /* Defines for flags */
  92 #define CSIO_LNF_FIPSUPP                0x00000001      /* Fip Supported */
  93 #define CSIO_LNF_NPIVSUPP               0x00000002      /* NPIV supported */
  94 #define CSIO_LNF_LINK_ENABLE            0x00000004      /* Link enabled */
  95 #define CSIO_LNF_FDMI_ENABLE            0x00000008      /* FDMI support */
  96 
  97 /* Transport events */
  98 enum csio_ln_fc_evt {
  99         CSIO_LN_FC_LINKUP = 1,
 100         CSIO_LN_FC_LINKDOWN,
 101         CSIO_LN_FC_RSCN,
 102         CSIO_LN_FC_ATTRIB_UPDATE,
 103 };
 104 
 105 /* Lnode stats */
 106 struct csio_lnode_stats {
 107         uint32_t        n_link_up;      /* Link down */
 108         uint32_t        n_link_down;    /* Link up */
 109         uint32_t        n_err;          /* error */
 110         uint32_t        n_err_nomem;    /* memory not available */
 111         uint32_t        n_inval_parm;   /* Invalid parameters */
 112         uint32_t        n_evt_unexp;    /* unexpected event */
 113         uint32_t        n_evt_drop;     /* dropped event */
 114         uint32_t        n_rnode_match;  /* matched rnode */
 115         uint32_t        n_dev_loss_tmo; /* Device loss timeout */
 116         uint32_t        n_fdmi_err;     /* fdmi err */
 117         uint32_t        n_evt_fw[PROTO_ERR_IMPL_LOGO + 1];      /* fw events */
 118         enum csio_ln_ev n_evt_sm[CSIO_LNE_MAX_EVENT];   /* State m/c events */
 119         uint32_t        n_rnode_alloc;  /* rnode allocated */
 120         uint32_t        n_rnode_free;   /* rnode freed */
 121         uint32_t        n_rnode_nomem;  /* rnode alloc failure */
 122         uint32_t        n_input_requests; /* Input Requests */
 123         uint32_t        n_output_requests; /* Output Requests */
 124         uint32_t        n_control_requests; /* Control Requests */
 125         uint32_t        n_input_bytes; /* Input Bytes */
 126         uint32_t        n_output_bytes; /* Output Bytes */
 127         uint32_t        rsvd1;
 128 };
 129 
 130 /* Common Lnode params */
 131 struct csio_lnode_params {
 132         uint32_t        ra_tov;
 133         uint32_t        fcfi;
 134         uint32_t        log_level;      /* Module level for debugging */
 135 };
 136 
 137 struct csio_service_parms {
 138         struct fc_els_csp       csp;            /* Common service parms */
 139         uint8_t                 wwpn[8];        /* WWPN */
 140         uint8_t                 wwnn[8];        /* WWNN */
 141         struct fc_els_cssp      clsp[4];        /* Class service params */
 142         uint8_t                 vvl[16];        /* Vendor version level */
 143 };
 144 
 145 /* Lnode */
 146 struct csio_lnode {
 147         struct csio_sm          sm;             /* State machine + sibling
 148                                                  * lnode list.
 149                                                  */
 150         struct csio_hw          *hwp;           /* Pointer to the HW module */
 151         uint8_t                 portid;         /* Port ID */
 152         uint8_t                 rsvd1;
 153         uint16_t                rsvd2;
 154         uint32_t                dev_num;        /* Device number */
 155         uint32_t                flags;          /* Flags */
 156         struct list_head        fcf_lsthead;    /* FCF entries */
 157         struct csio_fcf_info    *fcfinfo;       /* FCF in use */
 158         struct csio_ioreq       *mgmt_req;      /* MGMT request */
 159 
 160         /* FCoE identifiers */
 161         uint8_t                 mac[6];
 162         uint32_t                nport_id;
 163         struct csio_service_parms ln_sparm;     /* Service parms */
 164 
 165         /* Firmware identifiers */
 166         uint32_t                fcf_flowid;     /*fcf flowid */
 167         uint32_t                vnp_flowid;
 168         uint16_t                ssn_cnt;        /* Registered Session */
 169         uint8_t                 cur_evt;        /* Current event */
 170         uint8_t                 prev_evt;       /* Previous event */
 171 
 172         /* Children */
 173         struct list_head        cln_head;       /* Head of the children lnode
 174                                                  * list.
 175                                                  */
 176         uint32_t                num_vports;     /* Total NPIV/children LNodes*/
 177         struct csio_lnode       *pln;           /* Parent lnode of child
 178                                                  * lnodes.
 179                                                  */
 180         struct list_head        cmpl_q;         /* Pending I/Os on this lnode */
 181 
 182         /* Remote node information */
 183         struct list_head        rnhead;         /* Head of rnode list */
 184         uint32_t                num_reg_rnodes; /* Number of rnodes registered
 185                                                  * with the host.
 186                                                  */
 187         uint32_t                n_scsi_tgts;    /* Number of scsi targets
 188                                                  * found
 189                                                  */
 190         uint32_t                last_scan_ntgts;/* Number of scsi targets
 191                                                  * found per last scan.
 192                                                  */
 193         uint32_t                tgt_scan_tick;  /* timer started after
 194                                                  * new tgt found
 195                                                  */
 196         /* FC transport data */
 197         struct fc_vport         *fc_vport;
 198         struct fc_host_statistics fch_stats;
 199 
 200         struct csio_lnode_stats stats;          /* Common lnode stats */
 201         struct csio_lnode_params params;        /* Common lnode params */
 202 };
 203 
 204 #define csio_lnode_to_hw(ln)    ((ln)->hwp)
 205 #define csio_root_lnode(ln)     (csio_lnode_to_hw((ln))->rln)
 206 #define csio_parent_lnode(ln)   ((ln)->pln)
 207 #define csio_ln_flowid(ln)      ((ln)->vnp_flowid)
 208 #define csio_ln_wwpn(ln)        ((ln)->ln_sparm.wwpn)
 209 #define csio_ln_wwnn(ln)        ((ln)->ln_sparm.wwnn)
 210 
 211 #define csio_is_root_ln(ln)     (((ln) == csio_root_lnode((ln))) ? 1 : 0)
 212 #define csio_is_phys_ln(ln)     (((ln)->pln == NULL) ? 1 : 0)
 213 #define csio_is_npiv_ln(ln)     (((ln)->pln != NULL) ? 1 : 0)
 214 
 215 
 216 #define csio_ln_dbg(_ln, _fmt, ...)     \
 217         csio_dbg(_ln->hwp, "%x:%x "_fmt, CSIO_DEVID_HI(_ln), \
 218                  CSIO_DEVID_LO(_ln), ##__VA_ARGS__);
 219 
 220 #define csio_ln_err(_ln, _fmt, ...)     \
 221         csio_err(_ln->hwp, "%x:%x "_fmt, CSIO_DEVID_HI(_ln), \
 222                  CSIO_DEVID_LO(_ln), ##__VA_ARGS__);
 223 
 224 #define csio_ln_warn(_ln, _fmt, ...)    \
 225         csio_warn(_ln->hwp, "%x:%x "_fmt, CSIO_DEVID_HI(_ln), \
 226                  CSIO_DEVID_LO(_ln), ##__VA_ARGS__);
 227 
 228 /* HW->Lnode notifications */
 229 enum csio_ln_notify {
 230         CSIO_LN_NOTIFY_HWREADY = 1,
 231         CSIO_LN_NOTIFY_HWSTOP,
 232         CSIO_LN_NOTIFY_HWREMOVE,
 233         CSIO_LN_NOTIFY_HWRESET,
 234 };
 235 
 236 void csio_fcoe_fwevt_handler(struct csio_hw *,  __u8 cpl_op, __be64 *);
 237 int csio_is_lnode_ready(struct csio_lnode *);
 238 void csio_lnode_state_to_str(struct csio_lnode *ln, int8_t *str);
 239 struct csio_lnode *csio_lnode_lookup_by_wwpn(struct csio_hw *, uint8_t *);
 240 int csio_get_phy_port_stats(struct csio_hw *, uint8_t ,
 241                                       struct fw_fcoe_port_stats *);
 242 int csio_scan_done(struct csio_lnode *, unsigned long, unsigned long,
 243                    unsigned long, unsigned long);
 244 void csio_notify_lnodes(struct csio_hw *, enum csio_ln_notify);
 245 void csio_disable_lnodes(struct csio_hw *, uint8_t, bool);
 246 void csio_lnode_async_event(struct csio_lnode *, enum csio_ln_fc_evt);
 247 int csio_ln_fdmi_start(struct csio_lnode *, void *);
 248 int csio_lnode_start(struct csio_lnode *);
 249 void csio_lnode_stop(struct csio_lnode *);
 250 void csio_lnode_close(struct csio_lnode *);
 251 int csio_lnode_init(struct csio_lnode *, struct csio_hw *,
 252                               struct csio_lnode *);
 253 void csio_lnode_exit(struct csio_lnode *);
 254 
 255 #endif /* ifndef __CSIO_LNODE_H__ */

/* [<][>][^][v][top][bottom][index][help] */