Commit 0a00044d authored by Eliot Blennerhassett's avatar Eliot Blennerhassett Committed by Takashi Iwai

ALSA: asihpi - Reduce number of error codes returned to upper layers.

Create and use HPI_ERROR_DSP_COMMUNICATION _DSP_BOOTLOAD, rather than
backend-specific error codes (now returned as data with the error).
Signed-off-by: default avatarEliot Blennerhassett <eblennerhassett@audioscience.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent ba94455c
...@@ -43,8 +43,8 @@ i.e 3.05.02 is a development version ...@@ -43,8 +43,8 @@ i.e 3.05.02 is a development version
#define HPI_VER_RELEASE(v) ((int)(v & 0xFF)) #define HPI_VER_RELEASE(v) ((int)(v & 0xFF))
/* Use single digits for versions less that 10 to avoid octal. */ /* Use single digits for versions less that 10 to avoid octal. */
#define HPI_VER HPI_VERSION_CONSTRUCTOR(4L, 5, 17) #define HPI_VER HPI_VERSION_CONSTRUCTOR(4L, 5, 19)
#define HPI_VER_STRING "4.05.17" #define HPI_VER_STRING "4.05.19"
/* Library version as documented in hpi-api-versions.txt */ /* Library version as documented in hpi-api-versions.txt */
#define HPI_LIB_VER HPI_VERSION_CONSTRUCTOR(9, 0, 0) #define HPI_LIB_VER HPI_VERSION_CONSTRUCTOR(9, 0, 0)
...@@ -433,11 +433,14 @@ return true. ...@@ -433,11 +433,14 @@ return true.
/** Adapter mode commands /** Adapter mode commands
Used in wQueryOrSet field of HPI_AdapterSetModeEx(). Used in wQueryOrSet parameter of HPI_AdapterSetModeEx().
\ingroup adapter \ingroup adapter
*/ */
enum HPI_ADAPTER_MODE_CMDS { enum HPI_ADAPTER_MODE_CMDS {
/** Set the mode to the given parameter */
HPI_ADAPTER_MODE_SET = 0, HPI_ADAPTER_MODE_SET = 0,
/** Return 0 or error depending whether mode is valid,
but don't set the mode */
HPI_ADAPTER_MODE_QUERY = 1 HPI_ADAPTER_MODE_QUERY = 1
}; };
...@@ -874,8 +877,7 @@ enum HPI_ERROR_CODES { ...@@ -874,8 +877,7 @@ enum HPI_ERROR_CODES {
HPI_ERROR_OBJ_ALREADY_OPEN = 105, HPI_ERROR_OBJ_ALREADY_OPEN = 105,
/** PCI, ISA resource not valid. */ /** PCI, ISA resource not valid. */
HPI_ERROR_INVALID_RESOURCE = 106, HPI_ERROR_INVALID_RESOURCE = 106,
/* GetInfo call from SubSysFindAdapters failed. */ /* HPI_ERROR_SUBSYSFINDADAPTERS_GETINFO= 107 */
/*HPI_ERROR_SUBSYSFINDADAPTERS_GETINFO= 107, */
/** Default response was never updated with actual error code. */ /** Default response was never updated with actual error code. */
HPI_ERROR_INVALID_RESPONSE = 108, HPI_ERROR_INVALID_RESPONSE = 108,
/** wSize field of response was not updated, /** wSize field of response was not updated,
...@@ -905,8 +907,7 @@ enum HPI_ERROR_CODES { ...@@ -905,8 +907,7 @@ enum HPI_ERROR_CODES {
*/ */
HPI_ERROR_MESSAGE_BUFFER_TOO_SMALL = 117, HPI_ERROR_MESSAGE_BUFFER_TOO_SMALL = 117,
/* Too many adapters. */ /* HPI_ERROR_TOO_MANY_ADAPTERS= 200 */
/* HPI_ERROR_TOO_MANY_ADAPTERS= 200, */
/** Bad adpater. */ /** Bad adpater. */
HPI_ERROR_BAD_ADAPTER = 201, HPI_ERROR_BAD_ADAPTER = 201,
/** Adapter number out of range or not set properly. */ /** Adapter number out of range or not set properly. */
...@@ -915,15 +916,15 @@ enum HPI_ERROR_CODES { ...@@ -915,15 +916,15 @@ enum HPI_ERROR_CODES {
HPI_DUPLICATE_ADAPTER_NUMBER = 203, HPI_DUPLICATE_ADAPTER_NUMBER = 203,
/** DSP code failed to bootload. (unused?) */ /** DSP code failed to bootload. (unused?) */
HPI_ERROR_DSP_BOOTLOAD = 204, HPI_ERROR_DSP_BOOTLOAD = 204,
/** Adapter failed DSP code self test. (unused?) */ /** Communication with DSP failed */
HPI_ERROR_DSP_SELFTEST = 205, HPI_ERROR_DSP_COMMUNICATION = 205,
/** Couldn't find or open the DSP code file. */ /** Couldn't find or open the DSP code file. */
HPI_ERROR_DSP_FILE_NOT_FOUND = 206, HPI_ERROR_DSP_FILE_NOT_FOUND = 206,
/** Internal DSP hardware error. */ /** Internal DSP hardware error. */
HPI_ERROR_DSP_HARDWARE = 207, HPI_ERROR_DSP_HARDWARE = 207,
/** Could not allocate memory */ /** Could not allocate memory */
HPI_ERROR_MEMORY_ALLOC = 208, HPI_ERROR_MEMORY_ALLOC = 208,
/** Failed to correctly load/config PLD. (unused?) */ /** Failed to correctly load/config PLD. (unused) */
HPI_ERROR_PLD_LOAD = 209, HPI_ERROR_PLD_LOAD = 209,
/** Unexpected end of file, block length too big etc. */ /** Unexpected end of file, block length too big etc. */
HPI_ERROR_DSP_FILE_FORMAT = 210, HPI_ERROR_DSP_FILE_FORMAT = 210,
...@@ -932,8 +933,7 @@ enum HPI_ERROR_CODES { ...@@ -932,8 +933,7 @@ enum HPI_ERROR_CODES {
HPI_ERROR_DSP_FILE_ACCESS_DENIED = 211, HPI_ERROR_DSP_FILE_ACCESS_DENIED = 211,
/** First DSP code section header not found in DSP file. */ /** First DSP code section header not found in DSP file. */
HPI_ERROR_DSP_FILE_NO_HEADER = 212, HPI_ERROR_DSP_FILE_NO_HEADER = 212,
/* File read operation on DSP code file failed. */ /* HPI_ERROR_DSP_FILE_READ_ERROR= 213, */
/*HPI_ERROR_DSP_FILE_READ_ERROR= 213, */
/** DSP code for adapter family not found. */ /** DSP code for adapter family not found. */
HPI_ERROR_DSP_SECTION_NOT_FOUND = 214, HPI_ERROR_DSP_SECTION_NOT_FOUND = 214,
/** Other OS specific error opening DSP file. */ /** Other OS specific error opening DSP file. */
...@@ -943,8 +943,7 @@ enum HPI_ERROR_CODES { ...@@ -943,8 +943,7 @@ enum HPI_ERROR_CODES {
/** DSP code section header had size == 0. */ /** DSP code section header had size == 0. */
HPI_ERROR_DSP_FILE_NULL_HEADER = 217, HPI_ERROR_DSP_FILE_NULL_HEADER = 217,
/* Base number for flash errors. */ /* HPI_ERROR_FLASH = 220, */
/* HPI_ERROR_FLASH = 220, */
/** Flash has bad checksum */ /** Flash has bad checksum */
HPI_ERROR_BAD_CHECKSUM = 221, HPI_ERROR_BAD_CHECKSUM = 221,
...@@ -958,8 +957,8 @@ enum HPI_ERROR_CODES { ...@@ -958,8 +957,8 @@ enum HPI_ERROR_CODES {
/** Reserved for OEMs. */ /** Reserved for OEMs. */
HPI_ERROR_RESERVED_1 = 290, HPI_ERROR_RESERVED_1 = 290,
/* Stream does not exist. */ /* HPI_ERROR_INVALID_STREAM = 300,
/*HPI_ERROR_INVALID_STREAM= 300, // use HPI_ERROR_INVALID_OBJ_INDEX */ use HPI_ERROR_INVALID_OBJ_INDEX */
/** Invalid compression format. */ /** Invalid compression format. */
HPI_ERROR_INVALID_FORMAT = 301, HPI_ERROR_INVALID_FORMAT = 301,
/** Invalid format samplerate */ /** Invalid format samplerate */
...@@ -970,10 +969,12 @@ enum HPI_ERROR_CODES { ...@@ -970,10 +969,12 @@ enum HPI_ERROR_CODES {
HPI_ERROR_INVALID_BITRATE = 304, HPI_ERROR_INVALID_BITRATE = 304,
/** Invalid datasize used for stream read/write. */ /** Invalid datasize used for stream read/write. */
HPI_ERROR_INVALID_DATASIZE = 305, HPI_ERROR_INVALID_DATASIZE = 305,
/* Stream buffer is full during stream write. */ /* Stream buffer is full during stream write.
/*HPI_ERROR_BUFFER_FULL = 306, // USE HPI_ERROR_INVALID_DATASIZE */ HPI_ERROR_BUFFER_FULL = 306,
/* Stream buffer is empty during stream read. */ Stream buffer is empty during stream read.
/*HPI_ERROR_BUFFER_EMPTY = 307, // USE HPI_ERROR_INVALID_DATASIZE */ HPI_ERROR_BUFFER_EMPTY = 307,
Use HPI_ERROR_INVALID_DATASIZE
*/
/** Null data pointer used for stream read/write. */ /** Null data pointer used for stream read/write. */
HPI_ERROR_INVALID_DATA_POINTER = 308, HPI_ERROR_INVALID_DATA_POINTER = 308,
/** Packet ordering error for stream read/write. */ /** Packet ordering error for stream read/write. */
...@@ -1010,6 +1011,7 @@ enum HPI_ERROR_CODES { ...@@ -1010,6 +1011,7 @@ enum HPI_ERROR_CODES {
HPI_ERROR_CONTROL_DISABLED = 404, HPI_ERROR_CONTROL_DISABLED = 404,
/** I2C transaction failed due to a missing ACK. */ /** I2C transaction failed due to a missing ACK. */
HPI_ERROR_CONTROL_I2C_MISSING_ACK = 405, HPI_ERROR_CONTROL_I2C_MISSING_ACK = 405,
HPI_ERROR_I2C_MISSING_ACK = 405,
/** Control is busy, or coming out of /** Control is busy, or coming out of
reset and cannot be accessed at this time. */ reset and cannot be accessed at this time. */
HPI_ERROR_CONTROL_NOT_READY = 407, HPI_ERROR_CONTROL_NOT_READY = 407,
...@@ -1020,7 +1022,6 @@ enum HPI_ERROR_CODES { ...@@ -1020,7 +1022,6 @@ enum HPI_ERROR_CODES {
HPI_ERROR_NVMEM_FAIL = 452, HPI_ERROR_NVMEM_FAIL = 452,
/** I2C */ /** I2C */
HPI_ERROR_I2C_MISSING_ACK = 405, /*HPI_ERROR_CONTROL_I2C_MISSING_ACK */
HPI_ERROR_I2C_BAD_ADR = 460, HPI_ERROR_I2C_BAD_ADR = 460,
/** Entity errors */ /** Entity errors */
......
...@@ -237,10 +237,19 @@ static void control_message(struct hpi_adapter_obj *pao, ...@@ -237,10 +237,19 @@ static void control_message(struct hpi_adapter_obj *pao,
switch (phm->function) { switch (phm->function) {
case HPI_CONTROL_GET_STATE: case HPI_CONTROL_GET_STATE:
if (pao->has_control_cache) { if (pao->has_control_cache) {
phr->error = hpi6000_update_control_cache(pao, phm); u16 err;
err = hpi6000_update_control_cache(pao, phm);
if (phr->error)
if (err) {
if (err >= HPI_ERROR_BACKEND_BASE) {
phr->error =
HPI_ERROR_CONTROL_CACHING;
phr->specific_error = err;
} else {
phr->error = err;
}
break; break;
}
if (hpi_check_control_cache(((struct hpi_hw_obj *) if (hpi_check_control_cache(((struct hpi_hw_obj *)
pao->priv)->p_cache, phm, pao->priv)->p_cache, phm,
...@@ -405,7 +414,7 @@ static void subsys_create_adapter(struct hpi_message *phm, ...@@ -405,7 +414,7 @@ static void subsys_create_adapter(struct hpi_message *phm,
struct hpi_adapter_obj ao; struct hpi_adapter_obj ao;
struct hpi_adapter_obj *pao; struct hpi_adapter_obj *pao;
u32 os_error_code; u32 os_error_code;
short error = 0; u16 err = 0;
u32 dsp_index = 0; u32 dsp_index = 0;
HPI_DEBUG_LOG(VERBOSE, "subsys_create_adapter\n"); HPI_DEBUG_LOG(VERBOSE, "subsys_create_adapter\n");
...@@ -422,10 +431,16 @@ static void subsys_create_adapter(struct hpi_message *phm, ...@@ -422,10 +431,16 @@ static void subsys_create_adapter(struct hpi_message *phm,
/* create the adapter object based on the resource information */ /* create the adapter object based on the resource information */
ao.pci = *phm->u.s.resource.r.pci; ao.pci = *phm->u.s.resource.r.pci;
error = create_adapter_obj(&ao, &os_error_code); err = create_adapter_obj(&ao, &os_error_code);
if (error) { if (err) {
delete_adapter_obj(&ao); delete_adapter_obj(&ao);
phr->error = error; if (err >= HPI_ERROR_BACKEND_BASE) {
phr->error = HPI_ERROR_DSP_BOOTLOAD;
phr->specific_error = err;
} else {
phr->error = err;
}
phr->u.s.data = os_error_code; phr->u.s.data = os_error_code;
return; return;
} }
...@@ -434,7 +449,7 @@ static void subsys_create_adapter(struct hpi_message *phm, ...@@ -434,7 +449,7 @@ static void subsys_create_adapter(struct hpi_message *phm,
if (!pao) { if (!pao) {
/* We just added this adapter, why can't we find it!? */ /* We just added this adapter, why can't we find it!? */
HPI_DEBUG_LOG(ERROR, "lost adapter after boot\n"); HPI_DEBUG_LOG(ERROR, "lost adapter after boot\n");
phr->error = 950; phr->error = HPI_ERROR_BAD_ADAPTER;
return; return;
} }
...@@ -1763,17 +1778,11 @@ static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm, ...@@ -1763,17 +1778,11 @@ static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm,
hpios_dsplock_lock(pao); hpios_dsplock_lock(pao);
error = hpi6000_message_response_sequence(pao, dsp_index, phm, phr); error = hpi6000_message_response_sequence(pao, dsp_index, phm, phr);
/* maybe an error response */ if (error) /* something failed in the HPI/DSP interface */
if (error) {
/* something failed in the HPI/DSP interface */
phr->error = error;
/* just the header of the response is valid */
phr->size = sizeof(struct hpi_response_header);
goto err; goto err;
}
if (phr->error != 0) /* something failed in the DSP */ if (phr->error) /* something failed in the DSP */
goto err; goto out;
switch (phm->function) { switch (phm->function) {
case HPI_OSTREAM_WRITE: case HPI_OSTREAM_WRITE:
...@@ -1796,10 +1805,19 @@ static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm, ...@@ -1796,10 +1805,19 @@ static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm,
} }
} }
if (error)
phr->error = error;
err: err:
if (error) {
if (error >= HPI_ERROR_BACKEND_BASE) {
phr->error = HPI_ERROR_DSP_COMMUNICATION;
phr->specific_error = error;
} else {
phr->error = error;
}
/* just the header of the response is valid */
phr->size = sizeof(struct hpi_response_header);
}
out:
hpios_dsplock_unlock(pao); hpios_dsplock_unlock(pao);
return; return;
} }
...@@ -478,7 +478,12 @@ static void subsys_create_adapter(struct hpi_message *phm, ...@@ -478,7 +478,12 @@ static void subsys_create_adapter(struct hpi_message *phm,
err = create_adapter_obj(&ao, &os_error_code); err = create_adapter_obj(&ao, &os_error_code);
if (err) { if (err) {
delete_adapter_obj(&ao); delete_adapter_obj(&ao);
phr->error = err; if (err >= HPI_ERROR_BACKEND_BASE) {
phr->error = HPI_ERROR_DSP_BOOTLOAD;
phr->specific_error = err;
} else {
phr->error = err;
}
phr->u.s.data = os_error_code; phr->u.s.data = os_error_code;
return; return;
} }
...@@ -2242,7 +2247,13 @@ static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm, ...@@ -2242,7 +2247,13 @@ static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm,
/* maybe an error response */ /* maybe an error response */
if (err) { if (err) {
/* something failed in the HPI/DSP interface */ /* something failed in the HPI/DSP interface */
phr->error = err; if (err >= HPI_ERROR_BACKEND_BASE) {
phr->error = HPI_ERROR_DSP_COMMUNICATION;
phr->specific_error = err;
} else {
phr->error = err;
}
pao->dsp_crashed++; pao->dsp_crashed++;
/* just the header of the response is valid */ /* just the header of the response is valid */
......
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