2019-05-01 19:13:57 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
2005-04-17 02:20:36 +04:00
/*
* Transport specific attributes .
*
* Copyright ( c ) 2003 Silicon Graphics , Inc . All rights reserved .
*/
# ifndef SCSI_TRANSPORT_H
# define SCSI_TRANSPORT_H
# include <linux/transport_class.h>
2008-09-14 16:55:09 +04:00
# include <linux/blkdev.h>
2011-11-24 05:12:59 +04:00
# include <linux/bug.h>
2005-05-25 01:57:31 +04:00
# include <scsi/scsi_host.h>
2007-02-16 12:46:25 +03:00
# include <scsi/scsi_device.h>
2005-04-17 02:20:36 +04:00
struct scsi_transport_template {
/* the attribute containers */
struct transport_container host_attrs ;
struct transport_container target_attrs ;
struct transport_container device_attrs ;
2005-06-11 06:24:30 +04:00
/*
2006-01-13 21:04:00 +03:00
* If set , called from sysfs and legacy procfs rescanning code .
2005-06-11 06:24:30 +04:00
*/
2014-06-25 17:27:36 +04:00
int ( * user_scan ) ( struct Scsi_Host * , uint , uint , u64 ) ;
2005-06-11 06:24:30 +04:00
2005-04-17 02:20:36 +04:00
/* The size of the specific transport attribute structure (a
* space of this size will be left at the end of the
* scsi_ * structure */
int device_size ;
2005-05-25 01:57:31 +04:00
int device_private_offset ;
2005-04-17 02:20:36 +04:00
int target_size ;
2005-05-25 01:57:31 +04:00
int target_private_offset ;
2005-04-17 02:20:36 +04:00
int host_size ;
2005-05-25 01:57:31 +04:00
/* no private offset for the host; there's an alternative mechanism */
2005-04-17 02:20:36 +04:00
/*
* True if the transport wants to use a host - based work - queue
*/
unsigned int create_work_queue : 1 ;
2006-03-13 16:28:57 +03:00
2006-04-01 21:21:04 +04:00
/*
* Allows a transport to override the default error handler .
*/
void ( * eh_strategy_handler ) ( struct Scsi_Host * ) ;
2005-04-17 02:20:36 +04:00
} ;
# define transport_class_to_shost(tc) \
2008-02-22 02:13:36 +03:00
dev_to_shost ( ( tc ) - > parent )
2005-04-17 02:20:36 +04:00
2005-05-25 01:57:31 +04:00
/* Private area maintenance. The driver requested allocations come
* directly after the transport class allocations ( if any ) . The idea
* is that you * must * call these only once . The code assumes that the
* initial values are the ones the transport specific code requires */
static inline void
scsi_transport_reserve_target ( struct scsi_transport_template * t , int space )
{
BUG_ON ( t - > target_private_offset ! = 0 ) ;
t - > target_private_offset = ALIGN ( t - > target_size , sizeof ( void * ) ) ;
t - > target_size = t - > target_private_offset + space ;
}
static inline void
scsi_transport_reserve_device ( struct scsi_transport_template * t , int space )
{
BUG_ON ( t - > device_private_offset ! = 0 ) ;
t - > device_private_offset = ALIGN ( t - > device_size , sizeof ( void * ) ) ;
t - > device_size = t - > device_private_offset + space ;
}
static inline void *
scsi_transport_target_data ( struct scsi_target * starget )
{
struct Scsi_Host * shost = dev_to_shost ( & starget - > dev ) ;
return ( u8 * ) starget - > starget_data
+ shost - > transportt - > target_private_offset ;
}
static inline void *
scsi_transport_device_data ( struct scsi_device * sdev )
{
struct Scsi_Host * shost = sdev - > host ;
return ( u8 * ) sdev - > sdev_data
+ shost - > transportt - > device_private_offset ;
}
2017-01-02 21:52:10 +03:00
void __scsi_init_queue ( struct Scsi_Host * shost , struct request_queue * q ) ;
2005-04-17 02:20:36 +04:00
# endif /* SCSI_TRANSPORT_H */