You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Automatic merge of ../scsi-misc-2.6-old/
This commit is contained in:
@@ -41,6 +41,7 @@ extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
|
||||
#define FORMAT_UNIT 0x04
|
||||
#define READ_BLOCK_LIMITS 0x05
|
||||
#define REASSIGN_BLOCKS 0x07
|
||||
#define INITIALIZE_ELEMENT_STATUS 0x07
|
||||
#define READ_6 0x08
|
||||
#define WRITE_6 0x0a
|
||||
#define SEEK_6 0x0b
|
||||
@@ -65,6 +66,7 @@ extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
|
||||
#define READ_10 0x28
|
||||
#define WRITE_10 0x2a
|
||||
#define SEEK_10 0x2b
|
||||
#define POSITION_TO_ELEMENT 0x2b
|
||||
#define WRITE_VERIFY 0x2e
|
||||
#define VERIFY 0x2f
|
||||
#define SEARCH_HIGH 0x30
|
||||
@@ -97,6 +99,7 @@ extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
|
||||
#define PERSISTENT_RESERVE_OUT 0x5f
|
||||
#define REPORT_LUNS 0xa0
|
||||
#define MOVE_MEDIUM 0xa5
|
||||
#define EXCHANGE_MEDIUM 0xa6
|
||||
#define READ_12 0xa8
|
||||
#define WRITE_12 0xaa
|
||||
#define WRITE_VERIFY_12 0xae
|
||||
@@ -210,6 +213,7 @@ static inline int scsi_status_is_good(int status)
|
||||
#define TYPE_COMM 0x09 /* Communications device */
|
||||
#define TYPE_ENCLOSURE 0x0d /* Enclosure Services Device */
|
||||
#define TYPE_RAID 0x0c
|
||||
#define TYPE_RBC 0x0e
|
||||
#define TYPE_NO_LUN 0x7f
|
||||
|
||||
/*
|
||||
|
||||
@@ -154,7 +154,9 @@ struct scsi_target {
|
||||
unsigned int id; /* target id ... replace
|
||||
* scsi_device.id eventually */
|
||||
unsigned long create:1; /* signal that it needs to be added */
|
||||
unsigned long starget_data[0];
|
||||
void *hostdata; /* available to low-level driver */
|
||||
unsigned long starget_data[0]; /* for the transport */
|
||||
/* starget_data must be the last element!!!! */
|
||||
} __attribute__((aligned(sizeof(unsigned long))));
|
||||
|
||||
#define to_scsi_target(d) container_of(d, struct scsi_target, dev)
|
||||
|
||||
@@ -10,6 +10,7 @@ struct block_device;
|
||||
struct module;
|
||||
struct scsi_cmnd;
|
||||
struct scsi_device;
|
||||
struct scsi_target;
|
||||
struct Scsi_Host;
|
||||
struct scsi_host_cmd_pool;
|
||||
struct scsi_transport_template;
|
||||
@@ -227,6 +228,30 @@ struct scsi_host_template {
|
||||
*/
|
||||
void (* slave_destroy)(struct scsi_device *);
|
||||
|
||||
/*
|
||||
* Before the mid layer attempts to scan for a new device attached
|
||||
* to a target where no target currently exists, it will call this
|
||||
* entry in your driver. Should your driver need to allocate any
|
||||
* structs or perform any other init items in order to send commands
|
||||
* to a currently unused target, then this is where you can perform
|
||||
* those allocations.
|
||||
*
|
||||
* Return values: 0 on success, non-0 on failure
|
||||
*
|
||||
* Status: OPTIONAL
|
||||
*/
|
||||
int (* target_alloc)(struct scsi_target *);
|
||||
|
||||
/*
|
||||
* Immediately prior to deallocating the target structure, and
|
||||
* after all activity to attached scsi devices has ceased, the
|
||||
* midlayer calls this point so that the driver may deallocate
|
||||
* and terminate any references to the target.
|
||||
*
|
||||
* Status: OPTIONAL
|
||||
*/
|
||||
void (* target_destroy)(struct scsi_target *);
|
||||
|
||||
/*
|
||||
* fill in this function to allow the queue depth of this host
|
||||
* to be changeable (on a per device basis). returns either
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#define SCSI_TRANSPORT_H
|
||||
|
||||
#include <linux/transport_class.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
||||
struct scsi_transport_template {
|
||||
/* the attribute containers */
|
||||
@@ -32,8 +33,11 @@ struct scsi_transport_template {
|
||||
* space of this size will be left at the end of the
|
||||
* scsi_* structure */
|
||||
int device_size;
|
||||
int device_private_offset;
|
||||
int target_size;
|
||||
int target_private_offset;
|
||||
int host_size;
|
||||
/* no private offset for the host; there's an alternative mechanism */
|
||||
|
||||
/*
|
||||
* True if the transport wants to use a host-based work-queue
|
||||
@@ -45,4 +49,38 @@ struct scsi_transport_template {
|
||||
dev_to_shost((tc)->dev)
|
||||
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
#endif /* SCSI_TRANSPORT_H */
|
||||
|
||||
Reference in New Issue
Block a user