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