//common case, except Win2K
static void DebugPrint(const char *fmt, ...)
{
	va_list list;
	va_start(list, fmt);
	PrintProcedure(DPFLTR_DEFAULT_ID, 9 | DPFLTR_MASK, fmt, list);
#if defined(VIRTIO_DBG_USE_IOPORT)
	{
		NTSTATUS status;
		// use this way of output only for DISPATCH_LEVEL,
		// higher requires more protection
		if (KeGetCurrentIrql() <= DISPATCH_LEVEL)
		{
			char buf[256];
			size_t len, i;
			buf[0] = 0;
			status = RtlStringCbVPrintfA(buf, sizeof(buf), fmt, list);
			if (status == STATUS_SUCCESS) len = strlen(buf);
			else if (status == STATUS_BUFFER_OVERFLOW) len = sizeof(buf);
			else { memcpy(buf, "Can't print", 11); len = 11; }
			NdisAcquireSpinLock(&CrashLock);
			for (i = 0; i < len; ++i)
			{
				NdisRawWritePortUchar(VIRTIO_DBG_USE_IOPORT, buf[i]);
			}
			NdisRawWritePortUchar(VIRTIO_DBG_USE_IOPORT, '\n');
			NdisReleaseSpinLock(&CrashLock);
		}
	}
#endif
}
Exemple #2
0
BOOLEAN
LtInitGetAddressSetPoll(
	IN 	PLT_ADAPTER Adapter,
	IN	UCHAR		SuggestedNodeId
	)
