followup - I realized that sometimes the flash operations return ERR_BUSY. If I loop until the command doesn't return that, it seems to work.
So what's odd about that is, why is it busy? I'm issuing commands one at a time, in a single thread, and waiting for the Done Interrupt to occur before issuing the next command. Why would it return busy?