Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38aa74eb authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Dan Williams
Browse files

isci: remove base_request abstraction



Merge struct sci_base_request into scic_sds_request, 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 ca841f0e
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@

#include "sci_base_state_machine.h"

struct sci_base_request;
struct scic_sds_request;

/**
 * enum sci_base_remote_device_states - This enumeration depicts all the states
@@ -159,12 +159,12 @@ typedef enum sci_status (*sci_base_remote_device_handler_t)(

typedef enum sci_status (*sci_base_remote_device_request_handler_t)(
	struct sci_base_remote_device *,
	struct sci_base_request *
	struct scic_sds_request *
	);

typedef enum sci_status (*sci_base_remote_device_high_priority_request_complete_handler_t)(
	struct sci_base_remote_device *,
	struct sci_base_request *,
	struct scic_sds_request *,
	void *,
	enum sci_io_status
	);
+0 −195
Original line number Diff line number Diff line
/*
 * This file is provided under a dual BSD/GPLv2 license.  When using or
 * redistributing this file, you may do so under either license.
 *
 * GPL LICENSE SUMMARY
 *
 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 * The full GNU General Public License is included in this distribution
 * in the file called LICENSE.GPL.
 *
 * BSD LICENSE
 *
 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *   * Neither the name of Intel Corporation nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _SCI_BASE_REQUST_H_
#define _SCI_BASE_REQUST_H_

/**
 * This file contains all of the constants, types, and method declarations for
 *    the SCI base IO and task request objects.
 *
 *
 */

#include "sci_base_state_machine.h"

/**
 * enum sci_base_request_states - This enumeration depicts all the states for
 *    the common request state machine.
 *
 *
 */
enum sci_base_request_states {
	/**
	 * Simply the initial state for the base request state machine.
	 */
	SCI_BASE_REQUEST_STATE_INITIAL,

	/**
	 * This state indicates that the request has been constructed. This state
	 * is entered from the INITIAL state.
	 */
	SCI_BASE_REQUEST_STATE_CONSTRUCTED,

	/**
	 * This state indicates that the request has been started. This state is
	 * entered from the CONSTRUCTED state.
	 */
	SCI_BASE_REQUEST_STATE_STARTED,

	/**
	 * This state indicates that the request has completed.
	 * This state is entered from the STARTED state. This state is entered from
	 * the ABORTING state.
	 */
	SCI_BASE_REQUEST_STATE_COMPLETED,

	/**
	 * This state indicates that the request is in the process of being
	 * terminated/aborted.
	 * This state is entered from the CONSTRUCTED state.
	 * This state is entered from the STARTED state.
	 */
	SCI_BASE_REQUEST_STATE_ABORTING,

	/**
	 * Simply the final state for the base request state machine.
	 */
	SCI_BASE_REQUEST_STATE_FINAL,
};

/**
 * struct sci_base_request - The base request object abstracts the fields
 *    common to all SCI IO and task request objects.
 *
 *
 */
struct sci_base_request {
	/**
	 * The field specifies that the parent object for the base request is the
	 * base object itself.
	 */
	struct sci_base_object parent;

	/**
	 * This field contains the information for the base request state machine.
	 */
	struct sci_base_state_machine state_machine;
};

typedef enum sci_status (*sci_base_request_handler_t)(
	struct sci_base_request *this_request
	);

/**
 * struct sci_base_request_state_handler - This structure contains all of the
 *    state handler methods common to base IO and task request state machines.
 *    Handler methods provide the ability to change the behavior for user
 *    requests or transitions depending on the state the machine is in.
 *
 *
 */
struct sci_base_request_state_handler {
	/**
	 * The start_handler specifies the method invoked when a user attempts to
	 * start a request.
	 */
	sci_base_request_handler_t start_handler;

	/**
	 * The abort_handler specifies the method invoked when a user attempts to
	 * abort a request.
	 */
	sci_base_request_handler_t abort_handler;

	/**
	 * The complete_handler specifies the method invoked when a user attempts to
	 * complete a request.
	 */
	sci_base_request_handler_t complete_handler;