/*++

Routine Description:

	This gets the node id from the card (starts it off actually) and
	sets the card to be in polling mode.

Arguments:

	Adapter			: 	Pointer to the adapter structure
	SuggestedNodeId	:	Pram node id or 0

Return Value:

	TRUE			:	if success, FALSE otherwise

--*/
{
	ULONG Seed, Random;

	DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_INFO,
			("LtGetAddress: Getting a node address for lt adapter...\n"));

	if (SuggestedNodeId == 0)
	{
		Seed 	= (ULONG)Adapter;
		Random 	= RtlRandom(&Seed);
		SuggestedNodeId =
			(UCHAR)((Random % LT_MAX_CLIENT_NODE_ID) + LT_MIN_SERVER_NODE_ID);
	}

	DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_INFO,
			("LtGetAddress: Suggested Node Id = %lx\n", SuggestedNodeId));

	// Command Length LSB
	NdisRawWritePortUchar(XFER_PORT, 2);

	// Command Length MSB
	NdisRawWritePortUchar(XFER_PORT, 0);  				

	NdisRawWritePortUchar(XFER_PORT, (UCHAR)LT_CMD_LAP_INIT);

	NdisRawWritePortUchar(XFER_PORT, SuggestedNodeId);	  				

	// 	Use 0xFF for the interrupt if this card is to be polled.
	//	We *ONLY* support polling.
	NdisRawWritePortUchar(XFER_PORT, LT_ADAPTER_POLLED_MODE);

	return TRUE;
}
Exemple #3
0
void cf_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
{
	_irqL irqL;
	uint	res;
	struct _SyncContext synccontext;
	struct intf_priv *pintfpriv = pintfhdl->pintfpriv;	
	//u8 *rwmem = pintfpriv->io_rwmem;
	struct dvobj_priv * pcfiodev = (struct dvobj_priv * )(pintfpriv->intf_dev);
	u32 iobase_addr = pcfiodev->io_base_address;

	// Please remember, you just can't only use lock/unlock to 
	// protect the rw functions...
	// since, i/o is quite common in call-back and isr routines...
	_func_enter_;
	_enter_hwio_critical(&pintfpriv->rwlock, &irqL);	

#ifdef PLATFORM_WINDOWS

      if( addr >= RTL8711_HCICTRL_ && addr <= (RTL8711_HCICTRL_+0x1FFFF) )
      {  //the address is in HCI local register 
      
          addr = (addr&0x00003FFF);
	   NdisRawWritePortUchar((u32)(iobase_addr+addr), val);

		  
       }else{    
       
          synccontext.pintfpriv = pintfpriv;
          synccontext.lbusaddr = addr;
	   synccontext.bytecnt = 1; // 1-byte    
	   synccontext.pdata=(u8 *)&val;		
       
	   //NdisMoveMemory(rwmem ,&val, pintfpriv->len);
	
          irqL = KeGetCurrentIrql();	   

          if ( irqL <= DISPATCH_LEVEL )
		res = NdisMSynchronizeWithInterrupt(&pcfiodev->interrupt, cfbus_write, (void *)&synccontext);				
	   else//IRQL > DISPATCH_LEVEL
	       res = cfbus_write((void *)&synccontext);

       }

#endif	
	
       _exit_hwio_critical(&pintfpriv->rwlock, &irqL);
	_func_exit_;

}
Exemple #4
0
void
PlatformDisableHostL0s(struct net_device *dev)
{
	struct r8192_priv 	*priv = (struct r8192_priv *)rtllib_priv(dev);
	u32				PciCfgAddrPort=0;
	u8				Num4Bytes;
	u8				uPciBridgeASPMSetting = 0;

	
	if( (priv->NdisAdapter.BusNumber == 0xff && 
		priv->NdisAdapter.DevNumber == 0xff && 
		priv->NdisAdapter.FuncNumber == 0xff) ||
		(priv->NdisAdapter.PciBridgeBusNum == 0xff && 
		priv->NdisAdapter.PciBridgeDevNum == 0xff && 
		priv->NdisAdapter.PciBridgeFuncNum == 0xff) )
	{
		printk("PlatformDisableHostL0s(): Fail to enable ASPM. "
		"Cannot find the Bus of PCI(Bridge).\n");
		return;
	}
	
	PciCfgAddrPort= (priv->NdisAdapter.PciBridgeBusNum << 16)|
			(priv->NdisAdapter.PciBridgeDevNum<< 11)|
			(priv->NdisAdapter.PciBridgeFuncNum <<  8)|(1 << 31);
	Num4Bytes = (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10)/4;


	NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));

	NdisRawReadPortUchar(PCI_CONF_DATA, &uPciBridgeASPMSetting);

	if(uPciBridgeASPMSetting & BIT0)
		uPciBridgeASPMSetting &=  ~(BIT0);

	NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
	NdisRawWritePortUchar(PCI_CONF_DATA, uPciBridgeASPMSetting);

	udelay(50);

	printk("PlatformDisableHostL0s():PciBridge BusNumber[%x], "
		"DevNumbe[%x], FuncNumber[%x], Write reg[%x] = %x\n",
		priv->NdisAdapter.PciBridgeBusNum, 
		priv->NdisAdapter.PciBridgeDevNum, 
		priv->NdisAdapter.PciBridgeFuncNum, 
		(priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10), 
		(priv->NdisAdapter.PciBridgeLinkCtrlReg | 
		(priv->RegDevicePciASPMSetting&~BIT0)));
}
Exemple #5
0
U32	C_DM9000::DeviceWritePort(
	U32		uPort,
	U32		uValue)
{

	ENTER_CRITICAL_SECTION

	VALIDATE_ADDR_PORT(uPort);

	NdisRawWritePortUchar(
		m_szCurrentSettings[SID_PORT_BASE_ADDRESS] + DM9000_DATA_OFFSET, 
		(U8)uValue);

	LEAVE_CRITICAL_SECTION
	
	return uValue;
}
Exemple #6
0
void PlatformEnableASPM(struct net_device *dev)
{
	struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
	PRT_POWER_SAVE_CONTROL pPSC = 
		(PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
	u16	ASPMLevel = 0;
	u32	PciCfgAddrPort=0;
	u8	Num4Bytes;
	u8	uPciBridgeASPMSetting = 0;
	u8	uDeviceASPMSetting = 0;

	if( (priv->NdisAdapter.BusNumber == 0xff && 
		priv->NdisAdapter.DevNumber == 0xff && 
		priv->NdisAdapter.FuncNumber == 0xff) || 
		(priv->NdisAdapter.PciBridgeBusNum == 0xff && 
		priv->NdisAdapter.PciBridgeDevNum == 0xff && 
		priv->NdisAdapter.PciBridgeFuncNum == 0xff) ) {
		RT_TRACE(COMP_INIT, "PlatformEnableASPM(): Fail to enable ASPM."
				" Cannot find the Bus of PCI(Bridge).\n");
		return;
	}

#ifdef RTL8192SE
	if(priv->NdisAdapter.PciBridgeVendor != PCI_BRIDGE_VENDOR_INTEL) {
		RT_TRACE(COMP_POWER, "%s(): Dont modify ASPM for non intel "
				"chipset. For Bridge Vendor %d.\n"
				,__func__,priv->NdisAdapter.PciBridgeVendor);
		return;
	}
#endif

#ifdef RTL8192CE
	PciCfgAddrPort= (priv->NdisAdapter.PciBridgeBusNum << 16)|
			(priv->NdisAdapter.PciBridgeDevNum<< 11) |
			(priv->NdisAdapter.PciBridgeFuncNum <<  8)|(1 << 31);
	Num4Bytes = (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10)/4;
	NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
	uPciBridgeASPMSetting = priv->NdisAdapter.PciBridgeLinkCtrlReg |
			priv->RegHostPciASPMSetting;
	
	if(priv->NdisAdapter.PciBridgeVendor == PCI_BRIDGE_VENDOR_INTEL)
		uPciBridgeASPMSetting &=  ~ BIT0;

	NdisRawWritePortUchar(PCI_CONF_DATA, uPciBridgeASPMSetting);
	RT_TRACE(COMP_INIT, "PlatformEnableASPM():PciBridge BusNumber[%x], "
		"DevNumbe[%x], FuncNumber[%x], Write reg[%x] = %x\n",
		priv->NdisAdapter.PciBridgeBusNum, 
		priv->NdisAdapter.PciBridgeDevNum, 
		priv->NdisAdapter.PciBridgeFuncNum, 
		(priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10), 
		uPciBridgeASPMSetting);

	udelay(50);
#endif

	ASPMLevel |= priv->RegDevicePciASPMSetting;
	uDeviceASPMSetting = priv->NdisAdapter.LinkCtrlReg;


#ifdef RTL8192SE
	if(priv->CustomerID == RT_CID_TOSHIBA && 
		priv->NdisAdapter.PciBridgeVendor == PCI_BRIDGE_VENDOR_AMD) {
		if(priv->NdisAdapter.LinkCtrlReg & BIT1)
			uDeviceASPMSetting |= BIT0;
		else 
			uDeviceASPMSetting |= ASPMLevel;			
	}
	else
#endif
		uDeviceASPMSetting |= ASPMLevel;
	
	PlatformSwitchDevicePciASPM(dev, uDeviceASPMSetting);

	if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_CLK_REQ) {
		PlatformSwitchClkReq(dev,(pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_CLK_REQ) ? 1 : 0);
		RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_CLK_REQ);
	}
	udelay(100);

