Annotation of ntddk/src/network/sonic/alloc.c, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1990-1992  Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     alloc.c
                      8: 
                      9: Abstract:
                     10: 
                     11:     This file contains the code for allocating and freeing adapter
                     12:     resources for the National Semiconductor SONIC Ethernet controller.
                     13:     This driver conforms to the NDIS 3.0 interface.
                     14: 
                     15:     The overall structure and much of the code is taken from
                     16:     the Lance NDIS driver by Tony Ercolano.
                     17: 
                     18: Author:
                     19: 
                     20:     Anthony V. Ercolano (Tonye) 20-Jul-1990
                     21:     Adam Barr (adamba) 14-Nov-1990
                     22: 
                     23: Environment:
                     24: 
                     25:     Kernel Mode - Or whatever is the equivalent.
                     26: 
                     27: Revision History:
                     28: 
                     29: 
                     30: --*/
                     31: 
                     32: #include <ndis.h>
                     33: 
                     34: 
                     35: #include <efilter.h>
                     36: #include <sonichrd.h>
                     37: #include <sonicsft.h>
                     38: 
                     39: 
                     40: 
                     41: STATIC
                     42: PNDIS_BUFFER
                     43: AllocateFlushBuffer(
                     44:     IN PSONIC_ADAPTER Adapter,
                     45:     IN PVOID VirtualAddress,
                     46:     IN ULONG Length
                     47:     );
                     48: 
                     49: 
                     50: //
                     51: // Use the alloc_text pragma to specify the driver initialization routines
                     52: // (they can be paged out).
                     53: //
                     54: 
                     55: #ifdef ALLOC_PRAGMA
                     56: #pragma alloc_text(init,AllocateAdapterMemory)
                     57: #pragma alloc_text(init,AllocateFlushBuffer)
                     58: #endif
                     59: 
                     60: 
                     61: 
                     62: STATIC
                     63: PNDIS_BUFFER
                     64: AllocateFlushBuffer(
                     65:     IN PSONIC_ADAPTER Adapter,
                     66:     IN PVOID VirtualAddress,
                     67:     IN ULONG Length
                     68:     )
                     69: 
                     70: /*++
                     71: 
                     72: Routine Description:
                     73: 
                     74:     Allocates an NDIS_BUFFER for the specified address and length.
                     75:     This function is intended to create NDIS_BUFFERs for flushing.
                     76: 
                     77: Arguments:
                     78: 
                     79:     Adapter - The adapter the buffer is for. It must have a
                     80:         FlushBufferPoolHandle that points to a valid buffer pool.
                     81: 
                     82:     VirtualAddress - A pointer to the buffer to describe.
                     83: 
                     84:     Length - The length of the buffer.
                     85: 
                     86: Return Value:
                     87: 
                     88:     The NDIS_BUFFER if one was allocated.
                     89:     NULL if an NDIS_BUFFER could not be allocated.
                     90: 
                     91: --*/
                     92: 
                     93: {
                     94:     PNDIS_BUFFER ReturnBuffer;
                     95:     NDIS_STATUS Status;
                     96: 
                     97:     NdisAllocateBuffer(
                     98:         &Status,
                     99:         &ReturnBuffer,
                    100:         Adapter->FlushBufferPoolHandle,
                    101:         VirtualAddress,
                    102:         Length
                    103:         );
                    104: 
                    105:     if (Status != NDIS_STATUS_SUCCESS) {
                    106: 
                    107: #if DBG
                    108:         DbgPrint("SONIC: Could not allocate flush buffer, %x\n", Status);
                    109: #endif
                    110:         ReturnBuffer = (PNDIS_BUFFER)NULL;
                    111:     }
                    112: 
                    113: 
                    114:     return ReturnBuffer;
                    115: }
                    116: 
                    117: extern
                    118: BOOLEAN
                    119: AllocateAdapterMemory(
                    120:     IN PSONIC_ADAPTER Adapter
                    121:     )
                    122: 
                    123: /*++
                    124: 
                    125: Routine Description:
                    126: 
                    127:     This routine allocates memory for:
                    128: 
                    129:     - Transmit ring entries
                    130: 
                    131:     - Receive ring entries
                    132: 
                    133:     - Receive buffers
                    134: 
                    135:     - Adapter buffers for use if user transmit buffers don't meet hardware
                    136:       contraints
                    137: 
                    138:     - Structures to map transmit ring entries back to the packets.
                    139: 
                    140: Arguments:
                    141: 
                    142:     Adapter - The adapter to allocate memory for.
                    143: 
                    144: Return Value:
                    145: 
                    146:     Returns FALSE if some memory needed for the adapter could not
                    147:     be allocated. It does NOT call DeleteAdapterMemory in this
                    148:     case.
                    149: 
                    150: --*/
                    151: 
                    152: {
                    153: 
                    154:     //
                    155:     // Pointer to a transmit ring entry.  Used while initializing
                    156:     // the TDA.
                    157:     //
                    158:     PSONIC_TRANSMIT_DESCRIPTOR CurrentTransmitDescriptor;
                    159: 
                    160:     //
                    161:     // Pointer to a receive buffer. Used while allocated the
                    162:     // RBAs.
                    163:     //
                    164:     PVOID * CurrentReceiveBuffer;
                    165: 
                    166:     //
                    167:     // Pointer to a receive descriptor. Used while initialing
                    168:     // the RDA.
                    169:     //
                    170:     PSONIC_RECEIVE_DESCRIPTOR CurrentReceiveDescriptor;
                    171: 
                    172:     //
                    173:     // Used for determining physical addresses.
                    174:     //
                    175:     SONIC_PHYSICAL_ADDRESS SonicPhysicalAdr;
                    176: 
                    177:     //
                    178:     // Used for NDIS allocation routines that return an NDIS_PHYSICAL_ADDRESS
                    179:     //
                    180:     NDIS_PHYSICAL_ADDRESS NdisPhysicalAdr;
                    181: 
                    182:     //
                    183:     // Simple iteration variable.
                    184:     //
                    185:     UINT i;
                    186: 
                    187:     //
                    188:     // Used to flush buffers that only need to be flushed once.
                    189:     //
                    190:     PNDIS_BUFFER FlushBuffer;
                    191: 
                    192:     //
                    193:     // The size of the buffer pool needed.
                    194:     //
                    195:     UINT PoolBuffersNeeded;
                    196: 
                    197:     //
                    198:     // Holds the result of calls to SONIC_ALLOC_MEMORY
                    199:     //
                    200:     NDIS_STATUS AllocStatus;
                    201: 
                    202: 
                    203: 
                    204:     //
                    205:     // We need some NDIS_BUFFERs to describe memory that we
                    206:     // allocate (generally either to flush the buffer, or
                    207:     // because we need its physical address). To do this
                    208:     // we need a buffer pool, so we have to determine how
                    209:     // many buffers we need.
                    210:     //
                    211:     PoolBuffersNeeded =
                    212:         1 +                                 // for CamDescriptorArea
                    213:         1 +                                 // for ReceiveResourceArea
                    214:         1 +                                 // for BlankBuffer
                    215:         SONIC_NUMBER_OF_SMALL_BUFFERS +
                    216:         SONIC_NUMBER_OF_MEDIUM_BUFFERS +
                    217:         SONIC_NUMBER_OF_LARGE_BUFFERS;
                    218: 
                    219:     NdisAllocateBufferPool(
                    220:         &AllocStatus,
                    221:         &Adapter->FlushBufferPoolHandle,
                    222:         PoolBuffersNeeded
                    223:         );
                    224: 
                    225:     if (AllocStatus != NDIS_STATUS_SUCCESS) {
                    226: 
                    227: #if DBG
                    228:        DbgPrint("SONIC: Could not allocate flush buffer pool\n");
                    229: #endif
                    230:        return FALSE;
                    231: 
                    232:     }
                    233: 
                    234: 
                    235: 
                    236:     //
                    237:     // Allocate the transmit ring descriptors.
                    238:     //
                    239: 
                    240:     NdisAllocateSharedMemory(
                    241:         Adapter->NdisAdapterHandle,
                    242:         sizeof(SONIC_TRANSMIT_DESCRIPTOR)*
                    243:             Adapter->NumberOfTransmitDescriptors,
                    244:         FALSE,                                     // non-cached
                    245:         (PVOID *)&Adapter->TransmitDescriptorArea,
                    246:         &Adapter->TransmitDescriptorAreaPhysical
                    247:         );
                    248: 
                    249:     if (Adapter->TransmitDescriptorArea == NULL) {
                    250: 
                    251: #if DBG
                    252:         DbgPrint("SONIC: TransmitDescriptorArea memory invalid\n");
                    253: #endif
                    254:         return FALSE;
                    255: 
                    256:     }
                    257: 
                    258:     if (NdisGetPhysicalAddressHigh(Adapter->TransmitDescriptorAreaPhysical) != 0) {
                    259: 
                    260: #if DBG
                    261:         DbgPrint("SONIC: TransmitDescriptorArea memory too high\n");
                    262: #endif
                    263:         return FALSE;
                    264:     }
                    265: 
                    266: 
                    267: 
                    268:     //
                    269:     // Clean the above memory
                    270:     //
                    271: 
                    272:     SONIC_ZERO_MEMORY(
                    273:         Adapter->TransmitDescriptorArea,
                    274:         (sizeof(SONIC_TRANSMIT_DESCRIPTOR)*Adapter->NumberOfTransmitDescriptors)
                    275:         );
                    276: 
                    277: 
                    278:     //
                    279:     // We have the transmit ring descriptors.  Initialize the Link
                    280:     // fields.
                    281:     //
                    282: 
                    283:     for (
                    284:         i = 0, CurrentTransmitDescriptor = Adapter->TransmitDescriptorArea;
                    285:         i < Adapter->NumberOfTransmitDescriptors;
                    286:         i++,CurrentTransmitDescriptor++
                    287:         ) {
                    288: 
                    289:         SonicPhysicalAdr = NdisGetPhysicalAddressLow(Adapter->TransmitDescriptorAreaPhysical) +
                    290:                              (i * sizeof(SONIC_TRANSMIT_DESCRIPTOR));
                    291: 
                    292:         if (i == 0) {
                    293: 
                    294:             Adapter->TransmitDescriptorArea[Adapter->NumberOfTransmitDescriptors-1].Link = SonicPhysicalAdr;
                    295: 
                    296:         } else {
                    297: 
                    298:             (CurrentTransmitDescriptor-1)->Link = SonicPhysicalAdr;
                    299: 
                    300:         }
                    301: 
                    302:     }
                    303: 
                    304: 
                    305:     //
                    306:     // Allocate the ring to packet structure.
                    307:     //
                    308: 
                    309:     SONIC_ALLOC_MEMORY(
                    310:         &AllocStatus,
                    311:         &Adapter->DescriptorToPacket,
                    312:         sizeof(SONIC_DESCRIPTOR_TO_PACKET)
                    313:             *Adapter->NumberOfTransmitDescriptors
                    314:         );
                    315: 
                    316:     if (AllocStatus != NDIS_STATUS_SUCCESS) {
                    317:         return FALSE;
                    318:     }
                    319: 
                    320: 
                    321:     //
                    322:     // We have to do this now. The PrevLinkPointer field is used
                    323:     // to point to where the Link field of the previous transmit
                    324:     // descriptor is; it is normally set when the previous
                    325:     // transmit descriptor is filled. For the very first packet
                    326:     // transmitted there will have been no previous transmit
                    327:     // descriptor, so we fill it in ourselves. We use the
                    328:     // Link field of the last transmit descriptor (the actual
                    329:     // location used doesn't really matter, as long as it is
                    330:     // a valid address).
                    331:     //
                    332: 
                    333:     Adapter->DescriptorToPacket->PrevLinkPointer =
                    334:                     &(Adapter->TransmitDescriptorArea[
                    335:                         Adapter->NumberOfTransmitDescriptors-1].Link);
                    336: 
                    337: 
                    338:     //
                    339:     // Allocate the receive resource area and the
                    340:     // CAM descriptor area. These are allocated together
                    341:     // since they must have the same high 16 bits in
                    342:     // their addresses.
                    343:     //
                    344: 
                    345:     NdisAllocateSharedMemory(
                    346:         Adapter->NdisAdapterHandle,
                    347:         (sizeof(SONIC_RECEIVE_RESOURCE)*Adapter->NumberOfReceiveBuffers) +
                    348:             sizeof(SONIC_CAM_DESCRIPTOR_AREA),
                    349:         TRUE,                                       // cached
                    350:         (PVOID *)&Adapter->ReceiveResourceArea,
                    351:         &Adapter->ReceiveResourceAreaPhysical
                    352:         );
                    353: 
                    354: 
                    355:     if (Adapter->ReceiveResourceArea == NULL) {
                    356: 
                    357: #if DBG
                    358:         DbgPrint("SONIC: ReceiveResourceArea memory invalid\n");
                    359: #endif
                    360:         return FALSE;
                    361: 
                    362:     }
                    363: 
                    364:     if (NdisGetPhysicalAddressHigh(Adapter->ReceiveResourceAreaPhysical) != 0) {
                    365: 
                    366: #if DBG
                    367:         DbgPrint("SONIC: ReceiveResourceArea memory too high\n");
                    368: #endif
                    369:         return FALSE;
                    370: 
                    371:     }
                    372: 
                    373: 
                    374:     //
                    375:     // The CAM Descriptor Area is immediately after the RRA.
                    376:     //
                    377: 
                    378:     Adapter->CamDescriptorArea = (PSONIC_CAM_DESCRIPTOR_AREA)
                    379:             (Adapter->ReceiveResourceArea + Adapter->NumberOfReceiveBuffers);
                    380: 
                    381:     Adapter->CamDescriptorAreaPhysical =
                    382:         NdisGetPhysicalAddressLow(Adapter->ReceiveResourceAreaPhysical) +
                    383:             ((PUCHAR)Adapter->CamDescriptorArea -
                    384:              (PUCHAR)Adapter->ReceiveResourceArea);
                    385: 
                    386: 
                    387:     //
                    388:     // Allocate the NDIS_BUFFER to flush the CAM Descriptor Area.
                    389:     //
                    390:     Adapter->CamDescriptorAreaFlushBuffer = AllocateFlushBuffer(
                    391:                                             Adapter,
                    392:                                             Adapter->CamDescriptorArea,
                    393:                                             sizeof(SONIC_CAM_DESCRIPTOR_AREA)
                    394:                                             );
                    395: 
                    396:     if (!Adapter->CamDescriptorAreaFlushBuffer) {
                    397:         return FALSE;
                    398:     }
                    399: 
                    400:     SONIC_ZERO_MEMORY(
                    401:         Adapter->CamDescriptorArea,
                    402:         sizeof(SONIC_CAM_DESCRIPTOR_AREA)
                    403:         );
                    404: 
                    405:     SONIC_FLUSH_WRITE_BUFFER(Adapter->CamDescriptorAreaFlushBuffer);
                    406: 
                    407: 
                    408: #if DBG
                    409:     if (SonicDbg) {
                    410:         DbgPrint("SONIC: Cam Descriptor Area: %lx  physical: %lx\n",
                    411:             Adapter->CamDescriptorArea,
                    412:             Adapter->CamDescriptorAreaPhysical);
                    413:     }
                    414: #endif
                    415: 
                    416:     //
                    417:     // Allocate the array to hold pointers to the RBAs.
                    418:     //
                    419: 
                    420:     SONIC_ALLOC_MEMORY(
                    421:         &AllocStatus,
                    422:         &Adapter->ReceiveBufferArea,
                    423:         sizeof(PVOID) * Adapter->NumberOfReceiveBuffers
                    424:         );
                    425: 
                    426:     if (AllocStatus != NDIS_STATUS_SUCCESS) {
                    427:         return FALSE;
                    428:     }
                    429: 
                    430: #if DBG
                    431:     if (SonicDbg) {
                    432:         DbgPrint("SONIC: Receive Buffer Area: %lx\n",
                    433:                     (ULONG)Adapter->ReceiveBufferArea);
                    434:     }
                    435: #endif
                    436: 
                    437: 
                    438:     //
                    439:     // We have the receive buffer pointers. Allocate the buffer
                    440:     // for each entry and zero them.
                    441:     //
                    442:     // For each receive buffer, the Physical address and length
                    443:     // will be in Adapter->ReceiveResourceArea[i], while the
                    444:     // virtual address will be in Adapter->ReceiveBufferArea[i].
                    445:     //
                    446: 
                    447:     for (
                    448:         i = 0, CurrentReceiveBuffer = Adapter->ReceiveBufferArea;
                    449:         i < Adapter->NumberOfReceiveBuffers;
                    450:         i++,CurrentReceiveBuffer++
                    451:         ) {
                    452: 
                    453:         NdisAllocateSharedMemory(
                    454:             Adapter->NdisAdapterHandle,
                    455:             SONIC_SIZE_OF_RECEIVE_BUFFERS,
                    456:             FALSE,                             // non-cached
                    457:             CurrentReceiveBuffer,
                    458:             &NdisPhysicalAdr
                    459:             );
                    460: 
                    461: 
                    462:         if (*CurrentReceiveBuffer == NULL) {
                    463:             return FALSE;
                    464:         }
                    465: 
                    466:         if (NdisGetPhysicalAddressHigh(NdisPhysicalAdr) != 0) {
                    467:             return FALSE;
                    468:         }
                    469: 
                    470: 
                    471:         SONIC_ZERO_MEMORY(
                    472:             *CurrentReceiveBuffer,
                    473:             SONIC_SIZE_OF_RECEIVE_BUFFERS
                    474:             );
                    475: 
                    476:         SONIC_SET_RECEIVE_RESOURCE_ADDRESS(
                    477:             &Adapter->ReceiveResourceArea[i],
                    478:             NdisGetPhysicalAddressLow(NdisPhysicalAdr)
                    479:             );
                    480: 
                    481:         SONIC_SET_RECEIVE_RESOURCE_LENGTH(
                    482:             &Adapter->ReceiveResourceArea[i],
                    483:             SONIC_SIZE_OF_RECEIVE_BUFFERS
                    484:             );
                    485: 
                    486: 
                    487:     }
                    488: 
                    489:     //
                    490:     // The Receive Resource Area is set up, we can flush
                    491:     // it now since it does not change.
                    492:     //
                    493: 
                    494:     FlushBuffer = AllocateFlushBuffer(
                    495:             Adapter,
                    496:             (PVOID)Adapter->ReceiveResourceArea,
                    497:             (sizeof(SONIC_RECEIVE_RESOURCE)*Adapter->NumberOfReceiveBuffers)
                    498:         );
                    499: 
                    500:     if (!FlushBuffer) {
                    501:         return FALSE;
                    502:     }
                    503: 
                    504:     SONIC_FLUSH_WRITE_BUFFER(FlushBuffer);
                    505: 
                    506:     NdisFreeBuffer(FlushBuffer);
                    507: 
                    508:     //
                    509:     // Allocate memory to hold the receive descriptor pointers.
                    510:     //
                    511: 
                    512:     NdisAllocateSharedMemory(
                    513:         Adapter->NdisAdapterHandle,
                    514:         sizeof(SONIC_RECEIVE_DESCRIPTOR) *
                    515:             Adapter->NumberOfReceiveDescriptors,
                    516:         FALSE,                                     // non-cached
                    517:         (PVOID *)&Adapter->ReceiveDescriptorArea,
                    518:         &Adapter->ReceiveDescriptorAreaPhysical
                    519:         );
                    520: 
                    521: 
                    522:     if (Adapter->ReceiveDescriptorArea == NULL) {
                    523: 
                    524: #if DBG
                    525:         DbgPrint("SONIC: ReceiveDescriptorArea memory invalid\n");
                    526: #endif
                    527:         return FALSE;
                    528: 
                    529:     }
                    530: 
                    531:     if (NdisGetPhysicalAddressHigh(Adapter->ReceiveDescriptorAreaPhysical) != 0) {
                    532: 
                    533: #if DBG
                    534:         DbgPrint("SONIC: ReceiveDescriptorArea memory too high\n");
                    535: #endif
                    536:         return FALSE;
                    537: 
                    538:     }
                    539: 
                    540: 
                    541: 
                    542:     //
                    543:     // Clean the above memory
                    544:     //
                    545: 
                    546:     SONIC_ZERO_MEMORY(
                    547:         Adapter->ReceiveDescriptorArea,
                    548:         (sizeof(SONIC_RECEIVE_DESCRIPTOR)*Adapter->NumberOfReceiveDescriptors)
                    549:         );
                    550: 
                    551: 
                    552:     //
                    553:     // Now set up the Link fields in the receive descriptors.
                    554:     //
                    555: 
                    556:     for (
                    557:         i = 0, CurrentReceiveDescriptor = Adapter->ReceiveDescriptorArea;
                    558:         i < Adapter->NumberOfReceiveDescriptors;
                    559:         i++,CurrentReceiveDescriptor++
                    560:         ) {
                    561: 
                    562:         //
                    563:         // belongs to SONIC.
                    564:         //
                    565: 
                    566:         CurrentReceiveDescriptor->InUse = SONIC_OWNED_BY_SONIC;
                    567: 
                    568:         SonicPhysicalAdr = NdisGetPhysicalAddressLow(Adapter->ReceiveDescriptorAreaPhysical) +
                    569:                         (i * sizeof(SONIC_RECEIVE_DESCRIPTOR));
                    570: 
                    571:         if (i == 0) {
                    572: 
                    573:             Adapter->ReceiveDescriptorArea[
                    574:                 Adapter->NumberOfReceiveDescriptors-1].Link =
                    575:                         SonicPhysicalAdr | SONIC_END_OF_LIST;
                    576: 
                    577:         } else {
                    578: 
                    579:             Adapter->ReceiveDescriptorArea[i-1].Link = SonicPhysicalAdr;
                    580: 
                    581:         }
                    582: 
                    583:     }
                    584: 
                    585: 
                    586:     //
                    587:     // Allocate the array of buffer descriptors.
                    588:     //
                    589: 
                    590:     SONIC_ALLOC_MEMORY(
                    591:         &AllocStatus,
                    592:         &Adapter->SonicBuffers,
                    593:         sizeof(SONIC_BUFFER_DESCRIPTOR)*
                    594:            (SONIC_NUMBER_OF_SMALL_BUFFERS +
                    595:             SONIC_NUMBER_OF_MEDIUM_BUFFERS +
                    596:             SONIC_NUMBER_OF_LARGE_BUFFERS)
                    597:         );
                    598: 
                    599:     if (AllocStatus != NDIS_STATUS_SUCCESS) {
                    600:         return FALSE;
                    601:     }
                    602: 
                    603:     //
                    604:     // Zero the memory of all the descriptors so that we can
                    605:     // know which buffers wern't allocated incase we can't allocate
                    606:     // them all.
                    607:     //
                    608:     SONIC_ZERO_MEMORY(
                    609:         Adapter->SonicBuffers,
                    610:         sizeof(SONIC_BUFFER_DESCRIPTOR)*
                    611:          (SONIC_NUMBER_OF_SMALL_BUFFERS +
                    612:           SONIC_NUMBER_OF_MEDIUM_BUFFERS +
                    613:           SONIC_NUMBER_OF_LARGE_BUFFERS)
                    614:         );
                    615: 
                    616: 
                    617:     //
                    618:     // Allocate space for the small sonic buffers and fill in the
                    619:     // buffer descriptors.
                    620:     //
                    621: 
                    622:     Adapter->SonicBufferListHeads[0] = -1;
                    623:     Adapter->SonicBufferListHeads[1] = 0;
                    624: 
                    625:     NdisAllocateSharedMemory(
                    626:         Adapter->NdisAdapterHandle,
                    627:         SONIC_SMALL_BUFFER_SIZE * SONIC_NUMBER_OF_SMALL_BUFFERS,
                    628:         TRUE,         // cached
                    629:         &Adapter->SmallSonicBuffers,
                    630:         &NdisPhysicalAdr
                    631:         );
                    632: 
                    633:     if (NdisGetPhysicalAddressHigh(NdisPhysicalAdr) != 0) {
                    634:         return FALSE;
                    635:     }
                    636: 
                    637: 
                    638:     if (Adapter->SmallSonicBuffers == NULL) {
                    639:         return FALSE;
                    640:     }
                    641: 
                    642:     for (
                    643:         i = 0;
                    644:         i < SONIC_NUMBER_OF_SMALL_BUFFERS;
                    645:         i++
                    646:         ) {
                    647: 
                    648:         Adapter->SonicBuffers[i].VirtualSonicBuffer = (PVOID)
                    649:             ((PUCHAR)Adapter->SmallSonicBuffers +
                    650:             (i * SONIC_SMALL_BUFFER_SIZE));
                    651: 
                    652:         NdisSetPhysicalAddressHigh(
                    653:             Adapter->SonicBuffers[i].PhysicalSonicBuffer,
                    654:             0);
                    655: 
                    656:         NdisSetPhysicalAddressLow(
                    657:             Adapter->SonicBuffers[i].PhysicalSonicBuffer,
                    658:             NdisGetPhysicalAddressLow(NdisPhysicalAdr) +
                    659:             (i * SONIC_SMALL_BUFFER_SIZE));
                    660: 
                    661:         Adapter->SonicBuffers[i].FlushBuffer =
                    662:             AllocateFlushBuffer(
                    663:                 Adapter,
                    664:                 Adapter->SonicBuffers[i].VirtualSonicBuffer,
                    665:                 SONIC_SMALL_BUFFER_SIZE
                    666:             );
                    667: 
                    668:         if (!Adapter->SonicBuffers[i].FlushBuffer) {
                    669:             return FALSE;
                    670:         }
                    671: 
                    672:         Adapter->SonicBuffers[i].Next = i+1;
                    673: 
                    674:     }
                    675: 
                    676:     //
                    677:     // Make sure that the last buffer correctly terminates the free list.
                    678:     //
                    679: 
                    680:     Adapter->SonicBuffers[i-1].Next = -1;
                    681: 
                    682:     //
                    683:     // Do the medium buffers now.
                    684:     //
                    685: 
                    686:     Adapter->SonicBufferListHeads[2] = i;
                    687: 
                    688:     NdisAllocateSharedMemory(
                    689:         Adapter->NdisAdapterHandle,
                    690:         SONIC_MEDIUM_BUFFER_SIZE * SONIC_NUMBER_OF_MEDIUM_BUFFERS,
                    691:         TRUE,         // cached
                    692:         &Adapter->MediumSonicBuffers,
                    693:         &NdisPhysicalAdr
                    694:         );
                    695: 
                    696: 
                    697:     if (Adapter->MediumSonicBuffers == NULL) {
                    698:         return FALSE;
                    699:     }
                    700: 
                    701:     if (NdisGetPhysicalAddressHigh(NdisPhysicalAdr) != 0) {
                    702:         return FALSE;
                    703:     }
                    704: 
                    705: 
                    706: 
                    707:     for (
                    708:         ;
                    709:         i < SONIC_NUMBER_OF_SMALL_BUFFERS + SONIC_NUMBER_OF_MEDIUM_BUFFERS;
                    710:         i++
                    711:         ) {
                    712: 
                    713:         Adapter->SonicBuffers[i].VirtualSonicBuffer = (PVOID)
                    714:             ((PUCHAR)Adapter->MediumSonicBuffers +
                    715:             ((i - SONIC_NUMBER_OF_SMALL_BUFFERS) * SONIC_MEDIUM_BUFFER_SIZE));
                    716: 
                    717:         NdisSetPhysicalAddressHigh(
                    718:             Adapter->SonicBuffers[i].PhysicalSonicBuffer,
                    719:             0);
                    720: 
                    721:         NdisSetPhysicalAddressLow(
                    722:             Adapter->SonicBuffers[i].PhysicalSonicBuffer,
                    723:             NdisGetPhysicalAddressLow(NdisPhysicalAdr) +
                    724:             ((i - SONIC_NUMBER_OF_SMALL_BUFFERS) * SONIC_MEDIUM_BUFFER_SIZE));
                    725: 
                    726: 
                    727:         Adapter->SonicBuffers[i].FlushBuffer =
                    728:             AllocateFlushBuffer(
                    729:                 Adapter,
                    730:                 Adapter->SonicBuffers[i].VirtualSonicBuffer,
                    731:                 SONIC_MEDIUM_BUFFER_SIZE
                    732:             );
                    733: 
                    734:         if (!Adapter->SonicBuffers[i].FlushBuffer) {
                    735:             return FALSE;
                    736:         }
                    737: 
                    738: 
                    739:         Adapter->SonicBuffers[i].Next = i+1;
                    740: 
                    741:     }
                    742: 
                    743:     //
                    744:     // Make sure that the last buffer correctly terminates the free list.
                    745:     //
                    746: 
                    747:     Adapter->SonicBuffers[i-1].Next = -1;
                    748: 
                    749:     //
                    750:     // Now do the large buffers; note that they have one
                    751:     // Physical address per buffer.
                    752:     //
                    753: 
                    754:     Adapter->SonicBufferListHeads[3] = i;
                    755: 
                    756:     for (
                    757:         ;
                    758:         i < SONIC_NUMBER_OF_SMALL_BUFFERS +
                    759:             SONIC_NUMBER_OF_MEDIUM_BUFFERS +
                    760:             SONIC_NUMBER_OF_LARGE_BUFFERS;
                    761:         i++
                    762:         ) {
                    763: 
                    764: 
                    765:         NdisAllocateSharedMemory(
                    766:             Adapter->NdisAdapterHandle,
                    767:             SONIC_LARGE_BUFFER_SIZE,
                    768:             TRUE,         // cached
                    769:             (PVOID *)&Adapter->SonicBuffers[i].VirtualSonicBuffer,
                    770:             &Adapter->SonicBuffers[i].PhysicalSonicBuffer
                    771:             );
                    772: 
                    773: 
                    774:         if (Adapter->SonicBuffers[i].VirtualSonicBuffer == NULL) {
                    775:             return FALSE;
                    776:         }
                    777: 
                    778:         if (NdisGetPhysicalAddressHigh(Adapter->SonicBuffers[i].PhysicalSonicBuffer) != 0) {
                    779:             return FALSE;
                    780:         }
                    781: 
                    782: 
                    783:         Adapter->SonicBuffers[i].FlushBuffer =
                    784:             AllocateFlushBuffer(
                    785:                 Adapter,
                    786:                 Adapter->SonicBuffers[i].VirtualSonicBuffer,
                    787:                 SONIC_LARGE_BUFFER_SIZE
                    788:             );
                    789: 
                    790:         if (!Adapter->SonicBuffers[i].FlushBuffer) {
                    791:             return FALSE;
                    792:         }
                    793: 
                    794: 
                    795:         Adapter->SonicBuffers[i].Next = i+1;
                    796: 
                    797:     }
                    798: 
                    799:     //
                    800:     // Make sure that the last buffer correctly terminates the free list.
                    801:     //
                    802: 
                    803:     Adapter->SonicBuffers[i-1].Next = -1;
                    804: 
                    805: 
                    806:     //
                    807:     // Allocate the BlankBuffer
                    808:     //
                    809: 
                    810:     NdisAllocateSharedMemory(
                    811:         Adapter->NdisAdapterHandle,
                    812:         SONIC_SMALL_BUFFER_SIZE,
                    813:         TRUE,                               // cached
                    814:         (PVOID *)&Adapter->BlankBuffer,
                    815:         &Adapter->BlankBufferAddress
                    816:         );
                    817: 
                    818: 
                    819:     if (Adapter->BlankBuffer == NULL) {
                    820:         return FALSE;
                    821:     }
                    822: 
                    823:     if (NdisGetPhysicalAddressHigh(Adapter->BlankBufferAddress) != 0) {
                    824:         return FALSE;
                    825:     }
                    826: 
                    827:     for (i=0; i < SONIC_SMALL_BUFFER_SIZE; i++) {
                    828: 
                    829:         Adapter->BlankBuffer[i] = ' ';
                    830: 
                    831:     }
                    832: 
                    833: 
                    834:     //
                    835:     // Flush the blank buffer now, it never changes.
                    836:     //
                    837: 
                    838:     FlushBuffer = AllocateFlushBuffer(
                    839:                 Adapter,
                    840:                 Adapter->BlankBuffer,
                    841:                 SONIC_SMALL_BUFFER_SIZE
                    842:             );
                    843: 
                    844:     if (!FlushBuffer) {
                    845:         return FALSE;
                    846:     }
                    847: 
                    848:     SONIC_FLUSH_WRITE_BUFFER(FlushBuffer);
                    849: 
                    850:     //
                    851:     // We are done with the FlushBuffer.
                    852:     //
                    853: 
                    854:     NdisFreeBuffer(FlushBuffer);
                    855: 
                    856: 
                    857:     return TRUE;
                    858: 
                    859: }
                    860: 
                    861: extern
                    862: VOID
                    863: DeleteAdapterMemory(
                    864:     IN PSONIC_ADAPTER Adapter
                    865:     )
                    866: 
                    867: /*++
                    868: 
                    869: Routine Description:
                    870: 
                    871:     This routine deallocates memory for:
                    872: 
                    873:     - Transmit ring entries
                    874: 
                    875:     - Receive ring entries
                    876: 
                    877:     - Receive buffers
                    878: 
                    879:     - Adapter buffers for use if user transmit buffers don't meet hardware
                    880:       contraints
                    881: 
                    882:     - Structures to map transmit ring entries back to the packets.
                    883: 
                    884: Arguments:
                    885: 
                    886:     Adapter - The adapter to deallocate memory for.
                    887: 
                    888: Return Value:
                    889: 
                    890:     None.
                    891: 
                    892: --*/
                    893: 
                    894: {
                    895: 
                    896:     if (Adapter->FlushBufferPoolHandle) {
                    897: 
                    898:         NdisFreeBufferPool(Adapter->FlushBufferPoolHandle);
                    899: 
                    900:     }
                    901: 
                    902:     if (Adapter->TransmitDescriptorArea) {
                    903: 
                    904:         NdisFreeSharedMemory(
                    905:             Adapter->NdisAdapterHandle,
                    906:             sizeof(SONIC_TRANSMIT_DESCRIPTOR)*
                    907:                 Adapter->NumberOfTransmitDescriptors,
                    908:             FALSE,
                    909:             Adapter->TransmitDescriptorArea,
                    910:             Adapter->TransmitDescriptorAreaPhysical
                    911:             );
                    912: 
                    913:     }
                    914: 
                    915:     if (Adapter->CamDescriptorAreaFlushBuffer) {
                    916: 
                    917:         NdisFreeBuffer(Adapter->CamDescriptorAreaFlushBuffer);
                    918: 
                    919:     }
                    920: 
                    921:     if (Adapter->ReceiveBufferArea) {
                    922: 
                    923:         UINT i;
                    924:         NDIS_PHYSICAL_ADDRESS PhysicalAddr;
                    925: 
                    926:         for (
                    927:             i = 0;
                    928:             i < Adapter->NumberOfReceiveBuffers;
                    929:             i++
                    930:             ) {
                    931: 
                    932:             if (Adapter->ReceiveBufferArea[i]) {
                    933: 
                    934:                 NdisSetPhysicalAddressHigh(PhysicalAddr, 0);
                    935:                 NdisSetPhysicalAddressLow(
                    936:                     PhysicalAddr,
                    937:                     SONIC_GET_RECEIVE_RESOURCE_ADDRESS(&Adapter->ReceiveResourceArea[i]));
                    938: 
                    939:                 NdisFreeSharedMemory(
                    940:                     Adapter->NdisAdapterHandle,
                    941:                     SONIC_SIZE_OF_RECEIVE_BUFFERS,
                    942:                     FALSE,
                    943:                     Adapter->ReceiveBufferArea[i],
                    944:                     PhysicalAddr
                    945:                     );
                    946: 
                    947:             } else {
                    948: 
                    949:                 break;
                    950: 
                    951:             }
                    952: 
                    953:         }
                    954: 
                    955:         SONIC_FREE_MEMORY(Adapter->ReceiveBufferArea,
                    956:             sizeof(PVOID) * Adapter->NumberOfReceiveBuffers);
                    957: 
                    958:     }
                    959: 
                    960:     if (Adapter->ReceiveResourceArea) {
                    961: 
                    962:         NdisFreeSharedMemory(
                    963:             Adapter->NdisAdapterHandle,
                    964:             (sizeof(SONIC_RECEIVE_RESOURCE)*Adapter->NumberOfReceiveBuffers) +
                    965:                 sizeof(SONIC_CAM_DESCRIPTOR_AREA),
                    966:             TRUE,
                    967:             Adapter->ReceiveResourceArea,
                    968:             Adapter->ReceiveResourceAreaPhysical
                    969:             );
                    970: 
                    971:     }
                    972: 
                    973:     if (Adapter->ReceiveDescriptorArea) {
                    974: 
                    975:         NdisFreeSharedMemory(
                    976:             Adapter->NdisAdapterHandle,
                    977:             sizeof(SONIC_RECEIVE_DESCRIPTOR) *
                    978:                 Adapter->NumberOfReceiveDescriptors,
                    979:             FALSE,
                    980:             Adapter->ReceiveDescriptorArea,
                    981:             Adapter->ReceiveDescriptorAreaPhysical
                    982:             );
                    983: 
                    984:     }
                    985: 
                    986:     if (Adapter->DescriptorToPacket) {
                    987: 
                    988:         SONIC_FREE_MEMORY(Adapter->DescriptorToPacket,
                    989:             sizeof(SONIC_DESCRIPTOR_TO_PACKET)
                    990:             *Adapter->NumberOfTransmitDescriptors);
                    991: 
                    992:     }
                    993: 
                    994: 
                    995:     if (Adapter->SmallSonicBuffers) {
                    996: 
                    997:         NdisFreeSharedMemory(
                    998:             Adapter->NdisAdapterHandle,
                    999:             SONIC_SMALL_BUFFER_SIZE * SONIC_NUMBER_OF_SMALL_BUFFERS,
                   1000:             TRUE,
                   1001:             Adapter->SmallSonicBuffers,
                   1002:             Adapter->SonicBuffers[0].PhysicalSonicBuffer
                   1003:             );
                   1004: 
                   1005:     }
                   1006: 
                   1007:     if (Adapter->MediumSonicBuffers) {
                   1008: 
                   1009:         NdisFreeSharedMemory(
                   1010:             Adapter->NdisAdapterHandle,
                   1011:             SONIC_MEDIUM_BUFFER_SIZE * SONIC_NUMBER_OF_MEDIUM_BUFFERS,
                   1012:             TRUE,
                   1013:             Adapter->MediumSonicBuffers,
                   1014:             Adapter->SonicBuffers[SONIC_NUMBER_OF_SMALL_BUFFERS].PhysicalSonicBuffer
                   1015:             );
                   1016: 
                   1017:     }
                   1018: 
                   1019:     if (Adapter->SonicBuffers) {
                   1020: 
                   1021:         UINT i;
                   1022: 
                   1023:         //
                   1024:         // First free the large buffers.
                   1025:         //
                   1026: 
                   1027:         for (
                   1028:             i = SONIC_NUMBER_OF_SMALL_BUFFERS +
                   1029:                 SONIC_NUMBER_OF_MEDIUM_BUFFERS;
                   1030:             i < SONIC_NUMBER_OF_SMALL_BUFFERS +
                   1031:                 SONIC_NUMBER_OF_MEDIUM_BUFFERS +
                   1032:                 SONIC_NUMBER_OF_LARGE_BUFFERS;
                   1033:             i++) {
                   1034: 
                   1035:             if (Adapter->SonicBuffers[i].VirtualSonicBuffer) {
                   1036: 
                   1037:                 NdisFreeSharedMemory(
                   1038:                     Adapter->NdisAdapterHandle,
                   1039:                     SONIC_LARGE_BUFFER_SIZE,
                   1040:                     TRUE,
                   1041:                     Adapter->SonicBuffers[i].VirtualSonicBuffer,
                   1042:                     Adapter->SonicBuffers[i].PhysicalSonicBuffer
                   1043:                     );
                   1044: 
                   1045:             } else {
                   1046: 
                   1047:                 break;
                   1048: 
                   1049:             }
                   1050: 
                   1051:         }
                   1052: 
                   1053:         //
                   1054:         // Now free the flush buffers.
                   1055:         //
                   1056: 
                   1057:         for (
                   1058:             i = 0;
                   1059:             i < SONIC_NUMBER_OF_SMALL_BUFFERS +
                   1060:                 SONIC_NUMBER_OF_MEDIUM_BUFFERS +
                   1061:                 SONIC_NUMBER_OF_LARGE_BUFFERS;
                   1062:             i++) {
                   1063: 
                   1064:             if (Adapter->SonicBuffers[i].FlushBuffer) {
                   1065:                 NdisFreeBuffer(Adapter->SonicBuffers[i].FlushBuffer);
                   1066:             }
                   1067: 
                   1068:         }
                   1069: 
                   1070:         SONIC_FREE_MEMORY(Adapter->SonicBuffers,
                   1071:             sizeof(SONIC_BUFFER_DESCRIPTOR)*
                   1072:               (SONIC_NUMBER_OF_SMALL_BUFFERS +
                   1073:                SONIC_NUMBER_OF_MEDIUM_BUFFERS +
                   1074:                SONIC_NUMBER_OF_LARGE_BUFFERS)
                   1075:             );
                   1076: 
                   1077:     }
                   1078: 
                   1079: 
                   1080:     if (Adapter->BlankBuffer) {
                   1081: 
                   1082:         NdisFreeSharedMemory(
                   1083:             Adapter->NdisAdapterHandle,
                   1084:             SONIC_SMALL_BUFFER_SIZE,
                   1085:             TRUE,
                   1086:             Adapter->BlankBuffer,
                   1087:             Adapter->BlankBufferAddress
                   1088:             );
                   1089: 
                   1090:     }
                   1091: 
                   1092: 
                   1093:     if (Adapter->FlushBufferPoolHandle) {
                   1094: 
                   1095:         NdisFreeBufferPool(Adapter->FlushBufferPoolHandle);
                   1096: 
                   1097:     }
                   1098: 
                   1099: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.