All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 11/11] Remove support for v5 firmware
@ 2011-06-23 19:43 Ondrej Zary
  0 siblings, 0 replies; only message in thread
From: Ondrej Zary @ 2011-06-23 19:43 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Marek Belisko, Kernel development list

Remove support for v5 firmware images as all known firmware images are v6.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
---
 drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c |  441 +++++++-------------
 1 files changed, 140 insertions(+), 301 deletions(-)

diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c
index c8b73c6..9e594b0 100644
--- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c
+++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c
@@ -94,18 +94,6 @@ void put_request_value(struct net_device *dev, long lvalue);
 u16 hdr_checksum(struct pseudo_hdr *pHdr);
 
 struct dsp_file_hdr {
-	u32  build_date;
-	u32  dsp_coff_date;
-	u32  loader_code_address;
-	u32  loader_code_size;
-	u32  loader_code_end;
-	u32  dsp_code_address;
-	u32  dsp_code_size;
-	u32  dsp_code_end;
-	u32  reserved[8];
-} __attribute__ ((packed));
-
-struct dsp_file_hdr_5 {
 	u32  version_id;	// Version ID of this image format.
 	u32  package_id;	// Package ID of code release.
 	u32  build_date;	// Date/time stamp when file was built.
@@ -126,15 +114,6 @@ struct dsp_image_info {
 	u32  run_address;	// On chip Start address of DSP code.
 	u32  image_size;	// Size of image.
 	u32  version;		// Embedded version # of DSP code.
-} __attribute__ ((packed));
-
-struct dsp_image_info_v6 {
-	u32  coff_date;		// Date/time when DSP Coff image was built.
-	u32  begin_offset;	// Offset in file where image begins.
-	u32  end_offset;	// Offset in file where image begins.
-	u32  run_address;	// On chip Start address of DSP code.
-	u32  image_size;	// Size of image.
-	u32  version;		// Embedded version # of DSP code.
 	unsigned short checksum;	// Dsp File checksum
 	unsigned short pad1;
 } __attribute__ ((packed));
@@ -312,20 +291,17 @@ int card_download(struct net_device *dev, const u8 *pFileStart, u32 FileLength)
 {
 	struct ft1000_info *info = (struct ft1000_info *) netdev_priv(dev);
 	int Status = SUCCESS;
-	u16 DspWordCnt = 0;
 	u32 uiState;
 	u16 handshake;
 	struct pseudo_hdr *pHdr;
 	u16 usHdrLength;
-	struct dsp_file_hdr *pFileHdr;
 	long word_length;
 	u16 request;
 	u16 temp;
 	struct prov_record *pprov_record;
 	u8 *pbuffer;
-	struct dsp_file_hdr_5 *pFileHdr5;
-	struct dsp_image_info *pDspImageInfo = NULL;
-	struct dsp_image_info_v6 *pDspImageInfoV6 = NULL;
+	struct dsp_file_hdr *pFileHdr5;
+	struct dsp_image_info *pDspImageInfoV6 = NULL;
 	long requested_version;
 	bool bGoodVersion = 0;
 	struct drv_msg *pMailBoxData;
@@ -344,36 +320,22 @@ int card_download(struct net_device *dev, const u8 *pFileStart, u32 FileLength)
 	unsigned long templong;
 	unsigned long image_chksum = 0;
 
-	//
-	// Get version id of file, at first 4 bytes of file, for newer files.
-	//
 	file_version = *(long *)pFileStart;
+	if (file_version != 6) {
+	        printk(KERN_ERR "ft1000: unsupported firmware version %ld\n", file_version);
+	        Status = FAILURE;
+	}
 
 	uiState = STATE_START_DWNLD;
 
-	pFileHdr = (struct dsp_file_hdr *) pFileStart;
-	pFileHdr5 = (struct dsp_file_hdr_5 *) pFileStart;
-
-	switch (file_version) {
-	case 5:
-	case 6:
-		pUsFile =
-			(u16 *) ((long)pFileStart + pFileHdr5->loader_offset);
-		pUcFile =
-			(u8 *) ((long)pFileStart + pFileHdr5->loader_offset);
-
-		pBootEnd =
-			(u8 *) ((long)pFileStart + pFileHdr5->loader_code_end);
-
-		loader_code_address = pFileHdr5->loader_code_address;
-		loader_code_size = pFileHdr5->loader_code_size;
-		bGoodVersion = false;
-		break;
+	pFileHdr5 = (struct dsp_file_hdr *) pFileStart;
 
-	default:
-		Status = FAILURE;
-		break;
-	}
+	pUsFile = (u16 *) ((long)pFileStart + pFileHdr5->loader_offset);
+	pUcFile = (u8 *) ((long)pFileStart + pFileHdr5->loader_offset);
+	pBootEnd = (u8 *) ((long)pFileStart + pFileHdr5->loader_code_end);
+	loader_code_address = pFileHdr5->loader_code_address;
+	loader_code_size = pFileHdr5->loader_code_size;
+	bGoodVersion = false;
 
 	while ((Status == SUCCESS) && (uiState != STATE_DONE_FILE)) {
 
@@ -431,46 +393,26 @@ int card_download(struct net_device *dev, const u8 *pFileStart, u32 FileLength)
 					// Provide mutual exclusive access while reading ASIC registers.
 					spin_lock_irqsave(&info->dpram_lock,
 							  flags);
-					if (file_version == 5) {
-						/*
-						 * Position ASIC DPRAM auto-increment pointer.
-						 */
-						ft1000_write_reg(dev,
-								 FT1000_REG_DPRAM_ADDR,
-								 DWNLD_PS_HDR_LOC);
-
-						for (; word_length > 0; word_length--) {	/* In words */
-							//temp = *pUsFile;
-							//temp = RtlUshortByteSwap(temp);
-							ft1000_write_reg(dev,
-									 FT1000_REG_DPRAM_DATA,
-									 *pUsFile);
-							pUsFile++;
-							pUcFile += 2;
-							DspWordCnt++;
-						}
-					} else {
-						/*
-						 * Position ASIC DPRAM auto-increment pointer.
-						 */
-						outw(DWNLD_MAG_PS_HDR_LOC,
-							 dev->base_addr +
-							 FT1000_REG_DPRAM_ADDR);
-						if (word_length & 0x01) {
-							word_length++;
-						}
-						word_length = word_length / 2;
-
-						for (; word_length > 0; word_length--) {	/* In words */
-							templong = *pUsFile++;
-							templong |=
-								(*pUsFile++ << 16);
-							pUcFile += 4;
-							outl(templong,
-								 dev->base_addr +
-								 FT1000_REG_MAG_DPDATAL);
-						}
-					}
+                                        /*
+                                         * Position ASIC DPRAM auto-increment pointer.
+                                         */
+                                        outw(DWNLD_MAG_PS_HDR_LOC,
+                                                 dev->base_addr +
+                                                 FT1000_REG_DPRAM_ADDR);
+                                        if (word_length & 0x01) {
+                                                word_length++;
+                                        }
+                                        word_length = word_length / 2;
+
+                                        for (; word_length > 0; word_length--) {	/* In words */
+                                                templong = *pUsFile++;
+                                                templong |=
+                                                        (*pUsFile++ << 16);
+                                                pUcFile += 4;
+                                                outl(templong,
+                                                         dev->base_addr +
+                                                         FT1000_REG_MAG_DPDATAL);
+                                        }
 					spin_unlock_irqrestore(&info->
 								   dpram_lock,
 								   flags);
@@ -519,24 +461,8 @@ int card_download(struct net_device *dev, const u8 *pFileStart, u32 FileLength)
 					break;
 				case REQUEST_DONE_CL:
 					/* Reposition ptrs to beginning of provisioning section */
-					switch (file_version) {
-					case 5:
-					case 6:
-						pUsFile =
-							(u16 *) ((long)pFileStart
-								+
-								pFileHdr5->
-								commands_offset);
-						pUcFile =
-							(u8 *) ((long)pFileStart
-								   +
-								   pFileHdr5->
-								   commands_offset);
-						break;
-					default:
-						Status = FAILURE;
-						break;
-					}
+					pUsFile = (u16 *) ((long)pFileStart + pFileHdr5->commands_offset);
+					pUcFile = (u8 *) ((long)pFileStart + pFileHdr5->commands_offset);
 					uiState = STATE_DONE_DWNLD;
 					break;
 				case REQUEST_CODE_SEGMENT:
@@ -557,46 +483,26 @@ int card_download(struct net_device *dev, const u8 *pFileStart, u32 FileLength)
 						Status = FAILURE;
 						break;
 					}
-					if (file_version == 5) {
-						/*
-						 * Position ASIC DPRAM auto-increment pointer.
-						 */
-						ft1000_write_reg(dev,
-								 FT1000_REG_DPRAM_ADDR,
-								 DWNLD_PS_HDR_LOC);
-
-						for (; word_length > 0; word_length--) {	/* In words */
-							//temp = *pUsFile;
-							//temp = RtlUshortByteSwap(temp);
-							ft1000_write_reg(dev,
-									 FT1000_REG_DPRAM_DATA,
-									 *pUsFile);
-							pUsFile++;
-							pUcFile += 2;
-							DspWordCnt++;
-						}
-					} else {
-						/*
-						 * Position ASIC DPRAM auto-increment pointer.
-						 */
-						outw(DWNLD_MAG_PS_HDR_LOC,
-							 dev->base_addr +
-							 FT1000_REG_DPRAM_ADDR);
-						if (word_length & 0x01) {
-							word_length++;
-						}
-						word_length = word_length / 2;
-
-						for (; word_length > 0; word_length--) {	/* In words */
-							templong = *pUsFile++;
-							templong |=
-								(*pUsFile++ << 16);
-							pUcFile += 4;
-							outl(templong,
-								 dev->base_addr +
-								 FT1000_REG_MAG_DPDATAL);
-						}
-					}
+                                        /*
+                                         * Position ASIC DPRAM auto-increment pointer.
+                                         */
+                                        outw(DWNLD_MAG_PS_HDR_LOC,
+                                                 dev->base_addr +
+                                                 FT1000_REG_DPRAM_ADDR);
+                                        if (word_length & 0x01) {
+                                                word_length++;
+                                        }
+                                        word_length = word_length / 2;
+
+                                        for (; word_length > 0; word_length--) {	/* In words */
+                                                templong = *pUsFile++;
+                                                templong |=
+                                                        (*pUsFile++ << 16);
+                                                pUcFile += 4;
+                                                outl(templong,
+                                                         dev->base_addr +
+                                                         FT1000_REG_MAG_DPDATAL);
+                                        }
 					break;
 
 				case REQUEST_MAILBOX_DATA:
@@ -663,46 +569,28 @@ int card_download(struct net_device *dev, const u8 *pFileStart, u32 FileLength)
 					// Provide mutual exclusive access while reading ASIC registers.
 					spin_lock_irqsave(&info->dpram_lock,
 							  flags);
-					if (file_version == 5) {
-						/*
-						 * Position ASIC DPRAM auto-increment pointer.
-						 */
-						ft1000_write_reg(dev,
-								 FT1000_REG_DPRAM_ADDR,
-								 DWNLD_PS_HDR_LOC);
-
-						for (; word_length > 0; word_length--) {	/* In words */
-							ft1000_write_reg(dev,
-									 FT1000_REG_DPRAM_DATA,
-									 *pUsFile
-									 /*temp */
-								);
-							pUsFile++;
-						}
-					} else {
-						/*
-						 * Position ASIC DPRAM auto-increment pointer.
-						 */
-						outw(DWNLD_MAG_PS_HDR_LOC,
-							 dev->base_addr +
-							 FT1000_REG_DPRAM_ADDR);
-						if (word_length & 0x01) {
-							word_length++;
-						}
-						word_length = word_length / 2;
-
-						for (; word_length > 0; word_length--) {	/* In words */
-							templong =
-								ntohs(*pUsFile++);
-							temp =
-								ntohs(*pUsFile++);
-							templong |=
-								(temp << 16);
-							outl(templong,
-								 dev->base_addr +
-								 FT1000_REG_MAG_DPDATAL);
-						}
-					}
+                                        /*
+                                         * Position ASIC DPRAM auto-increment pointer.
+                                         */
+                                        outw(DWNLD_MAG_PS_HDR_LOC,
+                                                 dev->base_addr +
+                                                 FT1000_REG_DPRAM_ADDR);
+                                        if (word_length & 0x01) {
+                                                word_length++;
+                                        }
+                                        word_length = word_length / 2;
+
+                                        for (; word_length > 0; word_length--) {	/* In words */
+                                                templong =
+                                                        ntohs(*pUsFile++);
+                                                temp =
+                                                        ntohs(*pUsFile++);
+                                                templong |=
+                                                        (temp << 16);
+                                                outl(templong,
+                                                         dev->base_addr +
+                                                         FT1000_REG_MAG_DPDATAL);
+                                        }
 					spin_unlock_irqrestore(&info->
 								   dpram_lock,
 								   flags);
@@ -712,118 +600,69 @@ int card_download(struct net_device *dev, const u8 *pFileStart, u32 FileLength)
 					bGoodVersion = false;
 					requested_version =
 						get_request_value(dev);
-					if (file_version == 5) {
-						pDspImageInfo =
-							(struct dsp_image_info *) ((long)
-									   pFileStart
-									   +
-									   sizeof
-									   (struct dsp_file_hdr_5));
-						for (imageN = 0;
-							 imageN <
-							 pFileHdr5->nDspImages;
-							 imageN++) {
-							if (pDspImageInfo->
-								version ==
-								requested_version) {
-								bGoodVersion =
-									true;
-								pUsFile =
-									(u16
-									 *) ((long)
-									 pFileStart
-									 +
-									 pDspImageInfo->
-									 begin_offset);
-								pUcFile =
-									(u8
-									 *) ((long)
-									 pFileStart
-									 +
-									 pDspImageInfo->
-									 begin_offset);
-								pCodeEnd =
-									(u8
-									 *) ((long)
-									 pFileStart
-									 +
-									 pDspImageInfo->
-									 end_offset);
-								run_address =
-									pDspImageInfo->
-									run_address;
-								run_size =
-									pDspImageInfo->
-									image_size;
-								break;
-							}
-							pDspImageInfo++;
-						}
-					} else {
-						pDspImageInfoV6 =
-							(struct dsp_image_info_v6 *) ((long)
-									  pFileStart
-									  +
-									  sizeof
-									  (struct dsp_file_hdr_5));
-						for (imageN = 0;
-							 imageN <
-							 pFileHdr5->nDspImages;
-							 imageN++) {
-							temp = (u16)
-								(pDspImageInfoV6->
-								 version);
-							templong = temp;
-							temp = (u16)
-								(pDspImageInfoV6->
-								 version >> 16);
-							templong |=
-								(temp << 16);
-							if (templong ==
-								requested_version) {
-								bGoodVersion =
-									true;
-								pUsFile =
-									(u16
-									 *) ((long)
-									 pFileStart
-									 +
-									 pDspImageInfoV6->
-									 begin_offset);
-								pUcFile =
-									(u8
-									 *) ((long)
-									 pFileStart
-									 +
-									 pDspImageInfoV6->
-									 begin_offset);
-								pCodeEnd =
-									(u8
-									 *) ((long)
-									 pFileStart
-									 +
-									 pDspImageInfoV6->
-									 end_offset);
-								run_address =
-									pDspImageInfoV6->
-									run_address;
-								run_size =
-									pDspImageInfoV6->
-									image_size;
-								image_chksum =
-									(u32)
-									pDspImageInfoV6->
-									checksum;
-								DEBUG(0,
-									  "ft1000_dnld: image_chksum = 0x%8x\n",
-									  (unsigned
-									   int)
-									  image_chksum);
-								break;
-							}
-							pDspImageInfoV6++;
-						}
-					}
+                                        pDspImageInfoV6 =
+                                                (struct dsp_image_info *) ((long)
+                                                                  pFileStart
+                                                                  +
+                                                                  sizeof
+                                                                  (struct dsp_file_hdr));
+                                        for (imageN = 0;
+                                                 imageN <
+                                                 pFileHdr5->nDspImages;
+                                                 imageN++) {
+                                                temp = (u16)
+                                                        (pDspImageInfoV6->
+                                                         version);
+                                                templong = temp;
+                                                temp = (u16)
+                                                        (pDspImageInfoV6->
+                                                         version >> 16);
+                                                templong |=
+                                                        (temp << 16);
+                                                if (templong ==
+                                                        requested_version) {
+                                                        bGoodVersion =
+                                                                true;
+                                                        pUsFile =
+                                                                (u16
+                                                                 *) ((long)
+                                                                 pFileStart
+                                                                 +
+                                                                 pDspImageInfoV6->
+                                                                 begin_offset);
+                                                        pUcFile =
+                                                                (u8
+                                                                 *) ((long)
+                                                                 pFileStart
+                                                                 +
+                                                                 pDspImageInfoV6->
+                                                                 begin_offset);
+                                                        pCodeEnd =
+                                                                (u8
+                                                                 *) ((long)
+                                                                 pFileStart
+                                                                 +
+                                                                 pDspImageInfoV6->
+                                                                 end_offset);
+                                                        run_address =
+                                                                pDspImageInfoV6->
+                                                                run_address;
+                                                        run_size =
+                                                                pDspImageInfoV6->
+                                                                image_size;
+                                                        image_chksum =
+                                                                (u32)
+                                                                pDspImageInfoV6->
+                                                                checksum;
+                                                        DEBUG(0,
+                                                                  "ft1000_dnld: image_chksum = 0x%8x\n",
+                                                                  (unsigned
+                                                                   int)
+                                                                  image_chksum);
+                                                        break;
+                                                }
+                                                pDspImageInfoV6++;
+                                        }
 					if (!bGoodVersion) {
 						/*
 						 * Error, beyond boot code range.
-- 
Ondrej Zary


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2011-06-23 19:43 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-23 19:43 [PATCH 11/11] Remove support for v5 firmware Ondrej Zary

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.