#ifdef RTL8192SE
	PciCfgAddrPort= (priv->NdisAdapter.PciBridgeBusNum << 16)|
			(priv->NdisAdapter.PciBridgeDevNum<< 11)|
			(priv->NdisAdapter.PciBridgeFuncNum <<  8)|(1 << 31);
	Num4Bytes = (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10)/4;
	NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));

	uPciBridgeASPMSetting = priv->NdisAdapter.PciBridgeLinkCtrlReg |
			priv->RegHostPciASPMSetting;
	
	if(priv->CustomerID == RT_CID_TOSHIBA && 
		priv->NdisAdapter.PciBridgeVendor == PCI_BRIDGE_VENDOR_AMD 
		&& pPSC->RegAMDPciASPM) {
		if(priv->NdisAdapter.PciBridgeLinkCtrlReg & BIT1)
			uPciBridgeASPMSetting |= BIT0;
	} else if(priv->NdisAdapter.PciBridgeVendor == PCI_BRIDGE_VENDOR_INTEL ) {
		uPciBridgeASPMSetting &=  ~ BIT0;
	}

	NdisRawWritePortUchar(PCI_CONF_DATA, uPciBridgeASPMSetting);
	RT_TRACE(COMP_INIT, "%s:PciBridge BusNumber[%x], DevNumbe[%x], "
		"FuncNumber[%x], Write reg[%x] = %x\n",__func__,
		priv->NdisAdapter.PciBridgeBusNum, 
		priv->NdisAdapter.PciBridgeDevNum, 
		priv->NdisAdapter.PciBridgeFuncNum, 
		(priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10), 
		uPciBridgeASPMSetting);
