isci: Converting smp_response to Linux native smp_resp
authorDave Jiang <dave.jiang@intel.com>
Thu, 5 May 2011 01:07:09 +0000 (18:07 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sun, 3 Jul 2011 11:04:46 +0000 (04:04 -0700)
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/scsi/isci/core/intel_sas.h
drivers/scsi/isci/core/scic_sds_smp_request.c
drivers/scsi/isci/sas.h

index d10c3824dbe4364747d887142277037a533ada9b..58bf1fb9b2f5e04558b01b53b13a6294187bf5ed 100644 (file)
@@ -198,184 +198,6 @@ struct sci_ssp_frame_header {
 
 };
 
-/**
- * struct smp_response_header - This structure depicts the contents of the SAS
- *    SMP DISCOVER RESPONSE frame.  For specific information on each of these
- *    individual fields please reference the SAS specification Link layer
- *    section on address frames.
- *
- *
- */
-struct smp_response_header {
-       u8 smp_frame_type;      /* byte 0 */
-       u8 function;            /* byte 1 */
-       u8 function_result;     /* byte 2 */
-       u8 response_length;     /* byte 3 */
-};
-
-
-/**
- * struct smp_response_report_general - This structure depicts the SMP Report
- *    General for expander devices.  It adheres to the SAS-2.1 specification.
- *
- * For specific information on each of these individual fields please reference
- * the SAS specification Application layer section on SMP.
- */
-struct smp_response_report_general {
-       u16 expander_change_count;              /* byte 4-5 */
-       u16 expander_route_indexes;             /* byte 6-7 */
-
-       u32 reserved_byte8:7;                 /* byte 8 bit 0-6 */
-       u32 long_response:1;                  /* byte 8 bit 7 */
-
-       u32 number_of_phys:8;                 /* byte 9 */
-
-       u32 configurable_route_table:1;       /* byte 10 */
-       u32 configuring:1;
-       u32 configures_others:1;
-       u32 open_reject_retry_supported:1;
-       u32 stp_continue_awt:1;
-       u32 self_configuring:1;
-       u32 zone_configuring:1;
-       u32 table_to_table_supported:1;
-
-       u32 reserved_byte11:8;                /* byte 11 */
-
-       u32 enclosure_logical_identifier_high;  /* byte 12-15 */
-       u32 enclosure_logical_identifier_low;   /* byte 16-19 */
-
-       u32 reserved_byte20_23;
-       u32 reserved_byte24_27;
-
-};
-
-struct smp_response_report_general_long {
-       struct smp_response_report_general sas1_1;
-
-       struct {
-               u16 reserved1;
-               u16 stp_bus_inactivity_time_limit;
-               u16 stp_max_connect_time_limit;
-               u16 stp_smp_i_t_nexus_loss_time;
-
-               u32 zoning_enabled:1;
-               u32 zoning_supported:1;
-               u32 physicaL_presence_asserted:1;
-               u32 zone_locked:1;
-               u32 reserved2:1;
-               u32 num_zone_groups:3;
-               u32 saving_zoning_enabled_supported:3;
-               u32 saving_zone_perms_table_supported:1;
-               u32 saving_zone_phy_info_supported:1;
-               u32 saving_zone_manager_password_supported:1;
-               u32 saving:1;
-               u32 reserved3:1;
-               u32 max_number_routed_sas_addresses:16;
-
-               struct sci_sas_address active_zone_manager_sas_address;
-
-               u16 zone_lock_inactivity_time_limit;
-               u16 reserved4;
-
-               u8 reserved5;
-               u8 first_enclosure_connector_element_index;
-               u8 number_of_enclosure_connector_element_indices;
-               u8 reserved6;
-
-               u32 reserved7:7;
-               u32 reduced_functionality:1;
-               u32 time_to_reduce_functionality:8;
-               u32 initial_time_to_reduce_functionality:8;
-               u8 max_reduced_functionality_time;
-
-               u16 last_self_config_status_descriptor_index;
-               u16 max_number_of_stored_self_config_status_descriptors;
-
-               u16 last_phy_event_list_descriptor_index;
-               u16 max_number_of_stored_phy_event_list_descriptors;
-       } sas2;
-
-};
-
-/**
- * struct smp_response_report_manufacturer_information - This structure depicts
- *    the SMP report manufacturer information for expander devices.  It adheres
- *    to the SAS-2.1 specification.
- *
- * For specific information on each of these individual fields please reference
- * the SAS specification Application layer section on SMP.
- */
-struct smp_response_report_manufacturer_information {
-       u32 expander_change_count:16; /* bytes 4-5 */
-       u32 reserved1:16;
-
-       u32 sas1_1_format:1;
-       u32 reserved2:31;
-
-       u8 vendor_id[8];
-       u8 product_id[16];
-       u8 product_revision_level[4];
-       u8 component_vendor_id[8];
-       u8 component_id[2];
-       u8 component_revision_level;
-       u8 reserved3;
-       u8 vendor_specific[8];
-
-};
-
-/**
- * struct smp_response_report_phy_sata - This structure depicts the contents of
- *    the SAS SMP REPORT PHY SATA frame.  For specific information on each of
- *    these individual fields please reference the SAS specification Link layer
- *    section on address frames.
- *
- *
- */
-struct smp_response_report_phy_sata {
-       u32 ignored_byte_4_7; /* bytes 4-7 */
-
-       u32 affiliations_valid:1;
-       u32 affiliations_supported:1;
-       u32 reserved_byte11:6;        /* byte 11 */
-       u32 ignored_byte10:8;         /* byte 10 */
-       u32 phy_identifier:8;         /* byte  9 */
-       u32 reserved_byte_8:8;        /* byte  8 */
-
-       u32 reserved_12_15;
-       u32 stp_sas_address[2];
-       u8 device_to_host_fis[20];
-       u32 reserved_44_47;
-       u32 affiliated_stp_initiator_sas_address[2];
-
-};
-
-#define SMP_REQUEST_VENDOR_SPECIFIC_MAX_LENGTH 1016
-struct smp_response_vendor_specific {
-       u8 response_bytes[SMP_REQUEST_VENDOR_SPECIFIC_MAX_LENGTH];
-};
-
-union smp_response_body {
-       struct smp_response_report_general report_general;
-       struct smp_response_report_manufacturer_information report_manufacturer_information;
-       struct smp_response_report_phy_sata report_phy_sata;
-       struct smp_response_vendor_specific vendor_specific_response;
-};
-
-/**
- * struct smp_response - This structure simply unionizes the existing response
- *    structures into a common response type.
- *
- *
- */
-struct smp_response {
-       struct smp_response_header header;
-
-       union smp_response_body response;
-
-};
-
-#define SMP_FRAME_TYPE_REQUEST          0x40
-#define SMP_FRAME_TYPE_RESPONSE         0x41
 
 #define PHY_OPERATION_NOP               0x00
 #define PHY_OPERATION_LINK_RESET        0x01
index 7d7bd2e29d8fe79eecd1055c7df7c2610c2ced94..e6cfcbba9f9d2b7d15a81cb2940cc4b371db457a 100644 (file)
@@ -53,6 +53,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <scsi/sas.h>
 #include "sas.h"
 #include "intel_sas.h"
 #include "sci_base_state_machine.h"
@@ -79,7 +80,7 @@ u32 scic_sds_smp_request_get_object_size(void)
 {
        return sizeof(struct scic_sds_request)
               + sizeof(struct smp_req)
-              + sizeof(struct smp_response)
+              + sizeof(struct smp_resp)
               + sizeof(struct scu_task_context)
               + SMP_CACHE_BYTES;
 }
@@ -111,7 +112,7 @@ u32 scic_sds_smp_request_get_object_size(void)
 #define scic_sds_smp_request_get_task_context_buffer(memory) \
        ((struct scu_task_context *)(\
                 ((char *)(scic_sds_smp_request_get_response_buffer(memory))) \
-                + sizeof(struct smp_response) \
+                + sizeof(struct smp_resp) \
                 ))
 
 
@@ -271,8 +272,8 @@ scu_smp_request_construct_task_context(struct scic_sds_request *sci_req,
        task_context->response_iu_lower = 0;
 }
 
-/**
- * This method processes an unsolicited frame while the SMP request is waiting
+/*
+ * This function processes an unsolicited frame while the SMP request is waiting
  *    for a response frame.  It will copy the response data, release the
  *    unsolicited frame, and transition the request to the
  *    SCI_BASE_REQUEST_STATE_COMPLETED state.
@@ -281,63 +282,52 @@ scu_smp_request_construct_task_context(struct scic_sds_request *sci_req,
  * @frame_index: This parameter indicates the unsolicited frame index that
  *    should contain the response.
  *
- * This method returns an indication of whether the response frame was handled
+ * This function returns an indication of whether the response frame was handled
  * successfully or not. SCI_SUCCESS Currently this value is always returned and
  * indicates successful processing of the TC response.
  */
-static enum sci_status scic_sds_smp_request_await_response_frame_handler(
-       struct scic_sds_request *sci_req,
-       u32 frame_index)
+static enum sci_status
+scic_sds_smp_request_await_response_frame_handler(
+               struct scic_sds_request *sci_req,
+               u32 frame_index)
 {
        enum sci_status status;
        void *frame_header;
-       struct smp_response_header *rsp_hdr;
-       u8 *user_smp_buffer = sci_req->response_buffer;
+       struct smp_resp *rsp_hdr;
+       u8 *usr_smp_buf = sci_req->response_buffer;
 
        status = scic_sds_unsolicited_frame_control_get_header(
                &(scic_sds_request_get_controller(sci_req)->uf_control),
                frame_index,
-               &frame_header
-               );
+               &frame_header);
 
        /* byte swap the header. */
-       scic_word_copy_with_swap(
-               (u32 *)user_smp_buffer,
-               frame_header,
-               sizeof(struct smp_response_header) / sizeof(u32)
-               );
-       rsp_hdr = (struct smp_response_header *)user_smp_buffer;
+       scic_word_copy_with_swap((u32 *)usr_smp_buf,
+                                frame_header,
+                                SMP_RESP_HDR_SZ / sizeof(u32));
 
-       if (rsp_hdr->smp_frame_type == SMP_FRAME_TYPE_RESPONSE) {
-               void *smp_response_buffer;
+       rsp_hdr = (struct smp_resp *)usr_smp_buf;
+
+       if (rsp_hdr->frame_type == SMP_RESPONSE) {
+               void *smp_resp;
 
                status = scic_sds_unsolicited_frame_control_get_buffer(
                        &(scic_sds_request_get_controller(sci_req)->uf_control),
                        frame_index,
-                       &smp_response_buffer
-                       );
+                       &smp_resp);
 
                scic_word_copy_with_swap(
-                       (u32 *)(user_smp_buffer + sizeof(struct smp_response_header)),
-                       smp_response_buffer,
-                       sizeof(union smp_response_body) / sizeof(u32)
-                       );
-               /*
-                * Don't need to copy to user space. User instead will refer to
-                * core request's response buffer. */
-
-               /*
-                * copy the smp response to framework smp request's response buffer.
-                * scic_sds_smp_request_copy_response(sci_req); */
+                       (u32 *)(usr_smp_buf + SMP_RESP_HDR_SZ),
+                       smp_resp,
+                       (sizeof(struct smp_req) - SMP_RESP_HDR_SZ) /
+                       sizeof(u32));
 
                scic_sds_request_set_status(
-                       sci_req, SCU_TASK_DONE_GOOD, SCI_SUCCESS
-                       );
+                       sci_req, SCU_TASK_DONE_GOOD, SCI_SUCCESS);
 
                sci_base_state_machine_change_state(
                        &sci_req->started_substate_machine,
-                       SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATE_AWAIT_TC_COMPLETION
-                       );
+                       SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATE_AWAIT_TC_COMPLETION);
        } else {
                /* This was not a response frame why did it get forwarded? */
                dev_err(scic_to_dev(sci_req->owning_controller),
@@ -346,23 +336,20 @@ static enum sci_status scic_sds_smp_request_await_response_frame_handler(
                        __func__,
                        sci_req,
                        frame_index,
-                       rsp_hdr->smp_frame_type);
+                       rsp_hdr->frame_type);
 
                scic_sds_request_set_status(
                        sci_req,
                        SCU_TASK_DONE_SMP_FRM_TYPE_ERR,
-                       SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR
-                       );
+                       SCI_FAILURE_CONTROLLER_SPECIFIC_IO_ERR);
 
                sci_base_state_machine_change_state(
                        &sci_req->state_machine,
-                       SCI_BASE_REQUEST_STATE_COMPLETED
-                       );
+                       SCI_BASE_REQUEST_STATE_COMPLETED);
        }
 
-       scic_sds_controller_release_frame(
-               sci_req->owning_controller, frame_index
-               );
+       scic_sds_controller_release_frame(sci_req->owning_controller,
+                                         frame_index);
 
        return SCI_SUCCESS;
 }
index f5d7e6a51070cd7f4dcfaa1bfa9057ce52c15b95..83eab4671958d9666aaa00620586467f79aeae88 100644 (file)
@@ -213,4 +213,6 @@ struct smp_req {
        };
 }  __packed;
 
+#define SMP_RESP_HDR_SZ        4
+
 #endif