Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Feb 1996 09:46:43 +0100 (MET)
From:      Luigi Rizzo <luigi@labinfo.iet.unipi.it>
To:        bugs@freebsd.org
Subject:   netboot patches
Message-ID:  <199602220846.JAA20729@labinfo.iet.unipi.it>

next in thread | raw e-mail | index | archive | help
Hi,

I enclose a set of patches to netboot. Some of them are bugfixes, some
of them add functionalities to the system. Possibly more will come in
the future, but I am not sure to have time for it in the next few days.

List of changes:

BUGS
----
+ tabs were incorrectly dealt with in the configuration file.
+ when compiled for multiple card, detection of a WD card type did not
  prevent subsequent probing for NE boards

ENHANCEMENTS
------------
+ now probes multiple NE cards. Probes are invasive, but since
  the alternative is failure... if NE_BASE is specified, that
  card is probed first;

+ looks for different configuration files, namely
	/tftpboot/cfg.X.Y.Z.T
	cfg.X.Y.Z.T
	/tftpboot/cfg
	cfg
  note the last two, which are global configuration files.
  I find this quite convenient, to avoid having to write a different
  configuration file containing essentialy the same data.

+ if the configuration file is not found, the program "guesses"
  the rootfs as SERVERIP:/usr/diskless_root
  There might be better ways to do this.


I still have a problem with old WD cards, the program fails right after
writing the Ethernet address. I'll investigate on this, might just be a
timing problem.

	Luigi
------------------------
diff -cbwr netboot/bootmenu.c netboot.new/bootmenu.c
*** netboot/bootmenu.c	Sat Oct  7 05:31:20 1995
--- netboot.new/bootmenu.c	Wed Feb 21 13:13:25 1996
***************
*** 287,293 ****
  		if ((!(*q)) && ((*p == ' ') || (*p == '\t') || (!(*p)))) {
  			if (!cmd->func) 
  				return(1);
! 			while (*p == ' ')
  				p++;
  			(cmd->func)(p);
  			return(0);
--- 287,293 ----
  		if ((!(*q)) && ((*p == ' ') || (*p == '\t') || (!(*p)))) {
  			if (!cmd->func) 
  				return(1);
! 			while (*p == ' ' || *p == '\t')
  				p++;
  			(cmd->func)(p);
  			return(0);
diff -cbwr netboot/main.c netboot.new/main.c
*** netboot/main.c	Tue May 30 09:59:00 1995
--- netboot.new/main.c	Thu Feb 22 09:30:27 1996
***************
*** 113,129 ****
  #endif
  
  		/* Now use TFTP to load configuration file */
- 	sprintf(cfg,"cfg.%I",arptable[ARP_CLIENT].ipaddr);
- 	printf("Loading %s...\r\n",cfg);
- 	if (!tftp(cfg)) {
  		sprintf(cfg,"/tftpboot/cfg.%I",arptable[ARP_CLIENT].ipaddr);
! 		printf("Loading %s...\r\n",cfg);
! 		if (!tftp(cfg)) {
! 			printf("Unable to load config file.\r\n");
! 			longjmp(jmp_bootmenu,1);
! 		}
! 	}
  
  #ifdef MDEBUG
  	printf("\n=>>"); getchar();
  #endif
--- 113,130 ----
  #endif
  
  		/* Now use TFTP to load configuration file */
  	sprintf(cfg,"/tftpboot/cfg.%I",arptable[ARP_CLIENT].ipaddr);
! 	if (tftp(cfg) || tftp(cfg+10))
! 		goto cfg_done;
! 	cfg[13]='\0';
! 	if (tftp(cfg) || tftp(cfg+10))
! 		goto cfg_done;
! 	sprintf(config_buffer,"rootfs %I:/usr/diskless_root",
! 		arptable[ARP_SERVER].ipaddr);
! 	printf("Unable to load config file, guessing:\r\n\t%s\r\n",
! 		config_buffer);
  
+ cfg_done:
  #ifdef MDEBUG
  	printf("\n=>>"); getchar();
  #endif
***************
*** 406,411 ****
--- 407,413 ----
  	unsigned short len, block=1;
  	struct tftp_t tp;
  	int code;
+ 	printf("Loading %s...\r\n",name);
  	isocket++;
  	tp.opcode = htons(TFTP_RRQ);
  	len = (sprintf((char *)tp.u.rrq,"%s%c%s",name,0,"octet")
diff -cbwr netboot/ns8390.c netboot.new/ns8390.c
*** netboot/ns8390.c	Tue May 30 09:59:02 1995
--- netboot.new/ns8390.c	Thu Feb 22 09:26:11 1996
***************
*** 46,51 ****
--- 46,59 ----
  char packet[ETH_MAX_PACKET];
  int  packetlen;
  
+ #ifdef	INCLUDE_NE
+ static unsigned short ne_base_list[]= {
+ #ifdef	NE_BASE
+ 	NE_BASE,
+ #endif
+ 	0x280, 0x300, 0x320, 0xff80, 0xff40, 0
+ };
+ #endif
  /**************************************************************************
  ETH_PROBE - Look for an adapter
  **************************************************************************/
***************
*** 133,140 ****
  					WD_LAAR_M16EN | WD_LAAR_L16EN | 1));
  			}
  		}
