19a74e884SRobert Love /* 29a74e884SRobert Love * Copyright (c) 2011-2012 Intel Corporation. All rights reserved. 39a74e884SRobert Love * 49a74e884SRobert Love * This program is free software; you can redistribute it and/or modify it 59a74e884SRobert Love * under the terms and conditions of the GNU General Public License, 69a74e884SRobert Love * version 2, as published by the Free Software Foundation. 79a74e884SRobert Love * 89a74e884SRobert Love * This program is distributed in the hope it will be useful, but WITHOUT 99a74e884SRobert Love * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 109a74e884SRobert Love * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 119a74e884SRobert Love * more details. 129a74e884SRobert Love * 139a74e884SRobert Love * You should have received a copy of the GNU General Public License along with 149a74e884SRobert Love * this program; if not, write to the Free Software Foundation, Inc., 159a74e884SRobert Love * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 169a74e884SRobert Love * 179a74e884SRobert Love * Maintained at www.Open-FCoE.org 189a74e884SRobert Love */ 199a74e884SRobert Love 209a74e884SRobert Love #ifndef FCOE_SYSFS 219a74e884SRobert Love #define FCOE_SYSFS 229a74e884SRobert Love 239a74e884SRobert Love #include <linux/if_ether.h> 249a74e884SRobert Love #include <linux/device.h> 259a74e884SRobert Love #include <scsi/fc/fc_fcoe.h> 269a74e884SRobert Love 279a74e884SRobert Love struct fcoe_ctlr_device; 289a74e884SRobert Love struct fcoe_fcf_device; 299a74e884SRobert Love 309a74e884SRobert Love struct fcoe_sysfs_function_template { 319a74e884SRobert Love void (*get_fcoe_ctlr_link_fail)(struct fcoe_ctlr_device *); 329a74e884SRobert Love void (*get_fcoe_ctlr_vlink_fail)(struct fcoe_ctlr_device *); 339a74e884SRobert Love void (*get_fcoe_ctlr_miss_fka)(struct fcoe_ctlr_device *); 349a74e884SRobert Love void (*get_fcoe_ctlr_symb_err)(struct fcoe_ctlr_device *); 359a74e884SRobert Love void (*get_fcoe_ctlr_err_block)(struct fcoe_ctlr_device *); 369a74e884SRobert Love void (*get_fcoe_ctlr_fcs_error)(struct fcoe_ctlr_device *); 37*6a891b07SRobert Love void (*set_fcoe_ctlr_mode)(struct fcoe_ctlr_device *); 38*6a891b07SRobert Love int (*set_fcoe_ctlr_enabled)(struct fcoe_ctlr_device *); 399a74e884SRobert Love void (*get_fcoe_fcf_selected)(struct fcoe_fcf_device *); 409a74e884SRobert Love void (*get_fcoe_fcf_vlan_id)(struct fcoe_fcf_device *); 419a74e884SRobert Love }; 429a74e884SRobert Love 439a74e884SRobert Love #define dev_to_ctlr(d) \ 449a74e884SRobert Love container_of((d), struct fcoe_ctlr_device, dev) 459a74e884SRobert Love 469a74e884SRobert Love enum fip_conn_type { 479a74e884SRobert Love FIP_CONN_TYPE_UNKNOWN, 489a74e884SRobert Love FIP_CONN_TYPE_FABRIC, 499a74e884SRobert Love FIP_CONN_TYPE_VN2VN, 509a74e884SRobert Love }; 519a74e884SRobert Love 52*6a891b07SRobert Love enum ctlr_enabled_state { 53*6a891b07SRobert Love FCOE_CTLR_ENABLED, 54*6a891b07SRobert Love FCOE_CTLR_DISABLED, 55*6a891b07SRobert Love FCOE_CTLR_UNUSED, 56*6a891b07SRobert Love }; 57*6a891b07SRobert Love 589a74e884SRobert Love struct fcoe_ctlr_device { 599a74e884SRobert Love u32 id; 609a74e884SRobert Love 619a74e884SRobert Love struct device dev; 629a74e884SRobert Love struct fcoe_sysfs_function_template *f; 639a74e884SRobert Love 649a74e884SRobert Love struct list_head fcfs; 659a74e884SRobert Love char work_q_name[20]; 669a74e884SRobert Love struct workqueue_struct *work_q; 679a74e884SRobert Love char devloss_work_q_name[20]; 689a74e884SRobert Love struct workqueue_struct *devloss_work_q; 699a74e884SRobert Love struct mutex lock; 709a74e884SRobert Love 719a74e884SRobert Love int fcf_dev_loss_tmo; 729a74e884SRobert Love enum fip_conn_type mode; 739a74e884SRobert Love 74*6a891b07SRobert Love enum ctlr_enabled_state enabled; 75*6a891b07SRobert Love 769a74e884SRobert Love /* expected in host order for displaying */ 779a74e884SRobert Love struct fcoe_fc_els_lesb lesb; 789a74e884SRobert Love }; 799a74e884SRobert Love 809a74e884SRobert Love static inline void *fcoe_ctlr_device_priv(const struct fcoe_ctlr_device *ctlr) 819a74e884SRobert Love { 829a74e884SRobert Love return (void *)(ctlr + 1); 839a74e884SRobert Love } 849a74e884SRobert Love 859a74e884SRobert Love /* fcf states */ 869a74e884SRobert Love enum fcf_state { 879a74e884SRobert Love FCOE_FCF_STATE_UNKNOWN, 889a74e884SRobert Love FCOE_FCF_STATE_DISCONNECTED, 899a74e884SRobert Love FCOE_FCF_STATE_CONNECTED, 909a74e884SRobert Love FCOE_FCF_STATE_DELETED, 919a74e884SRobert Love }; 929a74e884SRobert Love 939a74e884SRobert Love struct fcoe_fcf_device { 949a74e884SRobert Love u32 id; 959a74e884SRobert Love struct device dev; 969a74e884SRobert Love struct list_head peers; 979a74e884SRobert Love struct work_struct delete_work; 989a74e884SRobert Love struct delayed_work dev_loss_work; 999a74e884SRobert Love u32 dev_loss_tmo; 1009a74e884SRobert Love void *priv; 1019a74e884SRobert Love enum fcf_state state; 1029a74e884SRobert Love 1039a74e884SRobert Love u64 fabric_name; 1049a74e884SRobert Love u64 switch_name; 1059a74e884SRobert Love u32 fc_map; 1069a74e884SRobert Love u16 vfid; 1079a74e884SRobert Love u8 mac[ETH_ALEN]; 1089a74e884SRobert Love u8 priority; 1099a74e884SRobert Love u32 fka_period; 1109a74e884SRobert Love u8 selected; 1119a74e884SRobert Love u16 vlan_id; 1129a74e884SRobert Love }; 1139a74e884SRobert Love 1149a74e884SRobert Love #define dev_to_fcf(d) \ 1159a74e884SRobert Love container_of((d), struct fcoe_fcf_device, dev) 1169a74e884SRobert Love /* parentage should never be missing */ 1179a74e884SRobert Love #define fcoe_fcf_dev_to_ctlr_dev(x) \ 1189a74e884SRobert Love dev_to_ctlr((x)->dev.parent) 1199a74e884SRobert Love #define fcoe_fcf_device_priv(x) \ 1209a74e884SRobert Love ((x)->priv) 1219a74e884SRobert Love 1229a74e884SRobert Love struct fcoe_ctlr_device *fcoe_ctlr_device_add(struct device *parent, 1239a74e884SRobert Love struct fcoe_sysfs_function_template *f, 1249a74e884SRobert Love int priv_size); 1259a74e884SRobert Love void fcoe_ctlr_device_delete(struct fcoe_ctlr_device *); 1269a74e884SRobert Love struct fcoe_fcf_device *fcoe_fcf_device_add(struct fcoe_ctlr_device *, 1279a74e884SRobert Love struct fcoe_fcf_device *); 1289a74e884SRobert Love void fcoe_fcf_device_delete(struct fcoe_fcf_device *); 1299a74e884SRobert Love 1309a74e884SRobert Love int __init fcoe_sysfs_setup(void); 1319a74e884SRobert Love void __exit fcoe_sysfs_teardown(void); 1329a74e884SRobert Love 1339a74e884SRobert Love #endif /* FCOE_SYSFS */ 134