Ejemplo n.º 1
0
        ///////////////////////////////////////////////////////////////////////
        //
        // 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
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
 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");
         }
     }
 }