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 49 unsigned int fcoe_debug_logging; 50 module_param_named(debug_logging, fcoe_debug_logging, int, S_IRUGO|S_IWUSR); 51 MODULE_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) \ 57 do { \ 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 */ 81 struct 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 */ 101 struct 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 */ 125 struct 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 */ 141 static 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