! 		printf("\r\n");
! 
  	}
  #endif
  #ifdef INCLUDE_3COM
--- 141,147 ----
  					WD_LAAR_M16EN | WD_LAAR_L16EN | 1));
  			}
  		}
! 		goto found_board;
  	}
  #endif
  #ifdef INCLUDE_3COM
***************
*** 256,262 ****
                  outb(eth_asic_base + _3COM_PSTR, eth_tx_start);
                  outb(eth_asic_base + _3COM_PSPR, eth_memsize);
  
!                 printf ("\r\n");
  
          }
  #endif
--- 263,269 ----
                  outb(eth_asic_base + _3COM_PSTR, eth_tx_start);
                  outb(eth_asic_base + _3COM_PSPR, eth_memsize);
  
! 		goto found_board;
  
          }
  #endif
***************
*** 267,275 ****
  	if (eth_vendor == VENDOR_NONE) {
  		char romdata[16], testbuf[32];
  		char test[] = "NE1000/2000 memory";
  		eth_bmem = (char *)0;		/* No shared memory */
! 		eth_asic_base = NE_BASE + NE_ASIC_OFFSET;
! 		eth_nic_base = NE_BASE;
  		eth_vendor = VENDOR_NOVELL;
  		eth_flags = FLAG_PIO;
  		eth_memsize = MEM_16384;
--- 274,285 ----
  	if (eth_vendor == VENDOR_NONE) {
  		char romdata[16], testbuf[32];
  		char test[] = "NE1000/2000 memory";
+ 		unsigned short *tent_base=ne_base_list;
  		eth_bmem = (char *)0;		/* No shared memory */
! ne_again:
! 		eth_asic_base = *tent_base + NE_ASIC_OFFSET;
! 		eth_nic_base = *tent_base;
! 
  		eth_vendor = VENDOR_NOVELL;
  		eth_flags = FLAG_PIO;
  		eth_memsize = MEM_16384;
***************
*** 295,301 ****
  			outb(eth_nic_base + D8390_P0_PSTOP, MEM_32768);
  			eth_pio_write(test, 16384, sizeof(test));
  			eth_pio_read(16384, testbuf, sizeof(test));
! 			if (!bcompare(testbuf, test, sizeof(test))) return (0);
  		}
  		eth_pio_read(0, romdata, 16);
  		printf("\r\nNE1000/NE2000 base 0x%x, addr ", eth_nic_base);
--- 305,315 ----
  			outb(eth_nic_base + D8390_P0_PSTOP, MEM_32768);
  			eth_pio_write(test, 16384, sizeof(test));
  			eth_pio_read(16384, testbuf, sizeof(test));
! 			if (!bcompare(testbuf, test, sizeof(test)))
! 				if (*++tent_base)
! 					goto ne_again;
! 				else
! 					return (0);
  		}
  		eth_pio_read(0, romdata, 16);
  		printf("\r\nNE1000/NE2000 base 0x%x, addr ", eth_nic_base);
***************
*** 304,312 ****
  				+ ((eth_flags & FLAG_16BIT) ? i : 0)]));
  			if (i < 5) printf (":");
  		}
! 		printf("\r\n");
  	}
  #endif
  	if (eth_vendor == VENDOR_NONE) return(0);
  
          if (eth_vendor != VENDOR_3COM) eth_rmem = eth_bmem;
--- 318,328 ----
  				+ ((eth_flags & FLAG_16BIT) ? i : 0)]));
  			if (i < 5) printf (":");
  		}
! 		goto found_board;
  	}
  #endif
+ found_board:
+ 	printf("\r\n");
  	if (eth_vendor == VENDOR_NONE) return(0);
  
          if (eth_vendor != VENDOR_3COM) eth_rmem = eth_bmem;

**************************

====================================================================
Luigi Rizzo                     Dip. di Ingegneria dell'Informazione
email: luigi@iet.unipi.it       Universita' di Pisa
tel: +39-50-568533              via Diotisalvi 2, 56126 PISA (Italy)
fax: +39-50-568522              http://www.iet.unipi.it/~luigi/
====================================================================



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199602220846.JAA20729>