| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* |
| * Copyright 2008 Cisco Systems, Inc. All rights reserved. |
| * Copyright 2007 Nuova Systems, Inc. All rights reserved. |
| */ |
| #ifndef _FIP_H_ |
| #define _FIP_H_ |
| |
| #include "fdls_fc.h" |
| #include "fnic_fdls.h" |
| #include <scsi/fc/fc_fip.h> |
| |
| /* Drop the cast from the standard definition */ |
| #define FCOE_ALL_FCFS_MAC {0x01, 0x10, 0x18, 0x01, 0x00, 0x02} |
| #define FCOE_MAX_SIZE 0x082E |
| |
| #define FCOE_CTLR_FIPVLAN_TOV (3*1000) |
| #define FCOE_CTLR_FCS_TOV (3*1000) |
| #define FCOE_CTLR_MAX_SOL (5*1000) |
| |
| #define FIP_DISC_SOL_LEN (6) |
| #define FIP_VLAN_REQ_LEN (2) |
| #define FIP_ENODE_KA_LEN (2) |
| #define FIP_VN_KA_LEN (7) |
| #define FIP_FLOGI_LEN (38) |
| |
| enum fdls_vlan_state { |
| FIP_VLAN_AVAIL, |
| FIP_VLAN_SENT |
| }; |
| |
| enum fdls_fip_state { |
| FDLS_FIP_INIT, |
| FDLS_FIP_VLAN_DISCOVERY_STARTED, |
| FDLS_FIP_FCF_DISCOVERY_STARTED, |
| FDLS_FIP_FLOGI_STARTED, |
| FDLS_FIP_FLOGI_COMPLETE, |
| }; |
| |
| /* |
| * VLAN entry. |
| */ |
| struct fcoe_vlan { |
| struct list_head list; |
| uint16_t vid; /* vlan ID */ |
| uint16_t sol_count; /* no. of sols sent */ |
| uint16_t state; /* state */ |
| }; |
| |
| struct fip_vlan_req { |
| struct ethhdr eth; |
| struct fip_header fip; |
| struct fip_mac_desc mac_desc; |
| } __packed; |
| |
| struct fip_vlan_notif { |
| struct fip_header fip; |
| struct fip_vlan_desc vlans_desc[]; |
| } __packed; |
| |
| struct fip_vn_port_ka { |
| struct ethhdr eth; |
| struct fip_header fip; |
| struct fip_mac_desc mac_desc; |
| struct fip_vn_desc vn_port_desc; |
| } __packed; |
| |
| struct fip_enode_ka { |
| struct ethhdr eth; |
| struct fip_header fip; |
| struct fip_mac_desc mac_desc; |
| } __packed; |
| |
| struct fip_cvl { |
| struct fip_header fip; |
| struct fip_mac_desc fcf_mac_desc; |
| struct fip_wwn_desc name_desc; |
| struct fip_vn_desc vn_ports_desc[]; |
| } __packed; |
| |
| struct fip_flogi_desc { |
| struct fip_desc fd_desc; |
| uint16_t rsvd; |
| struct fc_std_flogi flogi; |
| } __packed; |
| |
| struct fip_flogi_rsp_desc { |
| struct fip_desc fd_desc; |
| uint16_t rsvd; |
| struct fc_std_flogi flogi; |
| } __packed; |
| |
| struct fip_flogi { |
| struct ethhdr eth; |
| struct fip_header fip; |
| struct fip_flogi_desc flogi_desc; |
| struct fip_mac_desc mac_desc; |
| } __packed; |
| |
| struct fip_flogi_rsp { |
| struct fip_header fip; |
| struct fip_flogi_rsp_desc rsp_desc; |
| struct fip_mac_desc mac_desc; |
| } __packed; |
| |
| struct fip_discovery { |
| struct ethhdr eth; |
| struct fip_header fip; |
| struct fip_mac_desc mac_desc; |
| struct fip_wwn_desc name_desc; |
| struct fip_size_desc fcoe_desc; |
| } __packed; |
| |
| struct fip_disc_adv { |
| struct fip_header fip; |
| struct fip_pri_desc prio_desc; |
| struct fip_mac_desc mac_desc; |
| struct fip_wwn_desc name_desc; |
| struct fip_fab_desc fabric_desc; |
| struct fip_fka_desc fka_adv_desc; |
| } __packed; |
| |
| void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct fip_header *fiph); |
| void fnic_fcoe_fip_discovery_resp(struct fnic *fnic, struct fip_header *fiph); |
| void fnic_fcoe_process_flogi_resp(struct fnic *fnic, struct fip_header *fiph); |
| void fnic_work_on_fip_timer(struct work_struct *work); |
| void fnic_work_on_fcs_ka_timer(struct work_struct *work); |
| void fnic_fcoe_send_vlan_req(struct fnic *fnic); |
| void fnic_fcoe_start_fcf_discovery(struct fnic *fnic); |
| void fnic_fcoe_start_flogi(struct fnic *fnic); |
| void fnic_fcoe_process_cvl(struct fnic *fnic, struct fip_header *fiph); |
| void fnic_vlan_discovery_timeout(struct fnic *fnic); |
| |
| extern struct workqueue_struct *fnic_fip_queue; |
| |
| #ifdef FNIC_DEBUG |
| static inline void |
| fnic_debug_dump_fip_frame(struct fnic *fnic, struct ethhdr *eth, |
| int len, char *pfx) |
| { |
| struct fip_header *fiph = (struct fip_header *)(eth + 1); |
| u16 op = be16_to_cpu(fiph->fip_op); |
| u8 sub = fiph->fip_subcode; |
| |
| FNIC_FCS_DBG(KERN_DEBUG, fnic->host, fnic->fnic_num, |
| "FIP %s packet contents: op: 0x%x sub: 0x%x (len = %d)", |
| pfx, op, sub, len); |
| |
| fnic_debug_dump(fnic, (uint8_t *)eth, len); |
| } |
| |
| #else /* FNIC_DEBUG */ |
| |
| static inline void |
| fnic_debug_dump_fip_frame(struct fnic *fnic, struct ethhdr *eth, |
| int len, char *pfx) {} |
| #endif /* FNIC_DEBUG */ |
| |
| #endif /* _FIP_H_ */ |