Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5c34a1a authored by Matthias Beyer's avatar Matthias Beyer Committed by Greg Kroah-Hartman
Browse files

Staging: bcm: Outsourced IsFlash2x() handling



This patch outsources the code from the IsFlash2x() check in
bcm_char_ioctl_nvm_rw() function to shorten it.

Signed-off-by: default avatarMatthias Beyer <mail@beyermatthias.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8224ac2a
Loading
Loading
Loading
Loading
+55 −43
Original line number Diff line number Diff line
@@ -39,6 +39,56 @@ static int bcm_handle_nvm_read_cmd(struct bcm_mini_adapter *Adapter,
	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()
*
@@ -1437,7 +1487,6 @@ static int bcm_char_ioctl_nvm_rw(void __user *argp,
	struct timeval tv0, tv1;
	struct bcm_ioctl_buffer IoBuffer;
	PUCHAR pReadData = NULL;
	ULONG ulDSDMagicNumInUsrBuff = 0;
	INT Status = STATUS_FAILURE;

	memset(&tv0, 0, sizeof(struct timeval));
@@ -1508,48 +1557,11 @@ static int bcm_char_ioctl_nvm_rw(void __user *argp,

		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;
				}
			}
			int ret = handle_flash2x_adapter(Adapter,
							pReadData,
							&stNVMReadWrite);
			if (ret != STATUS_SUCCESS)
				return ret;
		}

		Status = BeceemNVMWrite(Adapter, (PUINT)pReadData,