void InterfaceHandleShutdownModeWakeup(struct bcm_mini_adapter *Adapter)
{
	unsigned int uiRegVal = 0;
	INT Status = 0;
	int bytes;

	if (Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_MANUAL_CLOCK_GATING) {
		/* clear idlemode interrupt. */
		uiRegVal = 0;
		Status = wrmalt(Adapter, DEBUG_INTERRUPT_GENERATOR_REGISTOR, &uiRegVal, sizeof(uiRegVal));
		if (Status) {
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,"WRM to DEBUG_INTERRUPT_GENERATOR_REGISTOR Failed with err :%d", Status);
			return;
		}
	}

    else {

        /* clear Interrupt EP registers. */
		bytes = rdmalt(Adapter, DEVICE_INT_OUT_EP_REG0, &uiRegVal, sizeof(uiRegVal));
		if (bytes < 0) {
			Status = bytes;
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "RDM of DEVICE_INT_OUT_EP_REG0 failed with Err :%d", Status);
			return;
		}

		bytes = rdmalt(Adapter, DEVICE_INT_OUT_EP_REG1, &uiRegVal, sizeof(uiRegVal));
		if (bytes < 0) {
			Status = bytes;
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "RDM of DEVICE_INT_OUT_EP_REG1 failed with Err :%d", Status);
			return;
		}
	}
}
Exemplo n.º 2
0
VOID ConfigureEndPointTypesThroughEEPROM(PMINI_ADAPTER Adapter)
{
	ULONG ulReg = 0;

// Program EP2 MAX_PKT_SIZE
	ulReg = ntohl(EP2_MPS_REG);
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x128,4,TRUE);
	ulReg = ntohl(EP2_MPS);
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x12C,4,TRUE);

	ulReg = ntohl(EP2_CFG_REG);
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x132,4,TRUE);
	if(((PS_INTERFACE_ADAPTER)(Adapter->pvInterfaceAdapter))->bHighSpeedDevice == TRUE)
	{
		ulReg = ntohl(EP2_CFG_INT);
		BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x136,4,TRUE);
	}
	else
	{
// USE BULK EP as TX in FS mode.
		ulReg = ntohl(EP2_CFG_BULK);
		BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x136,4,TRUE);
	}


// Program EP4 MAX_PKT_SIZE.	
	ulReg = ntohl(EP4_MPS_REG);
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x13C,4,TRUE);
	ulReg = ntohl(EP4_MPS);
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x140,4,TRUE);

//	Program TX EP as interrupt (Alternate Setting)
	if( rdmalt(Adapter,0x0F0110F8, (PUINT)&ulReg,4))
	{
		BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "reading of Tx EP is failing");
		return ;
	}
	ulReg |= 0x6; 
	
	ulReg = ntohl(ulReg);
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x1CC,4,TRUE);
	
	ulReg = ntohl(EP4_CFG_REG);
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x1C8,4,TRUE);
// Program ISOCHRONOUS EP size to zero.	
	ulReg = ntohl(ISO_MPS_REG);
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x1D2,4,TRUE);	
	ulReg = ntohl(ISO_MPS);
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x1D6,4,TRUE);

