a000bc4e2d4ac50e1ad9d85ae61b2415f9d22c54
[linux-2.6.git] / drivers / scsi / bfa / include / defs / bfa_defs_pport.h
1 /*
2  * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
3  * All rights reserved
4  * www.brocade.com
5  *
6  * Linux driver for Brocade Fibre Channel Host Bus Adapter.
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License (GPL) Version 2 as
10  * published by the Free Software Foundation
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  */
17
18 #ifndef __BFA_DEFS_PPORT_H__
19 #define __BFA_DEFS_PPORT_H__
20
21 #include <bfa_os_inc.h>
22 #include <protocol/fc.h>
23 #include <defs/bfa_defs_types.h>
24 #include <defs/bfa_defs_qos.h>
25 #include <cna/pstats/phyport_defs.h>
26
27 /* Modify char* port_stt[] in bfal_port.c if a new state was added */
28 enum bfa_pport_states {
29         BFA_PPORT_ST_UNINIT             = 1,
30         BFA_PPORT_ST_ENABLING_QWAIT     = 2,
31         BFA_PPORT_ST_ENABLING           = 3,
32         BFA_PPORT_ST_LINKDOWN           = 4,
33         BFA_PPORT_ST_LINKUP             = 5,
34         BFA_PPORT_ST_DISABLING_QWAIT    = 6,
35         BFA_PPORT_ST_DISABLING          = 7,
36         BFA_PPORT_ST_DISABLED           = 8,
37         BFA_PPORT_ST_STOPPED            = 9,
38         BFA_PPORT_ST_IOCDOWN            = 10,
39         BFA_PPORT_ST_IOCDIS             = 11,
40         BFA_PPORT_ST_FWMISMATCH         = 12,
41         BFA_PPORT_ST_MAX_STATE,
42 };
43
44 /**
45  *      Port speed settings. Each specific speed is a bit field. Use multiple
46  *      bits to specify speeds to be selected for auto-negotiation.
47  */
48 enum bfa_pport_speed {
49         BFA_PPORT_SPEED_UNKNOWN = 0,
50         BFA_PPORT_SPEED_1GBPS   = 1,
51         BFA_PPORT_SPEED_2GBPS   = 2,
52         BFA_PPORT_SPEED_4GBPS   = 4,
53         BFA_PPORT_SPEED_8GBPS   = 8,
54         BFA_PPORT_SPEED_10GBPS  = 10,
55         BFA_PPORT_SPEED_AUTO =
56                 (BFA_PPORT_SPEED_1GBPS | BFA_PPORT_SPEED_2GBPS |
57                  BFA_PPORT_SPEED_4GBPS | BFA_PPORT_SPEED_8GBPS),
58 };
59
60 /**
61  *              Port operational type (in sync with SNIA port type).
62  */
63 enum bfa_pport_type {
64         BFA_PPORT_TYPE_UNKNOWN = 1,     /*  port type is unkown */
65         BFA_PPORT_TYPE_TRUNKED = 2,     /*  Trunked mode */
66         BFA_PPORT_TYPE_NPORT   = 5,     /*  P2P with switched fabric */
67         BFA_PPORT_TYPE_NLPORT  = 6,     /*  public loop */
68         BFA_PPORT_TYPE_LPORT   = 20,    /*  private loop */
69         BFA_PPORT_TYPE_P2P     = 21,    /*  P2P with no switched fabric */
70         BFA_PPORT_TYPE_VPORT   = 22,    /*  NPIV - virtual port */
71 };
72
73 /**
74  *              Port topology setting. A port's topology and fabric login status
75  *              determine its operational type.
76  */
77 enum bfa_pport_topology {
78         BFA_PPORT_TOPOLOGY_NONE = 0,    /*  No valid topology */
79         BFA_PPORT_TOPOLOGY_P2P  = 1,    /*  P2P only */
80         BFA_PPORT_TOPOLOGY_LOOP = 2,    /*  LOOP topology */
81         BFA_PPORT_TOPOLOGY_AUTO = 3,    /*  auto topology selection */
82 };
83
84 /**
85  *              Physical port loopback types.
86  */
87 enum bfa_pport_opmode {
88         BFA_PPORT_OPMODE_NORMAL   = 0x00, /*  normal non-loopback mode */
89         BFA_PPORT_OPMODE_LB_INT   = 0x01, /*  internal loop back */
90         BFA_PPORT_OPMODE_LB_SLW   = 0x02, /*  serial link wrapback (serdes) */
91         BFA_PPORT_OPMODE_LB_EXT   = 0x04, /*  external loop back (serdes) */
92         BFA_PPORT_OPMODE_LB_CBL   = 0x08, /*  cabled loop back */
93         BFA_PPORT_OPMODE_LB_NLINT = 0x20, /*  NL_Port internal loopback */
94 };
95
96 #define BFA_PPORT_OPMODE_LB_HARD(_mode)                 \
97         ((_mode == BFA_PPORT_OPMODE_LB_INT) ||          \
98      (_mode == BFA_PPORT_OPMODE_LB_SLW) ||              \
99      (_mode == BFA_PPORT_OPMODE_LB_EXT))
100
101 /**
102                 Port State (in sync with SNIA port state).
103  */
104 enum bfa_pport_snia_state {
105         BFA_PPORT_STATE_UNKNOWN  = 1,   /*  port is not initialized */
106         BFA_PPORT_STATE_ONLINE   = 2,   /*  port is ONLINE */
107         BFA_PPORT_STATE_DISABLED = 3,   /*  port is disabled by user */
108         BFA_PPORT_STATE_BYPASSED = 4,   /*  port is bypassed (in LOOP) */
109         BFA_PPORT_STATE_DIAG     = 5,   /*  port diagnostics is active */
110         BFA_PPORT_STATE_LINKDOWN = 6,   /*  link is down */
111         BFA_PPORT_STATE_LOOPBACK = 8,   /*  port is looped back */
112 };
113
114 /**
115  *              Port link state
116  */
117 enum bfa_pport_linkstate {
118         BFA_PPORT_LINKUP         = 1,   /*  Physical port/Trunk link up */
119         BFA_PPORT_LINKDOWN       = 2,   /*  Physical port/Trunk link down */
120         BFA_PPORT_TRUNK_LINKDOWN = 3,   /*  Trunk link down (new tmaster) */
121 };
122
123 /**
124  *              Port link state event
125  */
126 #define bfa_pport_event_t enum bfa_pport_linkstate
127
128 /**
129  *              Port link state reason code
130  */
131 enum bfa_pport_linkstate_rsn {
132         BFA_PPORT_LINKSTATE_RSN_NONE            = 0,
133         BFA_PPORT_LINKSTATE_RSN_DISABLED        = 1,
134         BFA_PPORT_LINKSTATE_RSN_RX_NOS          = 2,
135         BFA_PPORT_LINKSTATE_RSN_RX_OLS          = 3,
136         BFA_PPORT_LINKSTATE_RSN_RX_LIP          = 4,
137         BFA_PPORT_LINKSTATE_RSN_RX_LIPF7        = 5,
138         BFA_PPORT_LINKSTATE_RSN_SFP_REMOVED     = 6,
139         BFA_PPORT_LINKSTATE_RSN_PORT_FAULT      = 7,
140         BFA_PPORT_LINKSTATE_RSN_RX_LOS          = 8,
141         BFA_PPORT_LINKSTATE_RSN_LOCAL_FAULT     = 9,
142         BFA_PPORT_LINKSTATE_RSN_REMOTE_FAULT    = 10,
143         BFA_PPORT_LINKSTATE_RSN_TIMEOUT         = 11,
144
145
146
147         /* CEE related reason codes/errors */
148         CEE_LLDP_INFO_AGED_OUT       = 20,
149         CEE_LLDP_SHUTDOWN_TLV_RCVD   = 21,
150         CEE_PEER_NOT_ADVERTISE_DCBX  = 22,
151         CEE_PEER_NOT_ADVERTISE_PG    = 23,
152         CEE_PEER_NOT_ADVERTISE_PFC   = 24,
153         CEE_PEER_NOT_ADVERTISE_FCOE  = 25,
154         CEE_PG_NOT_COMPATIBLE        = 26,
155         CEE_PFC_NOT_COMPATIBLE       = 27,
156         CEE_FCOE_NOT_COMPATIBLE      = 28,
157         CEE_BAD_PG_RCVD              = 29,
158         CEE_BAD_BW_RCVD              = 30,
159         CEE_BAD_PFC_RCVD             = 31,
160         CEE_BAD_FCOE_PRI_RCVD        = 32,
161         CEE_FCOE_PRI_PFC_OFF         = 33,
162         CEE_DUP_CONTROL_TLV_RCVD     = 34,
163         CEE_DUP_FEAT_TLV_RCVD        = 35,
164         CEE_APPLY_NEW_CFG            = 36,      /* reason, not an error */
165         CEE_PROTOCOL_INIT            = 37,  /* reason, not an error */
166         CEE_PHY_LINK_DOWN            = 38,
167         CEE_LLS_FCOE_ABSENT          = 39,
168         CEE_LLS_FCOE_DOWN            = 40
169 };
170
171 /**
172  *      Default Target Rate Limiting Speed.
173  */
174 #define BFA_PPORT_DEF_TRL_SPEED  BFA_PPORT_SPEED_1GBPS
175
176 /**
177  *      Physical port configuration
178  */
179 struct bfa_pport_cfg_s {
180         u8         topology;    /*  bfa_pport_topology          */
181         u8         speed;               /*  enum bfa_pport_speed        */
182         u8         trunked;     /*  trunked or not              */
183         u8         qos_enabled; /*  qos enabled or not          */
184         u8         trunk_ports; /*  bitmap of trunked ports     */
185         u8         cfg_hardalpa;        /*  is hard alpa configured     */
186         u16        maxfrsize;   /*  maximum frame size          */
187         u8         hardalpa;    /*  configured hard alpa        */
188         u8         rx_bbcredit; /*  receive buffer credits      */
189         u8         tx_bbcredit; /*  transmit buffer credits     */
190         u8         ratelimit;   /*  ratelimit enabled or not    */
191         u8         trl_def_speed;       /*  ratelimit default speed     */
192         u8              rsvd[3];
193         u16     path_tov;       /*  device path timeout */
194         u16     q_depth;        /*  SCSI Queue depth            */
195 };
196
197 /**
198  *              Port attribute values.
199  */
200 struct bfa_pport_attr_s {
201         /*
202          * Static fields
203          */
204         wwn_t           nwwn;           /*  node wwn */
205         wwn_t           pwwn;           /*  port wwn */
206         enum fc_cos     cos_supported;  /*  supported class of services */
207         u32        rsvd;
208         struct fc_symname_s    port_symname;    /*  port symbolic name */
209         enum bfa_pport_speed speed_supported; /*  supported speeds */
210         bfa_boolean_t   pbind_enabled;  /*  Will be set if Persistent binding
211                                          *   enabled. Relevant only in Windows
212                                          */
213
214         /*
215          * Configured values
216          */
217         struct bfa_pport_cfg_s pport_cfg;       /*  pport cfg */
218
219         /*
220          * Dynamic field - info from BFA
221          */
222         enum bfa_pport_states   port_state;     /*  current port state */
223         enum bfa_pport_speed    speed;          /*  current speed */
224         enum bfa_pport_topology         topology;       /*  current topology */
225         bfa_boolean_t           beacon;         /*  current beacon status */
226         bfa_boolean_t           link_e2e_beacon;/*  set if link beacon on */
227         bfa_boolean_t           plog_enabled;   /*  set if portlog is enabled*/
228
229         /*
230          * Dynamic field - info from FCS
231          */
232         u32             pid;            /*  port ID */
233         enum bfa_pport_type     port_type;      /*  current topology */
234         u32             loopback;       /*  external loopback */
235         u32             rsvd1;
236         u32             rsvd2;          /*  padding for 64 bit */
237 };
238
239 /**
240  *              FC Port statistics.
241  */
242 struct bfa_pport_fc_stats_s {
243         u64        secs_reset;  /*  seconds since stats is reset */
244         u64        tx_frames;   /*  transmitted frames */
245         u64        tx_words;    /*  transmitted words */
246         u64        rx_frames;   /*  received frames */
247         u64        rx_words;    /*  received words */
248         u64        lip_count;   /*  LIPs seen */
249         u64        nos_count;   /*  NOS count */
250         u64        error_frames;        /*  errored frames (sent?) */
251         u64        dropped_frames;      /*  dropped frames */
252         u64        link_failures;       /*  link failure count */
253         u64        loss_of_syncs;       /*  loss of sync count */
254         u64        loss_of_signals;/*  loss of signal count */
255         u64        primseq_errs;        /*  primitive sequence protocol */
256         u64        bad_os_count;        /*  invalid ordered set */
257         u64        err_enc_out; /*  Encoding error outside frame */
258         u64        invalid_crcs;        /*  frames received with invalid CRC*/
259         u64     undersized_frm; /*  undersized frames */
260         u64     oversized_frm;  /*  oversized frames */
261         u64     bad_eof_frm;    /*  frames with bad EOF */
262         struct bfa_qos_stats_s  qos_stats;      /*  QoS statistics */
263 };
264
265 /**
266  *              Eth Port statistics.
267  */
268 struct bfa_pport_eth_stats_s {
269         u64     secs_reset;     /*  seconds since stats is reset */
270         u64     frame_64;      /*  both rx and tx counter */
271         u64     frame_65_127;      /* both rx and tx counter */
272         u64     frame_128_255;     /* both rx and tx counter */
273         u64     frame_256_511;     /* both rx and tx counter */
274         u64     frame_512_1023;    /* both rx and tx counter */
275         u64     frame_1024_1518;   /* both rx and tx counter */
276         u64     frame_1519_1522;   /* both rx and tx counter */
277
278         u64     tx_bytes;
279         u64     tx_packets;
280         u64     tx_mcast_packets;
281         u64     tx_bcast_packets;
282         u64     tx_control_frame;
283         u64     tx_drop;
284         u64     tx_jabber;
285         u64     tx_fcs_error;
286         u64     tx_fragments;
287
288         u64     rx_bytes;
289         u64     rx_packets;
290         u64     rx_mcast_packets;
291         u64     rx_bcast_packets;
292         u64     rx_control_frames;
293         u64     rx_unknown_opcode;
294         u64     rx_drop;
295         u64     rx_jabber;
296         u64     rx_fcs_error;
297         u64     rx_alignment_error;
298         u64     rx_frame_length_error;
299         u64     rx_code_error;
300         u64     rx_fragments;
301
302         u64     rx_pause; /* BPC */
303         u64     rx_zero_pause; /*  BPC Pause cancellation */
304         u64     tx_pause;      /* BPC */
305         u64     tx_zero_pause; /*  BPC Pause cancellation */
306         u64     rx_fcoe_pause; /* BPC */
307         u64     rx_fcoe_zero_pause; /*  BPC Pause cancellation */
308         u64     tx_fcoe_pause;      /* BPC */
309         u64     tx_fcoe_zero_pause; /*  BPC Pause cancellation */
310 };
311
312 /**
313  *              Port statistics.
314  */
315 union bfa_pport_stats_u {
316         struct bfa_pport_fc_stats_s     fc;
317         struct bfa_pport_eth_stats_s    eth;
318 };
319
320 /**
321  *              Port FCP mappings.
322  */
323 struct bfa_pport_fcpmap_s {
324         char            osdevname[256];
325         u32     bus;
326         u32        target;
327         u32        oslun;
328         u32        fcid;
329         wwn_t           nwwn;
330         wwn_t           pwwn;
331         u64        fcplun;
332         char            luid[256];
333 };
334
335 /**
336  *              Port RNID info.
337  */
338 struct bfa_pport_rnid_s {
339         wwn_t             wwn;
340         u32          unittype;
341         u32          portid;
342         u32          attached_nodes_num;
343         u16          ip_version;
344         u16          udp_port;
345         u8           ipaddr[16];
346         u16          rsvd;
347         u16          topologydiscoveryflags;
348 };
349
350 /**
351  *              Link state information
352  */
353 struct bfa_pport_link_s {
354         u8         linkstate;   /*  Link state bfa_pport_linkstate */
355         u8         linkstate_rsn;       /*  bfa_pport_linkstate_rsn_t */
356         u8         topology;    /*  P2P/LOOP bfa_pport_topology */
357         u8         speed;               /*  Link speed (1/2/4/8 G) */
358         u32        linkstate_opt;       /*  Linkstate optional data (debug) */
359         u8         trunked;     /*  Trunked or not (1 or 0) */
360         u8         resvd[3];
361         struct bfa_qos_attr_s  qos_attr;   /* QoS Attributes */
362         struct bfa_qos_vc_attr_s qos_vc_attr;  /*  VC info from ELP */
363         union {
364                 struct {
365                         u8         tmaster;/*  Trunk Master or
366                                                  *    not (1 or 0) */
367                         u8         tlinks;      /*  Trunk links bitmap
368                                                  *    (linkup) */
369                         u8         resv1;       /*  Reserved */
370                 } trunk_info;
371
372                 struct {
373                         u8         myalpa;         /*  alpa claimed */
374                         u8         login_req; /*  Login required or
375                                                     *    not (1 or 0) */
376                         u8         alpabm_val;/*  alpa bitmap valid
377                                                     *    or not (1 or 0) */
378                         struct fc_alpabm_s     alpabm;     /*  alpa bitmap */
379                 } loop_info;
380         } tl;
381 };
382
383 #endif /* __BFA_DEFS_PPORT_H__ */