Skip to content

Commit

Permalink
ALSA: asihpi - Increase request and response buffer sizes
Browse files Browse the repository at this point in the history
Allow for up to 256 bytes of extra data on top of standard hpi
request and response sizes.

Signed-off-by: Eliot Blennerhassett <eblennerhassett@audioscience.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Eliot Blennerhassett authored and Takashi Iwai committed Jul 22, 2011
1 parent 82b5774 commit c6c2c9a
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 19 deletions.
15 changes: 8 additions & 7 deletions sound/pci/asihpi/hpi6205.c
Original file line number Diff line number Diff line change
Expand Up @@ -2085,13 +2085,13 @@ static u16 message_response_sequence(struct hpi_adapter_obj *pao,
u16 err = 0;

message_count++;
if (phm->size > sizeof(interface->u)) {
if (phm->size > sizeof(interface->u.message_buffer)) {
phr->error = HPI_ERROR_MESSAGE_BUFFER_TOO_SMALL;
phr->specific_error = sizeof(interface->u);
phr->specific_error = sizeof(interface->u.message_buffer);
phr->size = sizeof(struct hpi_response_header);
HPI_DEBUG_LOG(ERROR,
"message len %d too big for buffer %zd \n", phm->size,
sizeof(interface->u));
sizeof(interface->u.message_buffer));
return 0;
}

Expand Down Expand Up @@ -2123,18 +2123,19 @@ static u16 message_response_sequence(struct hpi_adapter_obj *pao,

/* read the result */
if (time_out) {
if (interface->u.response_buffer.size <= phr->size)
if (interface->u.response_buffer.response.size <= phr->size)
memcpy(phr, &interface->u.response_buffer,
interface->u.response_buffer.size);
interface->u.response_buffer.response.size);
else {
HPI_DEBUG_LOG(ERROR,
"response len %d too big for buffer %d\n",
interface->u.response_buffer.size, phr->size);
interface->u.response_buffer.response.size,
phr->size);
memcpy(phr, &interface->u.response_buffer,
sizeof(struct hpi_response_header));
phr->error = HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL;
phr->specific_error =
interface->u.response_buffer.size;
interface->u.response_buffer.response.size;
phr->size = sizeof(struct hpi_response_header);
}
}
Expand Down
25 changes: 19 additions & 6 deletions sound/pci/asihpi/hpi6205.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*****************************************************************************
AudioScience HPI driver
Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
Copyright (C) 1997-2011 AudioScience Inc. <support@audioscience.com>
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
Expand Down Expand Up @@ -70,15 +70,28 @@ The Host located memory buffer that the 6205 will bus master
in and out of.
************************************************************/
#define HPI6205_SIZEOF_DATA (16*1024)

struct message_buffer_6205 {
struct hpi_message message;
char data[256];
};

struct response_buffer_6205 {
struct hpi_response response;
char data[256];
};

union buffer_6205 {
struct message_buffer_6205 message_buffer;
struct response_buffer_6205 response_buffer;
u8 b_data[HPI6205_SIZEOF_DATA];
};

struct bus_master_interface {
u32 host_cmd;
u32 dsp_ack;
u32 transfer_size_in_bytes;
union {
struct hpi_message_header message_buffer;
struct hpi_response_header response_buffer;
u8 b_data[HPI6205_SIZEOF_DATA];
} u;
union buffer_6205 u;
struct controlcache_6205 control_cache;
struct async_event_buffer_6205 async_buffer;
struct hpi_hostbuffer_status
Expand Down
13 changes: 7 additions & 6 deletions sound/pci/asihpi/hpicmn.c
Original file line number Diff line number Diff line change
Expand Up @@ -315,8 +315,7 @@ short hpi_check_control_cache(struct hpi_control_cache *p_cache,
short found = 1;
struct hpi_control_cache_info *pI;
struct hpi_control_cache_single *pC;
struct hpi_control_cache_pad *p_pad;

u16 response_size;
if (!find_control(phm->obj_index, p_cache, &pI)) {
HPI_DEBUG_LOG(VERBOSE,
"HPICMN find_control() failed for adap %d\n",
Expand All @@ -326,11 +325,15 @@ short hpi_check_control_cache(struct hpi_control_cache *p_cache,

phr->error = 0;

/* set the default response size */
response_size =
sizeof(struct hpi_response_header) +
sizeof(struct hpi_control_res);

/* pC is the default cached control strucure. May be cast to
something else in the following switch statement.
*/
pC = (struct hpi_control_cache_single *)pI;
p_pad = (struct hpi_control_cache_pad *)pI;

switch (pI->control_type) {

Expand Down Expand Up @@ -529,9 +532,7 @@ short hpi_check_control_cache(struct hpi_control_cache *p_cache,
pI->control_index, pI->control_type, phm->u.c.attribute);

if (found)
phr->size =
sizeof(struct hpi_response_header) +
sizeof(struct hpi_control_res);
phr->size = response_size;

return found;
}
Expand Down

0 comments on commit c6c2c9a

Please sign in to comment.