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