// Update EEPROM Version.
// Read 4 bytes from 508 and modify 511 and 510.
//
	ReadBeceemEEPROM(Adapter,0x1FC,(PUINT)&ulReg);
	ulReg &= 0x0101FFFF;
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x1FC,4,TRUE);
//
//Update length field if required. Also make the string NULL terminated.
//	
	ReadBeceemEEPROM(Adapter,0xA8,(PUINT)&ulReg);
	if((ulReg&0x00FF0000)>>16 > 0x30)
	{
		ulReg = (ulReg&0xFF00FFFF)|(0x30<<16);
		BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0xA8,4,TRUE);
	}
	ReadBeceemEEPROM(Adapter,0x148,(PUINT)&ulReg);
	if((ulReg&0x00FF0000)>>16 > 0x30)
	{
		ulReg = (ulReg&0xFF00FFFF)|(0x30<<16);
		BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x148,4,TRUE);
	}
	ulReg = 0;
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x122,4,TRUE);
	ulReg = 0;
	BeceemEEPROMBulkWrite(Adapter,(PUCHAR)&ulReg,0x1C2,4,TRUE);

}
Exemplo n.º 3
0
INT InterfaceAdapterInit(PS_INTERFACE_ADAPTER psIntfAdapter)
{
	struct usb_host_interface *iface_desc;
	struct usb_endpoint_descriptor *endpoint;
	size_t buffer_size;
	ULONG value;
	INT retval = 0;
	INT usedIntOutForBulkTransfer = 0 ;
	BOOLEAN bBcm16 = FALSE;
	UINT uiData = 0;

	if(psIntfAdapter == NULL)
	{
		BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Interface Adapter is NULL");
		return -EINVAL;
	}
	/* Store the usb dev into interface adapter */
	psIntfAdapter->udev = usb_get_dev(interface_to_usbdev(
								psIntfAdapter->interface));

	if((psIntfAdapter->udev->speed == USB_SPEED_HIGH))
	{
		psIntfAdapter->bHighSpeedDevice = TRUE ;
		BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "MODEM IS CONFIGURED TO HIGH_SPEED ");	
	}
	else 	
	{
		psIntfAdapter->bHighSpeedDevice = FALSE ;
		BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "MODEM IS CONFIGURED TO FULL_SPEED ");	
	}
	
	psIntfAdapter->psAdapter->interface_rdm = BcmRDM;
	psIntfAdapter->psAdapter->interface_wrm = BcmWRM;
	
	if(rdmalt(psIntfAdapter->psAdapter, CHIP_ID_REG, (PUINT)&(psIntfAdapter->psAdapter->chip_id), sizeof(UINT)) < 0)
	{
		BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_PRINTK, 0, 0, "CHIP ID Read Failed\n");
		return STATUS_FAILURE;
	}
    if(0xbece3200==(psIntfAdapter->psAdapter->chip_id&~(0xF0)))
	{
		psIntfAdapter->psAdapter->chip_id=(psIntfAdapter->psAdapter->chip_id&~(0xF0));
	}

	BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "First RDM Chip ID 0x%lx\n", psIntfAdapter->psAdapter->chip_id);	

    iface_desc = psIntfAdapter->interface->cur_altsetting;
	//print_usb_interface_desc(&(iface_desc->desc));
	
	if(psIntfAdapter->psAdapter->chip_id == T3B)
	{
		
		//
		//T3B device will have EEPROM,check if EEPROM is proper and BCM16 can be done or not.
		// 
		BeceemEEPROMBulkRead(psIntfAdapter->psAdapter,&uiData,0x0,4);
		if(uiData == BECM)
		{
			bBcm16 = TRUE;
		}
		BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Number of Altsetting aviailable for This Modem 0x%x\n", psIntfAdapter->interface->num_altsetting);	
		if(bBcm16 == TRUE)
		{
			//selecting alternate setting one as a default setting for High Speed  modem. 
			if(psIntfAdapter->bHighSpeedDevice)
				retval= usb_set_interface(psIntfAdapter->udev,DEFAULT_SETTING_0,ALTERNATE_SETTING_1);
			BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "BCM16 is Applicable on this dongle");		
			if(retval || (psIntfAdapter->bHighSpeedDevice == FALSE))
			{	
				usedIntOutForBulkTransfer = EP2 ;
				endpoint = &iface_desc->endpoint[EP2].desc;
				BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Interface altsetting  got failed or Moemd is configured to FS.hence will work on default setting 0 \n");
				/*
				If Modem is high speed device EP2 should be INT OUT End point 
				If Mode is FS then EP2 should be bulk end point 
				*/
				if(((psIntfAdapter->bHighSpeedDevice ==TRUE ) && (bcm_usb_endpoint_is_int_out(endpoint)== FALSE))
					||((psIntfAdapter->bHighSpeedDevice == FALSE)&& (bcm_usb_endpoint_is_bulk_out(endpoint)== FALSE)))
				{
					BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,"Configuring the EEPROM ");
					//change the EP2, EP4 to INT OUT end point 
					ConfigureEndPointTypesThroughEEPROM(psIntfAdapter->psAdapter);

					/*
					It resets the device and if any thing gets changed in USB descriptor it will show fail and 
					re-enumerate the device
					*/
					retval = usb_reset_device(psIntfAdapter->udev);
					if(retval)
					{
						BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "reset got failed. hence Re-enumerating the device \n");
						return retval ;
					}	
									
				}
				if((psIntfAdapter->bHighSpeedDevice == FALSE) && bcm_usb_endpoint_is_bulk_out(endpoint)) 
				{
					// Once BULK is selected in FS mode. Revert it back to INT. Else USB_IF will fail.
					UINT uiData = ntohl(EP2_CFG_INT);
					BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL,"Reverting Bulk to INT as it is FS MODE");
					BeceemEEPROMBulkWrite(psIntfAdapter->psAdapter,(PUCHAR)&uiData,0x136,4,TRUE);		
				}
			}
			else
			{
				usedIntOutForBulkTransfer = EP4 ;
				endpoint = &iface_desc->endpoint[EP4].desc;
				BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Choosing AltSetting as a default setting");
				if( bcm_usb_endpoint_is_int_out(endpoint) == FALSE)
				{
					BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, " Dongle does not have BCM16 Fix");
					//change the EP2, EP4 to INT OUT end point and use EP4 in altsetting
					ConfigureEndPointTypesThroughEEPROM(psIntfAdapter->psAdapter);

					/*
					It resets the device and if any thing gets changed in USB descriptor it will show fail and 
					re-enumerate the device
					*/
					retval = usb_reset_device(psIntfAdapter->udev);
					if(retval)
					{
						BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "reset got failed. hence Re-enumerating the device \n");
						return retval ;
					}	
					
				}
			}
		}
	}
	
	iface_desc = psIntfAdapter->interface->cur_altsetting;
	//print_usb_interface_desc(&(iface_desc->desc));
   	BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_PRINTK, 0, 0, "Current number of endpoints :%x \n", iface_desc->desc.bNumEndpoints); 
    for (value = 0; value < iface_desc->desc.bNumEndpoints; ++value) 
	{
        endpoint = &iface_desc->endpoint[value].desc;
		//print_usb_endpoint_descriptor(endpoint);

        if (!psIntfAdapter->sBulkIn.bulk_in_endpointAddr && bcm_usb_endpoint_is_bulk_in(endpoint))
        {
            buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
            psIntfAdapter->sBulkIn.bulk_in_size = buffer_size;
            psIntfAdapter->sBulkIn.bulk_in_endpointAddr = 
								endpoint->bEndpointAddress;
	    	psIntfAdapter->sBulkIn.bulk_in_pipe = 
					usb_rcvbulkpipe(psIntfAdapter->udev, 
								psIntfAdapter->sBulkIn.bulk_in_endpointAddr);
        }
		
        if (!psIntfAdapter->sBulkOut.bulk_out_endpointAddr && bcm_usb_endpoint_is_bulk_out(endpoint))
        {

			psIntfAdapter->sBulkOut.bulk_out_endpointAddr = 
										endpoint->bEndpointAddress;
	    	psIntfAdapter->sBulkOut.bulk_out_pipe = 
			usb_sndbulkpipe(psIntfAdapter->udev, 
					psIntfAdapter->sBulkOut.bulk_out_endpointAddr);			
        }

        if (!psIntfAdapter->sIntrIn.int_in_endpointAddr && bcm_usb_endpoint_is_int_in(endpoint))
        {
            buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
            psIntfAdapter->sIntrIn.int_in_size = buffer_size;
            psIntfAdapter->sIntrIn.int_in_endpointAddr = 
								endpoint->bEndpointAddress;
            psIntfAdapter->sIntrIn.int_in_interval = endpoint->bInterval;
            psIntfAdapter->sIntrIn.int_in_buffer = 
						kmalloc(buffer_size, GFP_KERNEL);
            if (!psIntfAdapter->sIntrIn.int_in_buffer) {
                BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Could not allocate interrupt_in_buffer");
                return -EINVAL;
            }
			//psIntfAdapter->sIntrIn.int_in_pipe = 
        }

        if (!psIntfAdapter->sIntrOut.int_out_endpointAddr && bcm_usb_endpoint_is_int_out(endpoint))
        {

			if( !psIntfAdapter->sBulkOut.bulk_out_endpointAddr && 
				(psIntfAdapter->psAdapter->chip_id == T3B) && (value == usedIntOutForBulkTransfer))
			{
				//use first intout end point as a bulk out end point
            	buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
            	psIntfAdapter->sBulkOut.bulk_out_size = buffer_size;
				//printk("\nINT OUT Endpoing buffer size :%x endpoint :%x\n", buffer_size, value +1);
				psIntfAdapter->sBulkOut.bulk_out_endpointAddr = 
										endpoint->bEndpointAddress;
	    		psIntfAdapter->sBulkOut.bulk_out_pipe = 
				usb_sndintpipe(psIntfAdapter->udev, 
					psIntfAdapter->sBulkOut.bulk_out_endpointAddr);			
          	  	psIntfAdapter->sBulkOut.int_out_interval = endpoint->bInterval;
			
			}
			else if(value == EP6)
			{
	            buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
	            psIntfAdapter->sIntrOut.int_out_size = buffer_size;
	            psIntfAdapter->sIntrOut.int_out_endpointAddr = 
										endpoint->bEndpointAddress;
	            psIntfAdapter->sIntrOut.int_out_interval = endpoint->bInterval;
	            psIntfAdapter->sIntrOut.int_out_buffer= kmalloc(buffer_size,
														GFP_KERNEL);
	            	if (!psIntfAdapter->sIntrOut.int_out_buffer) 
					{
	                BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Could not allocate interrupt_out_buffer");
	                return -EINVAL;
            }
        }
    }
	}
    usb_set_intfdata(psIntfAdapter->interface, psIntfAdapter);
    retval = usb_register_dev(psIntfAdapter->interface, &usbbcm_class);
	if(retval)
	{
		BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_PRINTK, 0, 0, "usb register dev failed = %d", retval);
		psIntfAdapter->psAdapter->bUsbClassDriverRegistered = FALSE;
		return retval;
	}
	else
	{
		psIntfAdapter->psAdapter->bUsbClassDriverRegistered = TRUE;
		BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_PRINTK, 0, 0, "usb dev registered");
	}

	psIntfAdapter->psAdapter->bcm_file_download = InterfaceFileDownload;
	psIntfAdapter->psAdapter->bcm_file_readback_from_chip = 
				InterfaceFileReadbackFromChip;
	psIntfAdapter->psAdapter->interface_transmit = InterfaceTransmitPacket;

	retval = CreateInterruptUrb(psIntfAdapter);

	if(retval)
	{
		BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_PRINTK, 0, 0, "Cannot create interrupt urb");
		return retval;
	}

	retval = AllocUsbCb(psIntfAdapter);
	if(retval)
	{
		return retval;
	}


	retval = device_run(psIntfAdapter);	
	if(retval)
	{
		return retval;
	}


	return 0;
}
Exemplo n.º 4
0
int ddr_init(struct bcm_mini_adapter *Adapter)
{
	struct bcm_ddr_setting *psDDRSetting = NULL;
	ULONG RegCount = 0;
	UINT value = 0;
	UINT  uiResetValue = 0;
	UINT uiClockSetting = 0;
	int retval = STATUS_SUCCESS;

	switch (Adapter->chip_id) {
	case 0xbece3200:
		switch (Adapter->DDRSetting) {
		case DDR_80_MHZ:
			psDDRSetting = asT3LP_DDRSetting80MHz;
			RegCount = (sizeof(asT3LP_DDRSetting80MHz)/
			sizeof(struct bcm_ddr_setting));
			break;
		case DDR_100_MHZ:
			psDDRSetting = asT3LP_DDRSetting100MHz;
			RegCount = (sizeof(asT3LP_DDRSetting100MHz)/
			sizeof(struct bcm_ddr_setting));
			break;
		case DDR_133_MHZ:
			psDDRSetting = asT3LP_DDRSetting133MHz;
			RegCount = (sizeof(asT3LP_DDRSetting133MHz)/
			sizeof(struct bcm_ddr_setting));
			if (Adapter->bMipsConfig == MIPS_200_MHZ)
				uiClockSetting = 0x03F13652;
			else
				uiClockSetting = 0x03F1365B;
			break;
		default:
			return -EINVAL;
		}

		break;
	case T3LPB:
	case BCS220_2:
	case BCS220_2BC:
	case BCS250_BC:
	case BCS220_3:
		/* Set bit 2 and bit 6 to 1 for BBIC 2mA drive
		 * (please check current value and additionally set these bits)
		 */
	if ((Adapter->chip_id !=  BCS220_2) &&
		(Adapter->chip_id !=  BCS220_2BC) &&
		(Adapter->chip_id != BCS220_3)) {
		retval = rdmalt(Adapter,(UINT)0x0f000830, &uiResetValue, sizeof(uiResetValue));
		if (retval < 0) {
			BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
			return retval;
		}
		uiResetValue |= 0x44;
		retval = wrmalt(Adapter,(UINT)0x0f000830, &uiResetValue, sizeof(uiResetValue));
		if (retval < 0) {
			BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
			return retval;
		}
	}
		switch (Adapter->DDRSetting) {



		case DDR_80_MHZ:
			psDDRSetting = asT3LPB_DDRSetting80MHz;
			RegCount = (sizeof(asT3B_DDRSetting80MHz)/
			sizeof(struct bcm_ddr_setting));
			break;
		case DDR_100_MHZ:
			psDDRSetting = asT3LPB_DDRSetting100MHz;
			RegCount = (sizeof(asT3B_DDRSetting100MHz)/
			sizeof(struct bcm_ddr_setting));
			break;
		case DDR_133_MHZ:
			psDDRSetting = asT3LPB_DDRSetting133MHz;
			RegCount = (sizeof(asT3B_DDRSetting133MHz)/
			sizeof(struct bcm_ddr_setting));

			if (Adapter->bMipsConfig == MIPS_200_MHZ)
				uiClockSetting = 0x03F13652;
			else
				uiClockSetting = 0x03F1365B;
			break;

		case DDR_160_MHZ:
			psDDRSetting = asT3LPB_DDRSetting160MHz;
			RegCount = sizeof(asT3LPB_DDRSetting160MHz)/sizeof(struct bcm_ddr_setting);

			if (Adapter->bMipsConfig == MIPS_200_MHZ)
				uiClockSetting = 0x03F137D2;
			else
				uiClockSetting = 0x03F137DB;
		}
			break;

	case 0xbece0110:
	case 0xbece0120:
	case 0xbece0121:
	case 0xbece0130:
	case 0xbece0300:
	BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "DDR Setting: %x\n", Adapter->DDRSetting);
		switch (Adapter->DDRSetting) {
		case DDR_80_MHZ:
			psDDRSetting = asT3_DDRSetting80MHz;
			RegCount = (sizeof(asT3_DDRSetting80MHz)/
			sizeof(struct bcm_ddr_setting));
			break;
		case DDR_100_MHZ:
			psDDRSetting = asT3_DDRSetting100MHz;
			RegCount = (sizeof(asT3_DDRSetting100MHz)/
			sizeof(struct bcm_ddr_setting));
			break;
		case DDR_133_MHZ:
			psDDRSetting = asT3_DDRSetting133MHz;
			RegCount = (sizeof(asT3_DDRSetting133MHz)/
			sizeof(struct bcm_ddr_setting));
			break;
		default:
			return -EINVAL;
		}
	case 0xbece0310:
	{
		switch (Adapter->DDRSetting) {
		case DDR_80_MHZ:
			psDDRSetting = asT3B_DDRSetting80MHz;
			RegCount = (sizeof(asT3B_DDRSetting80MHz)/
			sizeof(struct bcm_ddr_setting));
			break;
		case DDR_100_MHZ:
			psDDRSetting = asT3B_DDRSetting100MHz;
			RegCount = (sizeof(asT3B_DDRSetting100MHz)/
			sizeof(struct bcm_ddr_setting));
			break;
		case DDR_133_MHZ:

			if (Adapter->bDPLLConfig == PLL_266_MHZ) {  /* 266Mhz PLL selected. */
				memcpy(asT3B_DDRSetting133MHz, asDPLL_266MHZ,
				sizeof(asDPLL_266MHZ));
				psDDRSetting = asT3B_DDRSetting133MHz;
				RegCount = (sizeof(asT3B_DDRSetting133MHz)/
				sizeof(struct bcm_ddr_setting));
			} else {
				psDDRSetting = asT3B_DDRSetting133MHz;
				RegCount = (sizeof(asT3B_DDRSetting133MHz)/
				sizeof(struct bcm_ddr_setting));
				if (Adapter->bMipsConfig == MIPS_200_MHZ)
					uiClockSetting = 0x07F13652;
				else
					uiClockSetting = 0x07F1365B;
			}
			break;
		default:
			return -EINVAL;
		}
		break;

	}
	default:
		return -EINVAL;
	}

	value = 0;
	BCM_DEBUG_PRINT(Adapter,DBG_TYPE_INITEXIT, DRV_ENTRY, DBG_LVL_ALL, "Register Count is =%lu\n", RegCount);
	while (RegCount && !retval) {
		if (uiClockSetting && psDDRSetting->ulRegAddress == MIPS_CLOCK_REG)
			value = uiClockSetting;
		else
			value = psDDRSetting->ulRegValue;
		retval = wrmalt(Adapter, psDDRSetting->ulRegAddress, &value, sizeof(value));
		if (STATUS_SUCCESS != retval) {
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "%s:%d\n", __func__, __LINE__);
			break;
		}

		RegCount--;
		psDDRSetting++;
	}

	if (Adapter->chip_id >= 0xbece3300) {

		mdelay(3);
		if ((Adapter->chip_id != BCS220_2) &&
			(Adapter->chip_id != BCS220_2BC) &&
			(Adapter->chip_id != BCS220_3)) {
			/* drive MDDR to half in case of UMA-B:	*/
			uiResetValue = 0x01010001;
			retval = wrmalt(Adapter, (UINT)0x0F007018, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			uiResetValue = 0x00040020;
			retval = wrmalt(Adapter, (UINT)0x0F007094, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			uiResetValue = 0x01020101;
			retval = wrmalt(Adapter, (UINT)0x0F00701c, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			uiResetValue = 0x01010000;
			retval = wrmalt(Adapter, (UINT)0x0F007018, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
		}
		mdelay(3);

		/* DC/DC standby change...
		 * This is to be done only for Hybrid PMU mode.
		 * with the current h/w there is no way to detect this.
		 * and since we dont have internal PMU lets do it under UMA-B chip id.
		 * we will change this when we will have internal PMU.
		 */
		if (Adapter->PmuMode == HYBRID_MODE_7C) {
			retval = rdmalt(Adapter,(UINT)0x0f000c00, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			retval = rdmalt(Adapter,(UINT)0x0f000c00, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			uiResetValue = 0x1322a8;
			retval = wrmalt(Adapter, (UINT)0x0f000d1c, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			retval = rdmalt(Adapter,(UINT)0x0f000c00, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			retval = rdmalt(Adapter,(UINT)0x0f000c00, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			uiResetValue = 0x132296;
			retval = wrmalt(Adapter, (UINT)0x0f000d14, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
		} else if (Adapter->PmuMode == HYBRID_MODE_6) {

			retval = rdmalt(Adapter,(UINT)0x0f000c00, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			retval = rdmalt(Adapter,(UINT)0x0f000c00, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			uiResetValue = 0x6003229a;
			retval = wrmalt(Adapter, (UINT)0x0f000d14, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			retval = rdmalt(Adapter,(UINT)0x0f000c00, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			retval = rdmalt(Adapter,(UINT)0x0f000c00, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
			uiResetValue = 0x1322a8;
			retval = wrmalt(Adapter, (UINT)0x0f000d1c, &uiResetValue, sizeof(uiResetValue));
			if (retval < 0) {
				BCM_DEBUG_PRINT(Adapter, CMHOST, RDM, DBG_LVL_ALL, "%s:%d RDM failed\n", __func__, __LINE__);
				return retval;
			}
		}

	}
	Adapter->bDDRInitDone = TRUE;
	return retval;
}
int InterfaceIdleModeRespond(struct bcm_mini_adapter *Adapter, unsigned int *puiBuffer)
{
	int	status = STATUS_SUCCESS;
	unsigned int	uiRegRead = 0;
	int bytes;

	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "SubType of Message :0x%X", ntohl(*puiBuffer));

	if (ntohl(*puiBuffer) == GO_TO_IDLE_MODE_PAYLOAD) {
		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, " Got GO_TO_IDLE_MODE_PAYLOAD(210) Msg Subtype");
		if (ntohl(*(puiBuffer+1)) == 0 ) {
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Got IDLE MODE WAKE UP Response From F/W");

			status = wrmalt (Adapter, SW_ABORT_IDLEMODE_LOC, &uiRegRead, sizeof(uiRegRead));
			if (status) {
				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "wrm failed while clearing Idle Mode Reg");
				return status;
			}

			if (Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_MANUAL_CLOCK_GATING) {
				uiRegRead = 0x00000000 ;
				status = wrmalt (Adapter, DEBUG_INTERRUPT_GENERATOR_REGISTOR, &uiRegRead, sizeof(uiRegRead));
				if (status) {
					BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "wrm failed while clearing Idle Mode	Reg");
					return status;
				}
			}
			/* Below Register should not br read in case of Manual and Protocol Idle mode */
			else if (Adapter->ulPowerSaveMode != DEVICE_POWERSAVE_MODE_AS_PROTOCOL_IDLE_MODE) {
				/* clear on read Register */
				bytes = rdmalt(Adapter, DEVICE_INT_OUT_EP_REG0, &uiRegRead, sizeof(uiRegRead));
				if (bytes < 0) {
					status = bytes;
					BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "rdm failed while clearing H/W Abort Reg0");
					return status;
				}
				/* clear on read Register */
				bytes = rdmalt(Adapter, DEVICE_INT_OUT_EP_REG1, &uiRegRead, sizeof(uiRegRead));
				if (bytes < 0) {
					status = bytes;
					BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "rdm failed while clearing H/W Abort	Reg1");
					return status;
				}
			}
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Device Up from Idle Mode");

			/* Set Idle Mode Flag to False and Clear IdleMode reg. */
			Adapter->IdleMode = FALSE;
			Adapter->bTriedToWakeUpFromlowPowerMode = FALSE;

			wake_up(&Adapter->lowpower_mode_wait_queue);

		} else {
			if (TRUE == Adapter->IdleMode)
			{
				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Device is already in Idle mode....");
				return status ;
			}

			uiRegRead = 0;
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Got Req from F/W to go in IDLE mode \n");

			if (Adapter->chip_id == BCS220_2 ||
				Adapter->chip_id == BCS220_2BC ||
					Adapter->chip_id == BCS250_BC ||
					Adapter->chip_id == BCS220_3) {

				bytes = rdmalt(Adapter, HPM_CONFIG_MSW, &uiRegRead, sizeof(uiRegRead));
				if (bytes < 0) {
					status = bytes;
					BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "rdm failed while Reading HPM_CONFIG_LDO145 Reg 0\n");
					return status;
				}


				uiRegRead |= (1<<17);

				status = wrmalt (Adapter, HPM_CONFIG_MSW, &uiRegRead, sizeof(uiRegRead));
				if (status) {
					BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "wrm failed while clearing Idle Mode Reg\n");
					return status;
				}

			}
			SendIdleModeResponse(Adapter);
		}
	} else if (ntohl(*puiBuffer) == IDLE_MODE_SF_UPDATE_MSG) {
		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "OverRiding Service Flow Params");
		OverrideServiceFlowParams(Adapter, puiBuffer);
	}
	return status;
}
static int InterfaceAbortIdlemode(struct bcm_mini_adapter *Adapter, unsigned int Pattern)
{
	int 	status = STATUS_SUCCESS;
	unsigned int value;
	unsigned int chip_id ;
	unsigned long timeout = 0, itr = 0;

	int 	lenwritten = 0;
	unsigned char aucAbortPattern[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
	struct bcm_interface_adapter *psInterfaceAdapter = Adapter->pvInterfaceAdapter;

	/* Abort Bus suspend if its already suspended */
	if ((TRUE == psInterfaceAdapter->bSuspended) && (TRUE == Adapter->bDoSuspend)) {
		status = usb_autopm_get_interface(psInterfaceAdapter->interface);
		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Bus got wakeup..Aborting Idle mode... status:%d \n", status);

	}

	if ((Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_MANUAL_CLOCK_GATING)
									||
	   (Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_PROTOCOL_IDLE_MODE)) {
		/* write the SW abort pattern. */
		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Writing pattern<%d> to SW_ABORT_IDLEMODE_LOC\n", Pattern);
		status = wrmalt(Adapter, SW_ABORT_IDLEMODE_LOC, &Pattern, sizeof(Pattern));
		if (status) {
				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "WRM to Register SW_ABORT_IDLEMODE_LOC failed..");
				return status;
		}
	}

	if (Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_MANUAL_CLOCK_GATING) {
		value = 0x80000000;
		status = wrmalt(Adapter, DEBUG_INTERRUPT_GENERATOR_REGISTOR, &value, sizeof(value));
		if (status)
		{
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "WRM to DEBUG_INTERRUPT_GENERATOR_REGISTOR Register failed");
			return status;
		}
	} else if (Adapter->ulPowerSaveMode != DEVICE_POWERSAVE_MODE_AS_PROTOCOL_IDLE_MODE) {
		/*
		 * Get a Interrupt Out URB and send 8 Bytes Down
		 * To be Done in Thread Context.
		 * Not using Asynchronous Mechanism.
		 */
		status = usb_interrupt_msg (psInterfaceAdapter->udev,
			usb_sndintpipe(psInterfaceAdapter->udev,
			psInterfaceAdapter->sIntrOut.int_out_endpointAddr),
			aucAbortPattern,
			8,
			&lenwritten,
			5000);
		if (status) {
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Sending Abort pattern down fails with status:%d..\n", status);
			return status;
		} else {
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "NOB Sent down :%d", lenwritten);
		}

		/* mdelay(25); */

		timeout = jiffies +  msecs_to_jiffies(50) ;
		while ( timeout > jiffies ) {
			itr++ ;
			rdmalt(Adapter, CHIP_ID_REG, &chip_id, sizeof(UINT));
			if (0xbece3200 == (chip_id&~(0xF0)))
				chip_id = chip_id&~(0xF0);
			if (chip_id == Adapter->chip_id)
				break;
		}
		if (timeout < jiffies )
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Not able to read chip-id even after 25 msec");
		else
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Number of completed iteration to read chip-id :%lu", itr);

		status = wrmalt(Adapter, SW_ABORT_IDLEMODE_LOC, &Pattern, sizeof(status));
		if (status) {
			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "WRM to Register SW_ABORT_IDLEMODE_LOC failed..");
			return status;
		}
	}
	return status;
}
int InterfaceIdleModeRespond(PMINI_ADAPTER Adapter, unsigned int* puiBuffer)
{
    int	status = STATUS_SUCCESS;
    unsigned int	uiRegRead = 0;

    BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"SubType of Message :0x%X", ntohl(*puiBuffer));

    if(ntohl(*puiBuffer) == GO_TO_IDLE_MODE_PAYLOAD)
    {
        BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL," Got GO_TO_IDLE_MODE_PAYLOAD(210) Msg Subtype");
        if(ntohl(*(puiBuffer+1)) == 0 )
        {
            BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"Got IDLE MODE WAKE UP Response From F/W");

            status = wrmalt (Adapter,SW_ABORT_IDLEMODE_LOC, &uiRegRead, sizeof(uiRegRead));
            if(status)
            {
                BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "wrm failed while clearing Idle Mode Reg");
                return status;
            }

            if(Adapter->ulPowerSaveMode == DEVICE_POWERSAVE_MODE_AS_MANUAL_CLOCK_GATING)
            {
                uiRegRead = 0x00000000 ;
                status = wrmalt (Adapter,DEBUG_INTERRUPT_GENERATOR_REGISTOR, &uiRegRead, sizeof(uiRegRead));
                if(status)
                {
                    BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "wrm failed while clearing Idle Mode	Reg");
                    return status;
                }
            }
            //Below Register should not br read in case of Manual and Protocol Idle mode.
            else if(Adapter->ulPowerSaveMode != DEVICE_POWERSAVE_MODE_AS_PROTOCOL_IDLE_MODE)
            {
                //clear on read Register
                status = rdmalt(Adapter, DEVICE_INT_OUT_EP_REG0, &uiRegRead, sizeof(uiRegRead));
                if(status)
                {
                    BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "rdm failed while clearing H/W Abort Reg0");
                    return status;
                }
                //clear on read Register
                status = rdmalt (Adapter, DEVICE_INT_OUT_EP_REG1, &uiRegRead, sizeof(uiRegRead));
                if(status)
                {
                    BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "rdm failed while clearing H/W Abort	Reg1");
                    return status;
                }
            }
            BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Device Up from Idle Mode");

            // Set Idle Mode Flag to False and Clear IdleMode reg.
            Adapter->IdleMode = FALSE;
            Adapter->bTriedToWakeUpFromlowPowerMode = FALSE;

            wake_up(&Adapter->lowpower_mode_wait_queue);
