1. 26 11月, 2014 1 次提交
    • B
      mmc: block: Increase max_devices · a26eba61
      Ben Hutchings 提交于
      Currently the driver imposes a limit of 256 total minor numbers,
      apparently based on the historic Unix/Linux limit.  This is quite
      restrictive, particularly if we raise the maximum number of
      partitions per card to 256 to match sd.
      
      In order to make the full minor number space available we would
      have to replace the static dev_use and name_use arrays with struct
      ida.  But we can at least allow use of 256 cards rather than just
      256 minors, with only a small change.
      Signed-off-by: NBen Hutchings <ben@decadent.org.uk>
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      a26eba61
  2. 10 11月, 2014 5 次提交
  3. 24 9月, 2014 1 次提交
  4. 19 9月, 2014 1 次提交
  5. 09 9月, 2014 3 次提交
  6. 26 7月, 2014 1 次提交
  7. 23 2月, 2014 4 次提交
  8. 14 2月, 2014 1 次提交
  9. 14 1月, 2014 1 次提交
  10. 31 10月, 2013 1 次提交
    • U
      mmc: Don't force card to active state when entering suspend/shutdown · 9ec775f7
      Ulf Hansson 提交于
      By adding a card state that records if it is suspended or resumed, we
      can accept asyncronus suspend/resume requests for the mmc and sd
      bus_ops.
      
      MMC_CAP_AGGRESSIVE_PM, will at request inactivity through the runtime
      bus_ops callbacks, execute a suspend of the the card. In the state were
      this has been done, we can receive a suspend request for the mmc bus,
      which for sd and mmc forced the card to active state by a
      pm_runtime_get_sync. In other words, the card was resumed and then
      immediately suspended again, completely unnecessary.
      
      Since the suspend/resume bus_ops callbacks for sd and mmc are now
      capable of handling asynchronous requests, we no longer need to force
      the card to active state before executing suspend. Evidently preventing
      the above sequence for MMC_CAP_AGGRESSIVE_PM.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      9ec775f7
  11. 25 8月, 2013 2 次提交
  12. 28 6月, 2013 1 次提交
  13. 27 6月, 2013 2 次提交
    • Y
      mmc: card: fixing an false identification of SANITIZE command · a82e484e
      Yaniv Gardi 提交于
      Inside the routine mmc_blk_ioctl_cmd() the sanitize command is
      identified according to the value of bits 16-23 of the argument.
      
      but what happens if a different command is sent, and only by
      chance, bits 16-23 contain the value of SANITIZE command ?
      In that case a SANITIZE command will be falsely identified.
      In order to prevent such a case, the condition is expanded and
      now it also checks the opcode itself, and verifies that it is an
      MMC_SWITCH opcode.
      Signed-off-by: NYaniv Gardi <ygardi@codeaurora.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      a82e484e
    • P
      mmc: reordered shutdown sequence in mmc_bld_remove_req · fdfa20c1
      Paul Taysom 提交于
      We had a multi-partition SD-Card with two ext2 file systems. The partition
      table was getting overwritten by a race between the card removal and
      the unmount of the 2nd ext2 partition.
      
      What was observed:
      1. Suspend/resume would call to remove the device. The clearing
         of the device information is done asynchronously.
      2. A request is made to unmount the file system (this is called
         after the removal has started).
      3. The remapping table was cleared by the asynchronous part of
         the device removal.
      4. A write request to the super block (block 0 of the partition)
         was sent down and instead of being remapped to the partition
         offset, it was remapped to block 0 of the device which is where
         the partition table is located.
      5. Write was queued and written resulting in the overwriting
         of the partition table with the ext2 super block.
      6. The mmc_queue is cleaned up.
      
      The mmc card device driver used to access SD cards, was calling del_gendisk
      before calling mmc_cleanup-queue. The comment in the mmc_blk_remove_req
      code indicated that it expected del_gendisk to block all further requests
      from being queued but it doesn't. The mmc driver uses the presences of the
      mmc_queue to determine if the request should be queued.
      
      The fix was to clean up the mmc_queue before the rest of the
      the delete partition code is called.
      
      This prevents the overwriting of the partition table.
      
      However, the umount gets an error trying to write the super block.
      The umount should be issued before the device is removed but that
      is not always possible. The umount is still needed to cleanup other
      data structures.
      
      Addresses the problem described in http://crbug.com/240815Signed-off-by: NPaul Taysom <taysom@chromium.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      fdfa20c1
  14. 27 5月, 2013 2 次提交
    • U
      mmc: block: Enable runtime pm for mmc blkdevice · e94cfef6
      Ulf Hansson 提交于
      Once the mmc blkdevice is being probed, runtime pm will be enabled.
      By using runtime autosuspend, the power save operations can be done
      when request inactivity occurs for a certain time. Right now the
      selected timeout value is set to 3 s. Obviously this value will likely
      need to be configurable somehow since it needs to be trimmed depending
      on the power save algorithm.
      
      For SD-combo cards, we are still leaving the enablement of runtime PM
      to the SDIO init sequence since it depends on the capabilities of the
      SDIO func driver.
      
      Moreover, when the blk device is being suspended, we make sure the device
      will be runtime resumed. The reason for doing this is that we want the
      host suspend sequence to be unaware of any runtime power save operations
      done for the card in this phase. Thus it can just handle the suspend as
      the card is fully powered from a runtime perspective.
      
      Finally, this patch prepares to make it possible to move BKOPS handling
      into the runtime callbacks for the mmc bus_ops. Thus IDLE BKOPS can be
      accomplished.
      Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      e94cfef6
    • M
      mmc: card: Adding support for sanitize in eMMC 4.5 · 775a9362
      Maya Erez 提交于
      The sanitize support is added as a user-app ioctl call, and
      was removed from the block-device request, since its purpose is
      to be invoked not via File-System but by a user.
      
      This feature deletes the unmap memory region of the eMMC card,
      by writing to a specific register in the EXT_CSD.
      
      unmap region is the memory region that was previously deleted
      (by erase, trim or discard operation).
      
      In order to avoid timeout when sanitizing large-scale cards,
      the timeout for sanitize operation is 240 seconds.
      Signed-off-by: NYaniv Gardi <ygardi@codeaurora.org>
      Signed-off-by: NMaya Erez <merez@codeaurora.org>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      775a9362
  15. 07 5月, 2013 1 次提交
  16. 23 3月, 2013 1 次提交
    • S
      mmc: block: fix the host's claim-release in special request · ef3a69c7
      Seungwon Jeon 提交于
      For normal request mmc_blk_issue_rq is called twice with asynchronous
      transfer(cur and prev). Host's claim and release can be done in each
      mmc_blk_issue_rq. However, Special request is currently excluded in
      asynchronous transfer. After special request is finished, if there is
      no new request, mmc_release_host won't be called in mmc_blk_issue_rq.
      The problem is founded during mmc_suspend.
      
      [<c0541124>] (__schedule+0x0/0x78c) from [<c05419e8>] (schedule+0x38/0x78)
      [<c05419b0>] (schedule+0x0/0x78) from [<c03a843c>] (__mmc_claim_host+0xac/0x1b4)
      [<c03a8390>] (__mmc_claim_host+0x0/0x1b4) from [<c03ac98c>] (mmc_suspend+0x28/0x9c)
      [<c03ac964>] (mmc_suspend+0x0/0x9c) from [<c03aad24>] (mmc_suspend_host+0xb4/0x194)
      ...
      Reported-by: NJohan Rudholm <jrudholm@gmail.com>
      Signed-off-by: NSeungwon Jeon <tgih.jun@samsung.com>
      Tested-by: NJohan Rudholm <johan.rudholm@stericsson.com>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      ef3a69c7
  17. 25 2月, 2013 2 次提交
  18. 12 2月, 2013 1 次提交
    • K
      mmc: fix async request mechanism for sequential read scenarios · 2220eedf
      Konstantin Dorfman 提交于
      When current request is running on the bus and if next request fetched
      by mmcqd is NULL, mmc context (mmcqd thread) gets blocked until the
      current request completes. This means that if new request comes in while
      the mmcqd thread is blocked, this new request can not be prepared in
      parallel to current ongoing request. This may result in delaying the new
      request execution and increase it's latency.
      
      This change allows to wake up the MMC thread on new request arrival.
      Now once the MMC thread is woken up, a new request can be fetched and
      prepared in parallel to the current running request which means this new
      request can be started immediately after the current running request
      completes.
      
      With this change read throughput is improved by 16%.
      Signed-off-by: NKonstantin Dorfman <kdorfman@codeaurora.org>
      Reviewed-by: NSeungwon Jeon <tgih.jun@samsung.com>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      2220eedf
  19. 28 1月, 2013 1 次提交
    • K
      mmc: fix async request mechanism for sequential read scenarios · 6035d973
      Konstantin Dorfman 提交于
      When current request is running on the bus and if next request fetched
      by mmcqd is NULL, mmc context (mmcqd thread) gets blocked until the
      current request completes. This means that if new request comes in while
      the mmcqd thread is blocked, this new request can not be prepared in
      parallel to current ongoing request. This may result in delaying the new
      request execution and increase it's latency.
      
      This change allows to wake up the MMC thread on new request arrival.
      Now once the MMC thread is woken up, a new request can be fetched and
      prepared in parallel to the current running request which means this new
      request can be started immediately after the current running request
      completes.
      
      With this change read throughput is improved by 16%.
      Signed-off-by: NKonstantin Dorfman <kdorfman@codeaurora.org>
      Reviewed-by: NSeungwon Jeon <tgih.jun@samsung.com>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      6035d973
  20. 07 12月, 2012 3 次提交
  21. 05 9月, 2012 1 次提交
  22. 11 7月, 2012 1 次提交
    • S
      mmc: block: replace __blk_end_request() with blk_end_request() · ecf8b5d0
      Subhash Jadavani 提交于
      For completing any block request, MMC block driver is calling:
      	spin_lock_irq(queue)
      	__blk_end_request()
      	spin_unlock_irq(queue)
      
      But if we analyze the sources of latency in kernel using ftrace,
      __blk_end_request() function at times may take up to 6.5ms with
      spinlock held and irq disabled.
      
      __blk_end_request() calls couple of functions and ftrace output
      shows that blk_update_bidi_request() function is almost taking 6ms.
      There are 2 function to end the current request: ___blk_end_request()
      and blk_end_request(). Both these functions do same thing except
      that blk_end_request() function doesn't take up the spinlock
      while calling the blk_update_bidi_request().
      
      This patch replaces all __blk_end_request() calls with
      blk_end_request() and __blk_end_request_all() calls with
      blk_end_request_all().
      
      Testing done: 20 process concurrent read/write on sd card
      and eMMC. Ran this test for almost a day on multicore system
      and no errors observed.
      
      This change is not meant for improving MMC throughput; it's basically
      about becoming fair to other threads/interrupts in the system. By
      holding spin lock and interrupts disabled for longer duration, we
      won't allow other threads/interrupts to run at all.  Actually slight
      performance degradation at file system level can be expected as we
      are not holding the spin lock during blk_update_bidi_request() which
      means our mmcqd thread may get preempted for other high priority
      thread or any interrupt in the system.
      
      These are performance numbers (100MB file write) with eMMC running
      in DDR mode:
      
      Without this patch:
      	Name of the Test   Value   Unit
      	LMDD Read Test     53.79   MBPS
      	LMDD Write Test    18.86   MBPS
      	IOZONE  Read Test  51.65   MBPS
      	IOZONE  Write Test 24.36   MBPS
      
      With this patch:
      	Name of the Test    Value  Unit
      	LMDD Read Test      52.94  MBPS
      	LMDD Write Test     16.70  MBPS
      	IOZONE  Read Test   52.08  MBPS
      	IOZONE  Write Test  23.29  MBPS
      
      Read numbers are fine. Write numbers are bit down (especially LMDD
      write), may be because write requests normally have large transfer
      size and which means there are chances that while mmcq is executing
      blk_update_bidi_request(), it may get interrupted by interrupts or
      other high priority thread.
      Signed-off-by: NSubhash Jadavani <subhashj@codeaurora.org>
      Reviewed-by: NNamjae Jeon <linkinjeon@gmail.com>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      ecf8b5d0
  23. 27 6月, 2012 1 次提交
    • S
      mmc: block: fix the data timeout issue with ACMD22 · d380443c
      Subhash Jadavani 提交于
      If multi block write operation fails for SD card, during
      error handling we send the SD_APP_SEND_NUM_WR_BLKS (ACMD22)
      to know how many blocks were already programmed by card.
      
      But mmc_sd_num_wr_blocks() function which sends the ACMD22
      calculates the data timeout value from csd.tacc_ns and
      csd.tacc_clks parameters which will be 0 for block addressed
      (>2GB cards) SD card. This would result in timeout_ns and
      timeout_clks being 0 in the mmc_request passed to host driver.
      This means host controller would program its data timeout timer
      value with 0 which could result in DATA TIMEOUT errors from
      controller.
      
      To fix this issue, mmc_sd_num_wr_blocks() should instead
      just call the mmc_set_data_timeout() to calculate the
      data timeout value. mmc_set_data_timeout() function
      ensures that non zero timeout value is set even for
      block addressed SD cards.
      Signed-off-by: NSubhash Jadavani <subhashj@codeaurora.org>
      Reviewed-by: NVenkatraman S <svenkatr@ti.com>
      Signed-off-by: NChris Ball <cjb@laptop.org>
      d380443c
  24. 17 5月, 2012 1 次提交
  25. 10 5月, 2012 1 次提交