diff --git a/chipdrivers.h b/chipdrivers.h
index c96f445..6d5cef0 100644
--- a/chipdrivers.h
+++ b/chipdrivers.h
@@ -90,31 +90,27 @@ void protect_m29f400bt(chipaddr bios);
 void write_page_m29f400bt(chipaddr bios, uint8_t *src,
 			  chipaddr dst, int page_size);
 
 /* pm49fl00x.c */
 int unlock_49fl00x(struct flashchip *flash);
 int lock_49fl00x(struct flashchip *flash);
 
 /* sst28sf040.c */
 int erase_chip_28sf040(struct flashchip *flash, unsigned int addr, unsigned int blocklen);
 int erase_sector_28sf040(struct flashchip *flash, unsigned int address, unsigned int sector_size);
 int write_28sf040(struct flashchip *flash, uint8_t *buf);
 
 /* sst49lfxxxc.c */
-int probe_49lfxxxc(struct flashchip *flash);
-int erase_49lfxxxc(struct flashchip *flash);
 int erase_sector_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size);
-int erase_block_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size);
-int erase_chip_49lfxxxc(struct flashchip *flash, unsigned int addr, unsigned int blocksize);
 int write_49lfxxxc(struct flashchip *flash, uint8_t *buf);
 int unlock_49lfxxxc(struct flashchip *flash);
 
 /* sst_fwhub.c */
 int printlock_sst_fwhub(struct flashchip *flash);
 int unlock_sst_fwhub(struct flashchip *flash);
 
 /* w39v040c.c */
 int printlock_w39v040c(struct flashchip *flash);
 
 /* w39V080fa.c */
 int unlock_winbond_fwhub(struct flashchip *flash);
 
