xref: /linux/drivers/scsi/fnic/fip.h (revision 88e45067a30918ebb4942120892963e2311330af)
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 #ifndef _FIP_H_
7 #define _FIP_H_
8 
9 #include "fdls_fc.h"
10 #include "fnic_fdls.h"
11 #include <scsi/fc/fc_fip.h>
12 
13 /* Drop the cast from the standard definition */
14 #define FCOE_ALL_FCFS_MAC {0x01, 0x10, 0x18, 0x01, 0x00, 0x02}
15 #define FCOE_MAX_SIZE 0x082E
16 
17 #define FCOE_CTLR_FIPVLAN_TOV (3*1000)
18 #define FCOE_CTLR_FCS_TOV     (3*1000)
19 #define FCOE_CTLR_MAX_SOL      (5*1000)
20 
21 #define FIP_DISC_SOL_LEN (6)
22 #define FIP_VLAN_REQ_LEN (2)
23 #define FIP_ENODE_KA_LEN (2)
24 #define FIP_VN_KA_LEN (7)
25 #define FIP_FLOGI_LEN (38)
26 
27 enum fdls_vlan_state {
28 	FIP_VLAN_AVAIL,
29 	FIP_VLAN_SENT
30 };
31 
32 enum fdls_fip_state {
33 	FDLS_FIP_INIT,
34 	FDLS_FIP_VLAN_DISCOVERY_STARTED,
35 	FDLS_FIP_FCF_DISCOVERY_STARTED,
36 	FDLS_FIP_FLOGI_STARTED,
37 	FDLS_FIP_FLOGI_COMPLETE,
38 };
39 
40 /*
41  * VLAN entry.
42  */
43 struct fcoe_vlan {
44 	struct list_head list;
45 	uint16_t vid;		/* vlan ID */
46 	uint16_t sol_count;	/* no. of sols sent */
47 	uint16_t state;		/* state */
48 };
49 
50 struct fip_vlan_req {
51 	struct ethhdr eth;
52 	struct fip_header fip;
53 	struct fip_mac_desc mac_desc;
54 } __packed;
55 
56 struct fip_vlan_notif {
57 	struct fip_header fip;
58 	struct fip_vlan_desc vlans_desc[];
59 } __packed;
60 
61 struct fip_vn_port_ka {
62 	struct ethhdr eth;
63 	struct fip_header fip;
64 	struct fip_mac_desc mac_desc;
65 	struct fip_vn_desc vn_port_desc;
66 } __packed;
67 
68 struct fip_enode_ka {
69 	struct ethhdr eth;
70 	struct fip_header fip;
71 	struct fip_mac_desc mac_desc;
72 } __packed;
73 
74 struct fip_cvl {
75 	struct fip_header fip;
76 	struct fip_mac_desc fcf_mac_desc;
77 	struct fip_wwn_desc name_desc;
78 	struct fip_vn_desc vn_ports_desc[];
79 } __packed;
80 
81 struct fip_flogi_desc {
82 	struct fip_desc fd_desc;
83 	uint16_t rsvd;
84 	struct fc_std_flogi flogi;
85 } __packed;
86 
87 struct fip_flogi_rsp_desc {
88 	struct fip_desc fd_desc;
89 	uint16_t rsvd;
90 	struct fc_std_flogi flogi;
91 } __packed;
92 
93 struct fip_flogi {
94 	struct ethhdr eth;
95 	struct fip_header fip;
96 	struct fip_flogi_desc flogi_desc;
97 	struct fip_mac_desc mac_desc;
98 } __packed;
99 
100 struct fip_flogi_rsp {
101 	struct fip_header fip;
102 	struct fip_flogi_rsp_desc rsp_desc;
103 	struct fip_mac_desc mac_desc;
104 } __packed;
105 
106 struct fip_discovery {
107 	struct ethhdr eth;
108 	struct fip_header fip;
109 	struct fip_mac_desc mac_desc;
110 	struct fip_wwn_desc name_desc;
111 	struct fip_size_desc fcoe_desc;
112 } __packed;
113 
114 struct fip_disc_adv {
115 	struct fip_header fip;
116 	struct fip_pri_desc prio_desc;
117 	struct fip_mac_desc mac_desc;
118 	struct fip_wwn_desc name_desc;
119 	struct fip_fab_desc fabric_desc;
120 	struct fip_fka_desc fka_adv_desc;
121 } __packed;
122 
123 void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct fip_header *fiph);
124 void fnic_fcoe_fip_discovery_resp(struct fnic *fnic, struct fip_header *fiph);
125 void fnic_fcoe_process_flogi_resp(struct fnic *fnic, struct fip_header *fiph);
126 void fnic_work_on_fip_timer(struct work_struct *work);
127 void fnic_work_on_fcs_ka_timer(struct work_struct *work);
128 void fnic_fcoe_send_vlan_req(struct fnic *fnic);
129 void fnic_fcoe_start_fcf_discovery(struct fnic *fnic);
130 void fnic_fcoe_start_flogi(struct fnic *fnic);
131 void fnic_fcoe_process_cvl(struct fnic *fnic, struct fip_header *fiph);
132 void fnic_vlan_discovery_timeout(struct fnic *fnic);
133 
134 extern struct workqueue_struct *fnic_fip_queue;
135 
136 #ifdef FNIC_DEBUG
137 static inline void
fnic_debug_dump_fip_frame(struct fnic * fnic,struct ethhdr * eth,int len,char * pfx)138 fnic_debug_dump_fip_frame(struct fnic *fnic, struct ethhdr *eth,
139 				int len, char *pfx)
140 {
141 	struct fip_header *fiph = (struct fip_header *)(eth + 1);
142 	u16 op = be16_to_cpu(fiph->fip_op);
143 	u8 sub = fiph->fip_subcode;
144 
145 	FNIC_FCS_DBG(KERN_DEBUG, fnic->host, fnic->fnic_num,
146 		"FIP %s packet contents: op: 0x%x sub: 0x%x (len = %d)",
147 		pfx, op, sub, len);
148 
149 	fnic_debug_dump(fnic, (uint8_t *)eth, len);
150 }
151 
152 #else /* FNIC_DEBUG */
153 
154 static inline void
fnic_debug_dump_fip_frame(struct fnic * fnic,struct ethhdr * eth,int len,char * pfx)155 fnic_debug_dump_fip_frame(struct fnic *fnic, struct ethhdr *eth,
156 				int len, char *pfx) {}
157 #endif /* FNIC_DEBUG */
158 
159 #endif	/* _FIP_H_ */
160