ALSA: hda - Fix another cache list management
authorTakashi Iwai <tiwai@suse.de>
Mon, 10 Nov 2008 15:24:26 +0000 (16:24 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 10 Nov 2008 15:24:26 +0000 (16:24 +0100)
Fix another silly bug in the amp cache list management.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h

index 06e99c785155a2d706c82e274bafb2d8a0da7a9d..5d5e8012d6a5aea4de4acf71256ea54b8316e8f8 100644 (file)
@@ -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 cur = cache->hash[idx];
-       struct hda_cache_head *info_head = cache->buf.list;
        struct hda_cache_head *info;
 
        while (cur != 0xffff) {
-               info = &info_head[cur];
+               info = snd_array_elem(&cache->buf, cur);
                if (info->key == key)
                        return info;
                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);
        if (!info)
                return NULL;
-       cur = cache->buf.used - 1; /* the last entry */
+       cur = snd_array_index(&cache->buf, info);
        info->key = key;
        info->val = 0;
        info->next = cache->hash[idx];
@@ -3414,7 +3413,7 @@ void *snd_array_new(struct snd_array *array)
                array->list = nlist;
                array->alloced = num;
        }
-       return array->list + (array->used++ * array->elem_size);
+       return snd_array_elem(array, array->used++);
 }
 
 /* free the given array elements */
index a73f0eb9928332fc62e5c33fadd1585825d34ccc..ee122b009fd439faa13e67dd6a9d7909fdee9d04 100644 (file)
@@ -539,6 +539,16 @@ static inline void snd_array_init(struct snd_array *array, unsigned int size,
        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
  */