	/**
	 * The destruct_handler specifies the method invoked when a user attempts to
	 * destruct a request.
	 */
	sci_base_request_handler_t destruct_handler;

};

/**
 * sci_base_request_construct() - Construct the base request.
 * @this_request: This parameter specifies the base request to be constructed.
 * @state_table: This parameter specifies the table of state definitions to be
 *    utilized for the request state machine.
 *
 */
static inline void sci_base_request_construct(
	struct sci_base_request *base_req,
	const struct sci_base_state *my_state_table)
{
	base_req->parent.private = NULL;
	sci_base_state_machine_construct(
		&base_req->state_machine,
		&base_req->parent,
		my_state_table,
		SCI_BASE_REQUEST_STATE_INITIAL
		);

	sci_base_state_machine_start(
		&base_req->state_machine
		);
}

#endif /* _SCI_BASE_REQUST_H_ */
+28 −40
Original line number Diff line number Diff line
@@ -2161,7 +2161,7 @@ enum sci_status scic_controller_reset(
enum sci_io_status scic_controller_start_io(
	struct scic_sds_controller *scic,
	struct scic_sds_remote_device *remote_device,
	struct scic_sds_request *io_request,
	struct scic_sds_request *request,
	u16 io_tag)
{
	u32 state;
@@ -2172,7 +2172,7 @@ enum sci_io_status scic_controller_start_io(

	return start_io(scic,
			(struct sci_base_remote_device *) remote_device,
			(struct sci_base_request *)io_request, io_tag);
			request, io_tag);
}

/**
@@ -2204,7 +2204,7 @@ enum sci_status scic_controller_terminate_request(

	return terminate_request(scic,
				 (struct sci_base_remote_device *)remote_device,
				 (struct sci_base_request *)request);
				 request);
}

/**
@@ -2232,7 +2232,7 @@ enum sci_status scic_controller_terminate_request(
enum sci_status scic_controller_complete_io(
	struct scic_sds_controller *scic,
	struct scic_sds_remote_device *remote_device,
	struct scic_sds_request *io_request)
	struct scic_sds_request *request)
{
	u32 state;
	scic_sds_controller_request_handler_t complete_io;
@@ -2242,7 +2242,7 @@ enum sci_status scic_controller_complete_io(

	return complete_io(scic,
			   (struct sci_base_remote_device *)remote_device,
			   (struct sci_base_request *)io_request);
			   request);
}

/**
@@ -2289,7 +2289,7 @@ enum sci_task_status scic_controller_start_task(
	if (start_task)
		status = start_task(scic,
				    (struct sci_base_remote_device *)remote_device,
				    (struct sci_base_request *)task_request,
				    task_request,
				    task_tag);
	else
		dev_warn(scic_to_dev(scic),
@@ -2329,7 +2329,7 @@ enum sci_status scic_controller_complete_task(
	if (complete_task)
		status = complete_task(scic,
				       (struct sci_base_remote_device *)remote_device,
				       (struct sci_base_request *)task_request);
				       task_request);
	else
		dev_warn(scic_to_dev(scic),
			 "%s: SCIC Controller completing task from invalid "
@@ -2825,7 +2825,7 @@ default_controller_handler(struct scic_sds_controller *scic, const char *func)
static enum sci_status scic_sds_controller_default_start_operation_handler(
	struct scic_sds_controller *scic,
	struct sci_base_remote_device *remote_device,
	struct sci_base_request *io_request,
	struct scic_sds_request *request,
	u16 io_tag)
{
	return default_controller_handler(scic, __func__);
@@ -2834,7 +2834,7 @@ static enum sci_status scic_sds_controller_default_start_operation_handler(
static enum sci_status scic_sds_controller_default_request_handler(
	struct scic_sds_controller *scic,
	struct sci_base_remote_device *remote_device,
	struct sci_base_request *io_request)
	struct scic_sds_request *request)
{
	return default_controller_handler(scic, __func__);
}
@@ -3186,26 +3186,24 @@ static enum sci_status scic_sds_controller_ready_state_stop_handler(
static enum sci_status scic_sds_controller_ready_state_start_io_handler(
	struct scic_sds_controller *controller,
	struct sci_base_remote_device *remote_device,
	struct sci_base_request *io_request,
	struct scic_sds_request *request,
	u16 io_tag)
{
	enum sci_status status;

	struct scic_sds_request *the_request;
	struct scic_sds_remote_device *the_device;

	the_request = (struct scic_sds_request *)io_request;
	the_device = (struct scic_sds_remote_device *)remote_device;

	status = scic_sds_remote_device_start_io(controller, the_device, the_request);
	status = scic_sds_remote_device_start_io(controller, the_device, request);

	if (status != SCI_SUCCESS)
		return status;

	controller->io_request_table[
		scic_sds_io_tag_get_index(the_request->io_tag)] = the_request;
		scic_sds_io_tag_get_index(request->io_tag)] = request;
	scic_sds_controller_post_request(controller,
		scic_sds_request_get_post_context(the_request));
		scic_sds_request_get_post_context(request));
	return SCI_SUCCESS;
}

@@ -3220,22 +3218,20 @@ static enum sci_status scic_sds_controller_ready_state_start_io_handler(
static enum sci_status scic_sds_controller_ready_state_complete_io_handler(
	struct scic_sds_controller *controller,
	struct sci_base_remote_device *remote_device,
	struct sci_base_request *io_request)
	struct scic_sds_request *request)
{
	u16 index;
	enum sci_status status;
	struct scic_sds_request *the_request;
	struct scic_sds_remote_device *the_device;

	the_request = (struct scic_sds_request *)io_request;
	the_device = (struct scic_sds_remote_device *)remote_device;

	status = scic_sds_remote_device_complete_io(controller, the_device,
			the_request);
			request);
	if (status != SCI_SUCCESS)
		return status;

	index = scic_sds_io_tag_get_index(the_request->io_tag);
	index = scic_sds_io_tag_get_index(request->io_tag);
	controller->io_request_table[index] = NULL;
	return SCI_SUCCESS;
}
@@ -3247,16 +3243,12 @@ static enum sci_status scic_sds_controller_ready_state_complete_io_handler(
static enum sci_status scic_sds_controller_ready_state_continue_io_handler(
	struct scic_sds_controller *controller,
	struct sci_base_remote_device *remote_device,
	struct sci_base_request *io_request)
	struct scic_sds_request *request)
{
	struct scic_sds_request *the_request;

	the_request     = (struct scic_sds_request *)io_request;

	controller->io_request_table[
		scic_sds_io_tag_get_index(the_request->io_tag)] = the_request;
		scic_sds_io_tag_get_index(request->io_tag)] = request;
	scic_sds_controller_post_request(controller,
		scic_sds_request_get_post_context(the_request));
		scic_sds_request_get_post_context(request));
	return SCI_SUCCESS;
}

@@ -3273,27 +3265,25 @@ static enum sci_status scic_sds_controller_ready_state_continue_io_handler(
static enum sci_status scic_sds_controller_ready_state_start_task_handler(
	struct scic_sds_controller *controller,
	struct sci_base_remote_device *remote_device,
	struct sci_base_request *io_request,
	struct scic_sds_request *request,
	u16 task_tag)
{
	struct scic_sds_request *the_request     = (struct scic_sds_request *)
					      io_request;
	struct scic_sds_remote_device *the_device      = (struct scic_sds_remote_device *)
						    remote_device;
	enum sci_status status;

	status = scic_sds_remote_device_start_task(controller, the_device,
			the_request);
			request);

	if (status == SCI_SUCCESS) {
		controller->io_request_table[
			scic_sds_io_tag_get_index(the_request->io_tag)] = the_request;
			scic_sds_io_tag_get_index(request->io_tag)] = request;

		scic_sds_controller_post_request(controller,
			scic_sds_request_get_post_context(the_request));
			scic_sds_request_get_post_context(request));
	} else if (status == SCI_FAILURE_RESET_DEVICE_PARTIAL_SUCCESS) {
		controller->io_request_table[
			scic_sds_io_tag_get_index(the_request->io_tag)] = the_request;
			scic_sds_io_tag_get_index(request->io_tag)] = request;

		/*
		 * We will let framework know this task request started successfully,
@@ -3315,13 +3305,11 @@ static enum sci_status scic_sds_controller_ready_state_start_task_handler(
static enum sci_status scic_sds_controller_ready_state_terminate_request_handler(
	struct scic_sds_controller *controller,
	struct sci_base_remote_device *remote_device,
	struct sci_base_request *io_request)
	struct scic_sds_request *request)
{
	struct scic_sds_request *the_request     = (struct scic_sds_request *)
					      io_request;
	enum sci_status status;

	status = scic_sds_io_request_terminate(the_request);
	status = scic_sds_io_request_terminate(request);
	if (status != SCI_SUCCESS)
		return status;

@@ -3330,7 +3318,7 @@ static enum sci_status scic_sds_controller_ready_state_terminate_request_handler
	 * request sub-type.
	 */
	scic_sds_controller_post_request(controller,
		scic_sds_request_get_post_context(the_request) |
		scic_sds_request_get_post_context(request) |
		SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT);
	return SCI_SUCCESS;
}
@@ -3391,7 +3379,7 @@ static void scic_sds_controller_ready_state_link_down_handler(
static enum sci_status scic_sds_controller_stopping_state_complete_io_handler(
	struct scic_sds_controller *controller,
	struct sci_base_remote_device *remote_device,
	struct sci_base_request *io_request)
	struct scic_sds_request *request)
{
	/* XXX: Implement this function */
	return SCI_FAILURE;
+2 −3
Original line number Diff line number Diff line
@@ -86,7 +86,6 @@

struct sci_base_remote_device;
struct scic_sds_remote_device;
struct sci_base_request;
struct scic_sds_request;
struct scic_sds_controller;

@@ -487,11 +486,11 @@ typedef enum sci_status (*scic_sds_controller_timed_handler_t)
typedef enum sci_status (*scic_sds_controller_request_handler_t)
				(struct scic_sds_controller *,
				 struct sci_base_remote_device *,
				 struct sci_base_request *);
				 struct scic_sds_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);
				 struct scic_sds_request *, u16);
