brintos

brintos / linux-shallow public Read only

0
0
Text · 37.5 KiB · 5e5266e Raw
1404 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Common Flash Interface support:4 *   ST Advanced Architecture Command Set (ID 0x0020)5 *6 * (C) 2000 Red Hat.7 *8 * 10/10/2000	Nicolas Pitre <nico@fluxnic.net>9 * 	- completely revamped method functions so they are aware and10 * 	  independent of the flash geometry (buswidth, interleave, etc.)11 * 	- scalability vs code size is completely set at compile-time12 * 	  (see include/linux/mtd/cfi.h for selection)13 *	- optimized write buffer method14 * 06/21/2002	Joern Engel <joern@wh.fh-wedel.de> and others15 *	- modified Intel Command Set 0x0001 to support ST Advanced Architecture16 *	  (command set 0x0020)17 *	- added a writev function18 * 07/13/2005	Joern Engel <joern@wh.fh-wedel.de>19 * 	- Plugged memory leak in cfi_staa_writev().20 */21 22#include <linux/module.h>23#include <linux/types.h>24#include <linux/kernel.h>25#include <linux/sched.h>26#include <asm/io.h>27#include <asm/byteorder.h>28 29#include <linux/errno.h>30#include <linux/slab.h>31#include <linux/delay.h>32#include <linux/interrupt.h>33#include <linux/mtd/map.h>34#include <linux/mtd/cfi.h>35#include <linux/mtd/mtd.h>36 37 38static int cfi_staa_read(struct mtd_info *, loff_t, size_t, size_t *, u_char *);39static int cfi_staa_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);40static int cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,41		unsigned long count, loff_t to, size_t *retlen);42static int cfi_staa_erase_varsize(struct mtd_info *, struct erase_info *);43static void cfi_staa_sync (struct mtd_info *);44static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);45static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);46static int cfi_staa_suspend (struct mtd_info *);47static void cfi_staa_resume (struct mtd_info *);48 49static void cfi_staa_destroy(struct mtd_info *);50 51struct mtd_info *cfi_cmdset_0020(struct map_info *, int);52 53static struct mtd_info *cfi_staa_setup (struct map_info *);54 55static struct mtd_chip_driver cfi_staa_chipdrv = {56	.probe		= NULL, /* Not usable directly */57	.destroy	= cfi_staa_destroy,58	.name		= "cfi_cmdset_0020",59	.module		= THIS_MODULE60};61 62/* #define DEBUG_LOCK_BITS */63//#define DEBUG_CFI_FEATURES64 65#ifdef DEBUG_CFI_FEATURES66static void cfi_tell_features(struct cfi_pri_intelext *extp)67{68        int i;69        printk("  Feature/Command Support: %4.4X\n", extp->FeatureSupport);70	printk("     - Chip Erase:         %s\n", extp->FeatureSupport&1?"supported":"unsupported");71	printk("     - Suspend Erase:      %s\n", extp->FeatureSupport&2?"supported":"unsupported");72	printk("     - Suspend Program:    %s\n", extp->FeatureSupport&4?"supported":"unsupported");73	printk("     - Legacy Lock/Unlock: %s\n", extp->FeatureSupport&8?"supported":"unsupported");74	printk("     - Queued Erase:       %s\n", extp->FeatureSupport&16?"supported":"unsupported");75	printk("     - Instant block lock: %s\n", extp->FeatureSupport&32?"supported":"unsupported");76	printk("     - Protection Bits:    %s\n", extp->FeatureSupport&64?"supported":"unsupported");77	printk("     - Page-mode read:     %s\n", extp->FeatureSupport&128?"supported":"unsupported");78	printk("     - Synchronous read:   %s\n", extp->FeatureSupport&256?"supported":"unsupported");79	for (i=9; i<32; i++) {80		if (extp->FeatureSupport & (1<<i))81			printk("     - Unknown Bit %X:      supported\n", i);82	}83 84	printk("  Supported functions after Suspend: %2.2X\n", extp->SuspendCmdSupport);85	printk("     - Program after Erase Suspend: %s\n", extp->SuspendCmdSupport&1?"supported":"unsupported");86	for (i=1; i<8; i++) {87		if (extp->SuspendCmdSupport & (1<<i))88			printk("     - Unknown Bit %X:               supported\n", i);89	}90 91	printk("  Block Status Register Mask: %4.4X\n", extp->BlkStatusRegMask);92	printk("     - Lock Bit Active:      %s\n", extp->BlkStatusRegMask&1?"yes":"no");93	printk("     - Valid Bit Active:     %s\n", extp->BlkStatusRegMask&2?"yes":"no");94	for (i=2; i<16; i++) {95		if (extp->BlkStatusRegMask & (1<<i))96			printk("     - Unknown Bit %X Active: yes\n",i);97	}98 99	printk("  Vcc Logic Supply Optimum Program/Erase Voltage: %d.%d V\n",100	       extp->VccOptimal >> 8, extp->VccOptimal & 0xf);101	if (extp->VppOptimal)102		printk("  Vpp Programming Supply Optimum Program/Erase Voltage: %d.%d V\n",103		       extp->VppOptimal >> 8, extp->VppOptimal & 0xf);104}105#endif106 107/* This routine is made available to other mtd code via108 * inter_module_register.  It must only be accessed through109 * inter_module_get which will bump the use count of this module.  The110 * addresses passed back in cfi are valid as long as the use count of111 * this module is non-zero, i.e. between inter_module_get and112 * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.113 */114struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)115{116	struct cfi_private *cfi = map->fldrv_priv;117	int i;118 119	if (cfi->cfi_mode) {120		/*121		 * It's a real CFI chip, not one for which the probe122		 * routine faked a CFI structure. So we read the feature123		 * table from it.124		 */125		__u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;126		struct cfi_pri_intelext *extp;127 128		extp = (struct cfi_pri_intelext*)cfi_read_pri(map, adr, sizeof(*extp), "ST Microelectronics");129		if (!extp)130			return NULL;131 132		if (extp->MajorVersion != '1' ||133		    (extp->MinorVersion < '0' || extp->MinorVersion > '3')) {134			printk(KERN_ERR "  Unknown ST Microelectronics"135			       " Extended Query version %c.%c.\n",136			       extp->MajorVersion, extp->MinorVersion);137			kfree(extp);138			return NULL;139		}140 141		/* Do some byteswapping if necessary */142		extp->FeatureSupport = cfi32_to_cpu(map, extp->FeatureSupport);143		extp->BlkStatusRegMask = cfi32_to_cpu(map,144						extp->BlkStatusRegMask);145 146#ifdef DEBUG_CFI_FEATURES147		/* Tell the user about it in lots of lovely detail */148		cfi_tell_features(extp);149#endif150 151		/* Install our own private info structure */152		cfi->cmdset_priv = extp;153	}154 155	for (i=0; i< cfi->numchips; i++) {156		cfi->chips[i].word_write_time = 128;157		cfi->chips[i].buffer_write_time = 128;158		cfi->chips[i].erase_time = 1024;159		cfi->chips[i].ref_point_counter = 0;160		init_waitqueue_head(&(cfi->chips[i].wq));161	}162 163	return cfi_staa_setup(map);164}165EXPORT_SYMBOL_GPL(cfi_cmdset_0020);166 167static struct mtd_info *cfi_staa_setup(struct map_info *map)168{169	struct cfi_private *cfi = map->fldrv_priv;170	struct mtd_info *mtd;171	unsigned long offset = 0;172	int i,j;173	unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;174 175	mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);176	//printk(KERN_DEBUG "number of CFI chips: %d\n", cfi->numchips);177 178	if (!mtd) {179		kfree(cfi->cmdset_priv);180		return NULL;181	}182 183	mtd->priv = map;184	mtd->type = MTD_NORFLASH;185	mtd->size = devsize * cfi->numchips;186 187	mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;188	mtd->eraseregions = kmalloc_array(mtd->numeraseregions,189					  sizeof(struct mtd_erase_region_info),190					  GFP_KERNEL);191	if (!mtd->eraseregions) {192		kfree(cfi->cmdset_priv);193		kfree(mtd);194		return NULL;195	}196 197	for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {198		unsigned long ernum, ersize;199		ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;200		ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;201 202		if (mtd->erasesize < ersize) {203			mtd->erasesize = ersize;204		}205		for (j=0; j<cfi->numchips; j++) {206			mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;207			mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;208			mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;209		}210		offset += (ersize * ernum);211	}212 213	if (offset != devsize) {214		/* Argh */215		printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize);216		kfree(mtd->eraseregions);217		kfree(cfi->cmdset_priv);218		kfree(mtd);219		return NULL;220	}221 222	for (i=0; i<mtd->numeraseregions;i++){223		printk(KERN_DEBUG "%d: offset=0x%llx,size=0x%x,blocks=%d\n",224		       i, (unsigned long long)mtd->eraseregions[i].offset,225		       mtd->eraseregions[i].erasesize,226		       mtd->eraseregions[i].numblocks);227	}228 229	/* Also select the correct geometry setup too */230	mtd->_erase = cfi_staa_erase_varsize;231	mtd->_read = cfi_staa_read;232	mtd->_write = cfi_staa_write_buffers;233	mtd->_writev = cfi_staa_writev;234	mtd->_sync = cfi_staa_sync;235	mtd->_lock = cfi_staa_lock;236	mtd->_unlock = cfi_staa_unlock;237	mtd->_suspend = cfi_staa_suspend;238	mtd->_resume = cfi_staa_resume;239	mtd->flags = MTD_CAP_NORFLASH & ~MTD_BIT_WRITEABLE;240	mtd->writesize = 8; /* FIXME: Should be 0 for STMicro flashes w/out ECC */241	mtd->writebufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;242	map->fldrv = &cfi_staa_chipdrv;243	__module_get(THIS_MODULE);244	mtd->name = map->name;245	return mtd;246}247 248 249static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)250{251	map_word status, status_OK;252	unsigned long timeo;253	DECLARE_WAITQUEUE(wait, current);254	int suspended = 0;255	unsigned long cmd_addr;256	struct cfi_private *cfi = map->fldrv_priv;257 258	adr += chip->start;259 260	/* Ensure cmd read/writes are aligned. */261	cmd_addr = adr & ~(map_bankwidth(map)-1);262 263	/* Let's determine this according to the interleave only once */264	status_OK = CMD(0x80);265 266	timeo = jiffies + HZ;267 retry:268	mutex_lock(&chip->mutex);269 270	/* Check that the chip's ready to talk to us.271	 * If it's in FL_ERASING state, suspend it and make it talk now.272	 */273	switch (chip->state) {274	case FL_ERASING:275		if (!(((struct cfi_pri_intelext *)cfi->cmdset_priv)->FeatureSupport & 2))276			goto sleep; /* We don't support erase suspend */277 278		map_write (map, CMD(0xb0), cmd_addr);279		/* If the flash has finished erasing, then 'erase suspend'280		 * appears to make some (28F320) flash devices switch to281		 * 'read' mode.  Make sure that we switch to 'read status'282		 * mode so we get the right data. --rmk283		 */284		map_write(map, CMD(0x70), cmd_addr);285		chip->oldstate = FL_ERASING;286		chip->state = FL_ERASE_SUSPENDING;287		//		printk("Erase suspending at 0x%lx\n", cmd_addr);288		for (;;) {289			status = map_read(map, cmd_addr);290			if (map_word_andequal(map, status, status_OK, status_OK))291				break;292 293			if (time_after(jiffies, timeo)) {294				/* Urgh */295				map_write(map, CMD(0xd0), cmd_addr);296				/* make sure we're in 'read status' mode */297				map_write(map, CMD(0x70), cmd_addr);298				chip->state = FL_ERASING;299				wake_up(&chip->wq);300				mutex_unlock(&chip->mutex);301				printk(KERN_ERR "Chip not ready after erase "302				       "suspended: status = 0x%lx\n", status.x[0]);303				return -EIO;304			}305 306			mutex_unlock(&chip->mutex);307			cfi_udelay(1);308			mutex_lock(&chip->mutex);309		}310 311		suspended = 1;312		map_write(map, CMD(0xff), cmd_addr);313		chip->state = FL_READY;314		break;315 316#if 0317	case FL_WRITING:318		/* Not quite yet */319#endif320 321	case FL_READY:322		break;323 324	case FL_CFI_QUERY:325	case FL_JEDEC_QUERY:326		map_write(map, CMD(0x70), cmd_addr);327		chip->state = FL_STATUS;328		fallthrough;329	case FL_STATUS:330		status = map_read(map, cmd_addr);331		if (map_word_andequal(map, status, status_OK, status_OK)) {332			map_write(map, CMD(0xff), cmd_addr);333			chip->state = FL_READY;334			break;335		}336 337		/* Urgh. Chip not yet ready to talk to us. */338		if (time_after(jiffies, timeo)) {339			mutex_unlock(&chip->mutex);340			printk(KERN_ERR "waiting for chip to be ready timed out in read. WSM status = %lx\n", status.x[0]);341			return -EIO;342		}343 344		/* Latency issues. Drop the lock, wait a while and retry */345		mutex_unlock(&chip->mutex);346		cfi_udelay(1);347		goto retry;348 349	default:350	sleep:351		/* Stick ourselves on a wait queue to be woken when352		   someone changes the status */353		set_current_state(TASK_UNINTERRUPTIBLE);354		add_wait_queue(&chip->wq, &wait);355		mutex_unlock(&chip->mutex);356		schedule();357		remove_wait_queue(&chip->wq, &wait);358		timeo = jiffies + HZ;359		goto retry;360	}361 362	map_copy_from(map, buf, adr, len);363 364	if (suspended) {365		chip->state = chip->oldstate;366		/* What if one interleaved chip has finished and the367		   other hasn't? The old code would leave the finished368		   one in READY mode. That's bad, and caused -EROFS369		   errors to be returned from do_erase_oneblock because370		   that's the only bit it checked for at the time.371		   As the state machine appears to explicitly allow372		   sending the 0x70 (Read Status) command to an erasing373		   chip and expecting it to be ignored, that's what we374		   do. */375		map_write(map, CMD(0xd0), cmd_addr);376		map_write(map, CMD(0x70), cmd_addr);377	}378 379	wake_up(&chip->wq);380	mutex_unlock(&chip->mutex);381	return 0;382}383 384static int cfi_staa_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)385{386	struct map_info *map = mtd->priv;387	struct cfi_private *cfi = map->fldrv_priv;388	unsigned long ofs;389	int chipnum;390	int ret = 0;391 392	/* ofs: offset within the first chip that the first read should start */393	chipnum = (from >> cfi->chipshift);394	ofs = from - (chipnum <<  cfi->chipshift);395 396	while (len) {397		unsigned long thislen;398 399		if (chipnum >= cfi->numchips)400			break;401 402		if ((len + ofs -1) >> cfi->chipshift)403			thislen = (1<<cfi->chipshift) - ofs;404		else405			thislen = len;406 407		ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);408		if (ret)409			break;410 411		*retlen += thislen;412		len -= thislen;413		buf += thislen;414 415		ofs = 0;416		chipnum++;417	}418	return ret;419}420 421static int do_write_buffer(struct map_info *map, struct flchip *chip,422				  unsigned long adr, const u_char *buf, int len)423{424	struct cfi_private *cfi = map->fldrv_priv;425	map_word status, status_OK;426	unsigned long cmd_adr, timeo;427	DECLARE_WAITQUEUE(wait, current);428	int wbufsize, z;429 430        /* M58LW064A requires bus alignment for buffer wriets -- saw */431        if (adr & (map_bankwidth(map)-1))432            return -EINVAL;433 434        wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;435        adr += chip->start;436	cmd_adr = adr & ~(wbufsize-1);437 438	/* Let's determine this according to the interleave only once */439        status_OK = CMD(0x80);440 441	timeo = jiffies + HZ;442 retry:443 444#ifdef DEBUG_CFI_FEATURES445       printk("%s: chip->state[%d]\n", __func__, chip->state);446#endif447	mutex_lock(&chip->mutex);448 449	/* Check that the chip's ready to talk to us.450	 * Later, we can actually think about interrupting it451	 * if it's in FL_ERASING state.452	 * Not just yet, though.453	 */454	switch (chip->state) {455	case FL_READY:456		break;457 458	case FL_CFI_QUERY:459	case FL_JEDEC_QUERY:460		map_write(map, CMD(0x70), cmd_adr);461                chip->state = FL_STATUS;462#ifdef DEBUG_CFI_FEATURES463	printk("%s: 1 status[%x]\n", __func__, map_read(map, cmd_adr));464#endif465		fallthrough;466	case FL_STATUS:467		status = map_read(map, cmd_adr);468		if (map_word_andequal(map, status, status_OK, status_OK))469			break;470		/* Urgh. Chip not yet ready to talk to us. */471		if (time_after(jiffies, timeo)) {472			mutex_unlock(&chip->mutex);473                        printk(KERN_ERR "waiting for chip to be ready timed out in buffer write Xstatus = %lx, status = %lx\n",474                               status.x[0], map_read(map, cmd_adr).x[0]);475			return -EIO;476		}477 478		/* Latency issues. Drop the lock, wait a while and retry */479		mutex_unlock(&chip->mutex);480		cfi_udelay(1);481		goto retry;482 483	default:484		/* Stick ourselves on a wait queue to be woken when485		   someone changes the status */486		set_current_state(TASK_UNINTERRUPTIBLE);487		add_wait_queue(&chip->wq, &wait);488		mutex_unlock(&chip->mutex);489		schedule();490		remove_wait_queue(&chip->wq, &wait);491		timeo = jiffies + HZ;492		goto retry;493	}494 495	ENABLE_VPP(map);496	map_write(map, CMD(0xe8), cmd_adr);497	chip->state = FL_WRITING_TO_BUFFER;498 499	z = 0;500	for (;;) {501		status = map_read(map, cmd_adr);502		if (map_word_andequal(map, status, status_OK, status_OK))503			break;504 505		mutex_unlock(&chip->mutex);506		cfi_udelay(1);507		mutex_lock(&chip->mutex);508 509		if (++z > 100) {510			/* Argh. Not ready for write to buffer */511			DISABLE_VPP(map);512                        map_write(map, CMD(0x70), cmd_adr);513			chip->state = FL_STATUS;514			mutex_unlock(&chip->mutex);515			printk(KERN_ERR "Chip not ready for buffer write. Xstatus = %lx\n", status.x[0]);516			return -EIO;517		}518	}519 520	/* Write length of data to come */521	map_write(map, CMD(len/map_bankwidth(map)-1), cmd_adr );522 523	/* Write data */524	for (z = 0; z < len;525	     z += map_bankwidth(map), buf += map_bankwidth(map)) {526		map_word d;527		d = map_word_load(map, buf);528		map_write(map, d, adr+z);529	}530	/* GO GO GO */531	map_write(map, CMD(0xd0), cmd_adr);532	chip->state = FL_WRITING;533 534	mutex_unlock(&chip->mutex);535	cfi_udelay(chip->buffer_write_time);536	mutex_lock(&chip->mutex);537 538	timeo = jiffies + (HZ/2);539	z = 0;540	for (;;) {541		if (chip->state != FL_WRITING) {542			/* Someone's suspended the write. Sleep */543			set_current_state(TASK_UNINTERRUPTIBLE);544			add_wait_queue(&chip->wq, &wait);545			mutex_unlock(&chip->mutex);546			schedule();547			remove_wait_queue(&chip->wq, &wait);548			timeo = jiffies + (HZ / 2); /* FIXME */549			mutex_lock(&chip->mutex);550			continue;551		}552 553		status = map_read(map, cmd_adr);554		if (map_word_andequal(map, status, status_OK, status_OK))555			break;556 557		/* OK Still waiting */558		if (time_after(jiffies, timeo)) {559                        /* clear status */560                        map_write(map, CMD(0x50), cmd_adr);561                        /* put back into read status register mode */562                        map_write(map, CMD(0x70), adr);563			chip->state = FL_STATUS;564			DISABLE_VPP(map);565			mutex_unlock(&chip->mutex);566			printk(KERN_ERR "waiting for chip to be ready timed out in bufwrite\n");567			return -EIO;568		}569 570		/* Latency issues. Drop the lock, wait a while and retry */571		mutex_unlock(&chip->mutex);572		cfi_udelay(1);573		z++;574		mutex_lock(&chip->mutex);575	}576	if (!z) {577		chip->buffer_write_time--;578		if (!chip->buffer_write_time)579			chip->buffer_write_time++;580	}581	if (z > 1)582		chip->buffer_write_time++;583 584	/* Done and happy. */585	DISABLE_VPP(map);586	chip->state = FL_STATUS;587 588        /* check for errors: 'lock bit', 'VPP', 'dead cell'/'unerased cell' or 'incorrect cmd' -- saw */589        if (map_word_bitsset(map, status, CMD(0x3a))) {590#ifdef DEBUG_CFI_FEATURES591		printk("%s: 2 status[%lx]\n", __func__, status.x[0]);592#endif593		/* clear status */594		map_write(map, CMD(0x50), cmd_adr);595		/* put back into read status register mode */596		map_write(map, CMD(0x70), adr);597		wake_up(&chip->wq);598		mutex_unlock(&chip->mutex);599		return map_word_bitsset(map, status, CMD(0x02)) ? -EROFS : -EIO;600	}601	wake_up(&chip->wq);602	mutex_unlock(&chip->mutex);603 604        return 0;605}606 607static int cfi_staa_write_buffers (struct mtd_info *mtd, loff_t to,608				       size_t len, size_t *retlen, const u_char *buf)609{610	struct map_info *map = mtd->priv;611	struct cfi_private *cfi = map->fldrv_priv;612	int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;613	int ret;614	int chipnum;615	unsigned long ofs;616 617	chipnum = to >> cfi->chipshift;618	ofs = to  - (chipnum << cfi->chipshift);619 620#ifdef DEBUG_CFI_FEATURES621	printk("%s: map_bankwidth(map)[%x]\n", __func__, map_bankwidth(map));622	printk("%s: chipnum[%x] wbufsize[%x]\n", __func__, chipnum, wbufsize);623	printk("%s: ofs[%x] len[%x]\n", __func__, ofs, len);624#endif625 626        /* Write buffer is worth it only if more than one word to write... */627        while (len > 0) {628		/* We must not cross write block boundaries */629		int size = wbufsize - (ofs & (wbufsize-1));630 631                if (size > len)632                    size = len;633 634                ret = do_write_buffer(map, &cfi->chips[chipnum],635				      ofs, buf, size);636		if (ret)637			return ret;638 639		ofs += size;640		buf += size;641		(*retlen) += size;642		len -= size;643 644		if (ofs >> cfi->chipshift) {645			chipnum ++;646			ofs = 0;647			if (chipnum == cfi->numchips)648				return 0;649		}650	}651 652	return 0;653}654 655/*656 * Writev for ECC-Flashes is a little more complicated. We need to maintain657 * a small buffer for this.658 * XXX: If the buffer size is not a multiple of 2, this will break659 */660#define ECCBUF_SIZE (mtd->writesize)661#define ECCBUF_DIV(x) ((x) & ~(ECCBUF_SIZE - 1))662#define ECCBUF_MOD(x) ((x) &  (ECCBUF_SIZE - 1))663static int664cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,665		unsigned long count, loff_t to, size_t *retlen)666{667	unsigned long i;668	size_t	 totlen = 0, thislen;669	int	 ret = 0;670	size_t	 buflen = 0;671	char *buffer;672 673	if (!ECCBUF_SIZE) {674		/* We should fall back to a general writev implementation.675		 * Until that is written, just break.676		 */677		return -EIO;678	}679	buffer = kmalloc(ECCBUF_SIZE, GFP_KERNEL);680	if (!buffer)681		return -ENOMEM;682 683	for (i=0; i<count; i++) {684		size_t elem_len = vecs[i].iov_len;685		void *elem_base = vecs[i].iov_base;686		if (!elem_len) /* FIXME: Might be unnecessary. Check that */687			continue;688		if (buflen) { /* cut off head */689			if (buflen + elem_len < ECCBUF_SIZE) { /* just accumulate */690				memcpy(buffer+buflen, elem_base, elem_len);691				buflen += elem_len;692				continue;693			}694			memcpy(buffer+buflen, elem_base, ECCBUF_SIZE-buflen);695			ret = mtd_write(mtd, to, ECCBUF_SIZE, &thislen,696					buffer);697			totlen += thislen;698			if (ret || thislen != ECCBUF_SIZE)699				goto write_error;700			elem_len -= thislen-buflen;701			elem_base += thislen-buflen;702			to += ECCBUF_SIZE;703		}704		if (ECCBUF_DIV(elem_len)) { /* write clean aligned data */705			ret = mtd_write(mtd, to, ECCBUF_DIV(elem_len),706					&thislen, elem_base);707			totlen += thislen;708			if (ret || thislen != ECCBUF_DIV(elem_len))709				goto write_error;710			to += thislen;711		}712		buflen = ECCBUF_MOD(elem_len); /* cut off tail */713		if (buflen) {714			memset(buffer, 0xff, ECCBUF_SIZE);715			memcpy(buffer, elem_base + thislen, buflen);716		}717	}718	if (buflen) { /* flush last page, even if not full */719		/* This is sometimes intended behaviour, really */720		ret = mtd_write(mtd, to, buflen, &thislen, buffer);721		totlen += thislen;722		if (ret || thislen != ECCBUF_SIZE)723			goto write_error;724	}725write_error:726	if (retlen)727		*retlen = totlen;728	kfree(buffer);729	return ret;730}731 732 733static inline int do_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)734{735	struct cfi_private *cfi = map->fldrv_priv;736	map_word status, status_OK;737	unsigned long timeo;738	int retries = 3;739	DECLARE_WAITQUEUE(wait, current);740	int ret = 0;741 742	adr += chip->start;743 744	/* Let's determine this according to the interleave only once */745	status_OK = CMD(0x80);746 747	timeo = jiffies + HZ;748retry:749	mutex_lock(&chip->mutex);750 751	/* Check that the chip's ready to talk to us. */752	switch (chip->state) {753	case FL_CFI_QUERY:754	case FL_JEDEC_QUERY:755	case FL_READY:756		map_write(map, CMD(0x70), adr);757		chip->state = FL_STATUS;758		fallthrough;759	case FL_STATUS:760		status = map_read(map, adr);761		if (map_word_andequal(map, status, status_OK, status_OK))762			break;763 764		/* Urgh. Chip not yet ready to talk to us. */765		if (time_after(jiffies, timeo)) {766			mutex_unlock(&chip->mutex);767			printk(KERN_ERR "waiting for chip to be ready timed out in erase\n");768			return -EIO;769		}770 771		/* Latency issues. Drop the lock, wait a while and retry */772		mutex_unlock(&chip->mutex);773		cfi_udelay(1);774		goto retry;775 776	default:777		/* Stick ourselves on a wait queue to be woken when778		   someone changes the status */779		set_current_state(TASK_UNINTERRUPTIBLE);780		add_wait_queue(&chip->wq, &wait);781		mutex_unlock(&chip->mutex);782		schedule();783		remove_wait_queue(&chip->wq, &wait);784		timeo = jiffies + HZ;785		goto retry;786	}787 788	ENABLE_VPP(map);789	/* Clear the status register first */790	map_write(map, CMD(0x50), adr);791 792	/* Now erase */793	map_write(map, CMD(0x20), adr);794	map_write(map, CMD(0xD0), adr);795	chip->state = FL_ERASING;796 797	mutex_unlock(&chip->mutex);798	msleep(1000);799	mutex_lock(&chip->mutex);800 801	/* FIXME. Use a timer to check this, and return immediately. */802	/* Once the state machine's known to be working I'll do that */803 804	timeo = jiffies + (HZ*20);805	for (;;) {806		if (chip->state != FL_ERASING) {807			/* Someone's suspended the erase. Sleep */808			set_current_state(TASK_UNINTERRUPTIBLE);809			add_wait_queue(&chip->wq, &wait);810			mutex_unlock(&chip->mutex);811			schedule();812			remove_wait_queue(&chip->wq, &wait);813			timeo = jiffies + (HZ*20); /* FIXME */814			mutex_lock(&chip->mutex);815			continue;816		}817 818		status = map_read(map, adr);819		if (map_word_andequal(map, status, status_OK, status_OK))820			break;821 822		/* OK Still waiting */823		if (time_after(jiffies, timeo)) {824			map_write(map, CMD(0x70), adr);825			chip->state = FL_STATUS;826			printk(KERN_ERR "waiting for erase to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);827			DISABLE_VPP(map);828			mutex_unlock(&chip->mutex);829			return -EIO;830		}831 832		/* Latency issues. Drop the lock, wait a while and retry */833		mutex_unlock(&chip->mutex);834		cfi_udelay(1);835		mutex_lock(&chip->mutex);836	}837 838	DISABLE_VPP(map);839	ret = 0;840 841	/* We've broken this before. It doesn't hurt to be safe */842	map_write(map, CMD(0x70), adr);843	chip->state = FL_STATUS;844	status = map_read(map, adr);845 846	/* check for lock bit */847	if (map_word_bitsset(map, status, CMD(0x3a))) {848		unsigned char chipstatus = status.x[0];849		if (!map_word_equal(map, status, CMD(chipstatus))) {850			int i, w;851			for (w=0; w<map_words(map); w++) {852				for (i = 0; i<cfi_interleave(cfi); i++) {853					chipstatus |= status.x[w] >> (cfi->device_type * 8);854				}855			}856			printk(KERN_WARNING "Status is not identical for all chips: 0x%lx. Merging to give 0x%02x\n",857			       status.x[0], chipstatus);858		}859		/* Reset the error bits */860		map_write(map, CMD(0x50), adr);861		map_write(map, CMD(0x70), adr);862 863		if ((chipstatus & 0x30) == 0x30) {864			printk(KERN_NOTICE "Chip reports improper command sequence: status 0x%x\n", chipstatus);865			ret = -EIO;866		} else if (chipstatus & 0x02) {867			/* Protection bit set */868			ret = -EROFS;869		} else if (chipstatus & 0x8) {870			/* Voltage */871			printk(KERN_WARNING "Chip reports voltage low on erase: status 0x%x\n", chipstatus);872			ret = -EIO;873		} else if (chipstatus & 0x20) {874			if (retries--) {875				printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x. Retrying...\n", adr, chipstatus);876				timeo = jiffies + HZ;877				chip->state = FL_STATUS;878				mutex_unlock(&chip->mutex);879				goto retry;880			}881			printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x\n", adr, chipstatus);882			ret = -EIO;883		}884	}885 886	wake_up(&chip->wq);887	mutex_unlock(&chip->mutex);888	return ret;889}890 891static int cfi_staa_erase_varsize(struct mtd_info *mtd,892				  struct erase_info *instr)893{	struct map_info *map = mtd->priv;894	struct cfi_private *cfi = map->fldrv_priv;895	unsigned long adr, len;896	int chipnum, ret;897	int i, first;898	struct mtd_erase_region_info *regions = mtd->eraseregions;899 900	/* Check that both start and end of the requested erase are901	 * aligned with the erasesize at the appropriate addresses.902	 */903 904	i = 0;905 906	/* Skip all erase regions which are ended before the start of907	   the requested erase. Actually, to save on the calculations,908	   we skip to the first erase region which starts after the909	   start of the requested erase, and then go back one.910	*/911 912	while (i < mtd->numeraseregions && instr->addr >= regions[i].offset)913	       i++;914	i--;915 916	/* OK, now i is pointing at the erase region in which this917	   erase request starts. Check the start of the requested918	   erase range is aligned with the erase size which is in919	   effect here.920	*/921 922	if (instr->addr & (regions[i].erasesize-1))923		return -EINVAL;924 925	/* Remember the erase region we start on */926	first = i;927 928	/* Next, check that the end of the requested erase is aligned929	 * with the erase region at that address.930	 */931 932	while (i<mtd->numeraseregions && (instr->addr + instr->len) >= regions[i].offset)933		i++;934 935	/* As before, drop back one to point at the region in which936	   the address actually falls937	*/938	i--;939 940	if ((instr->addr + instr->len) & (regions[i].erasesize-1))941		return -EINVAL;942 943	chipnum = instr->addr >> cfi->chipshift;944	adr = instr->addr - (chipnum << cfi->chipshift);945	len = instr->len;946 947	i=first;948 949	while(len) {950		ret = do_erase_oneblock(map, &cfi->chips[chipnum], adr);951 952		if (ret)953			return ret;954 955		adr += regions[i].erasesize;956		len -= regions[i].erasesize;957 958		if (adr % (1<< cfi->chipshift) == (((unsigned long)regions[i].offset + (regions[i].erasesize * regions[i].numblocks)) %( 1<< cfi->chipshift)))959			i++;960 961		if (adr >> cfi->chipshift) {962			adr = 0;963			chipnum++;964 965			if (chipnum >= cfi->numchips)966				break;967		}968	}969 970	return 0;971}972 973static void cfi_staa_sync (struct mtd_info *mtd)974{975	struct map_info *map = mtd->priv;976	struct cfi_private *cfi = map->fldrv_priv;977	int i;978	struct flchip *chip;979	int ret = 0;980	DECLARE_WAITQUEUE(wait, current);981 982	for (i=0; !ret && i<cfi->numchips; i++) {983		chip = &cfi->chips[i];984 985	retry:986		mutex_lock(&chip->mutex);987 988		switch(chip->state) {989		case FL_READY:990		case FL_STATUS:991		case FL_CFI_QUERY:992		case FL_JEDEC_QUERY:993			chip->oldstate = chip->state;994			chip->state = FL_SYNCING;995			/* No need to wake_up() on this state change -996			 * as the whole point is that nobody can do anything997			 * with the chip now anyway.998			 */999			fallthrough;1000		case FL_SYNCING:1001			mutex_unlock(&chip->mutex);1002			break;1003 1004		default:1005			/* Not an idle state */1006			set_current_state(TASK_UNINTERRUPTIBLE);1007			add_wait_queue(&chip->wq, &wait);1008 1009			mutex_unlock(&chip->mutex);1010			schedule();1011		        remove_wait_queue(&chip->wq, &wait);1012 1013			goto retry;1014		}1015	}1016 1017	/* Unlock the chips again */1018 1019	for (i--; i >=0; i--) {1020		chip = &cfi->chips[i];1021 1022		mutex_lock(&chip->mutex);1023 1024		if (chip->state == FL_SYNCING) {1025			chip->state = chip->oldstate;1026			wake_up(&chip->wq);1027		}1028		mutex_unlock(&chip->mutex);1029	}1030}1031 1032static inline int do_lock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)1033{1034	struct cfi_private *cfi = map->fldrv_priv;1035	map_word status, status_OK;1036	unsigned long timeo = jiffies + HZ;1037	DECLARE_WAITQUEUE(wait, current);1038 1039	adr += chip->start;1040 1041	/* Let's determine this according to the interleave only once */1042	status_OK = CMD(0x80);1043 1044	timeo = jiffies + HZ;1045retry:1046	mutex_lock(&chip->mutex);1047 1048	/* Check that the chip's ready to talk to us. */1049	switch (chip->state) {1050	case FL_CFI_QUERY:1051	case FL_JEDEC_QUERY:1052	case FL_READY:1053		map_write(map, CMD(0x70), adr);1054		chip->state = FL_STATUS;1055		fallthrough;1056	case FL_STATUS:1057		status = map_read(map, adr);1058		if (map_word_andequal(map, status, status_OK, status_OK))1059			break;1060 1061		/* Urgh. Chip not yet ready to talk to us. */1062		if (time_after(jiffies, timeo)) {1063			mutex_unlock(&chip->mutex);1064			printk(KERN_ERR "waiting for chip to be ready timed out in lock\n");1065			return -EIO;1066		}1067 1068		/* Latency issues. Drop the lock, wait a while and retry */1069		mutex_unlock(&chip->mutex);1070		cfi_udelay(1);1071		goto retry;1072 1073	default:1074		/* Stick ourselves on a wait queue to be woken when1075		   someone changes the status */1076		set_current_state(TASK_UNINTERRUPTIBLE);1077		add_wait_queue(&chip->wq, &wait);1078		mutex_unlock(&chip->mutex);1079		schedule();1080		remove_wait_queue(&chip->wq, &wait);1081		timeo = jiffies + HZ;1082		goto retry;1083	}1084 1085	ENABLE_VPP(map);1086	map_write(map, CMD(0x60), adr);1087	map_write(map, CMD(0x01), adr);1088	chip->state = FL_LOCKING;1089 1090	mutex_unlock(&chip->mutex);1091	msleep(1000);1092	mutex_lock(&chip->mutex);1093 1094	/* FIXME. Use a timer to check this, and return immediately. */1095	/* Once the state machine's known to be working I'll do that */1096 1097	timeo = jiffies + (HZ*2);1098	for (;;) {1099 1100		status = map_read(map, adr);1101		if (map_word_andequal(map, status, status_OK, status_OK))1102			break;1103 1104		/* OK Still waiting */1105		if (time_after(jiffies, timeo)) {1106			map_write(map, CMD(0x70), adr);1107			chip->state = FL_STATUS;1108			printk(KERN_ERR "waiting for lock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);1109			DISABLE_VPP(map);1110			mutex_unlock(&chip->mutex);1111			return -EIO;1112		}1113 1114		/* Latency issues. Drop the lock, wait a while and retry */1115		mutex_unlock(&chip->mutex);1116		cfi_udelay(1);1117		mutex_lock(&chip->mutex);1118	}1119 1120	/* Done and happy. */1121	chip->state = FL_STATUS;1122	DISABLE_VPP(map);1123	wake_up(&chip->wq);1124	mutex_unlock(&chip->mutex);1125	return 0;1126}1127static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)1128{1129	struct map_info *map = mtd->priv;1130	struct cfi_private *cfi = map->fldrv_priv;1131	unsigned long adr;1132	int chipnum, ret;1133#ifdef DEBUG_LOCK_BITS1134	int ofs_factor = cfi->interleave * cfi->device_type;1135#endif1136 1137	if (ofs & (mtd->erasesize - 1))1138		return -EINVAL;1139 1140	if (len & (mtd->erasesize -1))1141		return -EINVAL;1142 1143	chipnum = ofs >> cfi->chipshift;1144	adr = ofs - (chipnum << cfi->chipshift);1145 1146	while(len) {1147 1148#ifdef DEBUG_LOCK_BITS1149		cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);1150		printk("before lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));1151		cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);1152#endif1153 1154		ret = do_lock_oneblock(map, &cfi->chips[chipnum], adr);1155 1156#ifdef DEBUG_LOCK_BITS1157		cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);1158		printk("after lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));1159		cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);1160#endif1161 1162		if (ret)1163			return ret;1164 1165		adr += mtd->erasesize;1166		len -= mtd->erasesize;1167 1168		if (adr >> cfi->chipshift) {1169			adr = 0;1170			chipnum++;1171 1172			if (chipnum >= cfi->numchips)1173				break;1174		}1175	}1176	return 0;1177}1178static inline int do_unlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)1179{1180	struct cfi_private *cfi = map->fldrv_priv;1181	map_word status, status_OK;1182	unsigned long timeo = jiffies + HZ;1183	DECLARE_WAITQUEUE(wait, current);1184 1185	adr += chip->start;1186 1187	/* Let's determine this according to the interleave only once */1188	status_OK = CMD(0x80);1189 1190	timeo = jiffies + HZ;1191retry:1192	mutex_lock(&chip->mutex);1193 1194	/* Check that the chip's ready to talk to us. */1195	switch (chip->state) {1196	case FL_CFI_QUERY:1197	case FL_JEDEC_QUERY:1198	case FL_READY:1199		map_write(map, CMD(0x70), adr);1200		chip->state = FL_STATUS;1201		fallthrough;1202	case FL_STATUS:1203		status = map_read(map, adr);1204		if (map_word_andequal(map, status, status_OK, status_OK))1205			break;1206 1207		/* Urgh. Chip not yet ready to talk to us. */1208		if (time_after(jiffies, timeo)) {1209			mutex_unlock(&chip->mutex);1210			printk(KERN_ERR "waiting for chip to be ready timed out in unlock\n");1211			return -EIO;1212		}1213 1214		/* Latency issues. Drop the lock, wait a while and retry */1215		mutex_unlock(&chip->mutex);1216		cfi_udelay(1);1217		goto retry;1218 1219	default:1220		/* Stick ourselves on a wait queue to be woken when1221		   someone changes the status */1222		set_current_state(TASK_UNINTERRUPTIBLE);1223		add_wait_queue(&chip->wq, &wait);1224		mutex_unlock(&chip->mutex);1225		schedule();1226		remove_wait_queue(&chip->wq, &wait);1227		timeo = jiffies + HZ;1228		goto retry;1229	}1230 1231	ENABLE_VPP(map);1232	map_write(map, CMD(0x60), adr);1233	map_write(map, CMD(0xD0), adr);1234	chip->state = FL_UNLOCKING;1235 1236	mutex_unlock(&chip->mutex);1237	msleep(1000);1238	mutex_lock(&chip->mutex);1239 1240	/* FIXME. Use a timer to check this, and return immediately. */1241	/* Once the state machine's known to be working I'll do that */1242 1243	timeo = jiffies + (HZ*2);1244	for (;;) {1245 1246		status = map_read(map, adr);1247		if (map_word_andequal(map, status, status_OK, status_OK))1248			break;1249 1250		/* OK Still waiting */1251		if (time_after(jiffies, timeo)) {1252			map_write(map, CMD(0x70), adr);1253			chip->state = FL_STATUS;1254			printk(KERN_ERR "waiting for unlock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);1255			DISABLE_VPP(map);1256			mutex_unlock(&chip->mutex);1257			return -EIO;1258		}1259 1260		/* Latency issues. Drop the unlock, wait a while and retry */1261		mutex_unlock(&chip->mutex);1262		cfi_udelay(1);1263		mutex_lock(&chip->mutex);1264	}1265 1266	/* Done and happy. */1267	chip->state = FL_STATUS;1268	DISABLE_VPP(map);1269	wake_up(&chip->wq);1270	mutex_unlock(&chip->mutex);1271	return 0;1272}1273static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)1274{1275	struct map_info *map = mtd->priv;1276	struct cfi_private *cfi = map->fldrv_priv;1277	unsigned long adr;1278	int chipnum, ret;1279#ifdef DEBUG_LOCK_BITS1280	int ofs_factor = cfi->interleave * cfi->device_type;1281#endif1282 1283	chipnum = ofs >> cfi->chipshift;1284	adr = ofs - (chipnum << cfi->chipshift);1285 1286#ifdef DEBUG_LOCK_BITS1287	{1288		unsigned long temp_adr = adr;1289		unsigned long temp_len = len;1290 1291		cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);1292                while (temp_len) {1293			printk("before unlock %x: block status register is %x\n",temp_adr,cfi_read_query(map, temp_adr+(2*ofs_factor)));1294			temp_adr += mtd->erasesize;1295			temp_len -= mtd->erasesize;1296		}1297		cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);1298	}1299#endif1300 1301	ret = do_unlock_oneblock(map, &cfi->chips[chipnum], adr);1302 1303#ifdef DEBUG_LOCK_BITS1304	cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);1305	printk("after unlock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));1306	cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);1307#endif1308 1309	return ret;1310}1311 1312static int cfi_staa_suspend(struct mtd_info *mtd)1313{1314	struct map_info *map = mtd->priv;1315	struct cfi_private *cfi = map->fldrv_priv;1316	int i;1317	struct flchip *chip;1318	int ret = 0;1319 1320	for (i=0; !ret && i<cfi->numchips; i++) {1321		chip = &cfi->chips[i];1322 1323		mutex_lock(&chip->mutex);1324 1325		switch(chip->state) {1326		case FL_READY:1327		case FL_STATUS:1328		case FL_CFI_QUERY:1329		case FL_JEDEC_QUERY:1330			chip->oldstate = chip->state;1331			chip->state = FL_PM_SUSPENDED;1332			/* No need to wake_up() on this state change -1333			 * as the whole point is that nobody can do anything1334			 * with the chip now anyway.1335			 */1336			break;1337 1338		case FL_PM_SUSPENDED:1339			break;1340 1341		default:1342			ret = -EAGAIN;1343			break;1344		}1345		mutex_unlock(&chip->mutex);1346	}1347 1348	/* Unlock the chips again */1349 1350	if (ret) {1351		for (i--; i >=0; i--) {1352			chip = &cfi->chips[i];1353 1354			mutex_lock(&chip->mutex);1355 1356			if (chip->state == FL_PM_SUSPENDED) {1357				/* No need to force it into a known state here,1358				   because we're returning failure, and it didn't1359				   get power cycled */1360				chip->state = chip->oldstate;1361				wake_up(&chip->wq);1362			}1363			mutex_unlock(&chip->mutex);1364		}1365	}1366 1367	return ret;1368}1369 1370static void cfi_staa_resume(struct mtd_info *mtd)1371{1372	struct map_info *map = mtd->priv;1373	struct cfi_private *cfi = map->fldrv_priv;1374	int i;1375	struct flchip *chip;1376 1377	for (i=0; i<cfi->numchips; i++) {1378 1379		chip = &cfi->chips[i];1380 1381		mutex_lock(&chip->mutex);1382 1383		/* Go to known state. Chip may have been power cycled */1384		if (chip->state == FL_PM_SUSPENDED) {1385			map_write(map, CMD(0xFF), 0);1386			chip->state = FL_READY;1387			wake_up(&chip->wq);1388		}1389 1390		mutex_unlock(&chip->mutex);1391	}1392}1393 1394static void cfi_staa_destroy(struct mtd_info *mtd)1395{1396	struct map_info *map = mtd->priv;1397	struct cfi_private *cfi = map->fldrv_priv;1398	kfree(cfi->cmdset_priv);1399	kfree(cfi);1400}1401 1402MODULE_DESCRIPTION("MTD chip driver for ST Advanced Architecture Command Set (ID 0x0020)");1403MODULE_LICENSE("GPL");1404