Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | // SPDX-License-Identifier: GPL-2.0-only /****************************************************************************** AudioScience HPI driver Copyright (C) 1997-2014 AudioScience Inc. <support@audioscience.com> Hardware Programming Interface (HPI) Utility functions. (C) Copyright AudioScience Inc. 2007 *******************************************************************************/ #include "hpi_internal.h" #include "hpimsginit.h" #include <linux/nospec.h> /* The actual message size for each object type */ static u16 msg_size[HPI_OBJ_MAXINDEX + 1] = HPI_MESSAGE_SIZE_BY_OBJECT; /* The actual response size for each object type */ static u16 res_size[HPI_OBJ_MAXINDEX + 1] = HPI_RESPONSE_SIZE_BY_OBJECT; /* Flag to enable alternate message type for SSX2 bypass. */ static u16 gwSSX2_bypass; /** \internal * initialize the HPI message structure */ static void hpi_init_message(struct hpi_message *phm, u16 object, u16 function) { u16 size; if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) { object = array_index_nospec(object, HPI_OBJ_MAXINDEX + 1); size = msg_size[object]; } else { size = sizeof(*phm); } memset(phm, 0, size); phm->size = size; if (gwSSX2_bypass) phm->type = HPI_TYPE_SSX2BYPASS_MESSAGE; else phm->type = HPI_TYPE_REQUEST; phm->object = object; phm->function = function; phm->version = 0; phm->adapter_index = HPI_ADAPTER_INDEX_INVALID; /* Expect actual adapter index to be set by caller */ } /** \internal * initialize the HPI response structure */ void hpi_init_response(struct hpi_response *phr, u16 object, u16 function, u16 error) { u16 size; if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) { object = array_index_nospec(object, HPI_OBJ_MAXINDEX + 1); size = res_size[object]; } else { size = sizeof(*phr); } memset(phr, 0, sizeof(*phr)); phr->size = size; phr->type = HPI_TYPE_RESPONSE; phr->object = object; phr->function = function; phr->error = error; phr->specific_error = 0; phr->version = 0; } void hpi_init_message_response(struct hpi_message *phm, struct hpi_response *phr, u16 object, u16 function) { hpi_init_message(phm, object, function); /* default error return if the response is not filled in by the callee */ hpi_init_response(phr, object, function, HPI_ERROR_PROCESSING_MESSAGE); } static void hpi_init_messageV1(struct hpi_message_header *phm, u16 size, u16 object, u16 function) { memset(phm, 0, size); if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) { phm->size = size; phm->type = HPI_TYPE_REQUEST; phm->object = object; phm->function = function; phm->version = 1; /* Expect adapter index to be set by caller */ } } void hpi_init_responseV1(struct hpi_response_header *phr, u16 size, u16 object, u16 function) { (void)object; (void)function; memset(phr, 0, size); phr->size = size; phr->version = 1; phr->type = HPI_TYPE_RESPONSE; phr->error = HPI_ERROR_PROCESSING_MESSAGE; } void hpi_init_message_responseV1(struct hpi_message_header *phm, u16 msg_size, struct hpi_response_header *phr, u16 res_size, u16 object, u16 function) { hpi_init_messageV1(phm, msg_size, object, function); hpi_init_responseV1(phr, res_size, object, function); } |