Fixes for scatterlist allocation, and interrupt race condition

Switch from contiguous raw scatterlist to use scatterlist table api instead (which allocates a page at a time for the scatterlist, then chains them together), fixes memory alloc failure when host memory gets fragmented enough to not be able to allocate enough memory for a contiguous scatterlist.

Don't increment ISR count, and mask interupts, if no outstanding commands. This prevents test failure due to race between reaped completion, unmasking interrupts, and device canceling interrupt, sometimes spurious interrupt may occur that arrive the moment interrupts are unmasked, causing the next interrupt to be masked.