#endif

	udelay(100);
}
Exemple #7
0
void PlatformDisableASPM(struct net_device *dev)
{
	struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
	PRT_POWER_SAVE_CONTROL	pPSC = 
		(PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
	u32	PciCfgAddrPort=0;
	u8	Num4Bytes;
	u8	LinkCtrlReg;
	u16	PciBridgeLinkCtrlReg, ASPMLevel=0;

	if( (priv->NdisAdapter.BusNumber == 0xff && 
		priv->NdisAdapter.DevNumber == 0xff && 
		priv->NdisAdapter.FuncNumber == 0xff) ||
		(priv->NdisAdapter.PciBridgeBusNum == 0xff && 
		priv->NdisAdapter.PciBridgeDevNum == 0xff && 
		priv->NdisAdapter.PciBridgeFuncNum == 0xff) ) {
		RT_TRACE(COMP_INIT, "PlatformEnableASPM(): Fail to enable ASPM."
				" Cannot find the Bus of PCI(Bridge).\n");
		return;
	}

#ifdef RTL8192SE
	if(priv->NdisAdapter.PciBridgeVendor != PCI_BRIDGE_VENDOR_INTEL) {
		RT_TRACE(COMP_POWER, "%s(): Dont modify ASPM for non intel "
				"chipset. For Bridge Vendor %d.\n"
				,__func__,priv->NdisAdapter.PciBridgeVendor);
		return;
	}
#endif

#ifdef RTL8192CE
	if(pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_CLK_REQ) {
		RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_CLK_REQ);
		PlatformSwitchClkReq(dev, 0x0);
	}	

	{
		u8	tmpU1b;	
		pci_read_config_byte(priv->pdev, 0x80, &tmpU1b);		
	}
#endif

	LinkCtrlReg = priv->NdisAdapter.LinkCtrlReg;
	PciBridgeLinkCtrlReg = priv->NdisAdapter.PciBridgeLinkCtrlReg;

	ASPMLevel |= BIT0|BIT1;
	LinkCtrlReg &=~ASPMLevel;
	PciBridgeLinkCtrlReg &=~(BIT0|BIT1);

#ifdef RTL8192CE
	PlatformSwitchDevicePciASPM(dev, LinkCtrlReg);
	udelay( 50);
#endif

	PciCfgAddrPort= (priv->NdisAdapter.PciBridgeBusNum << 16)|
			(priv->NdisAdapter.PciBridgeDevNum<< 11)|
			(priv->NdisAdapter.PciBridgeFuncNum <<  8)|(1 << 31);
	Num4Bytes = (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10)/4;
	NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
	NdisRawWritePortUchar(PCI_CONF_DATA, PciBridgeLinkCtrlReg);	
	RT_TRACE(COMP_POWER, "%s:PciBridge BusNumber[%x], "
			"DevNumbe[%x], FuncNumber[%x], Write reg[%x] = %x\n", __func__,
			priv->NdisAdapter.PciBridgeBusNum, 
			priv->NdisAdapter.PciBridgeDevNum, 
			priv->NdisAdapter.PciBridgeFuncNum, 
			(priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10), 
			PciBridgeLinkCtrlReg);
	udelay(50);

#ifdef RTL8192SE
	PlatformSwitchDevicePciASPM(dev, LinkCtrlReg);
	PlatformSwitchClkReq(dev, 0x0);
	if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_CLK_REQ)
		RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_CLK_REQ);
	udelay(100);
