ALSA: hda - Fix another cache list management
Fix another silly bug in the amp cache list management. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -887,11 +887,10 @@ static struct hda_cache_head *get_alloc_hash(struct hda_cache_rec *cache,
|
|||||||
{
|
{
|
||||||
u16 idx = key % (u16)ARRAY_SIZE(cache->hash);
|
u16 idx = key % (u16)ARRAY_SIZE(cache->hash);
|
||||||
u16 cur = cache->hash[idx];
|
u16 cur = cache->hash[idx];
|
||||||
struct hda_cache_head *info_head = cache->buf.list;
|
|
||||||
struct hda_cache_head *info;
|
struct hda_cache_head *info;
|
||||||
|
|
||||||
while (cur != 0xffff) {
|
while (cur != 0xffff) {
|
||||||
info = &info_head[cur];
|
info = snd_array_elem(&cache->buf, cur);
|
||||||
if (info->key == key)
|
if (info->key == key)
|
||||||
return info;
|
return info;
|
||||||
cur = info->next;
|
cur = info->next;
|
||||||
@@ -901,7 +900,7 @@ static struct hda_cache_head *get_alloc_hash(struct hda_cache_rec *cache,
|
|||||||
info = snd_array_new(&cache->buf);
|
info = snd_array_new(&cache->buf);
|
||||||
if (!info)
|
if (!info)
|
||||||
return NULL;
|
return NULL;
|
||||||
cur = cache->buf.used - 1; /* the last entry */
|
cur = snd_array_index(&cache->buf, info);
|
||||||
info->key = key;
|
info->key = key;
|
||||||
info->val = 0;
|
info->val = 0;
|
||||||
info->next = cache->hash[idx];
|
info->next = cache->hash[idx];
|
||||||
@@ -3414,7 +3413,7 @@ void *snd_array_new(struct snd_array *array)
|
|||||||
array->list = nlist;
|
array->list = nlist;
|
||||||
array->alloced = num;
|
array->alloced = num;
|
||||||
}
|
}
|
||||||
return array->list + (array->used++ * array->elem_size);
|
return snd_array_elem(array, array->used++);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free the given array elements */
|
/* free the given array elements */
|
||||||
|
@@ -539,6 +539,16 @@ static inline void snd_array_init(struct snd_array *array, unsigned int size,
|
|||||||
array->alloc_align = align;
|
array->alloc_align = align;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void *snd_array_elem(struct snd_array *array, unsigned int idx)
|
||||||
|
{
|
||||||
|
return array->list + idx * array->elem_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned int snd_array_index(struct snd_array *array, void *ptr)
|
||||||
|
{
|
||||||
|
return (unsigned long)(ptr - array->list) / array->elem_size;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Structures
|
* Structures
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user