Annotation of ntddk/src/network/sonic/alloc.c, revision 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.