A data storage device comprising: a non-volatile memory array including a plurality of non-volatile multi-level cells; and a controller configured to: execute a single programming operation to program an upper page of a first multi-level cell coupled to a first word line using a program sequence and a program finish criterion; determine that a partial programming criterion associated with the upper page of the first multi-level cell is met, wherein the partial programming criterion is different from the program finish criterion, and wherein the partial programming criterion is met when the controller has applied a predetermined number of program pulses to the first cell; execute a program suspend command to cause the program sequence to be suspended before it finishes; at least partially program an upper page of a second multi-level cell coupled to the first word line following execution of the program suspend command; and resume the program sequence on the upper page of the first multi-level cell to complete programming of the upper page of the first multi-level cell following said at least partial programming of the upper page of the second multi-level cell. a non-volatile memory array including a plurality of non-volatile multi-level cells; and a controller configured to: execute a single programming operation to program an upper page of a first multi-level cell coupled to a first word line using a program sequence and a program finish criterion; determine that a partial programming criterion associated with the upper page of the first multi-level cell is met, wherein the partial programming criterion is different from the program finish criterion, and wherein the partial programming criterion is met when the controller has applied a predetermined number of program pulses to the first cell; execute a program suspend command to cause the program sequence to be suspended before it finishes; at least partially program an upper page of a second multi-level cell coupled to the first word line following execution of the program suspend command; and resume the program sequence on the upper page of the first multi-level cell to complete programming of the upper page of the first multi-level cell following said at least partial programming of the upper page of the second multi-level cell. execute a single programming operation to program an upper page of a first multi-level cell coupled to a first word line using a program sequence and a program finish criterion; determine that a partial programming criterion associated with the upper page of the first multi-level cell is met, wherein the partial programming criterion is different from the program finish criterion, and wherein the partial programming criterion is met when the controller has applied a predetermined number of program pulses to the first cell; execute a program suspend command to cause the program sequence to be suspended before it finishes; at least partially program an upper page of a second multi-level cell coupled to the first word line following execution of the program suspend command; and resume the program sequence on the upper page of the first multi-level cell to complete programming of the upper page of the first multi-level cell following said at least partial programming of the upper page of the second multi-level cell.