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.
31 * Download (pre)processed microcode into Fore Series-200 host adapter
32 * Interact with i960 uart on Fore Series-200 host adapter
36 #include <sys/param.h>
38 #include <sys/socket.h>
41 #include <netatm/atm.h>
42 #include <netatm/atm_if.h>
43 #include <netatm/atm_sap.h>
44 #include <netatm/atm_sys.h>
45 #include <netatm/atm_ioctl.h>
46 #include <netinet/in.h>
47 #include <dev/hfa/fore.h>
48 #include <dev/hfa/fore_aali.h>
49 #include <dev/hfa/fore_slave.h>
57 #if (defined(BSD) && (BSD >= 199103))
65 __RCSID("@(#) $FreeBSD$");
68 extern u_char pca200e_microcode_3[];
69 extern int pca200e_microcode_size_3;
70 extern u_char pca200e_microcode_4[];
71 extern int pca200e_microcode_size_4;
74 #define DEV_NAME "/dev/sbus%d"
76 #if (defined(BSD) && (BSD >= 199103))
77 #define DEV_NAME _PATH_KMEM
82 static int comm_mode = 0;
83 static const char *progname;
86 static cc_t vmin, vtime;
87 #if (defined(BSD) && (BSD >= 199103))
88 static struct termios sgtty;
89 #define TCSETA TIOCSETA
90 #define TCGETA TIOCGETA
92 static struct termio sgtty;
95 static int endian = 0;
96 static int verbose = 0;
99 static char line[132];
100 static u_int lineptr;
111 CP_READ(uint32_t val)
114 return ( ntohl ( val ) );
120 CP_WRITE(uint32_t val)
123 return ( htonl ( val ) );
129 * Print an error message and exit.
138 error(const char *msg)
140 printf ( "%s\n", msg );
145 * Get a byte for the uart and if printing, display it.
148 * c Character from uart
155 while ( ! ( CP_READ(Uart->mon_xmithost) & UART_VALID ) )
158 c = CP_READ(Uart->mon_xmithost) & UART_DATAMASK;
159 Uart->mon_xmithost = CP_WRITE(UART_READY);
162 * We need to introduce a delay in here or things tend to hang...
166 if ( lineptr >= sizeof(line) )
170 * Save character into line
175 if (isprint(c) || (c == '\n') || (c == '\r'))
182 * Loop getting characters from uart into static string until eol. If printing,
183 * display the line retrieved.
186 * prn Are we displaying characters
189 * none Line in global string 'line[]'
197 while ( c != '>' && c != '\n' && c != '\r' )
200 if ( ++i >= sizeof(line) )
203 printf ( "%s", line );
217 * Send a byte to the i960
220 * c Character to send
226 xmit_byte(u_char c, int dn)
230 while ( CP_READ(Uart->mon_xmitmon) != UART_READY )
232 if ( CP_READ(Uart->mon_xmithost) & UART_VALID )
234 if ( !dn ) delay ( 10000 );
236 val = (int)c | UART_VALID;
237 Uart->mon_xmitmon = CP_WRITE( val );
238 if ( !dn ) delay ( 10000 );
239 if ( CP_READ(Uart->mon_xmithost) & UART_VALID )
245 * Transmit a line to the i960. Eol must be included as part of text to transmit.
248 * msg Character string to transmit
249 * len len of string. This allows us to include NULL's
250 * in the string/block to be transmitted.
256 xmit_to_i960(const char *msg, int len, int dn)
260 for (i = 0; i < len; i++)
261 xmit_byte(msg[i], dn);
265 * Send autobaud sequence to i960 monitor
276 if ( strncmp ( line, "Mon960", 6 ) == 0 )
277 xmit_to_i960 ( "\r\n\r\n\r\n\r\n", 8, 0 );
281 * Reset tty to initial state
284 * ret error code for exit()
293 sgtty.c_lflag |= ( ICANON | ECHO );
294 sgtty.c_cc[VMIN] = vmin;
295 sgtty.c_cc[VTIME] = vtime;
296 ioctl ( tty, TCSETA, &sgtty );
301 * Utility to strip off any leading path information from a filename
304 * path pathname to strip
307 * fname striped filename
311 basename(const char *path)
315 if ( ( fname = strrchr ( path, '/' ) ) != NULL )
352 * crctab - CRC-16 constant array...
353 * from Usenet contribution by Mark G. Mendel, Network Systems Corp.
354 * (ihnp4!umn-cs!hyper!mark)
356 static unsigned short crctab[1<<B] = {
357 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
358 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
359 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
360 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
361 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
362 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
363 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
364 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
365 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
366 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
367 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
368 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
369 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
370 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
371 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
372 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
373 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
374 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
375 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
376 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
377 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
378 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
379 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
380 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
381 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
382 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
383 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
384 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
385 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
386 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
387 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
388 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
392 * Hacked up xmodem protocol. Transmits the file 'filename' down to the i960
393 * using the xmodem protocol.
396 * filename name of file to transmit
400 * -1 unable to send file
403 xmitfile(const char *filename)
416 char buf[BUFSIZE + 6];
417 char blockbuf[BUFSIZE + 6];
420 int bufsize = BUFSIZE;
426 if ( ( fd = open ( filename, O_RDONLY ) ) < 0 )
430 stat ( filename, &stb );
433 * Determine number of 128 bytes sectors to transmit
435 numsect = ( stb.st_size / 128 ) + 1;
438 fprintf ( stderr, "Downloading %d sectors from %s\n",
442 * Send DO'wnload' command to i960
444 xmit_to_i960 ( "do\r\n", 4, 0 );
446 * Wait for response from i960 indicating download in progress
448 while ( strncmp ( line, "Downloading", 11 ) != 0 )
453 * Get startup character from i960
456 while ((c = getbyte()) != NAK && c != CRCCHR)
457 if ( ++attempts > NAKMAX )
458 error ( "Remote system not responding" );
463 } while ( c != NAK && c != CRCCHR );
466 attempts = errors = sendfin = extrachr = 0;
469 * Loop over each sector to be sent
472 if ( extrachr >= 128 )
481 * Read a sectors worth of data from the file into
482 * an internal buffer.
484 for ( bufcntr = 0; bufcntr < bufsize; )
490 if ( ( n = read ( fd, &c, 1 ) ) == 0 )
495 buf[bufcntr++] = CTRLZ;
505 * Fill in xmodem protocol values. Block size and sector number
508 blockbuf[bbufcntr++] = (bufsize == 1024) ? STX : SOH;
509 blockbuf[bbufcntr++] = sectnum;
510 blockbuf[bbufcntr++] = ~sectnum;
515 * Loop over the internal buffer computing the checksum of the
518 for ( bufcntr = 0; bufcntr < bufsize; bufcntr++ )
520 blockbuf[bbufcntr++] = buf[bufcntr];
523 checksum = (checksum<<B) ^ crctab[(checksum>>(W-B)) ^ buf[bufcntr]];
525 checksum = ((checksum + buf[bufcntr]) & 0xff);
530 * Place the checksum at the end of the transmit buffer
535 blockbuf[bbufcntr++] = ((checksum >> 8) & 0xff);
536 blockbuf[bbufcntr++] = (checksum & 0xff);
538 blockbuf[bbufcntr++] = checksum;
543 * Make several attempts to send the data to the i960
548 * Transmit the sector + protocol to the i960
550 xmit_to_i960 ( blockbuf, bbufcntr, 1 );
553 * Inform user where we're at
556 printf ( "Sector %3d %3dk\r",
557 sectnum, (sectnum * bufsize) / 1024 );
561 * Get response from i960
563 sendresp = getbyte();
566 * If i960 didn't like the sector
568 if ( sendresp != ACK )
573 * Are we supposed to cancel the transfer?
575 if ( ( sendresp & 0x7f ) == CAN )
576 if (getbyte() == CAN)
577 error ( "Send canceled at user's request" );
580 } while ( ( sendresp != ACK ) && ( attempts < RETRYMAX ) && ( errors < ERRORMAX ) );
587 } while ( !sendfin && ( attempts < RETRYMAX ) && ( errors < ERRORMAX ) );
590 * Did we expire all our allows attempts?
592 if ( attempts >= RETRYMAX )
594 xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 );
595 error ( "Remote system not responding" );
599 * Check for too many transmission errors
601 if ( errors >= ERRORMAX )
603 xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 ), xmit_byte ( CAN, 1 );
604 error ( "Too many errors in transmission" );
610 * Indicate the transfer is complete
612 xmit_byte ( EOT, 1 );
615 * Wait until i960 acknowledges us
617 while ((c = getbyte()) != ACK && (++attempts < RETRYMAX))
618 xmit_byte ( EOT, 1 );
620 if ( attempts >= RETRYMAX )
621 error ( "Remote system not responding on completion" );
624 * After download, we'll see a few more command
625 * prompts as the CP does its stuff. Ignore them.
627 while ( strncmp ( line, "=>", 2 ) != 0 )
630 while ( strncmp ( line, "=>", 2 ) != 0 )
633 while ( strncmp ( line, "=>", 2 ) != 0 )
637 * Tell the i960 to start executing the downloaded code
639 xmit_to_i960 ( "go\r\n", 4, 0 );
642 * Get the messages the CP will spit out
643 * after the GO command.
655 loadmicrocode(u_char *ucode, int size, u_char *ram)
675 * Check that we understand this header
677 memcpy(&binhdr, ucode, sizeof(binhdr));
678 if ( strncmp ( (caddr_t)&binhdr.Id, "fore", 4 ) != 0 ) {
679 fprintf ( stderr, "Unrecognized format in micorcode file." );
685 * We always swap the SunOS microcode file...
690 * We need to swap the header start/entry words...
693 for ( n = 0; n < sizeof(uint32_t); n++ )
697 for ( n = 0; n < sizeof(uint32_t); n++ )
703 * Set pointer to RAM load location
705 bufp = (ram + binhdr.start);
713 lp = (uint32_t *)(void *)ucode;
715 for ( i = 0; i < size / sizeof(uint32_t); i++ )
717 lp[i] = CP_WRITE(lp[i]);
723 for ( j = 0; j < 4; j++ )
729 bcopy ( (caddr_t)ucode, bufp, size );
732 * With .bin extension, we need to specify start address on 'go'
738 sprintf ( cmd, "go %x\r\n", binhdr.entry );
740 xmit_to_i960 ( cmd, strlen ( cmd ), 0 );
742 while ( strncmp ( line, cmd, strlen(cmd) - 3 ) != 0 )
752 sendbinfile(const char *fname, u_char *ram)
770 uint32_t buffer[1024];
775 if ( ( fd = open ( fname, O_RDONLY ) ) < 0 )
779 * Read the .bin header from the file
781 if ( ( read ( fd, &binhdr, sizeof(binhdr) ) ) != sizeof(binhdr) )
788 * Check that we understand this header
790 if ( strncmp ( (caddr_t)&binhdr.Id, "fore", 4 ) != 0 ) {
791 fprintf ( stderr, "Unrecognized format in micorcode file." );
798 * We always swap the SunOS microcode file...
803 * We need to swap the header start/entry words...
806 for ( n = 0; n < sizeof(uint32_t); n++ )
810 for ( n = 0; n < sizeof(uint32_t); n++ )
821 * Set pointer to RAM load location
823 bufp = (ram + binhdr.start);
830 * Need to swap longs - copy file into temp buffer
832 while ( ( n = read ( fd, (char *)buffer, sizeof(buffer))) > 0 )
837 for (i = 0; i < sizeof(buffer) / sizeof(uint32_t); i++)
839 buffer[i] = CP_WRITE(buffer[i]);
845 for ( j = 0; j < 4; j++ )
852 * Copy swapped buffer into CP RAM
855 bcopy ( (caddr_t)buffer, bufp, n );
857 printf ( "%d\r", cnt );
861 while ( ( n = read ( fd, bufp, 128 ) ) > 0 )
865 printf ( "%d\r", cnt );
871 * With .bin extension, we need to specify start address on 'go'
877 sprintf ( cmd, "go %x\r\n", binhdr.entry );
879 xmit_to_i960 ( cmd, strlen ( cmd ), 0 );
881 while ( strncmp ( line, cmd, strlen(cmd) - 3 ) != 0 )
894 * Program to download previously processed microcode to series-200 host adapter
897 main(int argc, char *argv[])
899 int fd; /* mmap for Uart */
900 u_char *ram; /* pointer to RAM */
901 Mon960 *Mon; /* Uart */
904 int binary = 0; /* Send binary file */
905 caddr_t buf; /* Ioctl buffer */
906 char bus_dev[80]; /* Bus device to mmap on */
907 struct atminfreq req;
908 struct air_cfg_rsp *air; /* Config info response structure */
909 int buf_len; /* Size of ioctl buffer */
910 const char *dev = "\0"; /* Device to download */
911 char *dirname = NULL; /* Directory path to objd files */
912 char *objfile = NULL; /* Command line object filename */
913 u_char *ucode = NULL; /* Pointer to microcode */
914 int ucode_size = 0; /* Length of microcode */
915 char *sndfile = NULL; /* Object filename to download */
916 char filename[64]; /* Constructed object filename */
917 char base[64]; /* sba200/sba200e/pca200e basename */
918 int ext = 0; /* 0 == bin 1 == objd */
919 struct stat sbuf; /* Used to find if .bin or .objd */
922 progname = basename(argv[0]);
923 comm_mode = strcmp ( progname, "fore_comm" ) == 0;
925 while ( ( c = getopt ( argc, argv, "3i:d:f:berv" ) ) != -1 )
934 dirname = (char *)strdup ( optarg );
940 dev = (char *)strdup(optarg);
943 objfile = (char *)strdup ( optarg );
952 printf ( "usage: %s [-v] [-i intf] [-d dirname] [-f objfile]\n", argv[0] );
959 setbuf ( stdout, NULL );
961 if ( ( fd = socket ( AF_ATM, SOCK_DGRAM, 0 ) ) < 0 )
963 perror ( "Cannot create ATM socket" );
967 * Over allocate memory for returned data. This allows
968 * space for IOCTL reply info as well as config info.
970 buf_len = 4 * sizeof(struct air_cfg_rsp);
971 if ( ( buf = (caddr_t)malloc(buf_len) ) == NULL )
973 perror ( "Cannot allocate memory for reply" );
977 * Fill in request paramaters
979 req.air_opcode = AIOCS_INF_CFG;
980 req.air_buf_addr = buf;
981 req.air_buf_len = buf_len;
984 * Copy interface name into ioctl request
986 strcpy(req.air_cfg_intf, dev);
991 if ( ( ioctl ( fd, AIOCINFO, (caddr_t)&req ) ) ) {
992 perror ( "ioctl (AIOCSINFO)" );
996 * Reset buffer pointer
998 req.air_buf_addr = buf;
1006 * Loop through all attached adapters
1008 for (; req.air_buf_len >= sizeof(struct air_cfg_rsp);
1009 buf += sizeof(struct air_cfg_rsp),
1010 req.air_buf_len -= sizeof(struct air_cfg_rsp)) {
1013 * Point to vendor info
1015 air = (struct air_cfg_rsp *)(void *)buf;
1017 if (air->acp_vendapi == VENDAPI_FORE_1 && air->acp_ram != 0)
1023 sprintf ( bus_dev, DEV_NAME, air->acp_busslot );
1025 sprintf ( bus_dev, DEV_NAME );
1029 * Setup signal handlers
1031 signal ( SIGINT, SIG_IGN );
1032 signal ( SIGQUIT, SIG_IGN );
1035 * If comm_mode, setup terminal for single char I/O
1038 tty = open ( _PATH_TTY, O_RDWR );
1039 ioctl ( tty, TCGETA, &sgtty );
1040 sgtty.c_lflag &= ~( ICANON | ECHO );
1041 vmin = sgtty.c_cc[VMIN];
1042 vtime = sgtty.c_cc[VTIME];
1043 sgtty.c_cc[VMIN] = 0;
1044 sgtty.c_cc[VTIME] = 0;
1045 ioctl ( tty, TCSETA, &sgtty );
1049 * Open bus for memory access
1051 if ( ( fd = open ( bus_dev, O_RDWR ) ) < 0 )
1053 perror ( "open bus_dev" );
1054 fprintf(stderr, "%s download failed (%s)\n",
1055 air->acp_intf, bus_dev);
1060 * Map in the RAM memory to get access to the Uart
1062 #ifdef __FreeBSD__ /*XXX*/
1063 ram = (u_char *) mmap(0, PCA200E_MMAP_SIZE,
1065 ram = (u_char *) mmap(0, air->acp_ramsize,
1067 PROT_READ | PROT_WRITE, MAP_SHARED | MAP_HASSEMAPHORE,
1069 if (ram == (u_char *)-1) {
1070 perror ( "mmap ram" );
1071 fprintf(stderr, "%s download failed\n",
1076 Mon = (Mon960 *)(volatile void *)(ram + MON960_BASE);
1077 Uart = (Mon960 *)(volatile void *)&(Mon->mon_xmitmon);
1080 * Determine endianess
1082 switch ( Mon->mon_bstat ) {
1083 case BOOT_COLDSTART:
1090 switch (ntohl(Mon->mon_bstat)) {
1091 case BOOT_COLDSTART:
1099 fprintf(stderr, "%s unknown status\n",
1109 u_int *hcr = (u_int *)(void *)(ram + PCA200E_HCR_OFFSET);
1110 PCA200E_HCR_INIT(*hcr, PCA200E_RESET_BD);
1112 PCA200E_HCR_CLR(*hcr, PCA200E_RESET_BD);
1118 static struct timeval timeout = { 0, 0 };
1122 * We want to talk with the i960 monitor
1126 * Loop forever accepting characters
1133 * Check for data from the terminal
1136 FD_SET ( fileno(stdin), &fdr );
1138 if ( ( ns = select ( FD_SETSIZE, &fdr, NULL, NULL,
1139 &timeout ) ) < 0 ) {
1140 perror ( "select" );
1148 nr = read ( fileno(stdin), &c1, 1 );
1154 xmit_byte ( c1, 0 );
1159 xmit_byte ( 27, 0 );
1162 xmit_byte ( c1, 0 );
1167 * Check for data from the i960
1169 if ( CP_READ(Uart->mon_xmithost) & UART_VALID ) {
1173 if ( strcmp ( line, "Mon960" ) == 0 )
1179 * Make sure the driver is loaded and that the CP
1180 * is ready for commands
1182 if ( CP_READ(Mon->mon_bstat) == BOOT_RUNNING )
1185 "%s is up and running - no download allowed.\n",
1191 if ( CP_READ(Mon->mon_bstat) != BOOT_MONREADY )
1194 "%s is not ready for downloading.\n",
1201 * Indicate who we're downloading
1204 printf ( "Downloading code for %s\n",
1208 * Look for the i960 monitor message.
1209 * We should see this after a board reset.
1211 while ( strncmp ( line, "Mon960", 6 ) != 0 &&
1212 strncmp ( line, "=>", 2 ) != 0 )
1213 getline( verbose ); /* Verbose */
1218 if ( strncmp ( line, "Mon960", 6 ) == 0 ) {
1219 xmit_to_i960 ( "\r\n\r\n\r\n\r\n", 8, 0 );
1224 * Keep reading until we get a command prompt
1226 while ( strncmp ( line, "=>", 2 ) != 0 )
1227 getline( verbose ); /* Verbose */
1230 * Choose the correct microcode file based on the
1231 * adapter type the card claims to be.
1233 switch ( air->acp_device )
1235 case DEV_FORE_SBA200:
1236 sprintf ( base, "sba200" );
1239 case DEV_FORE_SBA200E:
1240 sprintf ( base, "sba200e" );
1243 case DEV_FORE_PCA200E:
1244 sprintf ( base, "pca200e" );
1249 fprintf(stderr, "Unknown adapter type: %d\n",
1255 if ( objfile == NULL ) {
1256 switch ( air->acp_device ) {
1257 case DEV_FORE_SBA200:
1258 case DEV_FORE_SBA200E:
1259 sprintf ( filename, "%s.bin%d", base,
1261 if ( stat ( filename, &sbuf ) == -1 ) {
1262 sprintf ( filename, "%s/%s.bin%d",
1265 if ( stat ( filename, &sbuf ) == -1 ) {
1267 sprintf ( filename, "%s.objd%d",
1268 base, air->acp_bustype );
1269 if ( stat(filename, &sbuf) == -1 ) {
1271 "%s/%s.objd%d", dirname,
1274 if ( stat ( filename, &sbuf ) != -1 )
1283 case DEV_FORE_PCA200E:
1284 /* Use compiled in microcode */
1285 if (pca_vers == 3) {
1286 ucode = pca200e_microcode_3;
1287 ucode_size = pca200e_microcode_size_3;
1289 ucode = pca200e_microcode_4;
1290 ucode_size = pca200e_microcode_size_4;
1299 if ( ext && !binary )
1300 err = xmitfile ( sndfile );
1301 else if (sndfile != NULL)
1302 err = sendbinfile ( sndfile, ram );
1304 err = loadmicrocode( ucode, ucode_size, ram );
1307 fprintf(stderr, "%s download failed\n",
1314 * Download completed - wait around a while for
1315 * the driver to initialize the adapter
1317 aap = (Aali *)(void *)(ram + CP_READ(Mon->mon_appl));
1318 for (i = 0; i < MAX_CHECK; i++, sleep(1)) {
1319 uint32_t hb1, hb2, hb3;
1321 hb3 = CP_READ(Mon->mon_bstat);
1322 if (hb3 != BOOT_RUNNING) {
1324 printf("bstat %x\n", hb3);
1328 hb1 = CP_READ(aap->aali_heartbeat);
1330 hb2 = CP_READ(aap->aali_heartbeat);
1332 printf("hb %x %x\n", hb1, hb2);