[vortex] programatically disable PXE?

Donald Becker becker@scyld.com
Sun Apr 21 22:53:01 2002

On Thu, 18 Apr 2002, Jason Verch wrote:

> 	First off, sorry if this list isn't the place to ask about this..

This is the correct list for this question.

> 	I'm looking for a program under linux that can turn PXE booting
> on and off on a 3c905B-TX. I want a way to automate things instead of having
> to go into BIOS while the PC is booting and change it.  Using vortex-diag and
> comparing the registry dumps with it enabled and disabled I think I've found
> the bits that get twidddled, but I'm not sure how to twiddle them.

Which EEPROM bits are you seeing changed?

The option that changes the boot ROM configuration in the EEPROM is
mostly undocumented.  I haven't yet figured out the general case, and
thus some diagnostic programs have ad hoc code.

The code is around line 747, and is triggered with the '-P' option.
You will have to edit vortex-diag.c to have it set the value you wish.
Change the '0x3001' at line 749 to the proper value.

I don't have the datasheet here, but I think the correct value is 0x3000.

I comment on what the code is doing:

	/* If -P is passed. */
	if (set_ee_rom) {
		/* Used for calculating the checksum. */
		unsigned short sum = 0;
		/* We will be working on a copy.  Note that we should be
		   using ee_tbl_offset here and below! */
		memcpy(new_ee_contents, eeprom_contents, eesize << 1);
		/* Set the boot ROM size. */
		new_ee_contents[9] = 0x3001;
		/* Recalculate the checksum: This calculation is valid
	           for the Cyclone only, while we may have a Vortex or
		   Hurricane. */
		for (i = 0; i < 0x1B; i++)
			sum ^= new_ee_contents[i];
		new_ee_contents[0x20] = (sum ^ (sum>>8)) & 0xff;
		printf("Setting the EEPROM BIOS ROM field to %4.4x, new checksum "
			   "%2.2x.\n", new_ee_contents[9], new_ee_contents[0x20]);
		/* Do the write.  Re-read rather than assume that it worked. */
		do_update(ioaddr, eeaddrlen, new_ee_contents, eeprom_contents);
		for (i = 0; i < eesize; i++)
			eeprom_contents[i] = read_eeprom(ioaddr, eeaddrlen, i);

Donald Becker				becker@scyld.com
Scyld Computing Corporation		http://www.scyld.com
410 Severn Ave. Suite 210		Second Generation Beowulf Clusters
Annapolis MD 21403			410-990-9993