Adaptec 1737100 Programmer Manual - Page 175

Receive Interrupt Handling

Page 175 highlights

Sample Driver Receive Interrupt Handling When a packet is received, the AIC-6915 adds a new entry to the Receive Completion Descriptor Queue and generates either an EARLYRXQ1INT (or EARLYRXQ2INT) or an RXQ1DONEINT (or RXQ2DONEINT), depending on which receive interrupts have been enabled. When the driver processes this interrupt, it must first read the Receive Completion Queue consumer and producer indices. For a single completion queue implementation, these indices are contained in registers COMPLETIONQUEUE1CONSUMERINDEX and COMPLETIONQUEUE1PRODUCERINDEX. The consumer index points to the next Receive Completion Descriptor which has not yet been processed by the driver. In this Receive Completion Descriptor, the ENDINDEX field is an index to the Receive Buffer Descriptor which contains the packet just received. The driver uses this index to extract the Receive Buffer containing the packet just received. The packet length and receive status are also contained in the Completion Descriptor. Example: // Windows NT example // Receive Interrupt Handling Pseudocode // This example is for the polling model // Illustrates the use of a single Receive Completion Queue and Receive Buffer // Queue // Process the receive interrupt // Read the Completion Queue pointer registers AIC6915_READ_REG(Adapter->RegisterBaseVa->CompletionQueue1ProducerIndex, &CompletionQueue1ProducerValue); AIC6915_READ_REG(Adapter->RegisterBaseVa->CompletionQueue1ConsumerIndex, &CompletionQueue1ConsumerValue); // Get the Receive Completion Queue producer and consumer index fields RxComQProducerIndex = CompletionQueue1ProducerValue.RxCompletionQ1ProducerIndex; RxComQConsumerIndex = CompletionQueue1ConsumerValue.RxCompletionQ1ConsumerIndex; // We got a receive interrupt. Process all Completion Queue entries until // we're caught up. while (RxComQConsumerIndex != RxComQProducerIndex ) { // Get the completion descriptor pointed to by the current consumer index RxCompletionDesc = Adapter->RxCompletionDesc[RxComQConsumerIndex]; // Get the buffer descriptor index RxDescIndex = RxCompletionDesc->EndIndex; // Get the receive status and packet length RxStatus = (USHORT)RxCompletionDesc->Status1; Length = (USHORT)RxCompletionDesc->Length; // Using the EndIndex in the completion descriptor, get the current // receive buffer 8-15

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190

8-15
Sample Driver
Receive Interrupt Handling
When a packet is received, the AIC-6915 adds a new entry to the Receive Completion
Descriptor Queue and generates either an
E
ARLY
R
X
Q1I
NT
(or
E
ARLY
R
X
Q2I
NT
) or an
R
X
Q1D
ONE
I
NT
(or
R
X
Q2D
ONE
I
NT
), depending on which receive interrupts have been
enabled.
When the driver processes this interrupt, it must first read the Receive
Completion Queue consumer and producer indices.
For a single completion queue
implementation, these indices are contained in registers
C
OMPLETION
Q
UEUE
1C
ONSUMER
I
NDEX
and
C
OMPLETION
Q
UEUE
1P
RODUCER
I
NDEX
.
The
consumer index points to the next Receive Completion Descriptor which has not yet been
processed by the driver.
In this Receive Completion Descriptor, the
E
ND
I
NDEX
field is an
index to the Receive Buffer Descriptor which contains the packet just received.
The driver
uses this index to extract the Receive Buffer containing the packet just received.
The
packet length and receive status are also contained in the Completion Descriptor.
Example:
// Windows NT example
// Receive Interrupt Handling Pseudocode
// This example is for the polling model
// Illustrates the use of a single Receive Completion Queue and Receive Buffer
// Queue
// Process the receive interrupt
// Read the Completion Queue pointer registers
AIC6915_READ_REG(Adapter->RegisterBaseVa->CompletionQueue1ProducerIndex,
&CompletionQueue1ProducerValue);
AIC6915_READ_REG(Adapter->RegisterBaseVa->CompletionQueue1ConsumerIndex,
&CompletionQueue1ConsumerValue);
// Get the Receive Completion Queue producer and consumer index fields
RxComQProducerIndex =
CompletionQueue1ProducerValue.RxCompletionQ1ProducerIndex;
RxComQConsumerIndex =
CompletionQueue1ConsumerValue.RxCompletionQ1ConsumerIndex;
// We got a receive interrupt.
Process all Completion Queue entries until
// we’re caught up.
while (RxComQConsumerIndex != RxComQProducerIndex )
{
// Get the completion descriptor pointed to by the current consumer index
RxCompletionDesc = Adapter->RxCompletionDesc[RxComQConsumerIndex];
// Get the buffer descriptor index
RxDescIndex = RxCompletionDesc->EndIndex;
// Get the receive status and packet length
RxStatus
= (USHORT)RxCompletionDesc->Status1;
Length
= (USHORT)RxCompletionDesc->Length;
// Using the EndIndex in the completion descriptor, get the current
// receive buffer