Revision fccd2613

b/hw/nand.c
212 212

  
213 213
static void nand_command(NANDFlashState *s)
214 214
{
215
    unsigned int offset;
215 216
    switch (s->cmd) {
216 217
    case NAND_CMD_READ0:
217 218
        s->iolen = 0;
......
233 234
    case NAND_CMD_NOSERIALREAD2:
234 235
        if (!(nand_flash_ids[s->chip_id].options & NAND_SAMSUNG_LP))
235 236
            break;
236

  
237
        s->blk_load(s, s->addr, s->addr & ((1 << s->addr_shift) - 1));
237
        offset = s->addr & ((1 << s->addr_shift) - 1);
238
        s->blk_load(s, s->addr, offset);
239
        if (s->gnd)
240
            s->iolen = (1 << s->page_shift) - offset;
241
        else
242
            s->iolen = (1 << s->page_shift) + (1 << s->oob_shift) - offset;
238 243
        break;
239 244

  
240 245
    case NAND_CMD_RESET:
......
380 385

  
381 386
        if (s->cmd != NAND_CMD_RANDOMREAD2) {
382 387
            s->addrlen = 0;
383
            s->addr = 0;
384 388
        }
385 389
    }
386 390

  
387 391
    if (s->ale) {
388
        s->addr |= value << (s->addrlen * 8);
392
        unsigned int shift = s->addrlen * 8;
393
        unsigned int mask = ~(0xff << shift);
394
        unsigned int v = value << shift;
395

  
396
        s->addr = (s->addr & mask) | v;
389 397
        s->addrlen ++;
390 398

  
391 399
        if (s->addrlen == 1 && s->cmd == NAND_CMD_READID)
......
435 443
        return 0;
436 444

  
437 445
    s->iolen --;
446
    s->addr++;
438 447
    return *(s->ioaddr ++);
439 448
}
440 449

  
......
633 642
                        offset, PAGE_SIZE + OOB_SIZE - offset);
634 643
        s->ioaddr = s->io;
635 644
    }
636

  
637
    s->addr &= PAGE_SIZE - 1;
638
    s->addr += PAGE_SIZE;
639 645
}
640 646

  
641 647
static void glue(nand_init_, PAGE_SIZE)(NANDFlashState *s)

Also available in: Unified diff