From d9a05d6051384649bfa6084c4cff9ee29592df9a Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Thu, 17 Aug 1995 14:45:57 +0000 Subject: [PATCH] added abConfigScanListAscii and abConfigAuto --- src/drv/ansi/drvAb.c | 86 +++++++++++++++++++++++++++++++++++++++++--- src/drv/ansi/drvAb.h | 2 ++ 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/src/drv/ansi/drvAb.c b/src/drv/ansi/drvAb.c index d46b5cb1e..e5eaabf17 100644 --- a/src/drv/ansi/drvAb.c +++ b/src/drv/ansi/drvAb.c @@ -253,6 +253,7 @@ typedef struct { unsigned short baud_rate; unsigned short int_vector; unsigned short int_level; + unsigned short autoconfig; unsigned short scan_list_len; unsigned char scan_list[64]; } ab_config; @@ -740,6 +741,7 @@ LOCAL void config_init(ab_link *plink) p6008 += plink->link; pconfig->base_address = (void *)p6008; pconfig->baud_rate = DEF_RATE; + pconfig->autoconfig = FALSE; pconfig->int_vector = AB_VEC_BASE + plink->link; pconfig->int_level = AB_INT_LEVEL; pconfig->scan_list_len = 8; @@ -763,6 +765,7 @@ int abConfigVme(int link, int base, int vector, int level) ab_config *pconfig; if(link<0 || link>=max_ab_6008s) return(-1); + if(!pab_links) pab_links = abCalloc(max_ab_6008s,sizeof(ab_link *)); plink = pab_links[link]; if(!plink) plink = allocLink(link); pconfig = plink->pconfig; @@ -778,6 +781,7 @@ int abConfigBaud(int link, int baud) ab_config *pconfig; if(link<0 || link>=max_ab_6008s) return(-1); + if(!pab_links) pab_links = abCalloc(max_ab_6008s,sizeof(ab_link *)); plink = pab_links[link]; if(!plink) plink = allocLink(link); pconfig = plink->pconfig; @@ -785,13 +789,28 @@ int abConfigBaud(int link, int baud) else pconfig->baud_rate = FAST_RATE; return(0); } + +int abConfigAuto(int link) +{ + ab_link *plink; + ab_config *pconfig; + if(link<0 || link>=max_ab_6008s) return(-1); + if(!pab_links) pab_links = abCalloc(max_ab_6008s,sizeof(ab_link *)); + plink = pab_links[link]; + if(!plink) plink = allocLink(link); + pconfig = plink->pconfig; + pconfig->autoconfig = TRUE; + return(0); +} + int abConfigScanList(int link, int scan_list_len, char *scan_list) { ab_link *plink; ab_config *pconfig; if(link<0 || link>=max_ab_6008s) return(-1); + if(!pab_links) pab_links = abCalloc(max_ab_6008s,sizeof(ab_link *)); plink = pab_links[link]; if(!plink) plink = allocLink(link); pconfig = plink->pconfig; @@ -800,6 +819,49 @@ int abConfigScanList(int link, int scan_list_len, char *scan_list) memcpy(pconfig->scan_list,scan_list,scan_list_len); return(0); } + +int abConfigScanListAscii(int link, char *filename,int setRackSize) +{ + FILE *fp; + char *scan_list; + char buf[80]; + unsigned rack,group,size; + int nItemsRead,nCharsRead,scan_list_len; + + scan_list = abCalloc(64,sizeof(char)); + fp = fopen(filename,"r"); + scan_list_len = 0; + while(fgets(buf,80,fp)) { + if(buf[0] == '#') continue; + nItemsRead = sscanf(buf,"%u %u %n",&rack,&group,&nCharsRead); + if(nItemsRead!=2) { + printf("abConfigScanListAscii: Illegal line %d %s\n", + scan_list_len,buf); + fclose(fp); + return(0); + } + if(!setRackSize) { + size = 0x00; + } else if(strstr(&buf[nCharsRead],"1/4")) { + size = 0x00; + } else if(strstr(&buf[nCharsRead],"1/2")) { + size = 0x40; + } else if(strstr(&buf[nCharsRead],"3/4")) { + size = 0x80; + } else if(strstr(&buf[nCharsRead],"Full")) { + size = 0xc0; + } else { + printf("abConfigScanListAscii: Illegal line %d %s\n", + scan_list_len,buf); + fclose(fp); + return(0); + } + scan_list[scan_list_len] = size | (rack<<2) | group; + scan_list_len++; + } + fclose(fp); + return(abConfigScanList(link,scan_list_len,scan_list)); +} LOCAL int ab_driver_init() { @@ -811,6 +873,7 @@ LOCAL int ab_driver_init() int vxstatus; long status; int got_one; + char task_name[50]; if(!pab_links) pab_links = abCalloc(max_ab_6008s,sizeof(ab_link *)); /* check if any of the cards are there */ @@ -865,7 +928,8 @@ LOCAL int ab_driver_init() continue; } plink->initialized = TRUE; - vxstatus = taskSpawn(ABSCAN_NAME,ABSCAN_PRI,ABSCAN_OPT, + sprintf(task_name,"%s%2.2d",ABSCAN_NAME,link); + vxstatus = taskSpawn(task_name,ABSCAN_PRI,ABSCAN_OPT, ABSCAN_STACK,(FUNCPTR)abScanTask,(int)plink, 0,0,0,0,0,0,0,0,0); if(vxstatus < 0){ @@ -874,7 +938,8 @@ LOCAL int ab_driver_init() } plink->abScanId = vxstatus; taskwdInsert(plink->abScanId,NULL,NULL); - vxstatus = taskSpawn(ABDONE_NAME,ABDONE_PRI,ABDONE_OPT, + sprintf(task_name,"%s%2.2d",ABDONE_NAME,link); + vxstatus = taskSpawn(task_name,ABDONE_PRI,ABDONE_OPT, ABDONE_STACK,(FUNCPTR)abDoneTask,(int)plink, 0,0,0,0,0,0,0,0,0); if(vxstatus < 0){ @@ -967,7 +1032,19 @@ LOCAL int link_init(ab_link *plink) not nice, but for now we'll have to assume that all adapters are needed and put them all in the scan list. */ /* set scan list*/ - for(ntry=0; ntryautoconfig) for(ntry=0; ntrycommand = AUTO_CONF; + pmb->data_len = 0; + status = sc_waitcmd(plink); + if(status) continue; + if(pmb->conf_stat != 0) { + sc_conferr(plink); + continue; + } + break; + }else for(ntry=0; ntrycommand = SCAN_LIST; @@ -983,7 +1060,7 @@ LOCAL int link_init(ab_link *plink) break; } if(ntry>=maxCmdTrys) { - printf("abDrv: SCAN_LIST failed link %hu\n",plink->link); + printf("abDrv: AUTO_CONFIG or SCAN_LIST failed link %hu\n",plink->link); return(ERROR); } sc_unlock(plink); @@ -1718,6 +1795,7 @@ LOCAL abStatus cardStatus( plink = pab_links[link]; if(!plink || !plink->initialized) return(abFailure); padapter = plink->papadapter[adapter]; + if(!padapter->adapter_online) return(abAdapterDown); pcard = padapter->papcard[card]; if(!pcard) return(abNoCard); if(!padapter->adapter_online) return(abAdapterDown); diff --git a/src/drv/ansi/drvAb.h b/src/drv/ansi/drvAb.h index dd227bf91..6d96a904c 100644 --- a/src/drv/ansi/drvAb.h +++ b/src/drv/ansi/drvAb.h @@ -87,5 +87,7 @@ int abConfigNlinks(int nlinks); int abConfigVme(int link, int base, int vector, int level); int abConfigBaud(int link, int baud); int abConfigScanList(int link, int scan_list_len, char *scan_list); +int abConfigScanListAscii(int link, char *filename,int setRackSize); +int abConfigAuto(int link); #endif /*INCdrvAbh*/