/*1* Copyright (c) 2008-2009 Cisco Systems, Inc. All rights reserved.2* Copyright (c) 2007-2008 Intel Corporation. All rights reserved.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms and conditions of the GNU General Public License,6* version 2, as published by the Free Software Foundation.7*8* This program is distributed in the hope it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13* You should have received a copy of the GNU General Public License along with14* this program; if not, write to the Free Software Foundation, Inc.,15* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.16*17* Maintained at www.Open-FCoE.org18*/1920#ifndef _LIBFCOE_H21#define _LIBFCOE_H2223#include <linux/etherdevice.h>24#include <linux/if_ether.h>25#include <linux/netdevice.h>26#include <linux/skbuff.h>27#include <linux/workqueue.h>28#include <linux/random.h>29#include <scsi/fc/fc_fcoe.h>30#include <scsi/libfc.h>3132#define FCOE_MAX_CMD_LEN 16 /* Supported CDB length */3334/*35* Max MTU for FCoE: 14 (FCoE header) + 24 (FC header) + 2112 (max FC payload)36* + 4 (FC CRC) + 4 (FCoE trailer) = 2158 bytes37*/38#define FCOE_MTU 21583940/*41* FIP tunable parameters.42*/43#define FCOE_CTLR_START_DELAY 2000 /* mS after first adv. to choose FCF */44#define FCOE_CTRL_SOL_TOV 2000 /* min. solicitation interval (mS) */45#define FCOE_CTLR_FCF_LIMIT 20 /* max. number of FCF entries */46#define FCOE_CTLR_VN2VN_LOGIN_LIMIT 3 /* max. VN2VN rport login retries */4748/**49* enum fip_state - internal state of FCoE controller.50* @FIP_ST_DISABLED: controller has been disabled or not yet enabled.51* @FIP_ST_LINK_WAIT: the physical link is down or unusable.52* @FIP_ST_AUTO: determining whether to use FIP or non-FIP mode.53* @FIP_ST_NON_FIP: non-FIP mode selected.54* @FIP_ST_ENABLED: FIP mode selected.55* @FIP_ST_VNMP_START: VN2VN multipath mode start, wait56* @FIP_ST_VNMP_PROBE1: VN2VN sent first probe, listening57* @FIP_ST_VNMP_PROBE2: VN2VN sent second probe, listening58* @FIP_ST_VNMP_CLAIM: VN2VN sent claim, waiting for responses59* @FIP_ST_VNMP_UP: VN2VN multipath mode operation60*/61enum fip_state {62FIP_ST_DISABLED,63FIP_ST_LINK_WAIT,64FIP_ST_AUTO,65FIP_ST_NON_FIP,66FIP_ST_ENABLED,67FIP_ST_VNMP_START,68FIP_ST_VNMP_PROBE1,69FIP_ST_VNMP_PROBE2,70FIP_ST_VNMP_CLAIM,71FIP_ST_VNMP_UP,72};7374/*75* Modes:76* The mode is the state that is to be entered after link up.77* It must not change after fcoe_ctlr_init() sets it.78*/79#define FIP_MODE_AUTO FIP_ST_AUTO80#define FIP_MODE_NON_FIP FIP_ST_NON_FIP81#define FIP_MODE_FABRIC FIP_ST_ENABLED82#define FIP_MODE_VN2VN FIP_ST_VNMP_START8384/**85* struct fcoe_ctlr - FCoE Controller and FIP state86* @state: internal FIP state for network link and FIP or non-FIP mode.87* @mode: LLD-selected mode.88* @lp: &fc_lport: libfc local port.89* @sel_fcf: currently selected FCF, or NULL.90* @fcfs: list of discovered FCFs.91* @fcf_count: number of discovered FCF entries.92* @sol_time: time when a multicast solicitation was last sent.93* @sel_time: time after which to select an FCF.94* @port_ka_time: time of next port keep-alive.95* @ctlr_ka_time: time of next controller keep-alive.96* @timer: timer struct used for all delayed events.97* @timer_work: &work_struct for doing keep-alives and resets.98* @recv_work: &work_struct for receiving FIP frames.99* @fip_recv_list: list of received FIP frames.100* @flogi_req: clone of FLOGI request sent101* @rnd_state: state for pseudo-random number generator.102* @port_id: proposed or selected local-port ID.103* @user_mfs: configured maximum FC frame size, including FC header.104* @flogi_oxid: exchange ID of most recent fabric login.105* @flogi_req_send: send of FLOGI requested106* @flogi_count: number of FLOGI attempts in AUTO mode.107* @map_dest: use the FC_MAP mode for destination MAC addresses.108* @spma: supports SPMA server-provided MACs mode109* @probe_tries: number of FC_IDs probed110* @dest_addr: MAC address of the selected FC forwarder.111* @ctl_src_addr: the native MAC address of our local port.112* @send: LLD-supplied function to handle sending FIP Ethernet frames113* @update_mac: LLD-supplied function to handle changes to MAC addresses.114* @get_src_addr: LLD-supplied function to supply a source MAC address.115* @ctlr_mutex: lock protecting this structure.116* @ctlr_lock: spinlock covering flogi_req117*118* This structure is used by all FCoE drivers. It contains information119* needed by all FCoE low-level drivers (LLDs) as well as internal state120* for FIP, and fields shared with the LLDS.121*/122struct fcoe_ctlr {123enum fip_state state;124enum fip_state mode;125struct fc_lport *lp;126struct fcoe_fcf *sel_fcf;127struct list_head fcfs;128u16 fcf_count;129unsigned long sol_time;130unsigned long sel_time;131unsigned long port_ka_time;132unsigned long ctlr_ka_time;133struct timer_list timer;134struct work_struct timer_work;135struct work_struct recv_work;136struct sk_buff_head fip_recv_list;137struct sk_buff *flogi_req;138139struct rnd_state rnd_state;140u32 port_id;141142u16 user_mfs;143u16 flogi_oxid;144u8 flogi_req_send;145u8 flogi_count;146u8 map_dest;147u8 spma;148u8 probe_tries;149u8 dest_addr[ETH_ALEN];150u8 ctl_src_addr[ETH_ALEN];151152void (*send)(struct fcoe_ctlr *, struct sk_buff *);153void (*update_mac)(struct fc_lport *, u8 *addr);154u8 * (*get_src_addr)(struct fc_lport *);155struct mutex ctlr_mutex;156spinlock_t ctlr_lock;157};158159/**160* struct fcoe_fcf - Fibre-Channel Forwarder161* @list: list linkage162* @time: system time (jiffies) when an advertisement was last received163* @switch_name: WWN of switch from advertisement164* @fabric_name: WWN of fabric from advertisement165* @fc_map: FC_MAP value from advertisement166* @fcf_mac: Ethernet address of the FCF167* @vfid: virtual fabric ID168* @pri: selection priority, smaller values are better169* @flogi_sent: current FLOGI sent to this FCF170* @flags: flags received from advertisement171* @fka_period: keep-alive period, in jiffies172*173* A Fibre-Channel Forwarder (FCF) is the entity on the Ethernet that174* passes FCoE frames on to an FC fabric. This structure represents175* one FCF from which advertisements have been received.176*177* When looking up an FCF, @switch_name, @fabric_name, @fc_map, @vfid, and178* @fcf_mac together form the lookup key.179*/180struct fcoe_fcf {181struct list_head list;182unsigned long time;183184u64 switch_name;185u64 fabric_name;186u32 fc_map;187u16 vfid;188u8 fcf_mac[ETH_ALEN];189190u8 pri;191u8 flogi_sent;192u16 flags;193u32 fka_period;194u8 fd_flags:1;195};196197/**198* struct fcoe_rport - VN2VN remote port199* @time: time of create or last beacon packet received from node200* @fcoe_len: max FCoE frame size, not including VLAN or Ethernet headers201* @flags: flags from probe or claim202* @login_count: number of unsuccessful rport logins to this port203* @enode_mac: E_Node control MAC address204* @vn_mac: VN_Node assigned MAC address for data205*/206struct fcoe_rport {207unsigned long time;208u16 fcoe_len;209u16 flags;210u8 login_count;211u8 enode_mac[ETH_ALEN];212u8 vn_mac[ETH_ALEN];213};214215/* FIP API functions */216void fcoe_ctlr_init(struct fcoe_ctlr *, enum fip_state);217void fcoe_ctlr_destroy(struct fcoe_ctlr *);218void fcoe_ctlr_link_up(struct fcoe_ctlr *);219int fcoe_ctlr_link_down(struct fcoe_ctlr *);220int fcoe_ctlr_els_send(struct fcoe_ctlr *, struct fc_lport *, struct sk_buff *);221void fcoe_ctlr_recv(struct fcoe_ctlr *, struct sk_buff *);222int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_lport *,223struct fc_frame *);224225/* libfcoe funcs */226u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int);227int fcoe_libfc_config(struct fc_lport *, struct fcoe_ctlr *,228const struct libfc_function_template *, int init_fcp);229u32 fcoe_fc_crc(struct fc_frame *fp);230int fcoe_start_io(struct sk_buff *skb);231232/**233* is_fip_mode() - returns true if FIP mode selected.234* @fip: FCoE controller.235*/236static inline bool is_fip_mode(struct fcoe_ctlr *fip)237{238return fip->state == FIP_ST_ENABLED;239}240241/* helper for FCoE SW HBA drivers, can include subven and subdev if needed. The242* modpost would use pci_device_id table to auto-generate formatted module alias243* into the corresponding .mod.c file, but there may or may not be a pci device244* id table for FCoE drivers so we use the following helper for build the fcoe245* driver module alias.246*/247#define MODULE_ALIAS_FCOE_PCI(ven, dev) \248MODULE_ALIAS("fcoe-pci:" \249"v" __stringify(ven) \250"d" __stringify(dev) "sv*sd*bc*sc*i*")251252/* the name of the default FCoE transport driver fcoe.ko */253#define FCOE_TRANSPORT_DEFAULT "fcoe"254255/* struct fcoe_transport - The FCoE transport interface256* @name: a vendor specific name for their FCoE transport driver257* @attached: whether this transport is already attached258* @list: list linkage to all attached transports259* @match: handler to allow the transport driver to match up a given netdev260* @create: handler to sysfs entry of create for FCoE instances261* @destroy: handler to sysfs entry of destroy for FCoE instances262* @enable: handler to sysfs entry of enable for FCoE instances263* @disable: handler to sysfs entry of disable for FCoE instances264*/265struct fcoe_transport {266char name[IFNAMSIZ];267bool attached;268struct list_head list;269bool (*match) (struct net_device *device);270int (*create) (struct net_device *device, enum fip_state fip_mode);271int (*destroy) (struct net_device *device);272int (*enable) (struct net_device *device);273int (*disable) (struct net_device *device);274};275276/**277* struct fcoe_percpu_s - The context for FCoE receive thread(s)278* @thread: The thread context279* @fcoe_rx_list: The queue of pending packets to process280* @page: The memory page for calculating frame trailer CRCs281* @crc_eof_offset: The offset into the CRC page pointing to available282* memory for a new trailer283*/284struct fcoe_percpu_s {285struct task_struct *thread;286struct sk_buff_head fcoe_rx_list;287struct page *crc_eof_page;288int crc_eof_offset;289};290291/**292* struct fcoe_port - The FCoE private structure293* @priv: The associated fcoe interface. The structure is294* defined by the low level driver295* @lport: The associated local port296* @fcoe_pending_queue: The pending Rx queue of skbs297* @fcoe_pending_queue_active: Indicates if the pending queue is active298* @max_queue_depth: Max queue depth of pending queue299* @min_queue_depth: Min queue depth of pending queue300* @timer: The queue timer301* @destroy_work: Handle for work context302* (to prevent RTNL deadlocks)303* @data_srt_addr: Source address for data304*305* An instance of this structure is to be allocated along with the306* Scsi_Host and libfc fc_lport structures.307*/308struct fcoe_port {309void *priv;310struct fc_lport *lport;311struct sk_buff_head fcoe_pending_queue;312u8 fcoe_pending_queue_active;313u32 max_queue_depth;314u32 min_queue_depth;315struct timer_list timer;316struct work_struct destroy_work;317u8 data_src_addr[ETH_ALEN];318};319void fcoe_clean_pending_queue(struct fc_lport *);320void fcoe_check_wait_queue(struct fc_lport *lport, struct sk_buff *skb);321void fcoe_queue_timer(ulong lport);322int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen,323struct fcoe_percpu_s *fps);324325/**326* struct netdev_list327* A mapping from netdevice to fcoe_transport328*/329struct fcoe_netdev_mapping {330struct list_head list;331struct net_device *netdev;332struct fcoe_transport *ft;333};334335/* fcoe transports registration and deregistration */336int fcoe_transport_attach(struct fcoe_transport *ft);337int fcoe_transport_detach(struct fcoe_transport *ft);338339#endif /* _LIBFCOE_H */340341342