@@ -925,12 +925,13 @@ static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
}
-static u8 sunxi_nfc_user_data_sz(struct sunxi_nand_chip *sunxi_nand, int step)
+static u8 sunxi_nfc_user_data_sz(struct sunxi_nand_chip *sunxi_nand,
+ int logical_step)
{
if (!sunxi_nand->user_data_bytes)
return USER_DATA_SZ;
- return sunxi_nand->user_data_bytes[step];
+ return sunxi_nand->user_data_bytes[logical_step];
}
/* Keep the on-flash layout, but fit each DMA batch in the user-data bank. */
@@ -976,7 +977,7 @@ static void sunxi_nfc_hw_ecc_get_prot_oob_bytes(struct nand_chip *nand, u8 *oob,
sunxi_nfc_user_data_to_buf(user_data, oob + i * 4);
}
- /* De-randomize the Bad Block Marker. */
+ /* Undo hardware de-randomization for a plain on-flash BBM. */
if (bbm && (nand->options & NAND_NEED_SCRAMBLING))
sunxi_nfc_randomize_bbm(nand, page, oob);
}
@@ -998,7 +999,7 @@ static void sunxi_nfc_reset_user_data_len(struct sunxi_nfc *nfc)
}
static void sunxi_nfc_set_user_data_len(struct sunxi_nfc *nfc,
- int len, int step)
+ int len, int hw_step)
{
bool found = false;
u32 val;
@@ -1021,11 +1022,11 @@ static void sunxi_nfc_set_user_data_len(struct sunxi_nfc *nfc,
return;
}
- val = readl(nfc->regs + NFC_REG_USER_DATA_LEN(nfc, step));
+ val = readl(nfc->regs + NFC_REG_USER_DATA_LEN(nfc, hw_step));
- val &= ~NFC_USER_DATA_LEN_MSK(step);
- val |= field_prep(NFC_USER_DATA_LEN_MSK(step), i);
- writel(val, nfc->regs + NFC_REG_USER_DATA_LEN(nfc, step));
+ val &= ~NFC_USER_DATA_LEN_MSK(hw_step);
+ val |= field_prep(NFC_USER_DATA_LEN_MSK(hw_step), i);
+ writel(val, nfc->regs + NFC_REG_USER_DATA_LEN(nfc, hw_step));
}
static void sunxi_nfc_hw_ecc_set_prot_oob_bytes(struct nand_chip *nand,
@@ -1037,7 +1038,7 @@ static void sunxi_nfc_hw_ecc_set_prot_oob_bytes(struct nand_chip *nand,
u8 user_data[SUNXI_NFC_MAX_USER_DATA_SZ] = {};
unsigned int i;
- /* Randomize the Bad Block Marker. */
+ /* Pre-randomize the BBM so the hardware writes it plain on flash. */
if (bbm && (nand->options & NAND_NEED_SCRAMBLING)) {
memcpy(user_data, oob, user_data_sz);
sunxi_nfc_randomize_bbm(nand, page, user_data);
@@ -1107,7 +1108,7 @@ static int sunxi_nfc_hw_ecc_read_error(struct nand_chip *nand,
}
static int sunxi_nfc_hw_ecc_correct(struct nand_chip *nand, u8 *data, u8 *oob,
- int step, u32 status, u32 pattern_found,
+ int hw_step, u32 status, u32 pattern_found,
unsigned int user_data_sz, bool *erased)
{
struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
@@ -1116,13 +1117,13 @@ static int sunxi_nfc_hw_ecc_correct(struct nand_chip *nand, u8 *data, u8 *oob,
*erased = false;
- if (status & NFC_ECC_ERR(step))
+ if (status & NFC_ECC_ERR(hw_step))
return -EBADMSG;
- if (pattern_found & BIT(step)) {
+ if (pattern_found & BIT(hw_step)) {
u8 pattern;
- if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID(nfc)) & BIT(step)))) {
+ if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID(nfc)) & BIT(hw_step)))) {
pattern = 0x0;
} else {
pattern = 0xff;
@@ -1138,9 +1139,9 @@ static int sunxi_nfc_hw_ecc_correct(struct nand_chip *nand, u8 *data, u8 *oob,
return 0;
}
- tmp = readl(nfc->regs + NFC_REG_ECC_ERR_CNT(nfc, step));
+ tmp = readl(nfc->regs + NFC_REG_ECC_ERR_CNT(nfc, hw_step));
- return NFC_ECC_ERR_CNT(step, tmp);
+ return NFC_ECC_ERR_CNT(hw_step, tmp);
}
static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand,
@@ -1148,18 +1149,18 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand,
u8 *oob, int oob_off,
int *cur_off,
unsigned int *max_bitflips,
- int step, bool oob_required, int page)
+ int logical_step, bool oob_required, int page)
{
struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
- unsigned int user_data_sz = sunxi_nfc_user_data_sz(sunxi_nand, step);
+ unsigned int user_data_sz = sunxi_nfc_user_data_sz(sunxi_nand, logical_step);
struct nand_ecc_ctrl *ecc = &nand->ecc;
u32 pattern_found;
- bool bbm = !step;
+ bool bbm = !logical_step;
bool erased;
int ret, bitflips;
/* From the controller point of view, we are at step 0 */
- const int nfc_step = 0;
+ const int hw_step = 0;
if (*cur_off != data_off) {
ret = sunxi_nfc_read_column(nand, page, data_off, NULL, 0);
@@ -1181,7 +1182,7 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand,
if (ret)
return ret;
- sunxi_nfc_set_user_data_len(nfc, user_data_sz, nfc_step);
+ sunxi_nfc_set_user_data_len(nfc, user_data_sz, hw_step);
sunxi_nfc_randomizer_config(nand, page, false);
sunxi_nfc_randomizer_enable(nand);
writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
@@ -1198,7 +1199,7 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand,
pattern_found = field_get(NFC_ECC_PAT_FOUND_MSK(nfc), pattern_found);
bitflips = sunxi_nfc_hw_ecc_correct(nand, data, oob_required ? oob : NULL,
- nfc_step, readl(nfc->regs + NFC_REG_ECC_ST),
+ hw_step, readl(nfc->regs + NFC_REG_ECC_ST),
pattern_found, user_data_sz, &erased);
if (erased)
return 1;
@@ -1224,7 +1225,7 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand,
if (ret)
return ret;
- sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand, oob, nfc_step,
+ sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand, oob, hw_step,
bbm, page, user_data_sz);
}
}
@@ -1239,12 +1240,12 @@ static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand,
* (it includes the user data before the ECC data.)
*/
static int sunxi_get_oob_offset(struct sunxi_nand_chip *sunxi_nand,
- struct nand_ecc_ctrl *ecc, int step)
+ struct nand_ecc_ctrl *ecc, int logical_step)
{
- int ecc_off = step * ecc->bytes;
+ int ecc_off = logical_step * ecc->bytes;
int i;
- for (i = 0; i < step; i++)
+ for (i = 0; i < logical_step; i++)
ecc_off += sunxi_nfc_user_data_sz(sunxi_nand, i);
return ecc_off;
@@ -1256,10 +1257,10 @@ static int sunxi_get_oob_offset(struct sunxi_nand_chip *sunxi_nand,
* but it skips the next user data.
*/
static int sunxi_get_ecc_offset(struct sunxi_nand_chip *sunxi_nand,
- struct nand_ecc_ctrl *ecc, int step)
+ struct nand_ecc_ctrl *ecc, int logical_step)
{
- return sunxi_get_oob_offset(sunxi_nand, ecc, step) +
- sunxi_nfc_user_data_sz(sunxi_nand, step);
+ return sunxi_get_oob_offset(sunxi_nand, ecc, logical_step) +
+ sunxi_nfc_user_data_sz(sunxi_nand, logical_step);
}
static int sunxi_nfc_hw_ecc_read_extra_oob(struct nand_chip *nand,
@@ -1300,7 +1301,7 @@ static int sunxi_nfc_hw_ecc_read_extra_oob(struct nand_chip *nand,
static int sunxi_nfc_hw_ecc_read_batch_dma(struct nand_chip *nand, u8 *buf,
int oob_required, int page,
int first_step, int nchunks,
- int *raw_mode)
+ bool *erased_chunk_found)
{
bool randomized = nand->options & NAND_NEED_SCRAMBLING;
struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
@@ -1403,7 +1404,7 @@ static int sunxi_nfc_hw_ecc_read_batch_dma(struct nand_chip *nand, u8 *buf,
}
if (erased)
- *raw_mode = 1;
+ *erased_chunk_found = true;
sunxi_nfc_hw_ecc_update_stats(nand, &max_bitflips, bitflips);
}
@@ -1427,7 +1428,7 @@ static int sunxi_nfc_hw_ecc_read_batch_dma(struct nand_chip *nand, u8 *buf,
if (ret < 0)
return ret;
if (ret)
- *raw_mode = 1;
+ *erased_chunk_found = true;
}
}
@@ -1441,14 +1442,14 @@ static int sunxi_nfc_hw_ecc_read_chunks_dma(struct nand_chip *nand, u8 *buf,
unsigned int corrected = mtd->ecc_stats.corrected;
unsigned int failed = mtd->ecc_stats.failed;
unsigned int max_bitflips = 0;
- int raw_mode = 0;
+ bool erased_chunk_found = false;
int first_step, batch_steps, ret;
for (first_step = 0; first_step < nchunks; first_step += batch_steps) {
batch_steps = sunxi_nfc_dma_batch_steps(nand, first_step, nchunks);
ret = sunxi_nfc_hw_ecc_read_batch_dma(nand, buf, oob_required, page,
first_step, batch_steps,
- &raw_mode);
+ &erased_chunk_found);
if (ret < 0)
goto err_stats;
max_bitflips = max_t(unsigned int, max_bitflips, ret);
@@ -1456,7 +1457,7 @@ static int sunxi_nfc_hw_ecc_read_chunks_dma(struct nand_chip *nand, u8 *buf,
if (oob_required) {
ret = sunxi_nfc_hw_ecc_read_extra_oob(nand, nand->oob_poi,
- NULL, !raw_mode, page);
+ NULL, !erased_chunk_found, page);
if (ret)
goto err_stats;
}
@@ -1473,17 +1474,17 @@ static int sunxi_nfc_hw_ecc_read_chunks_dma(struct nand_chip *nand, u8 *buf,
static int sunxi_nfc_hw_ecc_write_chunk(struct nand_chip *nand,
const u8 *data, int data_off,
const u8 *oob, int oob_off,
- int *cur_off, int step,
+ int *cur_off, int logical_step,
int page)
{
struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
- unsigned int user_data_sz = sunxi_nfc_user_data_sz(sunxi_nand, step);
+ unsigned int user_data_sz = sunxi_nfc_user_data_sz(sunxi_nand, logical_step);
struct nand_ecc_ctrl *ecc = &nand->ecc;
- bool bbm = !step;
+ bool bbm = !logical_step;
int ret;
/* From the controller point of view, we are at step 0 */
- const int nfc_step = 0;
+ const int hw_step = 0;
if (data_off != *cur_off) {
ret = nand_change_write_column_op(nand, data_off, NULL, 0, false);
@@ -1507,8 +1508,8 @@ static int sunxi_nfc_hw_ecc_write_chunk(struct nand_chip *nand,
sunxi_nfc_randomizer_config(nand, page, false);
sunxi_nfc_randomizer_enable(nand);
- sunxi_nfc_set_user_data_len(nfc, user_data_sz, nfc_step);
- sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, nfc_step, bbm, page,
+ sunxi_nfc_set_user_data_len(nfc, user_data_sz, hw_step);
+ sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, hw_step, bbm, page,
user_data_sz);
writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
@@ -1565,7 +1566,7 @@ static int sunxi_nfc_hw_ecc_read_page(struct nand_chip *nand, uint8_t *buf,
struct nand_ecc_ctrl *ecc = &nand->ecc;
unsigned int max_bitflips = 0;
int ret, i, cur_off = 0;
- bool raw_mode = false;
+ bool erased_chunk_found = false;
sunxi_nfc_select_chip(nand, nand->cur_cs);
@@ -1589,12 +1590,12 @@ static int sunxi_nfc_hw_ecc_read_page(struct nand_chip *nand, uint8_t *buf,
if (ret < 0)
goto out;
else if (ret)
- raw_mode = true;
+ erased_chunk_found = true;
}
if (oob_required) {
ret = sunxi_nfc_hw_ecc_read_extra_oob(nand, nand->oob_poi, &cur_off,
- !raw_mode, page);
+ !erased_chunk_found, page);
if (ret)
goto out;
}