1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2011-2012 Intel Corporation. All rights reserved. 4 * 5 * Maintained at www.Open-FCoE.org 6 */ 7 8 #ifndef FCOE_SYSFS 9 #define FCOE_SYSFS 10 11 #include <linux/if_ether.h> 12 #include <linux/device.h> 13 #include <scsi/fc/fc_fcoe.h> 14 15 struct fcoe_ctlr_device; 16 struct fcoe_fcf_device; 17 18 struct fcoe_sysfs_function_template { 19 void (*get_fcoe_ctlr_link_fail)(struct fcoe_ctlr_device *); 20 void (*get_fcoe_ctlr_vlink_fail)(struct fcoe_ctlr_device *); 21 void (*get_fcoe_ctlr_miss_fka)(struct fcoe_ctlr_device *); 22 void (*get_fcoe_ctlr_symb_err)(struct fcoe_ctlr_device *); 23 void (*get_fcoe_ctlr_err_block)(struct fcoe_ctlr_device *); 24 void (*get_fcoe_ctlr_fcs_error)(struct fcoe_ctlr_device *); 25 void (*set_fcoe_ctlr_mode)(struct fcoe_ctlr_device *); 26 int (*set_fcoe_ctlr_enabled)(struct fcoe_ctlr_device *); 27 void (*get_fcoe_fcf_selected)(struct fcoe_fcf_device *); 28 void (*get_fcoe_fcf_vlan_id)(struct fcoe_fcf_device *); 29 }; 30 31 #define dev_to_ctlr(d) \ 32 container_of((d), struct fcoe_ctlr_device, dev) 33 34 enum fip_conn_type { 35 FIP_CONN_TYPE_UNKNOWN, 36 FIP_CONN_TYPE_FABRIC, 37 FIP_CONN_TYPE_VN2VN, 38 }; 39 40 enum ctlr_enabled_state { 41 FCOE_CTLR_ENABLED, 42 FCOE_CTLR_DISABLED, 43 FCOE_CTLR_UNUSED, 44 }; 45 46 struct fcoe_ctlr_device { 47 u32 id; 48 49 struct device dev; 50 struct fcoe_sysfs_function_template *f; 51 52 struct list_head fcfs; 53 char work_q_name[20]; 54 struct workqueue_struct *work_q; 55 char devloss_work_q_name[20]; 56 struct workqueue_struct *devloss_work_q; 57 struct mutex lock; 58 59 int fcf_dev_loss_tmo; 60 enum fip_conn_type mode; 61 62 enum ctlr_enabled_state enabled; 63 64 /* expected in host order for displaying */ 65 struct fcoe_fc_els_lesb lesb; 66 }; 67 68 static inline void *fcoe_ctlr_device_priv(const struct fcoe_ctlr_device *ctlr) 69 { 70 return (void *)(ctlr + 1); 71 } 72 73 /* fcf states */ 74 enum fcf_state { 75 FCOE_FCF_STATE_UNKNOWN, 76 FCOE_FCF_STATE_DISCONNECTED, 77 FCOE_FCF_STATE_CONNECTED, 78 FCOE_FCF_STATE_DELETED, 79 }; 80 81 struct fcoe_fcf_device { 82 u32 id; 83 struct device dev; 84 struct list_head peers; 85 struct work_struct delete_work; 86 struct delayed_work dev_loss_work; 87 u32 dev_loss_tmo; 88 void *priv; 89 enum fcf_state state; 90 91 u64 fabric_name; 92 u64 switch_name; 93 u32 fc_map; 94 u16 vfid; 95 u8 mac[ETH_ALEN]; 96 u8 priority; 97 u32 fka_period; 98 u8 selected; 99 u16 vlan_id; 100 }; 101 102 #define dev_to_fcf(d) \ 103 container_of((d), struct fcoe_fcf_device, dev) 104 /* parentage should never be missing */ 105 #define fcoe_fcf_dev_to_ctlr_dev(x) \ 106 dev_to_ctlr((x)->dev.parent) 107 #define fcoe_fcf_device_priv(x) \ 108 ((x)->priv) 109 110 struct fcoe_ctlr_device *fcoe_ctlr_device_add(struct device *parent, 111 struct fcoe_sysfs_function_template *f, 112 int priv_size); 113 void fcoe_ctlr_device_delete(struct fcoe_ctlr_device *); 114 struct fcoe_fcf_device *fcoe_fcf_device_add(struct fcoe_ctlr_device *, 115 struct fcoe_fcf_device *); 116 void fcoe_fcf_device_delete(struct fcoe_fcf_device *); 117 118 int __init fcoe_sysfs_setup(void); 119 void __exit fcoe_sysfs_teardown(void); 120 121 #endif /* FCOE_SYSFS */ 122