diff options
Diffstat (limited to 'drivers/staging/bcm/Bcmchar.c')
| -rw-r--r-- | drivers/staging/bcm/Bcmchar.c | 3484 | 
1 files changed, 2042 insertions, 1442 deletions
diff --git a/drivers/staging/bcm/Bcmchar.c b/drivers/staging/bcm/Bcmchar.c index f91bc1fdd89..606d5f5e921 100644 --- a/drivers/staging/bcm/Bcmchar.c +++ b/drivers/staging/bcm/Bcmchar.c @@ -1,6 +1,94 @@  #include <linux/fs.h>  #include "headers.h" + +static int bcm_handle_nvm_read_cmd(struct bcm_mini_adapter *Adapter, +	PUCHAR pReadData, struct bcm_nvm_readwrite *stNVMReadWrite) +{ +	INT Status = STATUS_FAILURE; + +	down(&Adapter->NVMRdmWrmLock); + +	if ((Adapter->IdleMode == TRUE) || (Adapter->bShutStatus == TRUE) || +			(Adapter->bPreparingForLowPowerMode == TRUE)) { + +		BCM_DEBUG_PRINT(Adapter, +			DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"Device is in Idle/Shutdown Mode\n"); +		up(&Adapter->NVMRdmWrmLock); +		kfree(pReadData); +		return -EACCES; +	} + +	Status = BeceemNVMRead(Adapter, (PUINT)pReadData, +			       stNVMReadWrite->uiOffset, +			       stNVMReadWrite->uiNumBytes); +	up(&Adapter->NVMRdmWrmLock); + +	if (Status != STATUS_SUCCESS) { +		kfree(pReadData); +		return Status; +	} + +	if (copy_to_user(stNVMReadWrite->pBuffer, pReadData, +			stNVMReadWrite->uiNumBytes)) { +		kfree(pReadData); +		return -EFAULT; +	} + +	return STATUS_SUCCESS; +} + +static int handle_flash2x_adapter(struct bcm_mini_adapter *Adapter, +	PUCHAR pReadData, struct bcm_nvm_readwrite *stNVMReadWrite) +{ +	/* +	 * New Requirement:- +	 * DSD section updation will be allowed in two case:- +	 * 1.  if DSD sig is present in DSD header means dongle +	 * is ok and updation is fruitfull +	 * 2.  if point 1 failes then user buff should have +	 * DSD sig. this point ensures that if dongle is +	 * corrupted then user space program first modify +	 * the DSD header with valid DSD sig so that this +	 * as well as further write may be worthwhile. +	 * +	 * This restriction has been put assuming that +	 * if DSD sig is corrupted, DSD data won't be +	 * considered valid. +	 */ +	INT Status; +	ULONG ulDSDMagicNumInUsrBuff = 0; + +	Status = BcmFlash2xCorruptSig(Adapter, Adapter->eActiveDSD); +	if (Status == STATUS_SUCCESS) +		return STATUS_SUCCESS; + +	if (((stNVMReadWrite->uiOffset + stNVMReadWrite->uiNumBytes) != +			Adapter->uiNVMDSDSize) || +			(stNVMReadWrite->uiNumBytes < SIGNATURE_SIZE)) { + +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"DSD Sig is present neither in Flash nor User provided Input.."); +		up(&Adapter->NVMRdmWrmLock); +		kfree(pReadData); +		return Status; +	} + +	ulDSDMagicNumInUsrBuff = +		ntohl(*(PUINT)(pReadData + stNVMReadWrite->uiNumBytes - +		      SIGNATURE_SIZE)); +	if (ulDSDMagicNumInUsrBuff != DSD_IMAGE_MAGIC_NUMBER) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"DSD Sig is present neither in Flash nor User provided Input.."); +		up(&Adapter->NVMRdmWrmLock); +		kfree(pReadData); +		return Status; +	} + +	return STATUS_SUCCESS; +} +  /***************************************************************  * Function	  - bcm_char_open()  * @@ -49,11 +137,8 @@ static int bcm_char_release(struct inode *inode, struct file *filp)  	pTarang = (struct bcm_tarang_data *)filp->private_data; -	if (pTarang == NULL) { -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -				"ptarang is null\n"); +	if (pTarang == NULL)  		return 0; -	}  	Adapter = pTarang->Adapter; @@ -104,9 +189,11 @@ static ssize_t bcm_char_read(struct file *filp, char __user *buf, size_t size,  	int wait_ret_val = 0;  	unsigned long ret = 0; -	wait_ret_val = wait_event_interruptible(Adapter->process_read_wait_queue, -						(pTarang->RxAppControlHead || -						 Adapter->device_removed)); +	wait_ret_val = wait_event_interruptible( +				Adapter->process_read_wait_queue, +				(pTarang->RxAppControlHead || +				Adapter->device_removed)); +  	if ((wait_ret_val == -ERESTARTSYS)) {  		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL,  				"Exiting as i've been asked to exit!!!\n"); @@ -119,7 +206,7 @@ static ssize_t bcm_char_read(struct file *filp, char __user *buf, size_t size,  		return -ENODEV;  	} -	if (FALSE == Adapter->fw_download_done) +	if (false == Adapter->fw_download_done)  		return -EACCES;  	down(&Adapter->RxAppControlQueuelock); @@ -153,1850 +240,2363 @@ static ssize_t bcm_char_read(struct file *filp, char __user *buf, size_t size,  	return PktLen;  } -static long bcm_char_ioctl(struct file *filp, UINT cmd, ULONG arg) +static int bcm_char_ioctl_reg_read_private(void __user *argp, +					   struct bcm_mini_adapter *Adapter)  { -	struct bcm_tarang_data *pTarang = filp->private_data; -	void __user *argp = (void __user *)arg; -	struct bcm_mini_adapter *Adapter = pTarang->Adapter; -	INT Status = STATUS_FAILURE; -	int timeout = 0; +	struct bcm_rdm_buffer sRdmBuffer = {0};  	struct bcm_ioctl_buffer IoBuffer; +	PCHAR temp_buff; +	INT Status = STATUS_FAILURE; +	UINT Bufflen; +	u16 temp_value;  	int bytes; -	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Parameters Passed to control IOCTL cmd=0x%X arg=0x%lX", cmd, arg); - -	if (_IOC_TYPE(cmd) != BCM_IOCTL) +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer)))  		return -EFAULT; -	if (_IOC_DIR(cmd) & _IOC_READ) -		Status = !access_ok(VERIFY_WRITE, argp, _IOC_SIZE(cmd)); -	else if (_IOC_DIR(cmd) & _IOC_WRITE) -		Status = !access_ok(VERIFY_READ, argp, _IOC_SIZE(cmd)); -	else if (_IOC_NONE == (_IOC_DIR(cmd) & _IOC_NONE)) -		Status = STATUS_SUCCESS; -	if (Status) -		return -EFAULT; +	if (IoBuffer.InputLength > sizeof(sRdmBuffer)) +		return -EINVAL; -	if (Adapter->device_removed) +	if (copy_from_user(&sRdmBuffer, IoBuffer.InputBuffer, +		IoBuffer.InputLength))  		return -EFAULT; -	if (FALSE == Adapter->fw_download_done) { -		switch (cmd) { -		case IOCTL_MAC_ADDR_REQ: -		case IOCTL_LINK_REQ: -		case IOCTL_CM_REQUEST: -		case IOCTL_SS_INFO_REQ: -		case IOCTL_SEND_CONTROL_MESSAGE: -		case IOCTL_IDLE_REQ: -		case IOCTL_BCM_GPIO_SET_REQUEST: -		case IOCTL_BCM_GPIO_STATUS_REQUEST: -			return -EACCES; -		default: -			break; -		} +	if (IoBuffer.OutputLength > USHRT_MAX || +		IoBuffer.OutputLength == 0) { +		return -EINVAL;  	} -	Status = vendorextnIoctl(Adapter, cmd, arg); -	if (Status != CONTINUE_COMMON_PATH) -		return Status; +	Bufflen = IoBuffer.OutputLength; +	temp_value = 4 - (Bufflen % 4); +	Bufflen += temp_value % 4; -	switch (cmd) { -	/* Rdms for Swin Idle... */ -	case IOCTL_BCM_REGISTER_READ_PRIVATE: { -		struct bcm_rdm_buffer sRdmBuffer = {0}; -		PCHAR temp_buff; -		UINT Bufflen; -		u16 temp_value; - -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; - -		if (IoBuffer.InputLength > sizeof(sRdmBuffer)) -			return -EINVAL; +	temp_buff = kmalloc(Bufflen, GFP_KERNEL); +	if (!temp_buff) +		return -ENOMEM; -		if (copy_from_user(&sRdmBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength)) +	bytes = rdmalt(Adapter, (UINT)sRdmBuffer.Register, +			(PUINT)temp_buff, Bufflen); +	if (bytes > 0) { +		Status = STATUS_SUCCESS; +		if (copy_to_user(IoBuffer.OutputBuffer, temp_buff, bytes)) { +			kfree(temp_buff);  			return -EFAULT; - -		if (IoBuffer.OutputLength > USHRT_MAX || -			IoBuffer.OutputLength == 0) { -			return -EINVAL; -		} - -		Bufflen = IoBuffer.OutputLength; -		temp_value = 4 - (Bufflen % 4); -		Bufflen += temp_value % 4; - -		temp_buff = kmalloc(Bufflen, GFP_KERNEL); -		if (!temp_buff) -			return -ENOMEM; - -		bytes = rdmalt(Adapter, (UINT)sRdmBuffer.Register, -				(PUINT)temp_buff, Bufflen); -		if (bytes > 0) { -			Status = STATUS_SUCCESS; -			if (copy_to_user(IoBuffer.OutputBuffer, temp_buff, bytes)) { -				kfree(temp_buff); -				return -EFAULT; -			} -		} else { -			Status = bytes;  		} - -		kfree(temp_buff); -		break; +	} else { +		Status = bytes;  	} -	case IOCTL_BCM_REGISTER_WRITE_PRIVATE: { -		struct bcm_wrm_buffer sWrmBuffer = {0}; -		UINT uiTempVar = 0; -		/* Copy Ioctl Buffer structure */ +	kfree(temp_buff); +	return Status; +} -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +static int bcm_char_ioctl_reg_write_private(void __user *argp, +					    struct bcm_mini_adapter *Adapter) +{ +	struct bcm_wrm_buffer sWrmBuffer = {0}; +	struct bcm_ioctl_buffer IoBuffer; +	UINT uiTempVar = 0; +	INT Status; -		if (IoBuffer.InputLength > sizeof(sWrmBuffer)) -			return -EINVAL; +	/* Copy Ioctl Buffer structure */ -		/* Get WrmBuffer structure */ -		if (copy_from_user(&sWrmBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength)) -			return -EFAULT; +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		uiTempVar = sWrmBuffer.Register & EEPROM_REJECT_MASK; -		if (!((Adapter->pstargetparams->m_u32Customize) & VSG_MODE) && -			((uiTempVar == EEPROM_REJECT_REG_1) || -				(uiTempVar == EEPROM_REJECT_REG_2) || -				(uiTempVar == EEPROM_REJECT_REG_3) || -				(uiTempVar == EEPROM_REJECT_REG_4))) { +	if (IoBuffer.InputLength > sizeof(sWrmBuffer)) +		return -EINVAL; -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "EEPROM Access Denied, not in VSG Mode\n"); -			return -EFAULT; -		} +	/* Get WrmBuffer structure */ +	if (copy_from_user(&sWrmBuffer, IoBuffer.InputBuffer, +		IoBuffer.InputLength)) +		return -EFAULT; -		Status = wrmalt(Adapter, (UINT)sWrmBuffer.Register, -				(PUINT)sWrmBuffer.Data, sizeof(ULONG)); +	uiTempVar = sWrmBuffer.Register & EEPROM_REJECT_MASK; +	if (!((Adapter->pstargetparams->m_u32Customize) & VSG_MODE) && +		((uiTempVar == EEPROM_REJECT_REG_1) || +			(uiTempVar == EEPROM_REJECT_REG_2) || +			(uiTempVar == EEPROM_REJECT_REG_3) || +			(uiTempVar == EEPROM_REJECT_REG_4))) { -		if (Status == STATUS_SUCCESS) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "WRM Done\n"); -		} else { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "WRM Failed\n"); -			Status = -EFAULT; -		} -		break; +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"EEPROM Access Denied, not in VSG Mode\n"); +		return -EFAULT;  	} -	case IOCTL_BCM_REGISTER_READ: -	case IOCTL_BCM_EEPROM_REGISTER_READ: { -		struct bcm_rdm_buffer sRdmBuffer = {0}; -		PCHAR temp_buff = NULL; -		UINT uiTempVar = 0; -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { +	Status = wrmalt(Adapter, (UINT)sWrmBuffer.Register, +			(PUINT)sWrmBuffer.Data, sizeof(ULONG)); -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Device in Idle Mode, Blocking Rdms\n"); -			return -EACCES; -		} +	if (Status == STATUS_SUCCESS) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, "WRM Done\n"); +	} else { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, "WRM Failed\n"); +		Status = -EFAULT; +	} +	return Status; +} -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +static int bcm_char_ioctl_eeprom_reg_read(void __user *argp, +					  struct bcm_mini_adapter *Adapter) +{ +	struct bcm_rdm_buffer sRdmBuffer = {0}; +	struct bcm_ioctl_buffer IoBuffer; +	PCHAR temp_buff = NULL; +	UINT uiTempVar = 0; +	INT Status; +	int bytes; -		if (IoBuffer.InputLength > sizeof(sRdmBuffer)) -			return -EINVAL; +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -		if (copy_from_user(&sRdmBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength)) -			return -EFAULT; +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Device in Idle Mode, Blocking Rdms\n"); +		return -EACCES; +	} -		if (IoBuffer.OutputLength > USHRT_MAX || -			IoBuffer.OutputLength == 0) { -			return -EINVAL; -		} +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		temp_buff = kmalloc(IoBuffer.OutputLength, GFP_KERNEL); -		if (!temp_buff) -			return STATUS_FAILURE; +	if (IoBuffer.InputLength > sizeof(sRdmBuffer)) +		return -EINVAL; -		if ((((ULONG)sRdmBuffer.Register & 0x0F000000) != 0x0F000000) || -			((ULONG)sRdmBuffer.Register & 0x3)) { +	if (copy_from_user(&sRdmBuffer, IoBuffer.InputBuffer, +		IoBuffer.InputLength)) +		return -EFAULT; -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "RDM Done On invalid Address : %x Access Denied.\n", -					(int)sRdmBuffer.Register); +	if (IoBuffer.OutputLength > USHRT_MAX || +		IoBuffer.OutputLength == 0) { +		return -EINVAL; +	} -			kfree(temp_buff); -			return -EINVAL; -		} +	temp_buff = kmalloc(IoBuffer.OutputLength, GFP_KERNEL); +	if (!temp_buff) +		return STATUS_FAILURE; -		uiTempVar = sRdmBuffer.Register & EEPROM_REJECT_MASK; -		bytes = rdmaltWithLock(Adapter, (UINT)sRdmBuffer.Register, (PUINT)temp_buff, IoBuffer.OutputLength); +	if ((((ULONG)sRdmBuffer.Register & 0x0F000000) != 0x0F000000) || +		((ULONG)sRdmBuffer.Register & 0x3)) { -		if (bytes > 0) { -			Status = STATUS_SUCCESS; -			if (copy_to_user(IoBuffer.OutputBuffer, temp_buff, bytes)) { -				kfree(temp_buff); -				return -EFAULT; -			} -		} else { -			Status = bytes; -		} +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"RDM Done On invalid Address : %x Access Denied.\n", +				(int)sRdmBuffer.Register);  		kfree(temp_buff); -		break; +		return -EINVAL;  	} -	case IOCTL_BCM_REGISTER_WRITE: -	case IOCTL_BCM_EEPROM_REGISTER_WRITE: { -		struct bcm_wrm_buffer sWrmBuffer = {0}; -		UINT uiTempVar = 0; -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { +	uiTempVar = sRdmBuffer.Register & EEPROM_REJECT_MASK; +	bytes = rdmaltWithLock(Adapter, (UINT)sRdmBuffer.Register, +			       (PUINT)temp_buff, IoBuffer.OutputLength); -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Device in Idle Mode, Blocking Wrms\n"); -			return -EACCES; +	if (bytes > 0) { +		Status = STATUS_SUCCESS; +		if (copy_to_user(IoBuffer.OutputBuffer, temp_buff, bytes)) { +			kfree(temp_buff); +			return -EFAULT;  		} +	} else { +		Status = bytes; +	} -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	kfree(temp_buff); +	return Status; +} -		if (IoBuffer.InputLength > sizeof(sWrmBuffer)) -			return -EINVAL; +static int bcm_char_ioctl_eeprom_reg_write(void __user *argp, +					   struct bcm_mini_adapter *Adapter, +					   UINT cmd) +{ +	struct bcm_wrm_buffer sWrmBuffer = {0}; +	struct bcm_ioctl_buffer IoBuffer; +	UINT uiTempVar = 0; +	INT Status; -		/* Get WrmBuffer structure */ -		if (copy_from_user(&sWrmBuffer, IoBuffer.InputBuffer, IoBuffer.InputLength)) -			return -EFAULT; +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -		if ((((ULONG)sWrmBuffer.Register & 0x0F000000) != 0x0F000000) || -			((ULONG)sWrmBuffer.Register & 0x3)) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Device in Idle Mode, Blocking Wrms\n"); +		return -EACCES; +	} -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "WRM Done On invalid Address : %x Access Denied.\n", (int)sWrmBuffer.Register); -			return -EINVAL; -		} +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		uiTempVar = sWrmBuffer.Register & EEPROM_REJECT_MASK; -		if (!((Adapter->pstargetparams->m_u32Customize) & VSG_MODE) && -				((uiTempVar == EEPROM_REJECT_REG_1) || -				(uiTempVar == EEPROM_REJECT_REG_2) || -				(uiTempVar == EEPROM_REJECT_REG_3) || -				(uiTempVar == EEPROM_REJECT_REG_4)) && -				(cmd == IOCTL_BCM_REGISTER_WRITE)) { +	if (IoBuffer.InputLength > sizeof(sWrmBuffer)) +		return -EINVAL; -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "EEPROM Access Denied, not in VSG Mode\n"); -				return -EFAULT; -		} +	/* Get WrmBuffer structure */ +	if (copy_from_user(&sWrmBuffer, IoBuffer.InputBuffer, +		IoBuffer.InputLength)) +		return -EFAULT; -		Status = wrmaltWithLock(Adapter, (UINT)sWrmBuffer.Register, -					(PUINT)sWrmBuffer.Data, sWrmBuffer.Length); +	if ((((ULONG)sWrmBuffer.Register & 0x0F000000) != 0x0F000000) || +		((ULONG)sWrmBuffer.Register & 0x3)) { -		if (Status == STATUS_SUCCESS) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, OSAL_DBG, DBG_LVL_ALL, "WRM Done\n"); -		} else { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "WRM Failed\n"); -			Status = -EFAULT; -		} -		break; +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"WRM Done On invalid Address : %x Access Denied.\n", +				(int)sWrmBuffer.Register); +		return -EINVAL;  	} -	case IOCTL_BCM_GPIO_SET_REQUEST: { -		UCHAR ucResetValue[4]; -		UINT value = 0; -		UINT uiBit = 0; -		UINT uiOperation = 0; -		struct bcm_gpio_info gpio_info = {0}; - -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "GPIO Can't be set/clear in Low power Mode"); -			return -EACCES; -		} +	uiTempVar = sWrmBuffer.Register & EEPROM_REJECT_MASK; +	if (!((Adapter->pstargetparams->m_u32Customize) & VSG_MODE) && +			((uiTempVar == EEPROM_REJECT_REG_1) || +			(uiTempVar == EEPROM_REJECT_REG_2) || +			(uiTempVar == EEPROM_REJECT_REG_3) || +			(uiTempVar == EEPROM_REJECT_REG_4)) && +			(cmd == IOCTL_BCM_REGISTER_WRITE)) { -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +					"EEPROM Access Denied, not in VSG Mode\n");  			return -EFAULT; +	} -		if (IoBuffer.InputLength > sizeof(gpio_info)) -			return -EINVAL; +	Status = wrmaltWithLock(Adapter, (UINT)sWrmBuffer.Register, +				(PUINT)sWrmBuffer.Data, +				sWrmBuffer.Length); -		if (copy_from_user(&gpio_info, IoBuffer.InputBuffer, IoBuffer.InputLength)) -			return -EFAULT; +	if (Status == STATUS_SUCCESS) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, OSAL_DBG, +				DBG_LVL_ALL, "WRM Done\n"); +	} else { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, "WRM Failed\n"); +		Status = -EFAULT; +	} +	return Status; +} -		uiBit  = gpio_info.uiGpioNumber; -		uiOperation = gpio_info.uiGpioValue; -		value = (1<<uiBit); +static int bcm_char_ioctl_gpio_set_request(void __user *argp, +					   struct bcm_mini_adapter *Adapter) +{ +	struct bcm_gpio_info gpio_info = {0}; +	struct bcm_ioctl_buffer IoBuffer; +	UCHAR ucResetValue[4]; +	UINT value = 0; +	UINT uiBit = 0; +	UINT uiOperation = 0; +	INT Status; +	int bytes; -		if (IsReqGpioIsLedInNVM(Adapter, value) == FALSE) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Sorry, Requested GPIO<0x%X> is not correspond to LED !!!", value); -			Status = -EINVAL; -			break; -		} +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -		/* Set - setting 1 */ -		if (uiOperation) { -			/* Set the gpio output register */ -			Status = wrmaltWithLock(Adapter, BCM_GPIO_OUTPUT_SET_REG, (PUINT)(&value), sizeof(UINT)); +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, +				"GPIO Can't be set/clear in Low power Mode"); +		return -EACCES; +	} -			if (Status == STATUS_SUCCESS) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Set the GPIO bit\n"); -			} else { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Failed to set the %dth GPIO\n", uiBit); -				break; -			} -		} else { -			/* Set the gpio output register */ -			Status = wrmaltWithLock(Adapter, BCM_GPIO_OUTPUT_CLR_REG, (PUINT)(&value), sizeof(UINT)); +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -			if (Status == STATUS_SUCCESS) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Set the GPIO bit\n"); -			} else { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Failed to clear the %dth GPIO\n", uiBit); -				break; -			} -		} +	if (IoBuffer.InputLength > sizeof(gpio_info)) +		return -EINVAL; -		bytes = rdmaltWithLock(Adapter, (UINT)GPIO_MODE_REGISTER, (PUINT)ucResetValue, sizeof(UINT)); -		if (bytes < 0) { -			Status = bytes; -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, -					"GPIO_MODE_REGISTER read failed"); -			break; +	if (copy_from_user(&gpio_info, IoBuffer.InputBuffer, +			   IoBuffer.InputLength)) +		return -EFAULT; + +	uiBit  = gpio_info.uiGpioNumber; +	uiOperation = gpio_info.uiGpioValue; +	value = (1<<uiBit); + +	if (IsReqGpioIsLedInNVM(Adapter, value) == false) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, +				"Sorry, Requested GPIO<0x%X> is not correspond to LED !!!", +				value); +		return -EINVAL; +	} + +	/* Set - setting 1 */ +	if (uiOperation) { +		/* Set the gpio output register */ +		Status = wrmaltWithLock(Adapter, +					BCM_GPIO_OUTPUT_SET_REG, +					(PUINT)(&value), sizeof(UINT)); + +		if (Status == STATUS_SUCCESS) { +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, +					OSAL_DBG, DBG_LVL_ALL, +					"Set the GPIO bit\n");  		} else { -			Status = STATUS_SUCCESS; +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, +					OSAL_DBG, DBG_LVL_ALL, +					"Failed to set the %dth GPIO\n", +					uiBit); +			return Status;  		} - -		/* Set the gpio mode register to output */ -		*(UINT *)ucResetValue |= (1<<uiBit); -		Status = wrmaltWithLock(Adapter, GPIO_MODE_REGISTER, -					(PUINT)ucResetValue, sizeof(UINT)); +	} else { +		/* Set the gpio output register */ +		Status = wrmaltWithLock(Adapter, +					BCM_GPIO_OUTPUT_CLR_REG, +					(PUINT)(&value), sizeof(UINT));  		if (Status == STATUS_SUCCESS) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Set the GPIO to output Mode\n"); +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, +					OSAL_DBG, DBG_LVL_ALL, +					"Set the GPIO bit\n");  		} else { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Failed to put GPIO in Output Mode\n"); -			break; +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, +					OSAL_DBG, DBG_LVL_ALL, +					"Failed to clear the %dth GPIO\n", +					uiBit); +			return Status;  		}  	} -	break; -	case BCM_LED_THREAD_STATE_CHANGE_REQ: { -		struct bcm_user_thread_req threadReq = {0}; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "User made LED thread InActive"); +	bytes = rdmaltWithLock(Adapter, (UINT)GPIO_MODE_REGISTER, +			       (PUINT)ucResetValue, sizeof(UINT)); +	if (bytes < 0) { +		Status = bytes; +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"GPIO_MODE_REGISTER read failed"); +		return Status; +	} else { +		Status = STATUS_SUCCESS; +	} -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { +	/* Set the gpio mode register to output */ +	*(UINT *)ucResetValue |= (1<<uiBit); +	Status = wrmaltWithLock(Adapter, GPIO_MODE_REGISTER, +				(PUINT)ucResetValue, sizeof(UINT)); -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "GPIO Can't be set/clear in Low power Mode"); -			Status = -EACCES; -			break; -		} +	if (Status == STATUS_SUCCESS) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, +				"Set the GPIO to output Mode\n"); +	} else { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, +				"Failed to put GPIO in Output Mode\n"); +	} -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	return Status; +} -		if (IoBuffer.InputLength > sizeof(threadReq)) -			return -EINVAL; +static int bcm_char_ioctl_led_thread_state_change_req(void __user *argp, +		struct bcm_mini_adapter *Adapter) +{ +	struct bcm_user_thread_req threadReq = {0}; +	struct bcm_ioctl_buffer IoBuffer; -		if (copy_from_user(&threadReq, IoBuffer.InputBuffer, IoBuffer.InputLength)) -			return -EFAULT; +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"User made LED thread InActive"); -		/* if LED thread is running(Actively or Inactively) set it state to make inactive */ -		if (Adapter->LEDInfo.led_thread_running) { -			if (threadReq.ThreadState == LED_THREAD_ACTIVATION_REQ) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Activating thread req"); -				Adapter->DriverState = LED_THREAD_ACTIVE; -			} else { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "DeActivating Thread req....."); -				Adapter->DriverState = LED_THREAD_INACTIVE; -			} +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -			/* signal thread. */ -			wake_up(&Adapter->LEDInfo.notify_led_event); -		} +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, +				"GPIO Can't be set/clear in Low power Mode"); +		return -EACCES;  	} -	break; - -	case IOCTL_BCM_GPIO_STATUS_REQUEST: { -		ULONG uiBit = 0; -		UCHAR ucRead[4]; -		struct bcm_gpio_info gpio_info = {0}; -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) -			return -EACCES; - -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; - -		if (IoBuffer.InputLength > sizeof(gpio_info)) -			return -EINVAL; - -		if (copy_from_user(&gpio_info, IoBuffer.InputBuffer, IoBuffer.InputLength)) -			return -EFAULT; +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		uiBit = gpio_info.uiGpioNumber; +	if (IoBuffer.InputLength > sizeof(threadReq)) +		return -EINVAL; -		/* Set the gpio output register */ -		bytes = rdmaltWithLock(Adapter, (UINT)GPIO_PIN_STATE_REGISTER, -					(PUINT)ucRead, sizeof(UINT)); +	if (copy_from_user(&threadReq, IoBuffer.InputBuffer, +			   IoBuffer.InputLength)) +		return -EFAULT; -		if (bytes < 0) { -			Status = bytes; -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "RDM Failed\n"); -			return Status; +	/* if LED thread is running(Actively or Inactively) +	 * set it state to make inactive +	 */ +	if (Adapter->LEDInfo.led_thread_running) { +		if (threadReq.ThreadState == LED_THREAD_ACTIVATION_REQ) { +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, +					OSAL_DBG, DBG_LVL_ALL, +					"Activating thread req"); +			Adapter->DriverState = LED_THREAD_ACTIVE;  		} else { -			Status = STATUS_SUCCESS; +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, +					OSAL_DBG, DBG_LVL_ALL, +					"DeActivating Thread req....."); +			Adapter->DriverState = LED_THREAD_INACTIVE;  		} + +		/* signal thread. */ +		wake_up(&Adapter->LEDInfo.notify_led_event);  	} -	break; +	return STATUS_SUCCESS; +} -	case IOCTL_BCM_GPIO_MULTI_REQUEST: { -		UCHAR ucResetValue[4]; -		struct bcm_gpio_multi_info gpio_multi_info[MAX_IDX]; -		struct bcm_gpio_multi_info *pgpio_multi_info = (struct bcm_gpio_multi_info *)gpio_multi_info; +static int bcm_char_ioctl_gpio_status_request(void __user *argp, +		struct bcm_mini_adapter *Adapter) +{ +	struct bcm_gpio_info gpio_info = {0}; +	struct bcm_ioctl_buffer IoBuffer; +	ULONG uiBit = 0; +	UCHAR ucRead[4]; +	INT Status; +	int bytes; -		memset(pgpio_multi_info, 0, MAX_IDX * sizeof(struct bcm_gpio_multi_info)); +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) +		return -EACCES; -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) -			return -EINVAL; +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	if (IoBuffer.InputLength > sizeof(gpio_info)) +		return -EINVAL; -		if (IoBuffer.InputLength > sizeof(gpio_multi_info)) -			return -EINVAL; +	if (copy_from_user(&gpio_info, IoBuffer.InputBuffer, +		IoBuffer.InputLength)) +		return -EFAULT; -		if (copy_from_user(&gpio_multi_info, IoBuffer.InputBuffer, IoBuffer.InputLength)) -			return -EFAULT; +	uiBit = gpio_info.uiGpioNumber; -		if (IsReqGpioIsLedInNVM(Adapter, pgpio_multi_info[WIMAX_IDX].uiGPIOMask) == FALSE) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, -					"Sorry, Requested GPIO<0x%X> is not correspond to NVM LED bit map<0x%X>!!!", -					pgpio_multi_info[WIMAX_IDX].uiGPIOMask, Adapter->gpioBitMap); -			Status = -EINVAL; -			break; -		} +	/* Set the gpio output register */ +	bytes = rdmaltWithLock(Adapter, (UINT)GPIO_PIN_STATE_REGISTER, +				(PUINT)ucRead, sizeof(UINT)); -		/* Set the gpio output register */ -		if ((pgpio_multi_info[WIMAX_IDX].uiGPIOMask) & -			(pgpio_multi_info[WIMAX_IDX].uiGPIOCommand)) { -			/* Set 1's in GPIO OUTPUT REGISTER */ -			*(UINT *)ucResetValue =  pgpio_multi_info[WIMAX_IDX].uiGPIOMask & -				pgpio_multi_info[WIMAX_IDX].uiGPIOCommand & -				pgpio_multi_info[WIMAX_IDX].uiGPIOValue; - -			if (*(UINT *) ucResetValue) -				Status = wrmaltWithLock(Adapter, BCM_GPIO_OUTPUT_SET_REG, -							(PUINT)ucResetValue, sizeof(ULONG)); - -			if (Status != STATUS_SUCCESS) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "WRM to BCM_GPIO_OUTPUT_SET_REG Failed."); -				return Status; -			} +	if (bytes < 0) { +		Status = bytes; +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"RDM Failed\n"); +		return Status; +	} else { +		Status = STATUS_SUCCESS; +	} +	return Status; +} -			/* Clear to 0's in GPIO OUTPUT REGISTER */ -			*(UINT *)ucResetValue = (pgpio_multi_info[WIMAX_IDX].uiGPIOMask & -						pgpio_multi_info[WIMAX_IDX].uiGPIOCommand & -						(~(pgpio_multi_info[WIMAX_IDX].uiGPIOValue))); +static int bcm_char_ioctl_gpio_multi_request(void __user *argp, +		struct bcm_mini_adapter *Adapter) +{ +	struct bcm_gpio_multi_info gpio_multi_info[MAX_IDX]; +	struct bcm_gpio_multi_info *pgpio_multi_info = +		(struct bcm_gpio_multi_info *)gpio_multi_info; +	struct bcm_ioctl_buffer IoBuffer; +	UCHAR ucResetValue[4]; +	INT Status = STATUS_FAILURE; +	int bytes; -			if (*(UINT *) ucResetValue) -				Status = wrmaltWithLock(Adapter, BCM_GPIO_OUTPUT_CLR_REG, (PUINT)ucResetValue, sizeof(ULONG)); +	memset(pgpio_multi_info, 0, +	       MAX_IDX * sizeof(struct bcm_gpio_multi_info)); -			if (Status != STATUS_SUCCESS) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "WRM to BCM_GPIO_OUTPUT_CLR_REG Failed."); -				return Status; -			} -		} +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) +		return -EINVAL; -		if (pgpio_multi_info[WIMAX_IDX].uiGPIOMask) { -			bytes = rdmaltWithLock(Adapter, (UINT)GPIO_PIN_STATE_REGISTER, (PUINT)ucResetValue, sizeof(UINT)); +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -			if (bytes < 0) { -				Status = bytes; -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "RDM to GPIO_PIN_STATE_REGISTER Failed."); -				return Status; -			} else { -				Status = STATUS_SUCCESS; -			} +	if (IoBuffer.InputLength > sizeof(gpio_multi_info)) +		return -EINVAL; +	if (IoBuffer.OutputLength > sizeof(gpio_multi_info)) +		IoBuffer.OutputLength = sizeof(gpio_multi_info); -			pgpio_multi_info[WIMAX_IDX].uiGPIOValue = (*(UINT *)ucResetValue & -								pgpio_multi_info[WIMAX_IDX].uiGPIOMask); -		} +	if (copy_from_user(&gpio_multi_info, IoBuffer.InputBuffer, +			   IoBuffer.InputLength)) +		return -EFAULT; -		Status = copy_to_user(IoBuffer.OutputBuffer, &gpio_multi_info, IoBuffer.OutputLength); -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -					"Failed while copying Content to IOBufer for user space err:%d", Status); -			return -EFAULT; -		} +	if (IsReqGpioIsLedInNVM(Adapter, pgpio_multi_info[WIMAX_IDX].uiGPIOMask) +			== false) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, +				"Sorry, Requested GPIO<0x%X> is not correspond to NVM LED bit map<0x%X>!!!", +				pgpio_multi_info[WIMAX_IDX].uiGPIOMask, +				Adapter->gpioBitMap); +		return -EINVAL;  	} -	break; -	case IOCTL_BCM_GPIO_MODE_REQUEST: { -		UCHAR ucResetValue[4]; -		struct bcm_gpio_multi_mode gpio_multi_mode[MAX_IDX]; -		struct bcm_gpio_multi_mode *pgpio_multi_mode = (struct bcm_gpio_multi_mode *)gpio_multi_mode; +	/* Set the gpio output register */ +	if ((pgpio_multi_info[WIMAX_IDX].uiGPIOMask) & +		(pgpio_multi_info[WIMAX_IDX].uiGPIOCommand)) { +		/* Set 1's in GPIO OUTPUT REGISTER */ +		*(UINT *)ucResetValue = pgpio_multi_info[WIMAX_IDX].uiGPIOMask & +			pgpio_multi_info[WIMAX_IDX].uiGPIOCommand & +			pgpio_multi_info[WIMAX_IDX].uiGPIOValue; -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) -			return -EINVAL; +		if (*(UINT *) ucResetValue) +			Status = wrmaltWithLock(Adapter, +				BCM_GPIO_OUTPUT_SET_REG, +				(PUINT)ucResetValue, sizeof(ULONG)); -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +		if (Status != STATUS_SUCCESS) { +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"WRM to BCM_GPIO_OUTPUT_SET_REG Failed."); +			return Status; +		} -		if (IoBuffer.InputLength > sizeof(gpio_multi_mode)) -			return -EINVAL; +		/* Clear to 0's in GPIO OUTPUT REGISTER */ +		*(UINT *)ucResetValue = +			(pgpio_multi_info[WIMAX_IDX].uiGPIOMask & +			pgpio_multi_info[WIMAX_IDX].uiGPIOCommand & +			(~(pgpio_multi_info[WIMAX_IDX].uiGPIOValue))); -		if (copy_from_user(&gpio_multi_mode, IoBuffer.InputBuffer, IoBuffer.InputLength)) -			return -EFAULT; +		if (*(UINT *) ucResetValue) +			Status = wrmaltWithLock(Adapter, +				BCM_GPIO_OUTPUT_CLR_REG, (PUINT)ucResetValue, +				sizeof(ULONG)); + +		if (Status != STATUS_SUCCESS) { +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +					"WRM to BCM_GPIO_OUTPUT_CLR_REG Failed."); +			return Status; +		} +	} -		bytes = rdmaltWithLock(Adapter, (UINT)GPIO_MODE_REGISTER, (PUINT)ucResetValue, sizeof(UINT)); +	if (pgpio_multi_info[WIMAX_IDX].uiGPIOMask) { +		bytes = rdmaltWithLock(Adapter, (UINT)GPIO_PIN_STATE_REGISTER, +				       (PUINT)ucResetValue, sizeof(UINT));  		if (bytes < 0) {  			Status = bytes; -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Read of GPIO_MODE_REGISTER failed"); +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +					"RDM to GPIO_PIN_STATE_REGISTER Failed.");  			return Status;  		} else {  			Status = STATUS_SUCCESS;  		} -		/* Validating the request */ -		if (IsReqGpioIsLedInNVM(Adapter, pgpio_multi_mode[WIMAX_IDX].uiGPIOMask) == FALSE) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, -					"Sorry, Requested GPIO<0x%X> is not correspond to NVM LED bit map<0x%X>!!!", -					pgpio_multi_mode[WIMAX_IDX].uiGPIOMask, Adapter->gpioBitMap); -			Status = -EINVAL; -			break; -		} +		pgpio_multi_info[WIMAX_IDX].uiGPIOValue = +			(*(UINT *)ucResetValue & +			pgpio_multi_info[WIMAX_IDX].uiGPIOMask); +	} -		if (pgpio_multi_mode[WIMAX_IDX].uiGPIOMask) { -			/* write all OUT's (1's) */ -			*(UINT *) ucResetValue |= (pgpio_multi_mode[WIMAX_IDX].uiGPIOMode & -						pgpio_multi_mode[WIMAX_IDX].uiGPIOMask); +	Status = copy_to_user(IoBuffer.OutputBuffer, &gpio_multi_info, +		IoBuffer.OutputLength); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Failed while copying Content to IOBufer for user space err:%d", +			Status); +		return -EFAULT; +	} +	return Status; +} -			/* write all IN's (0's) */ -			*(UINT *) ucResetValue &= ~((~pgpio_multi_mode[WIMAX_IDX].uiGPIOMode) & -						pgpio_multi_mode[WIMAX_IDX].uiGPIOMask); +static int bcm_char_ioctl_gpio_mode_request(void __user *argp, +		struct bcm_mini_adapter *Adapter) +{ +	struct bcm_gpio_multi_mode gpio_multi_mode[MAX_IDX]; +	struct bcm_gpio_multi_mode *pgpio_multi_mode = +		(struct bcm_gpio_multi_mode *)gpio_multi_mode; +	struct bcm_ioctl_buffer IoBuffer; +	UCHAR ucResetValue[4]; +	INT Status; +	int bytes; -			/* Currently implemented return the modes of all GPIO's -			 * else needs to bit AND with  mask -			 */ -			pgpio_multi_mode[WIMAX_IDX].uiGPIOMode = *(UINT *)ucResetValue; +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) +		return -EINVAL; -			Status = wrmaltWithLock(Adapter, GPIO_MODE_REGISTER, (PUINT)ucResetValue, sizeof(ULONG)); -			if (Status == STATUS_SUCCESS) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, -						"WRM to GPIO_MODE_REGISTER Done"); -			} else { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -						"WRM to GPIO_MODE_REGISTER Failed"); -				Status = -EFAULT; -				break; -			} -		} else { -/* if uiGPIOMask is 0 then return mode register configuration */ -			pgpio_multi_mode[WIMAX_IDX].uiGPIOMode = *(UINT *)ucResetValue; -		} +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		Status = copy_to_user(IoBuffer.OutputBuffer, &gpio_multi_mode, IoBuffer.OutputLength); -		if (Status) { +	if (IoBuffer.InputLength > sizeof(gpio_multi_mode)) +		return -EINVAL; +	if (IoBuffer.OutputLength > sizeof(gpio_multi_mode)) +		IoBuffer.OutputLength = sizeof(gpio_multi_mode); + +	if (copy_from_user(&gpio_multi_mode, IoBuffer.InputBuffer, +		IoBuffer.InputLength)) +		return -EFAULT; + +	bytes = rdmaltWithLock(Adapter, (UINT)GPIO_MODE_REGISTER, +		(PUINT)ucResetValue, sizeof(UINT)); + +	if (bytes < 0) { +		Status = bytes; +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Read of GPIO_MODE_REGISTER failed"); +		return Status; +	} else { +		Status = STATUS_SUCCESS; +	} + +	/* Validating the request */ +	if (IsReqGpioIsLedInNVM(Adapter, pgpio_multi_mode[WIMAX_IDX].uiGPIOMask) +			== false) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"Sorry, Requested GPIO<0x%X> is not correspond to NVM LED bit map<0x%X>!!!", +				pgpio_multi_mode[WIMAX_IDX].uiGPIOMask, +				Adapter->gpioBitMap); +		return -EINVAL; +	} + +	if (pgpio_multi_mode[WIMAX_IDX].uiGPIOMask) { +		/* write all OUT's (1's) */ +		*(UINT *) ucResetValue |= +			(pgpio_multi_mode[WIMAX_IDX].uiGPIOMode & +					pgpio_multi_mode[WIMAX_IDX].uiGPIOMask); + +		/* write all IN's (0's) */ +		*(UINT *) ucResetValue &= +			~((~pgpio_multi_mode[WIMAX_IDX].uiGPIOMode) & +					pgpio_multi_mode[WIMAX_IDX].uiGPIOMask); + +		/* Currently implemented return the modes of all GPIO's +		 * else needs to bit AND with  mask +		 */ +		pgpio_multi_mode[WIMAX_IDX].uiGPIOMode = *(UINT *)ucResetValue; + +		Status = wrmaltWithLock(Adapter, GPIO_MODE_REGISTER, +			(PUINT)ucResetValue, sizeof(ULONG)); +		if (Status == STATUS_SUCCESS) { +			BCM_DEBUG_PRINT(Adapter, +				DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"WRM to GPIO_MODE_REGISTER Done"); +		} else {  			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -					"Failed while copying Content to IOBufer for user space err:%d", Status); +					"WRM to GPIO_MODE_REGISTER Failed");  			return -EFAULT;  		} +	} else { +		/* if uiGPIOMask is 0 then return mode register configuration */ +		pgpio_multi_mode[WIMAX_IDX].uiGPIOMode = *(UINT *)ucResetValue;  	} -	break; -	case IOCTL_MAC_ADDR_REQ: -	case IOCTL_LINK_REQ: -	case IOCTL_CM_REQUEST: -	case IOCTL_SS_INFO_REQ: -	case IOCTL_SEND_CONTROL_MESSAGE: -	case IOCTL_IDLE_REQ: { -		PVOID pvBuffer = NULL; +	Status = copy_to_user(IoBuffer.OutputBuffer, &gpio_multi_mode, +		IoBuffer.OutputLength); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Failed while copying Content to IOBufer for user space err:%d", +			Status); +		return -EFAULT; +	} +	return Status; +} -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +static int bcm_char_ioctl_misc_request(void __user *argp, +		struct bcm_mini_adapter *Adapter) +{ +	struct bcm_ioctl_buffer IoBuffer; +	PVOID pvBuffer = NULL; +	INT Status; -		if (IoBuffer.InputLength < sizeof(struct bcm_link_request)) -			return -EINVAL; +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		if (IoBuffer.InputLength > MAX_CNTL_PKT_SIZE) -			return -EINVAL; +	if (IoBuffer.InputLength < sizeof(struct bcm_link_request)) +		return -EINVAL; -		pvBuffer = memdup_user(IoBuffer.InputBuffer, -				       IoBuffer.InputLength); -		if (IS_ERR(pvBuffer)) -			return PTR_ERR(pvBuffer); - -		down(&Adapter->LowPowerModeSync); -		Status = wait_event_interruptible_timeout(Adapter->lowpower_mode_wait_queue, -							!Adapter->bPreparingForLowPowerMode, -							(1 * HZ)); -		if (Status == -ERESTARTSYS) -			goto cntrlEnd; - -		if (Adapter->bPreparingForLowPowerMode) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, -					"Preparing Idle Mode is still True - Hence Rejecting control message\n"); -			Status = STATUS_FAILURE; -			goto cntrlEnd; -		} -		Status = CopyBufferToControlPacket(Adapter, (PVOID)pvBuffer); +	if (IoBuffer.InputLength > MAX_CNTL_PKT_SIZE) +		return -EINVAL; -cntrlEnd: -		up(&Adapter->LowPowerModeSync); -		kfree(pvBuffer); -		break; -	} +	pvBuffer = memdup_user(IoBuffer.InputBuffer, +			       IoBuffer.InputLength); +	if (IS_ERR(pvBuffer)) +		return PTR_ERR(pvBuffer); -	case IOCTL_BCM_BUFFER_DOWNLOAD_START: { -		if (down_trylock(&Adapter->NVMRdmWrmLock)) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, -					"IOCTL_BCM_CHIP_RESET not allowed as EEPROM Read/Write is in progress\n"); -			return -EACCES; -		} +	down(&Adapter->LowPowerModeSync); +	Status = wait_event_interruptible_timeout( +			Adapter->lowpower_mode_wait_queue, +			!Adapter->bPreparingForLowPowerMode, +			(1 * HZ)); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -				"Starting the firmware download PID =0x%x!!!!\n", current->pid); - -		if (down_trylock(&Adapter->fw_download_sema)) -			return -EBUSY; - -		Adapter->bBinDownloaded = FALSE; -		Adapter->fw_download_process_pid = current->pid; -		Adapter->bCfgDownloaded = FALSE; -		Adapter->fw_download_done = FALSE; -		netif_carrier_off(Adapter->dev); -		netif_stop_queue(Adapter->dev); -		Status = reset_card_proc(Adapter); -		if (Status) { -			pr_err(PFX "%s: reset_card_proc Failed!\n", Adapter->dev->name); -			up(&Adapter->fw_download_sema); -			up(&Adapter->NVMRdmWrmLock); -			return Status; -		} -		mdelay(10); +	if (Status == -ERESTARTSYS) +		goto cntrlEnd; -		up(&Adapter->NVMRdmWrmLock); -		return Status; +	if (Adapter->bPreparingForLowPowerMode) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"Preparing Idle Mode is still True - Hence Rejecting control message\n"); +		Status = STATUS_FAILURE; +		goto cntrlEnd;  	} +	Status = CopyBufferToControlPacket(Adapter, (PVOID)pvBuffer); -	case IOCTL_BCM_BUFFER_DOWNLOAD: { -		struct bcm_firmware_info *psFwInfo = NULL; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Starting the firmware download PID =0x%x!!!!\n", current->pid); +cntrlEnd: +	up(&Adapter->LowPowerModeSync); +	kfree(pvBuffer); +	return Status; +} -		if (!down_trylock(&Adapter->fw_download_sema)) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -					"Invalid way to download buffer. Use Start and then call this!!!\n"); -			up(&Adapter->fw_download_sema); -			Status = -EINVAL; -			return Status; -		} +static int bcm_char_ioctl_buffer_download_start( +		struct bcm_mini_adapter *Adapter) +{ +	INT Status; -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) { -			up(&Adapter->fw_download_sema); -			return -EFAULT; -		} +	if (down_trylock(&Adapter->NVMRdmWrmLock)) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"IOCTL_BCM_CHIP_RESET not allowed as EEPROM Read/Write is in progress\n"); +		return -EACCES; +	} -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -				"Length for FW DLD is : %lx\n", IoBuffer.InputLength); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Starting the firmware download PID =0x%x!!!!\n", +			current->pid); + +	if (down_trylock(&Adapter->fw_download_sema)) +		return -EBUSY; + +	Adapter->bBinDownloaded = false; +	Adapter->fw_download_process_pid = current->pid; +	Adapter->bCfgDownloaded = false; +	Adapter->fw_download_done = false; +	netif_carrier_off(Adapter->dev); +	netif_stop_queue(Adapter->dev); +	Status = reset_card_proc(Adapter); +	if (Status) { +		pr_err(PFX "%s: reset_card_proc Failed!\n", Adapter->dev->name); +		up(&Adapter->fw_download_sema); +		up(&Adapter->NVMRdmWrmLock); +		return Status; +	} +	mdelay(10); -		if (IoBuffer.InputLength > sizeof(struct bcm_firmware_info)) { -			up(&Adapter->fw_download_sema); -			return -EINVAL; -		} +	up(&Adapter->NVMRdmWrmLock); +	return Status; +} -		psFwInfo = kmalloc(sizeof(*psFwInfo), GFP_KERNEL); -		if (!psFwInfo) { -			up(&Adapter->fw_download_sema); -			return -ENOMEM; -		} +static int bcm_char_ioctl_buffer_download(void __user *argp, +		struct bcm_mini_adapter *Adapter) +{ +	struct bcm_firmware_info *psFwInfo = NULL; +	struct bcm_ioctl_buffer IoBuffer; +	INT Status; -		if (copy_from_user(psFwInfo, IoBuffer.InputBuffer, IoBuffer.InputLength)) { -			up(&Adapter->fw_download_sema); -			kfree(psFwInfo); -			return -EFAULT; -		} +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +		"Starting the firmware download PID =0x%x!!!!\n", current->pid); -		if (!psFwInfo->pvMappedFirmwareAddress || -			(psFwInfo->u32FirmwareLength == 0)) { +	if (!down_trylock(&Adapter->fw_download_sema)) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Invalid way to download buffer. Use Start and then call this!!!\n"); +		up(&Adapter->fw_download_sema); +		return -EINVAL; +	} -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Something else is wrong %lu\n", -					psFwInfo->u32FirmwareLength); -			up(&Adapter->fw_download_sema); -			kfree(psFwInfo); -			Status = -EINVAL; -			return Status; -		} +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) { +		up(&Adapter->fw_download_sema); +		return -EFAULT; +	} -		Status = bcm_ioctl_fw_download(Adapter, psFwInfo); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Length for FW DLD is : %lx\n", IoBuffer.InputLength); -		if (Status != STATUS_SUCCESS) { -			if (psFwInfo->u32StartingAddress == CONFIG_BEGIN_ADDR) -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "IOCTL: Configuration File Upload Failed\n"); -			else -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0,	"IOCTL: Firmware File Upload Failed\n"); +	if (IoBuffer.InputLength > sizeof(struct bcm_firmware_info)) { +		up(&Adapter->fw_download_sema); +		return -EINVAL; +	} -			/* up(&Adapter->fw_download_sema); */ +	psFwInfo = kmalloc(sizeof(*psFwInfo), GFP_KERNEL); +	if (!psFwInfo) { +		up(&Adapter->fw_download_sema); +		return -ENOMEM; +	} -			if (Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY) { -				Adapter->DriverState = DRIVER_INIT; -				Adapter->LEDInfo.bLedInitDone = FALSE; -				wake_up(&Adapter->LEDInfo.notify_led_event); -			} -		} +	if (copy_from_user(psFwInfo, IoBuffer.InputBuffer, +		IoBuffer.InputLength)) { +		up(&Adapter->fw_download_sema); +		kfree(psFwInfo); +		return -EFAULT; +	} -		if (Status != STATUS_SUCCESS) -			up(&Adapter->fw_download_sema); +	if (!psFwInfo->pvMappedFirmwareAddress || +		(psFwInfo->u32FirmwareLength == 0)) { -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, OSAL_DBG, DBG_LVL_ALL, "IOCTL: Firmware File Uploaded\n"); +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Something else is wrong %lu\n", +				psFwInfo->u32FirmwareLength); +		up(&Adapter->fw_download_sema);  		kfree(psFwInfo); +		Status = -EINVAL;  		return Status;  	} -	case IOCTL_BCM_BUFFER_DOWNLOAD_STOP: { -		if (!down_trylock(&Adapter->fw_download_sema)) { -			up(&Adapter->fw_download_sema); -			return -EINVAL; -		} +	Status = bcm_ioctl_fw_download(Adapter, psFwInfo); -		if (down_trylock(&Adapter->NVMRdmWrmLock)) { +	if (Status != STATUS_SUCCESS) { +		if (psFwInfo->u32StartingAddress == CONFIG_BEGIN_ADDR)  			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -					"FW download blocked as EEPROM Read/Write is in progress\n"); -			up(&Adapter->fw_download_sema); -			return -EACCES; -		} - -		Adapter->bBinDownloaded = TRUE; -		Adapter->bCfgDownloaded = TRUE; -		atomic_set(&Adapter->CurrNumFreeTxDesc, 0); -		Adapter->CurrNumRecvDescs = 0; -		Adapter->downloadDDR = 0; +				"IOCTL: Configuration File Upload Failed\n"); +		else +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"IOCTL: Firmware File Upload Failed\n"); -		/* setting the Mips to Run */ -		Status = run_card_proc(Adapter); +		/* up(&Adapter->fw_download_sema); */ -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Firm Download Failed\n"); -			up(&Adapter->fw_download_sema); -			up(&Adapter->NVMRdmWrmLock); -			return Status; -		} else { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, -					DBG_LVL_ALL, "Firm Download Over...\n"); -		} - -		mdelay(10); - -		/* Wait for MailBox Interrupt */ -		if (StartInterruptUrb((struct bcm_interface_adapter *)Adapter->pvInterfaceAdapter)) -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Unable to send interrupt...\n"); - -		timeout = 5*HZ; -		Adapter->waiting_to_fw_download_done = FALSE; -		wait_event_timeout(Adapter->ioctl_fw_dnld_wait_queue, -				Adapter->waiting_to_fw_download_done, timeout); -		Adapter->fw_download_process_pid = INVALID_PID; -		Adapter->fw_download_done = TRUE; -		atomic_set(&Adapter->CurrNumFreeTxDesc, 0); -		Adapter->CurrNumRecvDescs = 0; -		Adapter->PrevNumRecvDescs = 0; -		atomic_set(&Adapter->cntrlpktCnt, 0); -		Adapter->LinkUpStatus = 0; -		Adapter->LinkStatus = 0; - -		if (Adapter->LEDInfo.led_thread_running & BCM_LED_THREAD_RUNNING_ACTIVELY) { -			Adapter->DriverState = FW_DOWNLOAD_DONE; +		if (Adapter->LEDInfo.led_thread_running & +			BCM_LED_THREAD_RUNNING_ACTIVELY) { +			Adapter->DriverState = DRIVER_INIT; +			Adapter->LEDInfo.bLedInitDone = false;  			wake_up(&Adapter->LEDInfo.notify_led_event);  		} +	} + +	if (Status != STATUS_SUCCESS) +		up(&Adapter->fw_download_sema); + +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, OSAL_DBG, DBG_LVL_ALL, +		"IOCTL: Firmware File Uploaded\n"); +	kfree(psFwInfo); +	return Status; +} -		if (!timeout) -			Status = -ENODEV; +static int bcm_char_ioctl_buffer_download_stop(void __user *argp, +		struct bcm_mini_adapter *Adapter) +{ +	INT Status; +	int timeout = 0; +	if (!down_trylock(&Adapter->fw_download_sema)) {  		up(&Adapter->fw_download_sema); -		up(&Adapter->NVMRdmWrmLock); -		return Status; +		return -EINVAL;  	} -	case IOCTL_BE_BUCKET_SIZE: -		Status = 0; -		if (get_user(Adapter->BEBucketSize, (unsigned long __user *)arg)) -			Status = -EFAULT; -		break; +	if (down_trylock(&Adapter->NVMRdmWrmLock)) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"FW download blocked as EEPROM Read/Write is in progress\n"); +		up(&Adapter->fw_download_sema); +		return -EACCES; +	} -	case IOCTL_RTPS_BUCKET_SIZE: -		Status = 0; -		if (get_user(Adapter->rtPSBucketSize, (unsigned long __user *)arg)) -			Status = -EFAULT; -		break; +	Adapter->bBinDownloaded = TRUE; +	Adapter->bCfgDownloaded = TRUE; +	atomic_set(&Adapter->CurrNumFreeTxDesc, 0); +	Adapter->CurrNumRecvDescs = 0; +	Adapter->downloadDDR = 0; -	case IOCTL_CHIP_RESET: { -		INT NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock); -		if (NVMAccess) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, " IOCTL_BCM_CHIP_RESET not allowed as EEPROM Read/Write is in progress\n"); -			return -EACCES; -		} +	/* setting the Mips to Run */ +	Status = run_card_proc(Adapter); -		down(&Adapter->RxAppControlQueuelock); -		Status = reset_card_proc(Adapter); -		flushAllAppQ(); -		up(&Adapter->RxAppControlQueuelock); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Firm Download Failed\n"); +		up(&Adapter->fw_download_sema);  		up(&Adapter->NVMRdmWrmLock); -		ResetCounters(Adapter); -		break; +		return Status; +	} else { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, "Firm Download Over...\n");  	} -	case IOCTL_QOS_THRESHOLD: { -		USHORT uiLoopIndex; +	mdelay(10); -		Status = 0; -		for (uiLoopIndex = 0; uiLoopIndex < NO_OF_QUEUES; uiLoopIndex++) { -			if (get_user(Adapter->PackInfo[uiLoopIndex].uiThreshold, -					(unsigned long __user *)arg)) { -				Status = -EFAULT; -				break; -			} -		} -		break; +	/* Wait for MailBox Interrupt */ +	if (StartInterruptUrb((struct bcm_interface_adapter *)Adapter->pvInterfaceAdapter)) +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Unable to send interrupt...\n"); + +	timeout = 5*HZ; +	Adapter->waiting_to_fw_download_done = false; +	wait_event_timeout(Adapter->ioctl_fw_dnld_wait_queue, +			Adapter->waiting_to_fw_download_done, timeout); +	Adapter->fw_download_process_pid = INVALID_PID; +	Adapter->fw_download_done = TRUE; +	atomic_set(&Adapter->CurrNumFreeTxDesc, 0); +	Adapter->CurrNumRecvDescs = 0; +	Adapter->PrevNumRecvDescs = 0; +	atomic_set(&Adapter->cntrlpktCnt, 0); +	Adapter->LinkUpStatus = 0; +	Adapter->LinkStatus = 0; + +	if (Adapter->LEDInfo.led_thread_running & +		BCM_LED_THREAD_RUNNING_ACTIVELY) { +		Adapter->DriverState = FW_DOWNLOAD_DONE; +		wake_up(&Adapter->LEDInfo.notify_led_event);  	} -	case IOCTL_DUMP_PACKET_INFO: -		DumpPackInfo(Adapter); -		DumpPhsRules(&Adapter->stBCMPhsContext); -		Status = STATUS_SUCCESS; -		break; +	if (!timeout) +		Status = -ENODEV; -	case IOCTL_GET_PACK_INFO: -		if (copy_to_user(argp, &Adapter->PackInfo, sizeof(struct bcm_packet_info)*NO_OF_QUEUES)) -			return -EFAULT; -		Status = STATUS_SUCCESS; -		break; +	up(&Adapter->fw_download_sema); +	up(&Adapter->NVMRdmWrmLock); +	return Status; +} -	case IOCTL_BCM_SWITCH_TRANSFER_MODE: { -		UINT uiData = 0; -		if (copy_from_user(&uiData, argp, sizeof(UINT))) -			return -EFAULT; +static int bcm_char_ioctl_chip_reset(struct bcm_mini_adapter *Adapter) +{ +	INT Status; +	INT NVMAccess; -		if (uiData) { -			/* Allow All Packets */ -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SWITCH_TRANSFER_MODE: ETH_PACKET_TUNNELING_MODE\n"); -				Adapter->TransferMode = ETH_PACKET_TUNNELING_MODE; -		} else { -			/* Allow IP only Packets */ -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SWITCH_TRANSFER_MODE: IP_PACKET_ONLY_MODE\n"); -			Adapter->TransferMode = IP_PACKET_ONLY_MODE; -		} -		Status = STATUS_SUCCESS; -		break; +	NVMAccess = down_trylock(&Adapter->NVMRdmWrmLock); +	if (NVMAccess) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			" IOCTL_BCM_CHIP_RESET not allowed as EEPROM Read/Write is in progress\n"); +		return -EACCES;  	} -	case IOCTL_BCM_GET_DRIVER_VERSION: { -		ulong len; - -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	down(&Adapter->RxAppControlQueuelock); +	Status = reset_card_proc(Adapter); +	flushAllAppQ(); +	up(&Adapter->RxAppControlQueuelock); +	up(&Adapter->NVMRdmWrmLock); +	ResetCounters(Adapter); +	return Status; +} -		len = min_t(ulong, IoBuffer.OutputLength, strlen(DRV_VERSION) + 1); +static int bcm_char_ioctl_qos_threshold(ULONG arg, +					struct bcm_mini_adapter *Adapter) +{ +	USHORT uiLoopIndex; -		if (copy_to_user(IoBuffer.OutputBuffer, DRV_VERSION, len)) +	for (uiLoopIndex = 0; uiLoopIndex < NO_OF_QUEUES; uiLoopIndex++) { +		if (get_user(Adapter->PackInfo[uiLoopIndex].uiThreshold, +				(unsigned long __user *)arg)) {  			return -EFAULT; -		Status = STATUS_SUCCESS; -		break; +		}  	} +	return 0; +} -	case IOCTL_BCM_GET_CURRENT_STATUS: { -		struct bcm_link_state link_state; +static int bcm_char_ioctl_switch_transfer_mode(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	UINT uiData = 0; -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "copy_from_user failed..\n"); -			return -EFAULT; -		} +	if (copy_from_user(&uiData, argp, sizeof(UINT))) +		return -EFAULT; -		if (IoBuffer.OutputLength != sizeof(link_state)) { -			Status = -EINVAL; -			break; -		} +	if (uiData) { +		/* Allow All Packets */ +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"IOCTL_BCM_SWITCH_TRANSFER_MODE: ETH_PACKET_TUNNELING_MODE\n"); +			Adapter->TransferMode = ETH_PACKET_TUNNELING_MODE; +	} else { +		/* Allow IP only Packets */ +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"IOCTL_BCM_SWITCH_TRANSFER_MODE: IP_PACKET_ONLY_MODE\n"); +		Adapter->TransferMode = IP_PACKET_ONLY_MODE; +	} +	return STATUS_SUCCESS; +} -		memset(&link_state, 0, sizeof(link_state)); -		link_state.bIdleMode = Adapter->IdleMode; -		link_state.bShutdownMode = Adapter->bShutStatus; -		link_state.ucLinkStatus = Adapter->LinkStatus; +static int bcm_char_ioctl_get_driver_version(void __user *argp) +{ +	struct bcm_ioctl_buffer IoBuffer; +	ulong len; -		if (copy_to_user(IoBuffer.OutputBuffer, &link_state, min_t(size_t, sizeof(link_state), IoBuffer.OutputLength))) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy_to_user Failed..\n"); -			return -EFAULT; -		} -		Status = STATUS_SUCCESS; -		break; -	} +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -	case IOCTL_BCM_SET_MAC_TRACING: { -		UINT  tracing_flag; +	len = min_t(ulong, IoBuffer.OutputLength, strlen(DRV_VERSION) + 1); -		/* copy ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	if (copy_to_user(IoBuffer.OutputBuffer, DRV_VERSION, len)) +		return -EFAULT; -		if (copy_from_user(&tracing_flag, IoBuffer.InputBuffer, sizeof(UINT))) -			return -EFAULT; +	return STATUS_SUCCESS; +} -		if (tracing_flag) -			Adapter->pTarangs->MacTracingEnabled = TRUE; -		else -			Adapter->pTarangs->MacTracingEnabled = FALSE; -		break; -	} +static int bcm_char_ioctl_get_current_status(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_link_state link_state; +	struct bcm_ioctl_buffer IoBuffer; -	case IOCTL_BCM_GET_DSX_INDICATION: { -		ULONG ulSFId = 0; -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"copy_from_user failed..\n"); +		return -EFAULT; +	} -		if (IoBuffer.OutputLength < sizeof(struct bcm_add_indication_alt)) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -					"Mismatch req: %lx needed is =0x%zx!!!", -					IoBuffer.OutputLength, sizeof(struct bcm_add_indication_alt)); -			return -EINVAL; -		} +	if (IoBuffer.OutputLength != sizeof(link_state)) +		return -EINVAL; -		if (copy_from_user(&ulSFId, IoBuffer.InputBuffer, sizeof(ulSFId))) -			return -EFAULT; +	memset(&link_state, 0, sizeof(link_state)); +	link_state.bIdleMode = Adapter->IdleMode; +	link_state.bShutdownMode = Adapter->bShutStatus; +	link_state.ucLinkStatus = Adapter->LinkStatus; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Get DSX Data SF ID is =%lx\n", ulSFId); -		get_dsx_sf_data_to_application(Adapter, ulSFId, IoBuffer.OutputBuffer); -		Status = STATUS_SUCCESS; +	if (copy_to_user(IoBuffer.OutputBuffer, &link_state, min_t(size_t, +		sizeof(link_state), IoBuffer.OutputLength))) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Copy_to_user Failed..\n"); +		return -EFAULT;  	} -	break; +	return STATUS_SUCCESS; +} -	case IOCTL_BCM_GET_HOST_MIBS: { -		PVOID temp_buff; -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +static int bcm_char_ioctl_set_mac_tracing(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_ioctl_buffer IoBuffer; +	UINT tracing_flag; -		if (IoBuffer.OutputLength != sizeof(struct bcm_host_stats_mibs)) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, -					"Length Check failed %lu %zd\n", -					IoBuffer.OutputLength, sizeof(struct bcm_host_stats_mibs)); -			return -EINVAL; -		} +	/* copy ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		/* FIXME: HOST_STATS are too big for kmalloc (122048)! */ -		temp_buff = kzalloc(sizeof(struct bcm_host_stats_mibs), GFP_KERNEL); -		if (!temp_buff) -			return STATUS_FAILURE; +	if (copy_from_user(&tracing_flag, IoBuffer.InputBuffer, sizeof(UINT))) +		return -EFAULT; -		Status = ProcessGetHostMibs(Adapter, temp_buff); -		GetDroppedAppCntrlPktMibs(temp_buff, pTarang); +	if (tracing_flag) +		Adapter->pTarangs->MacTracingEnabled = TRUE; +	else +		Adapter->pTarangs->MacTracingEnabled = false; -		if (Status != STATUS_FAILURE) -			if (copy_to_user(IoBuffer.OutputBuffer, temp_buff, sizeof(struct bcm_host_stats_mibs))) { -				kfree(temp_buff); -				return -EFAULT; -			} +	return STATUS_SUCCESS; +} -		kfree(temp_buff); -		break; +static int bcm_char_ioctl_get_dsx_indication(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_ioctl_buffer IoBuffer; +	ULONG ulSFId = 0; + +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; + +	if (IoBuffer.OutputLength < sizeof(struct bcm_add_indication_alt)) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Mismatch req: %lx needed is =0x%zx!!!", +			IoBuffer.OutputLength, +			sizeof(struct bcm_add_indication_alt)); +		return -EINVAL;  	} -	case IOCTL_BCM_WAKE_UP_DEVICE_FROM_IDLE: -		if ((FALSE == Adapter->bTriedToWakeUpFromlowPowerMode) && (TRUE == Adapter->IdleMode)) { -			Adapter->usIdleModePattern = ABORT_IDLE_MODE; -			Adapter->bWakeUpDevice = TRUE; -			wake_up(&Adapter->process_rx_cntrlpkt); -		} +	if (copy_from_user(&ulSFId, IoBuffer.InputBuffer, sizeof(ulSFId))) +		return -EFAULT; -		Status = STATUS_SUCCESS; -		break; +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +		"Get DSX Data SF ID is =%lx\n", ulSFId); +	get_dsx_sf_data_to_application(Adapter, ulSFId, IoBuffer.OutputBuffer); +	return STATUS_SUCCESS; +} -	case IOCTL_BCM_BULK_WRM: { -		struct bcm_bulk_wrm_buffer *pBulkBuffer; -		UINT uiTempVar = 0; -		PCHAR pvBuffer = NULL; +static int bcm_char_ioctl_get_host_mibs(void __user *argp, +	struct bcm_mini_adapter *Adapter, struct bcm_tarang_data *pTarang) +{ +	struct bcm_ioctl_buffer IoBuffer; +	INT Status = STATUS_FAILURE; +	PVOID temp_buff; -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -			BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "Device in Idle/Shutdown Mode, Blocking Wrms\n"); -			Status = -EACCES; -			break; -		} +	if (IoBuffer.OutputLength != sizeof(struct bcm_host_stats_mibs)) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Length Check failed %lu %zd\n", IoBuffer.OutputLength, +			sizeof(struct bcm_host_stats_mibs)); +		return -EINVAL; +	} + +	/* FIXME: HOST_STATS are too big for kmalloc (122048)! */ +	temp_buff = kzalloc(sizeof(struct bcm_host_stats_mibs), GFP_KERNEL); +	if (!temp_buff) +		return STATUS_FAILURE; -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +	Status = ProcessGetHostMibs(Adapter, temp_buff); +	GetDroppedAppCntrlPktMibs(temp_buff, pTarang); + +	if (Status != STATUS_FAILURE) { +		if (copy_to_user(IoBuffer.OutputBuffer, temp_buff, +			sizeof(struct bcm_host_stats_mibs))) { +			kfree(temp_buff);  			return -EFAULT; +		} +	} -		if (IoBuffer.InputLength < sizeof(ULONG) * 2) -			return -EINVAL; +	kfree(temp_buff); +	return Status; +} -		pvBuffer = memdup_user(IoBuffer.InputBuffer, -				       IoBuffer.InputLength); -		if (IS_ERR(pvBuffer)) -			return PTR_ERR(pvBuffer); +static int bcm_char_ioctl_bulk_wrm(void __user *argp, +	struct bcm_mini_adapter *Adapter, UINT cmd) +{ +	struct bcm_bulk_wrm_buffer *pBulkBuffer; +	struct bcm_ioctl_buffer IoBuffer; +	UINT uiTempVar = 0; +	INT Status = STATUS_FAILURE; +	PCHAR pvBuffer = NULL; -		pBulkBuffer = (struct bcm_bulk_wrm_buffer *)pvBuffer; +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -		if (((ULONG)pBulkBuffer->Register & 0x0F000000) != 0x0F000000 || -			((ULONG)pBulkBuffer->Register & 0x3)) { -			BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "WRM Done On invalid Address : %x Access Denied.\n", (int)pBulkBuffer->Register); -			kfree(pvBuffer); -			Status = -EINVAL; -			break; -		} +		BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Device in Idle/Shutdown Mode, Blocking Wrms\n"); +		return -EACCES; +	} -		uiTempVar = pBulkBuffer->Register & EEPROM_REJECT_MASK; -		if (!((Adapter->pstargetparams->m_u32Customize)&VSG_MODE) && -			((uiTempVar == EEPROM_REJECT_REG_1) || -				(uiTempVar == EEPROM_REJECT_REG_2) || -				(uiTempVar == EEPROM_REJECT_REG_3) || -				(uiTempVar == EEPROM_REJECT_REG_4)) && -			(cmd == IOCTL_BCM_REGISTER_WRITE)) { +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -			kfree(pvBuffer); -			BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "EEPROM Access Denied, not in VSG Mode\n"); -			Status = -EFAULT; -			break; -		} +	if (IoBuffer.InputLength < sizeof(ULONG) * 2) +		return -EINVAL; -		if (pBulkBuffer->SwapEndian == FALSE) -			Status = wrmWithLock(Adapter, (UINT)pBulkBuffer->Register, (PCHAR)pBulkBuffer->Values, IoBuffer.InputLength - 2*sizeof(ULONG)); -		else -			Status = wrmaltWithLock(Adapter, (UINT)pBulkBuffer->Register, (PUINT)pBulkBuffer->Values, IoBuffer.InputLength - 2*sizeof(ULONG)); +	pvBuffer = memdup_user(IoBuffer.InputBuffer, +			       IoBuffer.InputLength); +	if (IS_ERR(pvBuffer)) +		return PTR_ERR(pvBuffer); -		if (Status != STATUS_SUCCESS) -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "WRM Failed\n"); +	pBulkBuffer = (struct bcm_bulk_wrm_buffer *)pvBuffer; +	if (((ULONG)pBulkBuffer->Register & 0x0F000000) != 0x0F000000 || +		((ULONG)pBulkBuffer->Register & 0x3)) { +		BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, +			"WRM Done On invalid Address : %x Access Denied.\n", +			(int)pBulkBuffer->Register);  		kfree(pvBuffer); -		break; +		return -EINVAL;  	} -	case IOCTL_BCM_GET_NVM_SIZE: -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +	uiTempVar = pBulkBuffer->Register & EEPROM_REJECT_MASK; +	if (!((Adapter->pstargetparams->m_u32Customize)&VSG_MODE) && +		((uiTempVar == EEPROM_REJECT_REG_1) || +			(uiTempVar == EEPROM_REJECT_REG_2) || +			(uiTempVar == EEPROM_REJECT_REG_3) || +			(uiTempVar == EEPROM_REJECT_REG_4)) && +		(cmd == IOCTL_BCM_REGISTER_WRITE)) { + +		kfree(pvBuffer); +		BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, +			"EEPROM Access Denied, not in VSG Mode\n"); +		return -EFAULT; +	} + +	if (pBulkBuffer->SwapEndian == false) +		Status = wrmWithLock(Adapter, (UINT)pBulkBuffer->Register, +			(PCHAR)pBulkBuffer->Values, +			IoBuffer.InputLength - 2*sizeof(ULONG)); +	else +		Status = wrmaltWithLock(Adapter, (UINT)pBulkBuffer->Register, +			(PUINT)pBulkBuffer->Values, +			IoBuffer.InputLength - 2*sizeof(ULONG)); + +	if (Status != STATUS_SUCCESS) +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "WRM Failed\n"); + +	kfree(pvBuffer); +	return Status; +} + +static int bcm_char_ioctl_get_nvm_size(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_ioctl_buffer IoBuffer; + +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; + +	if (Adapter->eNVMType == NVM_EEPROM || Adapter->eNVMType == NVM_FLASH) { +		if (copy_to_user(IoBuffer.OutputBuffer, &Adapter->uiNVMDSDSize, +			sizeof(UINT)))  			return -EFAULT; +	} -		if (Adapter->eNVMType == NVM_EEPROM || Adapter->eNVMType == NVM_FLASH) { -			if (copy_to_user(IoBuffer.OutputBuffer, &Adapter->uiNVMDSDSize, sizeof(UINT))) -				return -EFAULT; -		} +	return STATUS_SUCCESS; +} -		Status = STATUS_SUCCESS; -		break; +static int bcm_char_ioctl_cal_init(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_ioctl_buffer IoBuffer; +	UINT uiSectorSize = 0; +	INT Status = STATUS_FAILURE; -	case IOCTL_BCM_CAL_INIT: { -		UINT uiSectorSize = 0 ; -		if (Adapter->eNVMType == NVM_FLASH) { -			if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -				return -EFAULT; +	if (Adapter->eNVMType == NVM_FLASH) { +		if (copy_from_user(&IoBuffer, argp, +			sizeof(struct bcm_ioctl_buffer))) +			return -EFAULT; -			if (copy_from_user(&uiSectorSize, IoBuffer.InputBuffer, sizeof(UINT))) -				return -EFAULT; +		if (copy_from_user(&uiSectorSize, IoBuffer.InputBuffer, +			sizeof(UINT))) +			return -EFAULT; -			if ((uiSectorSize < MIN_SECTOR_SIZE) || (uiSectorSize > MAX_SECTOR_SIZE)) { -				if (copy_to_user(IoBuffer.OutputBuffer, &Adapter->uiSectorSize, -							sizeof(UINT))) +		if ((uiSectorSize < MIN_SECTOR_SIZE) || +			(uiSectorSize > MAX_SECTOR_SIZE)) { +			if (copy_to_user(IoBuffer.OutputBuffer, +				&Adapter->uiSectorSize, sizeof(UINT))) +				return -EFAULT; +		} else { +			if (IsFlash2x(Adapter)) { +				if (copy_to_user(IoBuffer.OutputBuffer, +					&Adapter->uiSectorSize, sizeof(UINT)))  					return -EFAULT;  			} else { -				if (IsFlash2x(Adapter)) { -					if (copy_to_user(IoBuffer.OutputBuffer,	&Adapter->uiSectorSize, sizeof(UINT))) -						return -EFAULT; -				} else { -					if ((TRUE == Adapter->bShutStatus) || (TRUE == Adapter->IdleMode)) { -						BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Device is in Idle/Shutdown Mode\n"); -						return -EACCES; -					} - -					Adapter->uiSectorSize = uiSectorSize; -					BcmUpdateSectorSize(Adapter, Adapter->uiSectorSize); +				if ((TRUE == Adapter->bShutStatus) || +					(TRUE == Adapter->IdleMode)) { +					BCM_DEBUG_PRINT(Adapter, +						DBG_TYPE_PRINTK, 0, 0, +						"Device is in Idle/Shutdown Mode\n"); +					return -EACCES;  				} + +				Adapter->uiSectorSize = uiSectorSize; +				BcmUpdateSectorSize(Adapter, +					Adapter->uiSectorSize);  			} -			Status = STATUS_SUCCESS; -		} else { -			Status = STATUS_FAILURE;  		} +		Status = STATUS_SUCCESS; +	} else { +		Status = STATUS_FAILURE;  	} -	break; +	return Status; +} -	case IOCTL_BCM_SET_DEBUG: +static int bcm_char_ioctl_set_debug(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{  #ifdef DEBUG -	{ -		struct bcm_user_debug_state sUserDebugState; +	struct bcm_ioctl_buffer IoBuffer; +	struct bcm_user_debug_state sUserDebugState; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "In SET_DEBUG ioctl\n"); -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +		"In SET_DEBUG ioctl\n"); +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		if (copy_from_user(&sUserDebugState, IoBuffer.InputBuffer, sizeof(struct bcm_user_debug_state))) -			return -EFAULT; +	if (copy_from_user(&sUserDebugState, IoBuffer.InputBuffer, +		sizeof(struct bcm_user_debug_state))) +		return -EFAULT; -		BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "IOCTL_BCM_SET_DEBUG: OnOff=%d Type = 0x%x ", -				sUserDebugState.OnOff, sUserDebugState.Type); -		/* sUserDebugState.Subtype <<= 1; */ -		sUserDebugState.Subtype = 1 << sUserDebugState.Subtype; -		BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, "actual Subtype=0x%x\n", sUserDebugState.Subtype); - -		/* Update new 'DebugState' in the Adapter */ -		Adapter->stDebugState.type |= sUserDebugState.Type; -		/* Subtype: A bitmap of 32 bits for Subtype per Type. -		 * Valid indexes in 'subtype' array: 1,2,4,8 -		 * corresponding to valid Type values. Hence we can use the 'Type' field -		 * as the index value, ignoring the array entries 0,3,5,6,7 ! -		 */ -		if (sUserDebugState.OnOff) -			Adapter->stDebugState.subtype[sUserDebugState.Type] |= sUserDebugState.Subtype; -		else -			Adapter->stDebugState.subtype[sUserDebugState.Type] &= ~sUserDebugState.Subtype; +	BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, +			"IOCTL_BCM_SET_DEBUG: OnOff=%d Type = 0x%x ", +			sUserDebugState.OnOff, sUserDebugState.Type); +	/* sUserDebugState.Subtype <<= 1; */ +	sUserDebugState.Subtype = 1 << sUserDebugState.Subtype; +	BCM_DEBUG_PRINT (Adapter, DBG_TYPE_PRINTK, 0, 0, +		"actual Subtype=0x%x\n", sUserDebugState.Subtype); + +	/* Update new 'DebugState' in the Adapter */ +	Adapter->stDebugState.type |= sUserDebugState.Type; +	/* Subtype: A bitmap of 32 bits for Subtype per Type. +	 * Valid indexes in 'subtype' array: 1,2,4,8 +	 * corresponding to valid Type values. Hence we can use the 'Type' field +	 * as the index value, ignoring the array entries 0,3,5,6,7 ! +	 */ +	if (sUserDebugState.OnOff) +		Adapter->stDebugState.subtype[sUserDebugState.Type] |= +			sUserDebugState.Subtype; +	else +		Adapter->stDebugState.subtype[sUserDebugState.Type] &= +			~sUserDebugState.Subtype; + +	BCM_SHOW_DEBUG_BITMAP(Adapter); +#endif +	return STATUS_SUCCESS; +} + +static int bcm_char_ioctl_nvm_rw(void __user *argp, +	struct bcm_mini_adapter *Adapter, UINT cmd) +{ +	struct bcm_nvm_readwrite stNVMReadWrite; +	struct timeval tv0, tv1; +	struct bcm_ioctl_buffer IoBuffer; +	PUCHAR pReadData = NULL; +	INT Status = STATUS_FAILURE; -		BCM_SHOW_DEBUG_BITMAP(Adapter); +	memset(&tv0, 0, sizeof(struct timeval)); +	memset(&tv1, 0, sizeof(struct timeval)); +	if ((Adapter->eNVMType == NVM_FLASH) && +		(Adapter->uiFlashLayoutMajorVersion == 0)) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"The Flash Control Section is Corrupted. Hence Rejection on NVM Read/Write\n"); +		return -EFAULT;  	} -#endif -	break; -	case IOCTL_BCM_NVM_READ: -	case IOCTL_BCM_NVM_WRITE: { -		struct bcm_nvm_readwrite stNVMReadWrite; -		PUCHAR pReadData = NULL; -		ULONG ulDSDMagicNumInUsrBuff = 0; -		struct timeval tv0, tv1; -		memset(&tv0, 0, sizeof(struct timeval)); -		memset(&tv1, 0, sizeof(struct timeval)); -		if ((Adapter->eNVMType == NVM_FLASH) && (Adapter->uiFlashLayoutMajorVersion == 0)) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "The Flash Control Section is Corrupted. Hence Rejection on NVM Read/Write\n"); -			return -EFAULT; +	if (IsFlash2x(Adapter)) { +		if ((Adapter->eActiveDSD != DSD0) && +			(Adapter->eActiveDSD != DSD1) && +			(Adapter->eActiveDSD != DSD2)) { + +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"No DSD is active..hence NVM Command is blocked"); +			return STATUS_FAILURE;  		} +	} -		if (IsFlash2x(Adapter)) { -			if ((Adapter->eActiveDSD != DSD0) && -				(Adapter->eActiveDSD != DSD1) && -				(Adapter->eActiveDSD != DSD2)) { +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "No DSD is active..hence NVM Command is blocked"); -				return STATUS_FAILURE; -			} +	if (copy_from_user(&stNVMReadWrite, +				(IOCTL_BCM_NVM_READ == cmd) ? +				IoBuffer.OutputBuffer : IoBuffer.InputBuffer, +				sizeof(struct bcm_nvm_readwrite))) +		return -EFAULT; + +	/* +	 * Deny the access if the offset crosses the cal area limit. +	 */ +	if (stNVMReadWrite.uiNumBytes > Adapter->uiNVMDSDSize) +		return STATUS_FAILURE; + +	if (stNVMReadWrite.uiOffset > +		Adapter->uiNVMDSDSize - stNVMReadWrite.uiNumBytes) +		return STATUS_FAILURE; + +	pReadData = memdup_user(stNVMReadWrite.pBuffer, +				stNVMReadWrite.uiNumBytes); +	if (IS_ERR(pReadData)) +		return PTR_ERR(pReadData); + +	do_gettimeofday(&tv0); +	if (IOCTL_BCM_NVM_READ == cmd) { +		int ret = bcm_handle_nvm_read_cmd(Adapter, pReadData, +				&stNVMReadWrite); +		if (ret != STATUS_SUCCESS) +			return ret; +	} else { +		down(&Adapter->NVMRdmWrmLock); + +		if ((Adapter->IdleMode == TRUE) || +			(Adapter->bShutStatus == TRUE) || +			(Adapter->bPreparingForLowPowerMode == TRUE)) { + +			BCM_DEBUG_PRINT(Adapter, +				DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"Device is in Idle/Shutdown Mode\n"); +			up(&Adapter->NVMRdmWrmLock); +			kfree(pReadData); +			return -EACCES;  		} -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +		Adapter->bHeaderChangeAllowed = TRUE; +		if (IsFlash2x(Adapter)) { +			int ret = handle_flash2x_adapter(Adapter, +							pReadData, +							&stNVMReadWrite); +			if (ret != STATUS_SUCCESS) +				return ret; +		} -		if (copy_from_user(&stNVMReadWrite, -					(IOCTL_BCM_NVM_READ == cmd) ? IoBuffer.OutputBuffer : IoBuffer.InputBuffer, -					sizeof(struct bcm_nvm_readwrite))) -			return -EFAULT; +		Status = BeceemNVMWrite(Adapter, (PUINT)pReadData, +			stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes, +			stNVMReadWrite.bVerify); +		if (IsFlash2x(Adapter)) +			BcmFlash2xWriteSig(Adapter, Adapter->eActiveDSD); -		/* -		 * Deny the access if the offset crosses the cal area limit. -		 */ -		if (stNVMReadWrite.uiNumBytes > Adapter->uiNVMDSDSize) -			return STATUS_FAILURE; +		Adapter->bHeaderChangeAllowed = false; -		if (stNVMReadWrite.uiOffset > Adapter->uiNVMDSDSize - stNVMReadWrite.uiNumBytes) { -			/* BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0,"Can't allow access beyond NVM Size: 0x%x 0x%x\n", stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes); */ -			return STATUS_FAILURE; +		up(&Adapter->NVMRdmWrmLock); + +		if (Status != STATUS_SUCCESS) { +			kfree(pReadData); +			return Status;  		} +	} -		pReadData = memdup_user(stNVMReadWrite.pBuffer, -					stNVMReadWrite.uiNumBytes); -		if (IS_ERR(pReadData)) -			return PTR_ERR(pReadData); +	do_gettimeofday(&tv1); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +		" timetaken by Write/read :%ld msec\n", +		(tv1.tv_sec - tv0.tv_sec)*1000 + +		(tv1.tv_usec - tv0.tv_usec)/1000); -		do_gettimeofday(&tv0); -		if (IOCTL_BCM_NVM_READ == cmd) { -			down(&Adapter->NVMRdmWrmLock); +	kfree(pReadData); +	return STATUS_SUCCESS; +} -			if ((Adapter->IdleMode == TRUE) || -				(Adapter->bShutStatus == TRUE) || -				(Adapter->bPreparingForLowPowerMode == TRUE)) { +static int bcm_char_ioctl_flash2x_section_read(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_flash2x_readwrite sFlash2xRead = {0}; +	struct bcm_ioctl_buffer IoBuffer; +	PUCHAR pReadBuff = NULL; +	UINT NOB = 0; +	UINT BuffSize = 0; +	UINT ReadBytes = 0; +	UINT ReadOffset = 0; +	INT Status = STATUS_FAILURE; +	void __user *OutPutBuff; -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Device is in Idle/Shutdown Mode\n"); -				up(&Adapter->NVMRdmWrmLock); -				kfree(pReadData); -				return -EACCES; -			} +	if (IsFlash2x(Adapter) != TRUE)	{ +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Flash Does not have 2.x map"); +		return -EINVAL; +	} -			Status = BeceemNVMRead(Adapter, (PUINT)pReadData, stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes); -			up(&Adapter->NVMRdmWrmLock); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +		DBG_LVL_ALL, "IOCTL_BCM_FLASH2X_SECTION_READ Called"); +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -			if (Status != STATUS_SUCCESS) { -				kfree(pReadData); -				return Status; -			} +	/* Reading FLASH 2.x READ structure */ +	if (copy_from_user(&sFlash2xRead, IoBuffer.InputBuffer, +		sizeof(struct bcm_flash2x_readwrite))) +		return -EFAULT; -			if (copy_to_user(stNVMReadWrite.pBuffer, pReadData, stNVMReadWrite.uiNumBytes)) { -				kfree(pReadData); -				return -EFAULT; -			} -		} else { -			down(&Adapter->NVMRdmWrmLock); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"\nsFlash2xRead.Section :%x", +			sFlash2xRead.Section); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"\nsFlash2xRead.offset :%x", +			sFlash2xRead.offset); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"\nsFlash2xRead.numOfBytes :%x", +			sFlash2xRead.numOfBytes); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"\nsFlash2xRead.bVerify :%x\n", +			sFlash2xRead.bVerify); + +	/* This was internal to driver for raw read. +	 * now it has ben exposed to user space app. +	 */ +	if (validateFlash2xReadWrite(Adapter, &sFlash2xRead) == false) +		return STATUS_FAILURE; + +	NOB = sFlash2xRead.numOfBytes; +	if (NOB > Adapter->uiSectorSize) +		BuffSize = Adapter->uiSectorSize; +	else +		BuffSize = NOB; + +	ReadOffset = sFlash2xRead.offset; +	OutPutBuff = IoBuffer.OutputBuffer; +	pReadBuff = (PCHAR)kzalloc(BuffSize , GFP_KERNEL); + +	if (pReadBuff == NULL) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Memory allocation failed for Flash 2.x Read Structure"); +		return -ENOMEM; +	} +	down(&Adapter->NVMRdmWrmLock); -			if ((Adapter->IdleMode == TRUE) || -				(Adapter->bShutStatus == TRUE) || -				(Adapter->bPreparingForLowPowerMode == TRUE)) { +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Device is in Idle/Shutdown Mode\n"); -				up(&Adapter->NVMRdmWrmLock); -				kfree(pReadData); -				return -EACCES; -			} +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				DBG_LVL_ALL, +				"Device is in Idle/Shutdown Mode\n"); +		up(&Adapter->NVMRdmWrmLock); +		kfree(pReadBuff); +		return -EACCES; +	} -			Adapter->bHeaderChangeAllowed = TRUE; -			if (IsFlash2x(Adapter)) { -				/* -				 *			New Requirement:- -				 *			DSD section updation will be allowed in two case:- -				 *			1.  if DSD sig is present in DSD header means dongle is ok and updation is fruitfull -				 *			2.  if point 1 failes then user buff should have DSD sig. this point ensures that if dongle is -				 *			      corrupted then user space program first modify the DSD header with valid DSD sig so -				 *			      that this as well as further write may be worthwhile. -				 * -				 *			 This restriction has been put assuming that if DSD sig is corrupted, DSD -				 *			 data won't be considered valid. -				 */ - -				Status = BcmFlash2xCorruptSig(Adapter, Adapter->eActiveDSD); -				if (Status != STATUS_SUCCESS) { -					if (((stNVMReadWrite.uiOffset + stNVMReadWrite.uiNumBytes) != Adapter->uiNVMDSDSize) || -						(stNVMReadWrite.uiNumBytes < SIGNATURE_SIZE)) { - -						BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "DSD Sig is present neither in Flash nor User provided Input.."); -						up(&Adapter->NVMRdmWrmLock); -						kfree(pReadData); -						return Status; -					} - -					ulDSDMagicNumInUsrBuff = ntohl(*(PUINT)(pReadData + stNVMReadWrite.uiNumBytes - SIGNATURE_SIZE)); -					if (ulDSDMagicNumInUsrBuff != DSD_IMAGE_MAGIC_NUMBER) { -						BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "DSD Sig is present neither in Flash nor User provided Input.."); -						up(&Adapter->NVMRdmWrmLock); -						kfree(pReadData); -						return Status; -					} -				} -			} +	while (NOB) { +		if (NOB > Adapter->uiSectorSize) +			ReadBytes = Adapter->uiSectorSize; +		else +			ReadBytes = NOB; -			Status = BeceemNVMWrite(Adapter, (PUINT)pReadData, stNVMReadWrite.uiOffset, stNVMReadWrite.uiNumBytes, stNVMReadWrite.bVerify); -			if (IsFlash2x(Adapter)) -				BcmFlash2xWriteSig(Adapter, Adapter->eActiveDSD); +		/* Reading the data from Flash 2.x */ +		Status = BcmFlash2xBulkRead(Adapter, (PUINT)pReadBuff, +			sFlash2xRead.Section, ReadOffset, ReadBytes); +		if (Status) { +			BCM_DEBUG_PRINT(Adapter, +				DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"Flash 2x read err with Status :%d", +				Status); +			break; +		} -			Adapter->bHeaderChangeAllowed = FALSE; +		BCM_DEBUG_PRINT_BUFFER(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +			DBG_LVL_ALL, pReadBuff, ReadBytes); +		Status = copy_to_user(OutPutBuff, pReadBuff, ReadBytes); +		if (Status) { +			BCM_DEBUG_PRINT(Adapter, +				DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"Copy to use failed with status :%d", Status);  			up(&Adapter->NVMRdmWrmLock); - -			if (Status != STATUS_SUCCESS) { -				kfree(pReadData); -				return Status; -			} +			kfree(pReadBuff); +			return -EFAULT; +		} +		NOB = NOB - ReadBytes; +		if (NOB) { +			ReadOffset = ReadOffset + ReadBytes; +			OutPutBuff = OutPutBuff + ReadBytes;  		} +	} -		do_gettimeofday(&tv1); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " timetaken by Write/read :%ld msec\n", (tv1.tv_sec - tv0.tv_sec)*1000 + (tv1.tv_usec - tv0.tv_usec)/1000); +	up(&Adapter->NVMRdmWrmLock); +	kfree(pReadBuff); +	return Status; +} -		kfree(pReadData); -		return STATUS_SUCCESS; +static int bcm_char_ioctl_flash2x_section_write(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_flash2x_readwrite sFlash2xWrite = {0}; +	struct bcm_ioctl_buffer IoBuffer; +	PUCHAR pWriteBuff; +	void __user *InputAddr; +	UINT NOB = 0; +	UINT BuffSize = 0; +	UINT WriteOffset = 0; +	UINT WriteBytes = 0; +	INT Status = STATUS_FAILURE; + +	if (IsFlash2x(Adapter) != TRUE) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Flash Does not have 2.x map"); +		return -EINVAL;  	} -	case IOCTL_BCM_FLASH2X_SECTION_READ: { -		struct bcm_flash2x_readwrite sFlash2xRead = {0}; -		PUCHAR pReadBuff = NULL ; -		UINT NOB = 0; -		UINT BuffSize = 0; -		UINT ReadBytes = 0; -		UINT ReadOffset = 0; -		void __user *OutPutBuff; +	/* First make this False so that we can enable the Sector +	 * Permission Check in BeceemFlashBulkWrite +	 */ +	Adapter->bAllDSDWriteAllow = false; -		if (IsFlash2x(Adapter) != TRUE)	{ -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Flash Does not have 2.x map"); -			return -EINVAL; -		} +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +		"IOCTL_BCM_FLASH2X_SECTION_WRITE Called"); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_FLASH2X_SECTION_READ Called"); -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		/* Reading FLASH 2.x READ structure */ -		if (copy_from_user(&sFlash2xRead, IoBuffer.InputBuffer, sizeof(struct bcm_flash2x_readwrite))) -			return -EFAULT; +	/* Reading FLASH 2.x READ structure */ +	if (copy_from_user(&sFlash2xWrite, IoBuffer.InputBuffer, +		sizeof(struct bcm_flash2x_readwrite))) +		return -EFAULT; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "\nsFlash2xRead.Section :%x", sFlash2xRead.Section); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "\nsFlash2xRead.offset :%x", sFlash2xRead.offset); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "\nsFlash2xRead.numOfBytes :%x", sFlash2xRead.numOfBytes); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "\nsFlash2xRead.bVerify :%x\n", sFlash2xRead.bVerify); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +		"\nsFlash2xRead.Section :%x", sFlash2xWrite.Section); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +		"\nsFlash2xRead.offset :%d", sFlash2xWrite.offset); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +		"\nsFlash2xRead.numOfBytes :%x", sFlash2xWrite.numOfBytes); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +		"\nsFlash2xRead.bVerify :%x\n", sFlash2xWrite.bVerify); + +	if ((sFlash2xWrite.Section != VSA0) && (sFlash2xWrite.Section != VSA1) +		&& (sFlash2xWrite.Section != VSA2)) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"Only VSA write is allowed"); +		return -EINVAL; +	} -		/* This was internal to driver for raw read. now it has ben exposed to user space app. */ -		if (validateFlash2xReadWrite(Adapter, &sFlash2xRead) == FALSE) -			return STATUS_FAILURE; +	if (validateFlash2xReadWrite(Adapter, &sFlash2xWrite) == false) +		return STATUS_FAILURE; -		NOB = sFlash2xRead.numOfBytes; -		if (NOB > Adapter->uiSectorSize) -			BuffSize = Adapter->uiSectorSize; -		else -			BuffSize = NOB; +	InputAddr = sFlash2xWrite.pDataBuff; +	WriteOffset = sFlash2xWrite.offset; +	NOB = sFlash2xWrite.numOfBytes; -		ReadOffset = sFlash2xRead.offset ; -		OutPutBuff = IoBuffer.OutputBuffer; -		pReadBuff = (PCHAR)kzalloc(BuffSize , GFP_KERNEL); +	if (NOB > Adapter->uiSectorSize) +		BuffSize = Adapter->uiSectorSize; +	else +		BuffSize = NOB; -		if (pReadBuff == NULL) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Memory allocation failed for Flash 2.x Read Structure"); -			return -ENOMEM; -		} -		down(&Adapter->NVMRdmWrmLock); +	pWriteBuff = kmalloc(BuffSize, GFP_KERNEL); -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { +	if (pWriteBuff == NULL) +		return -ENOMEM; + +	/* extracting the remainder of the given offset. */ +	WriteBytes = Adapter->uiSectorSize; +	if (WriteOffset % Adapter->uiSectorSize) { +		WriteBytes = Adapter->uiSectorSize - +			(WriteOffset % Adapter->uiSectorSize); +	} + +	if (NOB < WriteBytes) +		WriteBytes = NOB; + +	down(&Adapter->NVMRdmWrmLock); -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Device is in Idle/Shutdown Mode\n"); +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { + +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"Device is in Idle/Shutdown Mode\n"); +		up(&Adapter->NVMRdmWrmLock); +		kfree(pWriteBuff); +		return -EACCES; +	} + +	BcmFlash2xCorruptSig(Adapter, sFlash2xWrite.Section); +	do { +		Status = copy_from_user(pWriteBuff, InputAddr, WriteBytes); +		if (Status) { +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Copy to user failed with status :%d", Status);  			up(&Adapter->NVMRdmWrmLock); -			kfree(pReadBuff); -			return -EACCES; +			kfree(pWriteBuff); +			return -EFAULT; +		} +		BCM_DEBUG_PRINT_BUFFER(Adapter, DBG_TYPE_OTHERS, +			OSAL_DBG, DBG_LVL_ALL, pWriteBuff, WriteBytes); + +		/* Writing the data from Flash 2.x */ +		Status = BcmFlash2xBulkWrite(Adapter, (PUINT)pWriteBuff, +					     sFlash2xWrite.Section, +					     WriteOffset, +					     WriteBytes, +					     sFlash2xWrite.bVerify); + +		if (Status) { +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Flash 2x read err with Status :%d", Status); +			break;  		} -		while (NOB) { +		NOB = NOB - WriteBytes; +		if (NOB) { +			WriteOffset = WriteOffset + WriteBytes; +			InputAddr = InputAddr + WriteBytes;  			if (NOB > Adapter->uiSectorSize) -				ReadBytes = Adapter->uiSectorSize; +				WriteBytes = Adapter->uiSectorSize;  			else -				ReadBytes = NOB; +				WriteBytes = NOB; +		} +	} while (NOB > 0); -			/* Reading the data from Flash 2.x */ -			Status = BcmFlash2xBulkRead(Adapter, (PUINT)pReadBuff, sFlash2xRead.Section, ReadOffset, ReadBytes); -			if (Status) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Flash 2x read err with Status :%d", Status); -				break; -			} +	BcmFlash2xWriteSig(Adapter, sFlash2xWrite.Section); +	up(&Adapter->NVMRdmWrmLock); +	kfree(pWriteBuff); +	return Status; +} -			BCM_DEBUG_PRINT_BUFFER(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, pReadBuff, ReadBytes); +static int bcm_char_ioctl_flash2x_section_bitmap(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_flash2x_bitmap *psFlash2xBitMap; +	struct bcm_ioctl_buffer IoBuffer; -			Status = copy_to_user(OutPutBuff, pReadBuff, ReadBytes); -			if (Status) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Copy to use failed with status :%d", Status); -				up(&Adapter->NVMRdmWrmLock); -				kfree(pReadBuff); -				return -EFAULT; -			} -			NOB = NOB - ReadBytes; -			if (NOB) { -				ReadOffset = ReadOffset + ReadBytes; -				OutPutBuff = OutPutBuff + ReadBytes ; -			} -		} +BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +	"IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP Called"); -		up(&Adapter->NVMRdmWrmLock); -		kfree(pReadBuff); -	} -	break; +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -	case IOCTL_BCM_FLASH2X_SECTION_WRITE: { -		struct bcm_flash2x_readwrite sFlash2xWrite = {0}; -		PUCHAR pWriteBuff; -		void __user *InputAddr; -		UINT NOB = 0; -		UINT BuffSize = 0; -		UINT WriteOffset = 0; -		UINT WriteBytes = 0; +	if (IoBuffer.OutputLength != sizeof(struct bcm_flash2x_bitmap)) +		return -EINVAL; -		if (IsFlash2x(Adapter) != TRUE) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Flash Does not have 2.x map"); -			return -EINVAL; -		} +	psFlash2xBitMap = kzalloc(sizeof(struct bcm_flash2x_bitmap), +			GFP_KERNEL); -		/* First make this False so that we can enable the Sector Permission Check in BeceemFlashBulkWrite */ -		Adapter->bAllDSDWriteAllow = FALSE; +	if (psFlash2xBitMap == NULL) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Memory is not available"); +		return -ENOMEM; +	} -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_FLASH2X_SECTION_WRITE Called"); +	/* Reading the Flash Sectio Bit map */ +	down(&Adapter->NVMRdmWrmLock); -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -		/* Reading FLASH 2.x READ structure */ -		if (copy_from_user(&sFlash2xWrite, IoBuffer.InputBuffer, sizeof(struct bcm_flash2x_readwrite))) -			return -EFAULT; +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"Device is in Idle/Shutdown Mode\n"); +		up(&Adapter->NVMRdmWrmLock); +		kfree(psFlash2xBitMap); +		return -EACCES; +	} -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "\nsFlash2xRead.Section :%x", sFlash2xWrite.Section); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "\nsFlash2xRead.offset :%d", sFlash2xWrite.offset); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "\nsFlash2xRead.numOfBytes :%x", sFlash2xWrite.numOfBytes); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "\nsFlash2xRead.bVerify :%x\n", sFlash2xWrite.bVerify); +	BcmGetFlash2xSectionalBitMap(Adapter, psFlash2xBitMap); +	up(&Adapter->NVMRdmWrmLock); +	if (copy_to_user(IoBuffer.OutputBuffer, psFlash2xBitMap, +		sizeof(struct bcm_flash2x_bitmap))) { +		kfree(psFlash2xBitMap); +		return -EFAULT; +	} -		if ((sFlash2xWrite.Section != VSA0) && (sFlash2xWrite.Section != VSA1) && (sFlash2xWrite.Section != VSA2)) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Only VSA write is allowed"); -			return -EINVAL; -		} +	kfree(psFlash2xBitMap); +	return STATUS_FAILURE; +} -		if (validateFlash2xReadWrite(Adapter, &sFlash2xWrite) == FALSE) -			return STATUS_FAILURE; +static int bcm_char_ioctl_set_active_section(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	enum bcm_flash2x_section_val eFlash2xSectionVal = 0; +	INT Status = STATUS_FAILURE; +	struct bcm_ioctl_buffer IoBuffer; -		InputAddr = sFlash2xWrite.pDataBuff; -		WriteOffset = sFlash2xWrite.offset; -		NOB = sFlash2xWrite.numOfBytes; +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"IOCTL_BCM_SET_ACTIVE_SECTION Called"); -		if (NOB > Adapter->uiSectorSize) -			BuffSize = Adapter->uiSectorSize; -		else -			BuffSize = NOB ; +	if (IsFlash2x(Adapter) != TRUE) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Flash Does not have 2.x map"); +		return -EINVAL; +	} -		pWriteBuff = kmalloc(BuffSize, GFP_KERNEL); +	Status = copy_from_user(&IoBuffer, argp, +				sizeof(struct bcm_ioctl_buffer)); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Copy of IOCTL BUFFER failed"); +		return -EFAULT; +	} -		if (pWriteBuff == NULL) -			return -ENOMEM; +	Status = copy_from_user(&eFlash2xSectionVal, +				IoBuffer.InputBuffer, sizeof(INT)); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +			"Copy of flash section val failed"); +		return -EFAULT; +	} -		/* extracting the remainder of the given offset. */ -		WriteBytes = Adapter->uiSectorSize; -		if (WriteOffset % Adapter->uiSectorSize) -			WriteBytes = Adapter->uiSectorSize - (WriteOffset % Adapter->uiSectorSize); +	down(&Adapter->NVMRdmWrmLock); -		if (NOB < WriteBytes) -			WriteBytes = NOB; +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -		down(&Adapter->NVMRdmWrmLock); +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"Device is in Idle/Shutdown Mode\n"); +		up(&Adapter->NVMRdmWrmLock); +		return -EACCES; +	} -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { +	Status = BcmSetActiveSection(Adapter, eFlash2xSectionVal); +	if (Status) +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Failed to make it's priority Highest. Status %d", +				Status); -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Device is in Idle/Shutdown Mode\n"); -			up(&Adapter->NVMRdmWrmLock); -			kfree(pWriteBuff); -			return -EACCES; -		} +	up(&Adapter->NVMRdmWrmLock); -		BcmFlash2xCorruptSig(Adapter, sFlash2xWrite.Section); -		do { -			Status = copy_from_user(pWriteBuff, InputAddr, WriteBytes); -			if (Status) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy to user failed with status :%d", Status); -				up(&Adapter->NVMRdmWrmLock); -				kfree(pWriteBuff); -				return -EFAULT; -			} -			BCM_DEBUG_PRINT_BUFFER(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, pWriteBuff, WriteBytes); +	return Status; +} -			/* Writing the data from Flash 2.x */ -			Status = BcmFlash2xBulkWrite(Adapter, (PUINT)pWriteBuff, sFlash2xWrite.Section, WriteOffset, WriteBytes, sFlash2xWrite.bVerify); +static int bcm_char_ioctl_copy_section(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_flash2x_copy_section sCopySectStrut = {0}; +	struct bcm_ioctl_buffer IoBuffer; +	INT Status = STATUS_SUCCESS; -			if (Status) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Flash 2x read err with Status :%d", Status); -				break; -			} +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"IOCTL_BCM_COPY_SECTION  Called"); -			NOB = NOB - WriteBytes; -			if (NOB) { -				WriteOffset = WriteOffset + WriteBytes; -				InputAddr = InputAddr + WriteBytes; -				if (NOB > Adapter->uiSectorSize) -					WriteBytes = Adapter->uiSectorSize; -				else -					WriteBytes = NOB; -			} -		} while (NOB > 0); +	Adapter->bAllDSDWriteAllow = false; +	if (IsFlash2x(Adapter) != TRUE) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Flash Does not have 2.x map"); +		return -EINVAL; +	} -		BcmFlash2xWriteSig(Adapter, sFlash2xWrite.Section); -		up(&Adapter->NVMRdmWrmLock); -		kfree(pWriteBuff); +	Status = copy_from_user(&IoBuffer, argp, +				sizeof(struct bcm_ioctl_buffer)); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Copy of IOCTL BUFFER failed Status :%d", +				Status); +		return -EFAULT;  	} -	break; -	case IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP: { -		struct bcm_flash2x_bitmap *psFlash2xBitMap; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP Called"); +	Status = copy_from_user(&sCopySectStrut, IoBuffer.InputBuffer, +				sizeof(struct bcm_flash2x_copy_section)); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Copy of Copy_Section_Struct failed with Status :%d", +				Status); +		return -EFAULT; +	} -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"Source SEction :%x", sCopySectStrut.SrcSection); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"Destination SEction :%x", sCopySectStrut.DstSection); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"offset :%x", sCopySectStrut.offset); +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"NOB :%x", sCopySectStrut.numOfBytes); -		if (IoBuffer.OutputLength != sizeof(struct bcm_flash2x_bitmap)) -			return -EINVAL; +	if (IsSectionExistInFlash(Adapter, sCopySectStrut.SrcSection) == false) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Source Section<%x> does not exist in Flash ", +				sCopySectStrut.SrcSection); +		return -EINVAL; +	} -		psFlash2xBitMap = kzalloc(sizeof(struct bcm_flash2x_bitmap), GFP_KERNEL); -		if (psFlash2xBitMap == NULL) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Memory is not available"); -			return -ENOMEM; -		} +	if (IsSectionExistInFlash(Adapter, sCopySectStrut.DstSection) == false) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Destinatio Section<%x> does not exist in Flash ", +				sCopySectStrut.DstSection); +		return -EINVAL; +	} -		/* Reading the Flash Sectio Bit map */ -		down(&Adapter->NVMRdmWrmLock); +	if (sCopySectStrut.SrcSection == sCopySectStrut.DstSection) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"Source and Destination section should be different"); +		return -EINVAL; +	} -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { +	down(&Adapter->NVMRdmWrmLock); -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Device is in Idle/Shutdown Mode\n"); -			up(&Adapter->NVMRdmWrmLock); -			kfree(psFlash2xBitMap); -			return -EACCES; -		} +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -		BcmGetFlash2xSectionalBitMap(Adapter, psFlash2xBitMap); +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"Device is in Idle/Shutdown Mode\n");  		up(&Adapter->NVMRdmWrmLock); -		if (copy_to_user(IoBuffer.OutputBuffer, psFlash2xBitMap, sizeof(struct bcm_flash2x_bitmap))) { -			kfree(psFlash2xBitMap); -			return -EFAULT; +		return -EACCES; +	} + +	if (sCopySectStrut.SrcSection == ISO_IMAGE1 || +		sCopySectStrut.SrcSection == ISO_IMAGE2) { +		if (IsNonCDLessDevice(Adapter)) { +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +					"Device is Non-CDLess hence won't have ISO !!"); +			Status = -EINVAL; +		} else if (sCopySectStrut.numOfBytes == 0) { +			Status = BcmCopyISO(Adapter, sCopySectStrut); +		} else { +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +					"Partial Copy of ISO section is not Allowed.."); +			Status = STATUS_FAILURE;  		} +		up(&Adapter->NVMRdmWrmLock); +		return Status; +	} -		kfree(psFlash2xBitMap); +	Status = BcmCopySection(Adapter, sCopySectStrut.SrcSection, +				sCopySectStrut.DstSection, +				sCopySectStrut.offset, +				sCopySectStrut.numOfBytes); +	up(&Adapter->NVMRdmWrmLock); +	return Status; +} + +static int bcm_char_ioctl_get_flash_cs_info(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_ioctl_buffer IoBuffer; +	INT Status = STATUS_SUCCESS; + +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			" IOCTL_BCM_GET_FLASH_CS_INFO Called"); + +	Status = copy_from_user(&IoBuffer, argp, +			sizeof(struct bcm_ioctl_buffer)); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Copy of IOCTL BUFFER failed"); +		return -EFAULT;  	} -	break; -	case IOCTL_BCM_SET_ACTIVE_SECTION: { -		enum bcm_flash2x_section_val eFlash2xSectionVal = 0; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SET_ACTIVE_SECTION Called"); +	if (Adapter->eNVMType != NVM_FLASH) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Connected device does not have flash"); +		return -EINVAL; +	} -		if (IsFlash2x(Adapter) != TRUE) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Flash Does not have 2.x map"); +	if (IsFlash2x(Adapter) == TRUE) { +		if (IoBuffer.OutputLength < sizeof(struct bcm_flash2x_cs_info))  			return -EINVAL; -		} -		Status = copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer)); -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed"); +		if (copy_to_user(IoBuffer.OutputBuffer, +				 Adapter->psFlash2xCSInfo, +				 sizeof(struct bcm_flash2x_cs_info)))  			return -EFAULT; -		} +	} else { +		if (IoBuffer.OutputLength < sizeof(struct bcm_flash_cs_info)) +			return -EINVAL; -		Status = copy_from_user(&eFlash2xSectionVal, IoBuffer.InputBuffer, sizeof(INT)); -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy of flash section val failed"); +		if (copy_to_user(IoBuffer.OutputBuffer, Adapter->psFlashCSInfo, +				 sizeof(struct bcm_flash_cs_info)))  			return -EFAULT; -		} - -		down(&Adapter->NVMRdmWrmLock); +	} +	return Status; +} -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { +static int bcm_char_ioctl_select_dsd(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_ioctl_buffer IoBuffer; +	INT Status = STATUS_FAILURE; +	UINT SectOfset = 0; +	enum bcm_flash2x_section_val eFlash2xSectionVal; -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Device is in Idle/Shutdown Mode\n"); -			up(&Adapter->NVMRdmWrmLock); -			return -EACCES; -		} +	eFlash2xSectionVal = NO_SECTION_VAL; +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"IOCTL_BCM_SELECT_DSD Called"); -		Status = BcmSetActiveSection(Adapter, eFlash2xSectionVal); -		if (Status) -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Failed to make it's priority Highest. Status %d", Status); +	if (IsFlash2x(Adapter) != TRUE) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Flash Does not have 2.x map"); +		return -EINVAL; +	} -		up(&Adapter->NVMRdmWrmLock); +	Status = copy_from_user(&IoBuffer, argp, +				sizeof(struct bcm_ioctl_buffer)); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Copy of IOCTL BUFFER failed"); +		return -EFAULT; +	} +	Status = copy_from_user(&eFlash2xSectionVal, IoBuffer.InputBuffer, +		sizeof(INT)); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Copy of flash section val failed"); +		return -EFAULT;  	} -	break; -	case IOCTL_BCM_IDENTIFY_ACTIVE_SECTION: { -		/* Right Now we are taking care of only DSD */ -		Adapter->bAllDSDWriteAllow = FALSE; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_IDENTIFY_ACTIVE_SECTION called"); -		Status = STATUS_SUCCESS; +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"Read Section :%d", eFlash2xSectionVal); +	if ((eFlash2xSectionVal != DSD0) && +		(eFlash2xSectionVal != DSD1) && +		(eFlash2xSectionVal != DSD2)) { + +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Passed section<%x> is not DSD section", +				eFlash2xSectionVal); +		return STATUS_FAILURE;  	} -	break; -	case IOCTL_BCM_COPY_SECTION: { -		struct bcm_flash2x_copy_section sCopySectStrut = {0}; -		Status = STATUS_SUCCESS; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_COPY_SECTION  Called"); +	SectOfset = BcmGetSectionValStartOffset(Adapter, eFlash2xSectionVal); +	if (SectOfset == INVALID_OFFSET) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Provided Section val <%d> does not exist in Flash 2.x", +				eFlash2xSectionVal); +		return -EINVAL; +	} -		Adapter->bAllDSDWriteAllow = FALSE; -		if (IsFlash2x(Adapter) != TRUE) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Flash Does not have 2.x map"); -			return -EINVAL; -		} +	Adapter->bAllDSDWriteAllow = TRUE; +	Adapter->ulFlashCalStart = SectOfset; +	Adapter->eActiveDSD = eFlash2xSectionVal; -		Status = copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer)); -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed Status :%d", Status); -			return -EFAULT; -		} +	return STATUS_SUCCESS; +} -		Status = copy_from_user(&sCopySectStrut, IoBuffer.InputBuffer, sizeof(struct bcm_flash2x_copy_section)); -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy of Copy_Section_Struct failed with Status :%d", Status); -			return -EFAULT; -		} +static int bcm_char_ioctl_nvm_raw_read(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_nvm_readwrite stNVMRead; +	struct bcm_ioctl_buffer IoBuffer; +	unsigned int NOB; +	INT BuffSize; +	INT ReadOffset = 0; +	UINT ReadBytes = 0; +	PUCHAR pReadBuff; +	void __user *OutPutBuff; +	INT Status = STATUS_FAILURE; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Source SEction :%x", sCopySectStrut.SrcSection); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Destination SEction :%x", sCopySectStrut.DstSection); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "offset :%x", sCopySectStrut.offset); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "NOB :%x", sCopySectStrut.numOfBytes); +	if (Adapter->eNVMType != NVM_FLASH) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"NVM TYPE is not Flash"); +		return -EINVAL; +	} -		if (IsSectionExistInFlash(Adapter, sCopySectStrut.SrcSection) == FALSE) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Source Section<%x> does not exixt in Flash ", sCopySectStrut.SrcSection); -			return -EINVAL; -		} +	/* Copy Ioctl Buffer structure */ +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"copy_from_user 1 failed\n"); +		return -EFAULT; +	} -		if (IsSectionExistInFlash(Adapter, sCopySectStrut.DstSection) == FALSE) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Destinatio Section<%x> does not exixt in Flash ", sCopySectStrut.DstSection); -			return -EINVAL; -		} +	if (copy_from_user(&stNVMRead, IoBuffer.OutputBuffer, +		sizeof(struct bcm_nvm_readwrite))) +		return -EFAULT; -		if (sCopySectStrut.SrcSection == sCopySectStrut.DstSection) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Source and Destination section should be different"); -			return -EINVAL; -		} +	NOB = stNVMRead.uiNumBytes; +	/* In Raw-Read max Buff size : 64MB */ -		down(&Adapter->NVMRdmWrmLock); +	if (NOB > DEFAULT_BUFF_SIZE) +		BuffSize = DEFAULT_BUFF_SIZE; +	else +		BuffSize = NOB; -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { +	ReadOffset = stNVMRead.uiOffset; +	OutPutBuff = stNVMRead.pBuffer; -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Device is in Idle/Shutdown Mode\n"); -			up(&Adapter->NVMRdmWrmLock); -			return -EACCES; -		} +	pReadBuff = kzalloc(BuffSize , GFP_KERNEL); +	if (pReadBuff == NULL) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +				"Memory allocation failed for Flash 2.x Read Structure"); +		return -ENOMEM; +	} +	down(&Adapter->NVMRdmWrmLock); -		if (sCopySectStrut.SrcSection == ISO_IMAGE1 || sCopySectStrut.SrcSection == ISO_IMAGE2) { -			if (IsNonCDLessDevice(Adapter)) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Device is Non-CDLess hence won't have ISO !!"); -				Status = -EINVAL; -			} else if (sCopySectStrut.numOfBytes == 0) { -				Status = BcmCopyISO(Adapter, sCopySectStrut); -			} else { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Partial Copy of ISO section is not Allowed.."); -				Status = STATUS_FAILURE; -			} -			up(&Adapter->NVMRdmWrmLock); -			return Status; -		} +	if ((Adapter->IdleMode == TRUE) || +		(Adapter->bShutStatus == TRUE) || +		(Adapter->bPreparingForLowPowerMode == TRUE)) { -		Status = BcmCopySection(Adapter, sCopySectStrut.SrcSection, -					sCopySectStrut.DstSection, sCopySectStrut.offset, sCopySectStrut.numOfBytes); +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"Device is in Idle/Shutdown Mode\n"); +		kfree(pReadBuff);  		up(&Adapter->NVMRdmWrmLock); +		return -EACCES;  	} -	break; -	case IOCTL_BCM_GET_FLASH_CS_INFO: { -		Status = STATUS_SUCCESS; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, " IOCTL_BCM_GET_FLASH_CS_INFO Called"); +	Adapter->bFlashRawRead = TRUE; -		Status = copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer)); +	while (NOB) { +		if (NOB > DEFAULT_BUFF_SIZE) +			ReadBytes = DEFAULT_BUFF_SIZE; +		else +			ReadBytes = NOB; + +		/* Reading the data from Flash 2.x */ +		Status = BeceemNVMRead(Adapter, (PUINT)pReadBuff, +			ReadOffset, ReadBytes);  		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed"); -			return -EFAULT; +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +					"Flash 2x read err with Status :%d", +					Status); +			break;  		} -		if (Adapter->eNVMType != NVM_FLASH) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Connected device does not have flash"); -			Status = -EINVAL; -			break; +		BCM_DEBUG_PRINT_BUFFER(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, +				       DBG_LVL_ALL, pReadBuff, ReadBytes); + +		Status = copy_to_user(OutPutBuff, pReadBuff, ReadBytes); +		if (Status) { +			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, +					"Copy to use failed with status :%d", +					Status); +			up(&Adapter->NVMRdmWrmLock); +			kfree(pReadBuff); +			return -EFAULT; +		} +		NOB = NOB - ReadBytes; +		if (NOB) { +			ReadOffset = ReadOffset + ReadBytes; +			OutPutBuff = OutPutBuff + ReadBytes;  		} +	} +	Adapter->bFlashRawRead = false; +	up(&Adapter->NVMRdmWrmLock); +	kfree(pReadBuff); +	return Status; +} -		if (IsFlash2x(Adapter) == TRUE) { -			if (IoBuffer.OutputLength < sizeof(struct bcm_flash2x_cs_info)) -				return -EINVAL; +static int bcm_char_ioctl_cntrlmsg_mask(void __user *argp, +	struct bcm_mini_adapter *Adapter, struct bcm_tarang_data *pTarang) +{ +	struct bcm_ioctl_buffer IoBuffer; +	INT Status = STATUS_FAILURE; +	ULONG RxCntrlMsgBitMask = 0; -			if (copy_to_user(IoBuffer.OutputBuffer, Adapter->psFlash2xCSInfo, sizeof(struct bcm_flash2x_cs_info))) -				return -EFAULT; -		} else { -			if (IoBuffer.OutputLength < sizeof(struct bcm_flash_cs_info)) -				return -EINVAL; +	/* Copy Ioctl Buffer structure */ +	Status = copy_from_user(&IoBuffer, argp, +			sizeof(struct bcm_ioctl_buffer)); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"copy of Ioctl buffer is failed from user space"); +		return -EFAULT; +	} -			if (copy_to_user(IoBuffer.OutputBuffer, Adapter->psFlashCSInfo, sizeof(struct bcm_flash_cs_info))) -				return -EFAULT; -		} +	if (IoBuffer.InputLength != sizeof(unsigned long)) +		return -EINVAL; + +	Status = copy_from_user(&RxCntrlMsgBitMask, IoBuffer.InputBuffer, +				IoBuffer.InputLength); +	if (Status) { +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"copy of control bit mask failed from user space"); +		return -EFAULT;  	} -	break; +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"\n Got user defined cntrl msg bit mask :%lx", +			RxCntrlMsgBitMask); +	pTarang->RxCntrlMsgBitMask = RxCntrlMsgBitMask; -	case IOCTL_BCM_SELECT_DSD: { -		UINT SectOfset = 0; -		enum bcm_flash2x_section_val eFlash2xSectionVal; -		eFlash2xSectionVal = NO_SECTION_VAL; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_SELECT_DSD Called"); +	return Status; +} -		if (IsFlash2x(Adapter) != TRUE) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Flash Does not have 2.x map"); -			return -EINVAL; -		} +static int bcm_char_ioctl_get_device_driver_info(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_driver_info DevInfo; +	struct bcm_ioctl_buffer IoBuffer; -		Status = copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer)); -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy of IOCTL BUFFER failed"); -			return -EFAULT; -		} -		Status = copy_from_user(&eFlash2xSectionVal, IoBuffer.InputBuffer, sizeof(INT)); -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy of flash section val failed"); -			return -EFAULT; -		} +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"Called IOCTL_BCM_GET_DEVICE_DRIVER_INFO\n"); -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Read Section :%d", eFlash2xSectionVal); -		if ((eFlash2xSectionVal != DSD0) && -			(eFlash2xSectionVal != DSD1) && -			(eFlash2xSectionVal != DSD2)) { +	memset(&DevInfo, 0, sizeof(DevInfo)); +	DevInfo.MaxRDMBufferSize = BUFFER_4K; +	DevInfo.u32DSDStartOffset = EEPROM_CALPARAM_START; +	DevInfo.u32RxAlignmentCorrection = 0; +	DevInfo.u32NVMType = Adapter->eNVMType; +	DevInfo.u32InterfaceType = BCM_USB; -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Passed section<%x> is not DSD section", eFlash2xSectionVal); -			return STATUS_FAILURE; -		} +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		SectOfset = BcmGetSectionValStartOffset(Adapter, eFlash2xSectionVal); -		if (SectOfset == INVALID_OFFSET) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Provided Section val <%d> does not exixt in Flash 2.x", eFlash2xSectionVal); -			return -EINVAL; -		} +	if (IoBuffer.OutputLength < sizeof(DevInfo)) +		return -EINVAL; -		Adapter->bAllDSDWriteAllow = TRUE; -		Adapter->ulFlashCalStart = SectOfset; -		Adapter->eActiveDSD = eFlash2xSectionVal; -	} -	Status = STATUS_SUCCESS; -	break; +	if (copy_to_user(IoBuffer.OutputBuffer, &DevInfo, sizeof(DevInfo))) +		return -EFAULT; -	case IOCTL_BCM_NVM_RAW_READ: { -		struct bcm_nvm_readwrite stNVMRead; -		INT NOB ; -		INT BuffSize ; -		INT ReadOffset = 0; -		UINT ReadBytes = 0 ; -		PUCHAR pReadBuff; -		void __user *OutPutBuff; +	return STATUS_SUCCESS; +} -		if (Adapter->eNVMType != NVM_FLASH) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "NVM TYPE is not Flash"); -			return -EINVAL; -		} +static int bcm_char_ioctl_time_since_net_entry(void __user *argp, +	struct bcm_mini_adapter *Adapter) +{ +	struct bcm_time_elapsed stTimeElapsedSinceNetEntry = {0}; +	struct bcm_ioctl_buffer IoBuffer; -		/* Copy Ioctl Buffer structure */ -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "copy_from_user 1 failed\n"); -			return -EFAULT; -		} +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"IOCTL_BCM_TIME_SINCE_NET_ENTRY called"); -		if (copy_from_user(&stNVMRead, IoBuffer.OutputBuffer, sizeof(struct bcm_nvm_readwrite))) -			return -EFAULT; +	if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) +		return -EFAULT; -		NOB = stNVMRead.uiNumBytes; -		/* In Raw-Read max Buff size : 64MB */ +	if (IoBuffer.OutputLength < sizeof(struct bcm_time_elapsed)) +		return -EINVAL; -		if (NOB > DEFAULT_BUFF_SIZE) -			BuffSize = DEFAULT_BUFF_SIZE; -		else -			BuffSize = NOB; +	stTimeElapsedSinceNetEntry.ul64TimeElapsedSinceNetEntry = +		get_seconds() - Adapter->liTimeSinceLastNetEntry; -		ReadOffset = stNVMRead.uiOffset; -		OutPutBuff = stNVMRead.pBuffer; +	if (copy_to_user(IoBuffer.OutputBuffer, &stTimeElapsedSinceNetEntry, +			 sizeof(struct bcm_time_elapsed))) +		return -EFAULT; -		pReadBuff = kzalloc(BuffSize , GFP_KERNEL); -		if (pReadBuff == NULL) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Memory allocation failed for Flash 2.x Read Structure"); -			Status = -ENOMEM; -			break; -		} -		down(&Adapter->NVMRdmWrmLock); +	return STATUS_SUCCESS; +} -		if ((Adapter->IdleMode == TRUE) || -			(Adapter->bShutStatus == TRUE) || -			(Adapter->bPreparingForLowPowerMode == TRUE)) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Device is in Idle/Shutdown Mode\n"); -			kfree(pReadBuff); -			up(&Adapter->NVMRdmWrmLock); +static long bcm_char_ioctl(struct file *filp, UINT cmd, ULONG arg) +{ +	struct bcm_tarang_data *pTarang = filp->private_data; +	void __user *argp = (void __user *)arg; +	struct bcm_mini_adapter *Adapter = pTarang->Adapter; +	INT Status = STATUS_FAILURE; + +	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +			"Parameters Passed to control IOCTL cmd=0x%X arg=0x%lX", +			cmd, arg); + +	if (_IOC_TYPE(cmd) != BCM_IOCTL) +		return -EFAULT; +	if (_IOC_DIR(cmd) & _IOC_READ) +		Status = !access_ok(VERIFY_WRITE, argp, _IOC_SIZE(cmd)); +	else if (_IOC_DIR(cmd) & _IOC_WRITE) +		Status = !access_ok(VERIFY_READ, argp, _IOC_SIZE(cmd)); +	else if (_IOC_NONE == (_IOC_DIR(cmd) & _IOC_NONE)) +		Status = STATUS_SUCCESS; + +	if (Status) +		return -EFAULT; + +	if (Adapter->device_removed) +		return -EFAULT; + +	if (false == Adapter->fw_download_done) { +		switch (cmd) { +		case IOCTL_MAC_ADDR_REQ: +		case IOCTL_LINK_REQ: +		case IOCTL_CM_REQUEST: +		case IOCTL_SS_INFO_REQ: +		case IOCTL_SEND_CONTROL_MESSAGE: +		case IOCTL_IDLE_REQ: +		case IOCTL_BCM_GPIO_SET_REQUEST: +		case IOCTL_BCM_GPIO_STATUS_REQUEST:  			return -EACCES; +		default: +			break;  		} +	} -		Adapter->bFlashRawRead = TRUE; +	Status = vendorextnIoctl(Adapter, cmd, arg); +	if (Status != CONTINUE_COMMON_PATH) +		return Status; -		while (NOB) { -			if (NOB > DEFAULT_BUFF_SIZE) -				ReadBytes = DEFAULT_BUFF_SIZE; -			else -				ReadBytes = NOB; +	switch (cmd) { +	/* Rdms for Swin Idle... */ +	case IOCTL_BCM_REGISTER_READ_PRIVATE: +		Status = bcm_char_ioctl_reg_read_private(argp, Adapter); +		return Status; -			/* Reading the data from Flash 2.x */ -			Status = BeceemNVMRead(Adapter, (PUINT)pReadBuff, ReadOffset, ReadBytes); -			if (Status) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Flash 2x read err with Status :%d", Status); -				break; -			} +	case IOCTL_BCM_REGISTER_WRITE_PRIVATE: +		Status = bcm_char_ioctl_reg_write_private(argp, Adapter); +		return Status; + +	case IOCTL_BCM_REGISTER_READ: +	case IOCTL_BCM_EEPROM_REGISTER_READ: +		Status = bcm_char_ioctl_eeprom_reg_read(argp, Adapter); +		return Status; -			BCM_DEBUG_PRINT_BUFFER(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, pReadBuff, ReadBytes); +	case IOCTL_BCM_REGISTER_WRITE: +	case IOCTL_BCM_EEPROM_REGISTER_WRITE: +		Status = bcm_char_ioctl_eeprom_reg_write(argp, Adapter, cmd); +		return Status; -			Status = copy_to_user(OutPutBuff, pReadBuff, ReadBytes); -			if (Status) { -				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Copy to use failed with status :%d", Status); -				up(&Adapter->NVMRdmWrmLock); -				kfree(pReadBuff); -				return -EFAULT; -			} -			NOB = NOB - ReadBytes; -			if (NOB) { -				ReadOffset = ReadOffset + ReadBytes; -				OutPutBuff = OutPutBuff + ReadBytes; -			} -		} -		Adapter->bFlashRawRead = FALSE; -		up(&Adapter->NVMRdmWrmLock); -		kfree(pReadBuff); +	case IOCTL_BCM_GPIO_SET_REQUEST: +		Status = bcm_char_ioctl_gpio_set_request(argp, Adapter); +		return Status; + +	case BCM_LED_THREAD_STATE_CHANGE_REQ: +		Status = bcm_char_ioctl_led_thread_state_change_req(argp, +								    Adapter); +		return Status; + +	case IOCTL_BCM_GPIO_STATUS_REQUEST: +		Status = bcm_char_ioctl_gpio_status_request(argp, Adapter); +		return Status; + +	case IOCTL_BCM_GPIO_MULTI_REQUEST: +		Status = bcm_char_ioctl_gpio_multi_request(argp, Adapter); +		return Status; + +	case IOCTL_BCM_GPIO_MODE_REQUEST: +		Status = bcm_char_ioctl_gpio_mode_request(argp, Adapter); +		return Status; + +	case IOCTL_MAC_ADDR_REQ: +	case IOCTL_LINK_REQ: +	case IOCTL_CM_REQUEST: +	case IOCTL_SS_INFO_REQ: +	case IOCTL_SEND_CONTROL_MESSAGE: +	case IOCTL_IDLE_REQ: +		Status = bcm_char_ioctl_misc_request(argp, Adapter); +		return Status; + +	case IOCTL_BCM_BUFFER_DOWNLOAD_START: +		Status = bcm_char_ioctl_buffer_download_start(Adapter); +		return Status; + +	case IOCTL_BCM_BUFFER_DOWNLOAD: +		Status = bcm_char_ioctl_buffer_download(argp, Adapter); +		return Status; + +	case IOCTL_BCM_BUFFER_DOWNLOAD_STOP: +		Status = bcm_char_ioctl_buffer_download_stop(argp, Adapter); +		return Status; + + +	case IOCTL_BE_BUCKET_SIZE: +		Status = 0; +		if (get_user(Adapter->BEBucketSize, +			     (unsigned long __user *)arg)) +			Status = -EFAULT; +		break; + +	case IOCTL_RTPS_BUCKET_SIZE: +		Status = 0; +		if (get_user(Adapter->rtPSBucketSize, +			     (unsigned long __user *)arg)) +			Status = -EFAULT;  		break; -	} -	case IOCTL_BCM_CNTRLMSG_MASK: { -		ULONG RxCntrlMsgBitMask = 0; +	case IOCTL_CHIP_RESET: +		Status = bcm_char_ioctl_chip_reset(Adapter); +		return Status; -		/* Copy Ioctl Buffer structure */ -		Status = copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer)); -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "copy of Ioctl buffer is failed from user space"); -			return -EFAULT; -		} +	case IOCTL_QOS_THRESHOLD: +		Status = bcm_char_ioctl_qos_threshold(arg, Adapter); +		return Status; -		if (IoBuffer.InputLength != sizeof(unsigned long)) { -			Status = -EINVAL; -			break; -		} +	case IOCTL_DUMP_PACKET_INFO: +		DumpPackInfo(Adapter); +		DumpPhsRules(&Adapter->stBCMPhsContext); +		Status = STATUS_SUCCESS; +		break; -		Status = copy_from_user(&RxCntrlMsgBitMask, IoBuffer.InputBuffer, IoBuffer.InputLength); -		if (Status) { -			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "copy of control bit mask failed from user space"); +	case IOCTL_GET_PACK_INFO: +		if (copy_to_user(argp, &Adapter->PackInfo, +				 sizeof(struct bcm_packet_info)*NO_OF_QUEUES))  			return -EFAULT; +		Status = STATUS_SUCCESS; +		break; + +	case IOCTL_BCM_SWITCH_TRANSFER_MODE: +		Status = bcm_char_ioctl_switch_transfer_mode(argp, Adapter); +		return Status; + +	case IOCTL_BCM_GET_DRIVER_VERSION: +		Status = bcm_char_ioctl_get_driver_version(argp); +		return Status; + +	case IOCTL_BCM_GET_CURRENT_STATUS: +		Status = bcm_char_ioctl_get_current_status(argp, Adapter); +		return Status; + +	case IOCTL_BCM_SET_MAC_TRACING: +		Status = bcm_char_ioctl_set_mac_tracing(argp, Adapter); +		return Status; + +	case IOCTL_BCM_GET_DSX_INDICATION: +		Status = bcm_char_ioctl_get_dsx_indication(argp, Adapter); +		return Status; + +	case IOCTL_BCM_GET_HOST_MIBS: +		Status = bcm_char_ioctl_get_host_mibs(argp, Adapter, pTarang); +		return Status; + +	case IOCTL_BCM_WAKE_UP_DEVICE_FROM_IDLE: +		if ((false == Adapter->bTriedToWakeUpFromlowPowerMode) && +				(TRUE == Adapter->IdleMode)) { +			Adapter->usIdleModePattern = ABORT_IDLE_MODE; +			Adapter->bWakeUpDevice = TRUE; +			wake_up(&Adapter->process_rx_cntrlpkt);  		} -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "\n Got user defined cntrl msg bit mask :%lx", RxCntrlMsgBitMask); -		pTarang->RxCntrlMsgBitMask = RxCntrlMsgBitMask; -	} -	break; -	case IOCTL_BCM_GET_DEVICE_DRIVER_INFO: { -		struct bcm_driver_info DevInfo; +		Status = STATUS_SUCCESS; +		break; + +	case IOCTL_BCM_BULK_WRM: +		Status = bcm_char_ioctl_bulk_wrm(argp, Adapter, cmd); +		return Status; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "Called IOCTL_BCM_GET_DEVICE_DRIVER_INFO\n"); +	case IOCTL_BCM_GET_NVM_SIZE: +		Status = bcm_char_ioctl_get_nvm_size(argp, Adapter); +		return Status; -		DevInfo.MaxRDMBufferSize = BUFFER_4K; -		DevInfo.u32DSDStartOffset = EEPROM_CALPARAM_START; -		DevInfo.u32RxAlignmentCorrection = 0; -		DevInfo.u32NVMType = Adapter->eNVMType; -		DevInfo.u32InterfaceType = BCM_USB; +	case IOCTL_BCM_CAL_INIT: +		Status = bcm_char_ioctl_cal_init(argp, Adapter); +		return Status; -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	case IOCTL_BCM_SET_DEBUG: +		Status = bcm_char_ioctl_set_debug(argp, Adapter); +		return Status; -		if (IoBuffer.OutputLength < sizeof(DevInfo)) -			return -EINVAL; +	case IOCTL_BCM_NVM_READ: +	case IOCTL_BCM_NVM_WRITE: +		Status = bcm_char_ioctl_nvm_rw(argp, Adapter, cmd); +		return Status; -		if (copy_to_user(IoBuffer.OutputBuffer, &DevInfo, sizeof(DevInfo))) -			return -EFAULT; -	} -	break; +	case IOCTL_BCM_FLASH2X_SECTION_READ: +		Status = bcm_char_ioctl_flash2x_section_read(argp, Adapter); +		return Status; -	case IOCTL_BCM_TIME_SINCE_NET_ENTRY: { -		struct bcm_time_elapsed stTimeElapsedSinceNetEntry = {0}; +	case IOCTL_BCM_FLASH2X_SECTION_WRITE: +		Status = bcm_char_ioctl_flash2x_section_write(argp, Adapter); +		return Status; -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_BCM_TIME_SINCE_NET_ENTRY called"); +	case IOCTL_BCM_GET_FLASH2X_SECTION_BITMAP: +		Status = bcm_char_ioctl_flash2x_section_bitmap(argp, Adapter); +		return Status; -		if (copy_from_user(&IoBuffer, argp, sizeof(struct bcm_ioctl_buffer))) -			return -EFAULT; +	case IOCTL_BCM_SET_ACTIVE_SECTION: +		Status = bcm_char_ioctl_set_active_section(argp, Adapter); +		return Status; -		if (IoBuffer.OutputLength < sizeof(struct bcm_time_elapsed)) -			return -EINVAL; +	case IOCTL_BCM_IDENTIFY_ACTIVE_SECTION: +		/* Right Now we are taking care of only DSD */ +		Adapter->bAllDSDWriteAllow = false; +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"IOCTL_BCM_IDENTIFY_ACTIVE_SECTION called"); +		Status = STATUS_SUCCESS; +		break; + +	case IOCTL_BCM_COPY_SECTION: +		Status = bcm_char_ioctl_copy_section(argp, Adapter); +		return Status; -		stTimeElapsedSinceNetEntry.ul64TimeElapsedSinceNetEntry = get_seconds() - Adapter->liTimeSinceLastNetEntry; +	case IOCTL_BCM_GET_FLASH_CS_INFO: +		Status = bcm_char_ioctl_get_flash_cs_info(argp, Adapter); +		return Status; -		if (copy_to_user(IoBuffer.OutputBuffer, &stTimeElapsedSinceNetEntry, sizeof(struct bcm_time_elapsed))) -			return -EFAULT; -	} -	break; +	case IOCTL_BCM_SELECT_DSD: +		Status = bcm_char_ioctl_select_dsd(argp, Adapter); +		return Status; + +	case IOCTL_BCM_NVM_RAW_READ: +		Status = bcm_char_ioctl_nvm_raw_read(argp, Adapter); +		return Status; + +	case IOCTL_BCM_CNTRLMSG_MASK: +		Status = bcm_char_ioctl_cntrlmsg_mask(argp, Adapter, pTarang); +		return Status; + +	case IOCTL_BCM_GET_DEVICE_DRIVER_INFO: +		Status = bcm_char_ioctl_get_device_driver_info(argp, Adapter); +		return Status; + +	case IOCTL_BCM_TIME_SINCE_NET_ENTRY: +		Status = bcm_char_ioctl_time_since_net_entry(argp, Adapter); +		return Status;  	case IOCTL_CLOSE_NOTIFICATION: -		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, "IOCTL_CLOSE_NOTIFICATION"); +		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, OSAL_DBG, DBG_LVL_ALL, +				"IOCTL_CLOSE_NOTIFICATION");  		break;  	default: @@ -2030,8 +2630,8 @@ int register_control_device_interface(struct bcm_mini_adapter *Adapter)  	}  	Adapter->pstCreatedClassDevice = device_create(bcm_class, NULL, -						MKDEV(Adapter->major, 0), -						Adapter, DEV_NAME); +						       MKDEV(Adapter->major, 0), +						       Adapter, DEV_NAME);  	if (IS_ERR(Adapter->pstCreatedClassDevice)) {  		pr_err(DRV_NAME ": class device create failed\n");  | 
