1 /******************************************************************************
3 © 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc.
6 This is proprietary source code of Freescale Semiconductor Inc.,
7 and its use is subject to the NetComm Device Drivers EULA.
8 The copyright notice above does not evidence any actual or intended
9 publication of such source code.
11 ALTERNATIVELY, redistribution and use in source and binary forms, with
12 or without modification, are permitted provided that the following
14 * Redistributions of source code must retain the above copyright
15 notice, this list of conditions and the following disclaimer.
16 * Redistributions in binary form must reproduce the above copyright
17 notice, this list of conditions and the following disclaimer in the
18 documentation and/or other materials provided with the distribution.
19 * Neither the name of Freescale Semiconductor nor the
20 names of its contributors may be used to endorse or promote products
21 derived from this software without specific prior written permission.
23 THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
24 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
27 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 **************************************************************************/
36 /******************************************************************************
40 *//***************************************************************************/
41 #include "error_ext.h"
43 #include "string_ext.h"
50 #define __ERR_MODULE__ MODULE_BM
53 /****************************************/
54 /* static functions */
55 /****************************************/
57 /* (De)Registration of depletion notification callbacks */
58 static void depletion_link(t_BmPool *p_BmPool)
60 t_BmPortal *p_Portal = (t_BmPortal *)p_BmPool->h_BmPortal;
63 p_Portal->depletionPoolsTable[p_BmPool->bpid] = p_BmPool;
64 bm_isr_bscn_mask(p_Portal->p_BmPortalLow, (uint8_t)p_BmPool->bpid, 1);
68 static void depletion_unlink(t_BmPool *p_BmPool)
70 t_BmPortal *p_Portal = (t_BmPortal *)p_BmPool->h_BmPortal;
73 p_Portal->depletionPoolsTable[p_BmPool->bpid] = NULL;
74 bm_isr_bscn_mask(p_Portal->p_BmPortalLow, (uint8_t)p_BmPool->bpid, 0);
78 static t_Error BmPoolRelease(t_BmPool *p_BmPool,
80 struct bm_buffer *bufs,
84 ASSERT_COND(num && (num <= 8));
85 if (p_BmPool->flags & BMAN_POOL_FLAG_NO_RELEASE)
86 return ERROR_CODE(E_INVALID_VALUE);
88 /* Without stockpile, this API is a pass-through to the h/w operation */
89 if (!(p_BmPool->flags & BMAN_POOL_FLAG_STOCKPILE))
90 return BmPortalRelease(h_BmPortal, p_BmPool->bpid, bufs, num, flags);
92 /* This needs some explanation. Adding the given buffers may take the
93 * stockpile over the threshold, but in fact the stockpile may already
94 * *be* over the threshold if a previous release-to-hw attempt had
95 * failed. So we have 3 cases to cover;
96 * 1. we add to the stockpile and don't hit the threshold,
97 * 2. we add to the stockpile, hit the threshold and release-to-hw,
98 * 3. we have to release-to-hw before adding to the stockpile
99 * (not enough room in the stockpile for case 2).
100 * Our constraints on thresholds guarantee that in case 3, there must be
101 * at least 8 bufs already in the stockpile, so all release-to-hw ops
102 * are for 8 bufs. Despite all this, the API must indicate whether the
103 * given buffers were taken off the caller's hands, irrespective of
104 * whether a release-to-hw was attempted. */
107 /* Add buffers to stockpile if they fit */
108 if ((p_BmPool->spFill + num) <= p_BmPool->spMaxBufs)
110 memcpy(PTR_MOVE(p_BmPool->sp, sizeof(struct bm_buffer) * (p_BmPool->spFill)),
112 sizeof(struct bm_buffer) * num);
113 p_BmPool->spFill += num;
114 num = 0; /* --> will return success no matter what */
117 /* Do hw op if hitting the high-water threshold */
119 t_Error ret = BmPortalRelease(h_BmPortal,
121 (struct bm_buffer *)PTR_MOVE(p_BmPool->sp, sizeof(struct bm_buffer) * (p_BmPool->spFill - p_BmPool->spBufsCmd)),
125 return (num ? ret : E_OK);
126 p_BmPool->spFill -= p_BmPool->spBufsCmd;
133 static int BmPoolAcquire(t_BmPool *p_BmPool,t_Handle h_BmPortal,
134 struct bm_buffer *bufs, uint8_t num, uint32_t flags)
136 ASSERT_COND(IN_RANGE(1, num, 8));
137 if (p_BmPool->flags & BMAN_POOL_FLAG_ONLY_RELEASE)
140 /* Without stockpile, this API is a pass-through to the h/w operation */
141 if (!(p_BmPool->flags & BMAN_POOL_FLAG_STOCKPILE))
142 return BmPortalAcquire(h_BmPortal, p_BmPool->bpid, bufs, num);
143 /* Only need a h/w op if we'll hit the low-water thresh */
144 if (!(flags & BMAN_ACQUIRE_FLAG_STOCKPILE) &&
145 ((p_BmPool->spFill - num) < p_BmPool->spMinBufs))
147 p_BmPool->spFill += BmPortalAcquire(h_BmPortal,
149 (struct bm_buffer *)PTR_MOVE(p_BmPool->sp, sizeof(struct bm_buffer) * (p_BmPool->spFill)),
150 p_BmPool->spBufsCmd);
152 else if (p_BmPool->spFill < num)
154 if (!p_BmPool->spFill)
157 PTR_MOVE(p_BmPool->sp, sizeof(struct bm_buffer) * (p_BmPool->spFill - num)),
158 sizeof(struct bm_buffer) * num);
159 p_BmPool->spFill -= num;
163 static t_Error BmPoolFree(t_BmPool *p_BmPool, bool discardBuffers)
165 t_Handle h_BufContext;
168 ASSERT_COND(p_BmPool);
170 if (!p_BmPool->shadowMode)
172 if (p_BmPool->flags & BMAN_POOL_FLAG_DEPLETION)
174 depletion_unlink(p_BmPool);
175 BmUnSetPoolThresholds(p_BmPool->h_Bm, p_BmPool->bpid);
179 p_Data = BM_POOL_GetBuf(p_BmPool, p_BmPool->h_BmPortal);
182 h_BufContext = BM_POOL_GetBufferContext(p_BmPool, p_Data);
184 p_BmPool->bufferPoolInfo.f_PutBuf(p_BmPool->bufferPoolInfo.h_BufferPool, p_Data, h_BufContext);
186 BmBpidPut(p_BmPool->h_Bm, p_BmPool->bpid);
190 XX_Free(p_BmPool->sp);
197 /****************************************/
198 /* API Init unit functions */
199 /****************************************/
201 t_Handle BM_POOL_Config(t_BmPoolParam *p_BmPoolParam)
205 SANITY_CHECK_RETURN_VALUE(p_BmPoolParam, E_INVALID_HANDLE, NULL);
206 SANITY_CHECK_RETURN_VALUE(p_BmPoolParam->h_Bm, E_INVALID_HANDLE, NULL);
207 SANITY_CHECK_RETURN_VALUE((p_BmPoolParam->shadowMode ||
208 (p_BmPoolParam->bufferPoolInfo.h_BufferPool &&
209 p_BmPoolParam->bufferPoolInfo.f_GetBuf &&
210 p_BmPoolParam->bufferPoolInfo.f_PutBuf &&
211 p_BmPoolParam->bufferPoolInfo.bufferSize)), E_INVALID_STATE, NULL);
213 p_BmPool = (t_BmPool*)XX_Malloc(sizeof(t_BmPool));
216 REPORT_ERROR(MAJOR, E_NO_MEMORY, ("BM Pool obj!!!"));
219 memset(p_BmPool, 0, sizeof(t_BmPool));
221 p_BmPool->p_BmPoolDriverParams = (t_BmPoolDriverParams *)XX_Malloc(sizeof(t_BmPoolDriverParams));
222 if (!p_BmPool->p_BmPoolDriverParams)
225 REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Bm Pool driver parameters"));
228 memset(p_BmPool->p_BmPoolDriverParams, 0, sizeof(t_BmPoolDriverParams));
230 p_BmPool->h_Bm = p_BmPoolParam->h_Bm;
231 p_BmPool->h_BmPortal = p_BmPoolParam->h_BmPortal;
232 p_BmPool->h_App = p_BmPoolParam->h_App;
233 p_BmPool->numOfBuffers = p_BmPoolParam->numOfBuffers;
234 p_BmPool->shadowMode = p_BmPoolParam->shadowMode;
236 if (!p_BmPool->h_BmPortal)
238 p_BmPool->h_BmPortal = BmGetPortalHandle(p_BmPool->h_Bm);
239 SANITY_CHECK_RETURN_VALUE(p_BmPool->h_BmPortal, E_INVALID_HANDLE, NULL);
242 memcpy(&p_BmPool->bufferPoolInfo, &p_BmPoolParam->bufferPoolInfo, sizeof(t_BufferPoolInfo));
243 if (!p_BmPool->bufferPoolInfo.f_PhysToVirt)
244 p_BmPool->bufferPoolInfo.f_PhysToVirt = XX_PhysToVirt;
245 if (!p_BmPool->bufferPoolInfo.f_VirtToPhys)
246 p_BmPool->bufferPoolInfo.f_VirtToPhys = XX_VirtToPhys;
248 p_BmPool->p_BmPoolDriverParams->dynamicBpid = DEFAULT_dynamicBpid;
249 p_BmPool->p_BmPoolDriverParams->useDepletion = DEFAULT_useDepletion;
250 p_BmPool->p_BmPoolDriverParams->useStockpile = DEFAULT_useStockpile;
252 if (p_BmPool->shadowMode)
254 p_BmPool->numOfBuffers = 0;
255 BM_POOL_ConfigBpid(p_BmPool, p_BmPoolParam->bpid);
261 t_Error BM_POOL_Init(t_Handle h_BmPool)
263 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
266 SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE);
267 SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE);
269 p_BmPool->flags |= (p_BmPool->p_BmPoolDriverParams->dynamicBpid)?BMAN_POOL_FLAG_DYNAMIC_BPID:0;
270 p_BmPool->flags |= (p_BmPool->p_BmPoolDriverParams->useStockpile)?BMAN_POOL_FLAG_STOCKPILE:0;
271 p_BmPool->flags |= ((!p_BmPool->shadowMode) &&
272 (p_BmPool->p_BmPoolDriverParams->useDepletion))?BMAN_POOL_FLAG_DEPLETION:0;
274 if (p_BmPool->flags & BMAN_POOL_FLAG_DYNAMIC_BPID)
276 if((p_BmPool->bpid = (uint8_t)BmBpidGet(p_BmPool->h_Bm, FALSE, (uint32_t)0)) == (uint8_t)ILLEGAL_BASE)
278 BM_POOL_Free(p_BmPool);
279 RETURN_ERROR(CRITICAL, E_INVALID_STATE, ("can't allocate new dynamic pool id"));
284 if (BmBpidGet(p_BmPool->h_Bm, TRUE, (uint32_t)p_BmPool->bpid) == (uint32_t)ILLEGAL_BASE)
286 BM_POOL_Free(p_BmPool);
287 RETURN_ERROR(CRITICAL, E_INVALID_STATE, ("can't force pool id %d", p_BmPool->bpid));
290 if (p_BmPool->flags & BMAN_POOL_FLAG_DEPLETION)
292 if(BmSetPoolThresholds(p_BmPool->h_Bm, p_BmPool->bpid, p_BmPool->p_BmPoolDriverParams->depletionThresholds))
294 BM_POOL_Free(p_BmPool);
295 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("can't set thresh for pool bpid %d",p_BmPool->bpid));
298 depletion_link(p_BmPool);
301 if (p_BmPool->flags & BMAN_POOL_FLAG_STOCKPILE)
303 p_BmPool->sp = (struct bm_buffer *)XX_Malloc(sizeof(struct bm_buffer) * p_BmPool->spMaxBufs);
306 BM_POOL_Free(p_BmPool);
307 RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Bm Pool Stockpile"));
309 memset(p_BmPool->sp, 0, sizeof(struct bm_buffer) * p_BmPool->spMaxBufs);
312 XX_Free(p_BmPool->p_BmPoolDriverParams);
313 p_BmPool->p_BmPoolDriverParams = NULL;
315 /*******************/
317 /*******************/
318 if ((err = BM_POOL_FillBufs (p_BmPool, p_BmPool->h_BmPortal, p_BmPool->numOfBuffers)) != E_OK)
320 BM_POOL_Free(p_BmPool);
321 RETURN_ERROR(MAJOR, err, NO_MSG);
327 t_Error BM_POOL_Free(t_Handle h_BmPool)
329 SANITY_CHECK_RETURN_ERROR(h_BmPool, E_INVALID_HANDLE);
331 return BmPoolFree(h_BmPool, FALSE);
334 t_Error BM_POOL_ConfigBpid(t_Handle h_BmPool, uint8_t bpid)
336 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
338 SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE);
339 SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE);
340 SANITY_CHECK_RETURN_ERROR(bpid < BM_MAX_NUM_OF_POOLS, E_INVALID_VALUE);
342 p_BmPool->p_BmPoolDriverParams->dynamicBpid = FALSE;
343 p_BmPool->bpid = bpid;
349 t_Error BM_POOL_ConfigDepletion(t_Handle h_BmPool, t_BmDepletionCallback *f_Depletion, uint32_t *p_Thresholds)
351 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
353 SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE);
354 SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE);
355 SANITY_CHECK_RETURN_ERROR(f_Depletion, E_INVALID_HANDLE);
357 p_BmPool->p_BmPoolDriverParams->useDepletion = TRUE;
358 p_BmPool->f_Depletion = f_Depletion;
359 memcpy(&p_BmPool->p_BmPoolDriverParams->depletionThresholds,
361 sizeof(p_BmPool->p_BmPoolDriverParams->depletionThresholds));
366 t_Error BM_POOL_ConfigStockpile(t_Handle h_BmPool, uint16_t maxBuffers, uint16_t minBuffers)
368 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
370 SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE);
371 SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE);
372 SANITY_CHECK_RETURN_ERROR(maxBuffers, E_INVALID_STATE);
373 SANITY_CHECK_RETURN_ERROR(maxBuffers >= minBuffers, E_INVALID_STATE);
374 SANITY_CHECK_RETURN_ERROR((p_BmPool->shadowMode ||
375 ((maxBuffers * 2) <= p_BmPool->numOfBuffers)),
378 p_BmPool->p_BmPoolDriverParams->useStockpile = TRUE;
379 p_BmPool->spMaxBufs = maxBuffers;
380 p_BmPool->spMinBufs = minBuffers;
381 p_BmPool->spBufsCmd = DEFAULT_numOfBufsPerCmd;
383 SANITY_CHECK_RETURN_ERROR((p_BmPool->spMaxBufs >=
384 (p_BmPool->spMinBufs + p_BmPool->spBufsCmd)),
390 t_Error BM_POOL_ConfigBuffContextMode(t_Handle h_BmPool, bool en)
392 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
394 SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE);
395 SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE);
397 p_BmPool->noBuffCtxt = !en;
402 void * BM_POOL_GetBuf(t_Handle h_BmPool, t_Handle h_BmPortal)
404 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
405 struct bm_buffer bufs[1];
410 SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, NULL);
411 SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, NULL);
412 SANITY_CHECK_RETURN_VALUE(p_BmPool->bufferPoolInfo.f_PhysToVirt, E_INVALID_STATE, NULL);
416 if (p_BmPool->h_BmPortal)
417 h_BmPortal = p_BmPool->h_BmPortal;
420 SANITY_CHECK_RETURN_VALUE(p_BmPool->h_Bm, E_INVALID_HANDLE, NULL);
421 h_BmPortal = BmGetPortalHandle(p_BmPool->h_Bm);
422 SANITY_CHECK_RETURN_VALUE(h_BmPortal, E_INVALID_HANDLE, NULL);
426 retBufsNum = (uint8_t)BmPoolAcquire(p_BmPool, h_BmPortal, bufs, 1, flags);
429 REPORT_ERROR(TRACE, E_NOT_AVAILABLE, ("buffer"));
432 physAddr = (uint64_t)bufs[0].lo;
433 physAddr |= (uint64_t)(((uint64_t)bufs[0].hi << 32) & 0x000000ff00000000LL);
434 DBG(TRACE,("Get Buffer : poolId %d, address 0x%016llx",
436 p_BmPool->bufferPoolInfo.f_PhysToVirt((physAddress_t)physAddr)));
438 return p_BmPool->bufferPoolInfo.f_PhysToVirt((physAddress_t)physAddr);
441 t_Error BM_POOL_PutBuf(t_Handle h_BmPool, t_Handle h_BmPortal, void *p_Buff)
443 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
444 uint64_t physAddress;
445 struct bm_buffer bufs[1];
447 SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE);
448 SANITY_CHECK_RETURN_ERROR(!p_BmPool->p_BmPoolDriverParams, E_INVALID_STATE);
449 SANITY_CHECK_RETURN_ERROR(p_Buff, E_NULL_POINTER);
451 physAddress = (uint64_t)(XX_VirtToPhys(p_Buff));
453 bufs[0].bpid = p_BmPool->bpid;
454 bufs[0].hi = (uint8_t)((physAddress & 0x000000ff00000000LL) >> 32);
455 bufs[0].lo = (uint32_t)(physAddress & 0xffffffff);
457 DBG(TRACE,("Put Buffer : poolId %d, address 0x%016llx, phys 0x%016llx",
458 p_BmPool->bpid, (uint64_t)PTR_TO_UINT(p_Buff), physAddress));
462 if (p_BmPool->h_BmPortal)
463 h_BmPortal = p_BmPool->h_BmPortal;
466 SANITY_CHECK_RETURN_ERROR(p_BmPool->h_Bm, E_INVALID_HANDLE);
467 h_BmPortal = BmGetPortalHandle(p_BmPool->h_Bm);
468 SANITY_CHECK_RETURN_ERROR(h_BmPortal, E_INVALID_HANDLE);
472 return BmPoolRelease(p_BmPool, h_BmPortal, bufs, 1, BMAN_RELEASE_FLAG_WAIT);
475 t_Error BM_POOL_FillBufs(t_Handle h_BmPool, t_Handle h_BmPortal, uint32_t numBufs)
477 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
479 SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE);
480 SANITY_CHECK_RETURN_ERROR(!p_BmPool->p_BmPoolDriverParams, E_INVALID_STATE);
484 if (p_BmPool->h_BmPortal)
485 h_BmPortal = p_BmPool->h_BmPortal;
488 SANITY_CHECK_RETURN_ERROR(p_BmPool->h_Bm, E_INVALID_HANDLE);
489 h_BmPortal = BmGetPortalHandle(p_BmPool->h_Bm);
490 SANITY_CHECK_RETURN_ERROR(h_BmPortal, E_INVALID_HANDLE);
498 t_Handle h_BufContext;
500 p_Data = p_BmPool->bufferPoolInfo.f_GetBuf(p_BmPool->bufferPoolInfo.h_BufferPool, &h_BufContext);
502 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("run-out of buffers for bpid %d",p_BmPool->bpid));
504 if (!p_BmPool->noBuffCtxt)
505 *(t_Handle *)(p_Data - sizeof(t_Handle)) = h_BufContext;
507 if ((res = BM_POOL_PutBuf(p_BmPool, h_BmPortal, p_Data)) != E_OK)
508 RETURN_ERROR(CRITICAL, res, ("Seeding reserved buffer pool failed"));
514 uint8_t BM_POOL_GetId(t_Handle h_BmPool)
516 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
518 SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, 0);
519 SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, 0);
521 return p_BmPool->bpid;
524 uint16_t BM_POOL_GetBufferSize(t_Handle h_BmPool)
526 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
528 SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, 0);
529 SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, 0);
531 return p_BmPool->bufferPoolInfo.bufferSize;
534 t_Handle BM_POOL_GetBufferContext(t_Handle h_BmPool, void *p_Buff)
536 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
538 SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, NULL);
539 SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, NULL);
540 SANITY_CHECK_RETURN_VALUE(p_Buff, E_NULL_POINTER, NULL);
542 if (p_BmPool->noBuffCtxt)
545 return *(t_Handle *)PTR_MOVE(p_Buff, -(sizeof(t_Handle)));
548 uint32_t BM_POOL_GetCounter(t_Handle h_BmPool, e_BmPoolCounters counter)
550 t_BmPool *p_BmPool = (t_BmPool *)h_BmPool;
552 SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, 0);
553 SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, 0);
557 case(e_BM_POOL_COUNTERS_CONTENT):
558 return BmGetCounter(p_BmPool->h_Bm, e_BM_IM_COUNTERS_POOL_CONTENT, p_BmPool->bpid);
559 case(e_BM_POOL_COUNTERS_SW_DEPLETION):
560 return (p_BmPool->swDepletionCount +=
561 BmGetCounter(p_BmPool->h_Bm, e_BM_IM_COUNTERS_POOL_SW_DEPLETION, p_BmPool->bpid));
562 case(e_BM_POOL_COUNTERS_HW_DEPLETION):
563 return (p_BmPool->hwDepletionCount +=
564 BmGetCounter(p_BmPool->h_Bm, e_BM_IM_COUNTERS_POOL_HW_DEPLETION, p_BmPool->bpid));
569 /* should never get here */