Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / isci / remote_device.h
index 58637ee08f55a3f9f7efcea54f25566f1a84ba53..7674caae1d88bac82520c65b0cd6004e19db626f 100644 (file)
@@ -85,27 +85,38 @@ 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
+       #define IDEV_ABORT_PATH_RESUME_PENDING 8
        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 */
        u32 started_request_count;
        struct isci_request *working_request;
        u32 not_ready_reason;
+       scics_sds_remote_node_context_callback abort_resume_cb;
+       void *abort_resume_cbparam;
 };
 
 #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 +313,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 +338,50 @@ 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);
+enum sci_status sci_remote_device_suspend(struct isci_remote_device *idev,
+                                         enum sci_remote_node_suspension_reasons reason);
 #endif /* !defined(_ISCI_REMOTE_DEVICE_H_) */