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

Commit 6f953fbb authored by Marek Belisko's avatar Marek Belisko Committed by Greg Kroah-Hartman
Browse files

staging: ft1000: Fix indentation in scram_dnldr() function.

parent 857af455
Loading
Loading
Loading
Loading
+518 −430
Original line number Diff line number Diff line
@@ -694,7 +694,8 @@ static u32 write_blk_fifo(struct ft1000_device *ft1000dev, u16 **pUsFile,
//  Returns:    status                  - return code
//---------------------------------------------------------------------------

u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32  FileLength)
u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart,
		u32 FileLength)
{
	u16 status = STATUS_SUCCESS;
	u32 state;
@@ -733,7 +734,6 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
	pft1000info->usbboot = 0;
	pft1000info->dspalive = 0xffff;


	//
	// Get version id of file, at first 4 bytes of file, for newer files.
	//
@@ -753,25 +753,27 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
	loader_code_size = file_hdr->loader_code_size;
	correct_version = FALSE;

   while ((status == STATUS_SUCCESS) && (state != STATE_DONE_FILE))
   {
      switch (state)
      {
	while ((status == STATUS_SUCCESS) && (state != STATE_DONE_FILE)) {
		switch (state) {
		case STATE_START_DWNLD:
			DEBUG("FT1000:STATE_START_DWNLD\n");
			if (pft1000info->usbboot)
             handshake = get_handshake_usb(ft1000dev, HANDSHAKE_DSP_BL_READY);
         else
             handshake = get_handshake(ft1000dev, HANDSHAKE_DSP_BL_READY);

         if (handshake == HANDSHAKE_DSP_BL_READY)
         {
            DEBUG("scram_dnldr: handshake is HANDSHAKE_DSP_BL_READY, call put_handshake(HANDSHAKE_DRIVER_READY)\n");
            put_handshake(ft1000dev, HANDSHAKE_DRIVER_READY);
         }
				handshake =
				    get_handshake_usb(ft1000dev,
						      HANDSHAKE_DSP_BL_READY);
			else
         {
            DEBUG("FT1000:download:Download error: Handshake failed\n");
				handshake =
				    get_handshake(ft1000dev,
						  HANDSHAKE_DSP_BL_READY);

			if (handshake == HANDSHAKE_DSP_BL_READY) {
				DEBUG
				    ("scram_dnldr: handshake is HANDSHAKE_DSP_BL_READY, call put_handshake(HANDSHAKE_DRIVER_READY)\n");
				put_handshake(ft1000dev,
					      HANDSHAKE_DRIVER_READY);
			} else {
				DEBUG
				    ("FT1000:download:Download error: Handshake failed\n");
				status = STATUS_FAILURE;
			}

@@ -783,21 +785,21 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
			DEBUG("FT1000:STATE_BOOT_DWNLD\n");
			pft1000info->bootmode = 1;
			handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST);
         if (handshake == HANDSHAKE_REQUEST)
         {
			if (handshake == HANDSHAKE_REQUEST) {
				/*
				 * Get type associated with the request.
				 */
				request = get_request_type(ft1000dev);
            switch (request)
            {
				switch (request) {
				case REQUEST_RUN_ADDRESS:
					DEBUG("FT1000:REQUEST_RUN_ADDRESS\n");
               put_request_value(ft1000dev, loader_code_address);
					put_request_value(ft1000dev,
							  loader_code_address);
					break;
				case REQUEST_CODE_LENGTH:
					DEBUG("FT1000:REQUEST_CODE_LENGTH\n");
               put_request_value(ft1000dev, loader_code_size);
					put_request_value(ft1000dev,
							  loader_code_size);
					break;
				case REQUEST_DONE_BL:
					DEBUG("FT1000:REQUEST_DONE_BL\n");
@@ -811,21 +813,23 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
					break;
				case REQUEST_CODE_SEGMENT:
					//DEBUG("FT1000:REQUEST_CODE_SEGMENT\n");
               word_length = get_request_value(ft1000dev);
					word_length =
					    get_request_value(ft1000dev);
					//DEBUG("FT1000:word_length = 0x%x\n", (int)word_length);
					//NdisMSleep (100);
               if (word_length > MAX_LENGTH)
               {
                  DEBUG("FT1000:download:Download error: Max length exceeded\n");
					if (word_length > MAX_LENGTH) {
						DEBUG
						    ("FT1000:download:Download error: Max length exceeded\n");
						status = STATUS_FAILURE;
						break;
					}
               if ( (word_length*2 + c_file) > boot_end)
               {
					if ((word_length * 2 + c_file) >
					    boot_end) {
						/*
						 * Error, beyond boot code range.
						 */
                  DEBUG("FT1000:download:Download error: Requested len=%d exceeds BOOT code boundry.\n",
						DEBUG
						    ("FT1000:download:Download error: Requested len=%d exceeds BOOT code boundry.\n",
						     (int)word_length);
						status = STATUS_FAILURE;
						break;
@@ -838,22 +842,27 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
						word_length++;
					word_length = word_length / 2;

			status =   write_blk(ft1000dev, &s_file, &c_file, word_length);
					status =
					    write_blk(ft1000dev, &s_file,
						      &c_file, word_length);
					//DEBUG("write_blk returned %d\n", status);
					break;
				default:
               DEBUG("FT1000:download:Download error: Bad request type=%d in BOOT download state.\n",request);
					DEBUG
					    ("FT1000:download:Download error: Bad request type=%d in BOOT download state.\n",
					     request);
					status = STATUS_FAILURE;
					break;
				}
				if (pft1000info->usbboot)
                put_handshake_usb(ft1000dev, HANDSHAKE_RESPONSE);
            else
                put_handshake(ft1000dev, HANDSHAKE_RESPONSE);
         }
					put_handshake_usb(ft1000dev,
							  HANDSHAKE_RESPONSE);
				else
         {
            DEBUG("FT1000:download:Download error: Handshake failed\n");
					put_handshake(ft1000dev,
						      HANDSHAKE_RESPONSE);
			} else {
				DEBUG
				    ("FT1000:download:Download error: Handshake failed\n");
				status = STATUS_FAILURE;
			}

@@ -863,48 +872,57 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
			//DEBUG("FT1000:STATE_CODE_DWNLD\n");
			pft1000info->bootmode = 0;
			if (pft1000info->usbboot)
            handshake = get_handshake_usb(ft1000dev, HANDSHAKE_REQUEST);
				handshake =
				    get_handshake_usb(ft1000dev,
						      HANDSHAKE_REQUEST);
			else
            handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST);
         if (handshake == HANDSHAKE_REQUEST)
         {
				handshake =
				    get_handshake(ft1000dev, HANDSHAKE_REQUEST);
			if (handshake == HANDSHAKE_REQUEST) {
				/*
				 * Get type associated with the request.
				 */
				if (pft1000info->usbboot)
                request = get_request_type_usb(ft1000dev);
					request =
					    get_request_type_usb(ft1000dev);
				else
					request = get_request_type(ft1000dev);
            switch (request)
            {
				switch (request) {
				case REQUEST_FILE_CHECKSUM:
                DEBUG("FT1000:download:image_chksum = 0x%8x\n", image_chksum);
                put_request_value(ft1000dev, image_chksum);
					DEBUG
					    ("FT1000:download:image_chksum = 0x%8x\n",
					     image_chksum);
					put_request_value(ft1000dev,
							  image_chksum);
					break;
				case REQUEST_RUN_ADDRESS:
               DEBUG("FT1000:download:  REQUEST_RUN_ADDRESS\n");
               if (correct_version)
               {
                  DEBUG("FT1000:download:run_address = 0x%8x\n", (int)run_address);
                  put_request_value(ft1000dev, run_address);
               }
               else
               {
                  DEBUG("FT1000:download:Download error: Got Run address request before image offset request.\n");
					DEBUG
					    ("FT1000:download:  REQUEST_RUN_ADDRESS\n");
					if (correct_version) {
						DEBUG
						    ("FT1000:download:run_address = 0x%8x\n",
						     (int)run_address);
						put_request_value(ft1000dev,
								  run_address);
					} else {
						DEBUG
						    ("FT1000:download:Download error: Got Run address request before image offset request.\n");
						status = STATUS_FAILURE;
						break;
					}
					break;
				case REQUEST_CODE_LENGTH:
               DEBUG("FT1000:download:REQUEST_CODE_LENGTH\n");
               if (correct_version)
               {
                  DEBUG("FT1000:download:run_size = 0x%8x\n", (int)run_size);
                  put_request_value(ft1000dev, run_size);
               }
               else
               {
                  DEBUG("FT1000:download:Download error: Got Size request before image offset request.\n");
					DEBUG
					    ("FT1000:download:REQUEST_CODE_LENGTH\n");
					if (correct_version) {
						DEBUG
						    ("FT1000:download:run_size = 0x%8x\n",
						     (int)run_size);
						put_request_value(ft1000dev,
								  run_size);
					} else {
						DEBUG
						    ("FT1000:download:Download error: Got Size request before image offset request.\n");
						status = STATUS_FAILURE;
						break;
					}
@@ -912,33 +930,39 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
				case REQUEST_DONE_CL:
					pft1000info->usbboot = 3;
					/* Reposition ptrs to beginning of provisioning section */
                  s_file = (u16 *)(pFileStart + file_hdr->commands_offset);
                  c_file = (u8 *)(pFileStart + file_hdr->commands_offset);
					s_file =
					    (u16 *) (pFileStart +
						     file_hdr->commands_offset);
					c_file =
					    (u8 *) (pFileStart +
						    file_hdr->commands_offset);
					state = STATE_DONE_DWNLD;
					break;
				case REQUEST_CODE_SEGMENT:
					//DEBUG("FT1000:download: REQUEST_CODE_SEGMENT - CODELOADER\n");
               if (!correct_version)
               {
                  DEBUG("FT1000:download:Download error: Got Code Segment request before image offset request.\n");
					if (!correct_version) {
						DEBUG
						    ("FT1000:download:Download error: Got Code Segment request before image offset request.\n");
						status = STATUS_FAILURE;
						break;
					}

               word_length = get_request_value(ft1000dev);
					word_length =
					    get_request_value(ft1000dev);
					//DEBUG("FT1000:download:word_length = %d\n", (int)word_length);
               if (word_length > MAX_LENGTH)
               {
                  DEBUG("FT1000:download:Download error: Max length exceeded\n");
					if (word_length > MAX_LENGTH) {
						DEBUG
						    ("FT1000:download:Download error: Max length exceeded\n");
						status = STATUS_FAILURE;
						break;
					}
               if ( (word_length*2 + c_file) > code_end)
               {
					if ((word_length * 2 + c_file) >
					    code_end) {
						/*
						 * Error, beyond boot code range.
						 */
                  DEBUG("FT1000:download:Download error: Requested len=%d exceeds DSP code boundry.\n",
						DEBUG
						    ("FT1000:download:Download error: Requested len=%d exceeds DSP code boundry.\n",
						     (int)word_length);
						status = STATUS_FAILURE;
						break;
@@ -951,27 +975,36 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
						word_length++;
					word_length = word_length / 2;

   	       write_blk_fifo (ft1000dev, &s_file, &c_file, word_length);
					write_blk_fifo(ft1000dev, &s_file,
						       &c_file, word_length);
					if (pft1000info->usbboot == 0)
						pft1000info->usbboot++;
					if (pft1000info->usbboot == 1) {
						tempword = 0;
                   ft1000_write_dpram16 (ft1000dev, DWNLD_MAG1_PS_HDR_LOC, tempword, 0);
						ft1000_write_dpram16(ft1000dev,
								     DWNLD_MAG1_PS_HDR_LOC,
								     tempword,
								     0);
					}

					break;

				case REQUEST_MAILBOX_DATA:
               DEBUG("FT1000:download: REQUEST_MAILBOX_DATA\n");
					DEBUG
					    ("FT1000:download: REQUEST_MAILBOX_DATA\n");
					// Convert length from byte count to word count. Make sure we round up.
               word_length = (long)(pft1000info->DSPInfoBlklen + 1)/2;
               put_request_value(ft1000dev, word_length);
		mailbox_data = (struct drv_msg *)&(pft1000info->DSPInfoBlk[0]);
					word_length =
					    (long)(pft1000info->DSPInfoBlklen +
						   1) / 2;
					put_request_value(ft1000dev,
							  word_length);
					mailbox_data =
					    (struct drv_msg *)&(pft1000info->
								DSPInfoBlk[0]);
					/*
					 * Position ASIC DPRAM auto-increment pointer.
					 */


					data = (u16 *) & mailbox_data->data[0];
					dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
					if (word_length & 0x1)
@@ -979,27 +1012,33 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng

					word_length = (word_length / 2);


               for (; word_length > 0; word_length--) /* In words */
               {
					for (; word_length > 0; word_length--) {	/* In words */

						templong = *data++;
						templong |= (*data++ << 16);
                      status = fix_ft1000_write_dpram32 (ft1000dev, dpram++, (u8 *)&templong);
						status =
						    fix_ft1000_write_dpram32
						    (ft1000dev, dpram++,
						     (u8 *) & templong);

					}
					break;

				case REQUEST_VERSION_INFO:
               DEBUG("FT1000:download:REQUEST_VERSION_INFO\n");
               word_length = file_hdr->version_data_size;
               put_request_value(ft1000dev, word_length);
					DEBUG
					    ("FT1000:download:REQUEST_VERSION_INFO\n");
					word_length =
					    file_hdr->version_data_size;
					put_request_value(ft1000dev,
							  word_length);
					/*
					 * Position ASIC DPRAM auto-increment pointer.
					 */

               s_file = (u16 *)(pFileStart + file_hdr->version_data_offset);

					s_file =
					    (u16 *) (pFileStart +
						     file_hdr->
						     version_data_offset);

					dpram = (u16) DWNLD_MAG1_PS_HDR_LOC;
					if (word_length & 0x1)
@@ -1007,73 +1046,106 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng

					word_length = (word_length / 2);


               for (; word_length > 0; word_length--) /* In words */
               {
					for (; word_length > 0; word_length--) {	/* In words */

						templong = ntohs(*s_file++);
						temp = ntohs(*s_file++);
						templong |= (temp << 16);
                      status = fix_ft1000_write_dpram32 (ft1000dev, dpram++, (u8 *)&templong);
						status =
						    fix_ft1000_write_dpram32
						    (ft1000dev, dpram++,
						     (u8 *) & templong);

					}
					break;

				case REQUEST_CODE_BY_VERSION:
               DEBUG("FT1000:download:REQUEST_CODE_BY_VERSION\n");
					DEBUG
					    ("FT1000:download:REQUEST_CODE_BY_VERSION\n");
					correct_version = FALSE;
               requested_version = get_request_value(ft1000dev);

                   dsp_img_info = (struct dsp_image_info *)(pFileStart + sizeof(struct dsp_file_hdr ));

               for (image = 0; image < file_hdr->nDspImages; image++)
               {

                       temp = (u16)(dsp_img_info->version);
					requested_version =
					    get_request_value(ft1000dev);

					dsp_img_info =
					    (struct dsp_image_info *)(pFileStart
								      +
								      sizeof
								      (struct
								       dsp_file_hdr));

					for (image = 0;
					     image < file_hdr->nDspImages;
					     image++) {

						temp =
						    (u16) (dsp_img_info->
							   version);
						templong = temp;
                       temp = (u16)(dsp_img_info->version >> 16);
						temp =
						    (u16) (dsp_img_info->
							   version >> 16);
						templong |= (temp << 16);
                   if (templong == (u32)requested_version)
                       {
						if (templong ==
						    (u32) requested_version) {
							correct_version = TRUE;
                           DEBUG("FT1000:download: correct_version is TRUE\n");
                           s_file = (u16 *)(pFileStart + dsp_img_info->begin_offset);
                           c_file = (u8 *)(pFileStart + dsp_img_info->begin_offset);
                           code_end = (u8 *)(pFileStart + dsp_img_info->end_offset);
                           run_address = dsp_img_info->run_address;
                           run_size = dsp_img_info->image_size;
                           image_chksum = (u32)dsp_img_info->checksum;
							DEBUG
							    ("FT1000:download: correct_version is TRUE\n");
							s_file =
							    (u16 *) (pFileStart
								     +
								     dsp_img_info->
								     begin_offset);
							c_file =
							    (u8 *) (pFileStart +
								    dsp_img_info->
								    begin_offset);
							code_end =
							    (u8 *) (pFileStart +
								    dsp_img_info->
								    end_offset);
							run_address =
							    dsp_img_info->
							    run_address;
							run_size =
							    dsp_img_info->
							    image_size;
							image_chksum =
							    (u32) dsp_img_info->
							    checksum;
							break;
						}
						dsp_img_info++;


					}	//end of for

               if (!correct_version)
               {
					if (!correct_version) {
						/*
						 * Error, beyond boot code range.
						 */
                  DEBUG("FT1000:download:Download error: Bad Version Request = 0x%x.\n",(int)requested_version);
						DEBUG
						    ("FT1000:download:Download error: Bad Version Request = 0x%x.\n",
						     (int)requested_version);
						status = STATUS_FAILURE;
						break;
					}
					break;

				default:
               DEBUG("FT1000:download:Download error: Bad request type=%d in CODE download state.\n",request);
					DEBUG
					    ("FT1000:download:Download error: Bad request type=%d in CODE download state.\n",
					     request);
					status = STATUS_FAILURE;
					break;
				}
				if (pft1000info->usbboot)
                put_handshake_usb(ft1000dev, HANDSHAKE_RESPONSE);
					put_handshake_usb(ft1000dev,
							  HANDSHAKE_RESPONSE);
				else
                put_handshake(ft1000dev, HANDSHAKE_RESPONSE);
         }
         else
         {
            DEBUG("FT1000:download:Download error: Handshake failed\n");
					put_handshake(ft1000dev,
						      HANDSHAKE_RESPONSE);
			} else {
				DEBUG
				    ("FT1000:download:Download error: Handshake failed\n");
				status = STATUS_FAILURE;
			}

@@ -1088,45 +1160,61 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
			DEBUG("FT1000:download:STATE_SECTION_PROV\n");
			pseudo_header = (struct pseudo_hdr *)c_file;

         if (pseudo_header->checksum == hdr_checksum(pseudo_header))
         {
            if (pseudo_header->portdest != 0x80 /* Dsp OAM */)
            {
			if (pseudo_header->checksum ==
			    hdr_checksum(pseudo_header)) {
				if (pseudo_header->portdest !=
				    0x80 /* Dsp OAM */ ) {
					state = STATE_DONE_PROV;
					break;
				}
				pseudo_header_len = ntohs(pseudo_header->length);	/* Byte length for PROV records */

				// Get buffer for provisioning data
		pbuffer = kmalloc((pseudo_header_len + sizeof(struct pseudo_hdr)), GFP_ATOMIC);
				pbuffer =
				    kmalloc((pseudo_header_len +
					     sizeof(struct pseudo_hdr)),
					    GFP_ATOMIC);
				if (pbuffer) {
		memcpy(pbuffer, (void *)c_file, (u32)(pseudo_header_len + sizeof(struct pseudo_hdr)));
					memcpy(pbuffer, (void *)c_file,
					       (u32) (pseudo_header_len +
						      sizeof(struct
							     pseudo_hdr)));
					// link provisioning data
		pprov_record = kmalloc(sizeof(struct prov_record), GFP_ATOMIC);
					pprov_record =
					    kmalloc(sizeof(struct prov_record),
						    GFP_ATOMIC);
					if (pprov_record) {
                    pprov_record->pprov_data = pbuffer;
                    list_add_tail (&pprov_record->list, &pft1000info->prov_list);
						pprov_record->pprov_data =
						    pbuffer;
						list_add_tail(&pprov_record->
							      list,
							      &pft1000info->
							      prov_list);
						// Move to next entry if available
			c_file = (u8 *)((unsigned long)c_file + (u32)((pseudo_header_len + 1) & 0xFFFFFFFE) + sizeof(struct pseudo_hdr));
                    if ( (unsigned long)(c_file) - (unsigned long)(pFileStart) >= (unsigned long)FileLength) {
						c_file =
						    (u8 *) ((unsigned long)
							    c_file +
							    (u32) ((pseudo_header_len + 1) & 0xFFFFFFFE) + sizeof(struct pseudo_hdr));
						if ((unsigned long)(c_file) -
						    (unsigned long)(pFileStart)
						    >=
						    (unsigned long)FileLength) {
							state = STATE_DONE_FILE;
						}
                }
                else {
					} else {
						kfree(pbuffer);
						status = STATUS_FAILURE;
					}
            }
            else {
				} else {
					status = STATUS_FAILURE;
				}
         }
         else
         {
			} else {
				/* Checksum did not compute */
				status = STATUS_FAILURE;
			}
         DEBUG("ft1000:download: after STATE_SECTION_PROV, state = %d, status= %d\n", state, status);
			DEBUG
			    ("ft1000:download: after STATE_SECTION_PROV, state = %d, status= %d\n",
			     state, status);
			break;

		case STATE_DONE_PROV:
@@ -1134,7 +1222,6 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
			state = STATE_DONE_FILE;
			break;


		default:
			status = STATUS_FAILURE;
			break;
@@ -1160,7 +1247,8 @@ u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, u32 FileLeng
	}			/* End while */

	DEBUG("Download exiting with status = 0x%8x\n", status);
   ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX, FT1000_REG_DOORBELL);
	ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX,
			      FT1000_REG_DOORBELL);

	return status;
}