3 * ===================================
4 * HARP | Host ATM Research Platform
5 * ===================================
8 * This Host ATM Research Platform ("HARP") file (the "Software") is
9 * made available by Network Computing Services, Inc. ("NetworkCS")
10 * "AS IS". NetworkCS does not provide maintenance, improvements or
11 * support of any kind.
13 * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
14 * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
15 * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
16 * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
17 * In no event shall NetworkCS be responsible for any damages, including
18 * but not limited to consequential damages, arising from or relating to
19 * any use of the Software or related support.
21 * Copyright 1994-1998 Network Computing Services, Inc.
23 * Copies of this Software may be made, however, the above copyright
24 * notice must be reproduced on all copies.
26 * @(#) $FreeBSD: src/sbin/atm/fore_dnld/fore_dnld.c,v 1.6.2.2 2000/12/11 01:03:24 obrien Exp $
27 * @(#) $DragonFly: src/sbin/atm/fore_dnld/fore_dnld.c,v 1.6 2004/12/18 21:43:38 swildner Exp $
34 * Download (pre)processed microcode into Fore Series-200 host adapter
35 * Interact with i960 uart on Fore Series-200 host adapter
39 #include <sys/param.h>
41 #include <sys/socket.h>
44 #include <netatm/atm.h>
45 #include <netatm/atm_if.h>
46 #include <netatm/atm_sap.h>
47 #include <netatm/atm_sys.h>
48 #include <netatm/atm_ioctl.h>
49 #include <dev/atm/hfa/fore.h>
50 #include <dev/atm/hfa/fore_aali.h>
51 #include <dev/atm/hfa/fore_slave.h>
59 #if (defined(BSD) && (BSD >= 199103))
66 extern u_char pca200e_microcode[];
67 extern int pca200e_microcode_size;
70 #define DEV_NAME "/dev/sbus%d"
72 #if (defined(BSD) && (BSD >= 199103))
73 #define DEV_NAME _PATH_KMEM
83 #if (defined(BSD) && (BSD >= 199103))
85 #define TCSETA TIOCSETA
86 #define TCGETA TIOCGETA
100 int sendbinfile(char *, u_char *);
110 CP_READ ( unsigned long val )
113 return ( ntohl ( val ) );
119 CP_WRITE ( unsigned long val )
122 return ( htonl ( val ) );
128 * Print an error message and exit.
139 printf ( "%s\n", msg );
144 * Get a byte for the uart and if printing, display it.
147 * prn Are we displaying characters
150 * c Character from uart
157 while ( ! ( CP_READ(Uart->mon_xmithost) & UART_VALID ) )
160 c = ( CP_READ(Uart->mon_xmithost) & UART_DATAMASK );
161 Uart->mon_xmithost = CP_WRITE(UART_READY);
164 * We need to introduce a delay in here or things tend to hang...
168 if ( lineptr >= sizeof(line) )
172 * Save character into line
177 if (isprint(c) || (c == '\n') || (c == '\r'))
184 * Loop getting characters from uart into static string until eol. If printing,
185 * display the line retrieved.
188 * prn Are we displaying characters
191 * none Line in global string 'line[]'
199 while ( c != '>' && c != '\n' && c != '\r' )
202 if ( ++i >= sizeof(line) )
205 printf ( "%s", line );
219 * Send a byte to the i960
222 * c Character to send
228 xmit_byte ( unsigned char c, int dn )
232 while ( CP_READ(Uart->mon_xmitmon) != UART_READY )
234 if ( CP_READ(Uart->mon_xmithost) & UART_VALID )
236 if ( !dn ) delay ( 10000 );
238 val = ( c | UART_VALID );
239 Uart->mon_xmitmon = CP_WRITE( val );
240 if ( !dn ) delay ( 10000 );
241 if ( CP_READ(Uart->mon_xmithost) & UART_VALID )
247 * Transmit a line to the i960. Eol must be included as part of text to transmit.
250 * line Character string to transmit
251 * len len of string. This allows us to include NULL's
252 * in the string/block to be transmitted.
258 xmit_to_i960 ( char *line, int len, int dn )
262 for ( i = 0; i < len; i++ )
263 xmit_byte ( line[i], dn );
267 * Send autobaud sequence to i960 monitor
278 if ( strncmp ( line, "Mon960", 6 ) == 0 )
279 xmit_to_i960 ( "\r\n\r\n\r\n\r\n", 8, 0 );
283 * Reset tty to initial state
286 * ret error code for exit()
295 sgtty.c_lflag |= ( ICANON | ECHO );
296 sgtty.c_cc[VMIN] = vmin;
297 sgtty.c_cc[VTIME] = vtime;
298 ioctl ( tty, TCSETA, &sgtty );
303 * Utility to strip off any leading path information from a filename
306 * path pathname to strip
309 * fname striped filename
313 basename ( char *path )
317 if ( ( fname = strrchr ( path, '/' ) ) != NULL )
354 * crctab - CRC-16 constant array...
355 * from Usenet contribution by Mark G. Mendel, Network Systems Corp.
356 * (ihnp4!umn-cs!hyper!mark)
358 unsigned short crctab[1<<B] = {
359 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
360 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
361 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
362 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
363 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
364 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
365 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
366 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
367 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
368 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
369 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
370 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
371 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
372 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
373 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
374 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
375 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
376 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
377 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
378 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
379 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
380 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
381 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
382 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
383 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
384 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
385 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
386 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
387 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
388 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
389 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
390 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
394 * Hacked up xmodem protocol. Transmits the file 'filename' down to the i960
395 * using the xmodem protocol.
398 * filename name of file to transmit
402 * -1 unable to send file
405 xmitfile ( char *filename )
418 char buf[BUFSIZE + 6];
419 char blockbuf[BUFSIZE + 6];
422 int bufsize = BUFSIZE;
428 if ( ( fd = open ( filename, O_RDONLY ) ) < 0 )
432 stat ( filename, &stb );
435 * Determine number of 128 bytes sectors to transmit
437 numsect = ( stb.st_size / 128 ) + 1;
440 fprintf ( stderr, "Downloading %d sectors from %s\n",
444 * Send DO'wnload' command to i960
446 xmit_to_i960 ( "do\r\n", 4, 0 );
448 * Wait for response from i960 indicating download in progress
450 while ( strncmp ( line, "Downloading", 11 ) != 0 )
455 * Get startup character from i960
458 while ( ( c = getbyte(0) ) != NAK && c != CRCCHR )
459 if ( ++attempts > NAKMAX )
460 error ( "Remote system not responding" );
465 } while ( c != NAK && c != CRCCHR );
468 attempts = errors = sendfin = extrachr = 0;
471 * Loop over each sector to be sent
474 if ( extrachr >= 128 )
483 * Read a sectors worth of data from the file into
484 * an internal buffer.
486 for ( bufcntr = 0; bufcntr < bufsize; )
492 if ( ( n = read ( fd, &c, 1 ) ) == 0 )
497 buf[bufcntr++] = CTRLZ;
507 * Fill in xmodem protocol values. Block size and sector number
510 blockbuf[bbufcntr++] = (bufsize == 1024) ? STX : SOH;
511 blockbuf[bbufcntr++] = sectnum;
512 blockbuf[bbufcntr++] = ~sectnum;
517 * Loop over the internal buffer computing the checksum of the
520 for ( bufcntr = 0; bufcntr < bufsize; bufcntr++ )
522 blockbuf[bbufcntr++] = buf[bufcntr];
525 checksum = (checksum<<B) ^ crctab[(checksum>>(W-B)) ^ buf[bufcntr]];
527 checksum = ((checksum + buf[bufcntr]) & 0xff);
532 * Place the checksum at the end of the transmit buffer
537 blockbuf[bbufcntr++] = ((checksum >> 8) & 0xff);
538 blockbuf[bbufcntr++] = (checksum & 0xff);
540 blockbuf[bbufcntr++] = checksum;
545 * Make several attempts to send the data to the i960
550 * Transmit the sector + protocol to the i960
552 xmit_to_i960 ( blockbuf, bbufcntr, 1 );
555 * Inform user where we're at
558 printf ( "Sector %3d %3dk\r",
559 sectnum, (sectnum * bufsize) / 1024 );
563 * Get response from i960
565 sendresp = getbyte(0);
568 * If i960 didn't like the sector
570 if ( sendresp != ACK )
575 * Are we supposed to cancel the transfer?
577 if ( ( sendresp & 0x7f ) == CAN )
578 if ( getbyte(0) == CAN )
579 error ( "Send canceled at user's request" );
582 } while ( ( sendresp != ACK ) && ( attempts < RETRYMAX ) && ( errors < ERRORMAX ) );
589 } while ( !sendfin && ( attempts < RETRYMAX ) && ( errors < ERRORMAX ) );
592 * Did we expire all our allows attempts?
594 if ( attempts >= RETRYMAX )
596 xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 );
597 error ( "Remote system not responding" );
601 * Check for too many transmission errors
603 if ( errors >= ERRORMAX )
605 xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 );
606 error ( "Too many errors in transmission" );
612 * Indicate the transfer is complete
614 xmit_byte ( EOT, 1 );
617 * Wait until i960 acknowledges us
619 while ( ( c = getbyte(0) ) != ACK && ( ++attempts < RETRYMAX ) )
620 xmit_byte ( EOT, 1 );
622 if ( attempts >= RETRYMAX )
623 error ( "Remote system not responding on completion" );
626 * After download, we'll see a few more command
627 * prompts as the CP does its stuff. Ignore them.
629 while ( strncmp ( line, "=>", 2 ) != 0 )
632 while ( strncmp ( line, "=>", 2 ) != 0 )
635 while ( strncmp ( line, "=>", 2 ) != 0 )
639 * Tell the i960 to start executing the downloaded code
641 xmit_to_i960 ( "go\r\n", 4, 0 );
644 * Get the messages the CP will spit out
645 * after the GO command.
657 loadmicrocode ( u_char *ucode, int size, u_char *ram )
676 * Check that we understand this header
678 memcpy(&binhdr, ucode, sizeof(binhdr));
679 if ( strncmp ( (caddr_t)&binhdr.Id, "fore", 4 ) != 0 ) {
680 fprintf ( stderr, "Unrecognized format in micorcode file." );
686 * We always swap the SunOS microcode file...
691 * We need to swap the header start/entry words...
694 for ( n = 0; n < sizeof(u_long); n++ )
698 for ( n = 0; n < sizeof(u_long); n++ )
704 * Set pointer to RAM load location
706 bufp = (ram + binhdr.start);
714 lp = (u_long *) ucode;
716 for ( i = 0; i < size / sizeof(long); i++ )
718 lp[i] = CP_WRITE(lp[i]);
724 for ( j = 0; j < 4; j++ )
730 bcopy ( (caddr_t)ucode, bufp, size );
733 * With .bin extension, we need to specify start address on 'go'
739 sprintf ( cmd, "go %lx\r\n", binhdr.entry );
741 xmit_to_i960 ( cmd, strlen ( cmd ), 0 );
743 while ( strncmp ( line, cmd, strlen(cmd) - 3 ) != 0 )
753 sendbinfile ( char *fname, u_char *ram )
776 if ( ( fd = open ( fname, O_RDONLY ) ) < 0 )
780 * Read the .bin header from the file
782 if ( ( read ( fd, &binhdr, sizeof(binhdr) ) ) != sizeof(binhdr) )
789 * Check that we understand this header
791 if ( strncmp ( (caddr_t)&binhdr.Id, "fore", 4 ) != 0 ) {
792 fprintf ( stderr, "Unrecognized format in micorcode file." );
799 * We always swap the SunOS microcode file...
804 * We need to swap the header start/entry words...
807 for ( n = 0; n < sizeof(u_long); n++ )
811 for ( n = 0; n < sizeof(u_long); n++ )
822 * Set pointer to RAM load location
824 bufp = (ram + binhdr.start);
831 * Need to swap longs - copy file into temp buffer
833 while ( ( n = read ( fd, (char *)buffer, sizeof(buffer))) > 0 )
838 for ( i = 0; i < sizeof(buffer) / sizeof(long); i++ )
840 buffer[i] = CP_WRITE(buffer[i]);
846 for ( j = 0; j < 4; j++ )
853 * Copy swapped buffer into CP RAM
856 bcopy ( (caddr_t)buffer, bufp, n );
858 printf ( "%d\r", cnt );
862 while ( ( n = read ( fd, bufp, 128 ) ) > 0 )
866 printf ( "%d\r", cnt );
872 * With .bin extension, we need to specify start address on 'go'
878 sprintf ( cmd, "go %lx\r\n", binhdr.entry );
880 xmit_to_i960 ( cmd, strlen ( cmd ), 0 );
882 while ( strncmp ( line, cmd, strlen(cmd) - 3 ) != 0 )
895 * Program to download previously processed microcode to series-200 host adapter
898 main( int argc, char **argv )
900 int fd; /* mmap for Uart */
901 u_char *ram; /* pointer to RAM */
902 Mon960 *Mon; /* Uart */
906 int binary = 0; /* Send binary file */
907 caddr_t buf; /* Ioctl buffer */
908 char bus_dev[80]; /* Bus device to mmap on */
909 struct atminfreq req;
910 struct air_cfg_rsp *air; /* Config info response structure */
911 int buf_len; /* Size of ioctl buffer */
912 char *devname = "\0"; /* Device to download */
913 char *dirname = NULL; /* Directory path to objd files */
914 char *objfile = NULL; /* Command line object filename */
915 u_char *ucode = NULL; /* Pointer to microcode */
916 int ucode_size = 0; /* Length of microcode */
917 char *sndfile = NULL; /* Object filename to download */
918 char filename[64]; /* Constructed object filename */
919 char base[64]; /* sba200/sba200e/pca200e basename */
920 int ext = 0; /* 0 == bin 1 == objd */
921 struct stat sbuf; /* Used to find if .bin or .objd */
924 progname = (char *)basename(argv[0]);
925 comm_mode = strcmp ( progname, "fore_comm" ) == 0;
927 while ( ( c = getopt ( argc, argv, "i:d:f:berv" ) ) != -1 )
933 dirname = (char *)strdup ( optarg );
939 devname = (char *)strdup ( optarg );
942 objfile = (char *)strdup ( optarg );
951 printf ( "usage: %s [-v] [-i intf] [-d dirname] [-f objfile]\n", argv[0] );
958 setbuf ( stdout, NULL );
960 if ( ( fd = socket ( AF_ATM, SOCK_DGRAM, 0 ) ) < 0 )
962 perror ( "Cannot create ATM socket" );
966 * Over allocate memory for returned data. This allows
967 * space for IOCTL reply info as well as config info.
969 buf_len = 4 * sizeof(struct air_cfg_rsp);
970 if ( ( buf = (caddr_t)malloc(buf_len) ) == NULL )
972 perror ( "Cannot allocate memory for reply" );
976 * Fill in request paramaters
978 req.air_opcode = AIOCS_INF_CFG;
979 req.air_buf_addr = buf;
980 req.air_buf_len = buf_len;
983 * Copy interface name into ioctl request
985 strcpy ( req.air_cfg_intf, devname );
990 if ( ( ioctl ( fd, AIOCINFO, (caddr_t)&req ) ) ) {
991 perror ( "ioctl (AIOCSINFO)" );
995 * Reset buffer pointer
997 req.air_buf_addr = buf;
1005 * Loop through all attached adapters
1007 for (; req.air_buf_len >= sizeof(struct air_cfg_rsp);
1008 buf += sizeof(struct air_cfg_rsp),
1009 req.air_buf_len -= sizeof(struct air_cfg_rsp)) {
1012 * Point to vendor info
1014 air = (struct air_cfg_rsp *)buf;
1016 if (air->acp_vendor == VENDOR_FORE )
1022 sprintf ( bus_dev, DEV_NAME, air->acp_busslot );
1024 sprintf ( bus_dev, DEV_NAME );
1028 * Setup signal handlers
1030 signal ( SIGINT, SIG_IGN );
1031 signal ( SIGQUIT, SIG_IGN );
1034 * If comm_mode, setup terminal for single char I/O
1037 tty = open ( _PATH_TTY, O_RDWR );
1038 ioctl ( tty, TCGETA, &sgtty );
1039 sgtty.c_lflag &= ~( ICANON | ECHO );
1040 vmin = sgtty.c_cc[VMIN];
1041 vtime = sgtty.c_cc[VTIME];
1042 sgtty.c_cc[VMIN] = 0;
1043 sgtty.c_cc[VTIME] = 0;
1044 ioctl ( tty, TCSETA, &sgtty );
1048 * Open bus for memory access
1050 if ( ( fd = open ( bus_dev, O_RDWR ) ) < 0 )
1052 perror ( "open bus_dev" );
1053 fprintf(stderr, "%s download failed (%s)\n",
1054 air->acp_intf, bus_dev);
1059 * Map in the RAM memory to get access to the Uart
1061 #ifdef __FreeBSD__ /*XXX*/
1062 ram = (u_char *) mmap(0, PCA200E_MMAP_SIZE,
1064 ram = (u_char *) mmap(0, air->acp_ramsize,
1066 PROT_READ | PROT_WRITE, MAP_SHARED | MAP_HASSEMAPHORE,
1068 if (ram == (u_char *)-1) {
1069 perror ( "mmap ram" );
1070 fprintf(stderr, "%s download failed\n",
1075 Mon = (Mon960 *)(ram + MON960_BASE);
1076 Uart = (Mon960 *)&(Mon->mon_xmitmon);
1079 * Determine endianess
1081 switch ( Mon->mon_bstat ) {
1082 case BOOT_COLDSTART:
1089 switch (ntohl(Mon->mon_bstat)) {
1090 case BOOT_COLDSTART:
1098 fprintf(stderr, "%s unknown status\n",
1108 u_int *hcr = (u_int *)(ram + PCA200E_HCR_OFFSET);
1109 PCA200E_HCR_INIT(*hcr, PCA200E_RESET_BD);
1111 PCA200E_HCR_CLR(*hcr, PCA200E_RESET_BD);
1117 static struct timeval timeout = { 0, 0 };
1121 * We want to talk with the i960 monitor
1125 * Loop forever accepting characters
1132 * Check for data from the terminal
1135 FD_SET ( fileno(stdin), &fdr );
1137 if ( ( ns = select ( FD_SETSIZE, &fdr, NULL, NULL,
1138 &timeout ) ) < 0 ) {
1139 perror ( "select" );
1147 nr = read ( fileno(stdin), &c, 1 );
1158 xmit_byte ( 27, 0 );
1166 * Check for data from the i960
1168 if ( CP_READ(Uart->mon_xmithost) & UART_VALID ) {
1172 if ( strcmp ( line, "Mon960" ) == 0 )
1178 * Make sure the driver is loaded and that the CP
1179 * is ready for commands
1181 if ( CP_READ(Mon->mon_bstat) == BOOT_RUNNING )
1184 "%s is up and running - no download allowed.\n",
1190 if ( CP_READ(Mon->mon_bstat) != BOOT_MONREADY )
1193 "%s is not ready for downloading.\n",
1200 * Indicate who we're downloading
1203 printf ( "Downloading code for %s\n",
1207 * Look for the i960 monitor message.
1208 * We should see this after a board reset.
1210 while ( strncmp ( line, "Mon960", 6 ) != 0 &&
1211 strncmp ( line, "=>", 2 ) != 0 )
1212 getline( verbose ); /* Verbose */
1217 if ( strncmp ( line, "Mon960", 6 ) == 0 ) {
1218 xmit_to_i960 ( "\r\n\r\n\r\n\r\n", 8, 0 );
1223 * Keep reading until we get a command prompt
1225 while ( strncmp ( line, "=>", 2 ) != 0 )
1226 getline( verbose ); /* Verbose */
1229 * Choose the correct microcode file based on the
1230 * adapter type the card claims to be.
1232 switch ( air->acp_device )
1234 case DEV_FORE_SBA200:
1235 sprintf ( base, "sba200" );
1238 case DEV_FORE_SBA200E:
1239 sprintf ( base, "sba200e" );
1242 case DEV_FORE_PCA200E:
1243 sprintf ( base, "pca200e" );
1248 fprintf(stderr, "Unknown adapter type: %d\n",
1254 if ( objfile == NULL ) {
1255 switch ( air->acp_device ) {
1256 case DEV_FORE_SBA200:
1257 case DEV_FORE_SBA200E:
1258 sprintf ( filename, "%s.bin%d", base,
1260 if ( stat ( filename, &sbuf ) == -1 ) {
1261 sprintf ( filename, "%s/%s.bin%d",
1264 if ( stat ( filename, &sbuf ) == -1 ) {
1266 sprintf ( filename, "%s.objd%d",
1267 base, air->acp_bustype );
1268 if ( stat(filename, &sbuf) == -1 ) {
1270 "%s/%s.objd%d", dirname,
1273 if ( stat ( filename, &sbuf ) != -1 )
1282 case DEV_FORE_PCA200E:
1283 /* Use compiled in microcode */
1284 ucode = pca200e_microcode;
1285 ucode_size = pca200e_microcode_size;
1293 if ( ext && !binary )
1294 err = xmitfile ( sndfile );
1295 else if (sndfile != NULL)
1296 err = sendbinfile ( sndfile, ram );
1298 err = loadmicrocode( ucode, ucode_size, ram );
1301 fprintf(stderr, "%s download failed\n",
1308 * Download completed - wait around a while for
1309 * the driver to initialize the adapter
1311 aap = (Aali *)(ram + CP_READ(Mon->mon_appl));
1312 for (i = 0; i < MAX_CHECK; i++, sleep(1)) {
1313 u_long hb1, hb2, hb3;
1315 hb3 = CP_READ(Mon->mon_bstat);
1316 if (hb3 != BOOT_RUNNING) {
1318 printf("bstat %lx\n", hb3);
1322 hb1 = CP_READ(aap->aali_heartbeat);
1324 hb2 = CP_READ(aap->aali_heartbeat);
1326 printf("hb %lx %lx\n", hb1, hb2);