mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 06:03:36 -04:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (138 commits) [SCSI] libata: implement minimal transport template for ->eh_timed_out [SCSI] eliminate rphy allocation in favour of expander/end device allocation [SCSI] convert mptsas over to end_device/expander allocations [SCSI] allow displaying and setting of cache type via sysfs [SCSI] add scsi_mode_select to scsi_lib.c [SCSI] 3ware 9000 add big endian support [SCSI] qla2xxx: update MAINTAINERS [SCSI] scsi: move target_destroy call [SCSI] fusion - bump version [SCSI] fusion - expander hotplug suport in mptsas module [SCSI] fusion - exposing raid components in mptsas [SCSI] fusion - memory leak, and initializing fields [SCSI] fusion - exclosure misspelled [SCSI] fusion - cleanup mptsas event handling functions [SCSI] fusion - removing target_id/bus_id from the VirtDevice structure [SCSI] fusion - static fix's [SCSI] fusion - move some debug firmware event debug msgs to verbose level [SCSI] fusion - loginfo header update [SCSI] add scsi_reprobe_device [SCSI] megaraid_sas: fix extended timeout handling ...
This commit is contained in:
commit
2152f85366
132 changed files with 35515 additions and 42698 deletions
|
|
@ -378,6 +378,7 @@ extern void device_bind_driver(struct device * dev);
|
|||
extern void device_release_driver(struct device * dev);
|
||||
extern int device_attach(struct device * dev);
|
||||
extern void driver_attach(struct device_driver * drv);
|
||||
extern void device_reprobe(struct device *dev);
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -508,7 +508,6 @@ extern void ata_host_set_remove(struct ata_host_set *host_set);
|
|||
extern int ata_scsi_detect(struct scsi_host_template *sht);
|
||||
extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);
|
||||
extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));
|
||||
extern enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd);
|
||||
extern int ata_scsi_error(struct Scsi_Host *host);
|
||||
extern void ata_eh_qc_complete(struct ata_queued_cmd *qc);
|
||||
extern void ata_eh_qc_retry(struct ata_queued_cmd *qc);
|
||||
|
|
|
|||
|
|
@ -852,6 +852,8 @@
|
|||
#define PCI_DEVICE_ID_QLOGIC_ISP2432 0x2432
|
||||
#define PCI_DEVICE_ID_QLOGIC_ISP2512 0x2512
|
||||
#define PCI_DEVICE_ID_QLOGIC_ISP2522 0x2522
|
||||
#define PCI_DEVICE_ID_QLOGIC_ISP5422 0x5422
|
||||
#define PCI_DEVICE_ID_QLOGIC_ISP5432 0x5432
|
||||
|
||||
#define PCI_VENDOR_ID_CYRIX 0x1078
|
||||
#define PCI_DEVICE_ID_CYRIX_5510 0x0000
|
||||
|
|
|
|||
|
|
@ -20,6 +20,10 @@ struct work_struct {
|
|||
struct timer_list timer;
|
||||
};
|
||||
|
||||
struct execute_work {
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
#define __WORK_INITIALIZER(n, f, d) { \
|
||||
.entry = { &(n).entry, &(n).entry }, \
|
||||
.func = (f), \
|
||||
|
|
@ -74,6 +78,8 @@ extern void init_workqueues(void);
|
|||
void cancel_rearming_delayed_work(struct work_struct *work);
|
||||
void cancel_rearming_delayed_workqueue(struct workqueue_struct *,
|
||||
struct work_struct *);
|
||||
int execute_in_process_context(void (*fn)(void *), void *,
|
||||
struct execute_work *);
|
||||
|
||||
/*
|
||||
* Kill off a pending schedule_delayed_work(). Note that the work callback
|
||||
|
|
|
|||
|
|
@ -433,6 +433,4 @@ struct scsi_lun {
|
|||
/* Used to obtain the PCI location of a device */
|
||||
#define SCSI_IOCTL_GET_PCI 0x5387
|
||||
|
||||
int scsi_execute_in_process_context(void (*fn)(void *data), void *data);
|
||||
|
||||
#endif /* _SCSI_SCSI_H */
|
||||
|
|
|
|||
|
|
@ -104,10 +104,10 @@ struct scsi_cmnd {
|
|||
working on */
|
||||
|
||||
#define SCSI_SENSE_BUFFERSIZE 96
|
||||
unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE]; /* obtained by REQUEST SENSE
|
||||
* when CHECK CONDITION is
|
||||
* received on original command
|
||||
* (auto-sense) */
|
||||
unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE];
|
||||
/* obtained by REQUEST SENSE when
|
||||
* CHECK CONDITION is received on original
|
||||
* command (auto-sense) */
|
||||
|
||||
/* Low-level done function - can be used by low-level driver to point
|
||||
* to completion function. Not used by mid/upper level code. */
|
||||
|
|
@ -120,12 +120,12 @@ struct scsi_cmnd {
|
|||
struct scsi_pointer SCp; /* Scratchpad used by some host adapters */
|
||||
|
||||
unsigned char *host_scribble; /* The host adapter is allowed to
|
||||
* call scsi_malloc and get some memory
|
||||
* and hang it here. The host adapter
|
||||
* is also expected to call scsi_free
|
||||
* to release this memory. (The memory
|
||||
* obtained by scsi_malloc is guaranteed
|
||||
* to be at an address < 16Mb). */
|
||||
* call scsi_malloc and get some memory
|
||||
* and hang it here. The host adapter
|
||||
* is also expected to call scsi_free
|
||||
* to release this memory. (The memory
|
||||
* obtained by scsi_malloc is guaranteed
|
||||
* to be at an address < 16Mb). */
|
||||
|
||||
int result; /* Status code from lower level driver */
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
struct request_queue;
|
||||
|
|
@ -73,7 +74,6 @@ struct scsi_device {
|
|||
unsigned sector_size; /* size in bytes */
|
||||
|
||||
void *hostdata; /* available to low-level driver */
|
||||
char devfs_name[256]; /* devfs junk */
|
||||
char type;
|
||||
char scsi_level;
|
||||
char inq_periph_qual; /* PQ from INQUIRY data */
|
||||
|
|
@ -138,6 +138,8 @@ struct scsi_device {
|
|||
struct device sdev_gendev;
|
||||
struct class_device sdev_classdev;
|
||||
|
||||
struct execute_work ew; /* used to get process context on put */
|
||||
|
||||
enum scsi_device_state sdev_state;
|
||||
unsigned long sdev_data[0];
|
||||
} __attribute__((aligned(sizeof(unsigned long))));
|
||||
|
|
@ -154,6 +156,11 @@ struct scsi_device {
|
|||
#define scmd_printk(prefix, scmd, fmt, a...) \
|
||||
dev_printk(prefix, &(scmd)->device->sdev_gendev, fmt, ##a)
|
||||
|
||||
enum scsi_target_state {
|
||||
STARGET_RUNNING = 1,
|
||||
STARGET_DEL,
|
||||
};
|
||||
|
||||
/*
|
||||
* scsi_target: representation of a scsi target, for now, this is only
|
||||
* used for single_lun devices. If no one has active IO to the target,
|
||||
|
|
@ -168,8 +175,13 @@ struct scsi_target {
|
|||
unsigned int channel;
|
||||
unsigned int id; /* target id ... replace
|
||||
* scsi_device.id eventually */
|
||||
unsigned long create:1; /* signal that it needs to be added */
|
||||
unsigned int create:1; /* signal that it needs to be added */
|
||||
unsigned int pdt_1f_for_no_lun; /* PDT = 0x1f */
|
||||
/* means no lun present */
|
||||
|
||||
char scsi_level;
|
||||
struct execute_work ew;
|
||||
enum scsi_target_state state;
|
||||
void *hostdata; /* available to low-level driver */
|
||||
unsigned long starget_data[0]; /* for the transport */
|
||||
/* starget_data must be the last element!!!! */
|
||||
|
|
@ -249,6 +261,11 @@ extern int scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
|
|||
unsigned char *buffer, int len, int timeout,
|
||||
int retries, struct scsi_mode_data *data,
|
||||
struct scsi_sense_hdr *);
|
||||
extern int scsi_mode_select(struct scsi_device *sdev, int pf, int sp,
|
||||
int modepage, unsigned char *buffer, int len,
|
||||
int timeout, int retries,
|
||||
struct scsi_mode_data *data,
|
||||
struct scsi_sense_hdr *);
|
||||
extern int scsi_test_unit_ready(struct scsi_device *sdev, int timeout,
|
||||
int retries);
|
||||
extern int scsi_device_set_state(struct scsi_device *sdev,
|
||||
|
|
@ -281,6 +298,11 @@ extern int scsi_execute_async(struct scsi_device *sdev,
|
|||
void (*done)(void *, char *, int, int),
|
||||
gfp_t gfp);
|
||||
|
||||
static inline void scsi_device_reprobe(struct scsi_device *sdev)
|
||||
{
|
||||
device_reprobe(&sdev->sdev_gendev);
|
||||
}
|
||||
|
||||
static inline unsigned int sdev_channel(struct scsi_device *sdev)
|
||||
{
|
||||
return sdev->channel;
|
||||
|
|
|
|||
|
|
@ -146,20 +146,6 @@ struct scsi_host_template {
|
|||
int (* eh_bus_reset_handler)(struct scsi_cmnd *);
|
||||
int (* eh_host_reset_handler)(struct scsi_cmnd *);
|
||||
|
||||
/*
|
||||
* This is an optional routine to notify the host that the scsi
|
||||
* timer just fired. The returns tell the timer routine what to
|
||||
* do about this:
|
||||
*
|
||||
* EH_HANDLED: I fixed the error, please complete the command
|
||||
* EH_RESET_TIMER: I need more time, reset the timer and
|
||||
* begin counting again
|
||||
* EH_NOT_HANDLED Begin normal error recovery
|
||||
*
|
||||
* Status: OPTIONAL
|
||||
*/
|
||||
enum scsi_eh_timer_return (* eh_timed_out)(struct scsi_cmnd *);
|
||||
|
||||
/*
|
||||
* Before the mid layer attempts to scan for a new device where none
|
||||
* currently exists, it will call this entry in your driver. Should
|
||||
|
|
|
|||
|
|
@ -48,6 +48,17 @@ struct scsi_transport_template {
|
|||
* True if the transport wants to use a host-based work-queue
|
||||
*/
|
||||
unsigned int create_work_queue : 1;
|
||||
|
||||
/*
|
||||
* This is an optional routine that allows the transport to become
|
||||
* involved when a scsi io timer fires. The return value tells the
|
||||
* timer routine how to finish the io timeout handling:
|
||||
* EH_HANDLED: I fixed the error, please complete the command
|
||||
* EH_RESET_TIMER: I need more time, reset the timer and
|
||||
* begin counting again
|
||||
* EH_NOT_HANDLED Begin normal error recovery
|
||||
*/
|
||||
enum scsi_eh_timer_return (* eh_timed_out)(struct scsi_cmnd *);
|
||||
};
|
||||
|
||||
#define transport_class_to_shost(tc) \
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ enum sas_linkrate {
|
|||
SAS_SATA_PORT_SELECTOR,
|
||||
SAS_LINK_RATE_1_5_GBPS,
|
||||
SAS_LINK_RATE_3_0_GBPS,
|
||||
SAS_LINK_RATE_6_0_GBPS,
|
||||
SAS_LINK_VIRTUAL,
|
||||
};
|
||||
|
||||
|
|
@ -89,11 +90,45 @@ struct sas_rphy {
|
|||
dev_to_rphy((cdev)->dev)
|
||||
#define rphy_to_shost(rphy) \
|
||||
dev_to_shost((rphy)->dev.parent)
|
||||
#define target_to_rphy(targ) \
|
||||
dev_to_rphy((targ)->dev.parent)
|
||||
|
||||
struct sas_end_device {
|
||||
struct sas_rphy rphy;
|
||||
/* flags */
|
||||
unsigned ready_led_meaning:1;
|
||||
/* parameters */
|
||||
u16 I_T_nexus_loss_timeout;
|
||||
u16 initiator_response_timeout;
|
||||
};
|
||||
#define rphy_to_end_device(r) \
|
||||
container_of((r), struct sas_end_device, rphy)
|
||||
|
||||
struct sas_expander_device {
|
||||
int level;
|
||||
|
||||
#define SAS_EXPANDER_VENDOR_ID_LEN 8
|
||||
char vendor_id[SAS_EXPANDER_VENDOR_ID_LEN+1];
|
||||
#define SAS_EXPANDER_PRODUCT_ID_LEN 16
|
||||
char product_id[SAS_EXPANDER_PRODUCT_ID_LEN+1];
|
||||
#define SAS_EXPANDER_PRODUCT_REV_LEN 4
|
||||
char product_rev[SAS_EXPANDER_PRODUCT_REV_LEN+1];
|
||||
#define SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN 8
|
||||
char component_vendor_id[SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN+1];
|
||||
u16 component_id;
|
||||
u8 component_revision_id;
|
||||
|
||||
struct sas_rphy rphy;
|
||||
|
||||
};
|
||||
#define rphy_to_expander_device(r) \
|
||||
container_of((r), struct sas_expander_device, rphy)
|
||||
|
||||
/* The functions by which the transport class and the driver communicate */
|
||||
struct sas_function_template {
|
||||
int (*get_linkerrors)(struct sas_phy *);
|
||||
int (*get_enclosure_identifier)(struct sas_rphy *, u64 *);
|
||||
int (*get_bay_identifier)(struct sas_rphy *);
|
||||
int (*phy_reset)(struct sas_phy *, int);
|
||||
};
|
||||
|
||||
|
|
@ -106,7 +141,8 @@ extern int sas_phy_add(struct sas_phy *);
|
|||
extern void sas_phy_delete(struct sas_phy *);
|
||||
extern int scsi_is_sas_phy(const struct device *);
|
||||
|
||||
extern struct sas_rphy *sas_rphy_alloc(struct sas_phy *);
|
||||
extern struct sas_rphy *sas_end_device_alloc(struct sas_phy *);
|
||||
extern struct sas_rphy *sas_expander_alloc(struct sas_phy *, enum sas_device_type);
|
||||
void sas_rphy_free(struct sas_rphy *);
|
||||
extern int sas_rphy_add(struct sas_rphy *);
|
||||
extern void sas_rphy_delete(struct sas_rphy *);
|
||||
|
|
@ -115,5 +151,17 @@ extern int scsi_is_sas_rphy(const struct device *);
|
|||
extern struct scsi_transport_template *
|
||||
sas_attach_transport(struct sas_function_template *);
|
||||
extern void sas_release_transport(struct scsi_transport_template *);
|
||||
int sas_read_port_mode_page(struct scsi_device *);
|
||||
|
||||
static inline int
|
||||
scsi_is_sas_expander_device(struct device *dev)
|
||||
{
|
||||
struct sas_rphy *rphy;
|
||||
if (!scsi_is_sas_rphy(dev))
|
||||
return 0;
|
||||
rphy = dev_to_rphy(dev);
|
||||
return rphy->identify.device_type == SAS_FANOUT_EXPANDER_DEVICE ||
|
||||
rphy->identify.device_type == SAS_EDGE_EXPANDER_DEVICE;
|
||||
}
|
||||
|
||||
#endif /* SCSI_TRANSPORT_SAS_H */
|
||||
|
|
|
|||
|
|
@ -148,5 +148,9 @@ void spi_schedule_dv_device(struct scsi_device *);
|
|||
void spi_dv_device(struct scsi_device *);
|
||||
void spi_display_xfer_agreement(struct scsi_target *);
|
||||
int spi_print_msg(const unsigned char *);
|
||||
int spi_populate_width_msg(unsigned char *msg, int width);
|
||||
int spi_populate_sync_msg(unsigned char *msg, int period, int offset);
|
||||
int spi_populate_ppr_msg(unsigned char *msg, int period, int offset, int width,
|
||||
int options);
|
||||
|
||||
#endif /* SCSI_TRANSPORT_SPI_H */
|
||||
|
|
|
|||
Loading…
Reference in a new issue