1. A controller-based method to program a multi-level cell (MLC) memory, comprising: receiving, in a controller, a write command from a host device, the write command comprising a program address and program data; in response to the write command, mapping the program address to a targeted page of memory in the MLC memory; and determining, in the controller, whether the targeted page of memory comprises an upper page and a lower page, and in response to a determination that targeted page of memory comprises an upper page and a lower page: reading the lower page of the targeted page of memory to obtain lower page data, wherein the MLC memory has been programmed with the lower page data; error correcting the lower page data to generate error corrected lower page data; allocating one or more new pages of memory in the MLC memory; calculating an error correcting code to be included with the error corrected lower page data; determining whether the MLC memory would have to decrease a voltage threshold to program the error corrected lower page data, and in response to a determination that the MLC memory would have to decrease a voltage threshold to program the error corrected lower page data, programming the error corrected lower page data into the one or more new pages of memory in the MLC memory; and programming the MLC memory using the error corrected lower page data and the program data.