Technical information

8-13
Sample Driver
// assign the base address of the completion queue (high 24 bits)
RxCompletionQueue1CtrlValue.RxCompletionQ1BaseAddress =
NdisGetPhysicalAddressLow(RxCompletionQ) >> 8;
// Write the value to the AIC-6915
AIC6915_WRITE_REG(Adapter->RegisterBaseVa->RxCompletionQueue1Ctrl,
RxCompletionQueue1CtrlValue);
// Single completion queue - use default value for RxCompletionQueue2Ctrl
// Initialize Tx and Rx Completion Queue consumer and producer indices to zero
AIC6915_WRITE_REG(Adapter->RegisterBaseVa->CompletionQueue1ConsumerIndex,
0);
AIC6915_WRITE_REG(Adapter->RegisterBaseVa->CompletionQueue1ProducerIndex, 0);
// Use default value for RxCompletionQ2Ptrs
// Use default value for RxDmaCtrl
// Initialize RxDescQueue1Ctrl
// set the threshold based on a registry entry
// NOTE: The following threshold need not be set for polling model.
// It's important only in producer-consumer model.
RxDescQueue1CtrlValue.RxQ1MinDescThreshold = Adapter->RxQ1MinDescThreshold;
// do not allow software to write consumer index
RxDescQueue1CtrlValue.RxQ1ConsumerWe = 0;
// no spacing between descriptors
RxDescQueue1CtrlValue.RxDescSpacing = 0;
// use 32-bit addressing
RxDescQueue1CtrlValue.Rx64bitDescQAddr = 0;
// use a 4 byte descriptor
RxDescQueue1CtrlValue.Rx64bitBufferAddress = 0;
// use a variable size queue
RxDescQueue1CtrlValue.RxVariableSizeQueues = 1;
// use 2K receive buffer descriptors. This entry must be selected even if
// variable size queues are used. In this case, this size is the maximum size
// of the variable-size queue.
RxDescQueue1CtrlValue.RxDescQ1Entries = 1;
// use polling model
RxDescQueue1CtrlValue.RxPrefetchDescriptors = 1;
// set the size of each receive buffer
RxDescQueue1CtrlValue.RxQ1BufferLength = AIC6915_SIZE_OF_RX_BUFFERS;
// Write the value to AIC-6915
AIC6915_WRITE_REG(Adapter->RegisterBaseVa->RxDescQueue1Ctrl,
RxDescQueue1CtrlValue.reg);
// Single buffer queue - use default value for RxDescQueue2Ctrl
// Set up the Receive Buffer Descriptor Queue