void C_DM9000::EDeviceRegisterIoSpace(void) { NIC_DEVICE_OBJECT::EDeviceRegisterIoSpace(); U32 val; val = DeviceReadPort(0x2a); val |= DeviceReadPort(0x2b)<<8; val |= DeviceReadPort(0x28)<<16; val |= DeviceReadPort(0x29)<<24; DEBUG_PRINT(( TEXT("[dm9: Chip signature is %08X\r\n"), val )); RETAILMSG(1, (TEXT("[dm9: Chip signature is %08X\r\n"), val)); if( (DeviceReadPort(DM9_VIDL) != LOW_BYTE(DM9000_VID)) || (DeviceReadPort(DM9_VIDH) != HIGH_BYTE(DM9000_VID)) || (DeviceReadPort(DM9_PIDL) != LOW_BYTE(DM9000_PID)) || (DeviceReadPort(DM9_PIDH) != HIGH_BYTE(DM9000_PID)) ) THROW((ERR_STRING("Unknown device"))); }
void NIC_DRIVER_OBJECT::EDriverInitialize( OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediaIndex, IN PNDIS_MEDIUM MediaArray, IN UINT MediaArraySize) { m_uRecentInterruptStatus = 0; if(!m_pLower) m_pLower = DeviceEntry(this,NULL); if(!m_pLower) THROW((ERR_STRING("Error in creating device"))); UINT i; NDIS_STATUS status; NDIS_HANDLE hconfig; // Determinate media type for(i=0; i<MediaArraySize; i++) if(MediaArray[i] == NdisMedium802_3) break; if (i == MediaArraySize) THROW((ERR_STRING("Unsupported media"),NDIS_STATUS_UNSUPPORTED_MEDIA)); *SelectedMediaIndex = i; // Read registry configurations NdisOpenConfiguration( &status, &hconfig, m_NdisWrapper); if(status != NDIS_STATUS_SUCCESS) THROW((ERR_STRING("Error in opening configuration"),status)); C_Exception *pexp; TRY { m_pLower->DeviceSetDefaultSettings(); m_pLower->DeviceSetEepromFormat(); m_pLower->DeviceRetriveConfigurations(hconfig); m_pLower->EDeviceValidateConfigurations(); FI; } CATCH(pexp) { pexp->PrintErrorMessage(); CLEAN(pexp); NdisCloseConfiguration(hconfig); THROW((ERR_STRING("*** Error in retriving configurations.\n"))); } NdisCloseConfiguration(hconfig); m_pLower->DeviceRegisterAdapter(); /* init tx buffers */ U32 m,uaddr; if(!(uaddr = (U32)malloc(sizeof(DATA_BLOCK)* (m=m_pLower->m_szConfigures[CID_TXBUFFER_NUMBER]*2)))) THROW((ERR_STRING("Insufficient memory"))); for(;m--;uaddr+=sizeof(DATA_BLOCK)) m_TQueue.Enqueue((PCQUEUE_GEN_HEADER)uaddr); TRY { m_pLower->EDeviceRegisterIoSpace(); m_pLower->EDeviceLoadEeprom(); m_pLower->EDeviceInitialize(m_pLower->m_nResetCounts=0); m_pLower->EDeviceRegisterInterrupt(); FI; } CATCH(pexp) { pexp->PrintErrorMessage(); CLEAN(pexp); THROW((ERR_STRING("Device error"))); } m_pLower->DeviceOnSetupFilter(0); }
void C_DM9000::EDeviceInitialize( int nResetCounts) { U32 val; // reset member varialbes m_uLastAddressPort = (U32)-1; DeviceWritePort(0x1f, 0x00); NdisStallExecution(20); // software reset the device DeviceWritePort(DM9_NCR, 0x03); NdisStallExecution(20); DeviceWritePort(DM9_NCR, 0x03); NdisStallExecution(20); //DeviceWritePort(DM9_NCR, 0x00); // read the io orgnization // ISR<7:6> == x1, dword // ISR<7:6> == 0x, word // ISR<7:6> == 10, byte mode val = DeviceReadPort(DM9_ISR); if(val & MAKE_MASK(6)) { m_nIoMode = DWORD_MODE; m_nIoMaxPad = 3; } else if(!(val & MAKE_MASK(7))) { m_nIoMode = WORD_MODE; m_nIoMaxPad = 1; } else { m_nIoMode = BYTE_MODE; m_nIoMaxPad = 0; } // activate internal phy // select GPIO 0<0>, set it to output DeviceWritePort(DM9_GPCR, (1<<0)); // output zero to activate internal phy DeviceWritePort(DM9_GPR, 0x00); // clear TX status DeviceWritePort(DM9_NSR, 0x00); // Enable memory chain DeviceWritePort(DM9_IMR, (1<<7)); #ifdef IMPL_STORE_AND_INDICATION if(nResetCounts) return; /* init rx buffers */ U32 m,uaddr; if(!(uaddr = (U32)malloc(sizeof(DATA_BLOCK)* (m=m_szConfigures[CID_RXBUFFER_NUMBER]*2)))) THROW((ERR_STRING("Insufficient memory"))); for(;m--;uaddr+=sizeof(DATA_BLOCK)) m_RQueue.Enqueue((PCQUEUE_GEN_HEADER)uaddr); /* set indication timer */ DeviceInitializeTimer(); #endif // v3.2.9 m_nMaxTxPending = (DeviceReadPort(DM9_CHIPREV) >= 0x10)?2:1; m_nTxPendings = 0; }