/////////////////////////////////////////////////////////////////////// // // Tx buffer operations // internal void PopulateTsmtBuffer(PacketFifo fromUser) { DebugStub.Assert(this.ioRunning); // since no transmit interrupts are sent, we must check for // transmission events here if (txRingBuffer.NewTransmitEvent()) { NicEventType ev = NicEventType.TransmitEvent; if (eventRelay != null) { eventRelay.ForwardEvent(ev); } } using (txRingBuffer.thisLock.Lock()) { while (fromUser.Count > 0) { Packet packet = fromUser.Pop(); txRingBuffer.LockedPushTsmtBuffer(packet); } // update hardware tail pointer // so that hardware knows it has new packets to transmit Write32(Register.TSMT_DESC_TAIL, txRingBuffer.Head); // sw head is hw tail } }
private bool HandleInterrupts(uint intrCause) { if (intrCause == 0) { //TODO: return false; } //DebugPrint("HandleInterrupts ???\n"); NicEventType ev = NicEventType.NoEvent; if ((intrCause & InterruptMasks.LSC) != 0) { DebugPrint("Link Status Change\n"); ev |= NicEventType.LinkEvent; } if ((intrCause & InterruptMasks.RXSEQ) != 0) { DebugPrint("Sequence Error\n"); ev |= NicEventType.LinkEvent; } if (((InterruptMasks.RXT0 | InterruptMasks.RXO | InterruptMasks.RXDMT0) & intrCause) != 0) { ev |= NicEventType.ReceiveEvent; } // no transmit interupts are set, check rxbuffer to see // if any packets have been sent since last time if (txRingBuffer.NewTransmitEvent()) { ev |= NicEventType.TransmitEvent; } // TODO: not necessary if (rxRingBuffer.NewReceiveEvent()) { ev |= NicEventType.ReceiveEvent; } if (ev == NicEventType.NoEvent) { // DebugPrint("HandleInterrupt: no event\n"); return(false); } if (eventRelay != null) { eventRelay.ForwardEvent(ev); } else { DebugPrint("event relay is NULL!\n"); } return(true); }
internal void ForwardEvent(NicEventType theEvent) { // DebugStub.Print("EventRelay:ForwardEvent\n"); if (channelClosed) { DebugStub.Print("unexpectedly closed\n"); return; } NicDeviceEventContract /*.Exp*/ exp = (NicDeviceEventContract)channel.Acquire(); try { exp.NicDeviceEvent(theEvent); } finally { channel.Release(exp); } }
public void NicDeviceEvent(NicEventType eventType) { if ((eventType & NicEventType.ReceiveEvent) != 0) { DeMuxReceivedPackets(); } else { if ((eventType & NicEventType.TransmitEvent) != 0) { this.muxEvent.Set(); //DebugStub.Print("Received transmit event\n"); } if ((eventType & NicEventType.LinkEvent) != 0) { //DebugStub.Print("UNHANDLED link event!...acking anyway\n"); } } }