Not sure if anyone else will care to know about this, but I've found myself mentioning it to a few people, so I'll just put it out here for archival purposes. (I did pass this along to Xilinx, but I don't think any fix has propagated to the community yet.)
I was writing a linux kernel driver for the icap, and I found what I believe to be an error in hwicap_v1_00_a\src\xhwicap_set_configuration.c. These comments refer to revision with header stamp:
/* $Header: /devl/xcs/repo/env/Databases/ip2/processor/software/devel/hwicap/v1_00_a/src/xhwicap_set_configuration.c,v
1.4 2004/11/01 17:48:26 meinelte Exp $ */When XhwIcap_SetConfiguration() is invoked with less than XHI_MAX_BUFFER_INTS words, lines 124-125 call XHwIcap_DeviceWrite() with BufferCount+1 words instead of BufferCount words.
When the code finishes iterating through the for loop in lines 94-118, BufferCount is equal to I and equal to Size. So if Size was set to 4, BufferCount will equal 4, and calling XHwIcap_DeviceWrite() for BufferCount+1 words will actually write 5 words to the ICAP. In my case that was apparently writing an additional bogus word to the ICAP and thus causing CRC errors. When I change BufferCount+1 to BufferCount in line 124, my driver works as expected.
People who always write full frames will probably not have run into this, but my driver had to write chunks of data as it received them from the kernel, and thus not split along frame boundaries.