Hi again, I realized the CVS driver after Jul 31 (sg buffer implementation) was already broken when using a fragment size smaller than PAGE_SIZE. The attached patch fixes this. I now have CVS driver from 8/27/2002 working (last commit before the merge), but mainline of today is still broken.
Rui Sousa
Index: alsa-kernel/pci/via82xx.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/pci/via82xx.c,v retrieving revision 1.1 diff -u -r1.1 via82xx.c --- alsa-kernel/pci/via82xx.c 4 Sep 2002 14:17:47 -0000 1.1 +++ alsa-kernel/pci/via82xx.c 8 Sep 2002 17:38:04 -0000 @@ -231,7 +231,7 @@ if (dev->tbl_size < PAGE_SIZE) { for (i = 0; i < dev->tbl_entries; i++) - dev->table[i << 1] = cpu_to_le32((u32)sgbuf->table[0].addr + dev->fragsize * i); + dev->table[i << 1] = +cpu_to_le32((u32)sgbuf->table[(dev->fragsize * i) >> PAGE_SHIFT].addr + +(dev->fragsize * i) % PAGE_SIZE); } else { for (i = 0; i < dev->tbl_entries; i++) dev->table[i << 1] = cpu_to_le32((u32)sgbuf->table[i].addr); @@ -241,7 +241,7 @@ dev->table[(i << 1) + 1] = cpu_to_le32(VIA_TBL_BIT_FLAG | dev->tbl_size); size -= dev->tbl_size; } - dev->table[(dev->tbl_entries << 1) - 1] = cpu_to_le32(VIA_TBL_BIT_EOL | size); + dev->table[((dev->tbl_entries - 1) << 1) + 1] = cpu_to_le32(VIA_TBL_BIT_EOL | +size); return 0; }