summaryrefslogtreecommitdiff
path: root/drivers/scsi/libfc/fc_libfc.h
blob: b74189d893223101f921f775ec694e5390b8193e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * 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 _FC_LIBFC_H_
#define _FC_LIBFC_H_

#define FC_LIBFC_LOGGING 0x01 /* General logging, not categorized */
#define FC_LPORT_LOGGING 0x02 /* lport layer logging */
#define FC_DISC_LOGGING	 0x04 /* discovery layer logging */
#define FC_RPORT_LOGGING 0x08 /* rport layer logging */
#define FC_FCP_LOGGING	 0x10 /* I/O path logging */
#define FC_EM_LOGGING	 0x20 /* Exchange Manager logging */
#define FC_EXCH_LOGGING	 0x40 /* Exchange/Sequence logging */
#define FC_SCSI_LOGGING	 0x80 /* SCSI logging (mostly error handling) */

extern unsigned int fc_debug_logging;

#define FC_CHECK_LOGGING(LEVEL, CMD)			\
	do {						\
		if (unlikely(fc_debug_logging & LEVEL))	\
			do {				\
				CMD;			\
			} while (0);			\
	} while (0)

#define FC_LIBFC_DBG(fmt, args...)					\
	FC_CHECK_LOGGING(FC_LIBFC_LOGGING,				\
			 pr_info("libfc: " fmt, ##args))

#define FC_LPORT_DBG(lport, fmt, args...)				\
	FC_CHECK_LOGGING(FC_LPORT_LOGGING,				\
			 pr_info("host%u: lport %6.6x: " fmt,		\
				 (lport)->host->host_no,		\
				 (lport)->port_id, ##args))

#define FC_DISC_DBG(disc, fmt, args...)					\
	FC_CHECK_LOGGING(FC_DISC_LOGGING,				\
			 pr_info("host%u: disc: " fmt,			\
				 fc_disc_lport(disc)->host->host_no,	\
				 ##args))

#define FC_RPORT_ID_DBG(lport, port_id, fmt, args...)			\
	FC_CHECK_LOGGING(FC_RPORT_LOGGING,				\
			 pr_info("host%u: rport %6.6x: " fmt,		\
				 (lport)->host->host_no,		\
				 (port_id), ##args))

#define FC_RPORT_DBG(rdata, fmt, args...)				\
	FC_RPORT_ID_DBG((rdata)->local_port, (rdata)->ids.port_id, fmt, ##args)

#define FC_FCP_DBG(pkt, fmt, args...)					\
	FC_CHECK_LOGGING(FC_FCP_LOGGING,				\
	{								\
		if ((pkt)->seq_ptr) {					\
			struct fc_exch *_ep = NULL;			\
			_ep = fc_seq_exch((pkt)->seq_ptr);		\
			pr_info("host%u: fcp: %6.6x: "			\
				"xid %04x-%04x: " fmt,			\
				(pkt)->lp->host->host_no,		\
				(pkt)->rport->port_id,			\
				(_ep)->oxid, (_ep)->rxid, ##args);	\
		} else {						\
			pr_info("host%u: fcp: %6.6x: " fmt,		\
				(pkt)->lp->host->host_no,		\
				(pkt)->rport->port_id, ##args);		\
		}							\
	})

#define FC_EXCH_DBG(exch, fmt, args...)					\
	FC_CHECK_LOGGING(FC_EXCH_LOGGING,				\
			 pr_info("host%u: xid %4x: " fmt,		\
				 (exch)->lp->host->host_no,		\
				 exch->xid, ##args))

#define FC_SCSI_DBG(lport, fmt, args...)				\
	FC_CHECK_LOGGING(FC_SCSI_LOGGING,				\
			 pr_info("host%u: scsi: " fmt,			\
				 (lport)->host->host_no, ##args))

/*
 * FC-4 Providers.
 */
extern struct fc4_prov *fc_active_prov[];	/* providers without recv */
extern struct fc4_prov *fc_passive_prov[];	/* providers with recv */
extern struct mutex fc_prov_mutex;		/* lock over table changes */

extern struct fc4_prov fc_rport_t0_prov;	/* type 0 provider */
extern struct fc4_prov fc_lport_els_prov;	/* ELS provider */
extern struct fc4_prov fc_rport_fcp_init;	/* FCP initiator provider */

/*
 * Set up direct-data placement for this I/O request
 */
void fc_fcp_ddp_setup(struct fc_fcp_pkt *fsp, u16 xid);
void fc_fcp_ddp_done(struct fc_fcp_pkt *fsp);

/*
 * Module setup functions
 */
int fc_setup_exch_mgr(void);
void fc_destroy_exch_mgr(void);
int fc_setup_rport(void);
void fc_destroy_rport(void);
int fc_setup_fcp(void);
void fc_destroy_fcp(void);

/*
 * Internal libfc functions
 */
const char *fc_els_resp_type(struct fc_frame *);
extern void fc_fc4_add_lport(struct fc_lport *);
extern void fc_fc4_del_lport(struct fc_lport *);
extern void fc_fc4_conf_lport_params(struct fc_lport *, enum fc_fh_type);

/*
 * Copies a buffer into an sg list
 */
u32 fc_copy_buffer_to_sglist(void *buf, size_t len,
			     struct scatterlist *sg,
			     u32 *nents, size_t *offset,
			     u32 *crc);

#endif /* _FC_LIBFC_H_ */