cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

csio_lnode.h (8170B)


      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
     53extern int csio_fcoe_rnodes;
     54extern int csio_fdmi_enable;
     55
     56/* State machine evets */
     57enum 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
     69struct 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 */
     98enum 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 */
    106struct 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 */
    131struct csio_lnode_params {
    132	uint32_t	ra_tov;
    133	uint32_t	fcfi;
    134	uint32_t	log_level;	/* Module level for debugging */
    135};
    136
    137struct 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 */
    146struct 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 */
    229enum 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
    236void csio_fcoe_fwevt_handler(struct csio_hw *,  __u8 cpl_op, __be64 *);
    237int csio_is_lnode_ready(struct csio_lnode *);
    238void csio_lnode_state_to_str(struct csio_lnode *ln, int8_t *str);
    239struct csio_lnode *csio_lnode_lookup_by_wwpn(struct csio_hw *, uint8_t *);
    240int csio_get_phy_port_stats(struct csio_hw *, uint8_t ,
    241				      struct fw_fcoe_port_stats *);
    242int csio_scan_done(struct csio_lnode *, unsigned long, unsigned long,
    243		   unsigned long, unsigned long);
    244void csio_notify_lnodes(struct csio_hw *, enum csio_ln_notify);
    245void csio_disable_lnodes(struct csio_hw *, uint8_t, bool);
    246void csio_lnode_async_event(struct csio_lnode *, enum csio_ln_fc_evt);
    247int csio_ln_fdmi_start(struct csio_lnode *, void *);
    248int csio_lnode_start(struct csio_lnode *);
    249void csio_lnode_stop(struct csio_lnode *);
    250void csio_lnode_close(struct csio_lnode *);
    251int csio_lnode_init(struct csio_lnode *, struct csio_hw *,
    252			      struct csio_lnode *);
    253void csio_lnode_exit(struct csio_lnode *);
    254
    255#endif /* ifndef __CSIO_LNODE_H__ */