www.pudn.com > efs.rar > fs_device.c


/*********************************************************************** 
 * fs_device.c 
 * 
 * Flash operation wrappers and counters. 
 * Copyright (C) 2006 QUALCOMM, Inc. 
 * 
 ***********************************************************************/ 
 
/*=========================================================================== 
 
                        EDIT HISTORY FOR MODULE 
 
  This section contains comments describing changes made to the module. 
  Notice that changes are listed in reverse chronological order. 
 
  $Header: //depot/asic/MSMSHARED/services/efs/MSM_EFS.01.02/fs_device.c#6 $ $DateTime: 2006/11/13 09:22:31 $ $Author: davidb $ 
 
when         who   what, where, why 
----------   ---   --------------------------------------------------------- 
2006-11-09   dlb   Add dealloc counter. 
2006-09-22    sh   More comments. 
2006-09-22   dlb   Lint fixes. 
2006-09-12   dlb   Change some queries to unsigned values. 
2006-09-01   dlb   Create 
 
===========================================================================*/ 
 
#include "fs_device.h" 
#include "assert.h" 
 
#ifndef FEATURE_FS_BENCHMARK 
/* When FEATURE_FS_BENCHMARK is enabled, these counters are provided 
   as part of the global fs_counter structure.  When the is no 
   benchmarking code, we provide our own local counters to hold these 
   same values. */ 
uint32 fs_flash_write_page_counter = 0; 
uint32 fs_flash_read_page_counter = 0; 
uint32 fs_flash_erase_block_counter = 0; 
#endif 
uint32 fs_flash_pcache_miss_counter = 0; 
uint32 fs_flash_pcache_hit_counter = 0; 
uint32 fs_flash_buffer_miss_counter = 0; 
uint32 fs_flash_buffer_hit_counter = 0; 
uint32 fs_flash_dealloc_counter = 0; 
 
/* These variables maintain a count of flash device operations for 
 * performance analysis.  The values can be inspected by JTAG or by 
 * the optional code below. */ 
static uint32 read_color_counters[NUM_FS_FLASHOP_CATEGORIES] = { 0 }; 
static uint32 write_color_counters[NUM_FS_FLASHOP_CATEGORIES] = { 0 }; 
static uint32 erase_color_counters[NUM_FS_FLASHOP_CATEGORIES] = { 0 }; 
static uint32 buffer_fill_counters[NUM_FS_BUFOP_CATEGORIES] = { 0 }; 
 
/* The counters should always be updated, but there might not be any 
 * code to reference (read) them.  They are still useful from within a 
 * debugger.  We explain it to Lint this way: */ 
//lint -esym(551, write_color_counters) 
//lint -esym(551, read_color_counters) 
//lint -esym(551, erase_color_counters) 
//lint -esym(551, buffer_fill_counters) 
 
int 
fs_flash_write_page (fs_device_t dev, page_id page, void *data, 
    enum fs_flashop_category category) 
{ 
  ASSERT (category < NUM_FS_FLASHOP_CATEGORIES); 
  fs_flash_write_page_counter++; 
  write_color_counters[category]++; 
  return dev->write_page (dev, page, data); 
} 
 
int 
fs_flash_erase_block (fs_device_t dev, block_id block, 
    enum fs_flashop_category category) 
{ 
  ASSERT (category < NUM_FS_FLASHOP_CATEGORIES); 
  fs_flash_erase_block_counter++; 
  erase_color_counters[category]++; 
  return dev->erase_block (dev, block); 
} 
 
int 
fs_flash_read_page (fs_device_t dev, page_id page, void *data, 
    enum fs_flashop_category category) 
{ 
  ASSERT (category < NUM_FS_FLASHOP_CATEGORIES); 
  fs_flash_read_page_counter++; 
  read_color_counters[category]++; 
  return dev->read_page (dev, page, data); 
} 
 
void 
fs_flash_buffer_fill (enum fs_bufop_category category) 
{ 
  ASSERT (category < NUM_FS_BUFOP_CATEGORIES); 
  buffer_fill_counters[category]++; 
} 
 
uint32 
fs_flash_block_size (fs_device_t dev) 
{ 
  return dev->block_size (dev); 
} 
 
uint32 
fs_flash_page_size (fs_device_t dev) 
{ 
  return dev->page_size (dev); 
} 
 
uint32 
fs_flash_block_count (fs_device_t dev) 
{ 
  return dev->block_count (dev); 
} 
 
int 
fs_flash_bad_block_check (fs_device_t dev, block_id block) 
{ 
  return dev->bad_block_check (dev, block); 
} 
 
int 
fs_flash_is_erased (fs_device_t dev, page_id page) 
{ 
  return dev->is_erased (dev, page); 
} 
 
int 
fs_flash_mark_block_bad (fs_device_t dev, block_id block) 
{ 
  return dev->mark_block_bad (dev, block); 
} 
 
int 
fs_flash_resume_erase (fs_device_t dev) 
{ 
  return dev->resume_erase (dev); 
} 
 
int 
fs_flash_erase_status (fs_device_t dev) 
{ 
  return dev->erase_status (dev); 
} 
 
int 
fs_flash_suspend_erase (fs_device_t dev) 
{ 
  return dev->suspend_erase (dev); 
} 
 
int 
fs_flash_begin_erase_block (fs_device_t dev, block_id block) 
{ 
  return dev->begin_erase_block (dev, block); 
} 
 
int 
fs_flash_partial_write (fs_device_t dev, page_id page, 
    void *data, int offset, int length) 
{ 
  return dev->partial_write (dev, page, data, offset, length); 
} 
 
void * 
fs_flash_read_pointer (fs_device_t dev, page_id page) 
{ 
  return dev->read_pointer (dev, page); 
} 
 
#ifdef FS_UNIT_TEST 
#error code not present 
#endif /* FS_UNIT_TEST */