File Index
Files and directories
Sign in
FILE

fnic_fdls.h

File preview with syntax highlighting.

linux-6.19.14/drivers/scsi/fnic/fnic_fdls.h C
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
  4 * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
  5 */
  6
  7#ifndef _FNIC_FDLS_H_
  8#define _FNIC_FDLS_H_
  9
 10#include "fnic_stats.h"
 11#include "fdls_fc.h"
 12
 13/* FDLS - Fabric discovery and login services
 14 * -> VLAN discovery
 15 *   -> retry every retry delay seconds until it succeeds.
 16 *                        <- List of VLANs
 17 *
 18 * -> Solicitation
 19 *                        <- Solicitation response (Advertisement)
 20 *
 21 * -> FCF selection & FLOGI ( FLOGI timeout - 2 * E_D_TOV)
 22 *                        <- FLOGI response
 23 *
 24 * -> FCF keep alive
 25 *                         <- FCF keep alive
 26 *
 27 * -> PLOGI to FFFFFC (DNS) (PLOGI timeout - 2 * R_A_TOV)
 28 *    -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
 29 *                        <- PLOGI response
 30 *    -> Retry PLOGI to FFFFFC (DNS) - Number of retries from vnic.cfg
 31 *
 32 * -> SCR to FFFFFC (DNS) (SCR timeout - 2 * R_A_TOV)
 33 *    -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
 34 *                        <- SCR response
 35 *    -> Retry SCR - Number of retries 2
 36 *
 37 * -> GPN_FT to FFFFFC (GPN_FT timeout - 2 * R_A_TOV)a
 38 *    -> Retry on BUSY until it succeeds
 39 *    -> Retry on BUSY until it succeeds
 40 *    -> 2 retries on timeout
 41 *
 42 * -> RFT_ID to FFFFFC (DNS)        (RFT_ID timeout - 3 * R_A_TOV)
 43 *    -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
 44 *    -> Retry RFT_ID to FFFFFC (DNS) (Number of retries 2 )
 45 *    -> Ignore if both retires fail.
 46 *
 47 *        Session establishment with targets
 48 * For each PWWN
 49 *   -> PLOGI to FCID of that PWWN (PLOGI timeout 2 * R_A_TOV)
 50 *    -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
 51 *                        <- PLOGI response
 52 *    -> Retry PLOGI. Num retries using vnic.cfg
 53 *
 54 *   -> PRLI to FCID of that PWWN (PRLI timeout 2 * R_A_TOV)
 55 *    -> ABTS if timeout (ABTS tomeout - 2 * R_A_TOV)
 56 *                        <- PRLI response
 57 *    -> Retry PRLI. Num retries using vnic.cfg
 58 *
 59 */
 60
 61#define FDLS_RETRY_COUNT 2
 62
 63/*
 64 * OXID encoding:
 65 * bits 0-8: oxid idx - allocated from poool
 66 * bits 9-13: oxid frame code from fnic_oxid_frame_type_e
 67 * bits 14-15: all zeros
 68 */
 69#define FNIC_OXID_POOL_SZ	(512)	/* always power of 2 */
 70#define FNIC_OXID_ENCODE(idx, frame_type)	(frame_type | idx)
 71#define FNIC_FRAME_MASK				0xFE00
 72#define FNIC_FRAME_TYPE(oxid)			(oxid & FNIC_FRAME_MASK)
 73#define FNIC_OXID_IDX(oxid)		((oxid) & (FNIC_OXID_POOL_SZ - 1))
 74
 75#define OXID_RECLAIM_TOV(iport) (2 * iport->r_a_tov) /* in milliseconds */
 76
 77#define FNIC_FDLS_FABRIC_ABORT_ISSUED     0x1
 78#define FNIC_FDLS_FPMA_LEARNT             0x2
 79
 80/* tport flags */
 81#define FNIC_FDLS_TPORT_IN_GPN_FT_LIST 0x1
 82#define FNIC_FDLS_TGT_ABORT_ISSUED     0x2
 83#define FNIC_FDLS_TPORT_SEND_ADISC     0x4
 84#define FNIC_FDLS_RETRY_FRAME          0x8
 85#define FNIC_FDLS_TPORT_BUSY	       0x10
 86#define FNIC_FDLS_TPORT_TERMINATING      0x20
 87#define FNIC_FDLS_TPORT_DELETED        0x40
 88#define FNIC_FDLS_SCSI_REGISTERED      0x200
 89
 90/* Retry supported by rport(returned by prli service parameters) */
 91#define FDLS_FC_RP_FLAGS_RETRY 0x1
 92
 93#define fdls_set_state(_fdls_fabric, _state)  ((_fdls_fabric)->state = _state)
 94#define fdls_get_state(_fdls_fabric)          ((_fdls_fabric)->state)
 95
 96#define FNIC_FDMI_ACTIVE    0x8
 97#define FNIC_FIRST_LINK_UP    0x2
 98
 99#define fdls_set_tport_state(_tport, _state)    (_tport->state = _state)