#endif

}
Exemple #8
0
BOOLEAN
LanceHardwareDetails(
    IN PLANCE_ADAPTER Adapter
    )

/*++

Routine Description:

    This routine gets the network address from the hardware.

Arguments:

    Adapter - Where to store the network address.

Return Value:

    TRUE - if successful.

--*/

{
    UCHAR Signature[] = { 0xff, 0x00, 0x55, 0xaa, 0xff, 0x00, 0x55, 0xaa};
    UCHAR BytesRead[8];

    UINT ReadCount;

    UINT Place;

    //
    // Reset E-PROM state
    //
    // To do this we first read from the E-PROM address until the
    // specific signature is reached (then the next bytes read from
    // the E-PROM address will be the ethernet address of the card).
    //



    //
    // Read first part of the signature
    //

    for (Place=0; Place < 8; Place++){

        NdisRawReadPortUchar((ULONG)(Adapter->NetworkHardwareAddress),
                             &(BytesRead[Place]));

    }

    ReadCount = 8;

    //
    // This advances to the front of the circular buffer.
    //

    while (ReadCount < 40) {

        //
        // Check if we have read the signature.
        //

        for (Place = 0; Place < 8; Place++){

            if (BytesRead[Place] != Signature[Place]){

                Place = 10;
                break;

            }

        }

        //
        // If we have read the signature, stop.
        //

        if (Place != 10){

            break;

        }

        //
        // else, move all the bytes down one and read then
        // next byte.
        //

        for (Place = 0; Place < 7; Place++){

            BytesRead[Place] = BytesRead[Place+1];

        }

        NdisRawReadPortUchar((ULONG)(Adapter->NetworkHardwareAddress),
                             &(BytesRead[7]));

        ReadCount++;
    }


    if (ReadCount == 40){

        return(FALSE);

    }


    //
    // Now read the ethernet address of the card.
    //


    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[0])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[1])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[2])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[3])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[4])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(Adapter->NetworkAddress[5])
                      );



    if (!(Adapter->LanceCard & (LANCE_DE201 | LANCE_DE422))) {

        if (Adapter->LanceCard == LANCE_DEPCA){

            //
            // Reset Lan Interface port.
            //

            NdisRawWritePortUchar(
                               (ULONG)(LANCE_DEPCA_LAN_CFG_OFFSET +
                                       Adapter->Nicsr),
                               0x00);

            //
            // Reset Network Interface Control Status Register
            //

            NdisRawWritePortUshort((ULONG)(Adapter->Nicsr), 0x00);
        }

        return(TRUE);

    }




    //
    // Now do the EPROM Hardware check as outlined in the tech ref.
    //


    //
    // Check for NULL address.
    //

    for (Place = 0; Place < 6; Place++) {

        if (Adapter->NetworkAddress[Place] != 0) {

            Place = 10;
            break;

        }

    }

    if (Place != 10) {

        return(FALSE);

    }



    //
    // Check that bit 0 is not a 1
    //

    if (Adapter->NetworkAddress[0] & 0x1) {

        return(FALSE);

    }





    //
    // Check that octet[0]->octet[7] == octet[15]->octet[8]
    //

    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[6])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[7])
                      );

    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[0])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[1])
                      );

    if ((BytesRead[7] != BytesRead[0]) ||
        (BytesRead[6] != BytesRead[1])) {

        return(FALSE);

    }


    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[5])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[4])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[3])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[2])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[1])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[0])
                      );

    for (Place = 0; Place < 6; Place++) {

        if (BytesRead[Place] != (UCHAR)(Adapter->NetworkAddress[Place])) {

            return(FALSE);

        }

    }


    //
    // Check that octet[0]->octet[8] == octet[16]->octet[23]
    //

    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[0])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[1])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[2])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[3])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[4])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[5])
                      );

    for (Place = 0; Place < 6; Place++) {

        if (BytesRead[Place] != (UCHAR)(Adapter->NetworkAddress[Place])) {

            return(FALSE);

        }

    }


    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[0])
                      );
    NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[1])
                      );

    if ((BytesRead[6] != BytesRead[0]) ||
        (BytesRead[7] != BytesRead[1])) {

        return(FALSE);

    }

    //
    // Check that octet[24] -> octet[31] == signature bytes
    //


    for (Place = 0; Place < 8; Place++){


        NdisRawReadPortUchar(
                      (ULONG)(Adapter->NetworkHardwareAddress),
                      &(BytesRead[Place])
                      );

        if (BytesRead[Place] != Signature[Place]){

#if DBG
            DbgPrint("Lance: Hardware failure\n");
#endif
            return(FALSE);

        }

    }

    if (Adapter->LanceCard == LANCE_DEPCA){

        //
        // Reset Lan Interface port.
        //

        NdisRawWritePortUchar(
                           (ULONG)(LANCE_DEPCA_LAN_CFG_OFFSET +
                                   Adapter->Nicsr),
                           0x00);

        //
        // Reset Network Interface Control Status Register
        //

        NdisRawWritePortUshort((ULONG)(Adapter->Nicsr), 0x00);
    }

    if (Adapter->LanceCard & (LANCE_DE201 | LANCE_DE422)) {

        //
        // Reset Network Interface Control Status Register
        //

        NdisRawWritePortUshort((ULONG)(Adapter->Nicsr), 0x00);

    }

    return(TRUE);

}
Exemple #9
0
BOOLEAN
LtFirmInitialize(
	IN	PLT_ADAPTER Adapter,
	IN	UCHAR		SuggestedNodeId
	)
