uboot/arch/arm/cpu/ixp/npe/IxOsalBufferMgt.c
<<
>>
Prefs
   1/**
   2 * @file IxOsalBufferMgt.c
   3 *
   4 * @brief Default buffer pool management and buffer management
   5 *        Implementation.
   6 *
   7 * Design Notes:
   8 *
   9 * @par
  10 * IXP400 SW Release version 2.0
  11 * 
  12 * -- Copyright Notice --
  13 * 
  14 * @par
  15 * Copyright 2001-2005, Intel Corporation.
  16 * All rights reserved.
  17 * 
  18 * @par
  19 * Redistribution and use in source and binary forms, with or without
  20 * modification, are permitted provided that the following conditions
  21 * are met:
  22 * 1. Redistributions of source code must retain the above copyright
  23 *    notice, this list of conditions and the following disclaimer.
  24 * 2. Redistributions in binary form must reproduce the above copyright
  25 *    notice, this list of conditions and the following disclaimer in the
  26 *    documentation and/or other materials provided with the distribution.
  27 * 3. Neither the name of the Intel Corporation nor the names of its contributors
  28 *    may be used to endorse or promote products derived from this software
  29 *    without specific prior written permission.
  30 * 
  31 * @par
  32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
  33 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  34 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  35 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
  36 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  40 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  41 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  42 * SUCH DAMAGE.
  43 * 
  44 * @par
  45 * -- End of Copyright Notice --
  46 */
  47
  48/*
  49 * OS may choose to use default bufferMgt by defining
  50 * IX_OSAL_USE_DEFAULT_BUFFER_MGT in IxOsalOsBufferMgt.h  
  51 */
  52
  53#include "IxOsal.h"
  54
  55#define IX_OSAL_BUFFER_FREE_PROTECTION  /* Define this to enable Illegal MBuf Freed Protection*/
  56
  57/*
  58 * The implementation is only used when the following
  59 * is defined.
  60 */
  61#ifdef IX_OSAL_USE_DEFAULT_BUFFER_MGT
  62
  63
  64#define IX_OSAL_MBUF_SYS_SIGNATURE                              (0x8BADF00D)
  65#define IX_OSAL_MBUF_SYS_SIGNATURE_MASK                         (0xEFFFFFFF)
  66#define IX_OSAL_MBUF_USED_FLAG                                  (0x10000000)
  67#define IX_OSAL_MBUF_SYS_SIGNATURE_INIT(bufPtr)                 IX_OSAL_MBUF_SIGNATURE (bufPtr) = (UINT32)IX_OSAL_MBUF_SYS_SIGNATURE
  68
  69/* 
  70*  This implementation is protect, the buffer pool management's  ixOsalMBufFree 
  71*  against an invalid MBUF pointer argument that already has been freed earlier 
  72*  or in other words resides in the free pool of MBUFs. This added feature, 
  73*  checks the MBUF "USED" FLAG. The Flag tells if the MBUF is still not freed 
  74*  back to the Buffer Pool.
  75*  Disable this feature for performance reasons by undef 
  76*  IX_OSAL_BUFFER_FREE_PROTECTION macro.
  77*/
  78#ifdef IX_OSAL_BUFFER_FREE_PROTECTION  /*IX_OSAL_BUFFER_FREE_PROTECTION With Buffer Free protection*/
  79
  80#define IX_OSAL_MBUF_GET_SYS_SIGNATURE(bufPtr)          (IX_OSAL_MBUF_SIGNATURE (bufPtr)&(IX_OSAL_MBUF_SYS_SIGNATURE_MASK) )
  81#define IX_OSAL_MBUF_SET_SYS_SIGNATURE(bufPtr)    do {                                                                                                                                                                                                                  \
  82                                                                                                                                                                                                        IX_OSAL_MBUF_SIGNATURE (bufPtr)&(~IX_OSAL_MBUF_SYS_SIGNATURE_MASK);\
  83                                                                                                                                                                                        IX_OSAL_MBUF_SIGNATURE (bufPtr)|=IX_OSAL_MBUF_SYS_SIGNATURE;                    \
  84                                                                                                                                                                                                        }while(0)
  85
  86#define IX_OSAL_MBUF_SET_USED_FLAG(bufPtr)   IX_OSAL_MBUF_SIGNATURE (bufPtr)|=IX_OSAL_MBUF_USED_FLAG
  87#define IX_OSAL_MBUF_CLEAR_USED_FLAG(bufPtr) IX_OSAL_MBUF_SIGNATURE (bufPtr)&=~IX_OSAL_MBUF_USED_FLAG
  88#define IX_OSAL_MBUF_ISSET_USED_FLAG(bufPtr) (IX_OSAL_MBUF_SIGNATURE (bufPtr)&IX_OSAL_MBUF_USED_FLAG)
  89
  90#else
  91
  92#define IX_OSAL_MBUF_GET_SYS_SIGNATURE(bufPtr)   IX_OSAL_MBUF_SIGNATURE (bufPtr)
  93#define IX_OSAL_MBUF_SET_SYS_SIGNATURE(bufPtr)   IX_OSAL_MBUF_SIGNATURE (bufPtr) = IX_OSAL_MBUF_SYS_SIGNATURE
  94
  95#endif /*IX_OSAL_BUFFER_FREE_PROTECTION With Buffer Free protection*/
  96/*
  97 * Variable declarations global to this file only.  Externs are followed by
  98 * static variables.
  99 */
 100
 101/* 
 102 * A unit of 32, used to provide bit-shift for pool
 103 * management. Needs some work if users want more than 32 pools.
 104 */
 105#define IX_OSAL_BUFF_FREE_BITS 32
 106
 107PRIVATE UINT32 ixOsalBuffFreePools[IX_OSAL_MBUF_MAX_POOLS /
 108    IX_OSAL_BUFF_FREE_BITS];
 109
 110PUBLIC IX_OSAL_MBUF_POOL ixOsalBuffPools[IX_OSAL_MBUF_MAX_POOLS];
 111
 112static int ixOsalBuffPoolsInUse = 0;
 113
 114#ifdef IX_OSAL_BUFFER_ALLOC_SEPARATELY
 115PRIVATE IX_OSAL_MBUF *
 116ixOsalBuffPoolMbufInit (UINT32 mbufSizeAligned,
 117                      UINT32 dataSizeAligned,
 118                      IX_OSAL_MBUF_POOL *poolPtr);
 119#endif
 120
 121PRIVATE IX_OSAL_MBUF_POOL * ixOsalPoolAlloc (void);                      
 122
 123/*
 124 * Function definition: ixOsalPoolAlloc
 125 */
 126
 127/****************************/
 128
 129PRIVATE IX_OSAL_MBUF_POOL *
 130ixOsalPoolAlloc (void)
 131{
 132    register unsigned int i = 0;
 133
 134    /*
 135     * Scan for the first free buffer. Free buffers are indicated by 0
 136     * on the corrsponding bit in ixOsalBuffFreePools. 
 137     */
 138    if (ixOsalBuffPoolsInUse >= IX_OSAL_MBUF_MAX_POOLS)
 139    {
 140        /*
 141         * Fail to grab a ptr this time 
 142         */
 143        return NULL;
 144    }
 145
 146    while (ixOsalBuffFreePools[i / IX_OSAL_BUFF_FREE_BITS] &
 147        (1 << (i % IX_OSAL_BUFF_FREE_BITS)))
 148        i++;
 149    /*
 150     * Free buffer found. Mark it as busy and initialize. 
 151     */
 152    ixOsalBuffFreePools[i / IX_OSAL_BUFF_FREE_BITS] |=
 153        (1 << (i % IX_OSAL_BUFF_FREE_BITS));
 154
 155    memset (&ixOsalBuffPools[i], 0, sizeof (IX_OSAL_MBUF_POOL));
 156
 157    ixOsalBuffPools[i].poolIdx = i;
 158    ixOsalBuffPoolsInUse++;
 159
 160    return &ixOsalBuffPools[i];
 161}
 162
 163
 164#ifdef IX_OSAL_BUFFER_ALLOC_SEPARATELY
 165PRIVATE IX_OSAL_MBUF *
 166ixOsalBuffPoolMbufInit (UINT32 mbufSizeAligned,
 167                      UINT32 dataSizeAligned,
 168                      IX_OSAL_MBUF_POOL *poolPtr)
 169{
 170    UINT8 *dataPtr;
 171    IX_OSAL_MBUF *realMbufPtr;
 172    /* Allocate cache-aligned memory for mbuf header */
 173    realMbufPtr = (IX_OSAL_MBUF *) IX_OSAL_CACHE_DMA_MALLOC (mbufSizeAligned);
 174    IX_OSAL_ASSERT (realMbufPtr != NULL);
 175    memset (realMbufPtr, 0, mbufSizeAligned);
 176
 177    /* Allocate cache-aligned memory for mbuf data */
 178    dataPtr = (UINT8 *) IX_OSAL_CACHE_DMA_MALLOC (dataSizeAligned);
 179    IX_OSAL_ASSERT (dataPtr != NULL);
 180    memset (dataPtr, 0, dataSizeAligned);
 181
 182    /* Fill in mbuf header fields */
 183    IX_OSAL_MBUF_MDATA (realMbufPtr) = dataPtr;
 184    IX_OSAL_MBUF_ALLOCATED_BUFF_DATA (realMbufPtr) = (UINT32)dataPtr;
 185
 186    IX_OSAL_MBUF_MLEN (realMbufPtr) = dataSizeAligned;
 187    IX_OSAL_MBUF_ALLOCATED_BUFF_LEN (realMbufPtr) = dataSizeAligned;
 188
 189    IX_OSAL_MBUF_NET_POOL (realMbufPtr) = (IX_OSAL_MBUF_POOL *) poolPtr;
 190
 191    IX_OSAL_MBUF_SYS_SIGNATURE_INIT(realMbufPtr);
 192
 193    /* update some statistical information */
 194    poolPtr->mbufMemSize += mbufSizeAligned;
 195    poolPtr->dataMemSize += dataSizeAligned;
 196
 197    return realMbufPtr;
 198}
 199#endif /* #ifdef IX_OSAL_BUFFER_ALLOC_SEPARATELY */
 200
 201/*
 202 * Function definition: ixOsalBuffPoolInit
 203 */
 204
 205PUBLIC IX_OSAL_MBUF_POOL *
 206ixOsalPoolInit (UINT32 count, UINT32 size, const char *name)
 207{
 208
 209    /* These variables are only used if UX_OSAL_BUFFER_ALLOC_SEPERATELY
 210     * is defined .
 211     */
 212#ifdef IX_OSAL_BUFFER_ALLOC_SEPARATELY
 213    UINT32 i, mbufSizeAligned, dataSizeAligned;
 214    IX_OSAL_MBUF *currentMbufPtr = NULL;
 215#else
 216    void *poolBufPtr;
 217    void *poolDataPtr;
 218    int mbufMemSize;
 219    int dataMemSize;
 220#endif
 221
 222    IX_OSAL_MBUF_POOL *poolPtr = NULL;
 223    
 224    if (count <= 0)
 225    {
 226        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 227            IX_OSAL_LOG_DEV_STDOUT,
 228            "ixOsalPoolInit(): " "count = 0 \n", 0, 0, 0, 0, 0, 0);
 229        return NULL;        
 230    }
 231
 232    if (name == NULL)
 233    {
 234        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 235            IX_OSAL_LOG_DEV_STDOUT,
 236            "ixOsalPoolInit(): " "NULL name \n", 0, 0, 0, 0, 0, 0);
 237        return NULL;        
 238    }
 239    
 240    if (strlen (name) > IX_OSAL_MBUF_POOL_NAME_LEN)
 241    {
 242        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 243            IX_OSAL_LOG_DEV_STDOUT,
 244            "ixOsalPoolInit(): "
 245            "ERROR - name length should be no greater than %d  \n",
 246            IX_OSAL_MBUF_POOL_NAME_LEN, 0, 0, 0, 0, 0);
 247        return NULL;
 248    }
 249
 250/* OS can choose whether to allocate all buffers all together (if it 
 251 * can handle a huge single alloc request), or to allocate buffers 
 252 * separately by the defining IX_OSAL_BUFFER_ALLOC_SEPARATELY.
 253 */
 254#ifdef IX_OSAL_BUFFER_ALLOC_SEPARATELY
 255    /* Get a pool Ptr */
 256    poolPtr = ixOsalPoolAlloc ();
 257
 258    if (poolPtr == NULL)
 259    {
 260        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 261            IX_OSAL_LOG_DEV_STDOUT,
 262            "ixOsalPoolInit(): " "Fail to Get PoolPtr \n", 0, 0, 0, 0, 0, 0);    
 263        return NULL;
 264    }
 265
 266    mbufSizeAligned = IX_OSAL_MBUF_POOL_SIZE_ALIGN (sizeof (IX_OSAL_MBUF));
 267    dataSizeAligned = IX_OSAL_MBUF_POOL_SIZE_ALIGN(size);
 268
 269    poolPtr->nextFreeBuf = NULL;    
 270    poolPtr->mbufMemPtr = NULL;    
 271    poolPtr->dataMemPtr = NULL;
 272    poolPtr->bufDataSize = dataSizeAligned;
 273    poolPtr->totalBufsInPool = count;
 274    poolPtr->poolAllocType = IX_OSAL_MBUF_POOL_TYPE_SYS_ALLOC;
 275    strcpy (poolPtr->name, name);
 276
 277
 278    for (i = 0; i < count; i++)
 279    {
 280            /* create an mbuf */
 281            currentMbufPtr = ixOsalBuffPoolMbufInit (mbufSizeAligned,
 282                                                 dataSizeAligned,
 283                                                 poolPtr);
 284
 285#ifdef IX_OSAL_BUFFER_FREE_PROTECTION           
 286/* Set the Buffer USED Flag. If not, ixOsalMBufFree will fail.
 287   ixOsalMbufFree used here is in a special case whereby, it's 
 288   used to add MBUF to the Pool. By specification, ixOsalMbufFree 
 289   deallocates an allocated MBUF from Pool.
 290*/                               
 291      IX_OSAL_MBUF_SET_USED_FLAG(currentMbufPtr);
 292#endif                             
 293            /* Add it to the pool */
 294            ixOsalMbufFree (currentMbufPtr);
 295
 296            /* flush the pool information to RAM */
 297            IX_OSAL_CACHE_FLUSH (currentMbufPtr, mbufSizeAligned);
 298    }
 299    
 300    /*
 301     * update the number of free buffers in the pool 
 302     */
 303    poolPtr->freeBufsInPool = count;
 304
 305#else 
 306/* Otherwise allocate buffers in a continuous block fashion */    
 307    poolBufPtr = IX_OSAL_MBUF_POOL_MBUF_AREA_ALLOC (count, mbufMemSize);
 308    IX_OSAL_ASSERT (poolBufPtr != NULL);
 309    poolDataPtr =
 310        IX_OSAL_MBUF_POOL_DATA_AREA_ALLOC (count, size, dataMemSize);
 311    IX_OSAL_ASSERT (poolDataPtr != NULL);
 312
 313    poolPtr = ixOsalNoAllocPoolInit (poolBufPtr, poolDataPtr,
 314        count, size, name);
 315    if (poolPtr == NULL)
 316    {
 317        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 318            IX_OSAL_LOG_DEV_STDOUT,
 319            "ixOsalPoolInit(): " "Fail to get pool ptr \n", 0, 0, 0, 0, 0, 0);
 320        return NULL;
 321    }
 322
 323    poolPtr->poolAllocType = IX_OSAL_MBUF_POOL_TYPE_SYS_ALLOC;
 324
 325#endif /* IX_OSAL_BUFFER_ALLOC_SEPARATELY */
 326    return poolPtr;
 327}
 328
 329PUBLIC IX_OSAL_MBUF_POOL *
 330ixOsalNoAllocPoolInit (void *poolBufPtr,
 331    void *poolDataPtr, UINT32 count, UINT32 size, const char *name)
 332{
 333    UINT32 i,  mbufSizeAligned, sizeAligned;
 334    IX_OSAL_MBUF *currentMbufPtr = NULL;
 335    IX_OSAL_MBUF *nextMbufPtr = NULL;
 336    IX_OSAL_MBUF_POOL *poolPtr = NULL;
 337
 338    /*
 339     * check parameters 
 340     */
 341    if (poolBufPtr == NULL)
 342    {
 343        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 344            IX_OSAL_LOG_DEV_STDOUT,
 345            "ixOsalNoAllocPoolInit(): "
 346            "ERROR - NULL poolBufPtr \n", 0, 0, 0, 0, 0, 0);
 347        return NULL;
 348    }
 349
 350    if (count <= 0)
 351    {
 352        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 353            IX_OSAL_LOG_DEV_STDOUT,
 354            "ixOsalNoAllocPoolInit(): "
 355            "ERROR - count must > 0   \n", 0, 0, 0, 0, 0, 0);
 356        return NULL;
 357    }
 358
 359    if (name == NULL)
 360    {
 361        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 362            IX_OSAL_LOG_DEV_STDOUT,
 363            "ixOsalNoAllocPoolInit(): "
 364            "ERROR - NULL name ptr  \n", 0, 0, 0, 0, 0, 0);
 365        return NULL;
 366    }
 367
 368    if (strlen (name) > IX_OSAL_MBUF_POOL_NAME_LEN)
 369    {
 370        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 371            IX_OSAL_LOG_DEV_STDOUT,
 372            "ixOsalNoAllocPoolInit(): "
 373            "ERROR - name length should be no greater than %d  \n",
 374            IX_OSAL_MBUF_POOL_NAME_LEN, 0, 0, 0, 0, 0);
 375        return NULL;
 376    }
 377
 378    poolPtr = ixOsalPoolAlloc ();
 379
 380    if (poolPtr == NULL)
 381    {
 382        return NULL;
 383    }
 384
 385    /*
 386     * Adjust sizes to ensure alignment on cache line boundaries 
 387     */
 388    mbufSizeAligned =
 389        IX_OSAL_MBUF_POOL_SIZE_ALIGN (sizeof (IX_OSAL_MBUF));
 390    /*
 391     * clear the mbuf memory area 
 392     */
 393    memset (poolBufPtr, 0, mbufSizeAligned * count);
 394
 395    if (poolDataPtr != NULL)
 396    {
 397        /*
 398         * Adjust sizes to ensure alignment on cache line boundaries 
 399         */
 400        sizeAligned = IX_OSAL_MBUF_POOL_SIZE_ALIGN (size);
 401        /*
 402         * clear the data memory area 
 403         */
 404        memset (poolDataPtr, 0, sizeAligned * count);
 405    }
 406    else
 407    {
 408        sizeAligned = 0;
 409    }
 410
 411    /*
 412     * initialise pool fields 
 413     */
 414    strcpy ((poolPtr)->name, name);
 415
 416    poolPtr->dataMemPtr = poolDataPtr;
 417    poolPtr->mbufMemPtr = poolBufPtr;
 418    poolPtr->bufDataSize = sizeAligned;
 419    poolPtr->totalBufsInPool = count;
 420    poolPtr->mbufMemSize = mbufSizeAligned * count;
 421    poolPtr->dataMemSize = sizeAligned * count;
 422
 423    currentMbufPtr = (IX_OSAL_MBUF *) poolBufPtr;
 424
 425    poolPtr->nextFreeBuf = currentMbufPtr;
 426
 427    for (i = 0; i < count; i++)
 428    {
 429        if (i < (count - 1))
 430        {
 431            nextMbufPtr =
 432                (IX_OSAL_MBUF *) ((unsigned) currentMbufPtr +
 433                mbufSizeAligned);
 434        }
 435        else
 436        {                       /* last mbuf in chain */
 437            nextMbufPtr = NULL;
 438        }
 439        IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR (currentMbufPtr) = nextMbufPtr;
 440        IX_OSAL_MBUF_NET_POOL (currentMbufPtr) = poolPtr;
 441
 442        IX_OSAL_MBUF_SYS_SIGNATURE_INIT(currentMbufPtr);
 443
 444        if (poolDataPtr != NULL)
 445        {
 446            IX_OSAL_MBUF_MDATA (currentMbufPtr) = poolDataPtr;
 447            IX_OSAL_MBUF_ALLOCATED_BUFF_DATA(currentMbufPtr) = (UINT32) poolDataPtr;
 448
 449            IX_OSAL_MBUF_MLEN (currentMbufPtr) = sizeAligned;
 450            IX_OSAL_MBUF_ALLOCATED_BUFF_LEN(currentMbufPtr) = sizeAligned;
 451
 452            poolDataPtr = (void *) ((unsigned) poolDataPtr + sizeAligned);
 453        }
 454
 455        currentMbufPtr = nextMbufPtr;
 456    }
 457
 458    /*
 459     * update the number of free buffers in the pool 
 460     */
 461    poolPtr->freeBufsInPool = count;
 462
 463    poolPtr->poolAllocType = IX_OSAL_MBUF_POOL_TYPE_USER_ALLOC;
 464
 465    return poolPtr;
 466}
 467
 468/* 
 469 * Get a mbuf ptr from the pool
 470 */
 471PUBLIC IX_OSAL_MBUF *
 472ixOsalMbufAlloc (IX_OSAL_MBUF_POOL * poolPtr)
 473{
 474    int lock;
 475    IX_OSAL_MBUF *newBufPtr = NULL;
 476
 477    /*
 478     * check parameters 
 479     */
 480    if (poolPtr == NULL)
 481    {
 482        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 483            IX_OSAL_LOG_DEV_STDOUT,
 484            "ixOsalMbufAlloc(): "
 485            "ERROR - Invalid Parameter\n", 0, 0, 0, 0, 0, 0);
 486        return NULL;
 487    }
 488
 489    lock = ixOsalIrqLock ();
 490
 491    newBufPtr = poolPtr->nextFreeBuf;
 492    if (newBufPtr)
 493    {
 494        poolPtr->nextFreeBuf =
 495            IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR (newBufPtr);
 496        IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR (newBufPtr) = NULL;
 497
 498        /*
 499         * update the number of free buffers in the pool 
 500         */
 501        poolPtr->freeBufsInPool--;
 502    }
 503    else
 504    {
 505        /* Return NULL to indicate to caller that request is denied. */
 506        ixOsalIrqUnlock (lock);
 507
 508        return NULL;
 509    }
 510
 511#ifdef IX_OSAL_BUFFER_FREE_PROTECTION
 512        /* Set Buffer Used Flag to indicate state.*/
 513    IX_OSAL_MBUF_SET_USED_FLAG(newBufPtr);
 514#endif
 515
 516    ixOsalIrqUnlock (lock);
 517
 518    return newBufPtr;
 519}
 520
 521PUBLIC IX_OSAL_MBUF *
 522ixOsalMbufFree (IX_OSAL_MBUF * bufPtr)
 523{
 524    int lock;
 525    IX_OSAL_MBUF_POOL *poolPtr;
 526
 527    IX_OSAL_MBUF *nextBufPtr = NULL;
 528
 529    /*
 530     * check parameters 
 531     */
 532    if (bufPtr == NULL)
 533    {
 534        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 535            IX_OSAL_LOG_DEV_STDOUT,
 536            "ixOsalMbufFree(): "
 537            "ERROR - Invalid Parameter\n", 0, 0, 0, 0, 0, 0);
 538        return NULL;
 539    }
 540
 541
 542
 543    lock = ixOsalIrqLock ();
 544
 545#ifdef IX_OSAL_BUFFER_FREE_PROTECTION
 546        
 547        /* Prevention for Buffer freed more than once*/
 548    if(!IX_OSAL_MBUF_ISSET_USED_FLAG(bufPtr))
 549    {
 550        return NULL;
 551    }
 552    IX_OSAL_MBUF_CLEAR_USED_FLAG(bufPtr);
 553#endif
 554        
 555    poolPtr = IX_OSAL_MBUF_NET_POOL (bufPtr);
 556
 557    /*
 558     * check the mbuf wrapper signature (if mbuf wrapper was used) 
 559     */
 560    if (poolPtr->poolAllocType == IX_OSAL_MBUF_POOL_TYPE_SYS_ALLOC)
 561    {
 562        IX_OSAL_ENSURE ( (IX_OSAL_MBUF_GET_SYS_SIGNATURE(bufPtr) == IX_OSAL_MBUF_SYS_SIGNATURE),
 563            "ixOsalBuffPoolBufFree: ERROR - Invalid mbuf signature.");
 564    }
 565
 566    nextBufPtr = IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR (bufPtr);
 567
 568    IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR (bufPtr) = poolPtr->nextFreeBuf;
 569    poolPtr->nextFreeBuf = bufPtr;
 570
 571    /*
 572     * update the number of free buffers in the pool 
 573     */
 574    poolPtr->freeBufsInPool++;
 575
 576    ixOsalIrqUnlock (lock);
 577
 578    return nextBufPtr;
 579}
 580
 581PUBLIC void
 582ixOsalMbufChainFree (IX_OSAL_MBUF * bufPtr)
 583{
 584    while ((bufPtr = ixOsalMbufFree (bufPtr)));
 585}
 586
 587/*
 588 * Function definition: ixOsalBuffPoolShow
 589 */
 590PUBLIC void
 591ixOsalMbufPoolShow (IX_OSAL_MBUF_POOL * poolPtr)
 592{
 593    IX_OSAL_MBUF *nextBufPtr;
 594    int count = 0;
 595    int lock;
 596
 597    /*
 598     * check parameters 
 599     */
 600    if (poolPtr == NULL)
 601    {
 602        ixOsalLog (IX_OSAL_LOG_LVL_ERROR,
 603            IX_OSAL_LOG_DEV_STDOUT,
 604            "ixOsalBuffPoolShow(): "
 605            "ERROR - Invalid Parameter", 0, 0, 0, 0, 0, 0);
 606        /*
 607         * return IX_FAIL; 
 608         */
 609        return;
 610    }
 611
 612    lock = ixOsalIrqLock ();
 613    count = poolPtr->freeBufsInPool;
 614    nextBufPtr = poolPtr->nextFreeBuf;
 615    ixOsalIrqUnlock (lock);
 616
 617    ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE,
 618        IX_OSAL_LOG_DEV_STDOUT, "=== POOL INFORMATION ===\n", 0, 0, 0,
 619        0, 0, 0);
 620    ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE, IX_OSAL_LOG_DEV_STDOUT,
 621        "Pool Name:                   %s\n",
 622        (unsigned int) poolPtr->name, 0, 0, 0, 0, 0);
 623    ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE, IX_OSAL_LOG_DEV_STDOUT,
 624        "Pool Allocation Type:        %d\n",
 625        (unsigned int) poolPtr->poolAllocType, 0, 0, 0, 0, 0);
 626    ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE, IX_OSAL_LOG_DEV_STDOUT,
 627        "Pool Mbuf Mem Usage (bytes): %d\n",
 628        (unsigned int) poolPtr->mbufMemSize, 0, 0, 0, 0, 0);
 629    ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE, IX_OSAL_LOG_DEV_STDOUT,
 630        "Pool Data Mem Usage (bytes): %d\n",
 631        (unsigned int) poolPtr->dataMemSize, 0, 0, 0, 0, 0);
 632    ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE, IX_OSAL_LOG_DEV_STDOUT,
 633        "Mbuf Data Capacity  (bytes): %d\n",
 634        (unsigned int) poolPtr->bufDataSize, 0, 0, 0, 0, 0);
 635    ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE, IX_OSAL_LOG_DEV_STDOUT,
 636        "Total Mbufs in Pool:         %d\n",
 637        (unsigned int) poolPtr->totalBufsInPool, 0, 0, 0, 0, 0);
 638    ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE, IX_OSAL_LOG_DEV_STDOUT,
 639        "Available Mbufs:             %d\n", (unsigned int) count, 0,
 640        0, 0, 0, 0);
 641    ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE, IX_OSAL_LOG_DEV_STDOUT,
 642        "Next Available Mbuf:         %p\n", (unsigned int) nextBufPtr,
 643        0, 0, 0, 0, 0);
 644
 645    if (poolPtr->poolAllocType == IX_OSAL_MBUF_POOL_TYPE_USER_ALLOC)
 646    {
 647        ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE,
 648            IX_OSAL_LOG_DEV_STDOUT,
 649            "Mbuf Mem Area Start address: %p\n",
 650            (unsigned int) poolPtr->mbufMemPtr, 0, 0, 0, 0, 0);
 651        ixOsalLog (IX_OSAL_LOG_LVL_MESSAGE, IX_OSAL_LOG_DEV_STDOUT,
 652            "Data Mem Area Start address: %p\n",
 653            (unsigned int) poolPtr->dataMemPtr, 0, 0, 0, 0, 0);
 654    }
 655}
 656
 657PUBLIC void
 658ixOsalMbufDataPtrReset (IX_OSAL_MBUF * bufPtr)
 659{
 660    IX_OSAL_MBUF_POOL *poolPtr;
 661    UINT8 *poolDataPtr;
 662
 663    if (bufPtr == NULL)
 664    {
 665        ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDOUT,
 666            "ixOsalBuffPoolBufDataPtrReset"
 667            ": ERROR - Invalid Parameter\n", 0, 0, 0, 0, 0, 0);
 668        return;
 669    }
 670
 671    poolPtr = (IX_OSAL_MBUF_POOL *) IX_OSAL_MBUF_NET_POOL (bufPtr);
 672    poolDataPtr = poolPtr->dataMemPtr;
 673
 674    if (poolPtr->poolAllocType == IX_OSAL_MBUF_POOL_TYPE_SYS_ALLOC)
 675    {
 676        if (IX_OSAL_MBUF_GET_SYS_SIGNATURE(bufPtr) != IX_OSAL_MBUF_SYS_SIGNATURE)
 677        {
 678            ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDOUT,
 679                "ixOsalBuffPoolBufDataPtrReset"
 680                ": invalid mbuf, cannot reset mData pointer\n", 0, 0,
 681                0, 0, 0, 0);
 682            return;
 683        }
 684        IX_OSAL_MBUF_MDATA (bufPtr) = (UINT8*)IX_OSAL_MBUF_ALLOCATED_BUFF_DATA (bufPtr);
 685    }
 686    else
 687    {
 688        if (poolDataPtr)
 689        {
 690            unsigned int bufSize = poolPtr->bufDataSize;
 691            unsigned int bufDataAddr =
 692                (unsigned int) IX_OSAL_MBUF_MDATA (bufPtr);
 693            unsigned int poolDataAddr = (unsigned int) poolDataPtr;
 694
 695            /*
 696             * the pointer is still pointing somewhere in the mbuf payload.
 697             * This operation moves the pointer to the beginning of the 
 698             * mbuf payload
 699             */
 700            bufDataAddr = ((bufDataAddr - poolDataAddr) / bufSize) * bufSize;
 701            IX_OSAL_MBUF_MDATA (bufPtr) = &poolDataPtr[bufDataAddr];
 702        }
 703        else
 704        {
 705            ixOsalLog (IX_OSAL_LOG_LVL_WARNING, IX_OSAL_LOG_DEV_STDOUT,
 706                "ixOsalBuffPoolBufDataPtrReset"
 707                ": cannot be used if user supplied NULL pointer for pool data area "
 708                "when pool was created\n", 0, 0, 0, 0, 0, 0);
 709            return;
 710        }
 711    }
 712
 713}
 714
 715/*
 716 * Function definition: ixOsalBuffPoolUninit
 717 */
 718PUBLIC IX_STATUS
 719ixOsalBuffPoolUninit (IX_OSAL_MBUF_POOL * pool)
 720{
 721    if (!pool)
 722    {
 723        ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDOUT,
 724            "ixOsalBuffPoolUninit: NULL ptr \n", 0, 0, 0, 0, 0, 0);
 725        return IX_FAIL;
 726    }
 727
 728    if (pool->freeBufsInPool != pool->totalBufsInPool)
 729    {
 730        ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDOUT,
 731            "ixOsalBuffPoolUninit: need to return all ptrs to the pool first! \n",
 732            0, 0, 0, 0, 0, 0);
 733        return IX_FAIL;
 734    }
 735
 736    if (pool->poolAllocType == IX_OSAL_MBUF_POOL_TYPE_SYS_ALLOC)
 737    {
 738#ifdef IX_OSAL_BUFFER_ALLOC_SEPARATELY
 739                                UINT32 i;
 740                                IX_OSAL_MBUF* pBuf;
 741                                
 742                                pBuf = pool->nextFreeBuf;
 743                                /* Freed the Buffer one by one till all the Memory is freed*/
 744                                for (i= pool->freeBufsInPool; i >0 && pBuf!=NULL ;i--){
 745                                                IX_OSAL_MBUF* pBufTemp;
 746                                                pBufTemp = IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(pBuf);
 747                                                /* Freed MBUF Data Memory area*/
 748                                                IX_OSAL_CACHE_DMA_FREE( (void *) (IX_OSAL_MBUF_ALLOCATED_BUFF_DATA(pBuf)) );
 749                                                /* Freed MBUF Struct Memory area*/
 750                                                IX_OSAL_CACHE_DMA_FREE(pBuf);
 751                                                pBuf = pBufTemp;
 752                                }
 753                                
 754#else           
 755        IX_OSAL_CACHE_DMA_FREE (pool->mbufMemPtr);
 756        IX_OSAL_CACHE_DMA_FREE (pool->dataMemPtr);
 757#endif        
 758    }
 759
 760    ixOsalBuffFreePools[pool->poolIdx / IX_OSAL_BUFF_FREE_BITS] &=
 761        ~(1 << (pool->poolIdx % IX_OSAL_BUFF_FREE_BITS));
 762    ixOsalBuffPoolsInUse--;
 763    return IX_SUCCESS;
 764}
 765
 766/*
 767 * Function definition: ixOsalBuffPoolDataAreaSizeGet
 768 */
 769PUBLIC UINT32
 770ixOsalBuffPoolDataAreaSizeGet (int count, int size)
 771{
 772    UINT32 memorySize;
 773    memorySize = count * IX_OSAL_MBUF_POOL_SIZE_ALIGN (size);
 774    return memorySize;
 775}
 776
 777/*
 778 * Function definition: ixOsalBuffPoolMbufAreaSizeGet
 779 */
 780PUBLIC UINT32
 781ixOsalBuffPoolMbufAreaSizeGet (int count)
 782{
 783    UINT32 memorySize;
 784    memorySize =
 785        count * IX_OSAL_MBUF_POOL_SIZE_ALIGN (sizeof (IX_OSAL_MBUF));
 786    return memorySize;
 787}
 788
 789/*
 790 * Function definition: ixOsalBuffPoolFreeCountGet
 791 */
 792PUBLIC UINT32 ixOsalBuffPoolFreeCountGet(IX_OSAL_MBUF_POOL * poolPtr)
 793
 794{
 795
 796   return poolPtr->freeBufsInPool;
 797
 798}
 799
 800#endif /* IX_OSAL_USE_DEFAULT_BUFFER_MGT */
 801