xref: /OK3568_Linux_fs/kernel/include/linux/bsg-lib.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  BSG helper library
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Copyright (C) 2008   James Smart, Emulex Corporation
6*4882a593Smuzhiyun  *  Copyright (C) 2011   Red Hat, Inc.  All rights reserved.
7*4882a593Smuzhiyun  *  Copyright (C) 2011   Mike Christie
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun #ifndef _BLK_BSG_
10*4882a593Smuzhiyun #define _BLK_BSG_
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/blkdev.h>
13*4882a593Smuzhiyun #include <scsi/scsi_request.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun struct request;
16*4882a593Smuzhiyun struct device;
17*4882a593Smuzhiyun struct scatterlist;
18*4882a593Smuzhiyun struct request_queue;
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun typedef int (bsg_job_fn) (struct bsg_job *);
21*4882a593Smuzhiyun typedef enum blk_eh_timer_return (bsg_timeout_fn)(struct request *);
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun struct bsg_buffer {
24*4882a593Smuzhiyun 	unsigned int payload_len;
25*4882a593Smuzhiyun 	int sg_cnt;
26*4882a593Smuzhiyun 	struct scatterlist *sg_list;
27*4882a593Smuzhiyun };
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun struct bsg_job {
30*4882a593Smuzhiyun 	struct device *dev;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	struct kref kref;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	unsigned int timeout;
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	/* Transport/driver specific request/reply structs */
37*4882a593Smuzhiyun 	void *request;
38*4882a593Smuzhiyun 	void *reply;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	unsigned int request_len;
41*4882a593Smuzhiyun 	unsigned int reply_len;
42*4882a593Smuzhiyun 	/*
43*4882a593Smuzhiyun 	 * On entry : reply_len indicates the buffer size allocated for
44*4882a593Smuzhiyun 	 * the reply.
45*4882a593Smuzhiyun 	 *
46*4882a593Smuzhiyun 	 * Upon completion : the message handler must set reply_len
47*4882a593Smuzhiyun 	 *  to indicates the size of the reply to be returned to the
48*4882a593Smuzhiyun 	 *  caller.
49*4882a593Smuzhiyun 	 */
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	/* DMA payloads for the request/response */
52*4882a593Smuzhiyun 	struct bsg_buffer request_payload;
53*4882a593Smuzhiyun 	struct bsg_buffer reply_payload;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	int result;
56*4882a593Smuzhiyun 	unsigned int reply_payload_rcv_len;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	/* BIDI support */
59*4882a593Smuzhiyun 	struct request *bidi_rq;
60*4882a593Smuzhiyun 	struct bio *bidi_bio;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	void *dd_data;		/* Used for driver-specific storage */
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun void bsg_job_done(struct bsg_job *job, int result,
66*4882a593Smuzhiyun 		  unsigned int reply_payload_rcv_len);
67*4882a593Smuzhiyun struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
68*4882a593Smuzhiyun 		bsg_job_fn *job_fn, bsg_timeout_fn *timeout, int dd_job_size);
69*4882a593Smuzhiyun void bsg_remove_queue(struct request_queue *q);
70*4882a593Smuzhiyun void bsg_job_put(struct bsg_job *job);
71*4882a593Smuzhiyun int __must_check bsg_job_get(struct bsg_job *job);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #endif
74