xref: /openbmc/linux/include/linux/bsg-lib.h (revision 26440303)
1a497ee34SChristoph Hellwig /* SPDX-License-Identifier: GPL-2.0-or-later */
2aa387cc8SMike Christie /*
3aa387cc8SMike Christie  *  BSG helper library
4aa387cc8SMike Christie  *
5aa387cc8SMike Christie  *  Copyright (C) 2008   James Smart, Emulex Corporation
6aa387cc8SMike Christie  *  Copyright (C) 2011   Red Hat, Inc.  All rights reserved.
7aa387cc8SMike Christie  *  Copyright (C) 2011   Mike Christie
8aa387cc8SMike Christie  */
9aa387cc8SMike Christie #ifndef _BLK_BSG_
10aa387cc8SMike Christie #define _BLK_BSG_
11aa387cc8SMike Christie 
12aa387cc8SMike Christie #include <linux/blkdev.h>
13aa387cc8SMike Christie 
14*ead09dd3SChristoph Hellwig struct bsg_job;
15aa387cc8SMike Christie struct request;
16aa387cc8SMike Christie struct device;
17aa387cc8SMike Christie struct scatterlist;
18aa387cc8SMike Christie struct request_queue;
19aa387cc8SMike Christie 
201028e4b3SJens Axboe typedef int (bsg_job_fn) (struct bsg_job *);
211028e4b3SJens Axboe typedef enum blk_eh_timer_return (bsg_timeout_fn)(struct request *);
221028e4b3SJens Axboe 
23aa387cc8SMike Christie struct bsg_buffer {
24aa387cc8SMike Christie 	unsigned int payload_len;
25aa387cc8SMike Christie 	int sg_cnt;
26aa387cc8SMike Christie 	struct scatterlist *sg_list;
27aa387cc8SMike Christie };
28aa387cc8SMike Christie 
29aa387cc8SMike Christie struct bsg_job {
30aa387cc8SMike Christie 	struct device *dev;
31aa387cc8SMike Christie 
32bf0f2d38SJohannes Thumshirn 	struct kref kref;
33bf0f2d38SJohannes Thumshirn 
3431156ec3SChristoph Hellwig 	unsigned int timeout;
3531156ec3SChristoph Hellwig 
36aa387cc8SMike Christie 	/* Transport/driver specific request/reply structs */
37aa387cc8SMike Christie 	void *request;
38aa387cc8SMike Christie 	void *reply;
39aa387cc8SMike Christie 
40aa387cc8SMike Christie 	unsigned int request_len;
41aa387cc8SMike Christie 	unsigned int reply_len;
42aa387cc8SMike Christie 	/*
43aa387cc8SMike Christie 	 * On entry : reply_len indicates the buffer size allocated for
44aa387cc8SMike Christie 	 * the reply.
45aa387cc8SMike Christie 	 *
46aa387cc8SMike Christie 	 * Upon completion : the message handler must set reply_len
47aa387cc8SMike Christie 	 *  to indicates the size of the reply to be returned to the
48aa387cc8SMike Christie 	 *  caller.
49aa387cc8SMike Christie 	 */
50aa387cc8SMike Christie 
51aa387cc8SMike Christie 	/* DMA payloads for the request/response */
52aa387cc8SMike Christie 	struct bsg_buffer request_payload;
53aa387cc8SMike Christie 	struct bsg_buffer reply_payload;
54aa387cc8SMike Christie 
5517cb960fSChristoph Hellwig 	int result;
5617cb960fSChristoph Hellwig 	unsigned int reply_payload_rcv_len;
5717cb960fSChristoph Hellwig 
58972248e9SChristoph Hellwig 	/* BIDI support */
59972248e9SChristoph Hellwig 	struct request *bidi_rq;
60972248e9SChristoph Hellwig 	struct bio *bidi_bio;
61972248e9SChristoph Hellwig 
62aa387cc8SMike Christie 	void *dd_data;		/* Used for driver-specific storage */
63aa387cc8SMike Christie };
64aa387cc8SMike Christie 
65aa387cc8SMike Christie void bsg_job_done(struct bsg_job *job, int result,
66aa387cc8SMike Christie 		  unsigned int reply_payload_rcv_len);
67c1225f01SChristoph Hellwig struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
681028e4b3SJens Axboe 		bsg_job_fn *job_fn, bsg_timeout_fn *timeout, int dd_job_size);
695e28b8d8SJens Axboe void bsg_remove_queue(struct request_queue *q);
70fb6f7c8dSJohannes Thumshirn void bsg_job_put(struct bsg_job *job);
71fb6f7c8dSJohannes Thumshirn int __must_check bsg_job_get(struct bsg_job *job);
72aa387cc8SMike Christie 
73aa387cc8SMike Christie #endif
74