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