1*719f82d3SEliot Blennerhassett /****************************************************************************** 2*719f82d3SEliot Blennerhassett 3*719f82d3SEliot Blennerhassett AudioScience HPI driver 4*719f82d3SEliot Blennerhassett Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> 5*719f82d3SEliot Blennerhassett 6*719f82d3SEliot Blennerhassett This program is free software; you can redistribute it and/or modify 7*719f82d3SEliot Blennerhassett it under the terms of version 2 of the GNU General Public License as 8*719f82d3SEliot Blennerhassett published by the Free Software Foundation; 9*719f82d3SEliot Blennerhassett 10*719f82d3SEliot Blennerhassett This program is distributed in the hope that it will be useful, 11*719f82d3SEliot Blennerhassett but WITHOUT ANY WARRANTY; without even the implied warranty of 12*719f82d3SEliot Blennerhassett MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*719f82d3SEliot Blennerhassett GNU General Public License for more details. 14*719f82d3SEliot Blennerhassett 15*719f82d3SEliot Blennerhassett You should have received a copy of the GNU General Public License 16*719f82d3SEliot Blennerhassett along with this program; if not, write to the Free Software 17*719f82d3SEliot Blennerhassett Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18*719f82d3SEliot Blennerhassett 19*719f82d3SEliot Blennerhassett Hardware Programming Interface (HPI) Utility functions. 20*719f82d3SEliot Blennerhassett 21*719f82d3SEliot Blennerhassett (C) Copyright AudioScience Inc. 2007 22*719f82d3SEliot Blennerhassett *******************************************************************************/ 23*719f82d3SEliot Blennerhassett 24*719f82d3SEliot Blennerhassett #include "hpi_internal.h" 25*719f82d3SEliot Blennerhassett #include "hpimsginit.h" 26*719f82d3SEliot Blennerhassett 27*719f82d3SEliot Blennerhassett /* The actual message size for each object type */ 28*719f82d3SEliot Blennerhassett static u16 msg_size[HPI_OBJ_MAXINDEX + 1] = HPI_MESSAGE_SIZE_BY_OBJECT; 29*719f82d3SEliot Blennerhassett /* The actual response size for each object type */ 30*719f82d3SEliot Blennerhassett static u16 res_size[HPI_OBJ_MAXINDEX + 1] = HPI_RESPONSE_SIZE_BY_OBJECT; 31*719f82d3SEliot Blennerhassett /* Flag to enable alternate message type for SSX2 bypass. */ 32*719f82d3SEliot Blennerhassett static u16 gwSSX2_bypass; 33*719f82d3SEliot Blennerhassett 34*719f82d3SEliot Blennerhassett /** \internal 35*719f82d3SEliot Blennerhassett * Used by ASIO driver to disable SSX2 for a single process 36*719f82d3SEliot Blennerhassett * \param phSubSys Pointer to HPI subsystem handle. 37*719f82d3SEliot Blennerhassett * \param wBypass New bypass setting 0 = off, nonzero = on 38*719f82d3SEliot Blennerhassett * \return Previous bypass setting. 39*719f82d3SEliot Blennerhassett */ 40*719f82d3SEliot Blennerhassett u16 hpi_subsys_ssx2_bypass(const struct hpi_hsubsys *ph_subsys, u16 bypass) 41*719f82d3SEliot Blennerhassett { 42*719f82d3SEliot Blennerhassett u16 old_value = gwSSX2_bypass; 43*719f82d3SEliot Blennerhassett 44*719f82d3SEliot Blennerhassett gwSSX2_bypass = bypass; 45*719f82d3SEliot Blennerhassett 46*719f82d3SEliot Blennerhassett return old_value; 47*719f82d3SEliot Blennerhassett } 48*719f82d3SEliot Blennerhassett 49*719f82d3SEliot Blennerhassett /** \internal 50*719f82d3SEliot Blennerhassett * initialize the HPI message structure 51*719f82d3SEliot Blennerhassett */ 52*719f82d3SEliot Blennerhassett static void hpi_init_message(struct hpi_message *phm, u16 object, 53*719f82d3SEliot Blennerhassett u16 function) 54*719f82d3SEliot Blennerhassett { 55*719f82d3SEliot Blennerhassett memset(phm, 0, sizeof(*phm)); 56*719f82d3SEliot Blennerhassett if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) 57*719f82d3SEliot Blennerhassett phm->size = msg_size[object]; 58*719f82d3SEliot Blennerhassett else 59*719f82d3SEliot Blennerhassett phm->size = sizeof(*phm); 60*719f82d3SEliot Blennerhassett 61*719f82d3SEliot Blennerhassett if (gwSSX2_bypass) 62*719f82d3SEliot Blennerhassett phm->type = HPI_TYPE_SSX2BYPASS_MESSAGE; 63*719f82d3SEliot Blennerhassett else 64*719f82d3SEliot Blennerhassett phm->type = HPI_TYPE_MESSAGE; 65*719f82d3SEliot Blennerhassett phm->object = object; 66*719f82d3SEliot Blennerhassett phm->function = function; 67*719f82d3SEliot Blennerhassett phm->version = 0; 68*719f82d3SEliot Blennerhassett /* Expect adapter index to be set by caller */ 69*719f82d3SEliot Blennerhassett } 70*719f82d3SEliot Blennerhassett 71*719f82d3SEliot Blennerhassett /** \internal 72*719f82d3SEliot Blennerhassett * initialize the HPI response structure 73*719f82d3SEliot Blennerhassett */ 74*719f82d3SEliot Blennerhassett void hpi_init_response(struct hpi_response *phr, u16 object, u16 function, 75*719f82d3SEliot Blennerhassett u16 error) 76*719f82d3SEliot Blennerhassett { 77*719f82d3SEliot Blennerhassett memset(phr, 0, sizeof(*phr)); 78*719f82d3SEliot Blennerhassett phr->type = HPI_TYPE_RESPONSE; 79*719f82d3SEliot Blennerhassett if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) 80*719f82d3SEliot Blennerhassett phr->size = res_size[object]; 81*719f82d3SEliot Blennerhassett else 82*719f82d3SEliot Blennerhassett phr->size = sizeof(*phr); 83*719f82d3SEliot Blennerhassett phr->object = object; 84*719f82d3SEliot Blennerhassett phr->function = function; 85*719f82d3SEliot Blennerhassett phr->error = error; 86*719f82d3SEliot Blennerhassett phr->specific_error = 0; 87*719f82d3SEliot Blennerhassett phr->version = 0; 88*719f82d3SEliot Blennerhassett } 89*719f82d3SEliot Blennerhassett 90*719f82d3SEliot Blennerhassett void hpi_init_message_response(struct hpi_message *phm, 91*719f82d3SEliot Blennerhassett struct hpi_response *phr, u16 object, u16 function) 92*719f82d3SEliot Blennerhassett { 93*719f82d3SEliot Blennerhassett hpi_init_message(phm, object, function); 94*719f82d3SEliot Blennerhassett /* default error return if the response is 95*719f82d3SEliot Blennerhassett not filled in by the callee */ 96*719f82d3SEliot Blennerhassett hpi_init_response(phr, object, function, 97*719f82d3SEliot Blennerhassett HPI_ERROR_PROCESSING_MESSAGE); 98*719f82d3SEliot Blennerhassett } 99*719f82d3SEliot Blennerhassett 100*719f82d3SEliot Blennerhassett static void hpi_init_messageV1(struct hpi_message_header *phm, u16 size, 101*719f82d3SEliot Blennerhassett u16 object, u16 function) 102*719f82d3SEliot Blennerhassett { 103*719f82d3SEliot Blennerhassett memset(phm, 0, sizeof(*phm)); 104*719f82d3SEliot Blennerhassett if ((object > 0) && (object <= HPI_OBJ_MAXINDEX)) { 105*719f82d3SEliot Blennerhassett phm->size = size; 106*719f82d3SEliot Blennerhassett phm->type = HPI_TYPE_MESSAGE; 107*719f82d3SEliot Blennerhassett phm->object = object; 108*719f82d3SEliot Blennerhassett phm->function = function; 109*719f82d3SEliot Blennerhassett phm->version = 1; 110*719f82d3SEliot Blennerhassett /* Expect adapter index to be set by caller */ 111*719f82d3SEliot Blennerhassett } 112*719f82d3SEliot Blennerhassett } 113*719f82d3SEliot Blennerhassett 114*719f82d3SEliot Blennerhassett void hpi_init_responseV1(struct hpi_response_header *phr, u16 size, 115*719f82d3SEliot Blennerhassett u16 object, u16 function) 116*719f82d3SEliot Blennerhassett { 117*719f82d3SEliot Blennerhassett memset(phr, 0, sizeof(*phr)); 118*719f82d3SEliot Blennerhassett phr->size = size; 119*719f82d3SEliot Blennerhassett phr->version = 1; 120*719f82d3SEliot Blennerhassett phr->type = HPI_TYPE_RESPONSE; 121*719f82d3SEliot Blennerhassett phr->error = HPI_ERROR_PROCESSING_MESSAGE; 122*719f82d3SEliot Blennerhassett } 123*719f82d3SEliot Blennerhassett 124*719f82d3SEliot Blennerhassett void hpi_init_message_responseV1(struct hpi_message_header *phm, u16 msg_size, 125*719f82d3SEliot Blennerhassett struct hpi_response_header *phr, u16 res_size, u16 object, 126*719f82d3SEliot Blennerhassett u16 function) 127*719f82d3SEliot Blennerhassett { 128*719f82d3SEliot Blennerhassett hpi_init_messageV1(phm, msg_size, object, function); 129*719f82d3SEliot Blennerhassett hpi_init_responseV1(phr, res_size, object, function); 130*719f82d3SEliot Blennerhassett } 131