100#define fdls_get_tport_state(_tport)            (_tport->state)
101
102#define FNIC_PORTSPEED_10GBIT   1
103#define FNIC_FRAME_HT_ROOM     (2148)
104#define FNIC_FCOE_FRAME_MAXSZ   (2112)
105
106
107#define FNIC_FRAME_TYPE_FABRIC_FLOGI	0x1000
108#define FNIC_FRAME_TYPE_FABRIC_PLOGI	0x1200
109#define FNIC_FRAME_TYPE_FABRIC_RPN	0x1400
110#define FNIC_FRAME_TYPE_FABRIC_RFT	0x1600
111#define FNIC_FRAME_TYPE_FABRIC_RFF	0x1800
112#define FNIC_FRAME_TYPE_FABRIC_SCR	0x1A00
113#define FNIC_FRAME_TYPE_FABRIC_GPN_FT	0x1C00
114#define FNIC_FRAME_TYPE_FABRIC_LOGO	0x1E00
115#define FNIC_FRAME_TYPE_FDMI_PLOGI	0x2000
116#define FNIC_FRAME_TYPE_FDMI_RHBA	0x2200
117#define FNIC_FRAME_TYPE_FDMI_RPA	0x2400
118#define FNIC_FRAME_TYPE_TGT_PLOGI	0x2600
119#define FNIC_FRAME_TYPE_TGT_PRLI	0x2800
120#define FNIC_FRAME_TYPE_TGT_ADISC	0x2A00
121#define FNIC_FRAME_TYPE_TGT_LOGO	0x2C00
122
123struct fnic_fip_fcf_s {
124	uint16_t vlan_id;
125	uint8_t fcf_mac[6];
126	uint8_t fcf_priority;
127	uint32_t fka_adv_period;
128	uint8_t ka_disabled;
129};
130
131enum fnic_fdls_state_e {
132	FDLS_STATE_INIT = 0,
133	FDLS_STATE_LINKDOWN,
134	FDLS_STATE_FABRIC_LOGO,
135	FDLS_STATE_FLOGO_DONE,
136	FDLS_STATE_FABRIC_FLOGI,
137	FDLS_STATE_FABRIC_PLOGI,
138	FDLS_STATE_RPN_ID,
139	FDLS_STATE_REGISTER_FC4_TYPES,
140	FDLS_STATE_REGISTER_FC4_FEATURES,
141	FDLS_STATE_SCR,
142	FDLS_STATE_GPN_FT,
143	FDLS_STATE_TGT_DISCOVERY,
144	FDLS_STATE_RSCN_GPN_FT,
145	FDLS_STATE_SEND_GPNFT
146};
147
148struct fnic_fdls_fabric_s {
149	enum fnic_fdls_state_e state;
150	uint32_t flags;
151	struct list_head tport_list; /* List of discovered tports */
152	struct timer_list retry_timer;
153	int del_timer_inprogress;
154	int del_fdmi_timer_inprogress;
155	int retry_counter;
156	int timer_pending;
157	int fdmi_retry;
158	struct timer_list fdmi_timer;
159	int fdmi_pending;
160};
161
162struct fnic_fdls_fip_s {
163	uint32_t state;
164	uint32_t flogi_retry;
165};
166
167/* Message to tport_event_handler */
168enum fnic_tgt_msg_id {
169	TGT_EV_NONE = 0,
170	TGT_EV_RPORT_ADD,
171	TGT_EV_RPORT_DEL,
172	TGT_EV_TPORT_DELETE,
173	TGT_EV_REMOVE
174};
175
176struct fnic_tport_event_s {
177	struct list_head links;
178	enum fnic_tgt_msg_id event;
179	void *arg1;
180};
181
182enum fdls_tgt_state_e {
183	FDLS_TGT_STATE_INIT = 0,
184	FDLS_TGT_STATE_PLOGI,
185	FDLS_TGT_STATE_PRLI,
186	FDLS_TGT_STATE_READY,
187	FDLS_TGT_STATE_LOGO_RECEIVED,
188	FDLS_TGT_STATE_ADISC,
189	FDL_TGT_STATE_PLOGO,
190	FDLS_TGT_STATE_OFFLINING,
191	FDLS_TGT_STATE_OFFLINE
192};
193
194struct fnic_tport_s {
195	struct list_head links; /* To link the tports */
196	enum fdls_tgt_state_e state;
197	uint32_t flags;
198	uint32_t fcid;
199	uint64_t wwpn;
200	uint64_t wwnn;
201	uint16_t active_oxid;
202	uint16_t tgt_flags;
203	atomic_t in_flight; /* io counter */
204	uint16_t max_payload_size;
205	uint16_t r_a_tov;
206	uint16_t e_d_tov;
207	uint16_t lun0_delay;
208	int max_concur_seqs;
209	uint32_t fcp_csp;
210	struct timer_list retry_timer;
211	int del_timer_inprogress;
212	int retry_counter;
213	int timer_pending;
214	unsigned int num_pending_cmds;
215	int nexus_restart_count;
216	int exch_reset_in_progress;
217	void *iport;
218	struct work_struct tport_del_work;
219	struct completion *tport_del_done;
220	struct fc_rport *rport;
221	char str_wwpn[20];
222	char str_wwnn[20];
223};
224
225/* OXID pool related structures */
226struct reclaim_entry_s {
227	struct list_head links;
228	/* oxid that needs to be freed after 2*r_a_tov */
229	uint16_t oxid_idx;
230	/* in jiffies. Use this to waiting time */
231	unsigned long expires;
232	unsigned long *bitmap;
233};
234
235/* used for allocating oxids for fabric and fdmi requests */
236struct fnic_oxid_pool_s {
237	DECLARE_BITMAP(bitmap, FNIC_OXID_POOL_SZ);
238	int sz;			/* size of the pool or block */
239	int next_idx;		/* used for cycling through the oxid pool */
240
241	/* retry schedule free */
242	DECLARE_BITMAP(pending_schedule_free, FNIC_OXID_POOL_SZ);
243	struct delayed_work schedule_oxid_free_retry;
244
245	/* List of oxids that need to be freed and reclaimed.
246	 * This list is shared by all the oxid pools
247	 */
248	struct list_head oxid_reclaim_list;
249	/* Work associated with reclaim list */
250	struct delayed_work oxid_reclaim_work;
251};
252
253/* iport */
254enum fnic_iport_state_e {
255	FNIC_IPORT_STATE_INIT = 0,
256	FNIC_IPORT_STATE_LINK_WAIT,
257	FNIC_IPORT_STATE_FIP,
258	FNIC_IPORT_STATE_FABRIC_DISC,
259	FNIC_IPORT_STATE_READY
260};
261
262struct fnic_iport_s {
263	enum fnic_iport_state_e state;
264	struct fnic *fnic;
265	uint64_t boot_time;
266	uint32_t flags;
267	int usefip;
268	uint8_t hwmac[6]; /* HW MAC Addr */
269	uint8_t fpma[6]; /* Fabric Provided MA */
270	uint8_t fcfmac[6]; /* MAC addr of Fabric */
271	uint16_t vlan_id;
272	uint32_t fcid;
273
274	/* oxid pool */
275	struct fnic_oxid_pool_s oxid_pool;
276
277	/*
278	 * fabric reqs are serialized and only one req at a time.
279	 * Tracking the oxid for sending abort
280	 */
281	uint16_t active_oxid_fabric_req;
282	/* fdmi only */
283	uint16_t active_oxid_fdmi_plogi;
284	uint16_t active_oxid_fdmi_rhba;
285	uint16_t active_oxid_fdmi_rpa;
286
287	struct fnic_fip_fcf_s selected_fcf;
288	struct fnic_fdls_fip_s fip;
289	struct fnic_fdls_fabric_s fabric;
290	struct list_head tport_list;
291	struct list_head tport_list_pending_del;
292	/* list of tports for which we are yet to send PLOGO */
293	struct list_head inprocess_tport_list;
294	struct list_head deleted_tport_list;
295	struct work_struct tport_event_work;
296	uint32_t e_d_tov; /* msec */
297	uint32_t r_a_tov; /* msec */
298	uint32_t link_supported_speeds;
299	uint32_t max_flogi_retries;
300	uint32_t max_plogi_retries;
301	uint32_t plogi_timeout;
302	uint32_t service_params;
303	uint64_t wwpn;
304	uint64_t wwnn;
305	uint16_t max_payload_size;
306	spinlock_t deleted_tport_lst_lock;
307	struct completion *flogi_reg_done;
308	struct fnic_iport_stats iport_stats;
309	char str_wwpn[20];
310	char str_wwnn[20];
311};
312
313struct rport_dd_data_s {
314	struct fnic_tport_s *tport;
315	struct fnic_iport_s *iport;
316};
317
318enum fnic_recv_frame_type_e {
319	FNIC_FABRIC_FLOGI_RSP = 1,
320	FNIC_FABRIC_PLOGI_RSP,
321	FNIC_FABRIC_RPN_RSP,
322	FNIC_FABRIC_RFT_RSP,
323	FNIC_FABRIC_RFF_RSP,
324	FNIC_FABRIC_SCR_RSP,
325	FNIC_FABRIC_GPN_FT_RSP,
326	FNIC_FABRIC_BLS_ABTS_RSP,
327	FNIC_FDMI_PLOGI_RSP,
328	FNIC_FDMI_REG_HBA_RSP,
329	FNIC_FDMI_RPA_RSP,
330	FNIC_FDMI_BLS_ABTS_RSP,
331	FNIC_FABRIC_LOGO_RSP,
332
333	/* responses to target requests */
334	FNIC_TPORT_PLOGI_RSP,
335	FNIC_TPORT_PRLI_RSP,
336	FNIC_TPORT_ADISC_RSP,
337	FNIC_TPORT_BLS_ABTS_RSP,
338	FNIC_TPORT_LOGO_RSP,
339
340	/* unsolicited requests */
341	FNIC_BLS_ABTS_REQ,
342	FNIC_ELS_PLOGI_REQ,
343	FNIC_ELS_RSCN_REQ,
344	FNIC_ELS_LOGO_REQ,
345	FNIC_ELS_ECHO_REQ,
346	FNIC_ELS_ADISC,
347	FNIC_ELS_RLS,
348	FNIC_ELS_RRQ,
349	FNIC_ELS_UNSUPPORTED_REQ,
350};
351
352enum fnic_port_speeds {
353	DCEM_PORTSPEED_NONE = 0,
354	DCEM_PORTSPEED_1G = 1000,
355	DCEM_PORTSPEED_2G = 2000,
356	DCEM_PORTSPEED_4G = 4000,
357	DCEM_PORTSPEED_8G = 8000,
358	DCEM_PORTSPEED_10G = 10000,
359	DCEM_PORTSPEED_16G = 16000,
360	DCEM_PORTSPEED_20G = 20000,
361	DCEM_PORTSPEED_25G = 25000,
362	DCEM_PORTSPEED_32G = 32000,
363	DCEM_PORTSPEED_40G = 40000,
364	DCEM_PORTSPEED_4x10G = 41000,
365	DCEM_PORTSPEED_50G = 50000,
366	DCEM_PORTSPEED_64G = 64000,
367	DCEM_PORTSPEED_100G = 100000,
368	DCEM_PORTSPEED_128G = 128000,
369};
370
371/* Function Declarations */
372/* fdls_disc.c */
373void fnic_fdls_disc_init(struct fnic_iport_s *iport);
374void fnic_fdls_disc_start(struct fnic_iport_s *iport);
375void fnic_fdls_recv_frame(struct fnic_iport_s *iport, void *rx_frame,
376			  int len, int fchdr_offset);
377void fnic_fdls_link_down(struct fnic_iport_s *iport);
378int fdls_init_frame_pool(struct fnic_iport_s *iport);
379uint8_t *fdls_alloc_frame(struct fnic_iport_s *iport);
380uint16_t fdls_alloc_oxid(struct fnic_iport_s *iport, int oxid_frame_type,
381	uint16_t *active_oxid);
382void fdls_free_oxid(struct fnic_iport_s *iport,
383	uint16_t oxid, uint16_t *active_oxid);
384void fdls_tgt_logout(struct fnic_iport_s *iport,
385		     struct fnic_tport_s *tport);
386void fnic_del_fabric_timer_sync(struct fnic *fnic);
387void fnic_del_tport_timer_sync(struct fnic *fnic,
388							struct fnic_tport_s *tport);
389void fdls_send_fabric_logo(struct fnic_iport_s *iport);
390int fnic_fdls_validate_and_get_frame_type(struct fnic_iport_s *iport,
391	struct fc_frame_header *fchdr);
392void fdls_send_tport_abts(struct fnic_iport_s *iport,
393						struct fnic_tport_s *tport);
394bool fdls_delete_tport(struct fnic_iport_s *iport,
395		       struct fnic_tport_s *tport);
396void fdls_fdmi_timer_callback(struct timer_list *t);
397void fdls_fdmi_retry_plogi(struct fnic_iport_s *iport);
398
399/* fnic_fcs.c */
400void fnic_fdls_init(struct fnic *fnic, int usefip);
401void fnic_send_fcoe_frame(struct fnic_iport_s *iport, void *frame,
402	int frame_size);
403void fnic_fcoe_send_vlan_req(struct fnic *fnic);
404int fnic_send_fip_frame(struct fnic_iport_s *iport,
405	void *frame, int frame_size);
406void fnic_fdls_learn_fcoe_macs(struct fnic_iport_s *iport, void *rx_frame,
407	uint8_t *fcid);
408void fnic_fdls_add_tport(struct fnic_iport_s *iport,
409		struct fnic_tport_s *tport, unsigned long flags);
410void fnic_fdls_remove_tport(struct fnic_iport_s *iport,
411			    struct fnic_tport_s *tport,
412			    unsigned long flags);
413
414/* fip.c */
415void fnic_fcoe_send_vlan_req(struct fnic *fnic);
416void fnic_common_fip_cleanup(struct fnic *fnic);
417int fdls_fip_recv_frame(struct fnic *fnic, void *frame);
418void fnic_handle_fcs_ka_timer(struct timer_list *t);
419void fnic_handle_enode_ka_timer(struct timer_list *t);
420void fnic_handle_vn_ka_timer(struct timer_list *t);
421void fnic_handle_fip_timer(struct timer_list *t);
422extern void fdls_fabric_timer_callback(struct timer_list *t);
423
424/* fnic_scsi.c */
425void fnic_scsi_fcpio_reset(struct fnic *fnic);
426extern void fdls_fabric_timer_callback(struct timer_list *t);
427void fnic_rport_exch_reset(struct fnic *fnic, u32 fcid);
428int fnic_fdls_register_portid(struct fnic_iport_s *iport, u32 port_id,
429		void *fp);
430struct fnic_tport_s *fnic_find_tport_by_fcid(struct fnic_iport_s *iport,
431		uint32_t fcid);
432struct fnic_tport_s *fnic_find_tport_by_wwpn(struct fnic_iport_s *iport,
433		uint64_t  wwpn);
434
435#endif /* _FNIC_FDLS_H_ */
~/ Read-only file preview.