#if 0
            if(Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY)
            {
                BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"LED Thread is Running. Hence Setting the LED Event as IDLEMODE_EXIT");
                Adapter->DriverState = IDLEMODE_EXIT;
                wake_up(&Adapter->LEDInfo.notify_led_event);
            }
#endif

        }
        else
        {
            if(TRUE == Adapter->IdleMode)
            {
                BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL,"Device is already in Idle mode....");
                return status ;
            }

            uiRegRead = 0;
            BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "Got Req from F/W to go in IDLE mode \n");

            if (Adapter->chip_id== BCS220_2 ||
                    Adapter->chip_id == BCS220_2BC ||
                    Adapter->chip_id== BCS250_BC ||
                    Adapter->chip_id== BCS220_3)
            {

                status = rdmalt(Adapter, HPM_CONFIG_MSW, &uiRegRead, sizeof(uiRegRead));
                if(status)
                {
                    BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "rdm failed while Reading HPM_CONFIG_LDO145 Reg 0\n");
                    return status;
                }


                uiRegRead |= (1<<17);

                status = wrmalt (Adapter,HPM_CONFIG_MSW, &uiRegRead, sizeof(uiRegRead));
                if(status)
                {
                    BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, "wrm failed while clearing Idle Mode Reg\n");
                    return status;
                }

            }
            SendIdleModeResponse(Adapter);
        }
    }
    else if(ntohl(*puiBuffer) == IDLE_MODE_SF_UPDATE_MSG)
    {
        BCM_DEBUG_PRINT(Adapter,DBG_TYPE_OTHERS, IDLE_MODE, DBG_LVL_ALL, "OverRiding Service Flow Params");
        OverrideServiceFlowParams(Adapter,puiBuffer);
    }
    return status;
}