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 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 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