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 struct workqueue_struct *work_q; 54 struct workqueue_struct *devloss_work_q; 55 struct mutex lock; 56 57 int fcf_dev_loss_tmo; 58 enum fip_conn_type mode; 59 60 enum ctlr_enabled_state enabled; 61 62 /* expected in host order for displaying */ 63 struct fcoe_fc_els_lesb lesb; 64 }; 65 66 static inline void *fcoe_ctlr_device_priv(const struct fcoe_ctlr_device *ctlr) 67 { 68 return (void *)(ctlr + 1); 69 } 70 71 /* fcf states */ 72 enum fcf_state { 73 FCOE_FCF_STATE_UNKNOWN, 74 FCOE_FCF_STATE_DISCONNECTED, 75 FCOE_FCF_STATE_CONNECTED, 76 FCOE_FCF_STATE_DELETED, 77 }; 78 79 struct fcoe_fcf_device { 80 u32 id; 81 struct device dev; 82 struct list_head peers; 83 struct work_struct delete_work; 84 struct delayed_work dev_loss_work; 85 u32 dev_loss_tmo; 86 void *priv; 87 enum fcf_state state; 88 89 u64 fabric_name; 90 u64 switch_name; 91 u32 fc_map; 92 u16 vfid; 93 u8 mac[ETH_ALEN]; 94 u8 priority; 95 u32 fka_period; 96 u8 selected; 97 u16 vlan_id; 98 }; 99 100 #define dev_to_fcf(d) \ 101 container_of((d), struct fcoe_fcf_device, dev) 102 /* parentage should never be missing */ 103 #define fcoe_fcf_dev_to_ctlr_dev(x) \ 104 dev_to_ctlr((x)->dev.parent) 105 #define fcoe_fcf_device_priv(x) \ 106 ((x)->priv) 107 108 struct fcoe_ctlr_device *fcoe_ctlr_device_add(struct device *parent, 109 struct fcoe_sysfs_function_template *f, 110 int priv_size); 111 void fcoe_ctlr_device_delete(struct fcoe_ctlr_device *); 112 struct fcoe_fcf_device *fcoe_fcf_device_add(struct fcoe_ctlr_device *, 113 struct fcoe_fcf_device *); 114 void fcoe_fcf_device_delete(struct fcoe_fcf_device *); 115 116 int __init fcoe_sysfs_setup(void); 117 void __exit fcoe_sysfs_teardown(void); 118 119 #endif /* FCOE_SYSFS */ 120