/*++

Routine Description:

	This routine initializes the card, downloads the firmware to it.

Arguments:

	Adapter		:	Pointer to the adapter structure.

Return Value:

	TRUE		:	If successful, false otherwise

--*/
{
	PUCHAR 	Firmware;
	UINT 	FirmwareLen;
	UINT 	RetryCount;
	UCHAR 	Data;
	BOOLEAN	Result = FALSE;

	// Clear the request Latch
	NdisRawReadPortUchar(XFER_PORT, &Data);

	// Clear the TX_READY FLOP
	NdisRawWritePortUchar(XFER_PORT, (UCHAR)0);

	// Reset the card.
	NdisRawWritePortUchar(RESET_PORT, (UCHAR)0);

	NdisStallExecution(LT_FIRM_INIT_STALL_TIME*5);

	for (RetryCount = 0; RetryCount < MAX_READ_RETRY_COUNT; RetryCount++)
	{
		// Get Card Status.
		NdisRawReadPortUchar(SC_PORT, &Data);

		if (Data & TX_READY)
		{
			break;
		}
		else DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_WARN,
					("LtFirmInitialize: Waiting for card ready SC_PORT %x\n", Data));

		NdisStallExecution(LT_FIRM_INIT_STALL_TIME);
	}

	//	BUGBUG:
	//	!!!!!!
	//	For DAYNA, it will not be ready at this point. DCH is going to
	//	send information to fix this.

	do
	{
		if (RetryCount == MAX_READ_RETRY_COUNT)
		{
			LOGERROR(
				Adapter->NdisAdapterHandle,
				NDIS_ERROR_CODE_HARDWARE_FAILURE);

			DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_FATAL,
					("LtFirmInitialize: Card Not Ready after Reset\n"));
			break;
		}

		//	Copy the firmware to the card.
		Firmware 	= LtMicroCode;
		FirmwareLen = sizeof(LtMicroCode);

		DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_INFO,
				("LtFirmInitialize: DownLoad %d bytes of firmware\n", FirmwareLen));

		// Well... the card is alive and well and in a reset state.
		// Next we need to output the first byte of the firmware and
		// check for TX_READY.
		NdisRawWritePortUchar(XFER_PORT, *Firmware);

		DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_INFO,
				("LtFirmInitialize: First byte of Firmware on card\n"));

		NdisRawReadPortUchar(SC_PORT, &Data);

		if (Data & TX_READY)
		{
			DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_FATAL,
					("LtFirmInitialize: Card Not Ready During Download\n"));

			LOGERROR(
				Adapter->NdisAdapterHandle,
				NDIS_ERROR_CODE_HARDWARE_FAILURE);
			break;
		}

		// Skip over the first byte because it already out there.
		Firmware ++;
		FirmwareLen --;

		NdisRawWritePortBufferUchar(XFER_PORT,
									Firmware,
									FirmwareLen);

		// Tell the card to start
		NdisRawReadPortUchar(XFER_PORT, &Data);

		// Wait for the card to start
		for (RetryCount = 0; RetryCount < MAX_START_RETRY_COUNT; RetryCount++)
		{
			NdisStallExecution(LT_FIRM_INIT_STALL_TIME);

			// Get Status
			NdisRawReadPortUchar(SC_PORT, &Data);

			DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_WARN,
					("LtFirmInitialize: Waiting for start - SC_PORT Data %x\n",
					(UCHAR)Data));

			if (Data & RX_READY)
			{
				break;
			}
		}

		//	!!!	This seems to be the only way the MCA card works according to
		//	!!!	Dave Hornbaker. It seems that the MCA card doesnt get ready at
		//	!!! this point, but works later on.
		if (RetryCount == MAX_START_RETRY_COUNT)
		{
			ASSERT(Adapter->BusType !=  NdisInterfaceMca);

			DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_FATAL,
					("LtFirmInitialize: Card Not Ready, could not get status\n"));

			LOGERROR(
				Adapter->NdisAdapterHandle,
				NDIS_ERROR_CODE_INVALID_VALUE_FROM_ADAPTER);
			break;
		}

		// Clear the initial ready signal.
		NdisRawReadPortUchar(XFER_PORT, &Data);

		// Now loop here for a finite time till the card acquires a node id.
		// If it fails to do so in the specified time, fail the load.
		if (!LtInitGetAddressSetPoll(Adapter, SuggestedNodeId))
		{
			break;
		}

		// We need to catch the card fast after it acquire the node id and before it
		// receives any packets. If it does receive any packets, then ask it acquire
		// the node id again. The stall happens ONLY IF A PACKET IS RECVD.
		for (RetryCount = 0; RetryCount < MAX_START_RETRY_COUNT*200; RetryCount++)
		{
			USHORT 				ResponseLength;
			UCHAR 				ResponseType;
			LT_INIT_RESPONSE 	InitPacket;

			//	Check for receive data
			NdisRawReadPortUchar(SC_PORT, &Data);

			if (Data & RX_READY)
			{
				// Get the length of the response on the card
				NdisRawReadPortUchar(XFER_PORT, &Data);

				ResponseLength = (USHORT)(Data & 0xFF);

				NdisRawReadPortUchar(XFER_PORT, &Data);

				ResponseLength |= (Data << 8);

				// Now get the IO code.
				NdisRawReadPortUchar(XFER_PORT, &ResponseType);

				DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_INFO,
						("LtFirmInitialize: RespType = %x, RespLength = %d\n",
							ResponseType, ResponseLength));

				if ((ResponseType == LT_RSP_LAP_INIT) &&
					(ResponseLength == sizeof(LT_INIT_RESPONSE)))
				{
					NdisRawReadPortBufferUchar(XFER_PORT,
												(PUCHAR)&InitPacket,
												ResponseLength);

					Adapter->NodeId = InitPacket.NodeId;
					Adapter->Flags |= ADAPTER_NODE_ID_VALID;

					//	This should start off a worker thread to write the
					//	node id into the pram.
					//	BUGBUG: Implement using worker threads.
					//	LtRegWritePramNodeId(Adapter);

					DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_INFO,
							("LtFirmInitailize: Node id acquired %x\n", InitPacket.NodeId));
					break;
				}
				DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_WARN,
						("LtFirmInitailize: Node id not valid yet !!\n"));

				// Suck in the packet and throw it away
				while (ResponseLength-- > 0)
				{
					NdisRawReadPortUchar(XFER_PORT, &Data);
				}

				// The response was probably over-written by incoming packet.
				// Try again.
				NdisStallExecution(LT_FIRM_INIT_STALL_TIME);
				DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_WARN,
						("LtFirmInitailize: Re-acquire node after packet recv\n"));
				if (!LtInitGetAddressSetPoll(Adapter, SuggestedNodeId))
				{
					break;
				}
			}
			else
			{
				DBGPRINT(DBG_COMP_INIT, DBG_LEVEL_WARN,
						("LtFirmInitialize: Waiting for node - SC_PORT Data %x\n",
						(UCHAR)Data)); 
			}
			NdisStallExecution(500);	// 500us
		}
		Result = ((Adapter->Flags & ADAPTER_NODE_ID_VALID) != 0);
	} while (FALSE);

	return(Result);
}
Exemple #10
0
PU8		C_DM9000::DeviceWriteString(
	PU8		ptrBuffer,
	int		nLength)
{
	int		count;
	
	count = (nLength + m_nIoMaxPad) / m_nIoMode;

#if defined(PREEMPTIVE_TX_WRITE) 

	switch (m_nIoMode)
	{
		case BYTE_MODE:
		{
			PU8	pcurr=(PU8)ptrBuffer;
			for(;count--;pcurr++)
			{
				ENTER_CRITICAL_SECTION
				VALIDATE_ADDR_PORT(DM9_MWCMD);

				NdisRawWritePortUchar(
					m_szCurrentSettings[SID_PORT_BASE_ADDRESS] 
					+ DM9000_DATA_OFFSET, *pcurr);
				
				LEAVE_CRITICAL_SECTION
			}
		}
			break;
			
		case WORD_MODE:
		{
			PU16	pcurr=(PU16)ptrBuffer;
			
			for(;count--;pcurr++)
			{
				ENTER_CRITICAL_SECTION
				VALIDATE_ADDR_PORT(DM9_MWCMD);

				NdisRawWritePortUshort(
					m_szCurrentSettings[SID_PORT_BASE_ADDRESS] 
					+ DM9000_DATA_OFFSET, *pcurr);

				LEAVE_CRITICAL_SECTION
			}
		}
			break;

		case DWORD_MODE:
		{
			PU32	pcurr=(PU32)ptrBuffer;
			for(;count--;pcurr++)
			{
				ENTER_CRITICAL_SECTION
				VALIDATE_ADDR_PORT(DM9_MWCMD);

				NdisRawWritePortUlong(
					m_szCurrentSettings[SID_PORT_BASE_ADDRESS] 
					+ DM9000_DATA_OFFSET, *pcurr);
				
				LEAVE_CRITICAL_SECTION
			}
		}
			break;
		
		default:
			break;
	} // of switch
	
#else // !PREEMPTIVE_TX_WRITE
	// select port to be read from
	ENTER_CRITICAL_SECTION

	VALIDATE_ADDR_PORT(DM9_MWCMD);

	switch (m_nIoMode)
	{
		case BYTE_MODE:
			NdisRawWritePortBufferUchar(
				m_szCurrentSettings[SID_PORT_BASE_ADDRESS] + DM9000_DATA_OFFSET, 
				ptrBuffer,count);
			break;
			
		case WORD_MODE:
			NdisRawWritePortBufferUshort(
				m_szCurrentSettings[SID_PORT_BASE_ADDRESS] + DM9000_DATA_OFFSET, 
				(PU16)ptrBuffer,count);
			break;

		case DWORD_MODE:
			NdisRawWritePortBufferUlong(
				m_szCurrentSettings[SID_PORT_BASE_ADDRESS] + DM9000_DATA_OFFSET, 
				(PU32)ptrBuffer,count);
			break;
		
		default:
			break;
	} // of switch
	
	LEAVE_CRITICAL_SECTION

#endif

	return ptrBuffer;
}