]> Pileus Git - ~andy/linux/blobdiff - drivers/scsi/isci/remote_device.h
isci: When in the abort path, defeat other resume calls until done.
[~andy/linux] / drivers / scsi / isci / remote_device.h
index 58637ee08f55a3f9f7efcea54f25566f1a84ba53..53564c35cf2461f5e540a76245acb518cd10168f 100644 (file)
@@ -85,16 +85,16 @@ struct isci_remote_device {
        #define IDEV_GONE 3
        #define IDEV_IO_READY 4
        #define IDEV_IO_NCQERROR 5
+       #define IDEV_RNC_LLHANG_ENABLED 6
+       #define IDEV_ABORT_PATH_ACTIVE 7
        unsigned long flags;
        struct kref kref;
        struct isci_port *isci_port;
        struct domain_device *domain_dev;
        struct list_head node;
-       struct list_head reqs_in_process;
        struct sci_base_state_machine sm;
        u32 device_port_width;
        enum sas_linkrate connection_rate;
-       bool is_direct_attached;
        struct isci_port *owning_port;
        struct sci_remote_node_context rnc;
        /* XXX unify with device reference counting and delete */
@@ -106,6 +106,14 @@ struct isci_remote_device {
 #define ISCI_REMOTE_DEVICE_START_TIMEOUT 5000
 
 /* device reference routines must be called under sci_lock */
+static inline struct isci_remote_device *isci_get_device(
+       struct isci_remote_device *idev)
+{
+       if (idev)
+               kref_get(&idev->kref);
+       return idev;
+}
+
 static inline struct isci_remote_device *isci_lookup_device(struct domain_device *dev)
 {
        struct isci_remote_device *idev = dev->lldd_dev;
@@ -302,6 +310,8 @@ static inline void sci_remote_device_decrement_request_count(struct isci_remote_
                idev->started_request_count--;
 }
 
+void isci_dev_set_hang_detection_timeout(struct isci_remote_device *idev, u32 timeout);
+
 enum sci_status sci_remote_device_frame_handler(
        struct isci_remote_device *idev,
        u32 frame_index);
@@ -325,12 +335,48 @@ enum sci_status sci_remote_device_complete_io(
        struct isci_remote_device *idev,
        struct isci_request *ireq);
 
-enum sci_status sci_remote_device_suspend(
-       struct isci_remote_device *idev,
-       u32 suspend_type);
-
 void sci_remote_device_post_request(
        struct isci_remote_device *idev,
        u32 request);
 
+enum sci_status sci_remote_device_terminate_requests(
+       struct isci_remote_device *idev);
+
+int isci_remote_device_is_safe_to_abort(
+       struct isci_remote_device *idev);
+
+enum sci_status
+sci_remote_device_abort_requests_pending_abort(
+       struct isci_remote_device *idev);
+
+enum sci_status isci_remote_device_suspend(
+       struct isci_host *ihost,
+       struct isci_remote_device *idev);
+
+enum sci_status sci_remote_device_resume(
+       struct isci_remote_device *idev,
+       scics_sds_remote_node_context_callback cb_fn,
+       void *cb_p);
+
+enum sci_status isci_remote_device_resume_from_abort(
+       struct isci_host *ihost,
+       struct isci_remote_device *idev);
+
+enum sci_status isci_remote_device_reset(
+       struct isci_host *ihost,
+       struct isci_remote_device *idev);
+
+enum sci_status isci_remote_device_reset_complete(
+       struct isci_host *ihost,
+       struct isci_remote_device *idev);
+
+enum sci_status isci_remote_device_suspend_terminate(
+       struct isci_host *ihost,
+       struct isci_remote_device *idev,
+       struct isci_request *ireq);
+
+enum sci_status isci_remote_device_terminate_requests(
+       struct isci_host *ihost,
+       struct isci_remote_device *idev,
+       struct isci_request *ireq);
 #endif /* !defined(_ISCI_REMOTE_DEVICE_H_) */