*
* See: ~/Sources/bochs/bochs.../iodev/ne2k.cc
*/
-#define DEBUG 0
+#define DEBUG 1
#define VERSION ((0<<8)|50)
#include <acess.h>
#include <modules.h>
int NextRXPage; //!< Next expected RX page
int NextMemPage; //!< Next Card Memory page to use
-
- //Uint8 Buffer[RX_BUF_SIZE*256];
-
+
char Name[2]; // "0"
tVFS_Node Node; //!< VFS Node
Uint8 MacAddr[6]; //!< Cached MAC address
outb( base + ISR, 0xFF );
outb( base + RCR, 0x20 ); // Reciever to Monitor
outb( base + TCR, 0x02 ); // Transmitter OFF (TCR.LB = 1, Internal Loopback)
+
+ // Read MAC Address
outb( base + RBCR0, 6*4 ); // Remote Byte Count
outb( base + RBCR1, 0 );
outb( base + RSAR0, 0 ); // Clear Source Address
outb( base + RSAR1, 0 );
outb( base + CMD, 0x0A ); // Remote Read, Start
-
- // Read MAC Address
gpNe2k_Cards[ k ].MacAddr[0] = inb(base+0x10);// inb(base+0x10);
gpNe2k_Cards[ k ].MacAddr[1] = inb(base+0x10);// inb(base+0x10);
gpNe2k_Cards[ k ].MacAddr[2] = inb(base+0x10);// inb(base+0x10);
outb( base+RCR, 0x0F ); // Set WRAP and allow all packet matches
outb( base+TCR, 0x00 ); // Set Normal Transmitter mode
outb( base+TPSR, 0x40); // Set Transmit Start
- // Set MAC Address
- /*
- Ne2k_WriteReg(base, MAC0, gpNe2k_Cards[ k ].MacAddr[0]);
- Ne2k_WriteReg(base, MAC1, gpNe2k_Cards[ k ].MacAddr[1]);
- Ne2k_WriteReg(base, MAC2, gpNe2k_Cards[ k ].MacAddr[2]);
- Ne2k_WriteReg(base, MAC3, gpNe2k_Cards[ k ].MacAddr[3]);
- Ne2k_WriteReg(base, MAC4, gpNe2k_Cards[ k ].MacAddr[4]);
- Ne2k_WriteReg(base, MAC5, gpNe2k_Cards[ k ].MacAddr[5]);
- */
Log_Log("Ne2k", "Card %i 0x%04x IRQ%i %02x:%02x:%02x:%02x:%02x:%02x",
k, base, gpNe2k_Cards[ k ].IRQ,
ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
+ // TODO: Lock
+
// Sanity Check Length
if(Length > TX_BUF_SIZE*256) {
Log_Warning(
ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
// Wait for packets
- Semaphore_Wait( &Card->Semaphore, 1 );
+ if( Semaphore_Wait( &Card->Semaphore, 1 ) != 1 )
+ {
+ // Error or interrupted
+ LEAVE_RET('i', 0);
+ }
outb(Card->IOBase, 0x22 | (1 << 6)); // Page 6
LOG("CURR : 0x%02x", inb(Card->IOBase + CURR));
LOG("pktHdr->Length (%i) > 256 - 4, allocated buffer %p", pktHdr->Length, buf);
- if(!buf) {
- LEAVE('i', -1);
- return -1;
- }
+ if(!buf) LEAVE_RET('i', -1);
// Copy the already read data
memcpy(buf, data, 256);
{
//if( gpNe2k_Cards[i].NumWaitingPackets > MAX_PACKET_QUEUE )
// gpNe2k_Cards[i].NumWaitingPackets = MAX_PACKET_QUEUE;
- Semaphore_Signal( &gpNe2k_Cards[i].Semaphore, 1 );
+ if( Semaphore_Signal( &gpNe2k_Cards[i].Semaphore, 1 ) != 1 ) {
+ // Oops?
+ }
}
// 1: Packet sent (no error)
// 2: Recieved with error