d7179680d0
Updates fcoe_em_config to allocate a single instance of sharable offload EM for supported lp->lro_xid per eth device, and then share this EM for subsequently more lports creation on same eth device (e.g when using VLAN). Adds tiny fcoe_oem_match function for offload EM to return true for read types IO to have read IO exchanges allocated from offload shared EM. Removes fc_em_alloc_xid function completely which was needed to manage two xid ranges within a EM, this is not needed any more with allocation of separate sharable offload EM per eth device. Instead this patch adds simple xid allocation logic to manage single xid range. Adds fc_exch_em_alloc with mp->next_xid as cursor to allocate new xid from single xid range of EM, uses mp->next_xid instead removed mp->last_xid which slightly increase probability of finding empty xid on exch allocation. Removes restriction of not allowing use of xid zero along with changing two xid range change to single xid range. Makes fc_fcp_ddp_setup calling conditional to only xid allocated from shared offload EM. Signed-off-by: Vasu Dev <vasu.dev@intel.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
102 lines
2.9 KiB
C
102 lines
2.9 KiB
C
/*
|
|
* Copyright(c) 2009 Intel Corporation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Maintained at www.Open-FCoE.org
|
|
*/
|
|
|
|
#ifndef _FCOE_H_
|
|
#define _FCOE_H_
|
|
|
|
#include <linux/skbuff.h>
|
|
#include <linux/kthread.h>
|
|
|
|
#define FCOE_MAX_QUEUE_DEPTH 256
|
|
#define FCOE_LOW_QUEUE_DEPTH 32
|
|
|
|
#define FCOE_WORD_TO_BYTE 4
|
|
|
|
#define FCOE_VERSION "0.1"
|
|
#define FCOE_NAME "fcoe"
|
|
#define FCOE_VENDOR "Open-FCoE.org"
|
|
|
|
#define FCOE_MAX_LUN 255
|
|
#define FCOE_MAX_FCP_TARGET 256
|
|
|
|
#define FCOE_MAX_OUTSTANDING_COMMANDS 1024
|
|
|
|
#define FCOE_MIN_XID 0x0000 /* the min xid supported by fcoe_sw */
|
|
#define FCOE_MAX_XID 0x07ef /* the max xid supported by fcoe_sw */
|
|
|
|
unsigned int fcoe_debug_logging;
|
|
module_param_named(debug_logging, fcoe_debug_logging, int, S_IRUGO|S_IWUSR);
|
|
MODULE_PARM_DESC(debug_logging, "a bit mask of logging levels");
|
|
|
|
#define FCOE_LOGGING 0x01 /* General logging, not categorized */
|
|
#define FCOE_NETDEV_LOGGING 0x02 /* Netdevice logging */
|
|
|
|
#define FCOE_CHECK_LOGGING(LEVEL, CMD) \
|
|
do { \
|
|
if (unlikely(fcoe_debug_logging & LEVEL)) \
|
|
do { \
|
|
CMD; \
|
|
} while (0); \
|
|
} while (0);
|
|
|
|
#define FCOE_DBG(fmt, args...) \
|
|
FCOE_CHECK_LOGGING(FCOE_LOGGING, \
|
|
printk(KERN_INFO "fcoe: " fmt, ##args);)
|
|
|
|
#define FCOE_NETDEV_DBG(netdev, fmt, args...) \
|
|
FCOE_CHECK_LOGGING(FCOE_NETDEV_LOGGING, \
|
|
printk(KERN_INFO "fcoe: %s" fmt, \
|
|
netdev->name, ##args);)
|
|
|
|
/*
|
|
* this percpu struct for fcoe
|
|
*/
|
|
struct fcoe_percpu_s {
|
|
struct task_struct *thread;
|
|
struct sk_buff_head fcoe_rx_list;
|
|
struct page *crc_eof_page;
|
|
int crc_eof_offset;
|
|
};
|
|
|
|
/*
|
|
* the fcoe sw transport private data
|
|
*/
|
|
struct fcoe_softc {
|
|
struct list_head list;
|
|
struct net_device *real_dev;
|
|
struct net_device *phys_dev; /* device with ethtool_ops */
|
|
struct fc_exch_mgr *oem; /* offload exchange manger */
|
|
struct packet_type fcoe_packet_type;
|
|
struct packet_type fip_packet_type;
|
|
struct sk_buff_head fcoe_pending_queue;
|
|
u8 fcoe_pending_queue_active;
|
|
struct timer_list timer; /* queue timer */
|
|
struct fcoe_ctlr ctlr;
|
|
};
|
|
|
|
#define fcoe_from_ctlr(fc) container_of(fc, struct fcoe_softc, ctlr)
|
|
|
|
static inline struct net_device *fcoe_netdev(
|
|
const struct fc_lport *lp)
|
|
{
|
|
return ((struct fcoe_softc *)lport_priv(lp))->real_dev;
|
|
}
|
|
|
|
#endif /* _FCOE_H_ */
|