1*85b4aa49SRobert Love /* 2*85b4aa49SRobert Love * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved. 3*85b4aa49SRobert Love * 4*85b4aa49SRobert Love * This program is free software; you can redistribute it and/or modify it 5*85b4aa49SRobert Love * under the terms and conditions of the GNU General Public License, 6*85b4aa49SRobert Love * version 2, as published by the Free Software Foundation. 7*85b4aa49SRobert Love * 8*85b4aa49SRobert Love * This program is distributed in the hope it will be useful, but WITHOUT 9*85b4aa49SRobert Love * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10*85b4aa49SRobert Love * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11*85b4aa49SRobert Love * more details. 12*85b4aa49SRobert Love * 13*85b4aa49SRobert Love * You should have received a copy of the GNU General Public License along with 14*85b4aa49SRobert Love * this program; if not, write to the Free Software Foundation, Inc., 15*85b4aa49SRobert Love * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 16*85b4aa49SRobert Love * 17*85b4aa49SRobert Love * Maintained at www.Open-FCoE.org 18*85b4aa49SRobert Love */ 19*85b4aa49SRobert Love 20*85b4aa49SRobert Love #ifndef _LIBFCOE_H 21*85b4aa49SRobert Love #define _LIBFCOE_H 22*85b4aa49SRobert Love 23*85b4aa49SRobert Love #include <linux/netdevice.h> 24*85b4aa49SRobert Love #include <linux/skbuff.h> 25*85b4aa49SRobert Love #include <scsi/fc/fc_fcoe.h> 26*85b4aa49SRobert Love #include <scsi/libfc.h> 27*85b4aa49SRobert Love 28*85b4aa49SRobert Love /* 29*85b4aa49SRobert Love * this percpu struct for fcoe 30*85b4aa49SRobert Love */ 31*85b4aa49SRobert Love struct fcoe_percpu_s { 32*85b4aa49SRobert Love int cpu; 33*85b4aa49SRobert Love struct task_struct *thread; 34*85b4aa49SRobert Love struct sk_buff_head fcoe_rx_list; 35*85b4aa49SRobert Love struct page *crc_eof_page; 36*85b4aa49SRobert Love int crc_eof_offset; 37*85b4aa49SRobert Love }; 38*85b4aa49SRobert Love 39*85b4aa49SRobert Love /* 40*85b4aa49SRobert Love * the fcoe sw transport private data 41*85b4aa49SRobert Love */ 42*85b4aa49SRobert Love struct fcoe_softc { 43*85b4aa49SRobert Love struct list_head list; 44*85b4aa49SRobert Love struct fc_lport *lp; 45*85b4aa49SRobert Love struct net_device *real_dev; 46*85b4aa49SRobert Love struct net_device *phys_dev; /* device with ethtool_ops */ 47*85b4aa49SRobert Love struct packet_type fcoe_packet_type; 48*85b4aa49SRobert Love struct sk_buff_head fcoe_pending_queue; 49*85b4aa49SRobert Love 50*85b4aa49SRobert Love u8 dest_addr[ETH_ALEN]; 51*85b4aa49SRobert Love u8 ctl_src_addr[ETH_ALEN]; 52*85b4aa49SRobert Love u8 data_src_addr[ETH_ALEN]; 53*85b4aa49SRobert Love /* 54*85b4aa49SRobert Love * fcoe protocol address learning related stuff 55*85b4aa49SRobert Love */ 56*85b4aa49SRobert Love u16 flogi_oxid; 57*85b4aa49SRobert Love u8 flogi_progress; 58*85b4aa49SRobert Love u8 address_mode; 59*85b4aa49SRobert Love }; 60*85b4aa49SRobert Love 61*85b4aa49SRobert Love static inline struct fcoe_softc *fcoe_softc( 62*85b4aa49SRobert Love const struct fc_lport *lp) 63*85b4aa49SRobert Love { 64*85b4aa49SRobert Love return (struct fcoe_softc *)lport_priv(lp); 65*85b4aa49SRobert Love } 66*85b4aa49SRobert Love 67*85b4aa49SRobert Love static inline struct net_device *fcoe_netdev( 68*85b4aa49SRobert Love const struct fc_lport *lp) 69*85b4aa49SRobert Love { 70*85b4aa49SRobert Love return fcoe_softc(lp)->real_dev; 71*85b4aa49SRobert Love } 72*85b4aa49SRobert Love 73*85b4aa49SRobert Love static inline struct fcoe_hdr *skb_fcoe_header(const struct sk_buff *skb) 74*85b4aa49SRobert Love { 75*85b4aa49SRobert Love return (struct fcoe_hdr *)skb_network_header(skb); 76*85b4aa49SRobert Love } 77*85b4aa49SRobert Love 78*85b4aa49SRobert Love static inline int skb_fcoe_offset(const struct sk_buff *skb) 79*85b4aa49SRobert Love { 80*85b4aa49SRobert Love return skb_network_offset(skb); 81*85b4aa49SRobert Love } 82*85b4aa49SRobert Love 83*85b4aa49SRobert Love static inline struct fc_frame_header *skb_fc_header(const struct sk_buff *skb) 84*85b4aa49SRobert Love { 85*85b4aa49SRobert Love return (struct fc_frame_header *)skb_transport_header(skb); 86*85b4aa49SRobert Love } 87*85b4aa49SRobert Love 88*85b4aa49SRobert Love static inline int skb_fc_offset(const struct sk_buff *skb) 89*85b4aa49SRobert Love { 90*85b4aa49SRobert Love return skb_transport_offset(skb); 91*85b4aa49SRobert Love } 92*85b4aa49SRobert Love 93*85b4aa49SRobert Love static inline void skb_reset_fc_header(struct sk_buff *skb) 94*85b4aa49SRobert Love { 95*85b4aa49SRobert Love skb_reset_network_header(skb); 96*85b4aa49SRobert Love skb_set_transport_header(skb, skb_network_offset(skb) + 97*85b4aa49SRobert Love sizeof(struct fcoe_hdr)); 98*85b4aa49SRobert Love } 99*85b4aa49SRobert Love 100*85b4aa49SRobert Love static inline bool skb_fc_is_data(const struct sk_buff *skb) 101*85b4aa49SRobert Love { 102*85b4aa49SRobert Love return skb_fc_header(skb)->fh_r_ctl == FC_RCTL_DD_SOL_DATA; 103*85b4aa49SRobert Love } 104*85b4aa49SRobert Love 105*85b4aa49SRobert Love static inline bool skb_fc_is_cmd(const struct sk_buff *skb) 106*85b4aa49SRobert Love { 107*85b4aa49SRobert Love return skb_fc_header(skb)->fh_r_ctl == FC_RCTL_DD_UNSOL_CMD; 108*85b4aa49SRobert Love } 109*85b4aa49SRobert Love 110*85b4aa49SRobert Love static inline bool skb_fc_has_exthdr(const struct sk_buff *skb) 111*85b4aa49SRobert Love { 112*85b4aa49SRobert Love return (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_VFTH) || 113*85b4aa49SRobert Love (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_IFRH) || 114*85b4aa49SRobert Love (skb_fc_header(skb)->fh_r_ctl == FC_RCTL_ENCH); 115*85b4aa49SRobert Love } 116*85b4aa49SRobert Love 117*85b4aa49SRobert Love static inline bool skb_fc_is_roff(const struct sk_buff *skb) 118*85b4aa49SRobert Love { 119*85b4aa49SRobert Love return skb_fc_header(skb)->fh_f_ctl[2] & FC_FC_REL_OFF; 120*85b4aa49SRobert Love } 121*85b4aa49SRobert Love 122*85b4aa49SRobert Love static inline u16 skb_fc_oxid(const struct sk_buff *skb) 123*85b4aa49SRobert Love { 124*85b4aa49SRobert Love return be16_to_cpu(skb_fc_header(skb)->fh_ox_id); 125*85b4aa49SRobert Love } 126*85b4aa49SRobert Love 127*85b4aa49SRobert Love static inline u16 skb_fc_rxid(const struct sk_buff *skb) 128*85b4aa49SRobert Love { 129*85b4aa49SRobert Love return be16_to_cpu(skb_fc_header(skb)->fh_rx_id); 130*85b4aa49SRobert Love } 131*85b4aa49SRobert Love 132*85b4aa49SRobert Love /* FIXME - DMA_BIDIRECTIONAL ? */ 133*85b4aa49SRobert Love #define skb_cb(skb) ((struct fcoe_rcv_info *)&((skb)->cb[0])) 134*85b4aa49SRobert Love #define skb_cmd(skb) (skb_cb(skb)->fr_cmd) 135*85b4aa49SRobert Love #define skb_dir(skb) (skb_cmd(skb)->sc_data_direction) 136*85b4aa49SRobert Love static inline bool skb_fc_is_read(const struct sk_buff *skb) 137*85b4aa49SRobert Love { 138*85b4aa49SRobert Love if (skb_fc_is_cmd(skb) && skb_cmd(skb)) 139*85b4aa49SRobert Love return skb_dir(skb) == DMA_FROM_DEVICE; 140*85b4aa49SRobert Love return false; 141*85b4aa49SRobert Love } 142*85b4aa49SRobert Love 143*85b4aa49SRobert Love static inline bool skb_fc_is_write(const struct sk_buff *skb) 144*85b4aa49SRobert Love { 145*85b4aa49SRobert Love if (skb_fc_is_cmd(skb) && skb_cmd(skb)) 146*85b4aa49SRobert Love return skb_dir(skb) == DMA_TO_DEVICE; 147*85b4aa49SRobert Love return false; 148*85b4aa49SRobert Love } 149*85b4aa49SRobert Love 150*85b4aa49SRobert Love /* libfcoe funcs */ 151*85b4aa49SRobert Love int fcoe_reset(struct Scsi_Host *shost); 152*85b4aa49SRobert Love u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN], 153*85b4aa49SRobert Love unsigned int scheme, unsigned int port); 154*85b4aa49SRobert Love 155*85b4aa49SRobert Love u32 fcoe_fc_crc(struct fc_frame *fp); 156*85b4aa49SRobert Love int fcoe_xmit(struct fc_lport *, struct fc_frame *); 157*85b4aa49SRobert Love int fcoe_rcv(struct sk_buff *, struct net_device *, 158*85b4aa49SRobert Love struct packet_type *, struct net_device *); 159*85b4aa49SRobert Love 160*85b4aa49SRobert Love int fcoe_percpu_receive_thread(void *arg); 161*85b4aa49SRobert Love void fcoe_clean_pending_queue(struct fc_lport *lp); 162*85b4aa49SRobert Love void fcoe_percpu_clean(struct fc_lport *lp); 163*85b4aa49SRobert Love void fcoe_watchdog(ulong vp); 164*85b4aa49SRobert Love int fcoe_link_ok(struct fc_lport *lp); 165*85b4aa49SRobert Love 166*85b4aa49SRobert Love struct fc_lport *fcoe_hostlist_lookup(const struct net_device *); 167*85b4aa49SRobert Love int fcoe_hostlist_add(const struct fc_lport *); 168*85b4aa49SRobert Love int fcoe_hostlist_remove(const struct fc_lport *); 169*85b4aa49SRobert Love 170*85b4aa49SRobert Love struct Scsi_Host *fcoe_host_alloc(struct scsi_host_template *, int); 171*85b4aa49SRobert Love int fcoe_libfc_config(struct fc_lport *, struct libfc_function_template *); 172*85b4aa49SRobert Love 173*85b4aa49SRobert Love /* fcoe sw hba */ 174*85b4aa49SRobert Love int __init fcoe_sw_init(void); 175*85b4aa49SRobert Love int __exit fcoe_sw_exit(void); 176*85b4aa49SRobert Love #endif /* _LIBFCOE_H */ 177