*
* 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
int Ne2k_Install(char **Options)
{
int i, j, k;
- int count, id, base;
+ int count, base;
+ tPCIDev id;
// --- Scan PCI Bus ---
// Count Cards
giNe2k_CardCount = 0;
for( i = 0; i < NUM_COMPAT_DEVICES; i ++ )
{
- giNe2k_CardCount += PCI_CountDevices( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device, 0 );
+ giNe2k_CardCount += PCI_CountDevices( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device );
}
if( giNe2k_CardCount == 0 ) {
for( i = 0; i < NUM_COMPAT_DEVICES; i ++ )
{
- count = PCI_CountDevices( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device, 0 );
+ count = PCI_CountDevices( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device );
for( j = 0; j < count; j ++,k ++ )
{
- id = PCI_GetDevice( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device, 0, j );
+ id = PCI_GetDevice( csaCOMPAT_DEVICES[i].Vendor, csaCOMPAT_DEVICES[i].Device, j );
// Create Structure
- base = PCI_AssignPort( id, 0, 0x20 );
+ base = PCI_GetBAR( id, 0 );
gpNe2k_Cards[ k ].IOBase = base;
gpNe2k_Cards[ k ].IRQ = PCI_GetIRQ( id );
gpNe2k_Cards[ k ].NextMemPage = 64;
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