diff options
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/chips/cfi_cmdset_0001.c | 127 |
1 files changed, 71 insertions, 56 deletions
diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c index 1e99dffcc6ae..308855e80f66 100644 --- a/drivers/mtd/chips/cfi_cmdset_0001.c +++ b/drivers/mtd/chips/cfi_cmdset_0001.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * | 4 | * |
5 | * (C) 2000 Red Hat. GPL'd | 5 | * (C) 2000 Red Hat. GPL'd |
6 | * | 6 | * |
7 | * $Id: cfi_cmdset_0001.c,v 1.180 2005/07/20 21:01:13 tpoynor Exp $ | 7 | * $Id: cfi_cmdset_0001.c,v 1.181 2005/08/06 04:16:48 nico Exp $ |
8 | * | 8 | * |
9 | * | 9 | * |
10 | * 10/10/2000 Nicolas Pitre <nico@cam.org> | 10 | * 10/10/2000 Nicolas Pitre <nico@cam.org> |
@@ -438,7 +438,7 @@ static struct mtd_info *cfi_intelext_setup(struct mtd_info *mtd) | |||
438 | } | 438 | } |
439 | 439 | ||
440 | for (i=0; i<mtd->numeraseregions;i++){ | 440 | for (i=0; i<mtd->numeraseregions;i++){ |
441 | printk(KERN_DEBUG "%d: offset=0x%x,size=0x%x,blocks=%d\n", | 441 | printk(KERN_DEBUG "erase region %d: offset=0x%x,size=0x%x,blocks=%d\n", |
442 | i,mtd->eraseregions[i].offset, | 442 | i,mtd->eraseregions[i].offset, |
443 | mtd->eraseregions[i].erasesize, | 443 | mtd->eraseregions[i].erasesize, |
444 | mtd->eraseregions[i].numblocks); | 444 | mtd->eraseregions[i].numblocks); |
@@ -663,8 +663,8 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr | |||
663 | break; | 663 | break; |
664 | 664 | ||
665 | if (time_after(jiffies, timeo)) { | 665 | if (time_after(jiffies, timeo)) { |
666 | printk(KERN_ERR "Waiting for chip to be ready timed out. Status %lx\n", | 666 | printk(KERN_ERR "%s: Waiting for chip to be ready timed out. Status %lx\n", |
667 | status.x[0]); | 667 | map->name, status.x[0]); |
668 | return -EIO; | 668 | return -EIO; |
669 | } | 669 | } |
670 | spin_unlock(chip->mutex); | 670 | spin_unlock(chip->mutex); |
@@ -711,8 +711,8 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr | |||
711 | map_write(map, CMD(0x70), adr); | 711 | map_write(map, CMD(0x70), adr); |
712 | chip->state = FL_ERASING; | 712 | chip->state = FL_ERASING; |
713 | chip->oldstate = FL_READY; | 713 | chip->oldstate = FL_READY; |
714 | printk(KERN_ERR "Chip not ready after erase " | 714 | printk(KERN_ERR "%s: Chip not ready after erase " |
715 | "suspended: status = 0x%lx\n", status.x[0]); | 715 | "suspended: status = 0x%lx\n", map->name, status.x[0]); |
716 | return -EIO; | 716 | return -EIO; |
717 | } | 717 | } |
718 | 718 | ||
@@ -819,7 +819,7 @@ static void put_chip(struct map_info *map, struct flchip *chip, unsigned long ad | |||
819 | DISABLE_VPP(map); | 819 | DISABLE_VPP(map); |
820 | break; | 820 | break; |
821 | default: | 821 | default: |
822 | printk(KERN_ERR "put_chip() called with oldstate %d!!\n", chip->oldstate); | 822 | printk(KERN_ERR "%s: put_chip() called with oldstate %d!!\n", map->name, chip->oldstate); |
823 | } | 823 | } |
824 | wake_up(&chip->wq); | 824 | wake_up(&chip->wq); |
825 | } | 825 | } |
@@ -1130,7 +1130,7 @@ static void cfi_intelext_unpoint (struct mtd_info *mtd, u_char *addr, loff_t fro | |||
1130 | if(chip->ref_point_counter == 0) | 1130 | if(chip->ref_point_counter == 0) |
1131 | chip->state = FL_READY; | 1131 | chip->state = FL_READY; |
1132 | } else | 1132 | } else |
1133 | printk(KERN_ERR "Warning: unpoint called on non pointed region\n"); /* Should this give an error? */ | 1133 | printk(KERN_ERR "%s: Warning: unpoint called on non pointed region\n", map->name); /* Should this give an error? */ |
1134 | 1134 | ||
1135 | put_chip(map, chip, chip->start); | 1135 | put_chip(map, chip, chip->start); |
1136 | spin_unlock(chip->mutex); | 1136 | spin_unlock(chip->mutex); |
@@ -1271,9 +1271,10 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip, | |||
1271 | 1271 | ||
1272 | /* OK Still waiting */ | 1272 | /* OK Still waiting */ |
1273 | if (time_after(jiffies, timeo)) { | 1273 | if (time_after(jiffies, timeo)) { |
1274 | map_write(map, CMD(0x70), adr); | ||
1274 | chip->state = FL_STATUS; | 1275 | chip->state = FL_STATUS; |
1275 | xip_enable(map, chip, adr); | 1276 | xip_enable(map, chip, adr); |
1276 | printk(KERN_ERR "waiting for chip to be ready timed out in word write\n"); | 1277 | printk(KERN_ERR "%s: word write error (status timeout)\n", map->name); |
1277 | ret = -EIO; | 1278 | ret = -EIO; |
1278 | goto out; | 1279 | goto out; |
1279 | } | 1280 | } |
@@ -1285,7 +1286,7 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip, | |||
1285 | if (!z) { | 1286 | if (!z) { |
1286 | chip->word_write_time--; | 1287 | chip->word_write_time--; |
1287 | if (!chip->word_write_time) | 1288 | if (!chip->word_write_time) |
1288 | chip->word_write_time++; | 1289 | chip->word_write_time = 1; |
1289 | } | 1290 | } |
1290 | if (z > 1) | 1291 | if (z > 1) |
1291 | chip->word_write_time++; | 1292 | chip->word_write_time++; |
@@ -1293,19 +1294,31 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip, | |||
1293 | /* Done and happy. */ | 1294 | /* Done and happy. */ |
1294 | chip->state = FL_STATUS; | 1295 | chip->state = FL_STATUS; |
1295 | 1296 | ||
1296 | /* check for lock bit */ | 1297 | /* check for errors */ |
1297 | if (map_word_bitsset(map, status, CMD(0x02))) { | 1298 | if (map_word_bitsset(map, status, CMD(0x1a))) { |
1298 | /* clear status */ | 1299 | unsigned long chipstatus = MERGESTATUS(status); |
1300 | |||
1301 | /* reset status */ | ||
1299 | map_write(map, CMD(0x50), adr); | 1302 | map_write(map, CMD(0x50), adr); |
1300 | /* put back into read status register mode */ | ||
1301 | map_write(map, CMD(0x70), adr); | 1303 | map_write(map, CMD(0x70), adr); |
1302 | ret = -EROFS; | 1304 | xip_enable(map, chip, adr); |
1305 | |||
1306 | if (chipstatus & 0x02) { | ||
1307 | ret = -EROFS; | ||
1308 | } else if (chipstatus & 0x08) { | ||
1309 | printk(KERN_ERR "%s: word write error (bad VPP)\n", map->name); | ||
1310 | ret = -EIO; | ||
1311 | } else { | ||
1312 | printk(KERN_ERR "%s: word write error (status 0x%lx)\n", map->name, chipstatus); | ||
1313 | ret = -EINVAL; | ||
1314 | } | ||
1315 | |||
1316 | goto out; | ||
1303 | } | 1317 | } |
1304 | 1318 | ||
1305 | xip_enable(map, chip, adr); | 1319 | xip_enable(map, chip, adr); |
1306 | out: put_chip(map, chip, adr); | 1320 | out: put_chip(map, chip, adr); |
1307 | spin_unlock(chip->mutex); | 1321 | spin_unlock(chip->mutex); |
1308 | |||
1309 | return ret; | 1322 | return ret; |
1310 | } | 1323 | } |
1311 | 1324 | ||
@@ -1456,8 +1469,8 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, | |||
1456 | map_write(map, CMD(0x50), cmd_adr); | 1469 | map_write(map, CMD(0x50), cmd_adr); |
1457 | map_write(map, CMD(0x70), cmd_adr); | 1470 | map_write(map, CMD(0x70), cmd_adr); |
1458 | xip_enable(map, chip, cmd_adr); | 1471 | xip_enable(map, chip, cmd_adr); |
1459 | printk(KERN_ERR "Chip not ready for buffer write. status = %lx, Xstatus = %lx\n", | 1472 | printk(KERN_ERR "%s: Chip not ready for buffer write. status = %lx, Xstatus = %lx\n", |
1460 | status.x[0], Xstatus.x[0]); | 1473 | map->name, status.x[0], Xstatus.x[0]); |
1461 | ret = -EIO; | 1474 | ret = -EIO; |
1462 | goto out; | 1475 | goto out; |
1463 | } | 1476 | } |
@@ -1516,9 +1529,10 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, | |||
1516 | 1529 | ||
1517 | /* OK Still waiting */ | 1530 | /* OK Still waiting */ |
1518 | if (time_after(jiffies, timeo)) { | 1531 | if (time_after(jiffies, timeo)) { |
1532 | map_write(map, CMD(0x70), cmd_adr); | ||
1519 | chip->state = FL_STATUS; | 1533 | chip->state = FL_STATUS; |
1520 | xip_enable(map, chip, cmd_adr); | 1534 | xip_enable(map, chip, cmd_adr); |
1521 | printk(KERN_ERR "waiting for chip to be ready timed out in bufwrite\n"); | 1535 | printk(KERN_ERR "%s: buffer write error (status timeout)\n", map->name); |
1522 | ret = -EIO; | 1536 | ret = -EIO; |
1523 | goto out; | 1537 | goto out; |
1524 | } | 1538 | } |
@@ -1530,7 +1544,7 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, | |||
1530 | if (!z) { | 1544 | if (!z) { |
1531 | chip->buffer_write_time--; | 1545 | chip->buffer_write_time--; |
1532 | if (!chip->buffer_write_time) | 1546 | if (!chip->buffer_write_time) |
1533 | chip->buffer_write_time++; | 1547 | chip->buffer_write_time = 1; |
1534 | } | 1548 | } |
1535 | if (z > 1) | 1549 | if (z > 1) |
1536 | chip->buffer_write_time++; | 1550 | chip->buffer_write_time++; |
@@ -1538,13 +1552,26 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip, | |||
1538 | /* Done and happy. */ | 1552 | /* Done and happy. */ |
1539 | chip->state = FL_STATUS; | 1553 | chip->state = FL_STATUS; |
1540 | 1554 | ||
1541 | /* check for lock bit */ | 1555 | /* check for errors */ |
1542 | if (map_word_bitsset(map, status, CMD(0x02))) { | 1556 | if (map_word_bitsset(map, status, CMD(0x1a))) { |
1543 | /* clear status */ | 1557 | unsigned long chipstatus = MERGESTATUS(status); |
1558 | |||
1559 | /* reset status */ | ||
1544 | map_write(map, CMD(0x50), cmd_adr); | 1560 | map_write(map, CMD(0x50), cmd_adr); |
1545 | /* put back into read status register mode */ | 1561 | map_write(map, CMD(0x70), cmd_adr); |
1546 | map_write(map, CMD(0x70), adr); | 1562 | xip_enable(map, chip, cmd_adr); |
1547 | ret = -EROFS; | 1563 | |
1564 | if (chipstatus & 0x02) { | ||
1565 | ret = -EROFS; | ||
1566 | } else if (chipstatus & 0x08) { | ||
1567 | printk(KERN_ERR "%s: buffer write error (bad VPP)\n", map->name); | ||
1568 | ret = -EIO; | ||
1569 | } else { | ||
1570 | printk(KERN_ERR "%s: buffer write error (status 0x%lx)\n", map->name, chipstatus); | ||
1571 | ret = -EINVAL; | ||
1572 | } | ||
1573 | |||
1574 | goto out; | ||
1548 | } | 1575 | } |
1549 | 1576 | ||
1550 | xip_enable(map, chip, cmd_adr); | 1577 | xip_enable(map, chip, cmd_adr); |
@@ -1685,16 +1712,10 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip, | |||
1685 | 1712 | ||
1686 | /* OK Still waiting */ | 1713 | /* OK Still waiting */ |
1687 | if (time_after(jiffies, timeo)) { | 1714 | if (time_after(jiffies, timeo)) { |
1688 | map_word Xstatus; | ||
1689 | map_write(map, CMD(0x70), adr); | 1715 | map_write(map, CMD(0x70), adr); |
1690 | chip->state = FL_STATUS; | 1716 | chip->state = FL_STATUS; |
1691 | Xstatus = map_read(map, adr); | ||
1692 | /* Clear status bits */ | ||
1693 | map_write(map, CMD(0x50), adr); | ||
1694 | map_write(map, CMD(0x70), adr); | ||
1695 | xip_enable(map, chip, adr); | 1717 | xip_enable(map, chip, adr); |
1696 | printk(KERN_ERR "waiting for erase at %08lx to complete timed out. status = %lx, Xstatus = %lx.\n", | 1718 | printk(KERN_ERR "%s: block erase error: (status timeout)\n", map->name); |
1697 | adr, status.x[0], Xstatus.x[0]); | ||
1698 | ret = -EIO; | 1719 | ret = -EIO; |
1699 | goto out; | 1720 | goto out; |
1700 | } | 1721 | } |
@@ -1708,43 +1729,40 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip, | |||
1708 | chip->state = FL_STATUS; | 1729 | chip->state = FL_STATUS; |
1709 | status = map_read(map, adr); | 1730 | status = map_read(map, adr); |
1710 | 1731 | ||
1711 | /* check for lock bit */ | 1732 | /* check for errors */ |
1712 | if (map_word_bitsset(map, status, CMD(0x3a))) { | 1733 | if (map_word_bitsset(map, status, CMD(0x3a))) { |
1713 | unsigned long chipstatus; | 1734 | unsigned long chipstatus = MERGESTATUS(status); |
1714 | 1735 | ||
1715 | /* Reset the error bits */ | 1736 | /* Reset the error bits */ |
1716 | map_write(map, CMD(0x50), adr); | 1737 | map_write(map, CMD(0x50), adr); |
1717 | map_write(map, CMD(0x70), adr); | 1738 | map_write(map, CMD(0x70), adr); |
1718 | xip_enable(map, chip, adr); | 1739 | xip_enable(map, chip, adr); |
1719 | 1740 | ||
1720 | chipstatus = MERGESTATUS(status); | ||
1721 | |||
1722 | if ((chipstatus & 0x30) == 0x30) { | 1741 | if ((chipstatus & 0x30) == 0x30) { |
1723 | printk(KERN_NOTICE "Chip reports improper command sequence: status 0x%lx\n", chipstatus); | 1742 | printk(KERN_ERR "%s: block erase error: (bad command sequence, status 0x%lx)\n", map->name, chipstatus); |
1724 | ret = -EIO; | 1743 | ret = -EINVAL; |
1725 | } else if (chipstatus & 0x02) { | 1744 | } else if (chipstatus & 0x02) { |
1726 | /* Protection bit set */ | 1745 | /* Protection bit set */ |
1727 | ret = -EROFS; | 1746 | ret = -EROFS; |
1728 | } else if (chipstatus & 0x8) { | 1747 | } else if (chipstatus & 0x8) { |
1729 | /* Voltage */ | 1748 | /* Voltage */ |
1730 | printk(KERN_WARNING "Chip reports voltage low on erase: status 0x%lx\n", chipstatus); | 1749 | printk(KERN_ERR "%s: block erase error: (bad VPP)\n", map->name); |
1731 | ret = -EIO; | 1750 | ret = -EIO; |
1732 | } else if (chipstatus & 0x20) { | 1751 | } else if (chipstatus & 0x20 && retries--) { |
1733 | if (retries--) { | 1752 | printk(KERN_DEBUG "block erase failed at 0x%08lx: status 0x%lx. Retrying...\n", adr, chipstatus); |
1734 | printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%lx. Retrying...\n", adr, chipstatus); | 1753 | timeo = jiffies + HZ; |
1735 | timeo = jiffies + HZ; | 1754 | put_chip(map, chip, adr); |
1736 | put_chip(map, chip, adr); | 1755 | spin_unlock(chip->mutex); |
1737 | spin_unlock(chip->mutex); | 1756 | goto retry; |
1738 | goto retry; | 1757 | } else { |
1739 | } | 1758 | printk(KERN_ERR "%s: block erase failed at 0x%08lx (status 0x%lx)\n", map->name, adr, chipstatus); |
1740 | printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%lx\n", adr, chipstatus); | ||
1741 | ret = -EIO; | 1759 | ret = -EIO; |
1742 | } | 1760 | } |
1743 | } else { | 1761 | |
1744 | xip_enable(map, chip, adr); | 1762 | goto out; |
1745 | ret = 0; | ||
1746 | } | 1763 | } |
1747 | 1764 | ||
1765 | xip_enable(map, chip, adr); | ||
1748 | out: put_chip(map, chip, adr); | 1766 | out: put_chip(map, chip, adr); |
1749 | spin_unlock(chip->mutex); | 1767 | spin_unlock(chip->mutex); |
1750 | return ret; | 1768 | return ret; |
@@ -1887,13 +1905,10 @@ static int __xipram do_xxlock_oneblock(struct map_info *map, struct flchip *chip | |||
1887 | 1905 | ||
1888 | /* OK Still waiting */ | 1906 | /* OK Still waiting */ |
1889 | if (time_after(jiffies, timeo)) { | 1907 | if (time_after(jiffies, timeo)) { |
1890 | map_word Xstatus; | ||
1891 | map_write(map, CMD(0x70), adr); | 1908 | map_write(map, CMD(0x70), adr); |
1892 | chip->state = FL_STATUS; | 1909 | chip->state = FL_STATUS; |
1893 | Xstatus = map_read(map, adr); | ||
1894 | xip_enable(map, chip, adr); | 1910 | xip_enable(map, chip, adr); |
1895 | printk(KERN_ERR "waiting for unlock to complete timed out. status = %lx, Xstatus = %lx.\n", | 1911 | printk(KERN_ERR "%s: block unlock error: (status timeout)\n", map->name); |
1896 | status.x[0], Xstatus.x[0]); | ||
1897 | put_chip(map, chip, adr); | 1912 | put_chip(map, chip, adr); |
1898 | spin_unlock(chip->mutex); | 1913 | spin_unlock(chip->mutex); |
1899 | return -EIO; | 1914 | return -EIO; |