]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/scsi/libsas/sas_internal.h
block: unify request timeout handling
[mirror_ubuntu-artful-kernel.git] / drivers / scsi / libsas / sas_internal.h
index 137d7e496b6d99ab6d1f6c8cbac094e27d072760..0001374bd6b251164d69d7fdf3b7ced78e4b5901 100644 (file)
 #define SAS_DPRINTK(fmt, ...)
 #endif
 
+#define TO_SAS_TASK(_scsi_cmd)  ((void *)(_scsi_cmd)->host_scribble)
+#define ASSIGN_SAS_TASK(_sc, _t) do { (_sc)->host_scribble = (void *) _t; } while (0)
+
 void sas_scsi_recover_host(struct Scsi_Host *shost);
 
 int sas_show_class(enum sas_class class, char *buf);
-int sas_show_proto(enum sas_proto proto, char *buf);
+int sas_show_proto(enum sas_protocol proto, char *buf);
 int sas_show_linkrate(enum sas_linkrate linkrate, char *buf);
 int sas_show_oob_mode(enum sas_oob_mode oob_mode, char *buf);
 
@@ -52,7 +55,7 @@ void sas_unregister_phys(struct sas_ha_struct *sas_ha);
 int  sas_register_ports(struct sas_ha_struct *sas_ha);
 void sas_unregister_ports(struct sas_ha_struct *sas_ha);
 
-enum scsi_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *);
+enum blk_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *);
 
 int  sas_init_queue(struct sas_ha_struct *sas_ha);
 int  sas_init_events(struct sas_ha_struct *sas_ha);
@@ -77,10 +80,24 @@ struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy);
 
 void sas_hae_reset(struct work_struct *work);
 
+#ifdef CONFIG_SCSI_SAS_HOST_SMP
+extern int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req,
+                               struct request *rsp);
+#else
+static inline int sas_smp_host_handler(struct Scsi_Host *shost,
+                                      struct request *req,
+                                      struct request *rsp)
+{
+       shost_printk(KERN_ERR, shost,
+               "Cannot send SMP to a sas host (not enabled in CONFIG)\n");
+       return -EINVAL;
+}
+#endif
+
 static inline void sas_queue_event(int event, spinlock_t *lock,
                                   unsigned long *pending,
                                   struct work_struct *work,
-                                  struct Scsi_Host *shost)
+                                  struct sas_ha_struct *sas_ha)
 {
        unsigned long flags;
 
@@ -91,7 +108,12 @@ static inline void sas_queue_event(int event, spinlock_t *lock,
        }
        __set_bit(event, pending);
        spin_unlock_irqrestore(lock, flags);
-       scsi_queue_work(shost, work);
+
+       spin_lock_irqsave(&sas_ha->state_lock, flags);
+       if (sas_ha->state != SAS_HA_UNREGISTERED) {
+               scsi_queue_work(sas_ha->core.shost, work);
+       }
+       spin_unlock_irqrestore(&sas_ha->state_lock, flags);
 }
 
 static inline void sas_begin_event(int event, spinlock_t *lock,