xref: /linux/drivers/scsi/fnic/fip.h (revision 88e45067a30918ebb4942120892963e2311330af)
1098585aaSKaran Tilak Kumar /* SPDX-License-Identifier: GPL-2.0-only */
2098585aaSKaran Tilak Kumar /*
3098585aaSKaran Tilak Kumar  * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
4098585aaSKaran Tilak Kumar  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
5098585aaSKaran Tilak Kumar  */
6098585aaSKaran Tilak Kumar #ifndef _FIP_H_
7098585aaSKaran Tilak Kumar #define _FIP_H_
8098585aaSKaran Tilak Kumar 
9098585aaSKaran Tilak Kumar #include "fdls_fc.h"
10098585aaSKaran Tilak Kumar #include "fnic_fdls.h"
11098585aaSKaran Tilak Kumar #include <scsi/fc/fc_fip.h>
12098585aaSKaran Tilak Kumar 
13098585aaSKaran Tilak Kumar /* Drop the cast from the standard definition */
14098585aaSKaran Tilak Kumar #define FCOE_ALL_FCFS_MAC {0x01, 0x10, 0x18, 0x01, 0x00, 0x02}
15098585aaSKaran Tilak Kumar #define FCOE_MAX_SIZE 0x082E
16098585aaSKaran Tilak Kumar 
17098585aaSKaran Tilak Kumar #define FCOE_CTLR_FIPVLAN_TOV (3*1000)
18098585aaSKaran Tilak Kumar #define FCOE_CTLR_FCS_TOV     (3*1000)
19098585aaSKaran Tilak Kumar #define FCOE_CTLR_MAX_SOL      (5*1000)
20098585aaSKaran Tilak Kumar 
21098585aaSKaran Tilak Kumar #define FIP_DISC_SOL_LEN (6)
22098585aaSKaran Tilak Kumar #define FIP_VLAN_REQ_LEN (2)
23098585aaSKaran Tilak Kumar #define FIP_ENODE_KA_LEN (2)
24098585aaSKaran Tilak Kumar #define FIP_VN_KA_LEN (7)
25098585aaSKaran Tilak Kumar #define FIP_FLOGI_LEN (38)
26098585aaSKaran Tilak Kumar 
27098585aaSKaran Tilak Kumar enum fdls_vlan_state {
28098585aaSKaran Tilak Kumar 	FIP_VLAN_AVAIL,
29098585aaSKaran Tilak Kumar 	FIP_VLAN_SENT
30098585aaSKaran Tilak Kumar };
31098585aaSKaran Tilak Kumar 
32098585aaSKaran Tilak Kumar enum fdls_fip_state {
33098585aaSKaran Tilak Kumar 	FDLS_FIP_INIT,
34098585aaSKaran Tilak Kumar 	FDLS_FIP_VLAN_DISCOVERY_STARTED,
35098585aaSKaran Tilak Kumar 	FDLS_FIP_FCF_DISCOVERY_STARTED,
36098585aaSKaran Tilak Kumar 	FDLS_FIP_FLOGI_STARTED,
37098585aaSKaran Tilak Kumar 	FDLS_FIP_FLOGI_COMPLETE,
38098585aaSKaran Tilak Kumar };
39098585aaSKaran Tilak Kumar 
40098585aaSKaran Tilak Kumar /*
41098585aaSKaran Tilak Kumar  * VLAN entry.
42098585aaSKaran Tilak Kumar  */
43098585aaSKaran Tilak Kumar struct fcoe_vlan {
44098585aaSKaran Tilak Kumar 	struct list_head list;
45098585aaSKaran Tilak Kumar 	uint16_t vid;		/* vlan ID */
46098585aaSKaran Tilak Kumar 	uint16_t sol_count;	/* no. of sols sent */
47098585aaSKaran Tilak Kumar 	uint16_t state;		/* state */
48098585aaSKaran Tilak Kumar };
49098585aaSKaran Tilak Kumar 
50098585aaSKaran Tilak Kumar struct fip_vlan_req {
51098585aaSKaran Tilak Kumar 	struct ethhdr eth;
52098585aaSKaran Tilak Kumar 	struct fip_header fip;
53098585aaSKaran Tilak Kumar 	struct fip_mac_desc mac_desc;
54098585aaSKaran Tilak Kumar } __packed;
55098585aaSKaran Tilak Kumar 
56098585aaSKaran Tilak Kumar struct fip_vlan_notif {
57098585aaSKaran Tilak Kumar 	struct fip_header fip;
58098585aaSKaran Tilak Kumar 	struct fip_vlan_desc vlans_desc[];
59098585aaSKaran Tilak Kumar } __packed;
60098585aaSKaran Tilak Kumar 
61098585aaSKaran Tilak Kumar struct fip_vn_port_ka {
62098585aaSKaran Tilak Kumar 	struct ethhdr eth;
63098585aaSKaran Tilak Kumar 	struct fip_header fip;
64098585aaSKaran Tilak Kumar 	struct fip_mac_desc mac_desc;
65098585aaSKaran Tilak Kumar 	struct fip_vn_desc vn_port_desc;
66098585aaSKaran Tilak Kumar } __packed;
67098585aaSKaran Tilak Kumar 
68098585aaSKaran Tilak Kumar struct fip_enode_ka {
69098585aaSKaran Tilak Kumar 	struct ethhdr eth;
70098585aaSKaran Tilak Kumar 	struct fip_header fip;
71098585aaSKaran Tilak Kumar 	struct fip_mac_desc mac_desc;
72098585aaSKaran Tilak Kumar } __packed;
73098585aaSKaran Tilak Kumar 
74098585aaSKaran Tilak Kumar struct fip_cvl {
75098585aaSKaran Tilak Kumar 	struct fip_header fip;
76098585aaSKaran Tilak Kumar 	struct fip_mac_desc fcf_mac_desc;
77098585aaSKaran Tilak Kumar 	struct fip_wwn_desc name_desc;
78098585aaSKaran Tilak Kumar 	struct fip_vn_desc vn_ports_desc[];
79098585aaSKaran Tilak Kumar } __packed;
80098585aaSKaran Tilak Kumar 
81098585aaSKaran Tilak Kumar struct fip_flogi_desc {
82098585aaSKaran Tilak Kumar 	struct fip_desc fd_desc;
83098585aaSKaran Tilak Kumar 	uint16_t rsvd;
84098585aaSKaran Tilak Kumar 	struct fc_std_flogi flogi;
85098585aaSKaran Tilak Kumar } __packed;
86098585aaSKaran Tilak Kumar 
87098585aaSKaran Tilak Kumar struct fip_flogi_rsp_desc {
88098585aaSKaran Tilak Kumar 	struct fip_desc fd_desc;
89098585aaSKaran Tilak Kumar 	uint16_t rsvd;
90098585aaSKaran Tilak Kumar 	struct fc_std_flogi flogi;
91098585aaSKaran Tilak Kumar } __packed;
92098585aaSKaran Tilak Kumar 
93098585aaSKaran Tilak Kumar struct fip_flogi {
94098585aaSKaran Tilak Kumar 	struct ethhdr eth;
95098585aaSKaran Tilak Kumar 	struct fip_header fip;
96098585aaSKaran Tilak Kumar 	struct fip_flogi_desc flogi_desc;
97098585aaSKaran Tilak Kumar 	struct fip_mac_desc mac_desc;
98098585aaSKaran Tilak Kumar } __packed;
99098585aaSKaran Tilak Kumar 
100098585aaSKaran Tilak Kumar struct fip_flogi_rsp {
101098585aaSKaran Tilak Kumar 	struct fip_header fip;
102098585aaSKaran Tilak Kumar 	struct fip_flogi_rsp_desc rsp_desc;
103098585aaSKaran Tilak Kumar 	struct fip_mac_desc mac_desc;
104098585aaSKaran Tilak Kumar } __packed;
105098585aaSKaran Tilak Kumar 
106098585aaSKaran Tilak Kumar struct fip_discovery {
107098585aaSKaran Tilak Kumar 	struct ethhdr eth;
108098585aaSKaran Tilak Kumar 	struct fip_header fip;
109098585aaSKaran Tilak Kumar 	struct fip_mac_desc mac_desc;
110098585aaSKaran Tilak Kumar 	struct fip_wwn_desc name_desc;
111098585aaSKaran Tilak Kumar 	struct fip_size_desc fcoe_desc;
112098585aaSKaran Tilak Kumar } __packed;
113098585aaSKaran Tilak Kumar 
114098585aaSKaran Tilak Kumar struct fip_disc_adv {
115098585aaSKaran Tilak Kumar 	struct fip_header fip;
116098585aaSKaran Tilak Kumar 	struct fip_pri_desc prio_desc;
117098585aaSKaran Tilak Kumar 	struct fip_mac_desc mac_desc;
118098585aaSKaran Tilak Kumar 	struct fip_wwn_desc name_desc;
119098585aaSKaran Tilak Kumar 	struct fip_fab_desc fabric_desc;
120098585aaSKaran Tilak Kumar 	struct fip_fka_desc fka_adv_desc;
121098585aaSKaran Tilak Kumar } __packed;
122098585aaSKaran Tilak Kumar 
123098585aaSKaran Tilak Kumar void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct fip_header *fiph);
124098585aaSKaran Tilak Kumar void fnic_fcoe_fip_discovery_resp(struct fnic *fnic, struct fip_header *fiph);
125098585aaSKaran Tilak Kumar void fnic_fcoe_process_flogi_resp(struct fnic *fnic, struct fip_header *fiph);
126098585aaSKaran Tilak Kumar void fnic_work_on_fip_timer(struct work_struct *work);
127098585aaSKaran Tilak Kumar void fnic_work_on_fcs_ka_timer(struct work_struct *work);
128098585aaSKaran Tilak Kumar void fnic_fcoe_send_vlan_req(struct fnic *fnic);
129098585aaSKaran Tilak Kumar void fnic_fcoe_start_fcf_discovery(struct fnic *fnic);
130098585aaSKaran Tilak Kumar void fnic_fcoe_start_flogi(struct fnic *fnic);
131098585aaSKaran Tilak Kumar void fnic_fcoe_process_cvl(struct fnic *fnic, struct fip_header *fiph);
132098585aaSKaran Tilak Kumar void fnic_vlan_discovery_timeout(struct fnic *fnic);
133098585aaSKaran Tilak Kumar 
134*6cfba115SKaran Tilak Kumar extern struct workqueue_struct *fnic_fip_queue;
135*6cfba115SKaran Tilak Kumar 
136098585aaSKaran Tilak Kumar #ifdef FNIC_DEBUG
137098585aaSKaran Tilak Kumar static inline void
fnic_debug_dump_fip_frame(struct fnic * fnic,struct ethhdr * eth,int len,char * pfx)138098585aaSKaran Tilak Kumar fnic_debug_dump_fip_frame(struct fnic *fnic, struct ethhdr *eth,
139098585aaSKaran Tilak Kumar 				int len, char *pfx)
140098585aaSKaran Tilak Kumar {
141098585aaSKaran Tilak Kumar 	struct fip_header *fiph = (struct fip_header *)(eth + 1);
142098585aaSKaran Tilak Kumar 	u16 op = be16_to_cpu(fiph->fip_op);
143098585aaSKaran Tilak Kumar 	u8 sub = fiph->fip_subcode;
144098585aaSKaran Tilak Kumar 
1457e6886b7SKaran Tilak Kumar 	FNIC_FCS_DBG(KERN_DEBUG, fnic->host, fnic->fnic_num,
146098585aaSKaran Tilak Kumar 		"FIP %s packet contents: op: 0x%x sub: 0x%x (len = %d)",
147098585aaSKaran Tilak Kumar 		pfx, op, sub, len);
148098585aaSKaran Tilak Kumar 
149098585aaSKaran Tilak Kumar 	fnic_debug_dump(fnic, (uint8_t *)eth, len);
150098585aaSKaran Tilak Kumar }
151098585aaSKaran Tilak Kumar 
152098585aaSKaran Tilak Kumar #else /* FNIC_DEBUG */
153098585aaSKaran Tilak Kumar 
154098585aaSKaran Tilak Kumar static inline void
fnic_debug_dump_fip_frame(struct fnic * fnic,struct ethhdr * eth,int len,char * pfx)155098585aaSKaran Tilak Kumar fnic_debug_dump_fip_frame(struct fnic *fnic, struct ethhdr *eth,
156098585aaSKaran Tilak Kumar 				int len, char *pfx) {}
157098585aaSKaran Tilak Kumar #endif /* FNIC_DEBUG */
158098585aaSKaran Tilak Kumar 
159098585aaSKaran Tilak Kumar #endif	/* _FIP_H_ */
160