diff --git a/flashchips.c b/flashchips.c
index 47cdc32..c69dd57 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -4180,29 +4180,30 @@ struct flashchip flashchips[] = {
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
 		.block_erasers	=
 		{
 			{
 				.eraseblocks = { {4 * 1024, 128} },
 				.block_erase = erase_sector_49lfxxxc,
 			}, {
 				.eraseblocks = { 
 					{64 * 1024, 7},
 					{32 * 1024, 1},
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_49lfxxxc,
+				.block_erase = erase_block_82802ab,
 			}
 		},
+		.unlock		= unlock_49lfxxxc,
 		.write		= write_49lfxxxc,
 		.read		= read_memmapped,
 	},
 
 	{
 		.vendor		= "SST",
 		.name		= "SST49LF008A",
 		.bustype	= CHIP_BUSTYPE_FWH, /* A/A Mux */
 		.manufacture_id	= SST_ID,
 		.model_id	= SST_49LF008A,
 		.total_size	= 1024,
 		.page_size	= 64 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
@@ -4242,29 +4243,30 @@ struct flashchip flashchips[] = {
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
 		.block_erasers	=
 		{
 			{
 				.eraseblocks = { {4 * 1024, 256} },
 				.block_erase = erase_sector_49lfxxxc,
 			}, {
 				.eraseblocks = { 
 					{64 * 1024, 15},
 					{32 * 1024, 1},
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_49lfxxxc,
+				.block_erase = erase_block_82802ab,
 			}
 		},
+		.unlock		= unlock_49lfxxxc,
 		.write		= write_49lfxxxc,
 		.read		= read_memmapped,
 	},
 
 	{
 		.vendor		= "SST",
 		.name		= "SST49LF016C",
 		.bustype	= CHIP_BUSTYPE_FWH,
 		.manufacture_id	= SST_ID,
 		.model_id	= SST_49LF016C,
 		.total_size	= 2048,
 		.page_size	= 4 * 1024,
 		.feature_bits	= FEATURE_REGISTERMAP,
@@ -4273,29 +4275,30 @@ struct flashchip flashchips[] = {
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
 		.block_erasers	=
 		{
 			{
 				.eraseblocks = { {4 * 1024, 512} },
 				.block_erase = erase_sector_49lfxxxc,
 			}, {
 				.eraseblocks = { 
 					{64 * 1024, 31},
 					{32 * 1024, 1},
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_49lfxxxc,
+				.block_erase = erase_block_82802ab,
 			}
 		},
+		.unlock		= unlock_49lfxxxc,
 		.write		= write_49lfxxxc,
 		.read		= read_memmapped,
 	},
 
 	{
 		.vendor		= "SST",
 		.name		= "SST49LF020",
 		.bustype	= CHIP_BUSTYPE_LPC,
 		.manufacture_id	= SST_ID,
 		.model_id	= SST_49LF020,
 		.total_size	= 256,
 		.page_size	= 16 * 1024,
 		.feature_bits	= FEATURE_EITHER_RESET,
@@ -4449,27 +4452,27 @@ struct flashchip flashchips[] = {
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (sst49lfxxxc.c) */
 		.block_erasers	=
 		{
 			{
 				.eraseblocks = { {4 * 1024, 512} },
 				.block_erase = erase_sector_49lfxxxc,
 			}, {
 				.eraseblocks = { 
 					{64 * 1024, 31},
 					{32 * 1024, 1},
 					{8 * 1024, 2},
 					{16 * 1024, 1},
 				},
-				.block_erase = erase_block_49lfxxxc,
+				.block_erase = erase_block_82802ab,
 			}
 		},
 		.unlock		= unlock_49lfxxxc,
 		.write		= write_49lfxxxc,
 		.read		= read_memmapped,
 	},
 
 	{
 		.vendor		= "ST",
 		.name		= "M25P05-A",
 		.bustype	= CHIP_BUSTYPE_SPI,
 		.manufacture_id	= ST_ID,
 		.model_id	= ST_M25P05A,
diff --git a/sst49lfxxxc.c b/sst49lfxxxc.c
index 9f9ee30..e7e5b61 100644
--- a/sst49lfxxxc.c
+++ b/sst49lfxxxc.c
@@ -14,39 +14,26 @@
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
 #include <stdlib.h>
 #include "flash.h"
 #include "chipdrivers.h"
 
-#define SECTOR_ERASE		0x30
-#define BLOCK_ERASE		0x20
-#define ERASE			0xD0
-#define AUTO_PGRM		0x10
-#define RESET			0xFF
-#define READ_ID			0x90
-#define READ_STATUS		0x70
-#define CLEAR_STATUS		0x50
-
-#define STATUS_BPS		(1 << 1)
-#define	STATUS_ESS		(1 << 6)
-#define	STATUS_WSMS		(1 << 7)
-
 int unlock_block_49lfxxxc(struct flashchip *flash, unsigned long address, unsigned char bits)
 {
 	unsigned long lock = flash->virtual_registers + address + 2;
 	printf_debug("lockbits at address=0x%08lx is 0x%01x\n", lock, chip_readb(lock));
 	chip_writeb(bits, lock);
 
 	return 0;
 }
 
 static int write_lockbits_49lfxxxc(struct flashchip *flash, unsigned char bits)
 {
 	chipaddr registers = flash->virtual_registers;
 	int i, left = flash->total_size * 1024;
@@ -80,159 +67,56 @@ static int write_lockbits_49lfxxxc(struct flashchip *flash, unsigned char bits)
 		     chip_readb(registers + address + 2));
 	chip_writeb(bits, registers + address + 2);
 
 	return 0;
 }
 
 int unlock_49lfxxxc(struct flashchip *flash)
 {
 	return write_lockbits_49lfxxxc(flash, 0);
 }
 
 int erase_sector_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int sector_size)
 {
-	unsigned char status;
+	uint8_t status;
 	chipaddr bios = flash->virtual_memory;
 
-	chip_writeb(SECTOR_ERASE, bios);
-	chip_writeb(ERASE, bios + address);
+	chip_writeb(0x30, bios);
+	chip_writeb(0xD0, bios + address);
 
-	do {
-		status = chip_readb(bios);
-		if (status & (STATUS_ESS | STATUS_BPS)) {
-			printf("sector erase FAILED at address=0x%08lx status=0x%01x\n", bios + address, status);
-			chip_writeb(CLEAR_STATUS, bios);
-			return (-1);
-		}
-	} while (!(status & STATUS_WSMS));
-	chip_writeb(RESET, bios);
+	status = wait_82802ab(bios);
 
 	if (check_erased_range(flash, address, sector_size)) {
 		fprintf(stderr, "ERASE FAILED!\n");
 		return -1;
 	}
 	return 0;
 }
 
-int erase_block_49lfxxxc(struct flashchip *flash, unsigned int address, unsigned int block_size)
-{
-	unsigned char status;
-	chipaddr bios = flash->virtual_memory;
-
-	chip_writeb(BLOCK_ERASE, bios);
-	chip_writeb(ERASE, bios + address);
-
-	do {
-		status = chip_readb(bios);
-		if (status & (STATUS_ESS | STATUS_BPS)) {
-			printf("block erase FAILED at address=0x%08lx status=0x%01x\n", bios + address, status);
-			chip_writeb(CLEAR_STATUS, bios);
-			return (-1);
-		}
-	} while (!(status & STATUS_WSMS));
-	chip_writeb(RESET, bios);
-
-	if (check_erased_range(flash, address, block_size)) {
-		fprintf(stderr, "ERASE FAILED!\n");
-		return -1;
-	}
-	return 0;
-}
-
-static int write_sector_49lfxxxc(chipaddr bios, uint8_t *src, chipaddr dst,
-				 unsigned int page_size)
-{
-	int i;
-	unsigned char status;
-
-	chip_writeb(CLEAR_STATUS, bios);
-	for (i = 0; i < page_size; i++) {
-		/* transfer data from source to destination */
-		if (*src == 0xFF) {
-			dst++, src++;
-			/* If the data is 0xFF, don't program it */
-			continue;
-		}
-		/*issue AUTO PROGRAM command */
-		chip_writeb(AUTO_PGRM, bios);
-		chip_writeb(*src++, dst++);
-
-		do {
-			status = chip_readb(bios);
-			if (status & (STATUS_ESS | STATUS_BPS)) {
-				printf("sector write FAILED at address=0x%08lx status=0x%01x\n", dst, status);
-				chip_writeb(CLEAR_STATUS, bios);
-				return (-1);
-			}
-		} while (!(status & STATUS_WSMS));
-	}
-
-	return 0;
-}
-
-int probe_49lfxxxc(struct flashchip *flash)
-{
-	chipaddr bios = flash->virtual_memory;
-	uint8_t id1, id2;
-
-	chip_writeb(RESET, bios);
-
-	chip_writeb(READ_ID, bios);
-	id1 = chip_readb(bios);
-	id2 = chip_readb(bios + 0x01);
-
-	chip_writeb(RESET, bios);
-
-	printf_debug("%s: id1 0x%02x, id2 0x%02x\n", __func__, id1, id2);
-
-	if (!(id1 == flash->manufacture_id && id2 == flash->model_id))
-		return 0;
-
-	map_flash_registers(flash);
-
-	return 1;
-}
-
-int erase_49lfxxxc(struct flashchip *flash)
-{
-	chipaddr bios = flash->virtual_memory;
-	int i;
-	unsigned int total_size = flash->total_size * 1024;
-
-	write_lockbits_49lfxxxc(flash, 0);
-	for (i = 0; i < total_size; i += flash->page_size)
-		if (erase_sector_49lfxxxc(flash, i, flash->page_size))
-			return (-1);
-
-	chip_writeb(RESET, bios);
-
-	return 0;
-}
-
 int write_49lfxxxc(struct flashchip *flash, uint8_t *buf)
 {
 	int i;
 	int total_size = flash->total_size * 1024;
 	int page_size = flash->page_size;
 	chipaddr bios = flash->virtual_memory;
 
 	write_lockbits_49lfxxxc(flash, 0);
 	printf("Programming page: ");
 	for (i = 0; i < total_size / page_size; i++) {
 		/* erase the page before programming */
 		if (erase_sector_49lfxxxc(flash, i * page_size, flash->page_size)) {
 			fprintf(stderr, "ERASE FAILED!\n");
 			return -1;
 		}
 
 		/* write to the sector */
 		printf("%04d at address: 0x%08x", i, i * page_size);
-		write_sector_49lfxxxc(bios, buf + i * page_size,
+		write_page_82802ab(bios, buf + i * page_size,
 				      bios + i * page_size, page_size);
 		printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
 	}
 	printf("\n");
 
-	chip_writeb(RESET, bios);
+	chip_writeb(0xFF, bios);
 
 	return 0;
 }
-- 
1.6.6

