Commit ca841f0e authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Dan Williams

isci: remove base_controller abstraction

Merge struct sci_base_controller into scic_sds_controller, and also factor
the two types of state machine handlers into one function.  While we're at
it also remove lots of duplicate incorrect kerneldoc comments for the state
machine handlers.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent bc99aa47
This diff is collapsed.
......@@ -63,36 +63,7 @@
*
*/
struct sci_base_memory_descriptor_list;
struct scic_sds_controller;
#define SCI_CONTROLLER_INVALID_IO_TAG 0xFFFF
/**
* sci_controller_get_memory_descriptor_list_handle() - This method simply
* returns a handle for the memory descriptor list associated with the
* supplied controller. The descriptor list provides DMA safe/capable
* memory requirements for this controller.
* @controller: This parameter specifies the controller for which to retrieve
* the DMA safe memory descriptor list.
*
* The user must adhere to the alignment requirements specified in memory
* descriptor. In situations where the operating environment does not offer
* memory allocation utilities supporting alignment, then it is the
* responsibility of the user to manually align the memory buffer for SCI.
* Thus, the user may have to allocate a larger buffer to meet the alignment.
* Additionally, the user will need to remember the actual memory allocation
* addresses in order to ensure the memory can be properly freed when necessary
* to do so. This method will return a valid handle, but the MDL may not be
* accurate until after the user has invoked the associated
* sci_controller_initialize() routine. A pointer to a physical memory
* descriptor array.
*/
struct sci_base_memory_descriptor_list *
sci_controller_get_memory_descriptor_list_handle(
struct scic_sds_controller *controller);
#endif /* _SCI_CONTROLLER_H_ */
......@@ -69,7 +69,9 @@
#include "sci_pool.h"
#include "sci_controller_constants.h"
#include "sci_memory_descriptor_list.h"
#include "sci_base_controller.h"
#include "sci_base_state.h"
#include "sci_base_state_machine.h"
#include "sci_base_memory_descriptor_list.h"
#include "scic_config_parameters.h"
#include "scic_sds_port.h"
#include "scic_sds_phy.h"
......@@ -82,11 +84,12 @@
#include "scic_sds_unsolicited_frame_control.h"
#include "scic_sds_port_configuration_agent.h"
struct sci_base_remote_device;
struct scic_sds_remote_device;
struct sci_base_request;
struct scic_sds_request;
struct scic_sds_controller;
#define SCU_COMPLETION_RAM_ALIGNMENT (64)
/**
......@@ -166,10 +169,23 @@ struct scic_power_control {
*/
struct scic_sds_controller {
/**
* The struct sci_base_controller is the parent object for the struct scic_sds_controller
* object.
* The field specifies that the parent object for the base controller
* is the base object itself.
*/
struct sci_base_object parent;
/**
* This field points to the memory descriptor list associated with this
* controller. The MDL indicates the memory requirements necessary for
* this controller object.
*/
struct sci_base_controller parent;
struct sci_base_memory_descriptor_list mdl;
/**
* This field contains the information for the base controller state
* machine.
*/
struct sci_base_state_machine state_machine;
/**
* This field is the driver timer object handler used to time the controller
......@@ -376,24 +392,170 @@ struct scic_sds_controller {
};
typedef void (*scic_sds_controller_phy_handler_t)(struct scic_sds_controller *,
/**
* enum scic_sds_controller_states - This enumeration depicts all the states
* for the common controller state machine.
*/
enum scic_sds_controller_states {
/**
* Simply the initial state for the base controller state machine.
*/
SCI_BASE_CONTROLLER_STATE_INITIAL = 0,
/**
* This state indicates that the controller is reset. The memory for
* the controller is in it's initial state, but the controller requires
* initialization.
* This state is entered from the INITIAL state.
* This state is entered from the RESETTING state.
*/
SCI_BASE_CONTROLLER_STATE_RESET,
/**
* This state is typically an action state that indicates the controller
* is in the process of initialization. In this state no new IO operations
* are permitted.
* This state is entered from the RESET state.
*/
SCI_BASE_CONTROLLER_STATE_INITIALIZING,
/**
* This state indicates that the controller has been successfully
* initialized. In this state no new IO operations are permitted.
* This state is entered from the INITIALIZING state.
*/
SCI_BASE_CONTROLLER_STATE_INITIALIZED,
/**
* This state indicates the the controller is in the process of becoming
* ready (i.e. starting). In this state no new IO operations are permitted.
* This state is entered from the INITIALIZED state.
*/
SCI_BASE_CONTROLLER_STATE_STARTING,
/**
* This state indicates the controller is now ready. Thus, the user
* is able to perform IO operations on the controller.
* This state is entered from the STARTING state.
*/
SCI_BASE_CONTROLLER_STATE_READY,
/**
* This state is typically an action state that indicates the controller
* is in the process of resetting. Thus, the user is unable to perform
* IO operations on the controller. A reset is considered destructive in
* most cases.
* This state is entered from the READY state.
* This state is entered from the FAILED state.
* This state is entered from the STOPPED state.
*/
SCI_BASE_CONTROLLER_STATE_RESETTING,
/**
* This state indicates that the controller is in the process of stopping.
* In this state no new IO operations are permitted, but existing IO
* operations are allowed to complete.
* This state is entered from the READY state.
*/
SCI_BASE_CONTROLLER_STATE_STOPPING,
/**
* This state indicates that the controller has successfully been stopped.
* In this state no new IO operations are permitted.
* This state is entered from the STOPPING state.
*/
SCI_BASE_CONTROLLER_STATE_STOPPED,
/**
* This state indicates that the controller could not successfully be
* initialized. In this state no new IO operations are permitted.
* This state is entered from the INITIALIZING state.
* This state is entered from the STARTING state.
* This state is entered from the STOPPING state.
* This state is entered from the RESETTING state.
*/
SCI_BASE_CONTROLLER_STATE_FAILED,
SCI_BASE_CONTROLLER_MAX_STATES
};
typedef enum sci_status (*scic_sds_controller_handler_t)
(struct scic_sds_controller *);
typedef enum sci_status (*scic_sds_controller_timed_handler_t)
(struct scic_sds_controller *, u32);
typedef enum sci_status (*scic_sds_controller_request_handler_t)
(struct scic_sds_controller *,
struct sci_base_remote_device *,
struct sci_base_request *);
typedef enum sci_status (*scic_sds_controller_start_request_handler_t)
(struct scic_sds_controller *,
struct sci_base_remote_device *,
struct sci_base_request *, u16);
typedef void (*scic_sds_controller_phy_handler_t)
(struct scic_sds_controller *,
struct scic_sds_port *,
struct scic_sds_phy *);
typedef void (*scic_sds_controller_device_handler_t)(struct scic_sds_controller *,
typedef void (*scic_sds_controller_device_handler_t)
(struct scic_sds_controller *,
struct scic_sds_remote_device *);
struct scic_sds_controller_state_handler {
/**
* The start_handler specifies the method invoked when a user attempts to
* start a controller.
*/
scic_sds_controller_timed_handler_t start;
/**
* The stop_handler specifies the method invoked when a user attempts to
* stop a controller.
*/
scic_sds_controller_timed_handler_t stop;
/**
* struct scic_sds_controller_state_handler -
*
* This structure contains the SDS core specific definition for the state
* handlers.
/**
* The reset_handler specifies the method invoked when a user attempts to
* reset a controller.
*/
struct scic_sds_controller_state_handler {
struct sci_base_controller_state_handler base;
scic_sds_controller_handler_t reset;
/**
* The initialize_handler specifies the method invoked when a user
* attempts to initialize a controller.
*/
scic_sds_controller_handler_t initialize;
/**
* The start_io_handler specifies the method invoked when a user
* attempts to start an IO request for a controller.
*/
scic_sds_controller_start_request_handler_t start_io;
/**
* The complete_io_handler specifies the method invoked when a user
* attempts to complete an IO request for a controller.
*/
scic_sds_controller_request_handler_t complete_io;
/**
* The continue_io_handler specifies the method invoked when a user
* attempts to continue an IO request for a controller.
*/
scic_sds_controller_request_handler_t continue_io;
/**
* The start_task_handler specifies the method invoked when a user
* attempts to start a task management request for a controller.
*/
scic_sds_controller_start_request_handler_t start_task;
/**
* The complete_task_handler specifies the method invoked when a user
* attempts to complete a task management request for a controller.
*/
scic_sds_controller_request_handler_t complete_task;
sci_base_controller_request_handler_t terminate_request;
scic_sds_controller_request_handler_t terminate_request;
scic_sds_controller_phy_handler_t link_up;
scic_sds_controller_phy_handler_t link_down;
scic_sds_controller_device_handler_t device_stopped;
......
......@@ -563,12 +563,11 @@ void scic_sds_remote_device_continue_request(void *dev)
/* we need to check if this request is still valid to continue. */
if (sci_req) {
struct scic_sds_controller *scic = sci_req->owning_controller;
u32 state = scic->parent.state_machine.current_state_id;
sci_base_controller_request_handler_t continue_io;
u32 state = scic->state_machine.current_state_id;
scic_sds_controller_request_handler_t continue_io;
continue_io = scic_sds_controller_state_handler_table[state].base.continue_io;
continue_io(&scic->parent, &sci_req->target_device->parent,
&sci_req->parent);
continue_io = scic_sds_controller_state_handler_table[state].continue_io;
continue_io(scic, &sci_req->target_device->parent, &sci_req->parent);
}
}
......
......@@ -649,7 +649,7 @@ static enum sci_status scic_sds_stp_request_pio_data_out_trasmit_data_frame(
u32 length)
{
struct scic_sds_stp_request *this_sds_stp_request = (struct scic_sds_stp_request *)this_request;
sci_base_controller_request_handler_t continue_io;
scic_sds_controller_request_handler_t continue_io;
struct scu_sgl_element *current_sgl;
struct scic_sds_controller *scic;
u32 state;
......@@ -675,9 +675,9 @@ static enum sci_status scic_sds_stp_request_pio_data_out_trasmit_data_frame(
/* send the new TC out. */
scic = this_request->owning_controller;
state = scic->parent.state_machine.current_state_id;
continue_io = scic_sds_controller_state_handler_table[state].base.continue_io;
return continue_io(&scic->parent, &this_request->target_device->parent,
state = scic->state_machine.current_state_id;
continue_io = scic_sds_controller_state_handler_table[state].continue_io;
return continue_io(scic, &this_request->target_device->parent,
&this_request->parent);
}
......@@ -1822,7 +1822,7 @@ static void scic_sds_stp_request_started_soft_reset_await_h2d_diagnostic_complet
struct sci_base_object *object)
{
struct scic_sds_request *this_request = (struct scic_sds_request *)object;
sci_base_controller_request_handler_t continue_io;
scic_sds_controller_request_handler_t continue_io;
struct scu_task_context *task_context;
struct sata_fis_reg_h2d *h2d_fis;
struct scic_sds_controller *scic;
......@@ -1839,10 +1839,10 @@ static void scic_sds_stp_request_started_soft_reset_await_h2d_diagnostic_complet
task_context->control_frame = 0;
scic = this_request->owning_controller;
state = scic->parent.state_machine.current_state_id;
continue_io = scic_sds_controller_state_handler_table[state].base.continue_io;
state = scic->state_machine.current_state_id;
continue_io = scic_sds_controller_state_handler_table[state].continue_io;
status = continue_io(&scic->parent, &this_request->target_device->parent,
status = continue_io(scic, &this_request->target_device->parent,
&this_request->parent);
if (status == SCI_SUCCESS) {
......
......@@ -62,6 +62,7 @@
#include "request.h"
#include "host.h"
#include "probe_roms.h"
#include "core/scic_sds_controller.h"
irqreturn_t isci_msix_isr(int vec, void *data)
{
......@@ -231,9 +232,8 @@ static int isci_host_mdl_allocate_coherent(
struct coherent_memory_info *mdl_struct;
u32 size = 0;
struct sci_base_memory_descriptor_list *mdl_handle
= sci_controller_get_memory_descriptor_list_handle(
isci_host->core_controller);
struct sci_base_memory_descriptor_list *mdl_handle =
&isci_host->core_controller->mdl;
sci_mdl_first_entry(mdl_handle);
......
......@@ -65,7 +65,7 @@
#include <scsi/libsas.h>
#include <scsi/scsi.h>
#include "sci_base_controller.h"
#include "core/sci_object.h"
#include "scic_controller.h"
#include "host.h"
#include "timers.h"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment