1/* 2 * Copyright(c) 2009 Intel Corporation. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * 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 WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * more details. 12 * 13 * You should have received a copy of the GNU General Public License along with 14 * 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.org 18 */ 19 20#ifndef _FCOE_H_ 21#define _FCOE_H_ 22 23#include <linux/skbuff.h> 24#include <linux/kthread.h> 25 26#define FCOE_MAX_QUEUE_DEPTH 256 27#define FCOE_LOW_QUEUE_DEPTH 32 28 29#define FCOE_WORD_TO_BYTE 4 30 31#define FCOE_VERSION "0.1" 32#define FCOE_NAME "fcoe" 33#define FCOE_VENDOR "Open-FCoE.org" 34 35#define FCOE_MAX_LUN 0xFFFF 36#define FCOE_MAX_FCP_TARGET 256 37 38#define FCOE_MAX_OUTSTANDING_COMMANDS 1024 39 40#define FCOE_MIN_XID 0x0000 /* the min xid supported by fcoe_sw */ 41#define FCOE_MAX_XID 0x0FFF /* the max xid supported by fcoe_sw */ 42 43/* 44 * Max MTU for FCoE: 14 (FCoE header) + 24 (FC header) + 2112 (max FC payload) 45 * + 4 (FC CRC) + 4 (FCoE trailer) = 2158 bytes 46 */ 47#define FCOE_MTU 2158 48 49unsigned int fcoe_debug_logging; 50module_param_named(debug_logging, fcoe_debug_logging, int, S_IRUGO|S_IWUSR); 51MODULE_PARM_DESC(debug_logging, "a bit mask of logging levels"); 52 53#define FCOE_LOGGING 0x01 /* General logging, not categorized */ 54#define FCOE_NETDEV_LOGGING 0x02 /* Netdevice logging */ 55 56#define FCOE_CHECK_LOGGING(LEVEL, CMD) \ 57do { \ 58 if (unlikely(fcoe_debug_logging & LEVEL)) \ 59 do { \ 60 CMD; \ 61 } while (0); \ 62} while (0) 63 64#define FCOE_DBG(fmt, args...) \ 65 FCOE_CHECK_LOGGING(FCOE_LOGGING, \ 66 printk(KERN_INFO "fcoe: " fmt, ##args);) 67 68#define FCOE_NETDEV_DBG(netdev, fmt, args...) \ 69 FCOE_CHECK_LOGGING(FCOE_NETDEV_LOGGING, \ 70 printk(KERN_INFO "fcoe: %s: " fmt, \ 71 netdev->name, ##args);) 72 73/** 74 * struct fcoe_percpu_s - The per-CPU context for FCoE receive threads 75 * @thread: The thread context 76 * @fcoe_rx_list: The queue of pending packets to process 77 * @page: The memory page for calculating frame trailer CRCs 78 * @crc_eof_offset: The offset into the CRC page pointing to available 79 * memory for a new trailer 80 */ 81struct fcoe_percpu_s { 82 struct task_struct *thread; 83 struct sk_buff_head fcoe_rx_list; 84 struct page *crc_eof_page; 85 int crc_eof_offset; 86}; 87 88/** 89 * struct fcoe_interface - A FCoE interface 90 * @list: Handle for a list of FCoE interfaces 91 * @netdev: The associated net device 92 * @fcoe_packet_type: FCoE packet type 93 * @fip_packet_type: FIP packet type 94 * @ctlr: The FCoE controller (for FIP) 95 * @oem: The offload exchange manager for all local port 96 * instances associated with this port 97 * @kref: The kernel reference 98 * 99 * This structure is 1:1 with a net devive. 100 */ 101struct fcoe_interface { 102 struct list_head list; 103 struct net_device *netdev; 104 struct packet_type fcoe_packet_type; 105 struct packet_type fip_packet_type; 106 struct fcoe_ctlr ctlr; 107 struct fc_exch_mgr *oem; 108 struct kref kref; 109}; 110 111/** 112 * struct fcoe_port - The FCoE private structure 113 * @fcoe: The associated fcoe interface 114 * @lport: The associated local port 115 * @fcoe_pending_queue: The pending Rx queue of skbs 116 * @fcoe_pending_queue_active: Indicates if the pending queue is active 117 * @timer: The queue timer 118 * @destroy_work: Handle for work context 119 * (to prevent RTNL deadlocks) 120 * @data_srt_addr: Source address for data 121 * 122 * An instance of this structure is to be allocated along with the 123 * Scsi_Host and libfc fc_lport structures. 124 */ 125struct fcoe_port { 126 struct fcoe_interface *fcoe; 127 struct fc_lport *lport; 128 struct sk_buff_head fcoe_pending_queue; 129 u8 fcoe_pending_queue_active; 130 struct timer_list timer; 131 struct work_struct destroy_work; 132 u8 data_src_addr[ETH_ALEN]; 133}; 134 135#define fcoe_from_ctlr(fip) container_of(fip, struct fcoe_interface, ctlr) 136 137/** 138 * fcoe_netdev() - Return the net device associated with a local port 139 * @lport: The local port to get the net device from 140 */ 141static inline struct net_device *fcoe_netdev(const struct fc_lport *lport) 142{ 143 return ((struct fcoe_port *)lport_priv(lport))->fcoe->netdev; 144} 145 146#endif /* _FCOE_H_ */ 147