typedef void (*scic_sds_controller_phy_handler_t)
				(struct scic_sds_controller *,
				 struct scic_sds_port *,
+3 −27
Original line number Diff line number Diff line
@@ -1090,15 +1090,7 @@ static enum sci_status scic_sds_port_ready_substate_stop_handler(
	return SCI_SUCCESS;
}

/**
 *
 * @port: This is the struct sci_base_port object which is cast into a struct scic_sds_port
 *    object.
 * @device: This is the struct sci_base_remote_device object which is not used in this
 *    function.
 * @io_request: This is the struct sci_base_request object which is not used in this
 *    function.
 *
/*
 * This method is the general ready substate complete io handler for the
 * struct scic_sds_port object.  This function decrments the outstanding request count
 * for this port object. enum sci_status SCI_SUCCESS
@@ -1194,15 +1186,7 @@ static void scic_sds_port_ready_waiting_substate_link_up_handler(
		);
}

/**
 *
 * @port: This is the struct sci_base_port object which is cast into a struct scic_sds_port
 *    object.
 * @device: This is the struct sci_base_remote_device object which is not used in this
 *    request.
 * @io_request: This is the struct sci_base_request object which is not used in this
 *    function.
 *
/*
 * This method is the ready waiting substate start io handler for the
 * struct scic_sds_port object. The port object can not accept new requests so the
 * request is failed. enum sci_status SCI_FAILURE_INVALID_STATE
@@ -1316,15 +1300,7 @@ static void scic_sds_port_ready_operational_substate_link_down_handler(
						    SCIC_SDS_PORT_READY_SUBSTATE_WAITING);
}

/**
 *
 * @port: This is the struct sci_base_port object which is cast into a struct scic_sds_port
 *    object.
 * @device: This is the struct sci_base_remote_device object which is not used in this
 *    function.
 * @io_request: This is the struct sci_base_request object which is not used in this
 *    function.
 *
/*
 * This method is the ready operational substate start io handler for the
 * struct scic_sds_port object.  This function incremetns the outstanding request
 * count for this port object. enum sci_status SCI_SUCCESS
Loading