1. 07 1月, 2016 1 次提交
    • B
      mtd: nand: assign reasonable default name for NAND drivers · f7a8e38f
      Brian Norris 提交于
      Commits such as commit 853f1c58 ("mtd: nand: omap2: show parent
      device structure in sysfs") attempt to rely on the core MTD code to set
      the MTD name based on the parent device. However, nand_base tries to set
      a different default name according to the flash name (e.g., extracted
      from the ONFI parameter page), which means NAND drivers will never make
      use of the MTD defaults. This is not the intention of commit
      853f1c58.
      
      This results in problems when trying to use the cmdline partition
      parser, since the MTD name is different than expected. Let's fix this by
      providing a default NAND name, where possible.
      
      Note that this is not really a great default name in the long run, since
      this means that if there are multiple MTDs attached to the same
      controller device, they will have the same name. But that is an existing
      issue and requires future work on a better controller vs. flash chip
      abstraction to fix properly.
      
      Fixes: 853f1c58 ("mtd: nand: omap2: show parent device structure in sysfs")
      Reported-by: NHeiko Schocher <hs@denx.de>
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      Reviewed-by: NBoris Brezillon <boris.brezillon@free-electrons.com>
      Tested-by: NHeiko Schocher <hs@denx.de>
      Cc: Heiko Schocher <hs@denx.de>
      Cc: Frans Klaver <fransklaver@gmail.com>
      Cc: <stable@vger.kernel.org>
      f7a8e38f
  2. 19 12月, 2015 3 次提交
    • H
      mtd: nand: Disable subpage writes for drivers without ecc->hwctl · 44991b3d
      Helmut Schaa 提交于
      nand_write_subpage_hwecc causes a crash if the driver did not register
      ecc->hwctl or ecc->calculate. Fix this by disabling subpage writes if
      ecc->hwctl or ecc->calculate is not provided by the driver.
      
      This behavior was introduced in commit 837a6ba4
      "mtd: nand: subpage write support for hardware based ECC schemes".
      
      This fixes a crash with fsl_elbc_nand and maybe others:
      
      Unable to handle kernel paging request for instruction fetch
      Faulting instruction address: 0x00000000
      Oops: Kernel access of bad area, sig: 11 [#1]
      SMP NR_CPUS=2 P1020 RDB
      Modules linked in: ath9k ath9k_common pppoe ppp_async option iptable_nat ath9k_hw ath usb_wwan pppox ppp_generic nf_nat_ipv4 nf_conntrack_ipv4 mac80211 ipt_MASQUERADE cfg80211 xt_time xt_tcpudp xt_state xt_quota xt_policy xt_pkttype xt_owner xt_nat xt_multiport xt_mh
      CPU: 1 PID: 2161 Comm: ubiformat Not tainted 3.10.26 #6
      task: efbc2700 ti: c7950000 task.ti: c7950000
      NIP: 00000000 LR: c01a495c CTR: 00000000
      REGS: c7951cb0 TRAP: 0400   Not tainted  (3.10.26)
      MSR: 00029000 <CE,EE,ME>  CR: 24002028  XER: 00000000
      
      GPR00: c01a4b6c c7951d60 efbc2700 ef84b000 00000001 00000000 000001ff c7800500
      GPR08: 00000000 00000000 efae5e40 c01a4ae4 24002022 10023418 c7951e5c c7800500
      GPR16: c017b6a8 00000000 0000003f c053404c 00000000 00000004 00000000 00000003
      GPR24: 00000010 00000200 ef84b000 c7800d00 c7800000 c7800500 ef84b1c8 00000000
      NIP [00000000]   (null)
      LR [c01a495c] nand_write_subpage_hwecc+0x74/0x174
      Call Trace:
      [c7951d60] [c7951d64] 0xc7951d64 (unreliable)
      [c7951da0] [c01a4b6c] nand_write_page+0x88/0x198
      [c7951dd0] [c01a5f7c] nand_do_write_ops+0x2f4/0x39c
      [c7951e40] [c01a61e0] nand_write+0x58/0x84
      [c7951e80] [c019e29c] mtdchar_write+0x1dc/0x28c
      [c7951ef0] [c00aba84] vfs_write+0xcc/0x1ac
      [c7951f10] [c00ac04c] SyS_write+0x4c/0x90
      [c7951f40] [c000cd84] ret_from_syscall+0x0/0x3c
       --- Exception: c01 at 0x48050ed8
           LR = 0x100071b8
       Instruction dump:
       XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
       XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
       ---[ end trace 161d3c65a2a15cb8 ]---
      
      Kernel panic - not syncing: Fatal exception
      
      [Brian: editorial note - we've applied a previous fix for the driver in
      question (fsl_elbc_nand) long ago:
      commit f034d87d ("mtd: eLBC NAND: fix subpage write support")
      but this still makes sense, and it could solve issues on some other
      unforseen driver.]
      
      Cc: Pekon Gupta <pekon.gupta@gmail.com>
      Cc: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
      Cc: David Woodhouse <David.Woodhouse@intel.com>
      Signed-off-by: NHelmut Schaa <helmut.schaa@googlemail.com>
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      44991b3d
    • B
      mtd: nand: kill the chip->flash_node field · 29574ede
      Boris BREZILLON 提交于
      Now that the nand_chip struct directly embeds an mtd_info struct we can
      get rid of the ->flash_node field and forward set/get_flash_node requests
      to the MTD layer.
      
      As a side effect, we no longer need the mtd_set_of_node() call done in
      nand_dt_init().
      Signed-off-by: NBoris Brezillon <boris.brezillon@free-electrons.com>
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      29574ede
    • B
      mtd: nand: simplify nand_dt_init() usage · 7194a29a
      Boris BREZILLON 提交于
      nand_dt_init() function requires 3 arguments where it actually needs one
      (dn and mtd can both be retrieved from chip). Drop these parameters.
      
      Testing for dn != NULL inside nand_dt_init() also helps simplifying the
      caller code.
      Signed-off-by: NBoris Brezillon <boris.brezillon@free-electrons.com>
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      7194a29a
  3. 09 12月, 2015 1 次提交
  4. 17 11月, 2015 1 次提交
  5. 12 11月, 2015 2 次提交
  6. 27 10月, 2015 1 次提交
    • A
      mtd: nand: increase ready wait timeout and report timeouts · b70af9be
      Alex Smith 提交于
      If nand_wait_ready() times out, this is silently ignored, and its
      caller will then proceed to read from/write to the chip before it is
      ready. This can potentially result in corruption with no indication as
      to why.
      
      While a 20ms timeout seems like it should be plenty enough, certain
      behaviour can cause it to timeout much earlier than expected. The
      situation which prompted this change was that CPU 0, which is
      responsible for updating jiffies, was holding interrupts disabled
      for a fairly long time while writing to the console during a printk,
      causing several jiffies updates to be delayed. If CPU 1 happens to
      enter the timeout loop in nand_wait_ready() just before CPU 0 re-
      enables interrupts and updates jiffies, CPU 1 will immediately time
      out when the delayed jiffies updates are made. The result of this is
      that nand_wait_ready() actually waits less time than the NAND chip
      would normally take to be ready, and then read_page() proceeds to
      read out bad data from the chip.
      
      The situation described above may seem unlikely, but in fact it can be
      reproduced almost every boot on the MIPS Creator Ci20.
      
      Therefore, this patch increases the timeout to 400ms. This should be
      enough to cover cases where jiffies updates get delayed. In nand_wait()
      the timeout was previously chosen based on whether erasing or
      programming. This is changed to be 400ms unconditionally as well to
      avoid similar problems there. nand_wait() is also slightly refactored
      to be consistent with nand_wait{,_status}_ready(). These changes should
      have no effect during normal operation.
      
      Debugging this was made more difficult by the misleading comment above
      nand_wait_ready() stating "The timeout is caught later" - no timeout was
      ever reported, leading me away from the real source of the problem.
      Therefore, a pr_warn() is added when a timeout does occur so that it is
      easier to pinpoint similar problems in future.
      Signed-off-by: NAlex Smith <alex.smith@imgtec.com>
      Signed-off-by: NHarvey Hunt <harvey.hunt@imgtec.com>
      Reviewed-by: NNiklas Cassel <niklas.cassel@axis.com>
      Cc: Alex Smith <alex@alex-smith.me.uk>
      Cc: Zubair Lutfullah Kakakhel <Zubair.Kakakhel@imgtec.com>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Cc: Niklas Cassel <niklas.cassel@axis.com>
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      b70af9be
  7. 14 10月, 2015 1 次提交
    • B
      mtd: nand: pass page number to ecc->write_xxx() methods · 45aaeff9
      Boris BREZILLON 提交于
      The ->read_xxx() methods are all passed the page number the NAND controller
      is supposed to read, but ->write_xxx() do not have such a parameter.
      
      This is a problem if we want to properly implement data
      scrambling/randomization in order to mitigate MLC sensibility to repeated
      pattern: to prevent bitflips in adjacent pages in the same block we need
      to avoid repeating the same pattern at the same offset in those pages,
      hence the randomizer/scrambler engine need to be passed the page value
      in order to adapt its seed accordingly.
      
      Moreover, adding the page parameter to the ->write_xxx() methods add some
      consistency to the current API.
      Signed-off-by: NBoris Brezillon <boris.brezillon@free-electrons.com>
      CC: Josh Wu <josh.wu@atmel.com>
      CC: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
      CC: Maxime Ripard <maxime.ripard@free-electrons.com>
      CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      CC: Huang Shijie <shijie.huang@arm.com>
      CC: Stefan Agner <stefan@agner.ch>
      CC: devel@driverdev.osuosl.org
      CC: linux-arm-kernel@lists.infradead.org
      CC: linux-kernel@vger.kernel.org
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      45aaeff9
  8. 02 10月, 2015 1 次提交
  9. 22 9月, 2015 1 次提交
  10. 12 9月, 2015 1 次提交
  11. 23 5月, 2015 2 次提交
  12. 12 5月, 2015 1 次提交
    • B
      mtd: nand: add common DT init code · 5844feea
      Brian Norris 提交于
      These are already-documented common bindings for NAND chips. Let's
      handle them in nand_base.
      
      If NAND controller drivers need to act on this data before bringing up
      the NAND chip (e.g., fill out ECC callback functions, change HW modes,
      etc.), then they can do so between calling nand_scan_ident() and
      nand_scan_tail().
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      5844feea
  13. 07 5月, 2015 1 次提交
  14. 31 3月, 2015 1 次提交
  15. 25 3月, 2015 1 次提交
  16. 12 3月, 2015 2 次提交
  17. 06 2月, 2015 1 次提交
  18. 02 2月, 2015 1 次提交
  19. 21 1月, 2015 1 次提交
  20. 10 1月, 2015 1 次提交
  21. 08 1月, 2015 1 次提交
    • S
      mtd: nand: added nand_shutdown · 72ea4036
      Scott Branden 提交于
      Add nand_shutdown to wait for current nand operations to finish and prevent
      further operations by changing the nand flash state to FL_SHUTDOWN.
      
      This is addressing a problem observed during reboot tests using UBIFS
      root file system: NAND erase operations that are in progress during
      system reboot/shutdown are causing partial erased blocks. Although UBI should
      be able to detect and recover from this error, this change will avoid
      the creation of partial erased blocks on reboot in the middle of a NAND erase
      operation.
      Signed-off-by: NScott Branden <sbranden@broadcom.com>
      Tested-by: NScott Branden <sbranden@broadcom.com>
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      72ea4036
  22. 29 11月, 2014 1 次提交
  23. 26 11月, 2014 1 次提交
  24. 05 11月, 2014 2 次提交
  25. 23 9月, 2014 1 次提交
  26. 18 9月, 2014 1 次提交
  27. 20 8月, 2014 2 次提交
    • B
      mtd: nand: fix integer widening problems · 537ab1bd
      Brian Norris 提交于
      chip->pagebuf is a 32-bit type (int), so the shift will only be applied
      as 32-bit. Fix this for 64-bit safety.
      
      Caught by Coverity.
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      537ab1bd
    • W
      mtd: nand: fix nand_lock/unlock() function · 57d3a9a8
      White Ding 提交于
      Do nand reset before write protect check.
      
      If we want to check the WP# low or high through STATUS READ and check bit 7,
      we must reset the device, other operation (eg.erase/program a locked block) can
      also clear the bit 7 of status register.
      
      As we know the status register can be refreshed, if we do some operation to trigger it,
      for example if we do erase/program operation to one block that is locked, then READ STATUS,
      the bit 7 of READ STATUS will be 0 indicate the device in write protect, then if we do
      erase/program operation to another block that is unlocked, the bit 7 of READ STATUS will
      be 1 indicate the device is not write protect.
      Suppose we checked the bit 7 of READ STATUS is 0 then judge the WP# is low (write protect),
      but in this case the WP# maybe high if we do erase/program operation to a locked block,
      so we must reset the device if we want to check the WP# low or high through STATUS READ and
      check bit 7.
      Signed-off-by: NWhite Ding <bpqw@micron.com>
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      57d3a9a8
  28. 14 7月, 2014 1 次提交
    • T
      mtd: nand: reduce the warning noise when the ECC is too weak · 54c39e9b
      Thomas Petazzoni 提交于
      In commit 67a9ad9b ("mtd: nand: Warn the user if the selected ECC
      strength is too weak"), a check was added to inform the user when the
      ECC used for a NAND device is weaker than the recommended ECC
      advertised by the NAND chip. However, the warning uses WARN_ON(),
      which has two undesirable side-effects:
      
       - It just prints to the kernel log the fact that there is a warning
         in this file, at this line, but it doesn't explain anything about
         the warning itself.
      
       - It dumps a stack trace which is very noisy, for something that the
         user is most likely not able to fix. If a certain ECC used by the
         kernel is weaker than the advertised one, it's most likely to make
         sure the kernel uses an ECC that is compatible with the one used by
         the bootloader, and changing the bootloader may not necessarily be
         easy. Therefore, normal users would not be able to do anything to
         fix this very noisy warning, and will have to suffer from it at
         every kernel boot. At least every time I see this stack trace in my
         kernel boot log, I wonder what new thing is broken, just to realize
         that it's once again this NAND ECC warning.
      
      Therefore, this commit turns:
      
      ------------[ cut here ]------------
      WARNING: CPU: 0 PID: 1 at /home/thomas/projets/linux-2.6/drivers/mtd/nand/nand_base.c:4051 nand_scan_tail+0x538/0x780()
      Modules linked in:
      CPU: 0 PID: 1 Comm: swapper Not tainted 3.16.0-rc3-dirty #4
      [<c000e3dc>] (unwind_backtrace) from [<c000bee4>] (show_stack+0x10/0x14)
      [<c000bee4>] (show_stack) from [<c0018180>] (warn_slowpath_common+0x6c/0x8c)
      [<c0018180>] (warn_slowpath_common) from [<c001823c>] (warn_slowpath_null+0x1c/0x24)
      [<c001823c>] (warn_slowpath_null) from [<c02c50cc>] (nand_scan_tail+0x538/0x780)
      [<c02c50cc>] (nand_scan_tail) from [<c0639f78>] (orion_nand_probe+0x224/0x2e4)
      [<c0639f78>] (orion_nand_probe) from [<c026da00>] (platform_drv_probe+0x18/0x4c)
      [<c026da00>] (platform_drv_probe) from [<c026c1f4>] (really_probe+0x80/0x218)
      [<c026c1f4>] (really_probe) from [<c026c47c>] (__driver_attach+0x98/0x9c)
      [<c026c47c>] (__driver_attach) from [<c026a8f0>] (bus_for_each_dev+0x64/0x94)
      [<c026a8f0>] (bus_for_each_dev) from [<c026bae4>] (bus_add_driver+0x144/0x1ec)
      [<c026bae4>] (bus_add_driver) from [<c026cb00>] (driver_register+0x78/0xf8)
      [<c026cb00>] (driver_register) from [<c026da5c>] (platform_driver_probe+0x20/0xb8)
      [<c026da5c>] (platform_driver_probe) from [<c00088b8>] (do_one_initcall+0x80/0x1d8)
      [<c00088b8>] (do_one_initcall) from [<c0620c9c>] (kernel_init_freeable+0xf4/0x1b4)
      [<c0620c9c>] (kernel_init_freeable) from [<c049a098>] (kernel_init+0x8/0xec)
      [<c049a098>] (kernel_init) from [<c00095f0>] (ret_from_fork+0x14/0x24)
      ---[ end trace 62f87d875aceccb4 ]---
      
      Into the much shorter, and much more useful:
      
      nand: WARNING: MT29F2G08ABAEAWP: the ECC used on your system is too weak compared to the one required by the NAND chip
      Signed-off-by: NThomas Petazzoni <thomas.petazzoni@free-electrons.com>
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      54c39e9b
  29. 09 7月, 2014 1 次提交
  30. 22 5月, 2014 1 次提交
  31. 21 5月, 2014 2 次提交
  32. 10 5月, 2014 1 次提交
    • B
      mtd: nand: refactor erase_cmd() to return chip status · 49c50b97
      Brian Norris 提交于
      The nand_chip::erase_cmd callback previously served a dual purpose; for
      one, it allowed a per-flash-chip override, so that AG-AND devices could
      use a different erase command than other NAND. These AND devices were
      dropped in commit 14c65786 (mtd: nand:
      remove AG-AND support). On the other hand, some drivers (denali and
      doc-g4) need to use this sort of callback to implement
      controller-specific erase operations.
      
      To make the latter operation easier for some drivers (e.g., ST's new BCH
      NAND driver), it helps if the command dispatch and wait functions can be
      lumped together, rather than called separately.
      
      This patch does two things:
       1. Pull the call to chip->waitfunc() into chip->erase_cmd(), and return
          the status from this callback
       2. Rename erase_cmd() to just erase(), since this callback does a
          little more than just send a command
      Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
      Tested-by: NLee Jones <lee.jones@linaro.org>
      49c50b97